diff --git a/go.mod b/go.mod index a7a84d94c5..2d950e449c 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.19 require ( github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240216115622-a311507b4b5b - github.com/IBM-Cloud/power-go-client v1.6.0 + github.com/IBM-Cloud/power-go-client v1.6.0-beta9 github.com/IBM/apigateway-go-sdk v0.0.0-20210714141226-a5d5d49caaca github.com/IBM/appconfiguration-go-admin-sdk v0.3.0 github.com/IBM/appid-management-go-sdk v0.0.0-20210908164609-dd0e0eaf732f @@ -65,6 +65,7 @@ require ( github.com/IBM/go-sdk-core v1.1.0 github.com/IBM/mqcloud-go-sdk v0.0.4 github.com/IBM/sarama v1.41.2 + github.com/IBM/vmware-go-sdk v0.1.2 github.com/stretchr/testify v1.9.0 k8s.io/utils v0.0.0-20230313181309-38a27ef9d749 sigs.k8s.io/controller-runtime v0.14.1 diff --git a/go.sum b/go.sum index a0397807cc..2ab9af1655 100644 --- a/go.sum +++ b/go.sum @@ -106,8 +106,8 @@ github.com/IBM-Cloud/bluemix-go v0.0.0-20240402122236-5c5b994a3f1a/go.mod h1:/7h github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240216115622-a311507b4b5b h1:Wnq0BuprazpP41+nQlRpxpmAs8+8jyOqU50KrvFdJQ4= github.com/IBM-Cloud/container-services-go-sdk v0.0.0-20240216115622-a311507b4b5b/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.6.0 h1:X+QX+WSF66+aouyaf4r+IeBLXUurAJj9+Bd+vH7G5I0= -github.com/IBM-Cloud/power-go-client v1.6.0/go.mod h1:0ad5Lcq1utoYVJx0uqooMjCpUaYaK0ItP9QJYtY6k0Y= +github.com/IBM-Cloud/power-go-client v1.6.0-beta9 h1:yMF53vAVoxapFEqJEIFCqx8bAjC/ZA6gbPqId3Gj4NI= +github.com/IBM-Cloud/power-go-client v1.6.0-beta9/go.mod h1:ucyaXsQxyssFFIbWT01uAA5784aKcU7u+q31yu04Rs4= 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= @@ -172,6 +172,8 @@ github.com/IBM/schematics-go-sdk v0.2.3 h1:lgTt0Sbudii3cuSk1YSQgrtiZAXDbBABAoVj3 github.com/IBM/schematics-go-sdk v0.2.3/go.mod h1:Tw2OSAPdpC69AxcwoyqcYYaGTTW6YpERF9uNEU+BFRQ= github.com/IBM/secrets-manager-go-sdk/v2 v2.0.4 h1:xa9e+POVqaXxXHXkSMCOVAbKdUNEu86jQmo5hcpd+L4= github.com/IBM/secrets-manager-go-sdk/v2 v2.0.4/go.mod h1:5gq8D8uWOIbqOm1uztay6lpOysgJaxxEsaVZLWGWb40= +github.com/IBM/vmware-go-sdk v0.1.2 h1:5lKWFyInWz9e2hwGsoFTEoLa1jYkD30SReN0fQ10w9M= +github.com/IBM/vmware-go-sdk v0.1.2/go.mod h1:2UGPBJju3jiv5VKKBBm9a5L6bzF/aJdKOKAzJ7HaOjA= github.com/IBM/vpc-beta-go-sdk v0.6.0 h1:wfM3AcW3zOM3xsRtZ+EA6+sESlGUjQ6Yf4n5QQyz4uc= github.com/IBM/vpc-beta-go-sdk v0.6.0/go.mod h1:fzHDAQIqH/5yJmYsKodKHLcqxMDT+yfH6vZjdiw8CQA= github.com/IBM/vpc-go-sdk v0.50.0 h1:+vnXYK0FXFXYqaS/5/X1XEqH0bbRotkzkerRk21ZEjE= diff --git a/ibm/provider/provider.go b/ibm/provider/provider.go index 9c81232548..6528d9763d 100644 --- a/ibm/provider/provider.go +++ b/ibm/provider/provider.go @@ -1219,6 +1219,7 @@ func Provider() *schema.Provider { "ibm_pi_volume_group": power.ResourceIBMPIVolumeGroup(), "ibm_pi_volume_onboarding": power.ResourceIBMPIVolumeOnboarding(), "ibm_pi_volume": power.ResourceIBMPIVolume(), + "ibm_pi_volumes_delete": power.ResourceIBMPIVolumesDelete(), "ibm_pi_vpn_connection": power.ResourceIBMPIVPNConnection(), "ibm_pi_workspace": power.ResourceIBMPIWorkspace(), diff --git a/ibm/service/power/ibm_pi_constants.go b/ibm/service/power/ibm_pi_constants.go index 8cb883ed13..c2c74a6098 100644 --- a/ibm/service/power/ibm_pi_constants.go +++ b/ibm/service/power/ibm_pi_constants.go @@ -41,6 +41,7 @@ const ( Arg_StorageType = "pi_storage_type" Arg_VolumeGroupID = "pi_volume_group_id" Arg_VolumeID = "pi_volume_id" + Arg_VolumeIDs = "pi_volume_ids" Arg_VolumeName = "pi_volume_name" Arg_VolumeOnboardingID = "pi_volume_onboarding_id" Arg_VTL = "vtl" diff --git a/ibm/service/power/resource_ibm_pi_volumes_delete.go b/ibm/service/power/resource_ibm_pi_volumes_delete.go new file mode 100644 index 0000000000..be232f4486 --- /dev/null +++ b/ibm/service/power/resource_ibm_pi_volumes_delete.go @@ -0,0 +1,86 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "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/power/models" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" +) + +func ResourceIBMPIVolumesDelete() *schema.Resource { + return &schema.Resource{ + CreateContext: resourceIBMPIVolumesDeleteCreate, + ReadContext: resourceIBMPIVolumesDeleteRead, + DeleteContext: resourceIBMPIVolumesDeleteDelete, + Importer: &schema.ResourceImporter{}, + + Schema: map[string]*schema.Schema{ + Arg_CloudInstanceID: { + Description: "The GUID of the service instance associated with an account.", + ForceNew: true, + Required: true, + Type: schema.TypeString, + }, + Arg_VolumeIDs: { + Description: "List of volumes to be deleted.", + Elem: &schema.Schema{Type: schema.TypeString}, + ForceNew: true, + Required: true, + Type: schema.TypeList, + }, + }, + } +} + +func resourceIBMPIVolumesDeleteCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + sess, err := meta.(conns.ClientSession).IBMPISession() + if err != nil { + return diag.FromErr(err) + } + + cloudInstanceID := d.Get(Arg_CloudInstanceID).(string) + var volumeIDs []string + for _, v := range d.Get(Arg_VolumeIDs).([]interface{}) { + volumeIDsItem := v.(string) + volumeIDs = append(volumeIDs, volumeIDsItem) + } + body := &models.VolumesDelete{ + VolumeIDs: volumeIDs, + } + volClient := st.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID) + volinfo, err := volClient.BulkVolumeDelete(body) + if err != nil { + return diag.FromErr(err) + } + + log.Printf("[DEBUG] Volumes delete accepted: %s", volinfo.Summary) + + for _, v := range d.Get(Arg_VolumeIDs).([]interface{}) { + _, err = isWaitForIBMPIVolumeDeleted(ctx, volClient, v.(string), d.Timeout(schema.TimeoutDelete)) + if err != nil { + return diag.FromErr(err) + } + } + d.SetId(fmt.Sprintf("%s/%s", cloudInstanceID, strings.Join(volumeIDs, "/"))) + + return nil +} + +func resourceIBMPIVolumesDeleteRead(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + return nil +} + +func resourceIBMPIVolumesDeleteDelete(context context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { + d.SetId("") + return nil +} diff --git a/ibm/service/power/resource_ibm_pi_volumes_delete_test.go b/ibm/service/power/resource_ibm_pi_volumes_delete_test.go new file mode 100644 index 0000000000..27fdac1927 --- /dev/null +++ b/ibm/service/power/resource_ibm_pi_volumes_delete_test.go @@ -0,0 +1,71 @@ +// Copyright IBM Corp. 2024 All Rights Reserved. +// Licensed under the Mozilla Public License v2.0 + +package power_test + +import ( + "context" + "fmt" + "log" + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/v2/terraform" + + st "github.com/IBM-Cloud/power-go-client/clients/instance" + acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" + "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex" +) + +func TestAccIBMPIVolumesDeleteBasic(t *testing.T) { + + resource.Test(t, resource.TestCase{ + PreCheck: func() { acc.TestAccPreCheck(t) }, + Providers: acc.TestAccProviders, + CheckDestroy: testAccCheckIBMPIVolumesDeleteDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckIBMPIVolumesDeleteConfigBasic(), + Check: resource.ComposeAggregateTestCheckFunc( + resource.TestCheckResourceAttr("ibm_pi_volumes_delete.volumes_delete", "pi_cloud_instance_id", acc.Pi_cloud_instance_id), + ), + }, + }, + }) +} + +func testAccCheckIBMPIVolumesDeleteConfigBasic() string { + return fmt.Sprintf(` + resource "ibm_pi_volumes_delete" "volumes_delete" { + pi_cloud_instance_id = "%s" + pi_volume_ids = ["c1dc81e9-85f0-4e32-8c58-f22cc96a0037", "61b26eb2-50be-40b4-bda7-3c9b1662a742"] + } + `, acc.Pi_cloud_instance_id) +} + +func testAccCheckIBMPIVolumesDeleteDestroy(s *terraform.State) error { + sess, err := acc.TestAccProvider.Meta().(conns.ClientSession).IBMPISession() + if err != nil { + return err + } + for _, rs := range s.RootModule().Resources { + if rs.Type != "ibm_pi_volumes_delete" { + continue + } + parts, err := flex.IdParts(rs.Primary.ID) + if err != nil { + return err + } + volumeC := st.NewIBMPIVolumeClient(context.Background(), sess, parts[0]) + for _, volumeID := range parts[1:] { + volume, err := volumeC.Get(volumeID) + if err == nil { + log.Println("volume*****", volume.State) + return fmt.Errorf("PI Volume still exists: %s", rs.Primary.ID) + } + } + } + + return nil +} diff --git a/website/docs/r/pi_volumes_delete.html.markdown b/website/docs/r/pi_volumes_delete.html.markdown new file mode 100644 index 0000000000..d11224457b --- /dev/null +++ b/website/docs/r/pi_volumes_delete.html.markdown @@ -0,0 +1,49 @@ +--- +subcategory: "Power Systems" +layout: "ibm" +page_title: "IBM : ibm_pi_volumes_attach" +description: |- + Manages volumes in Power Virtual Server cloud. +--- + +# ibm_pi_volumes_delete + +Delete multiple volumes for a Power Systems Virtual Server resources, see [volumes](https://cloud.ibm.com/apidocs/power-cloud#pcloud-v2-pvminstances-volumes-post) + +## Example Usage + +```terraform +resource "ibm_pi_volumes_delete" "pi_volumes_delete_instance" { + pi_cloud_instance_id = "cloud_instance_id" + pi_volume_ids = ["600850d6-4b38-40cf-857d-5e84147bdf89","d783bb14-efeb-4ded-9847-75a53481b60c"] +} +``` + +## Notes + +* Please find [supported Regions](https://cloud.ibm.com/apidocs/power-cloud#endpoint) for endpoints. +* If a Power cloud instance is provisioned at `lon04`, The provider level attributes should be as follows: + * `region` - `lon` + * `zone` - `lon04` + + Example usage: + + ```terraform + provider "ibm" { + region = "lon" + zone = "lon04" + } + ``` + +## Timeouts + +pi_volumes_attach provides the following [Timeouts](https://www.terraform.io/docs/configuration/resources.html#timeouts) configuration options: + +* `delete` - (Default 30 minutes) Used for deleting volumes in power virtual server. + +## Argument Reference + +You can specify the following arguments for this resource. + +* `pi_cloud_instance_id` - (Required, Forces new resource, String) The GUID of the service instance associated with an account. +* `pi_volume_ids` - (Required, Forces new resource, List) List of volumes to be deleted.