Skip to content

Commit

Permalink
Add volume clone resource and data source (#5019)
Browse files Browse the repository at this point in the history
* Add volume clone resource and data source

* Docs improved

* power-go-client update in go.mod

* feedback resolved

* testcase func renamed

* Resolved conflicts

* feedback resolved renamed targetReplicationEnabled to replicationEnabled

* Alphabetically sorted documentation attributes.

* Improved minor naming convention & docs

* Added some use case scenarios

* Feedback resolved

* Fix: Document formatting

* Making use of the correct cloudInstanceId constant
  • Loading branch information
dhirendersingh19 authored Jan 16, 2024
1 parent 7fc2c5a commit d4c803b
Show file tree
Hide file tree
Showing 14 changed files with 627 additions and 16 deletions.
14 changes: 14 additions & 0 deletions ibm/acctest/acctest.go
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@ var (
PiStoragePool string
PiStorageType string
Pi_shared_processor_pool_id string
Pi_target_storage_tier string
Pi_volume_clone_task_id string
Pi_resource_group_id string
)

Expand Down Expand Up @@ -1092,6 +1094,18 @@ func init() {
fmt.Println("[WARN] Set the environment variable PI_SHARED_PROCESSOR_POOL_ID for testing ibm_pi_shared_processor_pool resource else it is set to default value 'tf-pi-shared-processor-pool'")
}

Pi_target_storage_tier = os.Getenv("PI_TARGET_STORAGE_TIER")
if Pi_target_storage_tier == "" {
Pi_target_storage_tier = "terraform-test-tier"
fmt.Println("[INFO] Set the environment variable PI_TARGET_STORAGE_TIER for testing Pi_target_storage_tier resource else it is set to default value 'terraform-test-tier'")
}

Pi_volume_clone_task_id = os.Getenv("PI_VOLUME_CLONE_TASK_ID")
if Pi_volume_clone_task_id == "" {
Pi_volume_clone_task_id = "terraform-test-volume-clone-task-id"
fmt.Println("[INFO] Set the environment variable PI_VOLUME_CLONE_TASK_ID for testing Pi_volume_clone_task_id resource else it is set to default value 'terraform-test-volume-clone-task-id'")
}

Pi_resource_group_id = os.Getenv("PI_RESOURCE_GROUP_ID")
if Pi_resource_group_id == "" {
Pi_resource_group_id = ""
Expand Down
4 changes: 4 additions & 0 deletions ibm/flex/structures.go
Original file line number Diff line number Diff line change
Expand Up @@ -1193,6 +1193,10 @@ func PtrToString(s string) *string {
return &s
}

func PtrToBool(b bool) *bool {
return &b
}

func IntValue(i64 *int64) (i int) {
if i64 != nil {
i = int(*i64)
Expand Down
2 changes: 2 additions & 0 deletions ibm/provider/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,7 @@ func Provider() *schema.Provider {
"ibm_pi_system_pools": power.DataSourceIBMPISystemPools(),
"ibm_pi_tenant": power.DataSourceIBMPITenant(),
"ibm_pi_volume": power.DataSourceIBMPIVolume(),
"ibm_pi_volume_clone": power.DataSourceIBMPIVolumeClone(),
"ibm_pi_volume_group": power.DataSourceIBMPIVolumeGroup(),
"ibm_pi_volume_groups": power.DataSourceIBMPIVolumeGroups(),
"ibm_pi_volume_group_details": power.DataSourceIBMPIVolumeGroupDetails(),
Expand Down Expand Up @@ -1164,6 +1165,7 @@ func Provider() *schema.Provider {
"ibm_pi_volume": power.ResourceIBMPIVolume(),
"ibm_pi_volume_onboarding": power.ResourceIBMPIVolumeOnboarding(),
"ibm_pi_volume_group": power.ResourceIBMPIVolumeGroup(),
"ibm_pi_volume_clone": power.ResourceIBMPIVolumeClone(),
"ibm_pi_volume_group_action": power.ResourceIBMPIVolumeGroupAction(),
"ibm_pi_network": power.ResourceIBMPINetwork(),
"ibm_pi_instance": power.ResourceIBMPIInstance(),
Expand Down
78 changes: 78 additions & 0 deletions ibm/service/power/data_source_ibm_pi_volume_clone.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// Copyright IBM Corp. 2024 All Rights Reserved.
// Licensed under the Mozilla Public License v2.0

package power

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"

st "github.com/IBM-Cloud/power-go-client/clients/instance"
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
)

func DataSourceIBMPIVolumeClone() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceIBMPIVolumeCloneRead,
Schema: map[string]*schema.Schema{
PIVolumeCloneTaskID: {
Type: schema.TypeString,
Required: true,
Description: "The ID of the volume clone task.",
ValidateFunc: validation.NoZeroValues,
},
Arg_CloudInstanceID: {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.NoZeroValues,
Description: "The GUID of the service instance associated with an account.",
},
// Computed attributes
"cloned_volumes": clonedVolumesSchema(),
"failure_reason": {
Type: schema.TypeString,
Computed: true,
Description: "The reason the clone volumes task has failed.",
},
"percent_complete": {
Type: schema.TypeInt,
Computed: true,
Description: "The completion percentage of the volume clone task.",
},
"status": {
Type: schema.TypeString,
Computed: true,
Description: "The status of the volume clone task.",
},
},
}
}

func dataSourceIBMPIVolumeCloneRead(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)
client := st.NewIBMPICloneVolumeClient(ctx, sess, cloudInstanceID)
volClone, err := client.Get(d.Get(PIVolumeCloneTaskID).(string))
if err != nil {
return diag.FromErr(err)
}

d.SetId(d.Get(PIVolumeCloneTaskID).(string))
if volClone.Status != nil {
d.Set("status", *volClone.Status)
}
d.Set("failure_reason", volClone.FailedReason)
if volClone.PercentComplete != nil {
d.Set("percent_complete", *volClone.PercentComplete)
}
d.Set("cloned_volumes", flattenClonedVolumes(volClone.ClonedVolumes))

return nil
}
38 changes: 38 additions & 0 deletions ibm/service/power/data_source_ibm_pi_volume_clone_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// Copyright IBM Corp. 2024 All Rights Reserved.
// Licensed under the Mozilla Public License v2.0

package power_test

import (
"fmt"
"testing"

acc "github.com/IBM-Cloud/terraform-provider-ibm/ibm/acctest"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccIBMPIVolumeClone_basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { acc.TestAccPreCheck(t) },
Providers: acc.TestAccProviders,
Steps: []resource.TestStep{
{
Config: testAccCheckIBMPIVolumeCloneBasicConfig(),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.ibm_pi_volume_clone.testacc_ds_volume_clone", "id"),
resource.TestCheckResourceAttrSet("data.ibm_pi_volume_clone.testacc_ds_volume_clone", "status"),
),
},
},
})
}

func testAccCheckIBMPIVolumeCloneBasicConfig() string {
return fmt.Sprintf(`
data "ibm_pi_volume_clone" "testacc_ds_volume_clone" {
pi_volume_clone_task_id = "%s"
pi_cloud_instance_id = "%s"
}`, acc.Pi_volume_clone_task_id, acc.Pi_cloud_instance_id)

}
11 changes: 10 additions & 1 deletion ibm/service/power/ibm_pi_constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,20 @@ const (
PIPlacementGroupMembers = "members"

// Volume
PIVolumeIds = "pi_volume_ids"
PIAffinityPolicy = "pi_affinity_policy"
PIAffinityVolume = "pi_affinity_volume"
PIAffinityInstance = "pi_affinity_instance"
PIAntiAffinityInstances = "pi_anti_affinity_instances"
PIAntiAffinityVolumes = "pi_anti_affinity_volumes"

// Volume Clone
PIVolumeCloneName = "pi_volume_clone_name"
PIVolumeCloneTaskID = "pi_volume_clone_task_id"
PITargetStorageTier = "pi_target_storage_tier"

// IBM PI Volume Group
PIVolumeGroupName = "pi_volume_group_name"
PIVolumeGroupsVolumeIds = "pi_volume_ids"
PIVolumeGroupConsistencyGroupName = "pi_consistency_group_name"
PIVolumeGroupID = "pi_volume_group_id"
PIVolumeGroupAction = "pi_volume_group_action"
Expand Down Expand Up @@ -149,6 +154,10 @@ const (
SctionStart = "start"
SctionStop = "stop"

// volume clone task status
VolumeCloneCompleted = "completed"
VolumeCloneRunning = "running"

// Workspaces
Attr_WorkspaceCapabilities = "pi_workspace_capabilities"
Attr_WorkspaceDetails = "pi_workspace_details"
Expand Down
10 changes: 4 additions & 6 deletions ibm/service/power/resource_ibm_pi_volume.go
Original file line number Diff line number Diff line change
Expand Up @@ -364,14 +364,12 @@ func resourceIBMPIVolumeUpdate(ctx context.Context, d *schema.ResourceData, meta
}

if d.HasChanges(helpers.PIReplicationEnabled, helpers.PIVolumeType) {
var replicationEnabled bool
volActionBody := models.VolumeAction{}
if v, ok := d.GetOk(helpers.PIReplicationEnabled); ok {
replicationEnabled = v.(bool)
volActionBody.ReplicationEnabled = &replicationEnabled
if d.HasChange(helpers.PIReplicationEnabled) {
volActionBody.ReplicationEnabled = flex.PtrToBool(d.Get(helpers.PIReplicationEnabled).(bool))
}
if v, ok := d.GetOk(helpers.PIVolumeType); ok {
volActionBody.TargetStorageTier = flex.PtrToString(v.(string))
if d.HasChange(helpers.PIVolumeType) {
volActionBody.TargetStorageTier = flex.PtrToString(d.Get(helpers.PIVolumeType).(string))
}
err = client.VolumeAction(volumeID, &volActionBody)
if err != nil {
Expand Down
Loading

0 comments on commit d4c803b

Please sign in to comment.