Skip to content

Commit

Permalink
enhancement(clone): support for backup policy plan clone
Browse files Browse the repository at this point in the history
  • Loading branch information
uibm authored and hkantare committed Feb 20, 2023
1 parent e91be0e commit e01caa9
Show file tree
Hide file tree
Showing 10 changed files with 385 additions and 3 deletions.
16 changes: 16 additions & 0 deletions examples/ibm-is-ng/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,22 @@ resource "ibm_is_backup_policy_plan" "is_backup_policy_plan" {
}
name = "my-backup-policy-plan-1"
}
resource "ibm_is_backup_policy_plan" "is_backup_policy_plan_clone" {
backup_policy_id = ibm_is_backup_policy.is_backup_policy.id
cron_spec = "30 09 * * *"
active = false
attach_user_tags = ["tag2"]
copy_user_tags = true
deletion_trigger {
delete_after = 20
delete_over_count = "20"
}
name = "my-backup-policy-plan-1"
clone_policy {
zones = ["us-south-1", "us-south-2"]
max_snapshots = 3
}
}

data "ibm_is_backup_policies" "is_backup_policies" {
}
Expand Down
36 changes: 36 additions & 0 deletions ibm/service/vpc/data_source_ibm_is_backup_policy_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,25 @@ func DataSourceIBMIsBackupPolicyPlan() *schema.Resource {
Computed: true,
Description: "The lifecycle state of this backup policy plan.",
},
"clone_policy": &schema.Schema{
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"max_snapshots": &schema.Schema{
Type: schema.TypeInt,
Computed: true,
Description: "The maximum number of recent snapshots (per source) that will keep clones.",
},
"zones": &schema.Schema{
Type: schema.TypeSet,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
Description: "The zone this backup policy plan will create snapshot clones in.",
},
},
},
},
"resource_type": &schema.Schema{
Type: schema.TypeString,
Computed: true,
Expand Down Expand Up @@ -170,6 +189,23 @@ func dataSourceIBMIsBackupPolicyPlanRead(context context.Context, d *schema.Reso
return diag.FromErr(fmt.Errorf("[ERROR] Error setting deletion_trigger %s", err))
}
}
if backupPolicyPlan.ClonePolicy != nil {
backupPolicyPlanClonePolicyMap := []map[string]interface{}{}
finalList := map[string]interface{}{}

if backupPolicyPlan.ClonePolicy.MaxSnapshots != nil {
finalList["max_snapshots"] = flex.IntValue(backupPolicyPlan.ClonePolicy.MaxSnapshots)
}
if backupPolicyPlan.ClonePolicy.Zones != nil && len(backupPolicyPlan.ClonePolicy.Zones) != 0 {
zoneList := []string{}
for i := 0; i < len(backupPolicyPlan.ClonePolicy.Zones); i++ {
zoneList = append(zoneList, string(*(backupPolicyPlan.ClonePolicy.Zones[i].Name)))
}
finalList["zones"] = flex.NewStringSet(schema.HashString, zoneList)
}
backupPolicyPlanClonePolicyMap = append(backupPolicyPlanClonePolicyMap, finalList)
d.Set("clone_policy", backupPolicyPlanClonePolicyMap)
}
if err = d.Set("href", backupPolicyPlan.Href); err != nil {
return diag.FromErr(fmt.Errorf("[ERROR] Error setting href: %s", err))
}
Expand Down
46 changes: 46 additions & 0 deletions ibm/service/vpc/data_source_ibm_is_backup_policy_plan_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,43 @@ func TestAccIBMIsBackupPolicyPlanDataSourceBasic(t *testing.T) {
},
})
}
func TestAccIBMIsBackupPolicyPlanDataSourceClonesBasic(t *testing.T) {
vpcname := fmt.Sprintf("tf-vpc-%d", acctest.RandIntRange(10, 100))
name := fmt.Sprintf("tf-instnace-%d", acctest.RandIntRange(10, 100))
subnetname := fmt.Sprintf("tf-subnet-%d", acctest.RandIntRange(10, 100))
sshname := fmt.Sprintf("tf-ssh-%d", acctest.RandIntRange(10, 100))
volname := fmt.Sprintf("tf-vol-%d", acctest.RandIntRange(10, 100))
bakupPolicyName := fmt.Sprintf("tfbakuppolicyname%d", acctest.RandIntRange(10, 100))
bakupPolicyPlanName := fmt.Sprintf("tfbakuppolicyplanname%d", acctest.RandIntRange(10, 100))
cronSpec := strings.TrimSpace(strconv.Itoa(time.Now().UTC().Minute()) + " " + strconv.Itoa(time.Now().UTC().Hour()) + " " + "*" + " " + "*" + " " + "*")
resource.Test(t, resource.TestCase{
PreCheck: func() { acc.TestAccPreCheck(t) },
Providers: acc.TestAccProviders,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccCheckIBMIsBackupPolicyPlanDataSourceConfigClonesBasic(bakupPolicyName, vpcname, subnetname, sshname, volname, name, cronSpec, bakupPolicyPlanName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "id"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "backup_policy_id"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "active"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "attach_user_tags.#"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "copy_user_tags"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "created_at"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "cron_spec"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "deletion_trigger.0.delete_after"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "href"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "lifecycle_state"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "name"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "resource_type"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "clone_policy.0.max_snapshots"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "clone_policy.0.zones.#"),
resource.TestCheckResourceAttr("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "clone_policy.0.zones.0", acc.ISZoneName),
resource.TestCheckResourceAttr("data.ibm_is_backup_policy_plan.is_backup_policy_plan", "clone_policy.0.zones.1", acc.ISZoneName2),
),
},
},
})
}

func testAccCheckIBMIsBackupPolicyPlanDataSourceConfigBasic(backupPolicyName, vpcname, subnetname, sshname, volName, name, cronSpec, bakupPolicyPlanName string) string {

Expand All @@ -58,3 +95,12 @@ func testAccCheckIBMIsBackupPolicyPlanDataSourceConfigBasic(backupPolicyName, vp
}
`)
}
func testAccCheckIBMIsBackupPolicyPlanDataSourceConfigClonesBasic(backupPolicyName, vpcname, subnetname, sshname, volName, name, cronSpec, bakupPolicyPlanName string) string {

return testAccCheckIBMIsBackupPolicyPlanConfigClonesBasic(backupPolicyName, vpcname, subnetname, sshname, volName, name, cronSpec, bakupPolicyPlanName) + fmt.Sprintf(`
data "ibm_is_backup_policy_plan" "is_backup_policy_plan" {
backup_policy_id = ibm_is_backup_policy.is_backup_policy.id
identifier = ibm_is_backup_policy_plan.is_backup_policy_plan[0].backup_policy_plan_id
}
`)
}
37 changes: 37 additions & 0 deletions ibm/service/vpc/data_source_ibm_is_backup_policy_plans.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"log"
"time"

"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"

Expand Down Expand Up @@ -87,6 +88,25 @@ func DataSourceIBMIsBackupPolicyPlans() *schema.Resource {
Computed: true,
Description: "The URL for this backup policy plan.",
},
"clone_policy": &schema.Schema{
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"max_snapshots": &schema.Schema{
Type: schema.TypeInt,
Computed: true,
Description: "The maximum number of recent snapshots (per source) that will keep clones.",
},
"zones": &schema.Schema{
Type: schema.TypeSet,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
Description: "The zone this backup policy plan will create snapshot clones in.",
},
},
},
},
"id": &schema.Schema{
Type: schema.TypeString,
Computed: true,
Expand Down Expand Up @@ -216,6 +236,23 @@ func dataSourceBackupPolicyPlanCollectionPlansToMap(plansItem vpcv1.BackupPolicy
if plansItem.ResourceType != nil {
plansMap["resource_type"] = plansItem.ResourceType
}
if plansItem.ClonePolicy != nil {
backupPolicyPlanClonePolicyMap := []map[string]interface{}{}
finalList := map[string]interface{}{}

if plansItem.ClonePolicy.MaxSnapshots != nil {
finalList["max_snapshots"] = flex.IntValue(plansItem.ClonePolicy.MaxSnapshots)
}
if plansItem.ClonePolicy.Zones != nil && len(plansItem.ClonePolicy.Zones) != 0 {
zoneList := []string{}
for i := 0; i < len(plansItem.ClonePolicy.Zones); i++ {
zoneList = append(zoneList, string(*(plansItem.ClonePolicy.Zones[i].Name)))
}
finalList["zones"] = flex.NewStringSet(schema.HashString, zoneList)
}
backupPolicyPlanClonePolicyMap = append(backupPolicyPlanClonePolicyMap, finalList)
plansMap["clone_policy"] = backupPolicyPlanClonePolicyMap
}

return plansMap
}
Expand Down
49 changes: 49 additions & 0 deletions ibm/service/vpc/data_source_ibm_is_backup_policy_plans_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,45 @@ func TestAccIBMIsBackupPolicyPlansDataSourceBasic(t *testing.T) {
},
})
}
func TestAccIBMIsBackupPolicyPlansDataSourceClonesBasic(t *testing.T) {
vpcname := fmt.Sprintf("tf-vpc-%d", acctest.RandIntRange(10, 100))
name := fmt.Sprintf("tf-instnace-%d", acctest.RandIntRange(10, 100))
subnetname := fmt.Sprintf("tf-subnet-%d", acctest.RandIntRange(10, 100))
sshname := fmt.Sprintf("tf-ssh-%d", acctest.RandIntRange(10, 100))
volname := fmt.Sprintf("tf-vol-%d", acctest.RandIntRange(10, 100))
bakupPolicyName := fmt.Sprintf("tfbakuppolicyname%d", acctest.RandIntRange(10, 100))
bakupPolicyPlanName := fmt.Sprintf("tfbakuppolicyplanname%d", acctest.RandIntRange(10, 100))
cronSpec := strings.TrimSpace(strconv.Itoa(time.Now().UTC().Minute()) + " " + strconv.Itoa(time.Now().UTC().Hour()) + " " + "*" + " " + "*" + " " + "*")
resource.Test(t, resource.TestCase{
PreCheck: func() { acc.TestAccPreCheck(t) },
Providers: acc.TestAccProviders,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccCheckIBMIsBackupPolicyPlansDataSourceConfigClonesBasic(bakupPolicyName, vpcname, subnetname, sshname, volname, name, cronSpec, bakupPolicyPlanName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "id"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "backup_policy_id"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.#"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.active"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.attach_user_tags.#"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.copy_user_tags"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.created_at"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.cron_spec"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.deletion_trigger.0.delete_after"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.href"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.id"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.lifecycle_state"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.name"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.resource_type"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.clone_policy.0.max_snapshots"),
resource.TestCheckResourceAttrSet("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.clone_policy.0.zones.#"),
resource.TestCheckResourceAttr("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.clone_policy.0.zones.0", acc.ISZoneName),
resource.TestCheckResourceAttr("data.ibm_is_backup_policy_plans.is_backup_policy_plans", "plans.0.clone_policy.0.zones.1", acc.ISZoneName2),
),
},
},
})
}

func testAccCheckIBMIsBackupPolicyPlansDataSourceConfigBasic(backupPolicyName, vpcname, subnetname, sshname, volName, name, cronSpec, bakupPolicyPlanName string) string {

Expand All @@ -61,3 +100,13 @@ func testAccCheckIBMIsBackupPolicyPlansDataSourceConfigBasic(backupPolicyName, v
}
`, bakupPolicyPlanName+"-1")
}
func testAccCheckIBMIsBackupPolicyPlansDataSourceConfigClonesBasic(backupPolicyName, vpcname, subnetname, sshname, volName, name, cronSpec, bakupPolicyPlanName string) string {

return testAccCheckIBMIsBackupPolicyPlanConfigClonesBasic(backupPolicyName, vpcname, subnetname, sshname, volName, name, cronSpec, bakupPolicyPlanName) + fmt.Sprintf(`
data "ibm_is_backup_policy_plans" "is_backup_policy_plans" {
depends_on = [ibm_is_backup_policy_plan.is_backup_policy_plan]
backup_policy_id = ibm_is_backup_policy.is_backup_policy.id
name = "%s"
}
`, bakupPolicyPlanName+"-1")
}
87 changes: 87 additions & 0 deletions ibm/service/vpc/resource_ibm_is_backup_policy_plan.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,30 @@ func ResourceIBMIsBackupPolicyPlan() *schema.Resource {
},
},
},
"clone_policy": &schema.Schema{
Type: schema.TypeList,
MaxItems: 1,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"max_snapshots": &schema.Schema{
Type: schema.TypeInt,
Optional: true,
Computed: true,
Description: "The maximum number of recent snapshots (per source) that will keep clones.",
},
"zones": &schema.Schema{
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
Set: flex.ResourceIBMVPCHash,
Computed: true,
Description: "The zone this backup policy plan will create snapshot clones in.",
},
},
},
},
"name": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Expand Down Expand Up @@ -163,6 +187,27 @@ func resourceIBMIsBackupPolicyPlanCreate(context context.Context, d *schema.Reso
if _, ok := d.GetOk("attach_user_tags"); ok {
createBackupPolicyPlanOptions.SetAttachUserTags((flex.ExpandStringList((d.Get("attach_user_tags").(*schema.Set)).List())))
}
if _, ok := d.GetOk("clone_policy"); ok {
backupPolicyPlanClonePolicyPrototype := &vpcv1.BackupPolicyPlanClonePolicyPrototype{}
if zonesOk, ok := d.GetOk("clone_policy.0.zones"); ok {
zonesSet := zonesOk.(*schema.Set)
if zonesSet.Len() != 0 {
zonesbjs := make([]vpcv1.ZoneIdentityIntf, zonesSet.Len())
for i, zone := range zonesSet.List() {
zonestr := zone.(string)
zonesbjs[i] = &vpcv1.ZoneIdentity{
Name: &zonestr,
}
}
backupPolicyPlanClonePolicyPrototype.Zones = zonesbjs
}
}
if maxSnapshotsOk, ok := d.GetOk("clone_policy.0.max_snapshots"); ok {
maxSnapshots := int64(maxSnapshotsOk.(int))
backupPolicyPlanClonePolicyPrototype.MaxSnapshots = &maxSnapshots
}
createBackupPolicyPlanOptions.SetClonePolicy(backupPolicyPlanClonePolicyPrototype)
}
if _, ok := d.GetOk("copy_user_tags"); ok {
createBackupPolicyPlanOptions.SetCopyUserTags(d.Get("copy_user_tags").(bool))
}
Expand Down Expand Up @@ -255,6 +300,24 @@ func resourceIBMIsBackupPolicyPlanRead(context context.Context, d *schema.Resour
}
}

if backupPolicyPlan.ClonePolicy != nil {
backupPolicyPlanClonePolicyMap := []map[string]interface{}{}
finalList := map[string]interface{}{}

if backupPolicyPlan.ClonePolicy.MaxSnapshots != nil {
finalList["max_snapshots"] = flex.IntValue(backupPolicyPlan.ClonePolicy.MaxSnapshots)
}
if backupPolicyPlan.ClonePolicy.Zones != nil && len(backupPolicyPlan.ClonePolicy.Zones) != 0 {
zoneList := []string{}
for i := 0; i < len(backupPolicyPlan.ClonePolicy.Zones); i++ {
zoneList = append(zoneList, string(*(backupPolicyPlan.ClonePolicy.Zones[i].Name)))
}
finalList["zones"] = flex.NewStringSet(schema.HashString, zoneList)
}
backupPolicyPlanClonePolicyMap = append(backupPolicyPlanClonePolicyMap, finalList)
d.Set("clone_policy", backupPolicyPlanClonePolicyMap)
}

if backupPolicyPlan.AttachUserTags != nil {
if err = d.Set("attach_user_tags", backupPolicyPlan.AttachUserTags); err != nil {
return diag.FromErr(fmt.Errorf("[ERROR] Error setting attach_user_tags: %s", err))
Expand Down Expand Up @@ -379,6 +442,30 @@ func resourceIBMIsBackupPolicyPlanUpdate(context context.Context, d *schema.Reso
hasChange = true
}

if d.HasChange("clone_policy") {
backupPolicyPlanClonePolicyPatch := &vpcv1.BackupPolicyPlanClonePolicyPatch{}
if d.HasChange("clone_policy.0.zones") {
zonesOk := d.Get("clone_policy.0.zones")
zonesSet := zonesOk.(*schema.Set)
if zonesSet.Len() != 0 {
zonesbjs := make([]vpcv1.ZoneIdentityIntf, zonesSet.Len())
for i, zone := range zonesSet.List() {
zonestr := zone.(string)
zonesbjs[i] = &vpcv1.ZoneIdentity{
Name: &zonestr,
}
}
backupPolicyPlanClonePolicyPatch.Zones = zonesbjs
}
}
if d.HasChange("clone_policy.0.zones") {
maxSnapshotsOk := d.Get("clone_policy.0.max_snapshots")
maxSnapshots := int64(maxSnapshotsOk.(int))
backupPolicyPlanClonePolicyPatch.MaxSnapshots = &maxSnapshots
}
patchVals.ClonePolicy = backupPolicyPlanClonePolicyPatch
}

if d.HasChange("name") {
patchVals.Name = core.StringPtr(d.Get("name").(string))
hasChange = true
Expand Down
Loading

0 comments on commit e01caa9

Please sign in to comment.