diff --git a/go.mod b/go.mod index ea67c1d9ab..0186684d47 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ toolchain go1.22.5 require ( github.com/IBM-Cloud/bluemix-go v0.0.0-20240926024252-81b3928fd062 github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240725064144-454a2ae23113 - github.com/IBM-Cloud/power-go-client v1.8.1 + github.com/IBM-Cloud/power-go-client v1.8.3 github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca github.com/IBM/appconfiguration-go-admin-sdk v0.3.0 github.com/IBM/appid-management-go-sdk v0.0.0-20210908164609-dd0e0eaf732f @@ -210,10 +210,10 @@ require ( go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect go.uber.org/ratelimit v0.2.0 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.19.0 // indirect golang.org/x/net v0.27.0 // indirect golang.org/x/oauth2 v0.7.0 // indirect - golang.org/x/sys v0.22.0 // indirect + golang.org/x/sys v0.25.0 // indirect golang.org/x/term v0.22.0 // indirect golang.org/x/text v0.16.0 // indirect golang.org/x/time v0.3.0 // indirect diff --git a/go.sum b/go.sum index 6c3b571924..4209bfff05 100644 --- a/go.sum +++ b/go.sum @@ -118,8 +118,8 @@ github.com/IBM-Cloud/bluemix-go v0.0.0-20240926024252-81b3928fd062/go.mod h1:/7h github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240725064144-454a2ae23113 h1:f2Erqfea1dKpaTFagTJM6W/wnD3JGq/Vn9URh8nuRwk= github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240725064144-454a2ae23113/go.mod h1:xUQL9SGAjoZFd4GNjrjjtEpjpkgU7RFXRyHesbKTjiY= github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.5.3/go.mod h1:RiUvKuHKTBmBApDMUQzBL14pQUGKcx/IioKQPIcRQjs= -github.com/IBM-Cloud/power-go-client v1.8.1 h1:tx1aPJmIQrNru1MD1VHGNasGx3eRIs0zzPZ0KvdFQrg= -github.com/IBM-Cloud/power-go-client v1.8.1/go.mod h1:N4RxrsMUvBQjSQ/qPk0iMZ8zK+fZPRTnHi/gTaASw0g= +github.com/IBM-Cloud/power-go-client v1.8.3 h1:QsBuIS6KvKsiEpe0yiHYKhWgXlqkcJ7XqFHtATj8Yh4= +github.com/IBM-Cloud/power-go-client v1.8.3/go.mod h1:UDyXeIKEp6r7yWUXYu3r0ZnFSlNZ2YeQTHwM2Tmlgv0= github.com/IBM-Cloud/softlayer-go v1.0.5-tf h1:koUAyF9b6X78lLLruGYPSOmrfY2YcGYKOj/Ug9nbKNw= github.com/IBM-Cloud/softlayer-go v1.0.5-tf/go.mod h1:6HepcfAXROz0Rf63krk5hPZyHT6qyx2MNvYyHof7ik4= github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca h1:crniVcf+YcmgF03NmmfonXwSQ73oJF+IohFYBwknMxs= @@ -1653,8 +1653,10 @@ github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= @@ -1824,8 +1826,8 @@ golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180530234432-1e491301e022/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2057,8 +2059,8 @@ golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= diff --git a/ibm/acctest/acctest.go b/ibm/acctest/acctest.go index e7d3b73350..6f72f22fd7 100644 --- a/ibm/acctest/acctest.go +++ b/ibm/acctest/acctest.go @@ -217,6 +217,7 @@ var ( Pi_image_id string Pi_instance_name string Pi_key_name string + Pi_network_address_group_id string Pi_network_name string Pi_network_id string Pi_network_interface_id string @@ -1240,6 +1241,11 @@ func init() { Pi_host_id = "" fmt.Println("[WARN] Set the environment variable PI_HOST_ID for testing ibm_pi_host resource else it is set to default value ''") } + Pi_network_address_group_id = os.Getenv("PI_NETWORK_ADDRESS_GROUP_ID") + if Pi_network_address_group_id == "" { + Pi_network_address_group_id = "terraform-test-power" + fmt.Println("[INFO] Set the environment variable PI_NETWORK_ADDRESS_GROUP_ID for testing ibm_pi_network_address_group data source else it is set to default value 'terraform-test-power'") + } WorkspaceID = os.Getenv("SCHEMATICS_WORKSPACE_ID") if WorkspaceID == "" { diff --git a/ibm/provider/provider.go b/ibm/provider/provider.go index 2bf3bbb6bb..fe229bdd4d 100644 --- a/ibm/provider/provider.go +++ b/ibm/provider/provider.go @@ -656,6 +656,8 @@ func Provider() *schema.Provider { "ibm_pi_instances": power.DataSourceIBMPIInstances(), "ibm_pi_key": power.DataSourceIBMPIKey(), "ibm_pi_keys": power.DataSourceIBMPIKeys(), + "ibm_pi_network_address_group": power.DataSourceIBMPINetworkAddressGroup(), + "ibm_pi_network_address_groups": power.DataSourceIBMPINetworkAddressGroups(), "ibm_pi_network_interface": power.DataSourceIBMPINetworkInterface(), "ibm_pi_network_interfaces": power.DataSourceIBMPINetworkInterfaces(), "ibm_pi_network_port": power.DataSourceIBMPINetworkPort(), @@ -1311,6 +1313,8 @@ func Provider() *schema.Provider { "ibm_pi_instance": power.ResourceIBMPIInstance(), "ibm_pi_ipsec_policy": power.ResourceIBMPIIPSecPolicy(), "ibm_pi_key": power.ResourceIBMPIKey(), + "ibm_pi_network_address_group_member": power.ResourceIBMPINetworkAddressGroupMember(), + "ibm_pi_network_address_group": power.ResourceIBMPINetworkAddressGroup(), "ibm_pi_network_interface": power.ResourceIBMPINetworkInterface(), "ibm_pi_network_port_attach": power.ResourceIBMPINetworkPortAttach(), "ibm_pi_network": power.ResourceIBMPINetwork(), diff --git a/ibm/service/power/data_source_ibm_pi_network_address_group.go b/ibm/service/power/data_source_ibm_pi_network_address_group.go new file mode 100644 index 0000000000..2efc6a80e0 --- /dev/null +++ b/ibm/service/power/data_source_ibm_pi_network_address_group.go @@ -0,0 +1,112 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power + +import ( + "context" + "log" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + + "github.com/IBM-Cloud/power-go-client/clients/instance" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" +) + +func DataSourceIBMPINetworkAddressGroup() *schema.Resource { + return &schema.Resource{ + ReadContext: dataSourceIBMPINetworkAddressGroupRead, + + Schema: map[string]*schema.Schema{ + // Arguments + Arg_CloudInstanceID: { + Description: "The GUID of the service instance associated with an account.", + Required: true, + Type: schema.TypeString, + ValidateFunc: validation.NoZeroValues, + }, + Arg_NetworkAddressGroupID: { + Description: "Network Address Group ID.", + Required: true, + Type: schema.TypeString, + }, + // Attributes + Attr_CRN: { + Computed: true, + Description: "The Network Address Group's crn.", + Type: schema.TypeString, + }, + Attr_Members: { + Computed: true, + Description: "The list of IP addresses in CIDR notation (for example 192.168.66.2/32) in the Network Address Group.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + Attr_CIDR: { + Computed: true, + Description: "The IP addresses in CIDR notation for example 192.168.1.5/32.", + Type: schema.TypeString, + }, + Attr_ID: { + Computed: true, + Description: "The id of the Network Address Group member IP addresses.", + Type: schema.TypeString, + }, + }, + }, + Type: schema.TypeList, + }, + Attr_Name: { + Computed: true, + Description: "The name of the Network Address Group.", + Type: schema.TypeString, + }, + Attr_UserTags: { + Computed: true, + Description: "List of user tags attached to the resource.", + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + Type: schema.TypeSet, + }, + }, + } +} + +func dataSourceIBMPINetworkAddressGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID := d.Get(Arg_CloudInstanceID).(string) + nagID := d.Get(Arg_NetworkAddressGroupID).(string) + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, cloudInstanceID) + networkAddressGroup, err := nagC.Get(nagID) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(*networkAddressGroup.ID) + if networkAddressGroup.Crn != nil { + d.Set(Attr_CRN, networkAddressGroup.Crn) + userTags, err := flex.GetTagsUsingCRN(meta, string(*networkAddressGroup.Crn)) + if err != nil { + log.Printf("Error on get of pi network address group (%s) user_tags: %s", nagID, err) + } + d.Set(Attr_UserTags, userTags) + } + + members := []map[string]interface{}{} + if len(networkAddressGroup.Members) > 0 { + for _, mbr := range networkAddressGroup.Members { + member := memberToMap(mbr) + members = append(members, member) + } + d.Set(Attr_Members, members) + } + d.Set(Attr_Name, networkAddressGroup.Name) + + return nil +} diff --git a/ibm/service/power/data_source_ibm_pi_network_address_group_test.go b/ibm/service/power/data_source_ibm_pi_network_address_group_test.go new file mode 100644 index 0000000000..d076aa5100 --- /dev/null +++ b/ibm/service/power/data_source_ibm_pi_network_address_group_test.go @@ -0,0 +1,36 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power_test + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" +) + +func TestAccIBMPINetworkAddressGroupDataSourceBasic(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMPINetworkAddressGroupDataSourceConfigBasic(), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_pi_network_address_group.network_address_group", "id"), + ), + }, + }, + }) +} + +func testAccCheckIBMPINetworkAddressGroupDataSourceConfigBasic() string { + return fmt.Sprintf(` + data "ibm_pi_network_address_group" "network_address_group" { + pi_cloud_instance_id = "%s" + pi_network_address_group_id = "%s" + }`, acc.Pi_cloud_instance_id, acc.Pi_network_address_group_id) +} diff --git a/ibm/service/power/data_source_ibm_pi_network_address_groups.go b/ibm/service/power/data_source_ibm_pi_network_address_groups.go new file mode 100644 index 0000000000..35f8d3a862 --- /dev/null +++ b/ibm/service/power/data_source_ibm_pi_network_address_groups.go @@ -0,0 +1,145 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power + +import ( + "context" + "log" + + "github.com/IBM-Cloud/power-go-client/clients/instance" + "github.com/IBM-Cloud/power-go-client/power/models" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/hashicorp/go-uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" +) + +func DataSourceIBMPINetworkAddressGroups() *schema.Resource { + return &schema.Resource{ + ReadContext: dataSourceIBMPINetworkAddressGroupsRead, + + Schema: map[string]*schema.Schema{ + // Arguments + Arg_CloudInstanceID: { + Description: "The GUID of the service instance associated with an account.", + Required: true, + Type: schema.TypeString, + ValidateFunc: validation.NoZeroValues, + }, + + // Attributes + Attr_NetworkAddressGroups: { + Computed: true, + Description: "list of Network Address Groups.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + Attr_CRN: { + Computed: true, + Description: "The Network Address Group's crn.", + Type: schema.TypeString, + }, + Attr_ID: { + Computed: true, + Description: "The id of the Network Address Group.", + Type: schema.TypeString, + }, + Attr_Members: { + Computed: true, + Description: "The list of IP addresses in CIDR notation (for example 192.168.66.2/32) in the Network Address Group.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + Attr_CIDR: { + Computed: true, + Description: "The IP addresses in CIDR notation for example 192.168.1.5/32.", + Type: schema.TypeString, + }, + Attr_ID: { + Computed: true, + Description: "The id of the Network Address Group member IP addresses.", + Type: schema.TypeString, + }, + }, + }, + Type: schema.TypeList, + }, + Attr_Name: { + Computed: true, + Description: "The name of the Network Address Group.", + Type: schema.TypeString, + }, + Attr_UserTags: { + Computed: true, + Description: "List of user tags attached to the resource.", + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + Type: schema.TypeSet, + }, + }, + }, + Type: schema.TypeList, + }, + }, + } +} + +func dataSourceIBMPINetworkAddressGroupsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID := d.Get(Arg_CloudInstanceID).(string) + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, cloudInstanceID) + networkAddressGroups, err := nagC.GetAll() + if err != nil { + return diag.FromErr(err) + } + + var genID, _ = uuid.GenerateUUID() + d.SetId(genID) + + nags := []map[string]interface{}{} + if len(networkAddressGroups.NetworkAddressGroups) > 0 { + for _, nag := range networkAddressGroups.NetworkAddressGroups { + modelMap := networkAddressGroupsNetworkAddressGroupToMap(nag, meta) + nags = append(nags, modelMap) + } + } + d.Set(Attr_NetworkAddressGroups, nags) + + return nil +} + +func networkAddressGroupsNetworkAddressGroupToMap(networkAddressGroup *models.NetworkAddressGroup, meta interface{}) map[string]interface{} { + nag := make(map[string]interface{}) + if networkAddressGroup.Crn != nil { + nag[Attr_CRN] = networkAddressGroup.Crn + userTags, err := flex.GetTagsUsingCRN(meta, string(*networkAddressGroup.Crn)) + if err != nil { + log.Printf("Error on get of pi network address group (%s) user_tags: %s", *networkAddressGroup.ID, err) + } + nag[Attr_UserTags] = userTags + } + + nag[Attr_ID] = networkAddressGroup.ID + if len(networkAddressGroup.Members) > 0 { + members := []map[string]interface{}{} + for _, membersItem := range networkAddressGroup.Members { + member := memberToMap(membersItem) + members = append(members, member) + } + nag[Attr_Members] = members + } + nag[Attr_Name] = networkAddressGroup.Name + return nag +} + +func memberToMap(mbr *models.NetworkAddressGroupMember) map[string]interface{} { + member := make(map[string]interface{}) + member[Attr_CIDR] = mbr.Cidr + member[Attr_ID] = mbr.ID + return member +} diff --git a/ibm/service/power/data_source_ibm_pi_network_address_groups_test.go b/ibm/service/power/data_source_ibm_pi_network_address_groups_test.go new file mode 100644 index 0000000000..fdb1f2c34f --- /dev/null +++ b/ibm/service/power/data_source_ibm_pi_network_address_groups_test.go @@ -0,0 +1,35 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power_test + +import ( + "fmt" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" +) + +func TestAccIBMPINetworkAddressGroupsDataSourceBasic(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMPINetworkAddressGroupsDataSourceConfigBasic(), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttrSet("data.ibm_pi_network_address_groups.network_address_groups", "id"), + ), + }, + }, + }) +} + +func testAccCheckIBMPINetworkAddressGroupsDataSourceConfigBasic() string { + return fmt.Sprintf(` + data "ibm_pi_network_address_groups" "network_address_groups" { + pi_cloud_instance_id = "%s" + }`, acc.Pi_cloud_instance_id) +} diff --git a/ibm/service/power/ibm_pi_constants.go b/ibm/service/power/ibm_pi_constants.go index dc68945132..34674fb5ce 100644 --- a/ibm/service/power/ibm_pi_constants.go +++ b/ibm/service/power/ibm_pi_constants.go @@ -47,6 +47,8 @@ const ( Arg_Memory = "pi_memory" Arg_Name = "pi_name" Arg_Network = "pi_network" + Arg_NetworkAddressGroupID = "pi_network_address_group_id" + Arg_NetworkAddressGroupMemberID = "pi_network_address_group_member_id" Arg_NetworkID = "pi_network_id" Arg_NetworkInterfaceID = "pi_network_interface_id" Arg_NetworkName = "pi_network_name" @@ -271,6 +273,9 @@ const ( Attr_MirroringState = "mirroring_state" Attr_MTU = "mtu" Attr_Name = "name" + Attr_NetworkAddressGroupID = "network_address_group_id" + Attr_NetworkAddressGroupMemberID = "network_address_group_member_id" + Attr_NetworkAddressGroups = "network_address_groups" Attr_NetworkID = "network_id" Attr_NetworkInterfaceID = "network_interface_id" Attr_NetworkName = "network_name" diff --git a/ibm/service/power/resource_ibm_pi_network_address_group.go b/ibm/service/power/resource_ibm_pi_network_address_group.go new file mode 100644 index 0000000000..ce5ca49afd --- /dev/null +++ b/ibm/service/power/resource_ibm_pi_network_address_group.go @@ -0,0 +1,247 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power + +import ( + "context" + "fmt" + "log" + "time" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + + "github.com/IBM-Cloud/power-go-client/clients/instance" + "github.com/IBM-Cloud/power-go-client/power/models" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" +) + +func ResourceIBMPINetworkAddressGroup() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIBMPINetworkAddressGroupCreate, + ReadContext: resourceIBMPINetworkAddressGroupRead, + UpdateContext: resourceIBMPINetworkAddressGroupUpdate, + DeleteContext: resourceIBMPINetworkAddressGroupDelete, + Importer: &schema.ResourceImporter{}, + + Timeouts: &schema.ResourceTimeout{ + Delete: schema.DefaultTimeout(5 * time.Minute), + }, + + Schema: map[string]*schema.Schema{ + // Arguments + Arg_CloudInstanceID: { + Description: "The GUID of the service instance associated with an account.", + ForceNew: true, + Required: true, + Type: schema.TypeString, + ValidateFunc: validation.NoZeroValues, + }, + Arg_Name: { + Description: "The name of the Network Address Group.", + Required: true, + Type: schema.TypeString, + ValidateFunc: validation.NoZeroValues, + }, + Arg_UserTags: { + Description: "The user tags associated with this resource.", + Elem: &schema.Schema{Type: schema.TypeString}, + Optional: true, + Set: schema.HashString, + Type: schema.TypeSet, + }, + // Attributes + Attr_CRN: { + Computed: true, + Description: "The Network Address Group's crn.", + Type: schema.TypeString, + }, + Attr_Members: { + Computed: true, + Description: "The list of IP addresses in CIDR notation (for example 192.168.66.2/32) in the Network Address Group.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + Attr_CIDR: { + Computed: true, + Description: "The IP addresses in CIDR notation for example 192.168.1.5/32.", + Type: schema.TypeString, + }, + Attr_ID: { + Computed: true, + Description: "The id of the Network Address Group member IP addresses.", + Type: schema.TypeString, + }, + }, + }, + Optional: true, + Type: schema.TypeList, + }, + Attr_NetworkAddressGroupID: { + Computed: true, + Description: "The unique identifier of the network address group.", + Type: schema.TypeString, + }, + }, + } +} + +func resourceIBMPINetworkAddressGroupCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID := d.Get(Arg_CloudInstanceID).(string) + name := d.Get(Arg_Name).(string) + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, cloudInstanceID) + var body = &models.NetworkAddressGroupCreate{ + Name: &name, + } + + if v, ok := d.GetOk(Arg_UserTags); ok { + body.UserTags = flex.ExpandStringList(v.([]interface{})) + } + + networkAddressGroup, err := nagC.Create(body) + if err != nil { + return diag.FromErr(err) + } + if _, ok := d.GetOk(Arg_UserTags); ok { + if networkAddressGroup.Crn != nil { + oldList, newList := d.GetChange(Arg_UserTags) + err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, string(*networkAddressGroup.Crn), "", UserTagType) + if err != nil { + log.Printf("Error on update of pi network address group (%s) pi_user_tags during creation: %s", *networkAddressGroup.ID, err) + } + } + } + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *networkAddressGroup.ID)) + + return resourceIBMPINetworkAddressGroupRead(ctx, d, meta) +} + +func resourceIBMPINetworkAddressGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID, nagID, err := splitID(d.Id()) + if err != nil { + return diag.FromErr(err) + } + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, cloudInstanceID) + networkAddressGroup, err := nagC.Get(nagID) + if err != nil { + return diag.FromErr(err) + } + d.Set(Arg_Name, networkAddressGroup.Name) + if networkAddressGroup.Crn != nil { + d.Set(Attr_CRN, networkAddressGroup.Crn) + userTags, err := flex.GetTagsUsingCRN(meta, string(*networkAddressGroup.Crn)) + if err != nil { + log.Printf("Error on get of network address group (%s) pi_user_tags: %s", nagID, err) + } + d.Set(Arg_UserTags, userTags) + } + + d.Set(Attr_NetworkAddressGroupID, networkAddressGroup.ID) + members := []map[string]interface{}{} + if len(networkAddressGroup.Members) > 0 { + for _, mbr := range networkAddressGroup.Members { + member := memberToMap(mbr) + members = append(members, member) + } + d.Set(Attr_Members, members) + } else { + d.Set(Attr_Members, nil) + } + + return nil +} + +func resourceIBMPINetworkAddressGroupUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + parts, err := flex.IdParts(d.Id()) + if err != nil { + return diag.FromErr(err) + } + hasChange := false + body := &models.NetworkAddressGroupUpdate{} + if d.HasChange(Arg_UserTags) { + if crn, ok := d.GetOk(Attr_CRN); ok { + oldList, newList := d.GetChange(Arg_UserTags) + err := flex.UpdateGlobalTagsUsingCRN(oldList, newList, meta, crn.(string), "", UserTagType) + if err != nil { + log.Printf("Error on update of pi network address group (%s) pi_user_tags: %s", parts[1], err) + } + } + } + if d.HasChange(Arg_Name) { + body.Name = d.Get(Arg_Name).(string) + hasChange = true + } + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, parts[0]) + if hasChange { + _, err := nagC.Update(parts[1], body) + if err != nil { + return diag.FromErr(err) + } + } + + return resourceIBMPINetworkAddressGroupRead(ctx, d, meta) +} + +func resourceIBMPINetworkAddressGroupDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + parts, err := flex.IdParts(d.Id()) + if err != nil { + return diag.FromErr(err) + } + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, parts[0]) + err = nagC.Delete(parts[1]) + if err != nil { + return diag.FromErr(err) + } + _, err = isWaitForIBMPINetworkAddressGroupDeleted(ctx, nagC, parts[1], d.Timeout(schema.TimeoutDelete)) + if err != nil { + return diag.FromErr(err) + } + d.SetId("") + + return nil +} + +func isWaitForIBMPINetworkAddressGroupDeleted(ctx context.Context, client *instance.IBMPINetworkAddressGroupClient, nagID string, timeout time.Duration) (interface{}, error) { + stateConf := &retry.StateChangeConf{ + Pending: []string{State_Deleting}, + Target: []string{State_NotFound}, + Refresh: isIBMPINetworkAddressGroupDeleteRefreshFunc(client, nagID), + Delay: 10 * time.Second, + MinTimeout: 30 * time.Second, + Timeout: timeout, + } + + return stateConf.WaitForStateContext(ctx) +} +func isIBMPINetworkAddressGroupDeleteRefreshFunc(client *instance.IBMPINetworkAddressGroupClient, nagID string) retry.StateRefreshFunc { + return func() (interface{}, string, error) { + nag, err := client.Get(nagID) + if err != nil { + return nag, State_NotFound, nil + } + return nag, State_Deleting, nil + } +} diff --git a/ibm/service/power/resource_ibm_pi_network_address_group_member.go b/ibm/service/power/resource_ibm_pi_network_address_group_member.go new file mode 100644 index 0000000000..d7fdfed371 --- /dev/null +++ b/ibm/service/power/resource_ibm_pi_network_address_group_member.go @@ -0,0 +1,266 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power + +import ( + "context" + "fmt" + "log" + "slices" + "time" + + "github.com/IBM-Cloud/power-go-client/clients/instance" + "github.com/IBM-Cloud/power-go-client/power/models" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/retry" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" +) + +func ResourceIBMPINetworkAddressGroupMember() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIBMPINetworkAddressGroupMemberCreate, + ReadContext: resourceIBMPINetworkAddressGroupMemberRead, + DeleteContext: resourceIBMPINetworkAddressGroupMemberDelete, + Importer: &schema.ResourceImporter{}, + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(5 * time.Minute), + Delete: schema.DefaultTimeout(5 * time.Minute), + }, + Schema: map[string]*schema.Schema{ + // Arguments + Arg_Cidr: { + Description: "The member to add in CIDR format.", + ExactlyOneOf: []string{Arg_Cidr, Arg_NetworkAddressGroupMemberID}, + ForceNew: true, + Optional: true, + Type: schema.TypeString, + }, + Arg_CloudInstanceID: { + Description: "The GUID of the service instance associated with an account.", + ForceNew: true, + Required: true, + Type: schema.TypeString, + ValidateFunc: validation.NoZeroValues, + }, + Arg_NetworkAddressGroupID: { + Description: "Network Address Group ID.", + ForceNew: true, + Required: true, + Type: schema.TypeString, + ValidateFunc: validation.NoZeroValues, + }, + Arg_NetworkAddressGroupMemberID: { + Description: "The network address group member id to remove.", + ExactlyOneOf: []string{Arg_Cidr, Arg_NetworkAddressGroupMemberID}, + ForceNew: true, + Optional: true, + Type: schema.TypeString, + }, + // Attributes + Attr_CRN: { + Computed: true, + Description: "The network address group's crn.", + Type: schema.TypeString, + }, + Attr_Members: { + Computed: true, + Description: "The list of IP addresses in CIDR notation (for example 192.168.66.2/32) in the Network Address Group.", + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + Attr_CIDR: { + Computed: true, + Description: "The IP addresses in CIDR notation for example 192.168.1.5/32.", + Type: schema.TypeString, + }, + Attr_ID: { + Computed: true, + Description: "The id of the Network Address Group member IP addresses.", + Type: schema.TypeString, + }, + }, + }, + Type: schema.TypeList, + }, + Attr_Name: { + Computed: true, + Description: "The name of the Network Address Group.", + Type: schema.TypeString, + }, + Attr_UserTags: { + Computed: true, + Description: "List of user tags attached to the resource.", + Elem: &schema.Schema{Type: schema.TypeString}, + Set: schema.HashString, + Type: schema.TypeSet, + }, + }, + } +} +func resourceIBMPINetworkAddressGroupMemberCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + cloudInstanceID := d.Get(Arg_CloudInstanceID).(string) + nagID := d.Get(Arg_NetworkAddressGroupID).(string) + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, cloudInstanceID) + var body = &models.NetworkAddressGroupAddMember{} + if v, ok := d.GetOk(Arg_Cidr); ok { + cidr := v.(string) + body.Cidr = &cidr + networkAddressGroup, err := nagC.AddMember(nagID, body) + if err != nil { + return diag.FromErr(err) + } + _, err = isWaitForIBMPINetworkAddressGroupMemberAdd(ctx, nagC, nagID, *networkAddressGroup.ID, d.Timeout(schema.TimeoutCreate)) + if err != nil { + return diag.FromErr(err) + } + d.SetId(fmt.Sprintf("%s/%s/%s", cloudInstanceID, nagID, *networkAddressGroup.ID)) + } + if v, ok := d.GetOk(Arg_NetworkAddressGroupMemberID); ok { + memberID := v.(string) + err := nagC.DeleteMember(nagID, memberID) + if err != nil { + return diag.FromErr(err) + } + _, err = isWaitForIBMPINetworkAddressGroupMemberRemove(ctx, nagC, nagID, memberID, d.Timeout(schema.TimeoutDelete)) + if err != nil { + return diag.FromErr(err) + } + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, nagID)) + } + + return resourceIBMPINetworkAddressGroupMemberRead(ctx, d, meta) +} +func resourceIBMPINetworkAddressGroupMemberRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + parts, err := flex.IdParts(d.Id()) + if err != nil { + return diag.FromErr(err) + } + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, parts[0]) + networkAddressGroup, err := nagC.Get(parts[1]) + if err != nil { + return diag.FromErr(err) + } + + if networkAddressGroup.Crn != nil { + d.Set(Attr_CRN, networkAddressGroup.Crn) + userTags, err := flex.GetTagsUsingCRN(meta, string(*networkAddressGroup.Crn)) + if err != nil { + log.Printf("Error on get of pi network address group (%s) user_tags: %s", parts[1], err) + } + d.Set(Attr_UserTags, userTags) + } + if len(networkAddressGroup.Members) > 0 { + members := []map[string]interface{}{} + for _, mbr := range networkAddressGroup.Members { + member := memberToMap(mbr) + members = append(members, member) + } + d.Set(Attr_Members, members) + } else { + d.Set(Attr_Members, nil) + } + d.Set(Attr_Name, networkAddressGroup.Name) + + return nil +} +func resourceIBMPINetworkAddressGroupMemberDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + parts, err := flex.IdParts(d.Id()) + if err != nil { + return diag.FromErr(err) + } + + if len(parts) > 2 { + nagC := instance.NewIBMPINetworkAddressGroupClient(ctx, sess, parts[0]) + err = nagC.DeleteMember(parts[1], parts[2]) + if err != nil { + return diag.FromErr(err) + } + _, err = isWaitForIBMPINetworkAddressGroupMemberRemove(ctx, nagC, parts[1], parts[2], d.Timeout(schema.TimeoutDelete)) + if err != nil { + return diag.FromErr(err) + } + } + + d.SetId("") + + return nil +} +func isWaitForIBMPINetworkAddressGroupMemberAdd(ctx context.Context, client *instance.IBMPINetworkAddressGroupClient, id, memberID string, timeout time.Duration) (interface{}, error) { + + stateConf := &retry.StateChangeConf{ + Pending: []string{State_Pending}, + Target: []string{State_Available}, + Refresh: isIBMPINetworkAddressGroupMemberAddRefreshFunc(client, id, memberID), + Timeout: timeout, + Delay: 10 * time.Second, + MinTimeout: 30 * time.Second, + } + + return stateConf.WaitForStateContext(ctx) +} +func isIBMPINetworkAddressGroupMemberAddRefreshFunc(client *instance.IBMPINetworkAddressGroupClient, id, memberID string) retry.StateRefreshFunc { + + return func() (interface{}, string, error) { + networkAddressGroup, err := client.Get(id) + if err != nil { + return nil, "", err + } + + if len(networkAddressGroup.Members) > 0 { + var mbrIDs []string + for _, mbr := range networkAddressGroup.Members { + mbrIDs = append(mbrIDs, *mbr.ID) + } + if slices.Contains(mbrIDs, memberID) { + return networkAddressGroup, State_Available, nil + } + } + return networkAddressGroup, State_Pending, nil + } +} +func isWaitForIBMPINetworkAddressGroupMemberRemove(ctx context.Context, client *instance.IBMPINetworkAddressGroupClient, id, memberID string, timeout time.Duration) (interface{}, error) { + + stateConf := &retry.StateChangeConf{ + Pending: []string{State_Pending}, + Target: []string{State_Removed}, + Refresh: isIBMPINetworkAddressGroupMemberRemoveRefreshFunc(client, id, memberID), + Timeout: timeout, + Delay: 10 * time.Second, + MinTimeout: 30 * time.Second, + } + + return stateConf.WaitForStateContext(ctx) +} +func isIBMPINetworkAddressGroupMemberRemoveRefreshFunc(client *instance.IBMPINetworkAddressGroupClient, id, memberID string) retry.StateRefreshFunc { + + return func() (interface{}, string, error) { + networkAddressGroup, err := client.Get(id) + if err != nil { + return nil, "", err + } + var mbrIDs []string + for _, mbr := range networkAddressGroup.Members { + mbrIDs = append(mbrIDs, *mbr.ID) + } + if !slices.Contains(mbrIDs, memberID) { + return networkAddressGroup, State_Removed, nil + } + return networkAddressGroup, State_Pending, nil + } +} diff --git a/ibm/service/power/resource_ibm_pi_network_address_group_member_test.go b/ibm/service/power/resource_ibm_pi_network_address_group_member_test.go new file mode 100644 index 0000000000..f2f443369c --- /dev/null +++ b/ibm/service/power/resource_ibm_pi_network_address_group_member_test.go @@ -0,0 +1,77 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power_test + +import ( + "context" + "errors" + "fmt" + "testing" + + "github.com/IBM-Cloud/power-go-client/clients/instance" + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/service/power" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" +) + +func TestAccIBMPINetworkAddressGroupMemberBasic(t *testing.T) { + name := fmt.Sprintf("tf-nag-name-%d", acctest.RandIntRange(10, 100)) + cidr := "192.168.1.5/32" + nagMemberRes := "ibm_pi_network_address_group_member.network_address_group_member" + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMPINetworkAddressGroupMemberConfigBasic(name, cidr), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMPINetworkAddressGroupMemberExists(nagMemberRes), + resource.TestCheckResourceAttrSet(nagMemberRes, power.Arg_NetworkAddressGroupID), + resource.TestCheckResourceAttr(nagMemberRes, power.Arg_Cidr, cidr), + resource.TestCheckResourceAttrSet(nagMemberRes, power.Attr_Name), + ), + }, + }, + }) +} + +func testAccCheckIBMPINetworkAddressGroupMemberConfigBasic(name, cidr string) string { + return testAccCheckIBMPINetworkAddressGroupConfigBasic(name) + fmt.Sprintf(` + resource "ibm_pi_network_address_group_member" "network_address_group_member" { + pi_cloud_instance_id = "%[1]s" + pi_cidr = "%[2]s" + pi_network_address_group_id = ibm_pi_network_address_group.network_address_group.network_address_group_id + }`, acc.Pi_cloud_instance_id, cidr) +} + +func testAccCheckIBMPINetworkAddressGroupMemberExists(n string) resource.TestCheckFunc { + + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return errors.New("No Record ID is set") + } + sess, err := acc.TestAccProvider.Meta().(conns.ClientSession).IBMPISession() + if err != nil { + return err + } + cloudInstanceID, nsgID, err := splitID(rs.Primary.ID) + if err != nil { + return err + } + nsgClient := instance.NewIBMPINetworkAddressGroupClient(context.Background(), sess, cloudInstanceID) + _, err = nsgClient.Get(nsgID) + if err != nil { + return err + } + return nil + } +} diff --git a/ibm/service/power/resource_ibm_pi_network_address_group_test.go b/ibm/service/power/resource_ibm_pi_network_address_group_test.go new file mode 100644 index 0000000000..098d7ca1ac --- /dev/null +++ b/ibm/service/power/resource_ibm_pi_network_address_group_test.go @@ -0,0 +1,116 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power_test + +import ( + "context" + "errors" + "fmt" + "strings" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + "github.com/IBM-Cloud/power-go-client/clients/instance" + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/service/power" +) + +func TestAccIBMPINetworkAddressGroupBasic(t *testing.T) { + name := fmt.Sprintf("tf-nag-name-%d", acctest.RandIntRange(10, 100)) + nameUpdate := fmt.Sprintf("tf-nag-name-update-%d", acctest.RandIntRange(10, 100)) + nagRes := "ibm_pi_network_address_group.network_address_group" + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMPINetworkAddressGroupDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMPINetworkAddressGroupConfigBasic(name), + Check: resource.ComposeAggregateTestCheckFunc( + testAccCheckIBMPINetworkAddressGroupExists(nagRes), + resource.TestCheckResourceAttrSet(nagRes, power.Attr_ID), + resource.TestCheckResourceAttrSet(nagRes, power.Attr_NetworkAddressGroupID), + resource.TestCheckResourceAttr(nagRes, power.Arg_Name, name), + ), + }, + { + Config: testAccCheckIBMPINetworkAddressGroupConfigBasic(nameUpdate), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr(nagRes, power.Arg_Name, nameUpdate), + resource.TestCheckResourceAttrSet(nagRes, power.Attr_ID), + resource.TestCheckResourceAttrSet(nagRes, power.Attr_NetworkAddressGroupID), + ), + }, + }, + }) +} + +func testAccCheckIBMPINetworkAddressGroupConfigBasic(name string) string { + return fmt.Sprintf(` + resource "ibm_pi_network_address_group" "network_address_group" { + pi_cloud_instance_id = "%[1]s" + pi_name = "%[2]s" + } + `, acc.Pi_cloud_instance_id, name) +} + +func testAccCheckIBMPINetworkAddressGroupExists(n string) resource.TestCheckFunc { + + return func(s *terraform.State) error { + rs, ok := s.RootModule().Resources[n] + if !ok { + return fmt.Errorf("Not found: %s", n) + } + + if rs.Primary.ID == "" { + return errors.New("No Record ID is set") + } + + sess, err := acc.TestAccProvider.Meta().(conns.ClientSession).IBMPISession() + if err != nil { + return err + } + cloudInstanceID, nagID, err := splitID(rs.Primary.ID) + if err != nil { + return err + } + nagC := instance.NewIBMPINetworkAddressGroupClient(context.Background(), sess, cloudInstanceID) + _, err = nagC.Get(nagID) + if err != nil { + return err + } + + return nil + } +} + +func testAccCheckIBMPINetworkAddressGroupDestroy(s *terraform.State) error { + sess, err := acc.TestAccProvider.Meta().(conns.ClientSession).IBMPISession() + if err != nil { + return err + } + for _, rs := range s.RootModule().Resources { + if rs.Type != "ibm_pi_network_address_group" { + continue + } + + cloudInstanceID, nagID, err := splitID(rs.Primary.ID) + if err != nil { + return err + } + nagC := instance.NewIBMPINetworkAddressGroupClient(context.Background(), sess, cloudInstanceID) + _, err = nagC.Get(nagID) + if err != nil { + if strings.Contains(strings.ToLower(err.Error()), power.NotFound) { + return nil + } + } + return fmt.Errorf("network addess group still exists: %s", rs.Primary.ID) + } + return nil +} diff --git a/website/docs/d/pi_network_address_group.html.markdown b/website/docs/d/pi_network_address_group.html.markdown new file mode 100644 index 0000000000..8cb69018ed --- /dev/null +++ b/website/docs/d/pi_network_address_group.html.markdown @@ -0,0 +1,57 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_pi_network_address_group" +description: |- + Get information about pi_network_address_group +subcategory: "Power Systems" +--- + +# ibm_pi_network_address_group + +Retrieves information about a network address group. + +## Example Usage + +```terraform + data "ibm_pi_network_address_group" "network_address_group" { + pi_cloud_instance_id = "" + pi_network_address_group_id = "" + } +``` + +### Notes + +- Please find [supported Regions](https://cloud.ibm.com/apidocs/power-cloud#endpoint) for endpoints. +- If a Power cloud instance is provisioned at `lon04`, The provider level attributes should be as follows: + - `region` - `lon` + - `zone` - `lon04` + +Example usage: + + ```terraform + provider "ibm" { + region = "lon" + zone = "lon04" + } + ``` + +## Argument Reference + +You can specify the following arguments for this data source. + +- `pi_cloud_instance_id` - (Required, String) The GUID of the service instance associated with an account. +- `pi_network_address_group_id` - (Required, String) The network address group id. + +## Attribute Reference + +In addition to all argument reference list, you can access the following attribute references after your data source is created. + +- `crn` - (String) The network address group's crn. +- `id` - The unique identifier of the network address group. +- `members` - (List) The list of IP addresses in CIDR notation in the network address group. + + Nested schema for `members`: + - `cidr` - (String) The IP addresses in CIDR notation. + - `id` - (String) The id of the network address group member IP addresses. +- `name` - (String) The name of the network address group. +- `user_tags` - (List) List of user tags attached to the resource. diff --git a/website/docs/d/pi_network_address_groups.html.markdown b/website/docs/d/pi_network_address_groups.html.markdown new file mode 100644 index 0000000000..9426ccdf0b --- /dev/null +++ b/website/docs/d/pi_network_address_groups.html.markdown @@ -0,0 +1,58 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_pi_network_address_groups" +description: |- + Get information about pi_network_address_groups +subcategory: "Power Systems" +--- + +# ibm_pi_network_address_groups + +Retrieves information about a network address groups. + +## Example Usage + +```terraform + data "ibm_pi_network_address_groups" "network_address_groups" { + pi_cloud_instance_id = "" + } +``` + +### Notes + +- Please find [supported Regions](https://cloud.ibm.com/apidocs/power-cloud#endpoint) for endpoints. +- If a Power cloud instance is provisioned at `lon04`, The provider level attributes should be as follows: + - `region` - `lon` + - `zone` - `lon04` + +Example usage: + + ```terraform + provider "ibm" { + region = "lon" + zone = "lon04" + } + ``` + +## Argument reference + +Review the argument references that you can specify for your data source. + +- `pi_cloud_instance_id` - (Required, String) The GUID of the service instance associated with an account. + +## Attribute Reference + +In addition to all argument reference list, you can access the following attribute references after your data source is created. + +- `network_address_groups` - (List) List of network address groups. + + Nested schema for `network_address_groups`: + - `crn` - (String) The network address group's crn. + - `id` - (String) The id of the network address group. + - `members` - (List) The list of IP addresses in CIDR notation in the network address group. + + Nested schema for `members`: + - `cidr` - (String) The IP addresses in CIDR notation. + - `id` - (String) The id of the network address group member IP addresses. + - `name` - (String) The name of the network address group. + - `user_tags` - (List) List of user tags attached to the resource. diff --git a/website/docs/r/pi_network_address_group.html.markdown b/website/docs/r/pi_network_address_group.html.markdown new file mode 100644 index 0000000000..d525dd3aec --- /dev/null +++ b/website/docs/r/pi_network_address_group.html.markdown @@ -0,0 +1,75 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_pi_network_address_group" +description: |- + Manages network address group. +subcategory: "Power Systems" +--- + +# ibm_pi_network_address_group + +Create, update, and delete a network address group. + +## Example Usage + +The following example creates a network address group. + +```terraform + resource "ibm_pi_network_address_group" "network_address_group_instance" { + pi_cloud_instance_id = "" + pi_name = "name" + } +``` + +### Notes + +- Please find [supported Regions](https://cloud.ibm.com/apidocs/power-cloud#endpoint) for endpoints. +- If a Power cloud instance is provisioned at `lon04`, The provider level attributes should be as follows: + - `region` - `lon` + - `zone` - `lon04` + +Example usage: + + ```terraform + provider "ibm" { + region = "lon" + zone = "lon04" + } + ``` + +## Timeouts + +ibm_pi_network_address_group provides the following [timeouts](https://www.terraform.io/docs/language/resources/syntax.html) configuration options: + +- **delete** - (Default 5 minutes) Used for deleting network address group. + +## Argument Reference + +Review the argument references that you can specify for your resource. + +- `pi_cloud_instance_id` - (Required, String) The GUID of the service instance associated with an account. +- `pi_name` - (Required, String) The name of the Network Address Group. +- `pi_user_tags` - (Optional, List) List of user tags attached to the resource. + +## Attribute Reference + +In addition to all argument reference list, you can access the following attribute reference after your resource is created. + +- `crn` - (String) The network address group's crn. +- `id` - (String) The unique identifier of this resource. The ID is composed of `/`. +- `network_address_group_id` - (String) The unique identifier of the network address group. +- `members` - (List) The list of IP addresses in CIDR notation in the network address group. + + Nested schema for `members`: + - `cidr` - (String) The IP addresses in CIDR notation. + - `id` - (String) The id of the network address group member IP addresses. + +## Import + +The `ibm_pi_network_interface` resource can be imported by using `cloud_instance_id` and `network_address_group_id`. + +## Example + +```bash +terraform import ibm_pi_network_address_group.example d7bec597-4726-451f-8a63-e62e6f19c32c/041b186b-9598-4cb9-bf70-966d7b9d1dc8 +``` diff --git a/website/docs/r/pi_network_address_group_member.html.markdown b/website/docs/r/pi_network_address_group_member.html.markdown new file mode 100644 index 0000000000..ee04b5cc77 --- /dev/null +++ b/website/docs/r/pi_network_address_group_member.html.markdown @@ -0,0 +1,68 @@ +--- +layout: "ibm" +page_title: "IBM : ibm_pi_network_address_group_member" +description: |- + Manages pi_network_address_group_member. +subcategory: "Power Systems" +--- + +# ibm_pi_network_address_group_member + +Add or remove a network address group member. + +## Example Usage + +```terraform + resource "ibm_pi_network_address_group_member" "network_address_group_member" { + pi_cloud_instance_id = "" + pi_cidr = "cidr" + pi_network_address_group_id = "network_address_group_id" + } +``` + +### Notes + +- Please find [supported Regions](https://cloud.ibm.com/apidocs/power-cloud#endpoint) for endpoints. +- If a Power cloud instance is provisioned at `lon04`, The provider level attributes should be as follows: + - `region` - `lon` + - `zone` - `lon04` + +Example usage: + + ```terraform + provider "ibm" { + region = "lon" + zone = "lon04" + } + ``` + +## Timeouts + +ibm_pi_network_address_group_member provides the following [timeouts](https://www.terraform.io/docs/language/resources/syntax.html) configuration options: + +- **create** - (Default 5 minutes) Used for creating network address group member. +- **delete** - (Default 5 minutes) Used for deleting network address group member. + +## Argument Reference + +Review the argument references that you can specify for your resource. + +- `pi_cidr` - (Optional, String) The member to add in CIDR format, for example 192.168.1.5/32. Required if `pi_network_address_group_member_id` not provided. +- `pi_cloud_instance_id` - (Required, String) The GUID of the service instance associated with an account. +- `pi_network_address_group_id` - (Required, String) network address group id. +- `pi_network_address_group_member_id` - (Optional, String) The network address group member id to remove. Required if `pi_cidr` not provided. + +## Attribute Reference + +In addition to all argument reference list, you can access the following attribute reference after your resource is created. + +- `crn` - (String) The network address group's crn. +- `id` -(String) The unique identifier of the network address group resource. Composed of `/`. +- `network_address_group_id` - (String) The unique identifier of the network address group. +- `members` - (List) The list of IP addresses in CIDR notation in the network address group. + + Nested schema for `members`: + - `cidr` - (String) The IP addresses in CIDR notation + - `id` - (String) The id of the network address group member IP addresses. +- `name` - (String) The name of the network address group. +- `user_tags` - (List) List of user tags attached to the resource.