Skip to content

Commit 040936f

Browse files
authored
Merge pull request IBM-Cloud#5645 from IBM-Cloud/network-interface-d
[Datasource, Resource] Network Interface/s
2 parents 91ccc79 + 3c989b2 commit 040936f

13 files changed

+1151
-2
lines changed

ibm/acctest/acctest.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ var (
218218
Pi_instance_name string
219219
Pi_key_name string
220220
Pi_network_name string
221+
Pi_network_id string
222+
Pi_network_interface_id string
221223
Pi_placement_group_name string
222224
Pi_replication_volume_name string
223225
Pi_resource_group_id string
@@ -1068,7 +1070,16 @@ func init() {
10681070
Pi_network_name = "terraform-test-power"
10691071
fmt.Println("[INFO] Set the environment variable PI_NETWORK_NAME for testing ibm_pi_network_name resource else it is set to default value 'terraform-test-power'")
10701072
}
1071-
1073+
Pi_network_id = os.Getenv("PI_NETWORK_ID")
1074+
if Pi_network_id == "" {
1075+
Pi_network_id = "terraform-test-power"
1076+
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'")
1077+
}
1078+
Pi_network_interface_id = os.Getenv("PI_NETWORK_INTERFACE_ID")
1079+
if Pi_network_interface_id == "" {
1080+
Pi_network_interface_id = "terraform-test-power"
1081+
fmt.Println("[INFO] Set the environment variable PI_NETWORK_INTERFACE_ID for testing ibm_pi_network_interface resource else it is set to default value 'terraform-test-power'")
1082+
}
10721083
Pi_volume_name = os.Getenv("PI_VOLUME_NAME")
10731084
if Pi_volume_name == "" {
10741085
Pi_volume_name = "terraform-test-power"
@@ -1220,12 +1231,12 @@ func init() {
12201231
Pi_host_group_id = ""
12211232
fmt.Println("[WARN] Set the environment variable PI_HOST_GROUP_ID for testing ibm_pi_host resource else it is set to default value ''")
12221233
}
1223-
12241234
Pi_host_id = os.Getenv("PI_HOST_ID")
12251235
if Pi_host_id == "" {
12261236
Pi_host_id = ""
12271237
fmt.Println("[WARN] Set the environment variable PI_HOST_ID for testing ibm_pi_host resource else it is set to default value ''")
12281238
}
1239+
12291240
WorkspaceID = os.Getenv("SCHEMATICS_WORKSPACE_ID")
12301241
if WorkspaceID == "" {
12311242
WorkspaceID = "us-south.workspace.tf-acc-test-schematics-state-test.392cd99f"

ibm/provider/provider.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,8 @@ func Provider() *schema.Provider {
655655
"ibm_pi_instances": power.DataSourceIBMPIInstances(),
656656
"ibm_pi_key": power.DataSourceIBMPIKey(),
657657
"ibm_pi_keys": power.DataSourceIBMPIKeys(),
658+
"ibm_pi_network_interface": power.DataSourceIBMPINetworkInterface(),
659+
"ibm_pi_network_interfaces": power.DataSourceIBMPINetworkInterfaces(),
658660
"ibm_pi_network_port": power.DataSourceIBMPINetworkPort(),
659661
"ibm_pi_network": power.DataSourceIBMPINetwork(),
660662
"ibm_pi_networks": power.DataSourceIBMPINetworks(),
@@ -1304,6 +1306,7 @@ func Provider() *schema.Provider {
13041306
"ibm_pi_instance": power.ResourceIBMPIInstance(),
13051307
"ibm_pi_ipsec_policy": power.ResourceIBMPIIPSecPolicy(),
13061308
"ibm_pi_key": power.ResourceIBMPIKey(),
1309+
"ibm_pi_network_interface": power.ResourceIBMPINetworkInterface(),
13071310
"ibm_pi_network_port_attach": power.ResourceIBMPINetworkPortAttach(),
13081311
"ibm_pi_network": power.ResourceIBMPINetwork(),
13091312
"ibm_pi_placement_group": power.ResourceIBMPIPlacementGroup(),

ibm/service/power/data_source_ibm_pi_instances.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ func flattenPvmInstanceNetworks(list []*models.PVMInstanceNetwork) (networks []m
296296
p := make(map[string]interface{})
297297
p[Attr_ExternalIP] = pvmip.ExternalIP
298298
p[Attr_IP] = pvmip.IPAddress
299+
p[Attr_Macaddress] = pvmip.MacAddress
299300
p[Attr_MacAddress] = pvmip.MacAddress
300301
p[Attr_NetworkID] = pvmip.NetworkID
301302
p[Attr_NetworkName] = pvmip.NetworkName
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
// Copyright IBM Corp. 2024 All Rights Reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package power
5+
6+
import (
7+
"context"
8+
"fmt"
9+
"log"
10+
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+
"github.com/IBM-Cloud/power-go-client/clients/instance"
16+
"github.com/IBM-Cloud/power-go-client/power/models"
17+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
18+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
19+
)
20+
21+
func DataSourceIBMPINetworkInterface() *schema.Resource {
22+
return &schema.Resource{
23+
ReadContext: dataSourceIBMPINetworkInterfaceRead,
24+
25+
Schema: map[string]*schema.Schema{
26+
// Arguments
27+
Arg_CloudInstanceID: {
28+
Description: "The GUID of the service instance associated with an account.",
29+
ForceNew: true,
30+
Required: true,
31+
Type: schema.TypeString,
32+
ValidateFunc: validation.NoZeroValues,
33+
},
34+
Arg_NetworkID: {
35+
Description: "Network ID.",
36+
ForceNew: true,
37+
Required: true,
38+
Type: schema.TypeString,
39+
ValidateFunc: validation.NoZeroValues,
40+
},
41+
Arg_NetworkInterfaceID: {
42+
Description: "Network Interface ID.",
43+
ForceNew: true,
44+
Required: true,
45+
Type: schema.TypeString,
46+
ValidateFunc: validation.NoZeroValues,
47+
},
48+
// Attributes
49+
Attr_CRN: {
50+
Computed: true,
51+
Description: "The Network Interface's crn.",
52+
Type: schema.TypeString,
53+
},
54+
Attr_Instance: {
55+
Computed: true,
56+
Description: "The attached instance to this Network Interface.",
57+
Elem: &schema.Resource{
58+
Schema: map[string]*schema.Schema{
59+
Attr_Href: {
60+
Computed: true,
61+
Description: "Link to instance resource.",
62+
Type: schema.TypeString,
63+
},
64+
Attr_InstanceID: {
65+
Computed: true,
66+
Description: "The attached instance ID.",
67+
Type: schema.TypeString,
68+
},
69+
},
70+
},
71+
Type: schema.TypeList,
72+
},
73+
Attr_IPAddress: {
74+
Computed: true,
75+
Description: "The ip address of this Network Interface.",
76+
Type: schema.TypeString,
77+
},
78+
Attr_MacAddress: {
79+
Computed: true,
80+
Description: "The mac address of the Network Interface.",
81+
Type: schema.TypeString,
82+
},
83+
Attr_Name: {
84+
Computed: true,
85+
Description: "Name of the Network Interface (not unique or indexable).",
86+
Type: schema.TypeString,
87+
},
88+
Attr_NetworkInterfaceID: {
89+
Computed: true,
90+
Description: "ID of the network interface.",
91+
Type: schema.TypeString,
92+
},
93+
Attr_NetworkSecurityGroupID: {
94+
Computed: true,
95+
Description: "ID of the Network Security Group the network interface will be added to.",
96+
Type: schema.TypeString,
97+
},
98+
Attr_Status: {
99+
Computed: true,
100+
Description: "The status of the network address group.",
101+
Type: schema.TypeString,
102+
},
103+
Attr_UserTags: {
104+
Computed: true,
105+
Description: "List of user tags attached to the resource.",
106+
Elem: &schema.Schema{Type: schema.TypeString},
107+
Set: schema.HashString,
108+
Type: schema.TypeSet,
109+
},
110+
},
111+
}
112+
}
113+
114+
func dataSourceIBMPINetworkInterfaceRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
115+
sess, err := meta.(conns.ClientSession).IBMPISession()
116+
if err != nil {
117+
return diag.FromErr(err)
118+
}
119+
120+
cloudInstanceID := d.Get(Arg_CloudInstanceID).(string)
121+
networkID := d.Get(Arg_NetworkID).(string)
122+
networkInterfaceID := d.Get(Arg_NetworkInterfaceID).(string)
123+
networkC := instance.NewIBMPINetworkClient(ctx, sess, cloudInstanceID)
124+
networkInterface, err := networkC.GetNetworkInterface(networkID, networkInterfaceID)
125+
if err != nil {
126+
return diag.FromErr(err)
127+
}
128+
129+
d.SetId(fmt.Sprintf("%s/%s", networkID, *networkInterface.ID))
130+
d.Set(Attr_IPAddress, networkInterface.IPAddress)
131+
d.Set(Attr_MacAddress, networkInterface.MacAddress)
132+
d.Set(Attr_Name, networkInterface.Name)
133+
d.Set(Attr_NetworkInterfaceID, *networkInterface.ID)
134+
d.Set(Attr_NetworkSecurityGroupID, networkInterface.NetworkSecurityGroupID)
135+
136+
if networkInterface.Instance != nil {
137+
instance := []map[string]interface{}{}
138+
instanceMap := pvmInstanceToMap(networkInterface.Instance)
139+
instance = append(instance, instanceMap)
140+
d.Set(Attr_Instance, instance)
141+
}
142+
d.Set(Attr_Status, networkInterface.Status)
143+
if networkInterface.Crn != nil {
144+
d.Set(Attr_CRN, networkInterface.Crn)
145+
userTags, err := flex.GetTagsUsingCRN(meta, string(*networkInterface.Crn))
146+
if err != nil {
147+
log.Printf("Error on get of network interface (%s) user_tags: %s", *networkInterface.ID, err)
148+
}
149+
d.Set(Attr_UserTags, userTags)
150+
}
151+
152+
return nil
153+
}
154+
155+
func pvmInstanceToMap(pvm *models.NetworkInterfaceInstance) map[string]interface{} {
156+
instanceMap := make(map[string]interface{})
157+
if pvm.Href != "" {
158+
instanceMap[Attr_Href] = pvm.Href
159+
}
160+
if pvm.InstanceID != "" {
161+
instanceMap[Attr_InstanceID] = pvm.InstanceID
162+
}
163+
return instanceMap
164+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright IBM Corp. 2024 All Rights Reserved.
2+
// Licensed under the Mozilla Public License v2.0
3+
4+
package power_test
5+
6+
import (
7+
"fmt"
8+
"testing"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
12+
acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest"
13+
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/service/power"
14+
)
15+
16+
func TestAccIBMPINetworkInterfaceDataSourceBasic(t *testing.T) {
17+
netIntData := "data.ibm_pi_network_interface.network_interface"
18+
resource.Test(t, resource.TestCase{
19+
PreCheck: func() { acc.TestAccPreCheck(t) },
20+
Providers: acc.TestAccProviders,
21+
Steps: []resource.TestStep{
22+
{
23+
Config: testAccCheckIBMPINetworkInterfaceDataSourceConfigBasic(),
24+
Check: resource.ComposeTestCheckFunc(
25+
resource.TestCheckResourceAttrSet(netIntData, power.Attr_ID),
26+
resource.TestCheckResourceAttrSet(netIntData, power.Attr_IPAddress),
27+
resource.TestCheckResourceAttrSet(netIntData, power.Attr_MacAddress),
28+
resource.TestCheckResourceAttrSet(netIntData, power.Attr_Name),
29+
resource.TestCheckResourceAttrSet(netIntData, power.Attr_Status),
30+
),
31+
},
32+
},
33+
})
34+
}
35+
36+
func testAccCheckIBMPINetworkInterfaceDataSourceConfigBasic() string {
37+
return fmt.Sprintf(`
38+
data "ibm_pi_network_interface" "network_interface" {
39+
pi_cloud_instance_id = "%s"
40+
pi_network_id = "%s"
41+
pi_network_interface_id = "%s"
42+
}`, acc.Pi_cloud_instance_id, acc.Pi_network_id, acc.Pi_network_interface_id)
43+
}

0 commit comments

Comments
 (0)