in alibabacloudstack/resource_apsarastack_db_instance.go [455:739]
func resourceAlibabacloudStackDBInstanceUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
rdsService := RdsService{client}
d.Partial(true)
stateConf := BuildStateConf([]string{"DBInstanceClassChanging", "DBInstanceNetTypeChanging"}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 1*time.Minute, rdsService.RdsDBInstanceStateRefreshFunc(d.Id(), []string{"Deleting"}))
if d.HasChange("parameters") {
if err := rdsService.ModifyParameters(d, "parameters"); err != nil {
return errmsgs.WrapError(err)
}
}
if err := rdsService.setInstanceTags(d); err != nil {
return errmsgs.WrapError(err)
}
payType := Postpaid
if v, ok := connectivity.GetResourceDataOk(d, "payment_type", "instance_charge_type"); ok && Trim(v.(string)) != "" {
payType = PayType(Trim(v.(string)))
}
if !d.IsNewResource() && d.HasChanges("instance_charge_type", "payment_type") && payType == Prepaid {
prePaidRequest := rds.CreateModifyDBInstancePayTypeRequest()
client.InitRpcRequest(*prePaidRequest.RpcRequest)
prePaidRequest.DBInstanceId = d.Id()
prePaidRequest.PayType = string(payType)
prePaidRequest.AutoPay = "true"
period := d.Get("period").(int)
prePaidRequest.UsedTime = requests.Integer(strconv.Itoa(period))
prePaidRequest.Period = string(Month)
if period > 9 {
prePaidRequest.UsedTime = requests.Integer(strconv.Itoa(period / 12))
prePaidRequest.Period = string(Year)
}
raw, err := client.WithRdsClient(func(client *rds.Client) (interface{}, error) {
return client.ModifyDBInstancePayType(prePaidRequest)
})
if err != nil {
errmsg := ""
if raw != nil {
response, ok := raw.(*rds.ModifyDBInstancePayTypeResponse)
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), prePaidRequest.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(prePaidRequest.GetActionName(), raw, prePaidRequest, prePaidRequest.QueryParams)
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
}
if payType == Prepaid && d.HasChanges("auto_renew", "auto_renew_period") {
request := rds.CreateModifyInstanceAutoRenewalAttributeRequest()
client.InitRpcRequest(*request.RpcRequest)
request.DBInstanceId = d.Id()
auto_renew := d.Get("auto_renew").(bool)
if auto_renew {
request.AutoRenew = "True"
} else {
request.AutoRenew = "False"
}
request.Duration = strconv.Itoa(d.Get("auto_renew_period").(int))
raw, err := client.WithRdsClient(func(client *rds.Client) (interface{}, error) {
return client.ModifyInstanceAutoRenewalAttribute(request)
})
if err != nil {
errmsg := ""
if raw != nil {
response, ok := raw.(*rds.ModifyInstanceAutoRenewalAttributeResponse)
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request, request.QueryParams)
}
if d.HasChange("monitoring_period") {
period := d.Get("monitoring_period").(int)
request := rds.CreateModifyDBInstanceMonitorRequest()
client.InitRpcRequest(*request.RpcRequest)
request.DBInstanceId = d.Id()
request.Period = strconv.Itoa(period)
raw, err := client.WithRdsClient(func(client *rds.Client) (interface{}, error) {
return client.ModifyDBInstanceMonitor(request)
})
if err != nil {
errmsg := ""
if raw != nil {
response, ok := raw.(*rds.ModifyDBInstanceMonitorResponse)
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
if d.HasChange("maintain_time") {
request := rds.CreateModifyDBInstanceMaintainTimeRequest()
client.InitRpcRequest(*request.RpcRequest)
request.DBInstanceId = d.Id()
request.MaintainTime = d.Get("maintain_time").(string)
request.ClientToken = buildClientToken(request.GetActionName())
raw, err := client.WithRdsClient(func(client *rds.Client) (interface{}, error) {
return client.ModifyDBInstanceMaintainTime(request)
})
if err != nil {
errmsg := ""
if raw != nil {
response, ok := raw.(*rds.ModifyDBInstanceMaintainTimeResponse)
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
if d.IsNewResource() {
d.Partial(false)
return nil
}
if d.HasChanges("instance_name", "db_instance_description") {
request := rds.CreateModifyDBInstanceDescriptionRequest()
client.InitRpcRequest(*request.RpcRequest)
request.DBInstanceId = d.Id()
request.DBInstanceDescription = connectivity.GetResourceData(d, "db_instance_description", "instance_name").(string)
raw, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) {
return rdsClient.ModifyDBInstanceDescription(request)
})
if err != nil {
errmsg := ""
if raw != nil {
response, ok := raw.(*rds.ModifyDBInstanceDescriptionResponse)
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
if d.HasChange("security_ips") {
ipList := expandStringList(d.Get("security_ips").(*schema.Set).List())
ipstr := strings.Join(ipList[:], COMMA_SEPARATED)
if ipstr == "" {
ipstr = LOCAL_HOST_IP
}
if err := rdsService.ModifyDBSecurityIps(d.Id(), ipstr); err != nil {
return errmsgs.WrapError(err)
}
}
update := false
request := rds.CreateModifyDBInstanceSpecRequest()
client.InitRpcRequest(*request.RpcRequest)
request.DBInstanceId = d.Id()
if v, ok := connectivity.GetResourceDataOk(d, "payment_type", "instance_charge_type"); ok {
request.PayType = v.(string)
} else {
request.PayType = string(Postpaid)
}
if d.HasChanges("instance_type", "db_instance_class") {
request.DBInstanceClass = connectivity.GetResourceData(d, "db_instance_class", "instance_type").(string)
if err := errmsgs.CheckEmpty(request.DBInstanceClass, schema.TypeString, "db_instance_class", "instance_type"); err != nil {
return errmsgs.WrapError(err)
}
update = true
}
if d.HasChanges("instance_storage", "db_instance_storage") {
request.DBInstanceStorage = requests.NewInteger(connectivity.GetResourceData(d, "db_instance_storage", "instance_storage").(int))
if err := errmsgs.CheckEmpty(request.DBInstanceStorage, schema.TypeString, "db_instance_storage", "instance_storage"); err != nil {
return errmsgs.WrapError(err)
}
update = true
}
if update {
// wait instance status is running before modifying
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
err := resource.Retry(5*time.Minute, func() *resource.RetryError {
raw, err := client.WithRdsClient(func(rdsClient *rds.Client) (interface{}, error) {
return rdsClient.ModifyDBInstanceSpec(request)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InternalError", "OperationDenied.DBInstanceStatus"}) {
return resource.RetryableError(errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR))
}
errmsg := ""
if raw != nil {
response, ok := raw.(*rds.ModifyDBInstanceSpecResponse)
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
}
return resource.NonRetryableError(errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg))
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
if err != nil {
return errmsgs.WrapError(err)
}
// wait instance status is running after modifying
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
}
d.Partial(false)
if d.HasChange("tde_status") {
tde_req := client.NewCommonRequest("POST", "Rds", "2014-08-15", "ModifyDBInstanceTDE", "")
tde_req.QueryParams["DBInstanceId"] = d.Id()
tde_req.QueryParams["TDEStatus"] = "Enabled"
raw, err := client.WithRdsClient(func(client *rds.Client) (interface{}, error) {
return client.ProcessCommonRequest(tde_req)
})
response, ok := raw.(*responses.CommonResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), tde_req.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
if err := rdsService.WaitForDBInstance(d.Id(), Running, DefaultTimeoutMedium); err != nil {
return errmsgs.WrapError(err)
}
log.Print("Updated TDE")
addDebug(tde_req.GetActionName(), raw, tde_req)
}
if d.HasChange("enable_ssl") {
ssl := d.Get("enable_ssl").(bool)
ssl_req := client.NewCommonRequest("POST", "Rds", "2014-08-15", "ModifyDBInstanceSSL", "")
ssl_req.QueryParams["DBInstanceId"] = d.Id()
ssl_req.QueryParams["ConnectionString"] = d.Get("connection_string").(string)
if ssl == true {
ssl_req.QueryParams["SSLEnabled"] = "1"
} else {
ssl_req.QueryParams["SSLEnabled"] = "0"
}
sslraw, err := client.WithRdsClient(func(client *rds.Client) (interface{}, error) {
return client.ProcessCommonRequest(ssl_req)
})
response, ok := sslraw.(*responses.CommonResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), ssl_req.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
if err := rdsService.WaitForDBInstance(d.Id(), Running, DefaultTimeoutMedium); err != nil {
return errmsgs.WrapError(err)
}
if ssl == true {
log.Print("Updated SSL to true")
} else {
log.Print("Updated SSL to false")
}
addDebug(ssl_req.GetActionName(), sslraw, ssl_req)
}
return nil
}