Skip to content

Commit

Permalink
Add Volumes Bulk Attach, Detach
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelkad committed May 30, 2024
1 parent f19d2b8 commit 413ad3e
Show file tree
Hide file tree
Showing 13 changed files with 831 additions and 33 deletions.
12 changes: 1 addition & 11 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ toolchain go1.22.3

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-beta14
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 @@ -77,7 +77,6 @@ require (
require (
cloud.google.com/go/kms v1.10.1 // indirect
cloud.google.com/go/monitoring v1.13.0 // indirect
github.com/Bowery/prompt v0.0.0-20190916142128-fa8279994f75 // indirect
github.com/Logicalis/asn1 v0.0.0-20190312173541-d60463189a56 // indirect
github.com/PromonLogicalis/asn1 v0.0.0-20190312173541-d60463189a56 // indirect
github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect
Expand All @@ -96,7 +95,6 @@ require (
github.com/coreos/pkg v0.0.0-20220810130054-c7d1c02cb6cf // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/dchest/bcrypt_pbkdf v0.0.0-20150205184540-83f37f9c154a // indirect
github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185 // indirect
github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
github.com/eapache/go-resiliency v1.4.0 // indirect
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
Expand Down Expand Up @@ -129,7 +127,6 @@ require (
github.com/google/gnostic v0.6.9 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-checkpoint v0.5.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
Expand Down Expand Up @@ -170,7 +167,6 @@ require (
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kardianos/govendor v1.0.9 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/kube-object-storage/lib-bucket-provisioner v0.0.0-20221122204822-d1a8c34382f1 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
Expand All @@ -182,8 +178,6 @@ require (
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
github.com/mitchellh/gox v1.0.1 // indirect
github.com/mitchellh/iochan v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/moby/spdystream v0.2.0 // indirect
Expand Down Expand Up @@ -224,9 +218,6 @@ require (
golang.org/x/term v0.19.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.16.1 // indirect
golang.org/x/tools/cmd/cover v0.1.0-deprecated // indirect
golang.org/x/tools/go/vcs v0.1.0-deprecated // indirect
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19 // indirect
Expand All @@ -250,7 +241,6 @@ replace github.com/dgrijalva/jwt-go v3.2.0+incompatible => github.com/golang-jwt
// add sdk changes.
replace github.com/portworx/sched-ops v0.0.0-20200831185134-3e8010dc7056 => github.com/portworx/sched-ops v0.20.4-openstorage-rc3 // required by rook v1.7


exclude (
github.com/kubernetes-incubator/external-storage v0.20.4-openstorage-rc2
k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible
Expand Down
150 changes: 130 additions & 20 deletions go.sum

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions ibm/acctest/acctest.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ var (
Pi_target_storage_tier string
Pi_volume_clone_task_id string
Pi_resource_group_id string
Pi_instance_id string
)

var (
Expand Down Expand Up @@ -1087,6 +1088,11 @@ func init() {
fmt.Println("[INFO] Set the environment variable PI_PVM_INSTANCE_ID for testing Pi_instance_name resource else it is set to default value 'terraform-test-power'")
}

Pi_instance_id = os.Getenv("PI_PVM_INSTANCE_ID")
if Pi_instance_id == "" {
fmt.Println("[INFO] Set the environment variable PI_PVM_INSTANCE_ID for testing resource else it is not set")
}

Pi_dhcp_id = os.Getenv("PI_DHCP_ID")
if Pi_dhcp_id == "" {
Pi_dhcp_id = "terraform-test-power"
Expand Down
2 changes: 2 additions & 0 deletions ibm/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -1266,6 +1266,8 @@ func Provider() *schema.Provider {
"ibm_pi_volume_group": power.ResourceIBMPIVolumeGroup(),
"ibm_pi_volume_onboarding": power.ResourceIBMPIVolumeOnboarding(),
"ibm_pi_volume": power.ResourceIBMPIVolume(),
"ibm_pi_volumes_attach": power.ResourceIBMPIVolumesAttach(),
"ibm_pi_volumes_detach": power.ResourceIBMPIVolumesDetach(),
"ibm_pi_vpn_connection": power.ResourceIBMPIVPNConnection(),
"ibm_pi_workspace": power.ResourceIBMPIWorkspace(),

Expand Down
4 changes: 4 additions & 0 deletions ibm/service/power/ibm_pi_constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,14 @@ const (
Arg_AffinityVolume = "pi_affinity_volume"
Arg_AntiAffinityInstances = "pi_anti_affinity_instances"
Arg_AntiAffinityVolumes = "pi_anti_affinity_volumes"
Arg_BootVolumeID = "pi_boot_volume_id"
Arg_CloudConnectionName = "pi_cloud_connection_name"
Arg_CloudInstanceID = "pi_cloud_instance_id"
Arg_Datacenter = "pi_datacenter"
Arg_DatacenterZone = "pi_datacenter_zone"
Arg_Description = "pi_description"
Arg_DetachAllVolumes = "pi_detach_all_volumes"
Arg_DetachPrimaryBootVolume = "pi_detach_primary_boot_volume"
Arg_DhcpCidr = "pi_cidr"
Arg_DhcpCloudConnectionID = "pi_cloud_connection_id"
Arg_DhcpDnsServer = "pi_dns_server"
Expand All @@ -24,6 +27,7 @@ const (
Arg_IBMiPHA = "pi_ibmi_pha"
Arg_IBMiRDSUsers = "pi_ibmi_rds_users"
Arg_ImageName = "pi_image_name"
Arg_InstanceID = "pi_instance_id"
Arg_InstanceName = "pi_instance_name"
Arg_KeyName = "pi_key_name"
Arg_LanguageCode = "pi_language_code"
Expand Down
2 changes: 1 addition & 1 deletion ibm/service/power/resource_ibm_pi_shared_processor_pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ func resourceIBMPISharedProcessorPoolUpdate(ctx context.Context, d *schema.Resou
}
if d.HasChange(Arg_SharedProcessorPoolReservedCores) {
reservedCores := int64(d.Get(Arg_SharedProcessorPoolReservedCores).(int))
body.ReservedCores = reservedCores
body.ReservedCores = &reservedCores
}

_, err = client.Update(sppID, body)
Expand Down
139 changes: 139 additions & 0 deletions ibm/service/power/resource_ibm_pi_volumes_attach.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
// Copyright IBM Corp. 2024 All Rights Reserved.
// Licensed under the Mozilla Public License v2.0

package power

import (
"context"
"fmt"
"log"
"strings"
"time"

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"
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func ResourceIBMPIVolumesAttach() *schema.Resource {
return &schema.Resource{
CreateContext: resourceIBMPIVolumesAttachCreate,
ReadContext: resourceIBMPIVolumesAttachRead,
DeleteContext: resourceIBMPIVolumesAttachDelete,
Importer: &schema.ResourceImporter{},

Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(10 * time.Minute),
Delete: schema.DefaultTimeout(10 * time.Minute),
},

Schema: map[string]*schema.Schema{
// Arguments
Arg_CloudInstanceID: {
Description: "The GUID of the service instance associated with an account.",
ForceNew: true,
Required: true,
Type: schema.TypeString,
ValidateFunc: validation.NoZeroValues,
},
Arg_InstanceID: {
Description: "The unique identifier of the instance.",
ForceNew: true,
Required: true,
Type: schema.TypeString,
ValidateFunc: validation.NoZeroValues,
},
Arg_VolumeIDs: {
Description: "List of volumes to be detached from a pi_instance; required if detachAllVolumes is not provided.",
Elem: &schema.Schema{Type: schema.TypeString},
ForceNew: true,
Required: true,
Type: schema.TypeList,
},
Arg_BootVolumeID: {
Description: "Primary Boot Volume Id.",
ForceNew: true,
Optional: true,
Type: schema.TypeString,
},
},
}
}

func resourceIBMPIVolumesAttachCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
sess, err := meta.(conns.ClientSession).IBMPISession()
if err != nil {
return diag.FromErr(err)
}

body := &models.VolumesAttach{}
pvmInstanceID := d.Get(Arg_InstanceID).(string)
cloudInstanceID := d.Get(Arg_CloudInstanceID).(string)

var volumeIDs []string
if _, ok := d.GetOk(Arg_VolumeIDs); ok {
for _, v := range d.Get(Arg_VolumeIDs).([]interface{}) {
volumeIDsItem := v.(string)
volumeIDs = append(volumeIDs, volumeIDsItem)
}
body.VolumeIDs = volumeIDs
}

if _, ok := d.GetOk(Arg_BootVolumeID); ok {
body.BootVolumeID = d.Get(Arg_BootVolumeID).(string)
}
volClient := st.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID)
volinfo, err := volClient.BulkVolumeAttach(pvmInstanceID, body)
if err != nil {
return diag.FromErr(err)
}

log.Printf("[DEBUG] Volumes attach accepted: %s", *volinfo.Summary)

d.SetId(fmt.Sprintf("%s/%s/%s", cloudInstanceID, pvmInstanceID, strings.Join(volumeIDs, "/")))
for _, volumeID := range volumeIDs {
_, err = isWaitForIBMPIVolumeAttachAvailable(ctx, volClient, volumeID, cloudInstanceID, pvmInstanceID, d.Timeout(schema.TimeoutCreate))
if err != nil {
return diag.FromErr(err)
}
}
return resourceIBMPIVolumesAttachRead(ctx, d, meta)
}

func resourceIBMPIVolumesAttachRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
return nil
}

func resourceIBMPIVolumesAttachDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
sess, err := meta.(conns.ClientSession).IBMPISession()
if err != nil {
return diag.FromErr(err)
}
ids, err := flex.IdParts(d.Id())
if err != nil {
return diag.FromErr(err)
}
cloudInstanceID, pvmInstanceID := ids[0], ids[1]
volClient := st.NewIBMPIVolumeClient(ctx, sess, cloudInstanceID)
body := &models.VolumesDetach{
VolumeIDs: ids[2:],
}
volinfo, err := volClient.BulkVolumeDetach(pvmInstanceID, body)
if err != nil {
return diag.FromErr(err)
}
log.Printf("[DEBUG] Volumes delete accepted: %s", *volinfo.Summary)
for _, volumeID := range ids[2:] {
_, err = isWaitForIBMPIVolumeDetach(ctx, volClient, volumeID, cloudInstanceID, pvmInstanceID, d.Timeout(schema.TimeoutDelete))
if err != nil {
return diag.FromErr(err)
}
}

d.SetId("")
return nil
}
Loading

0 comments on commit 413ad3e

Please sign in to comment.