diff --git a/go.mod b/go.mod index 5544c78124..92869576a3 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.16 require ( github.com/IBM-Cloud/bluemix-go v0.0.0-20211109110327-8ef3d89514c8 github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20210705152127-41ca00fc9a62 - github.com/IBM-Cloud/power-go-client v1.0.79 + github.com/IBM-Cloud/power-go-client v1.0.85 github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca github.com/IBM/appconfiguration-go-admin-sdk v0.1.0 github.com/IBM/appid-management-go-sdk v0.0.0-20210908164609-dd0e0eaf732f diff --git a/go.sum b/go.sum index 7d21ded535..a573352da5 100644 --- a/go.sum +++ b/go.sum @@ -42,8 +42,8 @@ github.com/IBM-Cloud/bluemix-go v0.0.0-20211109110327-8ef3d89514c8/go.mod h1:q0f github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20210705152127-41ca00fc9a62 h1:MOkcr6qQGk4tY542ZJ1DggVh2WUP72EEyLB79llFVH8= github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20210705152127-41ca00fc9a62/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.0.79 h1:k++zgWtuHjq8csmr9VnzczKBRR4ubro7jb8PUfPwADU= -github.com/IBM-Cloud/power-go-client v1.0.79/go.mod h1:YRBsrY+n1+3xMd6HzfG0VATkXZqOQktK5Yvjx9x6ACc= +github.com/IBM-Cloud/power-go-client v1.0.85 h1:5iiYEPNBgSEgTLXcfxXZmyOSKwQO8YbUJz4hBivYOV4= +github.com/IBM-Cloud/power-go-client v1.0.85/go.mod h1:60o7AE2oDi/0CtoXlQhnCbC3o1fSRgaFCJO6DscmokA= 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= @@ -71,6 +71,7 @@ github.com/IBM/go-sdk-core/v5 v5.6.3/go.mod h1:tt/B9rxLkRtglE7pvqLuYikgCXaZFL3bt github.com/IBM/go-sdk-core/v5 v5.6.5/go.mod h1:tt/B9rxLkRtglE7pvqLuYikgCXaZFL3btdruJaoUeek= github.com/IBM/go-sdk-core/v5 v5.7.0/go.mod h1:+YbdhrjCHC84ls4MeBp+Hj4NZCni+tDAc0XQUqRO9Jc= github.com/IBM/go-sdk-core/v5 v5.7.2/go.mod h1:+YbdhrjCHC84ls4MeBp+Hj4NZCni+tDAc0XQUqRO9Jc= +github.com/IBM/go-sdk-core/v5 v5.8.0/go.mod h1:+YbdhrjCHC84ls4MeBp+Hj4NZCni+tDAc0XQUqRO9Jc= github.com/IBM/go-sdk-core/v5 v5.8.2 h1:hbT9jU5o2Gxv0CmPHK8Z1i6CpBVHcVuEajDoXNLXQqU= github.com/IBM/go-sdk-core/v5 v5.8.2/go.mod h1:axE2JrRq79gIJTjKPBwV6gWHswvVptBjbcvvCPIxARM= github.com/IBM/ibm-cos-sdk-go v1.3.1/go.mod h1:YLBAYobEA8bD27P7xpMwSQeNQu6W3DNBtBComXrRzRY= diff --git a/ibm/config.go b/ibm/config.go index 21354e642a..760124f663 100644 --- a/ibm/config.go +++ b/ibm/config.go @@ -1789,7 +1789,7 @@ func (c *Config) ClientSession() (interface{}, error) { session.apigatewayAPI = apigatewayAPI // POWER SYSTEMS Service - ibmpisession, err := ibmpisession.New(sess.BluemixSession.Config.IAMAccessToken, c.Region, false, 90000000000, session.bmxUserDetails.userAccount, c.Zone) + ibmpisession, err := ibmpisession.New(sess.BluemixSession.Config.IAMAccessToken, c.Region, false, session.bmxUserDetails.userAccount, c.Zone) if err != nil { session.ibmpiConfigErr = err return nil, err diff --git a/ibm/data_source_ibm_pi_catalog_images.go b/ibm/data_source_ibm_pi_catalog_images.go index 44e9d8a6c3..7c437c4551 100644 --- a/ibm/data_source_ibm_pi_catalog_images.go +++ b/ibm/data_source_ibm_pi_catalog_images.go @@ -4,8 +4,10 @@ package ibm import ( + "context" "time" + "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" @@ -20,7 +22,7 @@ Datasource to get the list of images that are available when a power instance is func dataSourceIBMPICatalogImages() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPICatalogImagesRead, + ReadContext: dataSourceIBMPICatalogImagesRead, Schema: map[string]*schema.Schema{ helpers.PICloudInstanceId: { @@ -112,14 +114,13 @@ func dataSourceIBMPICatalogImages() *schema.Resource { } } -func dataSourceIBMPICatalogImagesRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPICatalogImagesRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) includeSAP := false if s, ok := d.GetOk("sap"); ok { includeSAP = s.(bool) @@ -128,11 +129,12 @@ func dataSourceIBMPICatalogImagesRead(d *schema.ResourceData, meta interface{}) if v, ok := d.GetOk("vtl"); ok { includeVTL = v.(bool) } - imageC := instance.NewIBMPIImageClient(sess, powerinstanceid) - stockImages, err := imageC.GetAllStockImages(powerinstanceid, includeSAP, includeVTL) + imageC := instance.NewIBMPIImageClient(ctx, sess, cloudInstanceID) + stockImages, err := imageC.GetAllStockImages(includeSAP, includeVTL) if err != nil { - return err + return diag.FromErr(err) } + images := make([]map[string]interface{}, 0) for _, i := range stockImages.Images { image := make(map[string]interface{}) @@ -187,7 +189,6 @@ func dataSourceIBMPICatalogImagesRead(d *schema.ResourceData, meta interface{}) } d.SetId(time.Now().UTC().String()) d.Set("images", images) - d.Set(helpers.PICloudInstanceId, powerinstanceid) return nil } diff --git a/ibm/data_source_ibm_pi_cloud_connection.go b/ibm/data_source_ibm_pi_cloud_connection.go index c4f4c21a7a..86119ca7eb 100644 --- a/ibm/data_source_ibm_pi_cloud_connection.go +++ b/ibm/data_source_ibm_pi_cloud_connection.go @@ -123,7 +123,7 @@ func dataSourceIBMPICloudConnectionRead(ctx context.Context, d *schema.ResourceD cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) cloudConnectionName := d.Get(helpers.PICloudConnectionName).(string) - client := instance.NewIBMPICloudConnectionClient(sess, cloudInstanceID) + client := instance.NewIBMPICloudConnectionClient(ctx, sess, cloudInstanceID) // Get API does not work with name for Cloud Connection hence using GetAll (max 2) // TODO: Uncomment Get call below when avaiable and remove GetAll @@ -132,10 +132,10 @@ func dataSourceIBMPICloudConnectionRead(ctx context.Context, d *schema.ResourceD // log.Printf("[DEBUG] get cloud connection failed %v", err) // return diag.Errorf(errors.GetCloudConnectionOperationFailed, cloudConnectionName, err) // } - cloudConnections, err := client.GetAllWithContext(ctx, cloudInstanceID) + cloudConnections, err := client.GetAll() if err != nil { log.Printf("[DEBUG] get cloud connections failed %v", err) - return diag.Errorf("failed to perform get cloud connections operation with error %v", err) + return diag.FromErr(err) } var cloudConnection *models.CloudConnection if cloudConnections != nil { diff --git a/ibm/data_source_ibm_pi_cloud_connections.go b/ibm/data_source_ibm_pi_cloud_connections.go index 43e26e18d9..ce65620eba 100644 --- a/ibm/data_source_ibm_pi_cloud_connections.go +++ b/ibm/data_source_ibm_pi_cloud_connections.go @@ -120,12 +120,12 @@ func dataSourceIBMPICloudConnectionsRead(ctx context.Context, d *schema.Resource } cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) - client := st.NewIBMPICloudConnectionClient(sess, cloudInstanceID) + client := st.NewIBMPICloudConnectionClient(ctx, sess, cloudInstanceID) - cloudConnections, err := client.GetAllWithContext(ctx, cloudInstanceID) - if err != nil || cloudConnections == nil { + cloudConnections, err := client.GetAll() + if err != nil { log.Printf("[DEBUG] get cloud connections failed %v", err) - return diag.Errorf("failed to perform get cloud connections operation with error %v", err) + return diag.FromErr(err) } result := make([]map[string]interface{}, 0, len(cloudConnections.CloudConnections)) diff --git a/ibm/data_source_ibm_pi_cloud_instance.go b/ibm/data_source_ibm_pi_cloud_instance.go index 8dc29ecd3b..46eb0a1ff9 100644 --- a/ibm/data_source_ibm_pi_cloud_instance.go +++ b/ibm/data_source_ibm_pi_cloud_instance.go @@ -4,6 +4,9 @@ package ibm import ( + "context" + + "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" @@ -15,7 +18,7 @@ import ( func dataSourceIBMPICloudInstance() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPICloudInstanceRead, + ReadContext: dataSourceIBMPICloudInstanceRead, Schema: map[string]*schema.Schema{ helpers.PICloudInstanceId: { Type: schema.TypeString, @@ -24,15 +27,10 @@ func dataSourceIBMPICloudInstance() *schema.Resource { }, // Start of Computed Attributes - "enabled": { Type: schema.TypeBool, Computed: true, }, - "creation_date": { - Type: schema.TypeString, - Computed: true, - }, "tenant_id": { Type: schema.TypeString, Computed: true, @@ -41,7 +39,6 @@ func dataSourceIBMPICloudInstance() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "capabilities": { Type: schema.TypeList, Computed: true, @@ -103,20 +100,18 @@ func dataSourceIBMPICloudInstance() *schema.Resource { } } -func dataSourceIBMPICloudInstanceRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPICloudInstanceRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - cloud_instance := instance.NewIBMPICloudInstanceClient(sess, powerinstanceid) - cloud_instance_data, err := cloud_instance.Get(powerinstanceid) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + cloud_instance := instance.NewIBMPICloudInstanceClient(ctx, sess, cloudInstanceID) + cloud_instance_data, err := cloud_instance.Get(cloudInstanceID) if err != nil { - return err + return diag.FromErr(err) } d.SetId(*cloud_instance_data.CloudInstanceID) diff --git a/ibm/data_source_ibm_pi_dhcp.go b/ibm/data_source_ibm_pi_dhcp.go index f4ebbee426..491c8735c0 100644 --- a/ibm/data_source_ibm_pi_dhcp.go +++ b/ibm/data_source_ibm_pi_dhcp.go @@ -10,8 +10,6 @@ import ( st "github.com/IBM-Cloud/power-go-client/clients/instance" - "github.com/IBM-Cloud/power-go-client/errors" - "github.com/IBM-Cloud/power-go-client/helpers" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" @@ -79,13 +77,13 @@ func dataSourceIBMPIDhcpRead(ctx context.Context, d *schema.ResourceData, meta i } cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) - dhcpID := d.Get(PIDhcpId).(string) + dhcpID := d.Get(PIDhcpID).(string) - client := st.NewIBMPIDhcpClient(sess, cloudInstanceID) - dhcpServer, err := client.GetWithContext(ctx, dhcpID, cloudInstanceID) + client := st.NewIBMPIDhcpClient(ctx, sess, cloudInstanceID) + dhcpServer, err := client.Get(dhcpID) if err != nil { log.Printf("[DEBUG] get DHCP failed %v", err) - return diag.Errorf(errors.GetDhcpOperationFailed, dhcpID, err) + return diag.FromErr(err) } d.SetId(*dhcpServer.ID) diff --git a/ibm/data_source_ibm_pi_dhcps.go b/ibm/data_source_ibm_pi_dhcps.go index c73bed4a4c..aaaf0adea6 100644 --- a/ibm/data_source_ibm_pi_dhcps.go +++ b/ibm/data_source_ibm_pi_dhcps.go @@ -68,11 +68,11 @@ func dataSourceIBMPIDhcpServersRead(ctx context.Context, d *schema.ResourceData, cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) - client := st.NewIBMPIDhcpClient(sess, cloudInstanceID) - dhcpServers, err := client.GetAllWithContext(ctx, cloudInstanceID) + client := st.NewIBMPIDhcpClient(ctx, sess, cloudInstanceID) + dhcpServers, err := client.GetAll() if err != nil { log.Printf("[DEBUG] get all DHCP failed %v", err) - return diag.Errorf("failed to perform get all DHCP operation with error %v", err) + return diag.FromErr(err) } result := make([]map[string]interface{}, 0, len(dhcpServers)) diff --git a/ibm/data_source_ibm_pi_image.go b/ibm/data_source_ibm_pi_image.go index 6345519062..a2cdc27b3e 100644 --- a/ibm/data_source_ibm_pi_image.go +++ b/ibm/data_source_ibm_pi_image.go @@ -4,7 +4,10 @@ package ibm import ( + "context" + "github.com/IBM-Cloud/power-go-client/helpers" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" //"fmt" @@ -15,7 +18,7 @@ import ( func dataSourceIBMPIImage() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPIImagesRead, + ReadContext: dataSourceIBMPIImagesRead, Schema: map[string]*schema.Schema{ helpers.PIImageName: { @@ -66,21 +69,18 @@ func dataSourceIBMPIImage() *schema.Resource { } } -func dataSourceIBMPIImagesRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPIImagesRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - - imageC := instance.NewIBMPIImageClient(sess, powerinstanceid) - imagedata, err := imageC.Get(d.Get(helpers.PIImageName).(string), powerinstanceid) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + imageC := instance.NewIBMPIImageClient(ctx, sess, cloudInstanceID) + imagedata, err := imageC.Get(d.Get(helpers.PIImageName).(string)) if err != nil { - return err + return diag.FromErr(err) } d.SetId(*imagedata.ImageID) diff --git a/ibm/data_source_ibm_pi_images.go b/ibm/data_source_ibm_pi_images.go index 3dd434b170..98218dd911 100644 --- a/ibm/data_source_ibm_pi_images.go +++ b/ibm/data_source_ibm_pi_images.go @@ -4,9 +4,12 @@ package ibm import ( + "context" + "github.com/IBM-Cloud/power-go-client/helpers" "github.com/IBM-Cloud/power-go-client/power/models" "github.com/hashicorp/go-uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" //"fmt" @@ -21,7 +24,7 @@ Datasource to get the list of images that are available when a power instance is func dataSourceIBMPIImages() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPIImagesAllRead, + ReadContext: dataSourceIBMPIImagesAllRead, Schema: map[string]*schema.Schema{ helpers.PICloudInstanceId: { @@ -72,27 +75,23 @@ func dataSourceIBMPIImages() *schema.Resource { } } -func dataSourceIBMPIImagesAllRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPIImagesAllRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - - imageC := instance.NewIBMPIImageClient(sess, powerinstanceid) - - imagedata, err := imageC.GetAll(powerinstanceid) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + imageC := instance.NewIBMPIImageClient(ctx, sess, cloudInstanceID) + imagedata, err := imageC.GetAll() if err != nil { - return err + return diag.FromErr(err) } var clientgenU, _ = uuid.GenerateUUID() d.SetId(clientgenU) - _ = d.Set("image_info", flattenStockImages(imagedata.Images)) + d.Set("image_info", flattenStockImages(imagedata.Images)) return nil diff --git a/ibm/data_source_ibm_pi_instance.go b/ibm/data_source_ibm_pi_instance.go index b2d05db258..3af7700edf 100644 --- a/ibm/data_source_ibm_pi_instance.go +++ b/ibm/data_source_ibm_pi_instance.go @@ -153,9 +153,9 @@ func dataSourceIBMPIInstancesRead(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) - powerC := instance.NewIBMPIInstanceClient(ctx, sess, powerinstanceid) + powerC := instance.NewIBMPIInstanceClient(ctx, sess, cloudInstanceID) powervmdata, err := powerC.Get(d.Get(helpers.PIInstanceName).(string)) if err != nil { diff --git a/ibm/data_source_ibm_pi_instance_ip.go b/ibm/data_source_ibm_pi_instance_ip.go index 0ce710bdde..e845a77222 100644 --- a/ibm/data_source_ibm_pi_instance_ip.go +++ b/ibm/data_source_ibm_pi_instance_ip.go @@ -21,30 +21,28 @@ func dataSourceIBMPIInstanceIP() *schema.Resource { return &schema.Resource{ ReadContext: dataSourceIBMPIInstancesIPRead, Schema: map[string]*schema.Schema{ - helpers.PIInstanceName: { Type: schema.TypeString, Required: true, Description: "Server Name to be used for pvminstances", ValidateFunc: validation.NoZeroValues, }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, ValidateFunc: validation.NoZeroValues, }, - helpers.PINetworkName: { Type: schema.TypeString, Required: true, ValidateFunc: validation.NoZeroValues, }, + + // Computed attributes "ip": { Type: schema.TypeString, Computed: true, }, - "ipoctet": { Type: schema.TypeString, Computed: true, @@ -53,12 +51,10 @@ func dataSourceIBMPIInstanceIP() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "network_id": { Type: schema.TypeString, Computed: true, }, - "type": { Type: schema.TypeString, Computed: true, @@ -72,20 +68,14 @@ func dataSourceIBMPIInstanceIP() *schema.Resource { } func dataSourceIBMPIInstancesIPRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { - sess, err := meta.(ClientSession).IBMPISession() if err != nil { return diag.FromErr(err) } - err = checkValidSubnet(d, meta) - if err != nil { - return diag.FromErr(err) - } - - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - powerinstancesubnet := d.Get(helpers.PINetworkName).(string) - powerC := instance.NewIBMPIInstanceClient(ctx, sess, powerinstanceid) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + networkName := d.Get(helpers.PINetworkName).(string) + powerC := instance.NewIBMPIInstanceClient(ctx, sess, cloudInstanceID) powervmdata, err := powerC.Get(d.Get(helpers.PIInstanceName).(string)) if err != nil { @@ -93,8 +83,9 @@ func dataSourceIBMPIInstancesIPRead(ctx context.Context, d *schema.ResourceData, } for _, address := range powervmdata.Addresses { - if address.NetworkName == powerinstancesubnet { + if address.NetworkName == networkName { log.Printf("Printing the ip %s", address.IP) + d.SetId(address.NetworkID) d.Set("ip", address.IP) d.Set("network_id", address.NetworkID) d.Set("macaddress", address.MacAddress) @@ -111,25 +102,3 @@ func dataSourceIBMPIInstancesIPRead(ctx context.Context, d *schema.ResourceData, return diag.Errorf("failed to find instance ip that belongs to the given network") } - -func checkValidSubnet(d *schema.ResourceData, meta interface{}) error { - - sess, err := meta.(ClientSession).IBMPISession() - - if err != nil { - return err - } - - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - powerinstancesubnet := d.Get(helpers.PINetworkName).(string) - - networkC := instance.NewIBMPINetworkClient(sess, powerinstanceid) - networkdata, err := networkC.Get(powerinstancesubnet, powerinstanceid, getTimeOut) - if err != nil { - return err - } - - d.SetId(*networkdata.NetworkID) - - return nil -} diff --git a/ibm/data_source_ibm_pi_instance_volumes.go b/ibm/data_source_ibm_pi_instance_volumes.go index fe16ed36fb..3947a55ca6 100644 --- a/ibm/data_source_ibm_pi_instance_volumes.go +++ b/ibm/data_source_ibm_pi_instance_volumes.go @@ -4,9 +4,12 @@ package ibm import ( + "context" + "github.com/IBM-Cloud/power-go-client/helpers" "github.com/IBM-Cloud/power-go-client/power/models" "github.com/hashicorp/go-uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/IBM-Cloud/power-go-client/clients/instance" @@ -16,16 +19,14 @@ import ( func dataSourceIBMPIInstanceVolumes() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPIInstanceVolumesRead, + ReadContext: dataSourceIBMPIInstanceVolumesRead, Schema: map[string]*schema.Schema{ - helpers.PIInstanceName: { Type: schema.TypeString, Required: true, Description: "Instance Name to be used for pvminstances", ValidateFunc: validation.NoZeroValues, }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, @@ -33,12 +34,10 @@ func dataSourceIBMPIInstanceVolumes() *schema.Resource { }, //Computed Attributes - "boot_volume_id": { Type: schema.TypeString, Computed: true, }, - "instance_volumes": { Type: schema.TypeList, Computed: true, @@ -87,19 +86,18 @@ func dataSourceIBMPIInstanceVolumes() *schema.Resource { } } -func dataSourceIBMPIInstanceVolumesRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPIInstanceVolumesRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - volumeC := instance.NewIBMPIVolumeClient(sess, powerinstanceid) - volumedata, err := volumeC.GetAll(d.Get(helpers.PIInstanceName).(string), powerinstanceid, getTimeOut) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + volumeC := instance.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID) + volumedata, err := volumeC.GetAllInstanceVolumes(d.Get(helpers.PIInstanceName).(string)) if err != nil { - return err + return diag.FromErr(err) } var clientgenU, _ = uuid.GenerateUUID() diff --git a/ibm/data_source_ibm_pi_key.go b/ibm/data_source_ibm_pi_key.go index 16ce4ea558..c5f45723a9 100644 --- a/ibm/data_source_ibm_pi_key.go +++ b/ibm/data_source_ibm_pi_key.go @@ -4,6 +4,9 @@ package ibm import ( + "context" + + "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" @@ -14,7 +17,7 @@ import ( func dataSourceIBMPIKey() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPIKeysRead, + ReadContext: dataSourceIBMPIKeysRead, Schema: map[string]*schema.Schema{ helpers.PIKeyName: { @@ -42,28 +45,24 @@ func dataSourceIBMPIKey() *schema.Resource { } } -func dataSourceIBMPIKeysRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPIKeysRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - sshkeyC := instance.NewIBMPIKeyClient(sess, powerinstanceid) - sshkeydata, err := sshkeyC.Get(d.Get(helpers.PIKeyName).(string), powerinstanceid) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + sshkeyC := instance.NewIBMPIKeyClient(ctx, sess, cloudInstanceID) + sshkeydata, err := sshkeyC.Get(d.Get(helpers.PIKeyName).(string)) if err != nil { - return err + return diag.FromErr(err) } d.SetId(*sshkeydata.Name) d.Set("creation_date", sshkeydata.CreationDate.String()) d.Set("sshkey", sshkeydata.SSHKey) d.Set(helpers.PIKeyName, sshkeydata.Name) - d.Set(helpers.PICloudInstanceId, powerinstanceid) return nil - } diff --git a/ibm/data_source_ibm_pi_network.go b/ibm/data_source_ibm_pi_network.go index 9527500701..20d3af84f0 100644 --- a/ibm/data_source_ibm_pi_network.go +++ b/ibm/data_source_ibm_pi_network.go @@ -6,6 +6,9 @@ package ibm import ( //"fmt" + "context" + + "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" @@ -16,16 +19,14 @@ import ( func dataSourceIBMPINetwork() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPINetworksRead, + ReadContext: dataSourceIBMPINetworkRead, Schema: map[string]*schema.Schema{ - helpers.PINetworkName: { Type: schema.TypeString, Required: true, Description: "Network Name to be used for pvminstances", ValidateFunc: validation.NoZeroValues, }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, @@ -33,7 +34,6 @@ func dataSourceIBMPINetwork() *schema.Resource { }, // Computed Attributes - "cidr": { Type: schema.TypeString, Computed: true, @@ -76,19 +76,18 @@ func dataSourceIBMPINetwork() *schema.Resource { } } -func dataSourceIBMPINetworksRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPINetworkRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - networkC := instance.NewIBMPINetworkClient(sess, powerinstanceid) - networkdata, err := networkC.Get(d.Get(helpers.PINetworkName).(string), powerinstanceid, getTimeOut) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + networkC := instance.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + networkdata, err := networkC.Get(d.Get(helpers.PINetworkName).(string)) if err != nil || networkdata == nil { - return err + return diag.FromErr(err) } d.SetId(*networkdata.NetworkID) @@ -98,9 +97,7 @@ func dataSourceIBMPINetworksRead(d *schema.ResourceData, meta interface{}) error if networkdata.Type != nil { d.Set("type", networkdata.Type) } - if &networkdata.Gateway != nil { - d.Set("gateway", networkdata.Gateway) - } + d.Set("gateway", networkdata.Gateway) if networkdata.VlanID != nil { d.Set("vlan_id", networkdata.VlanID) } diff --git a/ibm/data_source_ibm_pi_network_port.go b/ibm/data_source_ibm_pi_network_port.go index 7fe9c70744..a879abdf9a 100644 --- a/ibm/data_source_ibm_pi_network_port.go +++ b/ibm/data_source_ibm_pi_network_port.go @@ -4,10 +4,13 @@ package ibm import ( + "context" + "log" + "github.com/IBM-Cloud/power-go-client/power/models" "github.com/hashicorp/go-uuid" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "log" //"fmt" "github.com/IBM-Cloud/power-go-client/clients/instance" @@ -18,16 +21,14 @@ import ( func dataSourceIBMPINetworkPort() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPINetworkPortsRead, + ReadContext: dataSourceIBMPINetworkPortsRead, Schema: map[string]*schema.Schema{ - helpers.PINetworkName: { Type: schema.TypeString, Required: true, Description: "Network Name to be used for pvminstances", ValidateFunc: validation.NoZeroValues, }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, @@ -35,7 +36,6 @@ func dataSourceIBMPINetworkPort() *schema.Resource { }, // Computed Attributes - "network_ports": { Type: schema.TypeList, Computed: true, @@ -77,19 +77,17 @@ func dataSourceIBMPINetworkPort() *schema.Resource { } } -func dataSourceIBMPINetworkPortsRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPINetworkPortsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - networkportC := instance.NewIBMPINetworkClient(sess, powerinstanceid) - networkportdata, err := networkportC.GetAllPort(d.Get(helpers.PINetworkName).(string), powerinstanceid, getTimeOut) - + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + networkportC := instance.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + networkportdata, err := networkportC.GetAllPorts(d.Get(helpers.PINetworkName).(string)) if err != nil { - return err + return diag.FromErr(err) } var clientgenU, _ = uuid.GenerateUUID() d.SetId(clientgenU) diff --git a/ibm/data_source_ibm_pi_public_network.go b/ibm/data_source_ibm_pi_public_network.go index 280fbf59cb..c01753ad6e 100644 --- a/ibm/data_source_ibm_pi_public_network.go +++ b/ibm/data_source_ibm_pi_public_network.go @@ -5,8 +5,9 @@ package ibm import ( //"fmt" - "fmt" + "context" + "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" @@ -17,17 +18,8 @@ import ( func dataSourceIBMPIPublicNetwork() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPIPublicNetworksRead, + ReadContext: dataSourceIBMPIPublicNetworkRead, Schema: map[string]*schema.Schema{ - - helpers.PINetworkName: { - Type: schema.TypeString, - Optional: true, - Description: "Network Name to be used for pvminstances", - ValidateFunc: validation.NoZeroValues, - Deprecated: "This field is deprectaed.", - }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, @@ -35,22 +27,14 @@ func dataSourceIBMPIPublicNetwork() *schema.Resource { }, // Computed Attributes - - "network_id": { - Type: schema.TypeString, - Computed: true, - }, - "name": { Type: schema.TypeString, Computed: true, }, - "type": { Type: schema.TypeString, Computed: true, }, - "vlan_id": { Type: schema.TypeInt, Computed: true, @@ -59,20 +43,23 @@ func dataSourceIBMPIPublicNetwork() *schema.Resource { } } -func dataSourceIBMPIPublicNetworksRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPIPublicNetworkRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - networkC := instance.NewIBMPINetworkClient(sess, powerinstanceid) - networkdata, err := networkC.GetPublic(powerinstanceid, getTimeOut) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) - if err != nil || networkdata == nil || len(networkdata.Networks) < 1 { - return fmt.Errorf("Error getting public network or no public network found in %s", powerinstanceid) + networkC := instance.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + networkdata, err := networkC.GetAllPublic() + if err != nil { + return diag.FromErr(err) } + if len(networkdata.Networks) < 1 { + return diag.Errorf("error getting public network or no public network found in %s", cloudInstanceID) + } + d.SetId(*networkdata.Networks[0].NetworkID) if networkdata.Networks[0].Type != nil { d.Set("type", networkdata.Networks[0].Type) @@ -83,11 +70,6 @@ func dataSourceIBMPIPublicNetworksRead(d *schema.ResourceData, meta interface{}) if networkdata.Networks[0].VlanID != nil { d.Set("vlan_id", networkdata.Networks[0].VlanID) } - if networkdata.Networks[0].NetworkID != nil { - d.Set("network_id", networkdata.Networks[0].NetworkID) - } - d.Set(helpers.PICloudInstanceId, powerinstanceid) return nil - } diff --git a/ibm/data_source_ibm_pi_snapshot.go b/ibm/data_source_ibm_pi_snapshot.go index 0bbf8a1b86..e68346e7a1 100644 --- a/ibm/data_source_ibm_pi_snapshot.go +++ b/ibm/data_source_ibm_pi_snapshot.go @@ -91,9 +91,9 @@ func dataSourceIBMPISnapshotRead(ctx context.Context, d *schema.ResourceData, me return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) powerinstancename := d.Get(helpers.PIInstanceName).(string) - snapshot := instance.NewIBMPIInstanceClient(ctx, sess, powerinstanceid) + snapshot := instance.NewIBMPIInstanceClient(ctx, sess, cloudInstanceID) snapshotData, err := snapshot.GetSnapShotVM(powerinstancename) if err != nil { diff --git a/ibm/data_source_ibm_pi_snapshots.go b/ibm/data_source_ibm_pi_snapshots.go index b5a505eebd..5f3ecdb1ec 100644 --- a/ibm/data_source_ibm_pi_snapshots.go +++ b/ibm/data_source_ibm_pi_snapshots.go @@ -4,21 +4,23 @@ package ibm import ( + "context" + "log" + "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" "github.com/IBM-Cloud/power-go-client/power/models" "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" - "log" ) func dataSourceIBMPISnapshots() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPISnapshotsRead, + ReadContext: dataSourceIBMPISnapshotsRead, Schema: map[string]*schema.Schema{ - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, @@ -26,7 +28,6 @@ func dataSourceIBMPISnapshots() *schema.Resource { }, //Computed Attributes - "instance_snapshots": { Type: schema.TypeList, Computed: true, @@ -44,7 +45,6 @@ func dataSourceIBMPISnapshots() *schema.Resource { Type: schema.TypeInt, Computed: true, }, - "description": { Type: schema.TypeString, Computed: true, @@ -72,19 +72,17 @@ func dataSourceIBMPISnapshots() *schema.Resource { } } -func dataSourceIBMPISnapshotsRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPISnapshotsRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - snapshot := instance.NewIBMPISnapshotClient(sess, powerinstanceid) - snapshotData, err := snapshot.GetAll("", powerinstanceid, getTimeOut) - + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + snapshot := instance.NewIBMPISnapshotClient(ctx, sess, cloudInstanceID) + snapshotData, err := snapshot.GetAll() if err != nil { - return err + return diag.FromErr(err) } var clientgenU, _ = uuid.GenerateUUID() @@ -92,7 +90,6 @@ func dataSourceIBMPISnapshotsRead(d *schema.ResourceData, meta interface{}) erro d.Set("instance_snapshots", flattenSnapshotsInstances(snapshotData.Snapshots)) return nil - } func flattenSnapshotsInstances(list []*models.Snapshot) []map[string]interface{} { diff --git a/ibm/data_source_ibm_pi_snapshots_test.go b/ibm/data_source_ibm_pi_snapshots_test.go index a3b38f5b2b..c6af83e220 100644 --- a/ibm/data_source_ibm_pi_snapshots_test.go +++ b/ibm/data_source_ibm_pi_snapshots_test.go @@ -17,7 +17,7 @@ func TestAccIBMPISnapshotsDataSource_basic(t *testing.T) { PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, Steps: []resource.TestStep{ - resource.TestStep{ + { Config: testAccCheckIBMPISnapshotsDataSourceConfig(), Check: resource.ComposeTestCheckFunc( resource.TestCheckResourceAttr("data.ibm_pi_pvminstance_snapshots.testacc_ds_snapshots", "pi_cloud_instance_id", pi_cloud_instance_id), diff --git a/ibm/data_source_ibm_pi_tenant.go b/ibm/data_source_ibm_pi_tenant.go index f87904b40e..41ed619cde 100644 --- a/ibm/data_source_ibm_pi_tenant.go +++ b/ibm/data_source_ibm_pi_tenant.go @@ -4,6 +4,9 @@ package ibm import ( + "context" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" //"fmt" @@ -15,7 +18,7 @@ import ( func dataSourceIBMPITenant() *schema.Resource { return &schema.Resource{ - Read: dataSourceIBMPITenantRead, + ReadContext: dataSourceIBMPITenantRead, Schema: map[string]*schema.Schema{ helpers.PICloudInstanceId: { Type: schema.TypeString, @@ -28,18 +31,15 @@ func dataSourceIBMPITenant() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "enabled": { Type: schema.TypeBool, Computed: true, }, - "tenant_name": { Type: schema.TypeString, Computed: true, }, "cloud_instances": { - Type: schema.TypeSet, Computed: true, Elem: &schema.Resource{ @@ -59,30 +59,26 @@ func dataSourceIBMPITenant() *schema.Resource { } } -func dataSourceIBMPITenantRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPITenantRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) //tenantid := d.Get("tenantid").(string) - tenantC := instance.NewIBMPITenantClient(sess, powerinstanceid) - tenantData, err := tenantC.Get(powerinstanceid) - + tenantC := instance.NewIBMPITenantClient(ctx, sess, cloudInstanceID) + tenantData, err := tenantC.GetSelfTenant() if err != nil { - return err + return diag.FromErr(err) } d.SetId(*tenantData.TenantID) - d.Set("creation_date", tenantData.CreationDate) + d.Set("creation_date", tenantData.CreationDate.String()) d.Set("enabled", tenantData.Enabled) if tenantData.CloudInstances != nil { - d.Set("tenant_name", tenantData.CloudInstances[0].Name) } @@ -99,5 +95,4 @@ func dataSourceIBMPITenantRead(d *schema.ResourceData, meta interface{}) error { } return nil - } diff --git a/ibm/data_source_ibm_pi_volume.go b/ibm/data_source_ibm_pi_volume.go index e9064afc60..1eaccb35f2 100644 --- a/ibm/data_source_ibm_pi_volume.go +++ b/ibm/data_source_ibm_pi_volume.go @@ -6,6 +6,9 @@ package ibm import ( //"fmt" + "context" + + "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" @@ -14,18 +17,15 @@ import ( ) func dataSourceIBMPIVolume() *schema.Resource { - return &schema.Resource{ - Read: dataSourceIBMPIVolumeRead, + ReadContext: dataSourceIBMPIVolumeRead, Schema: map[string]*schema.Schema{ - helpers.PIVolumeName: { Type: schema.TypeString, Required: true, Description: "Volume Name to be used for pvminstances", ValidateFunc: validation.NoZeroValues, }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, @@ -65,18 +65,17 @@ func dataSourceIBMPIVolume() *schema.Resource { } } -func dataSourceIBMPIVolumeRead(d *schema.ResourceData, meta interface{}) error { - +func dataSourceIBMPIVolumeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - volumeC := instance.NewIBMPIVolumeClient(sess, powerinstanceid) - volumedata, err := volumeC.Get(d.Get(helpers.PIVolumeName).(string), powerinstanceid, getTimeOut) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + volumeC := instance.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID) + volumedata, err := volumeC.Get(d.Get(helpers.PIVolumeName).(string)) if err != nil { - return err + return diag.FromErr(err) } d.SetId(*volumedata.VolumeID) @@ -87,6 +86,6 @@ func dataSourceIBMPIVolumeRead(d *schema.ResourceData, meta interface{}) error { d.Set("disk_type", volumedata.DiskType) d.Set("volume_pool", volumedata.VolumePool) d.Set("wwn", volumedata.Wwn) - return nil + return nil } diff --git a/ibm/resource_ibm_pi_capture.go b/ibm/resource_ibm_pi_capture.go index 50f524d8a9..f13a19d4e7 100644 --- a/ibm/resource_ibm_pi_capture.go +++ b/ibm/resource_ibm_pi_capture.go @@ -130,8 +130,8 @@ func resourceIBMPICaptureCreate(d *schema.ResourceData, meta interface{}) error // If this is an image catalog then we need to check what the status is - imageClient := st.NewIBMPIImageClient(sess, powerinstanceid) - imagedata, err := imageClient.Get(d.Get(helpers.PIInstanceCaptureName).(string), powerinstanceid) + imageClient := st.NewIBMPIImageClient(context.Background(), sess, powerinstanceid) + imagedata, err := imageClient.Get(d.Get(helpers.PIInstanceCaptureName).(string)) if err != nil { return err @@ -158,7 +158,7 @@ func resourceIBMPICaptureUpdate(d *schema.ResourceData, meta interface{}) error sess, _ := meta.(ClientSession).IBMPISession() powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) + client := st.NewIBMPIVolumeClient(context.Background(), sess, powerinstanceid) name := "" if d.HasChange(helpers.PIVolumeAttachName) { @@ -168,26 +168,26 @@ func resourceIBMPICaptureUpdate(d *schema.ResourceData, meta interface{}) error size := float64(d.Get(helpers.PIVolumeSize).(float64)) shareable := bool(d.Get(helpers.PIVolumeShareable).(bool)) - volrequest, err := client.Update(d.Id(), name, size, shareable, powerinstanceid, postTimeOut) + volrequest, err := client.UpdateVolume(d.Id(), &models.UpdateVolume{Name: &name, Size: size, Shareable: &shareable}) if err != nil { return err } - _, err = isWaitForIBMPIVolumeAvailable(client, *volrequest.VolumeID, powerinstanceid, d.Timeout(schema.TimeoutCreate)) + _, err = isWaitForIBMPIVolumeAvailable(context.Background(), client, *volrequest.VolumeID, d.Timeout(schema.TimeoutCreate)) if err != nil { return err } - return resourceIBMPIVolumeRead(d, meta) + return resourceIBMPICaptureRead(d, meta) } func resourceIBMPICaptureDelete(d *schema.ResourceData, meta interface{}) error { sess, _ := meta.(ClientSession).IBMPISession() powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) + client := st.NewIBMPIVolumeClient(context.Background(), sess, powerinstanceid) - err := client.Delete(d.Id(), powerinstanceid, deleteTimeOut) + err := client.DeleteVolume(d.Id()) if err != nil { return err } diff --git a/ibm/resource_ibm_pi_cloud_connection.go b/ibm/resource_ibm_pi_cloud_connection.go index 4be61a4bbb..22a0ee9898 100644 --- a/ibm/resource_ibm_pi_cloud_connection.go +++ b/ibm/resource_ibm_pi_cloud_connection.go @@ -199,28 +199,27 @@ func resourceIBMPICloudConnectionCreate(ctx context.Context, d *schema.ResourceD body.Vpc = vpc } - client := st.NewIBMPICloudConnectionClient(sess, cloudInstanceID) - cloudConnection, cloudConnectionJob, err := client.CreateWithContext(ctx, body, cloudInstanceID) + client := st.NewIBMPICloudConnectionClient(ctx, sess, cloudInstanceID) + cloudConnection, cloudConnectionJob, err := client.Create(body) if err != nil { log.Printf("[DEBUG] create cloud connection failed %v", err) - return diag.Errorf(errors.CreateCloudConnectionOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } - var cloudConnectionID string + if cloudConnection != nil { - cloudConnectionID = *cloudConnection.CloudConnectionID + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *cloudConnection.CloudConnectionID)) } else if cloudConnectionJob != nil { - cloudConnectionID = *cloudConnectionJob.CloudConnectionID + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *cloudConnection.CloudConnectionID)) + jobID := *cloudConnectionJob.JobRef.ID - client := st.NewIBMPIJobClient(sess, cloudInstanceID) - _, err = waitForIBMPIJobCompleted(ctx, client, jobID, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) + client := st.NewIBMPIJobClient(ctx, sess, cloudInstanceID) + _, err = waitForIBMPIJobCompleted(ctx, client, jobID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return diag.Errorf(errors.CreateCloudConnectionOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } } - d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, cloudConnectionID)) - return resourceIBMPICloudConnectionRead(ctx, d, meta) } @@ -241,8 +240,8 @@ func resourceIBMPICloudConnectionUpdate(ctx context.Context, d *schema.ResourceD ccName := d.Get(helpers.PICloudConnectionName).(string) ccSpeed := int64(d.Get(helpers.PICloudConnectionSpeed).(int)) - client := st.NewIBMPICloudConnectionClient(sess, cloudInstanceID) - jobClient := st.NewIBMPIJobClient(sess, cloudInstanceID) + client := st.NewIBMPICloudConnectionClient(ctx, sess, cloudInstanceID) + jobClient := st.NewIBMPIJobClient(ctx, sess, cloudInstanceID) if d.HasChangesExcept(helpers.PICloudConnectionNetworks) { @@ -305,14 +304,14 @@ func resourceIBMPICloudConnectionUpdate(ctx context.Context, d *schema.ResourceD body.Vpc = vpc } - _, cloudConnectionJob, err := client.UpdateWithContext(ctx, cloudConnectionID, cloudInstanceID, body) + _, cloudConnectionJob, err := client.Update(cloudConnectionID, body) if err != nil { - return diag.Errorf(errors.UpdateCloudConnectionOperationFailed, cloudConnectionID, err) + return diag.FromErr(err) } if cloudConnectionJob != nil { - _, err = waitForIBMPIJobCompleted(ctx, jobClient, *cloudConnectionJob.ID, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) + _, err = waitForIBMPIJobCompleted(ctx, jobClient, *cloudConnectionJob.ID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return diag.Errorf(errors.UpdateCloudConnectionOperationFailed, cloudConnectionID, err) + return diag.FromErr(err) } } } @@ -326,25 +325,29 @@ func resourceIBMPICloudConnectionUpdate(ctx context.Context, d *schema.ResourceD // call network add api for each toAdd for _, n := range expandStringList(toAdd.List()) { - jobReference, err := client.AddNetworkWithContext(ctx, n, cloudConnectionID, cloudInstanceID) + _, jobReference, err := client.AddNetwork(cloudConnectionID, n) if err != nil { - return diag.Errorf("failed to perform the network add operation... %v", err) + return diag.FromErr(err) } - _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, cloudInstanceID, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return diag.Errorf(errors.UpdateCloudConnectionOperationFailed, cloudConnectionID, err) + if jobReference != nil { + _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return diag.FromErr(err) + } } } // call network delete api for each toRemove for _, n := range expandStringList(toRemove.List()) { - jobReference, err := client.DeleteNetworkWithContext(ctx, n, cloudConnectionID, cloudInstanceID) + _, jobReference, err := client.DeleteNetwork(cloudConnectionID, n) if err != nil { - return diag.Errorf("failed to perform the network delete operation... %v", err) + return diag.FromErr(err) } - _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, cloudInstanceID, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return diag.Errorf(errors.UpdateCloudConnectionOperationFailed, cloudConnectionID, err) + if jobReference != nil { + _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return diag.FromErr(err) + } } } } @@ -366,17 +369,18 @@ func resourceIBMPICloudConnectionRead(ctx context.Context, d *schema.ResourceDat cloudInstanceID := parts[0] cloudConnectionID := parts[1] - client := st.NewIBMPICloudConnectionClient(sess, cloudInstanceID) - cloudConnection, err := client.GetWithContext(ctx, cloudConnectionID, cloudInstanceID) + client := st.NewIBMPICloudConnectionClient(ctx, sess, cloudInstanceID) + cloudConnection, err := client.Get(cloudConnectionID) if err != nil { - switch err.(type) { + uErr := errors.Unwrap(err) + switch uErr.(type) { case *p_cloud_cloud_connections.PcloudCloudconnectionsGetNotFound: log.Printf("[DEBUG] cloud connection does not exist %v", err) d.SetId("") return nil } log.Printf("[DEBUG] get cloud connection failed %v", err) - return diag.Errorf(errors.GetCloudConnectionOperationFailed, cloudConnectionID, err) + return diag.FromErr(err) } d.Set(PICloudConnectionId, cloudConnection.CloudConnectionID) @@ -432,32 +436,33 @@ func resourceIBMPICloudConnectionDelete(ctx context.Context, d *schema.ResourceD cloudInstanceID := parts[0] cloudConnectionID := parts[1] - client := st.NewIBMPICloudConnectionClient(sess, cloudInstanceID) - _, err = client.GetWithContext(ctx, cloudConnectionID, cloudInstanceID) + client := st.NewIBMPICloudConnectionClient(ctx, sess, cloudInstanceID) + _, err = client.Get(cloudConnectionID) if err != nil { - switch err.(type) { + uErr := errors.Unwrap(err) + switch uErr.(type) { case *p_cloud_cloud_connections.PcloudCloudconnectionsGetNotFound: log.Printf("[DEBUG] cloud connection does not exist %v", err) d.SetId("") return nil } log.Printf("[DEBUG] get cloud connection failed %v", err) - return diag.Errorf(errors.GetCloudConnectionOperationFailed, cloudConnectionID, err) + return diag.FromErr(err) } log.Printf("[INFO] Found cloud connection with id %s", cloudConnectionID) - _, deleteJob, err := client.DeleteWithContext(ctx, cloudConnectionID, cloudInstanceID) + deleteJob, err := client.Delete(cloudConnectionID) if err != nil { log.Printf("[DEBUG] delete cloud connection failed %v", err) - return diag.Errorf(errors.DeleteCloudConnectionOperationFailed, cloudConnectionID, err) + return diag.FromErr(err) } if deleteJob != nil { jobID := *deleteJob.ID - client := st.NewIBMPIJobClient(sess, cloudInstanceID) - _, err = waitForIBMPIJobCompleted(ctx, client, jobID, cloudInstanceID, d.Timeout(schema.TimeoutDelete)) + client := st.NewIBMPIJobClient(ctx, sess, cloudInstanceID) + _, err = waitForIBMPIJobCompleted(ctx, client, jobID, d.Timeout(schema.TimeoutDelete)) if err != nil { - return diag.Errorf(errors.DeleteCloudConnectionOperationFailed, cloudConnectionID, err) + return diag.FromErr(err) } } diff --git a/ibm/resource_ibm_pi_cloud_connection_test.go b/ibm/resource_ibm_pi_cloud_connection_test.go index 40a81dc9b2..eb5091d3ef 100644 --- a/ibm/resource_ibm_pi_cloud_connection_test.go +++ b/ibm/resource_ibm_pi_cloud_connection_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -46,14 +47,12 @@ func testAccCheckIBMPICloudConnectionDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_cloud_connection" { continue } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, cloudConnectionID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - cloudConnectionID := parts[1] - client := st.NewIBMPICloudConnectionClient(sess, cloudInstanceID) - _, err = client.Get(cloudConnectionID, cloudInstanceID) + client := st.NewIBMPICloudConnectionClient(context.Background(), sess, cloudInstanceID) + _, err = client.Get(cloudConnectionID) if err == nil { return fmt.Errorf("Cloud Connection still exists: %s", rs.Primary.ID) } @@ -74,15 +73,13 @@ func testAccCheckIBMPICloudConnectionExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, cloudConnectionID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - cloudConnectionID := parts[1] - client := st.NewIBMPICloudConnectionClient(sess, cloudInstanceID) + client := st.NewIBMPICloudConnectionClient(context.Background(), sess, cloudInstanceID) - _, err = client.Get(cloudConnectionID, cloudInstanceID) + _, err = client.Get(cloudConnectionID) if err != nil { return err } diff --git a/ibm/resource_ibm_pi_dhcp.go b/ibm/resource_ibm_pi_dhcp.go index 8e1c691b98..18088b271c 100644 --- a/ibm/resource_ibm_pi_dhcp.go +++ b/ibm/resource_ibm_pi_dhcp.go @@ -99,18 +99,18 @@ func resourceIBMPIDhcpCreate(ctx context.Context, d *schema.ResourceData, meta i cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) - client := st.NewIBMPIDhcpClient(sess, cloudInstanceID) - dhcpServer, err := client.CreateWithContext(ctx, cloudInstanceID) + client := st.NewIBMPIDhcpClient(ctx, sess, cloudInstanceID) + dhcpServer, err := client.Create() if err != nil { log.Printf("[DEBUG] create DHCP failed %v", err) - return diag.Errorf(errors.CreateDchpOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *dhcpServer.ID)) - _, err = waitForIBMPIDhcpStatus(ctx, client, *dhcpServer.ID, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) + _, err = waitForIBMPIDhcpStatus(ctx, client, *dhcpServer.ID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return diag.Errorf(errors.CreateDchpOperationFailed, cloudInstanceID, err) + diag.FromErr(err) } return resourceIBMPIDhcpRead(ctx, d, meta) @@ -122,25 +122,23 @@ func resourceIBMPIDhcpRead(ctx context.Context, d *schema.ResourceData, meta int return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, dhcpID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - dhcpID := parts[1] - - client := st.NewIBMPIDhcpClient(sess, cloudInstanceID) - dhcpServer, err := client.GetWithContext(ctx, dhcpID, cloudInstanceID) + client := st.NewIBMPIDhcpClient(ctx, sess, cloudInstanceID) + dhcpServer, err := client.Get(dhcpID) if err != nil { - switch err.(type) { + uErr := errors.Unwrap(err) + switch uErr.(type) { case *p_cloud_service_d_h_c_p.PcloudDhcpGetNotFound: log.Printf("[DEBUG] dhcp does not exist %v", err) d.SetId("") return nil } log.Printf("[DEBUG] get DHCP failed %v", err) - return diag.Errorf(errors.GetDhcpOperationFailed, dhcpID, err) + return diag.FromErr(err) } d.Set(PIDhcpId, *dhcpServer.ID) @@ -168,27 +166,25 @@ func resourceIBMPIDhcpDelete(ctx context.Context, d *schema.ResourceData, meta i return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, dhcpID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - dhcpID := parts[1] - - client := st.NewIBMPIDhcpClient(sess, cloudInstanceID) - _, err = client.DeleteWithContext(ctx, dhcpID, cloudInstanceID) + client := st.NewIBMPIDhcpClient(ctx, sess, cloudInstanceID) + err = client.Delete(dhcpID) if err != nil { - switch err.(type) { + uErr := errors.Unwrap(err) + switch uErr.(type) { case *p_cloud_service_d_h_c_p.PcloudDhcpDeleteNotFound: log.Printf("[DEBUG] dhcp does not exist %v", err) d.SetId("") return nil } log.Printf("[DEBUG] delete DHCP failed %v", err) - return diag.Errorf(errors.DeleteDhcpOperationFailed, dhcpID, err) + return diag.FromErr(err) } - _, err = waitForIBMPIDhcpDeleted(ctx, client, dhcpID, cloudInstanceID, d.Timeout(schema.TimeoutDelete)) + _, err = waitForIBMPIDhcpDeleted(ctx, client, dhcpID, d.Timeout(schema.TimeoutDelete)) if err != nil { return diag.FromErr(err) } @@ -197,15 +193,15 @@ func resourceIBMPIDhcpDelete(ctx context.Context, d *schema.ResourceData, meta i return nil } -func waitForIBMPIDhcpStatus(ctx context.Context, client *st.IBMPIDhcpClient, dhcpID, cloudInstanceID string, timeout time.Duration) (interface{}, error) { +func waitForIBMPIDhcpStatus(ctx context.Context, client *st.IBMPIDhcpClient, dhcpID string, timeout time.Duration) (interface{}, error) { stateConf := &resource.StateChangeConf{ Pending: []string{PIDhcpStatusBuilding}, Target: []string{PIDhcpStatusActive}, Refresh: func() (interface{}, string, error) { - dhcpServer, err := client.GetWithContext(ctx, dhcpID, cloudInstanceID) + dhcpServer, err := client.Get(dhcpID) if err != nil { log.Printf("[DEBUG] get DHCP failed %v", err) - return nil, "", fmt.Errorf(errors.GetDhcpOperationFailed, dhcpID, err) + return nil, "", err } if *dhcpServer.Status != PIDhcpStatusActive { return dhcpServer, PIDhcpStatusBuilding, nil @@ -219,12 +215,12 @@ func waitForIBMPIDhcpStatus(ctx context.Context, client *st.IBMPIDhcpClient, dhc return stateConf.WaitForStateContext(ctx) } -func waitForIBMPIDhcpDeleted(ctx context.Context, client *st.IBMPIDhcpClient, dhcpID, cloudInstanceID string, timeout time.Duration) (interface{}, error) { +func waitForIBMPIDhcpDeleted(ctx context.Context, client *st.IBMPIDhcpClient, dhcpID string, timeout time.Duration) (interface{}, error) { stateConf := &resource.StateChangeConf{ Pending: []string{PIDhcpDeleting}, Target: []string{PIDhcpDeleted}, Refresh: func() (interface{}, string, error) { - dhcpServer, err := client.GetWithContext(ctx, dhcpID, cloudInstanceID) + dhcpServer, err := client.Get(dhcpID) if err != nil { log.Printf("[DEBUG] dhcp does not exist %v", err) return dhcpServer, PIDhcpDeleted, nil diff --git a/ibm/resource_ibm_pi_dhcp_test.go b/ibm/resource_ibm_pi_dhcp_test.go index cc31a8de2b..3ea298e81c 100644 --- a/ibm/resource_ibm_pi_dhcp_test.go +++ b/ibm/resource_ibm_pi_dhcp_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -41,14 +42,14 @@ func testAccCheckIBMPIDhcpDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_dhcp" { continue } - parts, err := idParts(rs.Primary.ID) + + cloudInstanceID, dhcpID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudConnectionID := parts[0] - dhcpID := parts[1] - client := st.NewIBMPIDhcpClient(sess, cloudConnectionID) - _, err = client.Get(dhcpID, cloudConnectionID) + + client := st.NewIBMPIDhcpClient(context.Background(), sess, cloudInstanceID) + _, err = client.Get(dhcpID) if err == nil { return fmt.Errorf("PI DHCP still exists: %s", rs.Primary.ID) } @@ -70,15 +71,14 @@ func testAccCheckIBMPIDhcpExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + + cloudInstanceID, dhcpID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudConnectionID := parts[0] - dhcpID := parts[1] - client := st.NewIBMPIDhcpClient(sess, cloudConnectionID) + client := st.NewIBMPIDhcpClient(context.Background(), sess, cloudInstanceID) - _, err = client.Get(dhcpID, cloudConnectionID) + _, err = client.Get(dhcpID) if err != nil { return err } diff --git a/ibm/resource_ibm_pi_ike_policy.go b/ibm/resource_ibm_pi_ike_policy.go index 7551da3979..a4b3b814d4 100644 --- a/ibm/resource_ibm_pi_ike_policy.go +++ b/ibm/resource_ibm_pi_ike_policy.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" st "github.com/IBM-Cloud/power-go-client/clients/instance" - "github.com/IBM-Cloud/power-go-client/errors" "github.com/IBM-Cloud/power-go-client/helpers" "github.com/IBM-Cloud/power-go-client/power/models" ) @@ -124,11 +123,11 @@ func resourceIBMPIIKEPolicyCreate(ctx context.Context, d *schema.ResourceData, m body.Authentication = models.IKEPolicyAuthentication(v.(string)) } - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) - ikePolicy, err := client.CreateIKEPolicyWithContext(ctx, body, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) + ikePolicy, err := client.CreateIKEPolicy(body) if err != nil { log.Printf("[DEBUG] create ike policy failed %v", err) - return diag.Errorf(errors.CreateVPNPolicyOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *ikePolicy.ID)) @@ -142,15 +141,12 @@ func resourceIBMPIIKEPolicyUpdate(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, policyID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - policyID := parts[1] - - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) body := &models.IKEPolicyUpdate{} if d.HasChange(helpers.PIVPNPolicyName) { @@ -182,9 +178,9 @@ func resourceIBMPIIKEPolicyUpdate(ctx context.Context, d *schema.ResourceData, m body.Authentication = models.IKEPolicyAuthentication(authentication) } - _, err = client.UpdateIKEPolicyWithContext(ctx, body, policyID, cloudInstanceID) + _, err = client.UpdateIKEPolicy(policyID, body) if err != nil { - return diag.Errorf(errors.UpdateVPNPolicyOperationFailed, policyID, err) + return diag.FromErr(err) } return resourceIBMPIIKEPolicyRead(ctx, d, meta) @@ -196,16 +192,13 @@ func resourceIBMPIIKEPolicyRead(ctx context.Context, d *schema.ResourceData, met return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, policyID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - policyID := parts[1] - - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) - ikePolicy, err := client.GetIKEPolicyWithContext(ctx, policyID, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) + ikePolicy, err := client.GetIKEPolicy(policyID) if err != nil { // FIXME: Uncomment when 404 error is available // switch err.(type) { @@ -215,7 +208,7 @@ func resourceIBMPIIKEPolicyRead(ctx context.Context, d *schema.ResourceData, met // return nil // } log.Printf("[DEBUG] get VPN policy failed %v", err) - return diag.Errorf(errors.GetCloudConnectionOperationFailed, policyID, err) + return diag.FromErr(err) } d.Set(PIPolicyId, ikePolicy.ID) @@ -235,17 +228,14 @@ func resourceIBMPIIKEPolicyDelete(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, policyID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - policyID := parts[1] - - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) - err = client.DeleteIKEPolicyWithContext(ctx, policyID, cloudInstanceID) + err = client.DeleteIKEPolicy(policyID) if err != nil { // FIXME: Uncomment when 404 error is available // switch err.(type) { @@ -255,7 +245,7 @@ func resourceIBMPIIKEPolicyDelete(ctx context.Context, d *schema.ResourceData, m // return nil // } log.Printf("[DEBUG] delete VPN policy failed %v", err) - return diag.Errorf(errors.DeleteVPNPolicyOperationFailed, policyID, err) + return diag.FromErr(err) } d.SetId("") diff --git a/ibm/resource_ibm_pi_ike_policy_test.go b/ibm/resource_ibm_pi_ike_policy_test.go index 2af80ad956..9a5779b9a1 100644 --- a/ibm/resource_ibm_pi_ike_policy_test.go +++ b/ibm/resource_ibm_pi_ike_policy_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -53,14 +54,12 @@ func testAccCheckIBMPIIKEPolicyDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_ike_policy" { continue } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, policyID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - policyID := parts[1] - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) - _, err = client.GetIKEPolicy(policyID, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(context.Background(), sess, cloudInstanceID) + _, err = client.GetIKEPolicy(policyID) if err == nil { return fmt.Errorf("ike policy still exists: %s", rs.Primary.ID) } @@ -81,15 +80,13 @@ func testAccCheckIBMPIIKEPolicyExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, policyID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - policyID := parts[1] - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(context.Background(), sess, cloudInstanceID) - _, err = client.GetIKEPolicy(policyID, cloudInstanceID) + _, err = client.GetIKEPolicy(policyID) if err != nil { return err } diff --git a/ibm/resource_ibm_pi_image.go b/ibm/resource_ibm_pi_image.go index 1c88a1c763..c554e9a18a 100644 --- a/ibm/resource_ibm_pi_image.go +++ b/ibm/resource_ibm_pi_image.go @@ -134,11 +134,17 @@ func resourceIBMPIImageCreate(ctx context.Context, d *schema.ResourceData, meta cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) imageName := d.Get(helpers.PIImageName).(string) - client := st.NewIBMPIImageClient(sess, cloudInstanceID) + client := st.NewIBMPIImageClient(ctx, sess, cloudInstanceID) // image copy if v, ok := d.GetOk(helpers.PIImageId); ok { imageid := v.(string) - imageResponse, err := client.Create(imageName, imageid, cloudInstanceID) + source := "root-project" + var body = &models.CreateImage{ + ImageName: imageName, + ImageID: imageid, + Source: &source, + } + imageResponse, err := client.Create(body) if err != nil { return diag.FromErr(err) } @@ -146,7 +152,7 @@ func resourceIBMPIImageCreate(ctx context.Context, d *schema.ResourceData, meta IBMPIImageID := imageResponse.ImageID d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *IBMPIImageID)) - _, err = isWaitForIBMPIImageAvailable(ctx, client, *IBMPIImageID, d.Timeout(schema.TimeoutCreate), cloudInstanceID) + _, err = isWaitForIBMPIImageAvailable(ctx, client, *IBMPIImageID, d.Timeout(schema.TimeoutCreate)) if err != nil { log.Printf("[DEBUG] err %s", err) return diag.FromErr(err) @@ -177,19 +183,19 @@ func resourceIBMPIImageCreate(ctx context.Context, d *schema.ResourceData, meta body.SecretKey = v.(string) } - imageResponse, err := client.CreateCosImageWithContext(ctx, body, cloudInstanceID) + imageResponse, err := client.CreateCosImage(body) if err != nil { return diag.FromErr(err) } - jobClient := st.NewIBMPIJobClient(sess, cloudInstanceID) - _, err = waitForIBMPIJobCompleted(ctx, jobClient, *imageResponse.ID, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) + jobClient := st.NewIBMPIJobClient(ctx, sess, cloudInstanceID) + _, err = waitForIBMPIJobCompleted(ctx, jobClient, *imageResponse.ID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return diag.Errorf(errors.CreateImageOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } // Once the job is completed find by name - image, err := client.GetWithContext(ctx, imageName, cloudInstanceID) + image, err := client.Get(imageName) if err != nil { return diag.FromErr(err) } @@ -205,25 +211,23 @@ func resourceIBMPIImageRead(ctx context.Context, d *schema.ResourceData, meta in return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, imageID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - imageID := parts[1] - - imageC := st.NewIBMPIImageClient(sess, cloudInstanceID) - imagedata, err := imageC.GetWithContext(ctx, imageID, cloudInstanceID) + imageC := st.NewIBMPIImageClient(ctx, sess, cloudInstanceID) + imagedata, err := imageC.Get(imageID) if err != nil { - switch err.(type) { + uErr := errors.Unwrap(err) + switch uErr.(type) { case *p_cloud_images.PcloudCloudinstancesImagesGetNotFound: log.Printf("[DEBUG] image does not exist %v", err) d.SetId("") return nil } log.Printf("[DEBUG] get image failed %v", err) - return diag.Errorf(errors.GetImageOperationFailed, imageID, err) + return diag.FromErr(err) } imageid := *imagedata.ImageID @@ -243,30 +247,28 @@ func resourceIBMPIImageDelete(ctx context.Context, d *schema.ResourceData, meta return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, imageID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - imageID := parts[1] - imageC := st.NewIBMPIImageClient(sess, cloudInstanceID) - _, err = imageC.DeleteWithContext(ctx, imageID, cloudInstanceID) + imageC := st.NewIBMPIImageClient(ctx, sess, cloudInstanceID) + err = imageC.Delete(imageID) if err != nil { - return diag.Errorf("Failed to Delete PI Image %s :%v", imageID, err) + return diag.FromErr(err) } d.SetId("") return nil } -func isWaitForIBMPIImageAvailable(ctx context.Context, client *st.IBMPIImageClient, id string, timeout time.Duration, powerinstanceid string) (interface{}, error) { +func isWaitForIBMPIImageAvailable(ctx context.Context, client *st.IBMPIImageClient, id string, timeout time.Duration) (interface{}, error) { log.Printf("Waiting for Power Image (%s) to be available.", id) stateConf := &resource.StateChangeConf{ Pending: []string{"retry", helpers.PIImageQueStatus}, Target: []string{helpers.PIImageActiveStatus}, - Refresh: isIBMPIImageRefreshFunc(ctx, client, id, powerinstanceid), + Refresh: isIBMPIImageRefreshFunc(ctx, client, id), Timeout: timeout, Delay: 20 * time.Second, MinTimeout: 10 * time.Second, @@ -275,11 +277,11 @@ func isWaitForIBMPIImageAvailable(ctx context.Context, client *st.IBMPIImageClie return stateConf.WaitForStateContext(ctx) } -func isIBMPIImageRefreshFunc(ctx context.Context, client *st.IBMPIImageClient, id, powerinstanceid string) resource.StateRefreshFunc { +func isIBMPIImageRefreshFunc(ctx context.Context, client *st.IBMPIImageClient, id string) resource.StateRefreshFunc { log.Printf("Calling the isIBMPIImageRefreshFunc Refresh Function....") return func() (interface{}, string, error) { - image, err := client.GetWithContext(ctx, id, powerinstanceid) + image, err := client.Get(id) if err != nil { return nil, "", err } @@ -292,12 +294,12 @@ func isIBMPIImageRefreshFunc(ctx context.Context, client *st.IBMPIImageClient, i } } -func waitForIBMPIJobCompleted(ctx context.Context, client *st.IBMPIJobClient, jobID, cloudInstanceID string, timeout time.Duration) (interface{}, error) { +func waitForIBMPIJobCompleted(ctx context.Context, client *st.IBMPIJobClient, jobID string, timeout time.Duration) (interface{}, error) { stateConf := &resource.StateChangeConf{ Pending: []string{helpers.JobStatusQueued, helpers.JobStatusReadyForProcessing, helpers.JobStatusInProgress, helpers.JobStatusRunning, helpers.JobStatusWaiting}, Target: []string{helpers.JobStatusCompleted, helpers.JobStatusFailed}, Refresh: func() (interface{}, string, error) { - job, err := client.GetWithContext(ctx, jobID, cloudInstanceID) + job, err := client.Get(jobID) if err != nil { log.Printf("[DEBUG] get job failed %v", err) return nil, "", fmt.Errorf(errors.GetJobOperationFailed, jobID, err) diff --git a/ibm/resource_ibm_pi_image_test.go b/ibm/resource_ibm_pi_image_test.go index 6333da5a93..c08522d781 100644 --- a/ibm/resource_ibm_pi_image_test.go +++ b/ibm/resource_ibm_pi_image_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -36,7 +37,6 @@ func TestAccIBMPIImagebasic(t *testing.T) { } func testAccCheckIBMPIImageDestroy(s *terraform.State) error { - sess, err := testAccProvider.Meta().(ClientSession).IBMPISession() if err != nil { return err @@ -45,13 +45,12 @@ func testAccCheckIBMPIImageDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_image" { continue } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, imageID, err := splitID(rs.Primary.ID) if err != nil { return err } - powerinstanceid := parts[0] - imageC := st.NewIBMPIImageClient(sess, powerinstanceid) - _, err = imageC.Get(parts[1], powerinstanceid) + imageC := st.NewIBMPIImageClient(context.Background(), sess, cloudInstanceID) + _, err = imageC.Get(imageID) if err == nil { return fmt.Errorf("PI Image still exists: %s", rs.Primary.ID) } @@ -76,20 +75,18 @@ func testAccCheckIBMPIImageExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, imageID, err := splitID(rs.Primary.ID) if err != nil { return err } - powerinstanceid := parts[0] - client := st.NewIBMPIImageClient(sess, powerinstanceid) + client := st.NewIBMPIImageClient(context.Background(), sess, cloudInstanceID) - _, err = client.Get(parts[1], powerinstanceid) + _, err = client.Get(imageID) if err != nil { return err } return nil - } } @@ -97,7 +94,7 @@ func testAccCheckIBMPIImageConfig(name string) string { return fmt.Sprintf(` resource "ibm_pi_image" "power_image" { pi_image_name = "%s" - pi_image_id = "cfc02954-8f6f-4e6b-96ae-40b24c90bd54" + pi_image_id = "IBMi-74-01-001" pi_cloud_instance_id = "%s" } `, name, pi_cloud_instance_id) diff --git a/ibm/resource_ibm_pi_instance.go b/ibm/resource_ibm_pi_instance.go index 50459da0ae..ec46f8dc8a 100644 --- a/ibm/resource_ibm_pi_instance.go +++ b/ibm/resource_ibm_pi_instance.go @@ -20,11 +20,6 @@ import ( ) const ( - createTimeOut = 120 * time.Second - updateTimeOut = 120 * time.Second - postTimeOut = 60 * time.Second - getTimeOut = 60 * time.Second - deleteTimeOut = 60 * time.Second //Added timeout values for warning and active status warningTimeOut = 60 * time.Second activeTimeOut = 2 * time.Minute @@ -346,13 +341,13 @@ func resourceIBMPIInstanceCreate(ctx context.Context, d *schema.ResourceData, me cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) client := st.NewIBMPIInstanceClient(ctx, sess, cloudInstanceID) sapClient := st.NewIBMPISAPInstanceClient(ctx, sess, cloudInstanceID) - imageClient := st.NewIBMPIImageClient(sess, cloudInstanceID) + imageClient := st.NewIBMPIImageClient(ctx, sess, cloudInstanceID) var pvmList *models.PVMInstanceList if _, ok := d.GetOk(PISAPInstanceProfileID); ok { - pvmList, err = createSAPInstance(d, meta, sapClient) + pvmList, err = createSAPInstance(d, sapClient) } else { - pvmList, err = createPVMInstance(d, meta, client, imageClient) + pvmList, err = createPVMInstance(d, client, imageClient) } if err != nil { return diag.FromErr(err) @@ -450,13 +445,9 @@ func resourceIBMPIInstanceRead(ctx context.Context, d *schema.ResourceData, meta if powervmdata.Health != nil { d.Set("health_status", powervmdata.Health.Status) } - if powervmdata.VirtualCores.Assigned != nil { + if powervmdata.VirtualCores != nil { d.Set(helpers.PIVirtualCoresAssigned, powervmdata.VirtualCores.Assigned) - } - if &powervmdata.VirtualCores.Max != nil { d.Set("max_virtual_cores", powervmdata.VirtualCores.Max) - } - if &powervmdata.VirtualCores.Min != nil { d.Set("min_virtual_cores", powervmdata.VirtualCores.Min) } d.Set(helpers.PIInstanceLicenseRepositoryCapacity, powervmdata.LicenseRepositoryCapacity) @@ -489,7 +480,7 @@ func resourceIBMPIInstanceUpdate(ctx context.Context, d *schema.ResourceData, me client := st.NewIBMPIInstanceClient(ctx, sess, cloudInstanceID) // Check if cloud instance is capable of changing virtual cores - cloudInstanceClient := st.NewIBMPICloudInstanceClient(sess, cloudInstanceID) + cloudInstanceClient := st.NewIBMPICloudInstanceClient(ctx, sess, cloudInstanceID) cloudInstance, err := cloudInstanceClient.Get(cloudInstanceID) if err != nil { return diag.FromErr(err) @@ -929,7 +920,7 @@ func checkCloudInstanceCapability(cloudInstance *models.CloudInstance, custom_ca } return false } -func createSAPInstance(d *schema.ResourceData, meta interface{}, sapClient *st.IBMPISAPInstanceClient) (*models.PVMInstanceList, error) { +func createSAPInstance(d *schema.ResourceData, sapClient *st.IBMPISAPInstanceClient) (*models.PVMInstanceList, error) { name := d.Get(helpers.PIInstanceName).(string) profileID := d.Get(PISAPInstanceProfileID).(string) @@ -1035,7 +1026,7 @@ func createSAPInstance(d *schema.ResourceData, meta interface{}, sapClient *st.I return pvmList, nil } -func createPVMInstance(d *schema.ResourceData, meta interface{}, client *st.IBMPIInstanceClient, imageClient *st.IBMPIImageClient) (*models.PVMInstanceList, error) { +func createPVMInstance(d *schema.ResourceData, client *st.IBMPIInstanceClient, imageClient *st.IBMPIImageClient) (*models.PVMInstanceList, error) { name := d.Get(helpers.PIInstanceName).(string) imageid := d.Get(helpers.PIInstanceImageId).(string) @@ -1177,13 +1168,12 @@ func createPVMInstance(d *schema.ResourceData, meta interface{}, client *st.IBMP } if lrc, ok := d.GetOk(helpers.PIInstanceLicenseRepositoryCapacity); ok { - cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) // check if using vtl image // check if vtl image is stock image - imageData, err := imageClient.GetStockImage(imageid, cloudInstanceID) + imageData, err := imageClient.GetStockImage(imageid) if err != nil { // check if vtl image is cloud instance image - imageData, err = imageClient.Get(imageid, cloudInstanceID) + imageData, err = imageClient.Get(imageid) if err != nil { return nil, fmt.Errorf("image doesn't exist. %e", err) } diff --git a/ibm/resource_ibm_pi_instance_test.go b/ibm/resource_ibm_pi_instance_test.go index be5568976b..9648dda6a0 100644 --- a/ibm/resource_ibm_pi_instance_test.go +++ b/ibm/resource_ibm_pi_instance_test.go @@ -49,6 +49,7 @@ func testAccCheckIBMPIInstanceConfig(name string) string { pi_cloud_instance_id = "%[1]s" pi_storage_pool = data.ibm_pi_image.power_image.storage_pool pi_health_status = "WARNING" + pi_volume_ids = [ibm_pi_volume.power_volume.volume_id] pi_network { network_id = data.ibm_pi_network.power_networks.id } diff --git a/ibm/resource_ibm_pi_ipsec_policy.go b/ibm/resource_ibm_pi_ipsec_policy.go index 179852aecf..9907a54221 100644 --- a/ibm/resource_ibm_pi_ipsec_policy.go +++ b/ibm/resource_ibm_pi_ipsec_policy.go @@ -13,7 +13,6 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" st "github.com/IBM-Cloud/power-go-client/clients/instance" - "github.com/IBM-Cloud/power-go-client/errors" "github.com/IBM-Cloud/power-go-client/helpers" "github.com/IBM-Cloud/power-go-client/power/models" ) @@ -112,11 +111,11 @@ func resourceIBMPIIPSecPolicyCreate(ctx context.Context, d *schema.ResourceData, body.Authentication = models.IPSECPolicyAuthentication(v.(string)) } - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) - ipsecPolicy, err := client.CreateIPSecPolicyWithContext(ctx, body, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) + ipsecPolicy, err := client.CreateIPSecPolicy(body) if err != nil { log.Printf("[DEBUG] create ipsec policy failed %v", err) - return diag.Errorf(errors.CreateVPNPolicyOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *ipsecPolicy.ID)) @@ -130,15 +129,12 @@ func resourceIBMPIIPSecPolicyUpdate(ctx context.Context, d *schema.ResourceData, return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, policyID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - policyID := parts[1] - - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) body := &models.IPSecPolicyUpdate{} if d.HasChange(helpers.PIVPNPolicyName) { @@ -166,9 +162,9 @@ func resourceIBMPIIPSecPolicyUpdate(ctx context.Context, d *schema.ResourceData, body.Authentication = models.IPSECPolicyAuthentication(authentication) } - _, err = client.UpdateIPSecPolicyWithContext(ctx, body, policyID, cloudInstanceID) + _, err = client.UpdateIPSecPolicy(policyID, body) if err != nil { - return diag.Errorf(errors.UpdateVPNPolicyOperationFailed, policyID, err) + return diag.FromErr(err) } return resourceIBMPIIPSecPolicyRead(ctx, d, meta) @@ -180,16 +176,13 @@ func resourceIBMPIIPSecPolicyRead(ctx context.Context, d *schema.ResourceData, m return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, policyID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - policyID := parts[1] - - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) - ipsecPolicy, err := client.GetIPSecPolicyWithContext(ctx, policyID, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) + ipsecPolicy, err := client.GetIPSecPolicy(policyID) if err != nil { // FIXME: Uncomment when 404 error is available // switch err.(type) { @@ -199,7 +192,7 @@ func resourceIBMPIIPSecPolicyRead(ctx context.Context, d *schema.ResourceData, m // return nil // } log.Printf("[DEBUG] get VPN policy failed %v", err) - return diag.Errorf(errors.GetCloudConnectionOperationFailed, policyID, err) + return diag.FromErr(err) } d.Set(PIPolicyId, ipsecPolicy.ID) @@ -219,17 +212,14 @@ func resourceIBMPIIPSecPolicyDelete(ctx context.Context, d *schema.ResourceData, return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, policyID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - policyID := parts[1] - - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(ctx, sess, cloudInstanceID) - err = client.DeleteIPSecPolicyWithContext(ctx, policyID, cloudInstanceID) + err = client.DeleteIPSecPolicy(policyID) if err != nil { // FIXME: Uncomment when 404 error is available // switch err.(type) { @@ -239,7 +229,7 @@ func resourceIBMPIIPSecPolicyDelete(ctx context.Context, d *schema.ResourceData, // return nil // } log.Printf("[DEBUG] delete VPN policy failed %v", err) - return diag.Errorf(errors.DeleteVPNPolicyOperationFailed, policyID, err) + return diag.FromErr(err) } d.SetId("") diff --git a/ibm/resource_ibm_pi_ipsec_policy_test.go b/ibm/resource_ibm_pi_ipsec_policy_test.go index 9fe810c58a..a982273c2a 100644 --- a/ibm/resource_ibm_pi_ipsec_policy_test.go +++ b/ibm/resource_ibm_pi_ipsec_policy_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -44,14 +45,12 @@ func testAccCheckIBMPIIPSecPolicyDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_ipsec_policy" { continue } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, policyID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - policyID := parts[1] - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) - _, err = client.GetIPSecPolicy(policyID, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(context.Background(), sess, cloudInstanceID) + _, err = client.GetIPSecPolicy(policyID) if err == nil { return fmt.Errorf("ipsec policy still exists: %s", rs.Primary.ID) } @@ -72,15 +71,13 @@ func testAccCheckIBMPIIPSecPolicyExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, policyID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - policyID := parts[1] - client := st.NewIBMPIVpnPolicyClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnPolicyClient(context.Background(), sess, cloudInstanceID) - _, err = client.GetIPSecPolicy(policyID, cloudInstanceID) + _, err = client.GetIPSecPolicy(policyID) if err != nil { return err } diff --git a/ibm/resource_ibm_pi_key.go b/ibm/resource_ibm_pi_key.go index 8ba7a46fd1..32cc5c3b7b 100644 --- a/ibm/resource_ibm_pi_key.go +++ b/ibm/resource_ibm_pi_key.go @@ -4,25 +4,26 @@ package ibm import ( + "context" "fmt" "log" "time" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/IBM-Cloud/bluemix-go/bmxerror" st "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" + "github.com/IBM-Cloud/power-go-client/power/models" ) func resourceIBMPIKey() *schema.Resource { return &schema.Resource{ - Create: resourceIBMPIKeyCreate, - Read: resourceIBMPIKeyRead, - Update: resourceIBMPIKeyUpdate, - Delete: resourceIBMPIKeyDelete, - Exists: resourceIBMPIKeyExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMPIKeyCreate, + ReadContext: resourceIBMPIKeyRead, + UpdateContext: resourceIBMPIKeyUpdate, + DeleteContext: resourceIBMPIKeyDelete, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), @@ -63,112 +64,77 @@ func resourceIBMPIKey() *schema.Resource { } } -func resourceIBMPIKeyCreate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPIKeyCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) name := d.Get(helpers.PIKeyName).(string) sshkey := d.Get(helpers.PIKey).(string) - client := st.NewIBMPIKeyClient(sess, powerinstanceid) - sshResponse, _, err := client.Create(name, sshkey, powerinstanceid) + client := st.NewIBMPIKeyClient(ctx, sess, cloudInstanceID) + body := &models.SSHKey{ + Name: &name, + SSHKey: &sshkey, + } + sshResponse, err := client.Create(body) if err != nil { log.Printf("[DEBUG] err %s", err) - return fmt.Errorf("Failed to create the key %v", err) - + return diag.FromErr(err) } - log.Printf("Printing the sshkey %+v", &sshResponse) + log.Printf("Printing the sshkey %+v", *sshResponse) - d.SetId(fmt.Sprintf("%s/%s", powerinstanceid, name)) - return resourceIBMPIKeyRead(d, meta) + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, name)) + return resourceIBMPIKeyRead(ctx, d, meta) } -func resourceIBMPIKeyRead(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPIKeyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - parts, err := idParts(d.Id()) + + cloudInstanceID, key, err := splitID(d.Id()) if err != nil { - return fmt.Errorf("Failed to obtain the key %v", err) + return diag.FromErr(err) } - powerinstanceid := parts[0] - sshkeyC := st.NewIBMPIKeyClient(sess, powerinstanceid) - sshkeydata, err := sshkeyC.Get(parts[1], powerinstanceid) - + sshkeyC := st.NewIBMPIKeyClient(ctx, sess, cloudInstanceID) + sshkeydata, err := sshkeyC.Get(key) if err != nil { - return err + return diag.FromErr(err) } d.Set(helpers.PIKeyName, sshkeydata.Name) d.Set(helpers.PIKey, sshkeydata.SSHKey) d.Set(helpers.PIKeyDate, sshkeydata.CreationDate.String()) d.Set("key_id", sshkeydata.Name) - d.Set(helpers.PICloudInstanceId, powerinstanceid) return nil } - -func resourceIBMPIKeyUpdate(data *schema.ResourceData, meta interface{}) error { - return nil +func resourceIBMPIKeyUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + return resourceIBMPIKeyRead(ctx, d, meta) } - -func resourceIBMPIKeyDelete(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPIKeyDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, key, err := splitID(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - sshkeyC := st.NewIBMPIKeyClient(sess, powerinstanceid) - err = sshkeyC.Delete(parts[1], powerinstanceid) - + sshkeyC := st.NewIBMPIKeyClient(ctx, sess, cloudInstanceID) + err = sshkeyC.Delete(key) if err != nil { - return err + return diag.FromErr(err) } d.SetId("") return nil } - -func resourceIBMPIKeyExists(d *schema.ResourceData, meta interface{}) (bool, error) { - - sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return false, err - } - parts, err := idParts(d.Id()) - if err != nil { - return false, err - } - if len(parts) < 2 { - return false, fmt.Errorf("Incorrect ID %s: Id should be a combination of powerInstanceID/keyName", d.Id()) - } - name := parts[1] - powerinstanceid := parts[0] - client := st.NewIBMPIKeyClient(sess, powerinstanceid) - - key, err := client.Get(parts[1], powerinstanceid) - if err != nil || key == nil { - if apiErr, ok := err.(bmxerror.RequestFailure); ok { - if apiErr.StatusCode() == 404 { - return false, nil - } - } - return false, fmt.Errorf("[ERROR] Error getting pi key: %s", err) - } - if key.Name != nil { - return *key.Name == name, nil - } - return false, nil -} diff --git a/ibm/resource_ibm_pi_key_test.go b/ibm/resource_ibm_pi_key_test.go index 3e3fd61290..1b0ddbb735 100644 --- a/ibm/resource_ibm_pi_key_test.go +++ b/ibm/resource_ibm_pi_key_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "strings" @@ -47,10 +48,12 @@ func testAccCheckIBMPIKeyDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_key" { continue } - parts, err := idParts(rs.Primary.ID) - powerinstanceid := parts[0] - sshkeyC := st.NewIBMPIKeyClient(sess, powerinstanceid) - _, err = sshkeyC.Get(parts[1], powerinstanceid) + cloudInstanceID, key, err := splitID(rs.Primary.ID) + if err != nil { + return err + } + sshkeyC := st.NewIBMPIKeyClient(context.Background(), sess, cloudInstanceID) + _, err = sshkeyC.Get(key) if err == nil { return fmt.Errorf("PI key still exists: %s", rs.Primary.ID) } @@ -75,18 +78,17 @@ func testAccCheckIBMPIKeyExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + + cloudInstanceID, key, err := splitID(rs.Primary.ID) if err != nil { return err } - powerinstanceid := parts[0] - client := st.NewIBMPIKeyClient(sess, powerinstanceid) - key, err := client.Get(parts[1], powerinstanceid) + client := st.NewIBMPIKeyClient(context.Background(), sess, cloudInstanceID) + _, err = client.Get(key) if err != nil { return err } - parts[1] = *key.Name return nil } diff --git a/ibm/resource_ibm_pi_network.go b/ibm/resource_ibm_pi_network.go index 481d6c59d6..212398eef9 100644 --- a/ibm/resource_ibm_pi_network.go +++ b/ibm/resource_ibm_pi_network.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "fmt" "log" "net" @@ -11,21 +12,22 @@ import ( "time" "github.com/apparentlymart/go-cidr/cidr" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" st "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" + "github.com/IBM-Cloud/power-go-client/power/models" ) func resourceIBMPINetwork() *schema.Resource { return &schema.Resource{ - Create: resourceIBMPINetworkCreate, - Read: resourceIBMPINetworkRead, - Update: resourceIBMPINetworkUpdate, - Delete: resourceIBMPINetworkDelete, - //Exists: resourceIBMPINetworkExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMPINetworkCreate, + ReadContext: resourceIBMPINetworkRead, + UpdateContext: resourceIBMPINetworkUpdate, + DeleteContext: resourceIBMPINetworkDelete, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), @@ -33,14 +35,12 @@ func resourceIBMPINetwork() *schema.Resource { }, Schema: map[string]*schema.Schema{ - helpers.PINetworkType: { Type: schema.TypeString, Required: true, ValidateFunc: validateAllowedStringValue([]string{"vlan", "pub-vlan"}), Description: "PI network type", }, - helpers.PINetworkName: { Type: schema.TypeString, Required: true, @@ -52,27 +52,23 @@ func resourceIBMPINetwork() *schema.Resource { Elem: &schema.Schema{Type: schema.TypeString}, Description: "List of PI network DNS name", }, - helpers.PINetworkCidr: { Type: schema.TypeString, Optional: true, Computed: true, Description: "PI network CIDR", }, - helpers.PINetworkGateway: { Type: schema.TypeString, Optional: true, Description: "PI network gateway", }, - helpers.PINetworkJumbo: { Type: schema.TypeBool, Optional: true, Computed: true, Description: "PI network enable MTU Jumbo option", }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, @@ -80,7 +76,6 @@ func resourceIBMPINetwork() *schema.Resource { }, //Computed Attributes - "network_id": { Type: schema.TypeString, Computed: true, @@ -95,60 +90,79 @@ func resourceIBMPINetwork() *schema.Resource { } } -func resourceIBMPINetworkCreate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) networkname := d.Get(helpers.PINetworkName).(string) networktype := d.Get(helpers.PINetworkType).(string) - networkcidr := d.Get(helpers.PINetworkCidr).(string) networkdns := expandStringList((d.Get(helpers.PINetworkDNS).(*schema.Set)).List()) - jumbo := d.Get(helpers.PINetworkJumbo).(bool) - client := st.NewIBMPINetworkClient(sess, powerinstanceid) - var networkgateway, firstip, lastip string + client := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + var body = &models.NetworkCreate{ + Type: &networktype, + Name: networkname, + } + if v, ok := d.GetOk(helpers.PINetworkJumbo); ok { + body.Jumbo = v.(bool) + } + if len(networkdns) > 0 { + body.DNSServers = networkdns + } + if networktype == "vlan" { - networkgateway, firstip, lastip, err = generateIPData(networkcidr) + var networkcidr string + if v, ok := d.GetOk(helpers.PINetworkCidr); ok { + networkcidr = v.(string) + } else { + diag.Errorf("%s is required when %s is vlan", helpers.PINetworkCidr, helpers.PINetworkType) + } + + gateway, firstip, lastip, err := generateIPData(networkcidr) if err != nil { - return err + return diag.FromErr(err) } + + var ipbody = []*models.IPAddressRange{{EndingIPAddress: &lastip, StartingIPAddress: &firstip}} + body.IPAddressRanges = ipbody + body.Gateway = gateway + body.Cidr = networkcidr } - networkResponse, err := client.Create(networkname, networktype, networkcidr, networkdns, networkgateway, firstip, lastip, jumbo, powerinstanceid, postTimeOut) + + networkResponse, err := client.Create(body) if err != nil { - return fmt.Errorf("failed to create the network %v", err) + return diag.FromErr(err) } IBMPINetworkID := *networkResponse.NetworkID - d.SetId(fmt.Sprintf("%s/%s", powerinstanceid, IBMPINetworkID)) + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, IBMPINetworkID)) - _, err = isWaitForIBMPINetworkAvailable(client, IBMPINetworkID, d.Timeout(schema.TimeoutCreate), powerinstanceid) + _, err = isWaitForIBMPINetworkAvailable(ctx, client, IBMPINetworkID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMPINetworkRead(d, meta) + return resourceIBMPINetworkRead(ctx, d, meta) } -func resourceIBMPINetworkRead(d *schema.ResourceData, meta interface{}) error { - +func resourceIBMPINetworkRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, networkID, err := splitID(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - networkC := st.NewIBMPINetworkClient(sess, powerinstanceid) - networkdata, err := networkC.Get(parts[1], powerinstanceid, getTimeOut) + networkC := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + networkdata, err := networkC.Get(networkID) if err != nil { - return err + return diag.FromErr(err) } d.Set("network_id", networkdata.NetworkID) @@ -158,79 +172,54 @@ func resourceIBMPINetworkRead(d *schema.ResourceData, meta interface{}) error { d.Set(helpers.PINetworkName, networkdata.Name) d.Set(helpers.PINetworkType, networkdata.Type) d.Set(helpers.PINetworkJumbo, networkdata.Jumbo) - d.Set(helpers.PICloudInstanceId, powerinstanceid) return nil } -func resourceIBMPINetworkUpdate(data *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { return nil } -func resourceIBMPINetworkDelete(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("Calling the network delete functions. ") sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - parts, err := idParts(d.Id()) - if err != nil { - return err - } - powerinstanceid := parts[0] - networkC := st.NewIBMPINetworkClient(sess, powerinstanceid) - err = networkC.Delete(parts[1], powerinstanceid, deleteTimeOut) + cloudInstanceID, networkID, err := splitID(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - d.SetId("") - return nil -} - -func resourceIBMPINetworkExists(d *schema.ResourceData, meta interface{}) (bool, error) { - sess, err := meta.(ClientSession).IBMPISession() - if err != nil { - return false, err - } - parts, err := idParts(d.Id()) - if err != nil { - return false, err - } - if len(parts) < 2 { - return false, fmt.Errorf("Incorrect ID %s: Id should be a combination of powerInstanceID/NetworkID", d.Id()) - } - powerinstanceid := parts[0] - client := st.NewIBMPINetworkClient(sess, powerinstanceid) + networkC := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + err = networkC.Delete(networkID) - network, err := client.Get(parts[0], powerinstanceid, getTimeOut) if err != nil { - - return false, err + return diag.FromErr(err) } - return *network.NetworkID == parts[1], nil + d.SetId("") + return nil } -func isWaitForIBMPINetworkAvailable(client *st.IBMPINetworkClient, id string, timeout time.Duration, powerinstanceid string) (interface{}, error) { - +func isWaitForIBMPINetworkAvailable(ctx context.Context, client *st.IBMPINetworkClient, id string, timeout time.Duration) (interface{}, error) { stateConf := &resource.StateChangeConf{ Pending: []string{"retry", helpers.PINetworkProvisioning}, Target: []string{"NETWORK_READY"}, - Refresh: isIBMPINetworkRefreshFunc(client, id, powerinstanceid), + Refresh: isIBMPINetworkRefreshFunc(client, id), Timeout: timeout, Delay: 10 * time.Second, MinTimeout: 10 * time.Second, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } -func isIBMPINetworkRefreshFunc(client *st.IBMPINetworkClient, id, powerinstanceid string) resource.StateRefreshFunc { +func isIBMPINetworkRefreshFunc(client *st.IBMPINetworkClient, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - network, err := client.Get(id, powerinstanceid, getTimeOut) + network, err := client.Get(id) if err != nil { return nil, "", err } diff --git a/ibm/resource_ibm_pi_network_port.go b/ibm/resource_ibm_pi_network_port.go index 2b304bd181..68cdb30084 100644 --- a/ibm/resource_ibm_pi_network_port.go +++ b/ibm/resource_ibm_pi_network_port.go @@ -4,27 +4,27 @@ package ibm import ( + "context" "fmt" "log" "time" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" st "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" - "github.com/IBM-Cloud/power-go-client/power/client/p_cloud_networks" "github.com/IBM-Cloud/power-go-client/power/models" ) func resourceIBMPINetworkPort() *schema.Resource { return &schema.Resource{ - Create: resourceIBMPINetworkPortCreate, - Read: resourceIBMPINetworkPortRead, - Update: resourceIBMPINetworkPortUpdate, - Delete: resourceIBMPINetworkPortDelete, - //Exists: resourceIBMPINetworkExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMPINetworkPortCreate, + ReadContext: resourceIBMPINetworkPortRead, + UpdateContext: resourceIBMPINetworkPortUpdate, + DeleteContext: resourceIBMPINetworkPortDelete, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), @@ -32,29 +32,26 @@ func resourceIBMPINetworkPort() *schema.Resource { }, Schema: map[string]*schema.Schema{ - helpers.PINetworkName: { Type: schema.TypeString, Required: true, }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, }, - helpers.PINetworkPortDescription: { Type: schema.TypeString, Optional: true, + Computed: true, }, - - //Computed Attributes - helpers.PINetworkPortIPAddress: { Type: schema.TypeString, Optional: true, Computed: true, }, + + //Computed Attributes "macaddress": { Type: schema.TypeString, Computed: true, @@ -75,12 +72,12 @@ func resourceIBMPINetworkPort() *schema.Resource { } } -func resourceIBMPINetworkPortCreate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkPortCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) networkname := d.Get(helpers.PINetworkName).(string) description := d.Get(helpers.PINetworkPortDescription).(string) @@ -93,126 +90,109 @@ func resourceIBMPINetworkPortCreate(d *schema.ResourceData, meta interface{}) er nwportBody.IPAddress = ipaddress } - client := st.NewIBMPINetworkClient(sess, powerinstanceid) - - networkPortResponse, err := client.CreatePort(networkname, powerinstanceid, &p_cloud_networks.PcloudNetworksPortsPostParams{Body: nwportBody}, postTimeOut) + client := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + networkPortResponse, err := client.CreatePort(networkname, nwportBody) if err != nil { - return err + return diag.FromErr(err) } log.Printf("Printing the networkresponse %+v", &networkPortResponse) IBMPINetworkPortID := *networkPortResponse.PortID - d.SetId(fmt.Sprintf("%s/%s/%s", powerinstanceid, IBMPINetworkPortID, networkname)) - if err != nil { - log.Printf("[DEBUG] err %s", err) - return err - } - _, err = isWaitForIBMPINetworkPortAvailable(client, IBMPINetworkPortID, d.Timeout(schema.TimeoutCreate), powerinstanceid, networkname) + d.SetId(fmt.Sprintf("%s/%s/%s", cloudInstanceID, networkname, IBMPINetworkPortID)) + + _, err = isWaitForIBMPINetworkPortAvailable(ctx, client, IBMPINetworkPortID, networkname, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMPINetworkPortRead(d, meta) + return resourceIBMPINetworkPortRead(ctx, d, meta) } -func resourceIBMPINetworkPortRead(d *schema.ResourceData, meta interface{}) error { - +func resourceIBMPINetworkPortRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } parts, err := idParts(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - var powernetworkname string - if len(parts) > 2 { - powernetworkname = parts[2] - } else { - powernetworkname = d.Get(helpers.PINetworkName).(string) - d.SetId(fmt.Sprintf("%s/%s", d.Id(), powernetworkname)) - } - - powerinstanceid := parts[0] - networkC := st.NewIBMPINetworkClient(sess, powerinstanceid) - networkdata, err := networkC.GetPort(powernetworkname, powerinstanceid, parts[1], getTimeOut) + cloudInstanceID := parts[0] + networkname := parts[1] + portID := parts[2] + networkC := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + networkdata, err := networkC.GetPort(networkname, portID) if err != nil { - return err + return diag.FromErr(err) } d.Set(helpers.PINetworkPortIPAddress, networkdata.IPAddress) + d.Set(helpers.PINetworkPortDescription, networkdata.Description) d.Set("macaddress", networkdata.MacAddress) d.Set("status", networkdata.Status) d.Set("portid", networkdata.PortID) d.Set("public_ip", networkdata.ExternalIP) return nil - } -func resourceIBMPINetworkPortUpdate(data *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkPortUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { return nil } -func resourceIBMPINetworkPortDelete(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkPortDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("Calling the network delete functions. ") sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - parts, err := idParts(d.Id()) + parts, err := idParts(d.Id()) if err != nil { - return err - } - var powernetworkname string - if len(parts) > 2 { - powernetworkname = parts[2] - } else { - powernetworkname = d.Get(helpers.PINetworkName).(string) + return diag.FromErr(err) } - powerinstanceid := parts[0] - client := st.NewIBMPINetworkClient(sess, powerinstanceid) - log.Printf("Calling the client %v", client) + cloudInstanceID := parts[0] + networkname := parts[1] + portID := parts[2] - log.Printf("Calling the delete with the following params delete with cloudinstance -> (%s) and networkid --> (%s) and portid --> (%s) ", powerinstanceid, powernetworkname, parts[1]) - networkdata, err := client.DeletePort(powernetworkname, powerinstanceid, parts[1], deleteTimeOut) - - log.Printf("Response from the deleteport call %v", networkdata) + client := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + log.Printf("Calling the delete with the following params delete with cloud instance (%s) and networkid (%s) and portid (%s) ", cloudInstanceID, networkname, portID) + err = client.DeletePort(networkname, portID) if err != nil { - return err + return diag.FromErr(err) } + d.SetId("") return nil } -func isWaitForIBMPINetworkPortAvailable(client *st.IBMPINetworkClient, id string, timeout time.Duration, powerinstanceid, networkname string) (interface{}, error) { +func isWaitForIBMPINetworkPortAvailable(ctx context.Context, client *st.IBMPINetworkClient, id string, networkname string, timeout time.Duration) (interface{}, error) { log.Printf("Waiting for Power Network (%s) that was created for Network Zone (%s) to be available.", id, networkname) stateConf := &resource.StateChangeConf{ Pending: []string{"retry", helpers.PINetworkProvisioning}, Target: []string{"DOWN"}, - Refresh: isIBMPINetworkPortRefreshFunc(client, id, powerinstanceid, networkname), + Refresh: isIBMPINetworkPortRefreshFunc(client, id, networkname), Timeout: timeout, Delay: 10 * time.Second, MinTimeout: 10 * time.Minute, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } -func isIBMPINetworkPortRefreshFunc(client *st.IBMPINetworkClient, id, powerinstanceid, networkname string) resource.StateRefreshFunc { +func isIBMPINetworkPortRefreshFunc(client *st.IBMPINetworkClient, id, networkname string) resource.StateRefreshFunc { log.Printf("Calling the IsIBMPINetwork Refresh Function....with the following id (%s) for network port and following id (%s) for network name and waiting for network to be READY", id, networkname) return func() (interface{}, string, error) { - network, err := client.GetPort(networkname, powerinstanceid, id, getTimeOut) + network, err := client.GetPort(networkname, id) if err != nil { return nil, "", err } diff --git a/ibm/resource_ibm_pi_network_port_attach.go b/ibm/resource_ibm_pi_network_port_attach.go index dd07b70c58..8686f44ce1 100644 --- a/ibm/resource_ibm_pi_network_port_attach.go +++ b/ibm/resource_ibm_pi_network_port_attach.go @@ -4,26 +4,28 @@ package ibm import ( + "context" "fmt" "log" "time" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" st "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" + "github.com/IBM-Cloud/power-go-client/power/models" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) func resourceIBMPINetworkPortAttach() *schema.Resource { return &schema.Resource{ - Create: resourceIBMPINetworkPortAttachCreate, - Read: resourceIBMPINetworkPortAttachRead, - Update: resourceIBMPINetworkPortAttachUpdate, - Delete: resourceIBMPINetworkPortAttachDelete, - //Exists: resourceIBMPINetworkExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMPINetworkPortAttachCreate, + ReadContext: resourceIBMPINetworkPortAttachRead, + UpdateContext: resourceIBMPINetworkPortAttachUpdate, + DeleteContext: resourceIBMPINetworkPortAttachDelete, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), @@ -31,29 +33,24 @@ func resourceIBMPINetworkPortAttach() *schema.Resource { Update: schema.DefaultTimeout(60 * time.Minute), }, Schema: map[string]*schema.Schema{ - "port_id": { Type: schema.TypeString, Required: true, }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, }, - helpers.PIInstanceName: { Type: schema.TypeString, Required: true, Description: "Instance name to attach the network port to", }, - helpers.PINetworkName: { Type: schema.TypeString, Required: true, Description: "Network Name - This is the subnet name in the Cloud instance", }, - helpers.PINetworkPortDescription: { Type: schema.TypeString, Optional: true, @@ -69,43 +66,45 @@ func resourceIBMPINetworkPortAttach() *schema.Resource { } -func resourceIBMPINetworkPortAttachCreate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkPortAttachCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) networkname := d.Get(helpers.PINetworkName).(string) portid := d.Get("port_id").(string) instancename := d.Get(helpers.PIInstanceName).(string) description := d.Get(helpers.PINetworkPortDescription).(string) - client := st.NewIBMPINetworkClient(sess, powerinstanceid) + client := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) - log.Printf("Printing the input to the resource powerinstance [%s] and network name [%s] and the portid [%s]", powerinstanceid, networkname, portid) - networkPortResponse, err := client.AttachPort(powerinstanceid, networkname, portid, description, instancename, postTimeOut) + log.Printf("Printing the input to the resource: cloud instance [%s] and network name [%s] and the portid [%s]", cloudInstanceID, networkname, portid) + body := &models.NetworkPortUpdate{ + Description: &description, + PvmInstanceID: &instancename, + } + networkPortResponse, err := client.UpdatePort(networkname, portid, body) if err != nil { - return err + return diag.FromErr(err) } log.Printf("Printing the networkresponse %+v", &networkPortResponse) IBMPINetworkPortID := *networkPortResponse.PortID - d.SetId(fmt.Sprintf("%s/%s", powerinstanceid, IBMPINetworkPortID)) - if err != nil { - log.Printf("[DEBUG] err %s", err) - return err - } - _, err = isWaitForIBMPINetworkPortAttachAvailable(client, IBMPINetworkPortID, d.Timeout(schema.TimeoutCreate), powerinstanceid, networkname) + d.SetId(fmt.Sprintf("%s/%s/%s", cloudInstanceID, networkname, IBMPINetworkPortID)) + + _, err = isWaitForIBMPINetworkPortAttachAvailable(ctx, client, IBMPINetworkPortID, networkname, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMPINetworkPortAttachRead(d, meta) + return resourceIBMPINetworkPortAttachRead(ctx, d, meta) } -func resourceIBMPINetworkPortAttachRead(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkPortAttachRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("Calling ther Network Port Attach Read code") sess, err := meta.(ClientSession).IBMPISession() @@ -115,13 +114,17 @@ func resourceIBMPINetworkPortAttachRead(d *schema.ResourceData, meta interface{} parts, err := idParts(d.Id()) if err != nil { - return err + return diag.FromErr(err) } + cloudInstanceID := parts[0] + networkID := parts[1] + portID := parts[2] - powerinstanceid := parts[0] - powernetworkname := d.Get(helpers.PINetworkName).(string) - networkC := st.NewIBMPINetworkClient(sess, powerinstanceid) - networkdata, err := networkC.GetPort(powernetworkname, powerinstanceid, parts[1], getTimeOut) + networkC := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + networkdata, err := networkC.GetPort(networkID, portID) + if err != nil { + return diag.FromErr(err) + } d.Set("ipaddress", networkdata.IPAddress) d.Set("macaddress", networkdata.MacAddress) @@ -133,65 +136,66 @@ func resourceIBMPINetworkPortAttachRead(d *schema.ResourceData, meta interface{} return nil } -func resourceIBMPINetworkPortAttachUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkPortAttachUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("Calling the attach update ") return nil } -func resourceIBMPINetworkPortAttachDelete(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPINetworkPortAttachDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("Detaching the network port from the Instance ") sess, err := meta.(ClientSession).IBMPISession() - if err != nil { fmt.Printf("failed to get a session from the IBM Cloud Service %v", err) } + parts, err := idParts(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - - powerinstanceid := parts[0] - powernetworkname := d.Get(helpers.PINetworkName).(string) - portid := d.Get("port_id").(string) - - client := st.NewIBMPINetworkClient(sess, powerinstanceid) - log.Printf("Calling the network delete functions. ") - network, err := client.DetachPort(powerinstanceid, powernetworkname, portid, deleteTimeOut) + cloudInstanceID := parts[0] + networkID := parts[1] + portID := parts[2] + + client := st.NewIBMPINetworkClient(ctx, sess, cloudInstanceID) + log.Printf("Executing network port detach") + emptyPVM := "" + body := &models.NetworkPortUpdate{ + PvmInstanceID: &emptyPVM, + } + networkPort, err := client.UpdatePort(networkID, portID, body) if err != nil { - return err + return diag.FromErr(err) } - log.Printf("Printing the networkresponse %+v", &network) - - //log.Printf("Printing the networkresponse %s", network.Status) + log.Printf("Printing the networkresponse %+v", &networkPort) d.SetId("") return nil } -func isWaitForIBMPINetworkPortAttachAvailable(client *st.IBMPINetworkClient, id string, timeout time.Duration, powerinstanceid, networkname string) (interface{}, error) { +func isWaitForIBMPINetworkPortAttachAvailable(ctx context.Context, client *st.IBMPINetworkClient, id string, networkname string, timeout time.Duration) (interface{}, error) { log.Printf("Waiting for Power Network (%s) that was created for Network Zone (%s) to be available.", id, networkname) stateConf := &resource.StateChangeConf{ Pending: []string{"retry", helpers.PINetworkProvisioning}, Target: []string{"ACTIVE"}, - Refresh: isIBMPINetworkPortAttachRefreshFunc(client, id, powerinstanceid, networkname), + Refresh: isIBMPINetworkPortAttachRefreshFunc(client, id, networkname), Timeout: timeout, Delay: 10 * time.Second, MinTimeout: 10 * time.Minute, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } -func isIBMPINetworkPortAttachRefreshFunc(client *st.IBMPINetworkClient, id, powerinstanceid, networkname string) resource.StateRefreshFunc { +func isIBMPINetworkPortAttachRefreshFunc(client *st.IBMPINetworkClient, id, networkname string) resource.StateRefreshFunc { log.Printf("Calling the IsIBMPINetwork Refresh Function....with the following id (%s) for network port and following id (%s) for network name and waiting for network to be READY", id, networkname) return func() (interface{}, string, error) { - network, err := client.GetPort(networkname, powerinstanceid, id, getTimeOut) + network, err := client.GetPort(networkname, id) if err != nil { return nil, "", err } diff --git a/ibm/resource_ibm_pi_network_port_attach_test.go b/ibm/resource_ibm_pi_network_port_attach_test.go index 49d77568aa..49885736b4 100644 --- a/ibm/resource_ibm_pi_network_port_attach_test.go +++ b/ibm/resource_ibm_pi_network_port_attach_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -45,9 +46,14 @@ func testAccCheckIBMPINetworkPortAttachDestroy(s *terraform.State) error { continue } parts, err := idParts(rs.Primary.ID) - powerinstanceid := parts[0] - networkC := st.NewIBMPINetworkClient(sess, powerinstanceid) - _, err = networkC.GetPort(parts[2], parts[1], powerinstanceid, getTimeOut) + if err != nil { + return err + } + cloudInstanceID := parts[0] + networkID := parts[1] + portID := parts[2] + networkC := st.NewIBMPINetworkClient(context.Background(), sess, cloudInstanceID) + _, err = networkC.GetPort(networkID, portID) if err == nil { return fmt.Errorf("PI Network Port still exists: %s", rs.Primary.ID) } @@ -76,10 +82,12 @@ func testAccCheckIBMPINetworkPortAttachExists(n string) resource.TestCheckFunc { if err != nil { return err } - powerinstanceid := parts[0] - client := st.NewIBMPINetworkClient(sess, powerinstanceid) + cloudInstanceID := parts[0] + networkID := parts[1] + portID := parts[2] + client := st.NewIBMPINetworkClient(context.Background(), sess, cloudInstanceID) - network, err := client.GetPort(parts[2], powerinstanceid, parts[1], getTimeOut) + network, err := client.GetPort(networkID, portID) if err != nil { return err } diff --git a/ibm/resource_ibm_pi_network_port_test.go b/ibm/resource_ibm_pi_network_port_test.go index 10e1083fef..fc5b6bba95 100644 --- a/ibm/resource_ibm_pi_network_port_test.go +++ b/ibm/resource_ibm_pi_network_port_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -34,7 +35,6 @@ func TestAccIBMPINetworkPortbasic(t *testing.T) { }) } func testAccCheckIBMPINetworkPortDestroy(s *terraform.State) error { - sess, err := testAccProvider.Meta().(ClientSession).IBMPISession() if err != nil { return err @@ -44,9 +44,14 @@ func testAccCheckIBMPINetworkPortDestroy(s *terraform.State) error { continue } parts, err := idParts(rs.Primary.ID) - powerinstanceid := parts[0] - networkC := st.NewIBMPINetworkClient(sess, powerinstanceid) - _, err = networkC.GetPort(parts[2], parts[1], powerinstanceid, getTimeOut) + if err != nil { + return err + } + cloudInstanceID := parts[0] + networkname := parts[1] + portID := parts[2] + networkC := st.NewIBMPINetworkClient(context.Background(), sess, cloudInstanceID) + _, err = networkC.GetPort(networkname, portID) if err == nil { return fmt.Errorf("PI Network Port still exists: %s", rs.Primary.ID) } @@ -75,14 +80,15 @@ func testAccCheckIBMPINetworkPortExists(n string) resource.TestCheckFunc { if err != nil { return err } - powerinstanceid := parts[0] - client := st.NewIBMPINetworkClient(sess, powerinstanceid) + cloudInstanceID := parts[0] + networkname := parts[1] + portID := parts[2] + client := st.NewIBMPINetworkClient(context.Background(), sess, cloudInstanceID) - network, err := client.GetPort(parts[2], powerinstanceid, parts[1], getTimeOut) + _, err = client.GetPort(networkname, portID) if err != nil { return err } - parts[1] = *network.PortID return nil } diff --git a/ibm/resource_ibm_pi_network_test.go b/ibm/resource_ibm_pi_network_test.go index 4b168eb4ce..083d7a3788 100644 --- a/ibm/resource_ibm_pi_network_test.go +++ b/ibm/resource_ibm_pi_network_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -43,10 +44,12 @@ func testAccCheckIBMPINetworkDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_network" { continue } - parts, err := idParts(rs.Primary.ID) - powerinstanceid := parts[0] - networkC := st.NewIBMPINetworkClient(sess, powerinstanceid) - _, err = networkC.Get(parts[1], powerinstanceid, getTimeOut) + cloudInstanceID, networkID, err := splitID(rs.Primary.ID) + if err != nil { + return err + } + networkC := st.NewIBMPINetworkClient(context.Background(), sess, cloudInstanceID) + _, err = networkC.Get(networkID) if err == nil { return fmt.Errorf("PI Network still exists: %s", rs.Primary.ID) } @@ -71,20 +74,17 @@ func testAccCheckIBMPINetworkExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, networkID, err := splitID(rs.Primary.ID) if err != nil { return err } - powerinstanceid := parts[0] - client := st.NewIBMPINetworkClient(sess, powerinstanceid) + client := st.NewIBMPINetworkClient(context.Background(), sess, cloudInstanceID) - network, err := client.Get(parts[1], powerinstanceid, getTimeOut) + _, err = client.Get(networkID) if err != nil { return err } - parts[1] = *network.NetworkID return nil - } } diff --git a/ibm/resource_ibm_pi_snapshot.go b/ibm/resource_ibm_pi_snapshot.go index fd0132cc20..ea247eb380 100644 --- a/ibm/resource_ibm_pi_snapshot.go +++ b/ibm/resource_ibm_pi_snapshot.go @@ -9,10 +9,10 @@ import ( "log" "time" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/IBM-Cloud/bluemix-go/bmxerror" st "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" "github.com/IBM-Cloud/power-go-client/power/models" @@ -20,35 +20,29 @@ import ( func resourceIBMPISnapshot() *schema.Resource { return &schema.Resource{ - Create: resourceIBMPISnapshotCreate, - Read: resourceIBMPISnapshotRead, - Update: resourceIBMPISnapshotUpdate, - Delete: resourceIBMPISnapshotDelete, - Exists: resourceIBMPISnapshotExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMPISnapshotCreate, + ReadContext: resourceIBMPISnapshotRead, + UpdateContext: resourceIBMPISnapshotUpdate, + DeleteContext: resourceIBMPISnapshotDelete, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), Update: schema.DefaultTimeout(60 * time.Minute), - Delete: schema.DefaultTimeout(60 * time.Minute), + Delete: schema.DefaultTimeout(10 * time.Minute), }, Schema: map[string]*schema.Schema{ - - //Snapshots are created at the pvm instance level - helpers.PISnapshotName: { Type: schema.TypeString, Required: true, Description: "Unique name of the snapshot", }, - helpers.PIInstanceName: { Type: schema.TypeString, Required: true, Description: "Instance name / id of the pvm", }, - helpers.PIInstanceVolumeIds: { Type: schema.TypeSet, Optional: true, @@ -57,26 +51,35 @@ func resourceIBMPISnapshot() *schema.Resource { DiffSuppressFunc: applyOnce, Description: "List of PI volumes", }, - helpers.PICloudInstanceId: { Type: schema.TypeString, Required: true, Description: " Cloud Instance ID - This is the service_instance_id.", }, - + "pi_description": { + Type: schema.TypeString, + Optional: true, + Description: "Description of the PVM instance snapshot", + }, "description": { Type: schema.TypeString, Optional: true, Description: "Snapshot description", + Deprecated: "This field is deprecated, use pi_description instead", }, - // Computed Attributes + // Computed Attributes helpers.PISnapshot: { Type: schema.TypeString, Computed: true, Description: "Id of the snapshot", + Deprecated: "This field is deprecated, use snapshot_id instead", + }, + "snapshot_id": { + Type: schema.TypeString, + Computed: true, + Description: "ID of the PVM instance snapshot", }, - "status": { Type: schema.TypeString, Computed: true, @@ -85,7 +88,7 @@ func resourceIBMPISnapshot() *schema.Resource { Type: schema.TypeString, Computed: true, }, - "last_updated_date": { + "last_update_date": { Type: schema.TypeString, Computed: true, }, @@ -97,22 +100,26 @@ func resourceIBMPISnapshot() *schema.Resource { } } -func resourceIBMPISnapshotCreate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPISnapshotCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) instanceid := d.Get(helpers.PIInstanceName).(string) volids := expandStringList((d.Get(helpers.PIInstanceVolumeIds).(*schema.Set)).List()) name := d.Get(helpers.PISnapshotName).(string) - description := d.Get("description").(string) - if d.Get(description) == "" { - description = "Testing from Terraform" + + var description string + if v, ok := d.GetOk("description"); ok { + description = v.(string) + } + if v, ok := d.GetOk("pi_description"); ok { + description = v.(string) } - client := st.NewIBMPIInstanceClient(context.Background(), sess, powerinstanceid) + client := st.NewIBMPIInstanceClient(context.Background(), sess, cloudInstanceID) snapshotBody := &models.SnapshotCreate{Name: &name, Description: description} @@ -123,48 +130,43 @@ func resourceIBMPISnapshotCreate(d *schema.ResourceData, meta interface{}) error } snapshotResponse, err := client.CreatePvmSnapShot(instanceid, snapshotBody) - if err != nil { log.Printf("[DEBUG] err %s", err) - return err + return diag.FromErr(err) } - d.SetId(fmt.Sprintf("%s/%s", powerinstanceid, *snapshotResponse.SnapshotID)) - if err != nil { - log.Printf("[DEBUG] err %s", err) - return fmt.Errorf("failed to get the snapshotid %v", err) - } + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, *snapshotResponse.SnapshotID)) - pisnapclient := st.NewIBMPISnapshotClient(sess, powerinstanceid) - _, err = isWaitForPIInstanceSnapshotAvailable(pisnapclient, *snapshotResponse.SnapshotID, d.Timeout(schema.TimeoutCreate), powerinstanceid) + pisnapclient := st.NewIBMPISnapshotClient(ctx, sess, cloudInstanceID) + _, err = isWaitForPIInstanceSnapshotAvailable(ctx, pisnapclient, *snapshotResponse.SnapshotID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMPISnapshotRead(d, meta) + return resourceIBMPISnapshotRead(ctx, d, meta) } -func resourceIBMPISnapshotRead(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPISnapshotRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("Calling the Snapshot Read function post create") sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - parts, err := idParts(d.Id()) + + cloudInstanceID, snapshotID, err := splitID(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - snapshot := st.NewIBMPISnapshotClient(sess, powerinstanceid) - snapshotdata, err := snapshot.Get(parts[1], powerinstanceid, getTimeOut) - + snapshot := st.NewIBMPISnapshotClient(ctx, sess, cloudInstanceID) + snapshotdata, err := snapshot.Get(snapshotID) if err != nil { - return err + return diag.FromErr(err) } d.Set(helpers.PISnapshotName, snapshotdata.Name) d.Set(helpers.PISnapshot, *snapshotdata.SnapshotID) + d.Set("snapshot_id", *snapshotdata.SnapshotID) d.Set("status", snapshotdata.Status) d.Set("creation_date", snapshotdata.CreationDate.String()) d.Set("volume_snapshots", snapshotdata.VolumeSnapshots) @@ -173,121 +175,94 @@ func resourceIBMPISnapshotRead(d *schema.ResourceData, meta interface{}) error { return nil } -func resourceIBMPISnapshotUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPISnapshotUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { log.Printf("Calling the IBM Power Snapshot update call") - sess, _ := meta.(ClientSession).IBMPISession() - parts, err := idParts(d.Id()) + sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - client := st.NewIBMPISnapshotClient(sess, powerinstanceid) + + cloudInstanceID, snapshotID, err := splitID(d.Id()) + if err != nil { + return diag.FromErr(err) + } + + client := st.NewIBMPISnapshotClient(ctx, sess, cloudInstanceID) if d.HasChange(helpers.PISnapshotName) || d.HasChange("description") { name := d.Get(helpers.PISnapshotName).(string) description := d.Get("description").(string) snapshotBody := &models.SnapshotUpdate{Name: name, Description: description} - _, err := client.Update(parts[1], powerinstanceid, snapshotBody, 60) - + _, err := client.Update(snapshotID, snapshotBody) if err != nil { - return fmt.Errorf("failed to update the snapshot request %v", err) - + return diag.FromErr(err) } - _, err = isWaitForPIInstanceSnapshotAvailable(client, parts[1], d.Timeout(schema.TimeoutCreate), powerinstanceid) + _, err = isWaitForPIInstanceSnapshotAvailable(ctx, client, snapshotID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } } - return resourceIBMPISnapshotRead(d, meta) + return resourceIBMPISnapshotRead(ctx, d, meta) } -func resourceIBMPISnapshotDelete(d *schema.ResourceData, meta interface{}) error { - - sess, _ := meta.(ClientSession).IBMPISession() - parts, err := idParts(d.Id()) +func resourceIBMPISnapshotDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - - client := st.NewIBMPISnapshotClient(sess, powerinstanceid) - snapshot, err := client.Get(parts[1], powerinstanceid, getTimeOut) + cloudInstanceID, snapshotID, err := splitID(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - log.Printf("The snapshot to be deleted is in the following state .. %s", snapshot.Status) - - snapshotdel_err := client.Delete(parts[1], powerinstanceid, deleteTimeOut) - if snapshotdel_err != nil { - return snapshotdel_err - } - - _, err = isWaitForPIInstanceSnapshotDeleted(client, parts[1], d.Timeout(schema.TimeoutDelete), powerinstanceid) + client := st.NewIBMPISnapshotClient(ctx, sess, cloudInstanceID) + snapshot, err := client.Get(snapshotID) if err != nil { - return err + // snapshot does not exist + d.SetId("") + return nil } - d.SetId("") - return nil -} -func resourceIBMPISnapshotExists(d *schema.ResourceData, meta interface{}) (bool, error) { + log.Printf("The snapshot to be deleted is in the following state .. %s", snapshot.Status) - sess, err := meta.(ClientSession).IBMPISession() + err = client.Delete(snapshotID) if err != nil { - return false, err - } - parts, err := idParts(d.Id()) - if err != nil { - return false, err - } - if len(parts) < 2 { - return false, fmt.Errorf("Incorrect ID %s: Id should be a combination of powerInstanceID/SnapshotID", d.Id()) + return diag.FromErr(err) } - powerinstanceid := parts[0] - client := st.NewIBMPISnapshotClient(sess, powerinstanceid) - snapshotdelete, err := client.Get(parts[1], powerinstanceid, getTimeOut) + _, err = isWaitForPIInstanceSnapshotDeleted(ctx, client, snapshotID, d.Timeout(schema.TimeoutDelete)) if err != nil { - if apiErr, ok := err.(bmxerror.RequestFailure); ok { - if apiErr.StatusCode() == 404 { - return false, nil - } - } - return false, fmt.Errorf("[ERROR] Error getting pi snapshot: %s", err) + return diag.FromErr(err) } - log.Printf("Calling the existing function.. %s", *(snapshotdelete.SnapshotID)) - - volumeid := *snapshotdelete.SnapshotID - return volumeid == parts[1], nil + d.SetId("") + return nil } - -func isWaitForPIInstanceSnapshotAvailable(client *st.IBMPISnapshotClient, id string, timeout time.Duration, powerinstanceid string) (interface{}, error) { +func isWaitForPIInstanceSnapshotAvailable(ctx context.Context, client *st.IBMPISnapshotClient, id string, timeout time.Duration) (interface{}, error) { log.Printf("Waiting for PIInstance Snapshot (%s) to be available and active ", id) stateConf := &resource.StateChangeConf{ Pending: []string{"in_progress", "BUILD"}, Target: []string{"available", "ACTIVE"}, - Refresh: isPIInstanceSnapshotRefreshFunc(client, id, powerinstanceid), + Refresh: isPIInstanceSnapshotRefreshFunc(client, id), Delay: 30 * time.Second, MinTimeout: 2 * time.Minute, - Timeout: 60 * time.Minute, + Timeout: timeout, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } -func isPIInstanceSnapshotRefreshFunc(client *st.IBMPISnapshotClient, id, powerinstanceid string) resource.StateRefreshFunc { +func isPIInstanceSnapshotRefreshFunc(client *st.IBMPISnapshotClient, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - snapshotInfo, err := client.Get(id, powerinstanceid, getTimeOut) + snapshotInfo, err := client.Get(id) if err != nil { return nil, "", err } @@ -304,29 +279,28 @@ func isPIInstanceSnapshotRefreshFunc(client *st.IBMPISnapshotClient, id, powerin // Delete Snapshot -func isWaitForPIInstanceSnapshotDeleted(client *st.IBMPISnapshotClient, id string, timeout time.Duration, powerinstanceid string) (interface{}, error) { +func isWaitForPIInstanceSnapshotDeleted(ctx context.Context, client *st.IBMPISnapshotClient, id string, timeout time.Duration) (interface{}, error) { - log.Printf("Waiting for (%s) to be deleted.", id) + log.Printf("Waiting for (%s) to be deleted.", id) stateConf := &resource.StateChangeConf{ Pending: []string{"retry", helpers.PIInstanceDeleting}, Target: []string{"Not Found"}, - Refresh: isPIInstanceSnapshotDeleteRefreshFunc(client, id, powerinstanceid), + Refresh: isPIInstanceSnapshotDeleteRefreshFunc(client, id), Delay: 10 * time.Second, MinTimeout: 10 * time.Second, - Timeout: 10 * time.Minute, + Timeout: timeout, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } -func isPIInstanceSnapshotDeleteRefreshFunc(client *st.IBMPISnapshotClient, id, powerinstanceid string) resource.StateRefreshFunc { +func isPIInstanceSnapshotDeleteRefreshFunc(client *st.IBMPISnapshotClient, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - snapshot, err := client.Get(id, powerinstanceid, getTimeOut) + snapshot, err := client.Get(id) if err != nil { log.Printf("The snapshot is not found.") return snapshot, helpers.PIInstanceNotFound, nil - } return snapshot, helpers.PIInstanceNotFound, nil diff --git a/ibm/resource_ibm_pi_snapshot_test.go b/ibm/resource_ibm_pi_snapshot_test.go index acd1dfe1fe..23c387a428 100644 --- a/ibm/resource_ibm_pi_snapshot_test.go +++ b/ibm/resource_ibm_pi_snapshot_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -44,10 +45,12 @@ func testAccCheckIBMPIInstanceSnapshotDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_snapshot" { continue } - parts, err := idParts(rs.Primary.ID) - powerinstanceid := parts[0] - networkC := st.NewIBMPISnapshotClient(sess, powerinstanceid) - _, err = networkC.Get(parts[1], powerinstanceid, getTimeOut) + cloudInstanceID, snapshotID, err := splitID(rs.Primary.ID) + if err != nil { + return err + } + networkC := st.NewIBMPISnapshotClient(context.Background(), sess, cloudInstanceID) + _, err = networkC.Get(snapshotID) if err == nil { return fmt.Errorf("PI Instance Snapshot still exists: %s", rs.Primary.ID) } @@ -72,20 +75,17 @@ func testAccCheckIBMPIInstanceSnapshotExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, snapshotID, err := splitID(rs.Primary.ID) if err != nil { return err } - powerinstanceid := parts[0] - client := st.NewIBMPISnapshotClient(sess, powerinstanceid) + client := st.NewIBMPISnapshotClient(context.Background(), sess, cloudInstanceID) - snapshot, err := client.Get(parts[1], powerinstanceid, getTimeOut) + _, err = client.Get(snapshotID) if err != nil { return err } - parts[1] = *snapshot.SnapshotID return nil - } } diff --git a/ibm/resource_ibm_pi_volume.go b/ibm/resource_ibm_pi_volume.go index f9485d5c59..b1b8c82140 100644 --- a/ibm/resource_ibm_pi_volume.go +++ b/ibm/resource_ibm_pi_volume.go @@ -4,26 +4,22 @@ package ibm import ( + "context" "fmt" "log" "strings" "time" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/IBM-Cloud/bluemix-go/bmxerror" st "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" - "github.com/IBM-Cloud/power-go-client/power/client/p_cloud_volumes" "github.com/IBM-Cloud/power-go-client/power/models" ) const ( - /* Power Volume creation depends on response from PowerVC */ - volPostTimeOut = 180 * time.Second - volGetTimeOut = 180 * time.Second - volDeleteTimeOut = 180 * time.Second PIAffinityPolicy = "pi_affinity_policy" PIAffinityVolume = "pi_affinity_volume" PIAffinityInstance = "pi_affinity_instance" @@ -33,17 +29,16 @@ const ( func resourceIBMPIVolume() *schema.Resource { return &schema.Resource{ - Create: resourceIBMPIVolumeCreate, - Read: resourceIBMPIVolumeRead, - Update: resourceIBMPIVolumeUpdate, - Delete: resourceIBMPIVolumeDelete, - Exists: resourceIBMPIVolumeExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMPIVolumeCreate, + ReadContext: resourceIBMPIVolumeRead, + UpdateContext: resourceIBMPIVolumeUpdate, + DeleteContext: resourceIBMPIVolumeDelete, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ - Create: schema.DefaultTimeout(60 * time.Minute), - Update: schema.DefaultTimeout(60 * time.Minute), - Delete: schema.DefaultTimeout(60 * time.Minute), + Create: schema.DefaultTimeout(30 * time.Minute), + Update: schema.DefaultTimeout(30 * time.Minute), + Delete: schema.DefaultTimeout(10 * time.Minute), }, Schema: map[string]*schema.Schema{ @@ -161,10 +156,11 @@ func resourceIBMPIVolumeValidator() *ResourceValidator { Schema: validateSchema} return &ibmPIVolumeResourceValidator } -func resourceIBMPIVolumeCreate(d *schema.ResourceData, meta interface{}) error { + +func resourceIBMPIVolumeCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } name := d.Get(helpers.PIVolumeName).(string) @@ -173,8 +169,8 @@ func resourceIBMPIVolumeCreate(d *schema.ResourceData, meta interface{}) error { if v, ok := d.GetOk(helpers.PIVolumeShareable); ok { shared = v.(bool) } - powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - body := models.CreateDataVolume{ + cloudInstanceID := d.Get(helpers.PICloudInstanceId).(string) + body := &models.CreateDataVolume{ Name: &name, Shareable: &shared, Size: &size, @@ -213,41 +209,39 @@ func resourceIBMPIVolumeCreate(d *schema.ResourceData, meta interface{}) error { } - resquestParams := p_cloud_volumes.PcloudCloudinstancesVolumesPostParams{ - Body: &body, - CloudInstanceID: powerinstanceid, - } - - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) - vol, err := client.CreateVolume(&resquestParams, powerinstanceid, volPostTimeOut) + client := st.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID) + vol, err := client.CreateVolume(body) if err != nil { - return fmt.Errorf("Failed to Create the volume %v", err) + return diag.FromErr(err) } volumeid := *vol.VolumeID - d.SetId(fmt.Sprintf("%s/%s", powerinstanceid, volumeid)) + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, volumeid)) - _, err = isWaitForIBMPIVolumeAvailable(client, volumeid, powerinstanceid, d.Timeout(schema.TimeoutCreate)) + _, err = isWaitForIBMPIVolumeAvailable(ctx, client, volumeid, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMPIVolumeRead(d, meta) + return resourceIBMPIVolumeRead(ctx, d, meta) } -func resourceIBMPIVolumeRead(d *schema.ResourceData, meta interface{}) error { - sess, _ := meta.(ClientSession).IBMPISession() - parts, err := idParts(d.Id()) +func resourceIBMPIVolumeRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) - vol, err := client.Get(parts[1], powerinstanceid, volGetTimeOut) + cloudInstanceID, volumeID, err := splitID(d.Id()) if err != nil { - return fmt.Errorf("Failed to get the volume %v", err) + return diag.FromErr(err) + } + + client := st.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID) + vol, err := client.Get(volumeID) + if err != nil { + return diag.FromErr(err) } d.Set(helpers.PIVolumeName, vol.Name) d.Set(helpers.PIVolumeSize, vol.Size) @@ -264,19 +258,23 @@ func resourceIBMPIVolumeRead(d *schema.ResourceData, meta interface{}) error { d.Set("delete_on_termination", vol.DeleteOnTermination) } d.Set("wwn", vol.Wwn) - d.Set(helpers.PICloudInstanceId, powerinstanceid) + d.Set(helpers.PICloudInstanceId, cloudInstanceID) return nil } -func resourceIBMPIVolumeUpdate(d *schema.ResourceData, meta interface{}) error { - sess, _ := meta.(ClientSession).IBMPISession() - parts, err := idParts(d.Id()) +func resourceIBMPIVolumeUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID, volumeID, err := splitID(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) + + client := st.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID) name := d.Get(helpers.PIVolumeName).(string) size := float64(d.Get(helpers.PIVolumeSize).(float64)) var shareable bool @@ -284,98 +282,65 @@ func resourceIBMPIVolumeUpdate(d *schema.ResourceData, meta interface{}) error { shareable = v.(bool) } - body := models.UpdateVolume{ + body := &models.UpdateVolume{ Name: &name, Shareable: &shareable, Size: size, } - updateParams := p_cloud_volumes.PcloudCloudinstancesVolumesPutParams{ - Body: &body, - CloudInstanceID: powerinstanceid, - } - volrequest, err := client.UpdateVolume(&updateParams, parts[1], powerinstanceid, volPostTimeOut) + volrequest, err := client.UpdateVolume(volumeID, body) if err != nil { - return err + return diag.FromErr(err) } - _, err = isWaitForIBMPIVolumeAvailable(client, *volrequest.VolumeID, powerinstanceid, d.Timeout(schema.TimeoutUpdate)) + _, err = isWaitForIBMPIVolumeAvailable(ctx, client, *volrequest.VolumeID, d.Timeout(schema.TimeoutUpdate)) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMPIVolumeRead(d, meta) + return resourceIBMPIVolumeRead(ctx, d, meta) } -func resourceIBMPIVolumeDelete(d *schema.ResourceData, meta interface{}) error { - - sess, _ := meta.(ClientSession).IBMPISession() - parts, err := idParts(d.Id()) +func resourceIBMPIVolumeDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } - powerinstanceid := parts[0] - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) - voldeleteErr := client.DeleteVolume(parts[1], powerinstanceid, deleteTimeOut) - if voldeleteErr != nil { - return voldeleteErr - } - _, err = isWaitForIBMPIVolumeDeleted(client, parts[1], powerinstanceid, d.Timeout(schema.TimeoutDelete)) + cloudInstanceID, volumeID, err := splitID(d.Id()) if err != nil { - return err + return diag.FromErr(err) } - d.SetId("") - return nil -} -func resourceIBMPIVolumeExists(d *schema.ResourceData, meta interface{}) (bool, error) { - sess, err := meta.(ClientSession).IBMPISession() + client := st.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID) + err = client.DeleteVolume(volumeID) if err != nil { - return false, err + return diag.FromErr(err) } - parts, err := idParts(d.Id()) + _, err = isWaitForIBMPIVolumeDeleted(ctx, client, volumeID, d.Timeout(schema.TimeoutDelete)) if err != nil { - return false, err + return diag.FromErr(err) } - if len(parts) < 2 { - return false, fmt.Errorf("Incorrect ID %s: Id should be a combination of powerInstanceID/VolumeID", d.Id()) - } - powerinstanceid := parts[0] - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) - - vol, err := client.Get(parts[1], powerinstanceid, getTimeOut) - if err != nil { - if apiErr, ok := err.(bmxerror.RequestFailure); ok { - if apiErr.StatusCode() == 404 { - return false, nil - } - } - return false, fmt.Errorf("[ERROR] Error getting pi volume: %s", err) - } - - log.Printf("Calling the existing function.. %s", *(vol.VolumeID)) - - volumeid := *vol.VolumeID - return volumeid == parts[1], nil + d.SetId("") + return nil } -func isWaitForIBMPIVolumeAvailable(client *st.IBMPIVolumeClient, id, powerinstanceid string, timeout time.Duration) (interface{}, error) { +func isWaitForIBMPIVolumeAvailable(ctx context.Context, client *st.IBMPIVolumeClient, id string, timeout time.Duration) (interface{}, error) { log.Printf("Waiting for Volume (%s) to be available.", id) stateConf := &resource.StateChangeConf{ Pending: []string{"retry", helpers.PIVolumeProvisioning}, Target: []string{helpers.PIVolumeProvisioningDone}, - Refresh: isIBMPIVolumeRefreshFunc(client, id, powerinstanceid), + Refresh: isIBMPIVolumeRefreshFunc(client, id), Delay: 10 * time.Second, MinTimeout: 2 * time.Minute, - Timeout: 30 * time.Minute, + Timeout: timeout, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } -func isIBMPIVolumeRefreshFunc(client *st.IBMPIVolumeClient, id, powerinstanceid string) resource.StateRefreshFunc { +func isIBMPIVolumeRefreshFunc(client *st.IBMPIVolumeClient, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - vol, err := client.Get(id, powerinstanceid, volGetTimeOut) + vol, err := client.Get(id) if err != nil { return nil, "", err } @@ -388,21 +353,21 @@ func isIBMPIVolumeRefreshFunc(client *st.IBMPIVolumeClient, id, powerinstanceid } } -func isWaitForIBMPIVolumeDeleted(client *st.IBMPIVolumeClient, id, powerinstanceid string, timeout time.Duration) (interface{}, error) { +func isWaitForIBMPIVolumeDeleted(ctx context.Context, client *st.IBMPIVolumeClient, id string, timeout time.Duration) (interface{}, error) { stateConf := &resource.StateChangeConf{ Pending: []string{"deleting", helpers.PIVolumeProvisioning}, Target: []string{"deleted"}, - Refresh: isIBMPIVolumeDeleteRefreshFunc(client, id, powerinstanceid), + Refresh: isIBMPIVolumeDeleteRefreshFunc(client, id), Delay: 10 * time.Second, MinTimeout: 2 * time.Minute, - Timeout: 30 * time.Minute, + Timeout: timeout, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } -func isIBMPIVolumeDeleteRefreshFunc(client *st.IBMPIVolumeClient, id, powerinstanceid string) resource.StateRefreshFunc { +func isIBMPIVolumeDeleteRefreshFunc(client *st.IBMPIVolumeClient, id string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - vol, err := client.Get(id, powerinstanceid, volGetTimeOut) + vol, err := client.Get(id) if err != nil { if strings.Contains(err.Error(), "Resource not found") { return vol, "deleted", nil diff --git a/ibm/resource_ibm_pi_volume_attach.go b/ibm/resource_ibm_pi_volume_attach.go index fe8ed77637..cb358eba89 100644 --- a/ibm/resource_ibm_pi_volume_attach.go +++ b/ibm/resource_ibm_pi_volume_attach.go @@ -4,32 +4,25 @@ package ibm import ( - "errors" - "fmt" + "context" "log" "time" st "github.com/IBM-Cloud/power-go-client/clients/instance" "github.com/IBM-Cloud/power-go-client/helpers" + "github.com/IBM-Cloud/power-go-client/power/models" + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" ) -const ( - - /* Fix for PowerVC taking time to attach volume depending on load*/ - - attachVolumeTimeOut = 240 * time.Second -) - func resourceIBMPIVolumeAttach() *schema.Resource { return &schema.Resource{ - Create: resourceIBMPIVolumeAttachCreate, - Read: resourceIBMPIVolumeAttachRead, - Update: resourceIBMPIVolumeAttachUpdate, - Delete: resourceIBMPIVolumeAttachDelete, - //Exists: resourceIBMPowerVolumeExists, - Importer: &schema.ResourceImporter{}, + CreateContext: resourceIBMPIVolumeAttachCreate, + ReadContext: resourceIBMPIVolumeAttachRead, + UpdateContext: resourceIBMPIVolumeAttachUpdate, + DeleteContext: resourceIBMPIVolumeAttachDelete, + Importer: &schema.ResourceImporter{}, Timeouts: &schema.ResourceTimeout{ Create: schema.DefaultTimeout(60 * time.Minute), @@ -78,70 +71,66 @@ func resourceIBMPIVolumeAttach() *schema.Resource { } } -func resourceIBMPIVolumeAttachCreate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPIVolumeAttachCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, err := meta.(ClientSession).IBMPISession() if err != nil { - return err + return diag.FromErr(err) } name := d.Get(helpers.PIVolumeAttachName).(string) servername := d.Get(helpers.PIInstanceName).(string) powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) - - volinfo, err := client.Get(name, powerinstanceid, getTimeOut) + client := st.NewIBMPIVolumeClient(ctx, sess, powerinstanceid) + volinfo, err := client.Get(name) if err != nil { - return fmt.Errorf("The volume [ %s] cannot be attached since it's not available", name) + return diag.FromErr(err) } //log.Print("The volume info is %s", volinfo) - if volinfo.State == "available" || *volinfo.Shareable == true { + if volinfo.State == "available" || *volinfo.Shareable { log.Printf(" In the current state the volume can be attached to the instance ") } - if volinfo.State == "in-use" && *volinfo.Shareable == true { + if volinfo.State == "in-use" && *volinfo.Shareable { log.Printf("Volume State /Status is permitted and hence attaching the volume to the instance") } - if volinfo.State == helpers.PIVolumeAllowableAttachStatus && *volinfo.Shareable == false { - - return errors.New("The volume cannot be attached in the current state. The volume must be in the *available* state. No other states are permissible") + if volinfo.State == helpers.PIVolumeAllowableAttachStatus && !*volinfo.Shareable { + return diag.Errorf("the volume cannot be attached in the current state. The volume must be in the *available* state. No other states are permissible") } - resp, err := client.Attach(servername, name, powerinstanceid, attachVolumeTimeOut) - + err = client.Attach(servername, name) if err != nil { - return err + return diag.FromErr(err) } - log.Printf("Printing the resp %+v", resp) d.SetId(*volinfo.VolumeID) if err != nil { log.Printf("[DEBUG] err %s", err) - return err + return diag.FromErr(err) } - _, err = isWaitForIBMPIVolumeAttachAvailable(client, d.Id(), powerinstanceid, d.Timeout(schema.TimeoutCreate)) + _, err = isWaitForIBMPIVolumeAttachAvailable(ctx, client, d.Id(), powerinstanceid, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } //return nil - return resourceIBMPIVolumeAttachRead(d, meta) + return resourceIBMPIVolumeAttachRead(ctx, d, meta) } -func resourceIBMPIVolumeAttachRead(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPIVolumeAttachRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, _ := meta.(ClientSession).IBMPISession() powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) servername := d.Get(helpers.PIInstanceName).(string) - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) + client := st.NewIBMPIVolumeClient(ctx, sess, powerinstanceid) - vol, err := client.CheckVolumeAttach(powerinstanceid, servername, d.Id(), getTimeOut) + vol, err := client.CheckVolumeAttach(servername, d.Id()) if err != nil { - return err + return diag.FromErr(err) } //d.SetId(vol.ID.String()) @@ -151,11 +140,11 @@ func resourceIBMPIVolumeAttachRead(d *schema.ResourceData, meta interface{}) err return nil } -func resourceIBMPIVolumeAttachUpdate(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPIVolumeAttachUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, _ := meta.(ClientSession).IBMPISession() powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) + client := st.NewIBMPIVolumeClient(ctx, sess, powerinstanceid) name := "" if d.HasChange(helpers.PIVolumeAttachName) { @@ -165,31 +154,36 @@ func resourceIBMPIVolumeAttachUpdate(d *schema.ResourceData, meta interface{}) e size := float64(d.Get(helpers.PIVolumeSize).(float64)) shareable := bool(d.Get(helpers.PIVolumeShareable).(bool)) - volrequest, err := client.Update(d.Id(), name, size, shareable, powerinstanceid, postTimeOut) + body := &models.UpdateVolume{ + Name: &name, + Size: size, + Shareable: &shareable, + } + volrequest, err := client.UpdateVolume(d.Id(), body) if err != nil { - return err + return diag.FromErr(err) } - _, err = isWaitForIBMPIVolumeAttachAvailable(client, *volrequest.VolumeID, powerinstanceid, d.Timeout(schema.TimeoutCreate)) + _, err = isWaitForIBMPIVolumeAttachAvailable(ctx, client, *volrequest.VolumeID, powerinstanceid, d.Timeout(schema.TimeoutCreate)) if err != nil { - return err + return diag.FromErr(err) } - return resourceIBMPIVolumeRead(d, meta) + return resourceIBMPIVolumeRead(ctx, d, meta) } -func resourceIBMPIVolumeAttachDelete(d *schema.ResourceData, meta interface{}) error { +func resourceIBMPIVolumeAttachDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { sess, _ := meta.(ClientSession).IBMPISession() powerinstanceid := d.Get(helpers.PICloudInstanceId).(string) name := d.Get(helpers.PIVolumeAttachName).(string) servername := d.Get(helpers.PIInstanceName).(string) - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) + client := st.NewIBMPIVolumeClient(ctx, sess, powerinstanceid) log.Printf("the id of the volume to detach is%s ", d.Id()) - _, err := client.Detach(servername, name, powerinstanceid, deleteTimeOut) + err := client.Detach(servername, name) if err != nil { - return err + return diag.FromErr(err) } // wait for power volume states to be back as available. if it's attached it will be in-use @@ -197,7 +191,7 @@ func resourceIBMPIVolumeAttachDelete(d *schema.ResourceData, meta interface{}) e return nil } -func isWaitForIBMPIVolumeAttachAvailable(client *st.IBMPIVolumeClient, id, powerinstanceid string, timeout time.Duration) (interface{}, error) { +func isWaitForIBMPIVolumeAttachAvailable(ctx context.Context, client *st.IBMPIVolumeClient, id, powerinstanceid string, timeout time.Duration) (interface{}, error) { log.Printf("Waiting for Volume (%s) to be available for attachment", id) stateConf := &resource.StateChangeConf{ @@ -209,12 +203,12 @@ func isWaitForIBMPIVolumeAttachAvailable(client *st.IBMPIVolumeClient, id, power Timeout: 10 * time.Minute, } - return stateConf.WaitForState() + return stateConf.WaitForStateContext(ctx) } func isIBMPIVolumeAttachRefreshFunc(client *st.IBMPIVolumeClient, id, powerinstanceid string) resource.StateRefreshFunc { return func() (interface{}, string, error) { - vol, err := client.Get(id, powerinstanceid, getTimeOut) + vol, err := client.Get(id) if err != nil { return nil, "", err } diff --git a/ibm/resource_ibm_pi_volume_test.go b/ibm/resource_ibm_pi_volume_test.go index bcb545b103..38ec7a86e0 100644 --- a/ibm/resource_ibm_pi_volume_test.go +++ b/ibm/resource_ibm_pi_volume_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "log" @@ -54,10 +55,12 @@ func testAccCheckIBMPIVolumeDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_volume" { continue } - parts, err := idParts(rs.Primary.ID) - powerinstanceid := parts[0] - volumeC := st.NewIBMPIVolumeClient(sess, powerinstanceid) - volume, err := volumeC.Get(parts[1], powerinstanceid, volGetTimeOut) + cloudInstanceID, volumeID, err := splitID(rs.Primary.ID) + if err != nil { + return err + } + volumeC := st.NewIBMPIVolumeClient(context.Background(), sess, cloudInstanceID) + volume, err := volumeC.Get(volumeID) if err == nil { log.Println("volume*****", volume.State) return fmt.Errorf("PI Volume still exists: %s", rs.Primary.ID) @@ -83,18 +86,16 @@ func testAccCheckIBMPIVolumeExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, volumeID, err := splitID(rs.Primary.ID) if err != nil { return err } - powerinstanceid := parts[0] - client := st.NewIBMPIVolumeClient(sess, powerinstanceid) + client := st.NewIBMPIVolumeClient(context.Background(), sess, cloudInstanceID) - volume, err := client.Get(parts[1], powerinstanceid, volGetTimeOut) + _, err = client.Get(volumeID) if err != nil { return err } - parts[1] = *volume.VolumeID return nil } diff --git a/ibm/resource_ibm_pi_vpn_connection.go b/ibm/resource_ibm_pi_vpn_connection.go index dedecac137..37c698c8cf 100644 --- a/ibm/resource_ibm_pi_vpn_connection.go +++ b/ibm/resource_ibm_pi_vpn_connection.go @@ -157,11 +157,11 @@ func resourceIBMPIVPNConnectionCreate(ctx context.Context, d *schema.ResourceDat return diag.Errorf("%s is a required field", helpers.PIVPNConnectionPeerSubnets) } - client := st.NewIBMPIVpnConnectionClient(sess, cloudInstanceID) - vpnConnection, err := client.CreateWithContext(ctx, body, cloudInstanceID) + client := st.NewIBMPIVpnConnectionClient(ctx, sess, cloudInstanceID) + vpnConnection, err := client.Create(body) if err != nil { log.Printf("[DEBUG] create VPN connection failed %v", err) - return diag.Errorf(errors.CreateVPNConnectionOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } vpnConnectionId := *vpnConnection.ID @@ -169,11 +169,11 @@ func resourceIBMPIVPNConnectionCreate(ctx context.Context, d *schema.ResourceDat if vpnConnection.JobRef != nil { jobID := *vpnConnection.JobRef.ID - jobClient := st.NewIBMPIJobClient(sess, cloudInstanceID) + jobClient := st.NewIBMPIJobClient(ctx, sess, cloudInstanceID) - _, err = waitForIBMPIJobCompleted(ctx, jobClient, jobID, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) + _, err = waitForIBMPIJobCompleted(ctx, jobClient, jobID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return diag.Errorf(errors.CreateVPNConnectionOperationFailed, cloudInstanceID, err) + return diag.FromErr(err) } } @@ -186,16 +186,13 @@ func resourceIBMPIVPNConnectionUpdate(ctx context.Context, d *schema.ResourceDat return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, vpnConnectionID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - vpnConnectionID := parts[1] - - client := st.NewIBMPIVpnConnectionClient(sess, cloudInstanceID) - jobClient := st.NewIBMPIJobClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnConnectionClient(ctx, sess, cloudInstanceID) + jobClient := st.NewIBMPIJobClient(ctx, sess, cloudInstanceID) if d.HasChangesExcept(helpers.PIVPNConnectionNetworks, helpers.PIVPNConnectionPeerSubnets) { body := &models.VPNConnectionUpdate{} @@ -217,9 +214,9 @@ func resourceIBMPIVPNConnectionUpdate(ctx context.Context, d *schema.ResourceDat body.PeerGatewayAddress = models.PeerGatewayAddress(peerGatewayAddress) } - _, err = client.UpdateWithContext(ctx, body, vpnConnectionID, cloudInstanceID) + _, err = client.Update(vpnConnectionID, body) if err != nil { - return diag.Errorf(errors.UpdateVPNConnectionOperationFailed, vpnConnectionID, err) + return diag.FromErr(err) } } if d.HasChanges(helpers.PIVPNConnectionNetworks) { @@ -231,23 +228,27 @@ func resourceIBMPIVPNConnectionUpdate(ctx context.Context, d *schema.ResourceDat toRemove := old.Difference(new) for _, n := range expandStringList(toAdd.List()) { - jobReference, err := client.AddNetworkWithContext(ctx, vpnConnectionID, n, cloudInstanceID) + jobReference, err := client.AddNetwork(vpnConnectionID, n) if err != nil { - return diag.Errorf("failed to perform the network add operation... %v", err) + return diag.FromErr(err) } - _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, cloudInstanceID, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return diag.Errorf(errors.UpdateVPNConnectionOperationFailed, vpnConnectionID, err) + if jobReference != nil { + _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return diag.FromErr(err) + } } } for _, n := range expandStringList(toRemove.List()) { - jobReference, err := client.DeleteNetworkWithContext(ctx, vpnConnectionID, n, cloudInstanceID) + jobReference, err := client.DeleteNetwork(vpnConnectionID, n) if err != nil { - return diag.Errorf("failed to perform the network delete operation... %v", err) + return diag.FromErr(err) } - _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, cloudInstanceID, d.Timeout(schema.TimeoutUpdate)) - if err != nil { - return diag.Errorf(errors.UpdateVPNConnectionOperationFailed, vpnConnectionID, err) + if jobReference != nil { + _, err = waitForIBMPIJobCompleted(ctx, jobClient, *jobReference.ID, d.Timeout(schema.TimeoutUpdate)) + if err != nil { + return diag.FromErr(err) + } } } @@ -261,15 +262,15 @@ func resourceIBMPIVPNConnectionUpdate(ctx context.Context, d *schema.ResourceDat toRemove := old.Difference(new) for _, s := range expandStringList(toAdd.List()) { - _, err := client.AddSubnetWithContext(ctx, vpnConnectionID, s, cloudInstanceID) + _, err := client.AddSubnet(vpnConnectionID, s) if err != nil { - return diag.Errorf("failed to perform the subnet add operation... %v", err) + return diag.FromErr(err) } } for _, s := range expandStringList(toRemove.List()) { - err := client.DeleteSubnetWithContext(ctx, vpnConnectionID, s, cloudInstanceID) + _, err := client.DeleteSubnet(vpnConnectionID, s) if err != nil { - return diag.Errorf("failed to perform the subnet delete operation... %v", err) + return diag.FromErr(err) } } } @@ -282,25 +283,23 @@ func resourceIBMPIVPNConnectionRead(ctx context.Context, d *schema.ResourceData, return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, vpnConnectionID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - vpnConnectionID := parts[1] - - client := st.NewIBMPIVpnConnectionClient(sess, cloudInstanceID) - vpnConnection, err := client.GetWithContext(ctx, vpnConnectionID, cloudInstanceID) + client := st.NewIBMPIVpnConnectionClient(ctx, sess, cloudInstanceID) + vpnConnection, err := client.Get(vpnConnectionID) if err != nil { - switch err.(type) { + uErr := errors.Unwrap(err) + switch uErr.(type) { case *p_cloud_v_p_n_connections.PcloudVpnconnectionsGetNotFound: log.Printf("[DEBUG] VPN connection does not exist %v", err) d.SetId("") return nil } log.Printf("[DEBUG] get VPN connection failed %v", err) - return diag.Errorf(errors.GetVPNConnectionOperationFailed, vpnConnectionID, err) + return diag.FromErr(err) } d.Set(PIVPNConnectionId, vpnConnection.ID) @@ -339,33 +338,31 @@ func resourceIBMPIVPNConnectionDelete(ctx context.Context, d *schema.ResourceDat return diag.FromErr(err) } - parts, err := idParts(d.Id()) + cloudInstanceID, vpnConnectionID, err := splitID(d.Id()) if err != nil { return diag.FromErr(err) } - cloudInstanceID := parts[0] - vpnConnectionID := parts[1] + client := st.NewIBMPIVpnConnectionClient(ctx, sess, cloudInstanceID) + jobClient := st.NewIBMPIJobClient(ctx, sess, cloudInstanceID) - client := st.NewIBMPIVpnConnectionClient(sess, cloudInstanceID) - jobClient := st.NewIBMPIJobClient(sess, cloudInstanceID) - - jobRef, err := client.DeleteWithContext(ctx, vpnConnectionID, cloudInstanceID) + jobRef, err := client.Delete(vpnConnectionID) if err != nil { - switch err.(type) { + uErr := errors.Unwrap(err) + switch uErr.(type) { case *p_cloud_v_p_n_connections.PcloudVpnconnectionsDeleteNotFound: log.Printf("[DEBUG] VPN connection does not exist %v", err) d.SetId("") return nil } log.Printf("[DEBUG] delete VPN connection failed %v", err) - return diag.Errorf(errors.DeleteVPNConnectionOperationFailed, vpnConnectionID, err) + return diag.FromErr(err) } if jobRef != nil { jobID := *jobRef.ID - _, err = waitForIBMPIJobCompleted(ctx, jobClient, jobID, cloudInstanceID, d.Timeout(schema.TimeoutCreate)) + _, err = waitForIBMPIJobCompleted(ctx, jobClient, jobID, d.Timeout(schema.TimeoutCreate)) if err != nil { - return diag.Errorf(errors.DeleteVPNConnectionOperationFailed, vpnConnectionID, err) + return diag.FromErr(err) } } diff --git a/ibm/resource_ibm_pi_vpn_connection_test.go b/ibm/resource_ibm_pi_vpn_connection_test.go index be65267ac0..87dd5efd6c 100644 --- a/ibm/resource_ibm_pi_vpn_connection_test.go +++ b/ibm/resource_ibm_pi_vpn_connection_test.go @@ -4,6 +4,7 @@ package ibm import ( + "context" "errors" "fmt" "testing" @@ -56,14 +57,12 @@ func testAccCheckIBMPIVPNConnectionDestroy(s *terraform.State) error { if rs.Type != "ibm_pi_vpn_connection" { continue } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, vpnConnectionID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - vpnConnectionID := parts[1] - client := st.NewIBMPIVpnConnectionClient(sess, cloudInstanceID) - _, err = client.Get(vpnConnectionID, cloudInstanceID) + client := st.NewIBMPIVpnConnectionClient(context.Background(), sess, cloudInstanceID) + _, err = client.Get(vpnConnectionID) if err == nil { return fmt.Errorf("vpn connection still exists: %s", rs.Primary.ID) } @@ -84,15 +83,13 @@ func testAccCheckIBMPIVPNConnectionExists(n string) resource.TestCheckFunc { if err != nil { return err } - parts, err := idParts(rs.Primary.ID) + cloudInstanceID, vpnConnectionID, err := splitID(rs.Primary.ID) if err != nil { return err } - cloudInstanceID := parts[0] - vpnConnectionID := parts[1] - client := st.NewIBMPIVpnConnectionClient(sess, cloudInstanceID) + client := st.NewIBMPIVpnConnectionClient(context.Background(), sess, cloudInstanceID) - _, err = client.Get(vpnConnectionID, cloudInstanceID) + _, err = client.Get(vpnConnectionID) if err != nil { return err } diff --git a/website/docs/d/pi_cloud_instance.html.markdown b/website/docs/d/pi_cloud_instance.html.markdown index 97604d5171..9761816c41 100644 --- a/website/docs/d/pi_cloud_instance.html.markdown +++ b/website/docs/d/pi_cloud_instance.html.markdown @@ -40,13 +40,23 @@ Review the argument reference that you can specify for your data source. ## Attribute reference In addition to the argument reference list, you can access the following attribute references after your data source is created. -- `capabilities` - (String) Lists the capabilities for this cloud instance. -- `creation_date` - (String) The date on which the tenant was created. -- `enabled` - (Bool) Indicates whether the tenant is enabled. +- `capabilities` - (String) Lists the capabilities for this cloud instance. +- `enabled` - (Bool) Indicates whether the tenant is enabled. - `id` - (String) The unique identifier for this tenant. -- `tenant_name` - (String) The name of the tenant. -- `total_instances` - (String) The count of lpars that belong to this specific cloud instance. -- `total_memory_consumed` - (String) The total memory consumed by this service instance. -- `total_processors_consumed` - (String) The total processors consumed by this service instance. -- `total_ssd_storage_consumed` - (String) The total SSD Storage consumed by this service instance. -- `total_standard_storage_consumed` - (String) The total Standard Storage consumed by this service instance. +- `pvm_instances` - (List) PVM instances owned by the Cloud Instance. + + Nested scheme for `pvm_instances`: + - `creation_date` - (String) Date/Time of PVM creation. + - `href` - (String) Link to Cloud Instance resource. + - `id` - (String) PVM Instance ID. + - `name` - (String) Name of the server. + - `status` - (String) The status of the instance. + - `systype` - (string) System type used to host the instance. +- `region` - (String) The region the cloud instance lives. +- `tenant_id` - (String) The tenant ID that owns this cloud instance. +- `total_instances` - (String) The count of lpars that belong to this specific cloud instance. +- `total_memory_consumed` - (String) The total memory consumed by this service instance. +- `total_processors_consumed` - (String) The total processors consumed by this service instance. +- `total_ssd_storage_consumed` - (String) The total SSD Storage consumed by this service instance. +- `total_standard_storage_consumed` - (String) The total Standard Storage consumed by this service instance. + diff --git a/website/docs/d/pi_images.html.markdown b/website/docs/d/pi_images.html.markdown index 07ed553210..791e2df2bf 100644 --- a/website/docs/d/pi_images.html.markdown +++ b/website/docs/d/pi_images.html.markdown @@ -44,10 +44,10 @@ In addition to all argument reference list, you can access the following attribu - `image_info` - List of images - A list of all supported images. Nested scheme for `image_info`: - - `href` - (String) The hyper link of an image. - - `id` - (String) The unique identifier of an image. - - `name`- (String) The name of an image. - - `state` - (String) The state of an image. - - `storage_pool` - (String) Storage pool where image resides. - - `storage_type` - (String) The storage type of an image. + - `href` - (String) The hyper link of an image. + - `id` - (String) The unique identifier of an image. + - `name`- (String) The name of an image. + - `state` - (String) The state of an image. + - `storage_pool` - (String) Storage pool where image resides. + - `storage_type` - (String) The storage type of an image. - `image_type` - (String) The identifier of this image type. diff --git a/website/docs/d/pi_instance_ip.html.markdown b/website/docs/d/pi_instance_ip.html.markdown index e7cbbde7c1..85d9510feb 100644 --- a/website/docs/d/pi_instance_ip.html.markdown +++ b/website/docs/d/pi_instance_ip.html.markdown @@ -44,8 +44,9 @@ Review the argument references that you can specify for your data source. In addition to all argument reference list, you can access the following attribute references after your data source is created. - `external_ip` - (String) The external IP of the network that is attached to this instance. -- `ip` - (String) The IP address that is attached to this instance from the subnet. - `id` - (String) The unique identifier of the network. +- `ip` - (String) The IP address that is attached to this instance from the subnet. - `ipoctet` - (String) The IP octet of the network that is attached to this instance. - `macaddress` - (String) The MAC address of the network that is attached to this instance. +- `network_id` - (String) ID of the network. - `type` - (String) The type of the network that is attached to this instance. diff --git a/website/docs/d/pi_instance_volumes.html.markdown b/website/docs/d/pi_instance_volumes.html.markdown index 1b050c98b5..1fc2583b2b 100644 --- a/website/docs/d/pi_instance_volumes.html.markdown +++ b/website/docs/d/pi_instance_volumes.html.markdown @@ -48,12 +48,12 @@ In addition to all argument reference list, you can access the following attribu - `instance_volumes` - List of volumes - List of volumes attached to instance. Nested scheme for `instance_volumes`: - - `bootable`- (Bool) Indicates if the volume is bootable (**true**) or not (**false**). - - `href` - (String) The hyper link of the volume. - - `id` - (String) The unique identifier of the volume. - - `name` - (String) The name of the volume. - - `pool` - (String) Volume pool, name of storage pool where the volume is located. - - `shareable` - (Bool) If set to **true**, the volume can be shared across multiple Power Systems Virtual Server instances. If set to **false**, the volume can be mounted to one instance only. - - `size` - (Integer) The size of this volume in gigabytes. - - `state` - (String) The state of the volume. - - `type` - (String) The disk type that is used for this volume. + - `bootable`- (Bool) Indicates if the volume is boot capable. + - `href` - (String) The hyper link of the volume. + - `id` - (String) The unique identifier of the volume. + - `name` - (String) The name of the volume. + - `pool` - (String) Volume pool, name of storage pool where the volume is located. + - `shareable` - (Bool) Indicates if the volume is shareable between VMs. + - `size` - (Integer) The size of this volume in gigabytes. + - `state` - (String) The state of the volume. + - `type` - (String) The disk type that is used for this volume. diff --git a/website/docs/d/pi_public_network.html.markdown b/website/docs/d/pi_public_network.html.markdown index 0d5ea6c908..9c00c9d0a3 100644 --- a/website/docs/d/pi_public_network.html.markdown +++ b/website/docs/d/pi_public_network.html.markdown @@ -38,7 +38,6 @@ data "ibm_pi_public_network" "ds_public_network" { ## Argument reference Review the argument references that you can specify for your data source. -- `pi_network_name` - (Deprecated, string) The name of the network. - `pi_cloud_instance_id` - (Required, String) The GUID of the service instance associated with an account. ## Attribute reference diff --git a/website/docs/d/pi_tenant.html.markdown b/website/docs/d/pi_tenant.html.markdown index 06fb731559..1376c8540f 100644 --- a/website/docs/d/pi_tenant.html.markdown +++ b/website/docs/d/pi_tenant.html.markdown @@ -44,11 +44,11 @@ Review the argument references that you can specify for your data source. In addition to all argument reference list, you can access the following attribute references after your data source is created. - `creation_date` - (Timestamp) The timestamp when the tenant was created. -- `cloudinstances` - (List) A list with the regions and Power Systems Virtual Server instance IDs that the tenant owns. +- `cloud_instances` - (List) A list with the regions and Power Systems Virtual Server instance IDs that the tenant owns. - Nested scheme for `cloudinstances`: + Nested scheme for `cloud_instances`: - `cloud_instance_id` - (String) The unique identifier of the cloud instance. - `region` - (String) The region of the cloud instance. -- `enabled` - (Bool) If set to **true**, the tenant is enabled for the Power Systems Virtual Server instance ID. If set to **false**, the tenant is not enabled for the instance. +- `enabled` - (Bool) Indicates if the tenant is enabled for the Power Systems Virtual Server instance ID. - `id` - (String) The ID of the tenant. -- `tenantname` - (String) The name of the tenant. +- `tenant_name` - (String) The name of the tenant. diff --git a/website/docs/r/pi_instance.html.markdown b/website/docs/r/pi_instance.html.markdown index df712db58d..02a3a25a86 100644 --- a/website/docs/r/pi_instance.html.markdown +++ b/website/docs/r/pi_instance.html.markdown @@ -50,8 +50,9 @@ resource "ibm_pi_instance" "test-instance" { The `ibm_pi_instance` provides the following [timeouts](https://www.terraform.io/docs/language/resources/syntax.html) configuration options: -- **create** - The creation of the instance is considered failed if no response is received for 60 minutes. -- **delete** - The deletion of the instance is considered failed if no response is received for 60 minutes. +- **create** - The creation of the instance is considered failed if no response is received for 120 minutes. +- **Update** The updation of the instance is considered failed if no response is received for 60 minutes. +- **delete** - The deletion of the instance is considered failed if no response is received for 60 minutes. ## Argument reference diff --git a/website/docs/r/pi_network_port.html.markdown b/website/docs/r/pi_network_port.html.markdown index d9b85350ac..1f0f28a81a 100644 --- a/website/docs/r/pi_network_port.html.markdown +++ b/website/docs/r/pi_network_port.html.markdown @@ -19,8 +19,8 @@ In the following example, you can create an network_port: ```terraform resource "ibm_pi_network_port" "test-network-port" { pi_network_name = "Zone1-CFN" - pi_cloud_instance_id = "51e1879c-bcbe-4ee1-a008-49cdba0eaf60" - pi_network_port_description = "IP Reserved for Oracle RAC " + pi_cloud_instance_id = "51e1879c-bcbe-4ee1-a008-49cdba0eaf60" + pi_network_port_description = "IP Reserved for Oracle RAC " } ``` @@ -47,17 +47,17 @@ ibm_pi_network_port provides the following [timeouts](https://www.terraform.io/d - **delete** - (Default 60 minutes) Used for deleting a network_port. ## Argument reference -Review the argument references that you can specify for your resource. +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_network_name` - (Required, String) Network ID or name. - `pi_network_port_description` - (Optional, String) The description for the Network Port. -- `pi_cloud_instance_id` - (Required, String) The GUID of the service instance associated with an account. -- `pi_instance_name` - (Required, String) The name of the VM. +- `pi_network_port_ipaddress` - (Optional, String) The requested ip address of this port. ## Attribute reference In addition to all argument reference list, you can access the following attribute reference after your resource is created. -- `id` - (String) The unique identifier of the instance. The ID is composed of /. -- `ipaddress` - (String) The unique identifier of the instance. +- `id` - (String) The unique identifier of the instance. The ID is composed of `//`. - `macaddress` - (String) The MAC address of the port. - `portid` - (String) The ID of the port. - `public_ip` - (String) The public IP associated with the port. diff --git a/website/docs/r/pi_snapshot.html.markdown b/website/docs/r/pi_snapshot.html.markdown index e11160022b..59d4885f29 100644 --- a/website/docs/r/pi_snapshot.html.markdown +++ b/website/docs/r/pi_snapshot.html.markdown @@ -43,15 +43,15 @@ resource "ibm_pi_snapshot" "testacc_snapshot"{ The `ibm_pi_snapshot` provides the following [Timeouts](https://www.terraform.io/docs/language/resources/syntax.html) configuration options: - **create** - (Default 60 minutes) Used for Creating snapshot. -- **delete** - (Default 60 minutes) Used for Deleting snapshot. - **update** - (Default 60 minutes) Used for Updating snapshot. +- **delete** - (Default 10 minutes) Used for Deleting snapshot. ## Argument reference Review the argument references that you can specify for your resource. - `pi_instance_name` - (Required, String) The name of the instance you want to take a snapshot of. - `pi_snapshot_name` - (Required, String) The unique name of the snapshot. -- `description` - (Optional, String) The description for the snapshot. +- `pi_description` - (Optional, String) Description of the PVM instance snapshot. - `pi_volume_ids` - (Optional, String) The volume ID, if none provided then all volumes of the instance will be part of the snapshot. - `pi_cloud_instance_id` - (Required, String) The GUID of the service instance associated with an account. @@ -59,7 +59,11 @@ Review the argument references that you can specify for your resource. In addition to all argument reference list, you can access the following attribute reference after your resource is created. - `id` - (String) The unique identifier of the snapshot. The ID is composed of /. -- `volume_snapshots` - (String) A map of the source and target volumes. +- `snapshot_id` - (String) ID of the PVM instance snapshot. +- `status` - (String) Status of the PVM instance snapshot. +- `creation_date` - (String) Creation Date. +- `last_update_date` - (String) Last Update Date. +- `volume_snapshots` - (String) A map of volume snapshots included in the PVM instance snapshot. ## Import diff --git a/website/docs/r/pi_volume.html.markdown b/website/docs/r/pi_volume.html.markdown index d587b444b8..160ed1b8b7 100644 --- a/website/docs/r/pi_volume.html.markdown +++ b/website/docs/r/pi_volume.html.markdown @@ -42,8 +42,9 @@ resource "ibm_pi_volume" "testacc_volume"{ ibm_pi_volume provides the following [timeouts](https://www.terraform.io/docs/language/resources/syntax.html) configuration options: -- **create** - (Default 60 minutes) Used for creating volume. -- **delete** - (Default 60 minutes) Used for deleting volume. +- **create** - (Default 30 minutes) Used for creating volume. +- **update** - (Default 30 minutes) Used for updating volume. +- **delete** - (Default 10 minutes) Used for deleting volume. ## Argument reference Review the argument references that you can specify for your resource.