Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add volume clone resource and data source #5019

Merged
merged 15 commits into from
Jan 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -1171,6 +1171,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,
dhirendersingh19 marked this conversation as resolved.
Show resolved Hide resolved
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
Loading