Skip to content

Commit 9c48db3

Browse files
ismirliamichaelkad
andauthored
[D][R] Add Network Peer data source and resource (IBM-Cloud#6444)
* [D][R] Network Peer Q3 * Add routeFilterSchema * Update doc typo * fix conflicts * update doc and sort constant file * fix typo --------- Co-authored-by: michaelkad <[email protected]>
1 parent b961a7e commit 9c48db3

21 files changed

+2305
-78
lines changed

ibm/acctest/acctest.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,13 +243,16 @@ var (
243243
Pi_network_id string
244244
Pi_network_interface_id string
245245
Pi_network_name string
246+
Pi_network_peer_id string
246247
Pi_network_security_group_id string
247248
Pi_network_security_group_rule_id string
249+
Pi_peer_interface_id string
248250
Pi_placement_group_name string
249251
Pi_remote_id string
250252
Pi_remote_type string
251253
Pi_replication_volume_name string
252254
Pi_resource_group_id string
255+
Pi_route_filter_id string
253256
Pi_route_id string
254257
Pi_sap_image string
255258
Pi_sap_profile_id string
@@ -1205,6 +1208,23 @@ func init() {
12051208
Pi_network_id = "terraform-test-power"
12061209
fmt.Println("[INFO] Set the environment variable PI_NETWORK_ID for testing ibm_pi_network_interface resource else it is set to default value 'terraform-test-power'")
12071210
}
1211+
1212+
Pi_network_peer_id = os.Getenv("PI_NETWORK_PEER_ID")
1213+
if Pi_network_peer_id == "" {
1214+
Pi_network_peer_id = "terraform-test-power"
1215+
fmt.Println("[INFO] Set the environment variable PI_NETWORK_ID for testing ibm_pi_network_interface resource else it is set to default value 'terraform-test-power'")
1216+
}
1217+
1218+
Pi_peer_interface_id = os.Getenv("PI_PEER_INTERFACE_ID")
1219+
if Pi_peer_interface_id == "" {
1220+
Pi_peer_interface_id = "terraform-test-power"
1221+
fmt.Println("[INFO] Set the environment variable PI_NETWORK_ID for testing ibm_pi_network_interface resource else it is set to default value 'terraform-test-power'")
1222+
}
1223+
Pi_route_filter_id = os.Getenv("PI_ROUTE_FILTER_ID")
1224+
if Pi_route_filter_id == "" {
1225+
Pi_route_filter_id = "terraform-test-power"
1226+
fmt.Println("[INFO] Set the environment variable PI_ROUTE_FILTER_ID for testing ibm_pi_network_peer_route_filter resource else it is set to default value 'terraform-test-power'")
1227+
}
12081228
Pi_network_interface_id = os.Getenv("PI_NETWORK_INTERFACE_ID")
12091229
if Pi_network_interface_id == "" {
12101230
Pi_network_interface_id = "terraform-test-power"

ibm/provider/provider.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,9 @@ func Provider() *schema.Provider {
745745
"ibm_pi_network_address_groups": power.DataSourceIBMPINetworkAddressGroups(),
746746
"ibm_pi_network_interface": power.DataSourceIBMPINetworkInterface(),
747747
"ibm_pi_network_interfaces": power.DataSourceIBMPINetworkInterfaces(),
748+
"ibm_pi_network_peer_interfaces": power.DataSourceIBMPINetworkPeerInterfaces(),
749+
"ibm_pi_network_peer_route_filter": power.DataSourceIBMPINetworkPeerRouteFilter(),
750+
"ibm_pi_network_peer": power.DataSourceIBMPINetworkPeer(),
748751
"ibm_pi_network_peers": power.DataSourceIBMPINetworkPeers(),
749752
"ibm_pi_network_port": power.DataSourceIBMPINetworkPort(),
750753
"ibm_pi_network_security_group": power.DataSourceIBMPINetworkSecurityGroup(),
@@ -755,8 +758,8 @@ func Provider() *schema.Provider {
755758
"ibm_pi_placement_groups": power.DataSourceIBMPIPlacementGroups(),
756759
"ibm_pi_public_network": power.DataSourceIBMPIPublicNetwork(),
757760
"ibm_pi_pvm_snapshots": power.DataSourceIBMPIPVMSnapshot(),
758-
"ibm_pi_route": power.DataSourceIBMPIRoute(),
759761
"ibm_pi_route_report": power.DataSourceIBMPIRouteReport(),
762+
"ibm_pi_route": power.DataSourceIBMPIRoute(),
760763
"ibm_pi_routes": power.DataSourceIBMPIRoutes(),
761764
"ibm_pi_sap_profile": power.DataSourceIBMPISAPProfile(),
762765
"ibm_pi_sap_profiles": power.DataSourceIBMPISAPProfiles(),
@@ -1475,13 +1478,15 @@ func Provider() *schema.Provider {
14751478
"ibm_pi_image_export": power.ResourceIBMPIImageExport(),
14761479
"ibm_pi_image": power.ResourceIBMPIImage(),
14771480
"ibm_pi_instance_action": power.ResourceIBMPIInstanceAction(),
1478-
"ibm_pi_instance": power.ResourceIBMPIInstance(),
14791481
"ibm_pi_instance_snapshot": power.ResourceIBMPIInstanceSnapshot(),
1482+
"ibm_pi_instance": power.ResourceIBMPIInstance(),
14801483
"ibm_pi_ipsec_policy": power.ResourceIBMPIIPSecPolicy(),
14811484
"ibm_pi_key": power.ResourceIBMPIKey(),
14821485
"ibm_pi_network_address_group_member": power.ResourceIBMPINetworkAddressGroupMember(),
14831486
"ibm_pi_network_address_group": power.ResourceIBMPINetworkAddressGroup(),
14841487
"ibm_pi_network_interface": power.ResourceIBMPINetworkInterface(),
1488+
"ibm_pi_network_peer_route_filter": power.ResourceIBMPINetworkPeerRouteFilter(),
1489+
"ibm_pi_network_peer": power.ResourceIBMPINetworkPeer(),
14851490
"ibm_pi_network_port_attach": power.ResourceIBMPINetworkPortAttach(),
14861491
"ibm_pi_network_security_group_action": power.ResourceIBMPINetworkSecurityGroupAction(),
14871492
"ibm_pi_network_security_group_member": power.ResourceIBMPINetworkSecurityGroupMember(),
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
// Copyright IBM Corp. 2025 All Rights Reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package power
5+
6+
import (
7+
"context"
8+
9+
"github.com/IBM-Cloud/power-go-client/clients/instance"
10+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
14+
)
15+
16+
func DataSourceIBMPINetworkPeer() *schema.Resource {
17+
18+
return &schema.Resource{
19+
ReadContext: dataSourceIBMPINetworkPeerRead,
20+
21+
Schema: map[string]*schema.Schema{
22+
// Arguments
23+
Arg_CloudInstanceID: {
24+
Description: "The GUID of the service instance associated with an account.",
25+
Required: true,
26+
Type: schema.TypeString,
27+
ValidateFunc: validation.NoZeroValues,
28+
},
29+
Arg_NetworkPeerID: {
30+
Description: "Network peer ID.",
31+
Required: true,
32+
Type: schema.TypeString,
33+
ValidateFunc: validation.NoZeroValues,
34+
},
35+
// Attributes
36+
Attr_CreationDate: {
37+
Computed: true,
38+
Description: "Time stamp for create network peer.",
39+
Type: schema.TypeString,
40+
},
41+
Attr_CustomerASN: {
42+
Computed: true,
43+
Description: "ASN number at customer network side.",
44+
Type: schema.TypeInt,
45+
},
46+
Attr_CustomerCIDR: {
47+
Computed: true,
48+
Description: "IP address used for configuring customer network interface with network subnet mask.",
49+
Type: schema.TypeString,
50+
},
51+
Attr_DefaultExportRouteFilter: {
52+
Computed: true,
53+
Description: "Default action for export route filter.",
54+
Type: schema.TypeString,
55+
},
56+
Attr_DefaultImportRouteFilter: {
57+
Computed: true,
58+
Description: "Default action for import route filter.",
59+
Type: schema.TypeString,
60+
},
61+
Attr_Error: {
62+
Computed: true,
63+
Description: "Error description.",
64+
Type: schema.TypeString,
65+
},
66+
Attr_ExportRouteFilters: routeFilterSchema("List of export route filters."),
67+
Attr_IBMASN: {
68+
Computed: true,
69+
Description: "ASN number at IBM PowerVS side.",
70+
Type: schema.TypeInt,
71+
},
72+
Attr_IBMCIDR: {
73+
Computed: true,
74+
Description: "IP address used for configuring IBM network interface with network subnet mask.",
75+
Type: schema.TypeString,
76+
},
77+
Attr_ImportRouteFilters: routeFilterSchema("List of import route filters."),
78+
Attr_Name: {
79+
Computed: true,
80+
Description: "User defined name.",
81+
Type: schema.TypeString,
82+
},
83+
Attr_PeerInterfaceID: {
84+
Computed: true,
85+
Description: "Peer interface id.",
86+
Type: schema.TypeString,
87+
},
88+
Attr_State: {
89+
Computed: true,
90+
Description: "Status of the network peer.",
91+
Type: schema.TypeString,
92+
},
93+
Attr_Type: {
94+
Computed: true,
95+
Description: "Type of the peer network.",
96+
Type: schema.TypeString,
97+
},
98+
Attr_UpdatedDate: {
99+
Computed: true,
100+
Description: "Time stamp for update network peer.",
101+
Type: schema.TypeString,
102+
},
103+
Attr_VLAN: {
104+
Computed: true,
105+
Description: "A vlan configured at the customer network.",
106+
Type: schema.TypeInt,
107+
},
108+
},
109+
}
110+
111+
}
112+
113+
func dataSourceIBMPINetworkPeerRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
114+
sess, err := meta.(conns.ClientSession).IBMPISession()
115+
if err != nil {
116+
return diag.FromErr(err)
117+
}
118+
cloudInstanceID := d.Get(Arg_CloudInstanceID).(string)
119+
networkPeerID := d.Get(Arg_NetworkPeerID).(string)
120+
networkC := instance.NewIBMPINetworkPeerClient(ctx, sess, cloudInstanceID)
121+
networkdata, err := networkC.GetNetworkPeer(networkPeerID)
122+
if err != nil {
123+
return diag.FromErr(err)
124+
}
125+
d.SetId(*networkdata.ID)
126+
d.Set(Attr_CreationDate, networkdata.CreationDate)
127+
d.Set(Attr_CustomerASN, networkdata.CustomerASN)
128+
d.Set(Attr_CustomerCIDR, networkdata.CustomerCidr)
129+
d.Set(Attr_DefaultExportRouteFilter, networkdata.DefaultExportRouteFilter)
130+
d.Set(Attr_DefaultImportRouteFilter, networkdata.DefaultImportRouteFilter)
131+
d.Set(Attr_Error, networkdata.Error)
132+
exportRouteFilters := []map[string]interface{}{}
133+
if len(networkdata.ExportRouteFilters) > 0 {
134+
for _, erp := range networkdata.ExportRouteFilters {
135+
exportRouteFilter := dataSourceIBMPINetworkPeerRouteFilterToMap(erp)
136+
exportRouteFilters = append(exportRouteFilters, exportRouteFilter)
137+
}
138+
}
139+
d.Set(Attr_ExportRouteFilters, exportRouteFilters)
140+
d.Set(Attr_IBMASN, networkdata.IbmASN)
141+
d.Set(Attr_IBMCIDR, networkdata.IbmCidr)
142+
importRouteFilters := []map[string]interface{}{}
143+
if len(networkdata.ImportRouteFilters) > 0 {
144+
for _, irp := range networkdata.ImportRouteFilters {
145+
importRouteFilter := dataSourceIBMPINetworkPeerRouteFilterToMap(irp)
146+
importRouteFilters = append(importRouteFilters, importRouteFilter)
147+
}
148+
}
149+
d.Set(Attr_ImportRouteFilters, importRouteFilters)
150+
d.Set(Attr_Name, networkdata.Name)
151+
d.Set(Attr_PeerInterfaceID, networkdata.PeerInterfaceID)
152+
d.Set(Attr_State, networkdata.State)
153+
d.Set(Attr_Type, networkdata.Type)
154+
d.Set(Attr_UpdatedDate, networkdata.UpdatedDate)
155+
d.Set(Attr_VLAN, networkdata.Vlan)
156+
157+
return nil
158+
}
159+
160+
func routeFilterSchema(description string) *schema.Schema {
161+
return &schema.Schema{
162+
Computed: true,
163+
Description: description,
164+
Type: schema.TypeList,
165+
Elem: &schema.Resource{
166+
Schema: map[string]*schema.Schema{
167+
Attr_Action: {
168+
Computed: true,
169+
Description: "Action of the filter.",
170+
Type: schema.TypeString,
171+
},
172+
Attr_CreationDate: {
173+
Computed: true,
174+
Description: "Time stamp for create route filter.",
175+
Type: schema.TypeString,
176+
},
177+
Attr_Direction: {
178+
Computed: true,
179+
Description: "Direction of the filter.",
180+
Type: schema.TypeString,
181+
},
182+
Attr_Error: {
183+
Computed: true,
184+
Description: "Error description.",
185+
Type: schema.TypeString,
186+
},
187+
Attr_GE: {
188+
Computed: true,
189+
Description: "The minimum matching length of the prefix-set.",
190+
Type: schema.TypeInt,
191+
},
192+
Attr_Index: {
193+
Computed: true,
194+
Description: "Priority or order of the filter.",
195+
Type: schema.TypeInt,
196+
},
197+
Attr_LE: {
198+
Computed: true,
199+
Description: "The maximum matching length of the prefix-set.",
200+
Type: schema.TypeInt,
201+
},
202+
Attr_Prefix: {
203+
Computed: true,
204+
Description: "IP prefix representing an address and mask length of the prefix-set.",
205+
Type: schema.TypeString,
206+
},
207+
Attr_RouteFilterID: {
208+
Computed: true,
209+
Description: "Route filter ID.",
210+
Type: schema.TypeString,
211+
},
212+
Attr_State: {
213+
Computed: true,
214+
Description: "Status of the route filter.",
215+
Type: schema.TypeString,
216+
},
217+
},
218+
},
219+
}
220+
}

0 commit comments

Comments
 (0)