in alicloud/resource_alicloud_adb_db_cluster.go [442:951]
func resourceAliCloudAdbDbClusterUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
adbService := AdbService{client}
var response map[string]interface{}
var err error
d.Partial(true)
if d.HasChange("tags") {
if err := adbService.SetResourceTags(d, "ALIYUN::ADB::CLUSTER"); err != nil {
return WrapError(err)
}
d.SetPartial("tags")
}
if !d.IsNewResource() && d.HasChange("description") {
request := map[string]interface{}{
"DBClusterId": d.Id(),
}
request["DBClusterDescription"] = d.Get("description")
action := "ModifyDBClusterDescription"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, request, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
d.SetPartial("description")
}
if d.HasChange("maintain_time") {
request := map[string]interface{}{
"DBClusterId": d.Id(),
}
request["MaintainTime"] = d.Get("maintain_time")
action := "ModifyDBClusterMaintainTime"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, request, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
d.SetPartial("maintain_time")
}
if !d.IsNewResource() && d.HasChange("resource_group_id") {
request := map[string]interface{}{
"DBClusterId": d.Id(),
}
request["NewResourceGroupId"] = d.Get("resource_group_id")
action := "ModifyDBClusterResourceGroup"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, request, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
d.SetPartial("resource_group_id")
}
update := false
request := map[string]interface{}{
"DbClusterId": d.Id(),
}
request["RegionId"] = client.RegionId
if !d.IsNewResource() && (d.HasChange("pay_type") || d.HasChange("payment_type")) {
update = true
}
if paymentType, ok := d.GetOk("payment_type"); ok {
request["PayType"] = convertAdbDBClusterPaymentTypeRequest(paymentType.(string))
} else if payType, ok := d.GetOk("pay_type"); ok {
request["PayType"] = convertAdbDbClusterDBClusterPayTypeRequest(payType.(string))
}
if request["PayType"] == "Prepaid" {
request["Period"] = d.Get("period")
period := d.Get("period").(int)
request["UsedTime"] = strconv.Itoa(period)
request["Period"] = string(Month)
if period > 9 {
request["UsedTime"] = strconv.Itoa(period / 12)
request["Period"] = string(Year)
}
}
if update {
action := "ModifyDBClusterPayType"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, request, false)
if err != nil {
if NeedRetry(err) || IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing"}) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{"Preparing", "ClassChanging"}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 120*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("payment_type")
d.SetPartial("pay_type")
}
update = false
request = map[string]interface{}{
"DBClusterId": d.Id(),
}
request["RegionId"] = client.RegionId
if (d.Get("pay_type").(string) == string(PrePaid) || d.Get("payment_type").(string) == "Subscription") && d.HasChange("auto_renew_period") {
update = true
if d.Get("renewal_status").(string) == string(RenewAutoRenewal) {
period := d.Get("auto_renew_period").(int)
request["Duration"] = strconv.Itoa(period)
request["PeriodUnit"] = string(Month)
if period > 9 {
request["Duration"] = strconv.Itoa(period / 12)
request["PeriodUnit"] = string(Year)
}
}
}
if (d.Get("pay_type").(string) == string(PrePaid) || d.Get("payment_type").(string) == "Subscription") && d.HasChange("renewal_status") {
update = true
request["RenewalStatus"] = d.Get("renewal_status")
}
if update {
action := "ModifyAutoRenewAttribute"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, request, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, request)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{"Preparing", "ClassChanging"}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 120*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("auto_renew_period")
d.SetPartial("renewal_status")
}
update = false
modifyDBClusterAccessWhiteListReq := map[string]interface{}{
"DBClusterId": d.Id(),
}
if d.HasChange("security_ips") {
update = true
}
modifyDBClusterAccessWhiteListReq["SecurityIps"] = convertListToCommaSeparate(d.Get("security_ips").(*schema.Set).List())
if update {
action := "ModifyDBClusterAccessWhiteList"
if modifyDBClusterAccessWhiteListReq["SecurityIps"].(string) == "" {
modifyDBClusterAccessWhiteListReq["SecurityIps"] = LOCAL_HOST_IP
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, modifyDBClusterAccessWhiteListReq, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, modifyDBClusterAccessWhiteListReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
d.SetPartial("security_ips")
}
update = false
modifyDBClusterReq := map[string]interface{}{
"DBClusterId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("compute_resource") {
update = true
modifyDBClusterReq["ComputeResource"] = d.Get("compute_resource")
}
if !d.IsNewResource() && d.HasChange("db_cluster_category") {
update = true
modifyDBClusterReq["DBClusterCategory"] = d.Get("db_cluster_category")
}
if !d.IsNewResource() && d.HasChange("db_node_class") {
update = true
modifyDBClusterReq["DBNodeClass"] = d.Get("db_node_class")
}
if !d.IsNewResource() && d.HasChange("db_node_count") {
update = true
modifyDBClusterReq["DBNodeGroupCount"] = d.Get("db_node_count")
}
if !d.IsNewResource() && d.HasChange("elastic_io_resource") {
update = true
modifyDBClusterReq["ElasticIOResource"] = d.Get("elastic_io_resource")
}
object, err := adbService.DescribeAdbDbCluster(d.Id())
if err != nil {
return WrapError(err)
}
if d.HasChange("elastic_io_resource_size") {
if v, ok := d.GetOk("elastic_io_resource_size"); ok && v.(string) != object["ElasticIOResourceSize"] {
update = true
modifyDBClusterReq["ElasticIOResourceSize"] = v
}
}
modifyDBClusterReq["RegionId"] = client.RegionId
if update {
if _, ok := d.GetOk("mode"); ok {
modifyDBClusterReq["Mode"] = d.Get("mode")
}
if _, ok := d.GetOk("modify_type"); ok {
modifyDBClusterReq["ModifyType"] = d.Get("modify_type")
}
action := "ModifyDBCluster"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, modifyDBClusterReq, false)
if err != nil {
if NeedRetry(err) || IsExpectedErrors(err, []string{"IncorrectDBInstanceState", "OperationDenied.OrderProcessing"}) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, modifyDBClusterReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{"Preparing", "ClassChanging"}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 120*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
if d.HasChange("compute_resource") {
stateConf = BuildStateConf([]string{}, []string{fmt.Sprint(d.Get("compute_resource"))}, d.Timeout(schema.TimeoutUpdate), 0*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "ComputeResource", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
d.SetPartial("compute_resource")
d.SetPartial("db_cluster_category")
d.SetPartial("db_node_class")
d.SetPartial("db_node_count")
d.SetPartial("elastic_io_resource")
d.SetPartial("elastic_io_resource_size")
}
update = false
modifyDBClusterReq = map[string]interface{}{
"DBClusterId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("db_node_storage") {
update = true
modifyDBClusterReq["DBNodeStorage"] = d.Get("db_node_storage")
}
modifyDBClusterReq["RegionId"] = client.RegionId
if update {
if _, ok := d.GetOk("mode"); ok {
modifyDBClusterReq["Mode"] = d.Get("mode")
}
if _, ok := d.GetOk("modify_type"); ok {
modifyDBClusterReq["ModifyType"] = d.Get("modify_type")
}
action := "ModifyDBCluster"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, modifyDBClusterReq, false)
if err != nil {
// There is service bug and needs checking IncorrectDBInstanceState.
// If the bug is fixed, the IncorrectDBInstanceState checking can be removed.
if NeedRetry(err) || IsExpectedErrors(err, []string{"IncorrectDBInstanceState", "OperationDenied.OrderProcessing"}) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, modifyDBClusterReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{"Preparing", "ClassChanging"}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 120*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("db_node_storage")
}
update = false
modifyDBClusterReq = map[string]interface{}{
"DBClusterId": d.Id(),
}
if d.HasChange("disk_performance_level") {
if v, ok := d.GetOk("disk_performance_level"); ok && v.(string) != object["DiskPerformanceLevel"] {
update = true
modifyDBClusterReq["DiskPerformanceLevel"] = v
}
}
modifyDBClusterReq["RegionId"] = client.RegionId
if update {
if _, ok := d.GetOk("mode"); ok {
modifyDBClusterReq["Mode"] = d.Get("mode")
}
if _, ok := d.GetOk("modify_type"); ok {
modifyDBClusterReq["ModifyType"] = d.Get("modify_type")
}
action := "ModifyDBCluster"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, modifyDBClusterReq, false)
if err != nil {
// There is service bug and needs checking IncorrectDBInstanceState.
// If the bug is fixed, the IncorrectDBInstanceState checking can be removed.
if NeedRetry(err) || IsExpectedErrors(err, []string{"IncorrectDBInstanceState", "OperationDenied.OrderProcessing"}) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, modifyDBClusterReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{"Preparing", "ClassChanging"}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 120*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("disk_performance_level")
}
update = false
upgradeKernelVersionReq := map[string]interface{}{
"DBClusterId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("kernel_version") {
update = true
upgradeKernelVersionReq["DBVersion"] = d.Get("kernel_version")
if v, ok := d.GetOkExists("switch_mode"); ok {
upgradeKernelVersionReq["SwitchMode"] = v
}
}
if update {
action := "UpgradeKernelVersion"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, upgradeKernelVersionReq, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, upgradeKernelVersionReq)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 1*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
update = false
modifyDBClusterSSLReq := map[string]interface{}{
"DBClusterId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("enable_ssl") {
update = true
if v, ok := d.GetOkExists("enable_ssl"); ok {
modifyDBClusterSSLReq["EnableSSL"] = v
if fmt.Sprint(v) == "true" {
modifyDBClusterSSLReq["ConnectionString"] = d.Get("connection_string")
}
}
}
if update {
action := "ModifyDBClusterSSL"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("adb", "2019-03-15", action, nil, modifyDBClusterSSLReq, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, modifyDBClusterSSLReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 1*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("enable_ssl")
}
d.Partial(false)
stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 1*time.Second, adbService.AdbDbClusterStateRefreshFunc(d.Id(), "DBClusterStatus", []string{"Deleting"}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
return resourceAliCloudAdbDbClusterRead(d, meta)
}