Skip to content

Commit

Permalink
Add bulk volumes delete
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelkad committed Apr 24, 2024
1 parent 6c7c7d9 commit ee8aa42
Show file tree
Hide file tree
Showing 7 changed files with 214 additions and 3 deletions.
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand Down Expand Up @@ -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=
Expand Down
1 change: 1 addition & 0 deletions ibm/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(),

Expand Down
1 change: 1 addition & 0 deletions ibm/service/power/ibm_pi_constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
86 changes: 86 additions & 0 deletions ibm/service/power/resource_ibm_pi_volumes_delete.go
Original file line number Diff line number Diff line change
@@ -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
}
71 changes: 71 additions & 0 deletions ibm/service/power/resource_ibm_pi_volumes_delete_test.go
Original file line number Diff line number Diff line change
@@ -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
}
49 changes: 49 additions & 0 deletions website/docs/r/pi_volumes_delete.html.markdown
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit ee8aa42

Please sign in to comment.