alicloud/resource_alicloud_db_backup_policy.go (313 lines of code) (raw):
package alicloud
import (
"strings"
"time"
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)
func resourceAlicloudDBBackupPolicy() *schema.Resource {
return &schema.Resource{
Create: resourceAlicloudDBBackupPolicyCreate,
Read: resourceAlicloudDBBackupPolicyRead,
Update: resourceAlicloudDBBackupPolicyUpdate,
Delete: resourceAlicloudDBBackupPolicyDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Schema: map[string]*schema.Schema{
"instance_id": {
Type: schema.TypeString,
ForceNew: true,
Required: true,
},
"backup_period": {
Type: schema.TypeSet,
Elem: &schema.Schema{Type: schema.TypeString},
Optional: true,
Computed: true,
Deprecated: "Attribute 'backup_period' has been deprecated from version 1.69.0. Use `preferred_backup_period` instead",
},
"preferred_backup_period": {
Type: schema.TypeSet,
Elem: &schema.Schema{Type: schema.TypeString},
// terraform does not support ValidateFunc of TypeList attr
// ValidateFunc: validateAllowedStringValue([]string{"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}),
Optional: true,
Computed: true,
},
"backup_time": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice(BACKUP_TIME, false),
Optional: true,
Computed: true,
Deprecated: "Attribute 'backup_time' has been deprecated from version 1.69.0. Use `preferred_backup_time` instead",
},
"preferred_backup_time": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice(BACKUP_TIME, false),
Optional: true,
Default: "02:00Z-03:00Z",
},
"retention_period": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
Deprecated: "Attribute 'retention_period' has been deprecated from version 1.69.0. Use `backup_retention_period` instead",
},
"backup_retention_period": {
Type: schema.TypeInt,
Optional: true,
Default: 7,
},
"log_backup": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
Deprecated: "Attribute 'log_backup' has been deprecated from version 1.68.0. Use `enable_backup_log` instead",
},
"enable_backup_log": {
Type: schema.TypeBool,
Computed: true,
Optional: true,
},
"log_retention_period": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
DiffSuppressFunc: logRetentionPeriodDiffSuppressFunc,
Deprecated: "Attribute 'log_retention_period' has been deprecated from version 1.69.0. Use `log_backup_retention_period` instead",
},
"log_backup_retention_period": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
DiffSuppressFunc: logRetentionPeriodDiffSuppressFunc,
},
"local_log_retention_hours": {
Type: schema.TypeInt,
ValidateFunc: validation.IntBetween(0, 7*24),
Computed: true,
Optional: true,
DiffSuppressFunc: enableBackupLogDiffSuppressFunc,
},
"local_log_retention_space": {
Type: schema.TypeInt,
ValidateFunc: validation.IntBetween(0, 50),
Computed: true,
Optional: true,
DiffSuppressFunc: enableBackupLogDiffSuppressFunc,
},
"high_space_usage_protection": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"Enable", "Disable"}, false),
Default: "Enable",
Optional: true,
DiffSuppressFunc: enableBackupLogDiffSuppressFunc,
},
"log_backup_frequency": {
Type: schema.TypeString,
Computed: true,
Optional: true,
},
"compress_type": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"1", "4", "8"}, false),
Computed: true,
Optional: true,
},
"archive_backup_retention_period": {
Type: schema.TypeInt,
Computed: true,
Optional: true,
DiffSuppressFunc: archiveBackupPeriodDiffSuppressFunc,
},
"archive_backup_keep_count": {
Type: schema.TypeInt,
ValidateFunc: validation.IntBetween(1, 31),
Computed: true,
Optional: true,
DiffSuppressFunc: enableBackupLogDiffSuppressFunc,
},
"archive_backup_keep_policy": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"ByMonth", "ByWeek", "KeepAll"}, false),
Computed: true,
Optional: true,
DiffSuppressFunc: enableBackupLogDiffSuppressFunc,
},
"released_keep_policy": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{"None", "Lastest", "All"}, false),
Optional: true,
Computed: true,
},
"category": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: validation.StringInSlice([]string{"Flash", "Standard"}, false),
},
"backup_interval": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: validation.StringInSlice([]string{"-1", "15", "30", "60", "120", "180", "240", "360", "480", "720"}, false),
},
"backup_priority": {
Type: schema.TypeInt,
Optional: true,
ValidateFunc: IntBetween(1, 2),
},
"enable_increment_data_backup": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
"log_backup_local_retention_number": {
Type: schema.TypeInt,
Computed: true,
ValidateFunc: validation.Any(IntBetween(6, 100), IntInSlice([]int{-1})),
Optional: true,
},
"backup_method": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: StringInSlice([]string{"Physical", "Snapshot"}, false),
},
},
}
}
func resourceAlicloudDBBackupPolicyCreate(d *schema.ResourceData, meta interface{}) error {
d.SetId(d.Get("instance_id").(string))
return resourceAlicloudDBBackupPolicyUpdate(d, meta)
}
func resourceAlicloudDBBackupPolicyRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
rdsService := RdsService{client}
object, err := rdsService.DescribeBackupPolicy(d.Id())
if err != nil {
if NotFoundError(err) {
d.SetId("")
return nil
}
return WrapError(err)
}
d.Set("instance_id", d.Id())
d.Set("backup_time", object["PreferredBackupTime"])
d.Set("backup_period", strings.Split(object["PreferredBackupPeriod"].(string), ","))
d.Set("retention_period", formatInt(object["BackupRetentionPeriod"]))
d.Set("preferred_backup_time", object["PreferredBackupTime"])
d.Set("preferred_backup_period", strings.Split(object["PreferredBackupPeriod"].(string), ","))
d.Set("backup_retention_period", formatInt(object["BackupRetentionPeriod"]))
d.Set("log_backup", object["BackupLog"] == "Enable")
d.Set("enable_backup_log", object["EnableBackupLog"] == "1")
d.Set("log_retention_period", formatInt(object["LogBackupRetentionPeriod"]))
d.Set("log_backup_retention_period", formatInt(object["LogBackupRetentionPeriod"]))
d.Set("local_log_retention_hours", formatInt(object["LocalLogRetentionHours"]))
d.Set("local_log_retention_space", formatInt(object["LocalLogRetentionSpace"]))
d.Set("released_keep_policy", object["ReleasedKeepPolicy"])
d.Set("category", object["Category"])
d.Set("enable_increment_data_backup", object["EnableIncrementDataBackup"].(bool))
d.Set("log_backup_local_retention_number", object["LogBackupLocalRetentionNumber"])
instance, err := rdsService.DescribeDBInstance(d.Id())
if err != nil {
if NotFoundError(err) {
d.SetId("")
return nil
}
return WrapError(err)
}
// At present, the sql server database does not support setting high_space_usage_protection and it`s has default value
if instance["Engine"] == "SQLServer" {
d.Set("high_space_usage_protection", "Enable")
d.Set("backup_method", object["BackupMethod"])
} else {
d.Set("high_space_usage_protection", object["HighSpaceUsageProtection"])
d.Set("backup_interval", object["BackupInterval"])
}
if instance["Engine"] == "SQLServer" && instance["Category"] == "AlwaysOn" {
d.Set("backup_priority", formatInt(object["BackupPriority"]))
}
d.Set("log_backup_frequency", object["LogBackupFrequency"])
d.Set("compress_type", object["CompressType"])
d.Set("archive_backup_retention_period", formatInt(object["ArchiveBackupRetentionPeriod"]))
d.Set("archive_backup_keep_count", formatInt(object["ArchiveBackupKeepCount"]))
d.Set("archive_backup_keep_policy", object["ArchiveBackupKeepPolicy"])
return nil
}
func resourceAlicloudDBBackupPolicyUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
rdsService := RdsService{client}
updateForData := false
updateForLog := false
if d.HasChanges("backup_period", "backup_time", "retention_period", "preferred_backup_period", "preferred_backup_time",
"backup_retention_period", "compress_type", "log_backup_frequency", "archive_backup_retention_period", "archive_backup_keep_count",
"archive_backup_keep_policy", "released_keep_policy", "category", "backup_interval", "backup_priority", "backup_method",
"enable_increment_data_backup") {
updateForData = true
}
if d.HasChanges("log_backup", "enable_backup_log", "log_backup_retention_period", "log_retention_period", "local_log_retention_hours",
"local_log_retention_space", "high_space_usage_protection", "log_backup_local_retention_number") {
updateForLog = true
}
if _, ok := d.GetOkExists("enable_backup_log"); ok {
updateForLog = true
}
if updateForData || updateForLog {
// wait instance running before modifying
if err := rdsService.WaitForDBInstance(d.Id(), Running, DefaultTimeoutMedium); err != nil {
return WrapError(err)
}
if err := resource.Retry(5*time.Minute, func() *resource.RetryError {
if err := rdsService.ModifyDBBackupPolicy(d, updateForData, updateForLog); err != nil {
if IsExpectedErrors(err, OperationDeniedDBStatus) || NeedRetry(err) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
}); err != nil {
return WrapError(err)
}
}
return resourceAlicloudDBBackupPolicyRead(d, meta)
}
func resourceAlicloudDBBackupPolicyDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
rdsService := RdsService{client}
stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, rdsService.RdsDBInstanceStateRefreshFunc(d.Id(), []string{"Deleting"}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
var err error
action := "ModifyBackupPolicy"
request := map[string]interface{}{
"RegionId": client.RegionId,
"DBInstanceId": d.Id(),
"PreferredBackupPeriod": "Tuesday,Thursday,Saturday",
"BackupRetentionPeriod": "7",
"PreferredBackupTime": "02:00Z-03:00Z",
"EnableBackupLog": "1",
"SourceIp": client.SourceIp,
}
instance, err := rdsService.DescribeDBInstance(d.Id())
if err != nil {
if NotFoundError(err) {
return nil
}
return WrapError(err)
}
if instance["Engine"] != "SQLServer" {
request["LogBackupRetentionPeriod"] = "7"
}
if instance["Engine"] == "MySQL" && instance["DBInstanceStorageType"] == "local_ssd" {
request["ArchiveBackupRetentionPeriod"] = "0"
request["ArchiveBackupKeepCount"] = "1"
request["ArchiveBackupKeepPolicy"] = "ByMonth"
}
response, err := client.RpcPost("Rds", "2014-08-15", action, nil, request, false)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
addDebug(action, response, request)
return rdsService.WaitForDBInstance(d.Id(), Running, DefaultTimeoutMedium)
}