@@ -75,6 +75,41 @@ func ResourceNetappBackupVault() *schema.Resource {
7575 Optional : true ,
7676 Description : `Region in which backup is stored.` ,
7777 },
78+ "backup_retention_policy" : {
79+ Type : schema .TypeList ,
80+ Optional : true ,
81+ Description : `Backup retention policy defining the retention of the backups.` ,
82+ MaxItems : 1 ,
83+ Elem : & schema.Resource {
84+ Schema : map [string ]* schema.Schema {
85+ "backup_minimum_enforced_retention_days" : {
86+ Type : schema .TypeInt ,
87+ Required : true ,
88+ Description : `Minimum retention duration in days for backups in the backup vault.` ,
89+ },
90+ "daily_backup_immutable" : {
91+ Type : schema .TypeBool ,
92+ Optional : true ,
93+ Description : `Indicates if the daily backups are immutable. At least one of daily_backup_immutable, weekly_backup_immutable, monthly_backup_immutable and manual_backup_immutable must be true.` ,
94+ },
95+ "manual_backup_immutable" : {
96+ Type : schema .TypeBool ,
97+ Optional : true ,
98+ Description : `Indicates if the manual backups are immutable. At least one of daily_backup_immutable, weekly_backup_immutable, monthly_backup_immutable and manual_backup_immutable must be true.` ,
99+ },
100+ "monthly_backup_immutable" : {
101+ Type : schema .TypeBool ,
102+ Optional : true ,
103+ Description : `Indicates if the monthly backups are immutable. At least one of daily_backup_immutable, weekly_backup_immutable, monthly_backup_immutable and manual_backup_immutable must be true.` ,
104+ },
105+ "weekly_backup_immutable" : {
106+ Type : schema .TypeBool ,
107+ Optional : true ,
108+ Description : `Indicates if the weekly backups are immutable. At least one of daily_backup_immutable, weekly_backup_immutable, monthly_backup_immutable and manual_backup_immutable must be true.` ,
109+ },
110+ },
111+ },
112+ },
78113 "backup_vault_type" : {
79114 Type : schema .TypeString ,
80115 Computed : true ,
@@ -172,6 +207,12 @@ func resourceNetappBackupVaultCreate(d *schema.ResourceData, meta interface{}) e
172207 } else if v , ok := d .GetOkExists ("backup_region" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (backupRegionProp )) && (ok || ! reflect .DeepEqual (v , backupRegionProp )) {
173208 obj ["backupRegion" ] = backupRegionProp
174209 }
210+ backupRetentionPolicyProp , err := expandNetappBackupVaultBackupRetentionPolicy (d .Get ("backup_retention_policy" ), d , config )
211+ if err != nil {
212+ return err
213+ } else if v , ok := d .GetOkExists ("backup_retention_policy" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (backupRetentionPolicyProp )) && (ok || ! reflect .DeepEqual (v , backupRetentionPolicyProp )) {
214+ obj ["backupRetentionPolicy" ] = backupRetentionPolicyProp
215+ }
175216 labelsProp , err := expandNetappBackupVaultEffectiveLabels (d .Get ("effective_labels" ), d , config )
176217 if err != nil {
177218 return err
@@ -304,6 +345,9 @@ func resourceNetappBackupVaultRead(d *schema.ResourceData, meta interface{}) err
304345 if err := d .Set ("destination_backup_vault" , flattenNetappBackupVaultDestinationBackupVault (res ["destinationBackupVault" ], d , config )); err != nil {
305346 return fmt .Errorf ("Error reading BackupVault: %s" , err )
306347 }
348+ if err := d .Set ("backup_retention_policy" , flattenNetappBackupVaultBackupRetentionPolicy (res ["backupRetentionPolicy" ], d , config )); err != nil {
349+ return fmt .Errorf ("Error reading BackupVault: %s" , err )
350+ }
307351 if err := d .Set ("terraform_labels" , flattenNetappBackupVaultTerraformLabels (res ["labels" ], d , config )); err != nil {
308352 return fmt .Errorf ("Error reading BackupVault: %s" , err )
309353 }
@@ -348,6 +392,12 @@ func resourceNetappBackupVaultUpdate(d *schema.ResourceData, meta interface{}) e
348392 } else if v , ok := d .GetOkExists ("backup_region" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , backupRegionProp )) {
349393 obj ["backupRegion" ] = backupRegionProp
350394 }
395+ backupRetentionPolicyProp , err := expandNetappBackupVaultBackupRetentionPolicy (d .Get ("backup_retention_policy" ), d , config )
396+ if err != nil {
397+ return err
398+ } else if v , ok := d .GetOkExists ("backup_retention_policy" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , backupRetentionPolicyProp )) {
399+ obj ["backupRetentionPolicy" ] = backupRetentionPolicyProp
400+ }
351401 labelsProp , err := expandNetappBackupVaultEffectiveLabels (d .Get ("effective_labels" ), d , config )
352402 if err != nil {
353403 return err
@@ -376,6 +426,10 @@ func resourceNetappBackupVaultUpdate(d *schema.ResourceData, meta interface{}) e
376426 updateMask = append (updateMask , "backupRegion" )
377427 }
378428
429+ if d .HasChange ("backup_retention_policy" ) {
430+ updateMask = append (updateMask , "backupRetentionPolicy" )
431+ }
432+
379433 if d .HasChange ("effective_labels" ) {
380434 updateMask = append (updateMask , "labels" )
381435 }
@@ -545,6 +599,60 @@ func flattenNetappBackupVaultDestinationBackupVault(v interface{}, d *schema.Res
545599 return v
546600}
547601
602+ func flattenNetappBackupVaultBackupRetentionPolicy (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
603+ if v == nil {
604+ return nil
605+ }
606+ original := v .(map [string ]interface {})
607+ if len (original ) == 0 {
608+ return nil
609+ }
610+ transformed := make (map [string ]interface {})
611+ transformed ["backup_minimum_enforced_retention_days" ] =
612+ flattenNetappBackupVaultBackupRetentionPolicyBackupMinimumEnforcedRetentionDays (original ["backupMinimumEnforcedRetentionDays" ], d , config )
613+ transformed ["daily_backup_immutable" ] =
614+ flattenNetappBackupVaultBackupRetentionPolicyDailyBackupImmutable (original ["dailyBackupImmutable" ], d , config )
615+ transformed ["weekly_backup_immutable" ] =
616+ flattenNetappBackupVaultBackupRetentionPolicyWeeklyBackupImmutable (original ["weeklyBackupImmutable" ], d , config )
617+ transformed ["monthly_backup_immutable" ] =
618+ flattenNetappBackupVaultBackupRetentionPolicyMonthlyBackupImmutable (original ["monthlyBackupImmutable" ], d , config )
619+ transformed ["manual_backup_immutable" ] =
620+ flattenNetappBackupVaultBackupRetentionPolicyManualBackupImmutable (original ["manualBackupImmutable" ], d , config )
621+ return []interface {}{transformed }
622+ }
623+ func flattenNetappBackupVaultBackupRetentionPolicyBackupMinimumEnforcedRetentionDays (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
624+ // Handles the string fixed64 format
625+ if strVal , ok := v .(string ); ok {
626+ if intVal , err := tpgresource .StringToFixed64 (strVal ); err == nil {
627+ return intVal
628+ }
629+ }
630+
631+ // number values are represented as float64
632+ if floatVal , ok := v .(float64 ); ok {
633+ intVal := int (floatVal )
634+ return intVal
635+ }
636+
637+ return v // let terraform core handle it otherwise
638+ }
639+
640+ func flattenNetappBackupVaultBackupRetentionPolicyDailyBackupImmutable (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
641+ return v
642+ }
643+
644+ func flattenNetappBackupVaultBackupRetentionPolicyWeeklyBackupImmutable (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
645+ return v
646+ }
647+
648+ func flattenNetappBackupVaultBackupRetentionPolicyMonthlyBackupImmutable (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
649+ return v
650+ }
651+
652+ func flattenNetappBackupVaultBackupRetentionPolicyManualBackupImmutable (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
653+ return v
654+ }
655+
548656func flattenNetappBackupVaultTerraformLabels (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
549657 if v == nil {
550658 return v
@@ -576,6 +684,73 @@ func expandNetappBackupVaultBackupRegion(v interface{}, d tpgresource.TerraformR
576684 return v , nil
577685}
578686
687+ func expandNetappBackupVaultBackupRetentionPolicy (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
688+ l := v .([]interface {})
689+ if len (l ) == 0 || l [0 ] == nil {
690+ return nil , nil
691+ }
692+ raw := l [0 ]
693+ original := raw .(map [string ]interface {})
694+ transformed := make (map [string ]interface {})
695+
696+ transformedBackupMinimumEnforcedRetentionDays , err := expandNetappBackupVaultBackupRetentionPolicyBackupMinimumEnforcedRetentionDays (original ["backup_minimum_enforced_retention_days" ], d , config )
697+ if err != nil {
698+ return nil , err
699+ } else if val := reflect .ValueOf (transformedBackupMinimumEnforcedRetentionDays ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
700+ transformed ["backupMinimumEnforcedRetentionDays" ] = transformedBackupMinimumEnforcedRetentionDays
701+ }
702+
703+ transformedDailyBackupImmutable , err := expandNetappBackupVaultBackupRetentionPolicyDailyBackupImmutable (original ["daily_backup_immutable" ], d , config )
704+ if err != nil {
705+ return nil , err
706+ } else if val := reflect .ValueOf (transformedDailyBackupImmutable ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
707+ transformed ["dailyBackupImmutable" ] = transformedDailyBackupImmutable
708+ }
709+
710+ transformedWeeklyBackupImmutable , err := expandNetappBackupVaultBackupRetentionPolicyWeeklyBackupImmutable (original ["weekly_backup_immutable" ], d , config )
711+ if err != nil {
712+ return nil , err
713+ } else if val := reflect .ValueOf (transformedWeeklyBackupImmutable ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
714+ transformed ["weeklyBackupImmutable" ] = transformedWeeklyBackupImmutable
715+ }
716+
717+ transformedMonthlyBackupImmutable , err := expandNetappBackupVaultBackupRetentionPolicyMonthlyBackupImmutable (original ["monthly_backup_immutable" ], d , config )
718+ if err != nil {
719+ return nil , err
720+ } else if val := reflect .ValueOf (transformedMonthlyBackupImmutable ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
721+ transformed ["monthlyBackupImmutable" ] = transformedMonthlyBackupImmutable
722+ }
723+
724+ transformedManualBackupImmutable , err := expandNetappBackupVaultBackupRetentionPolicyManualBackupImmutable (original ["manual_backup_immutable" ], d , config )
725+ if err != nil {
726+ return nil , err
727+ } else if val := reflect .ValueOf (transformedManualBackupImmutable ); val .IsValid () && ! tpgresource .IsEmptyValue (val ) {
728+ transformed ["manualBackupImmutable" ] = transformedManualBackupImmutable
729+ }
730+
731+ return transformed , nil
732+ }
733+
734+ func expandNetappBackupVaultBackupRetentionPolicyBackupMinimumEnforcedRetentionDays (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
735+ return v , nil
736+ }
737+
738+ func expandNetappBackupVaultBackupRetentionPolicyDailyBackupImmutable (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
739+ return v , nil
740+ }
741+
742+ func expandNetappBackupVaultBackupRetentionPolicyWeeklyBackupImmutable (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
743+ return v , nil
744+ }
745+
746+ func expandNetappBackupVaultBackupRetentionPolicyMonthlyBackupImmutable (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
747+ return v , nil
748+ }
749+
750+ func expandNetappBackupVaultBackupRetentionPolicyManualBackupImmutable (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
751+ return v , nil
752+ }
753+
579754func expandNetappBackupVaultEffectiveLabels (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (map [string ]string , error ) {
580755 if v == nil {
581756 return map [string ]string {}, nil
0 commit comments