in alicloud/resource_alicloud_gpdb_instance.go [642:1316]
func resourceAliCloudGpdbDbInstanceUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
gpdbService := GpdbService{client}
var err error
var response map[string]interface{}
request := make(map[string]interface{})
d.Partial(true)
if d.HasChange("tags") {
if err := gpdbService.SetResourceTags(d, "ALIYUN::GPDB::INSTANCE"); err != nil {
return WrapError(err)
}
d.SetPartial("tags")
}
update := false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("description") {
update = true
}
if v, ok := d.GetOk("description"); ok {
request["DBInstanceDescription"] = v
}
if update {
action := "ModifyDBInstanceDescription"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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")
}
update = false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("resource_group_id") {
update = true
}
if v, ok := d.GetOk("resource_group_id"); ok {
request["NewResourceGroupId"] = v
}
if update {
action := "ModifyDBInstanceResourceGroup"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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{}{
"DBInstanceId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("maintain_end_time") {
update = true
}
if v, ok := d.GetOk("maintain_end_time"); ok {
request["EndTime"] = v
}
if !d.IsNewResource() && d.HasChange("maintain_start_time") {
update = true
}
if v, ok := d.GetOk("maintain_start_time"); ok {
request["StartTime"] = v
}
if update {
action := "ModifyDBInstanceMaintainTime"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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_end_time")
d.SetPartial("maintain_start_time")
}
if d.HasChange("ip_whitelist") {
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
o, n := d.GetChange("ip_whitelist")
newGroupKeys := make(map[string]struct{})
if n != nil {
for _, iPWhitelist := range n.([]interface{}) {
iPWhitelistArg := iPWhitelist.(map[string]interface{})
request["DBInstanceIPArrayAttribute"] = iPWhitelistArg["ip_group_attribute"]
request["DBInstanceIPArrayName"] = iPWhitelistArg["ip_group_name"]
request["SecurityIPList"] = iPWhitelistArg["security_ip_list"]
request["ModifyMode"] = 0
ipGroupName := "default"
if fmt.Sprint(iPWhitelistArg["ip_group_name"]) != "" {
ipGroupName = fmt.Sprint(iPWhitelistArg["ip_group_name"])
}
newGroupKeys[ipGroupName] = struct{}{}
action := "ModifySecurityIps"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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)
}
}
}
if o != nil {
for _, iPWhitelist := range o.([]interface{}) {
iPWhitelistArg := iPWhitelist.(map[string]interface{})
request["DBInstanceIPArrayAttribute"] = iPWhitelistArg["ip_group_attribute"]
request["DBInstanceIPArrayName"] = iPWhitelistArg["ip_group_name"]
request["SecurityIPList"] = iPWhitelistArg["security_ip_list"]
request["ModifyMode"] = 2
ipGroupName := "default"
if fmt.Sprint(iPWhitelistArg["ip_group_name"]) != "" {
ipGroupName = fmt.Sprint(iPWhitelistArg["ip_group_name"])
}
if _, ok := newGroupKeys[ipGroupName]; ok {
continue
}
action := "ModifySecurityIps"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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("ip_whitelist")
}
if !d.IsNewResource() && d.HasChange("security_ip_list") {
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
if v, ok := d.GetOk("security_ip_list"); ok {
if len(v.(*schema.Set).List()) > 0 {
request["SecurityIpList"] = strings.Join(expandStringList(v.(*schema.Set).List())[:], COMMA_SEPARATED)
}
action := "ModifySecurityIps"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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("security_ip_list")
}
}
update = false
request = map[string]interface{}{
"RegionId": client.RegionId,
"DBInstanceId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("seg_node_num") {
update = true
if v, ok := d.GetOkExists("seg_node_num"); ok {
request["UpgradeType"] = 0
request["SegNodeNum"] = v
}
}
if update {
action := "UpgradeDBInstance"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing"}) || 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{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("seg_node_num")
}
update = false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
request["RegionId"] = client.RegionId
if !d.IsNewResource() && d.HasChange("master_node_num") {
update = true
if v, ok := d.GetOk("master_node_num"); ok {
request["UpgradeType"] = 2
request["MasterNodeNum"] = v
}
}
if update {
action := "UpgradeDBInstance"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, false)
if err != nil {
if IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing"}) || 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{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("master_node_num")
}
update = false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
request["RegionId"] = client.RegionId
if !d.IsNewResource() && d.HasChange("instance_spec") {
update = true
if v, ok := d.GetOk("instance_spec"); ok {
request["UpgradeType"] = 1
request["InstanceSpec"] = v
}
}
if update {
action := "UpgradeDBInstance"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing"}) || 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{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("instance_spec")
}
update = false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
request["RegionId"] = client.RegionId
if !d.IsNewResource() && d.HasChange("storage_size") {
update = true
if v, ok := d.GetOk("storage_size"); ok {
request["UpgradeType"] = 1
request["StorageSize"] = v
}
}
if update {
action := "UpgradeDBInstance"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing", "InternalError"}) || 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{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("storage_size")
}
update = false
modifySegDiskPerformanceLevelReq := map[string]interface{}{
"RegionId": client.RegionId,
"DBInstanceId": d.Id(),
"UpgradeType": 3,
}
if v, ok := d.GetOk("seg_storage_type"); ok {
modifySegDiskPerformanceLevelReq["SegStorageType"] = v
}
if !d.IsNewResource() && d.HasChange("seg_disk_performance_level") {
update = true
}
if v, ok := d.GetOk("seg_disk_performance_level"); ok {
modifySegDiskPerformanceLevelReq["SegDiskPerformanceLevel"] = v
}
if update {
action := "UpgradeDBInstance"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, modifySegDiskPerformanceLevelReq, false)
if err != nil {
if IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing"}) || NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, modifySegDiskPerformanceLevelReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("seg_disk_performance_level")
}
update = false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("ssl_enabled") {
update = true
}
if v, ok := d.GetOkExists("ssl_enabled"); ok {
request["SSLEnabled"] = v
}
if update {
action := "ModifyDBInstanceSSL"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
sslEnabledStateConf := BuildStateConf([]string{}, []string{fmt.Sprint(request["SSLEnabled"])}, d.Timeout(schema.TimeoutCreate), 5*time.Second, gpdbService.DBInstanceSSLStateRefreshFunc(d, []string{}))
if _, err := sslEnabledStateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("ssl_enabled")
}
update = false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("vector_configuration_status") {
update = true
}
if v, ok := d.GetOk("vector_configuration_status"); ok {
request["VectorConfigurationStatus"] = v
}
if update {
action := "ModifyVectorConfiguration"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("vector_configuration_status")
}
if d.HasChange("parameters") {
action := "ModifyParameters"
request, err = getModifyParametersRequest(d)
if err != nil {
return WrapError(err)
}
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("parameters")
}
update = false
modifyMasterSpec := map[string]interface{}{
"DBInstanceId": d.Id(),
}
if !d.IsNewResource() && d.HasChange("master_cu") {
update = true
}
if v, ok := d.GetOk("master_cu"); ok {
modifyMasterSpec["MasterCU"] = v
}
if update {
action := "ModifyMasterSpec"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, modifyMasterSpec, false)
if err != nil {
if IsExpectedErrors(err, []string{"OperationDenied.OrderProcessing"}) || NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, modifyMasterSpec)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("master_cu")
}
update = false
request = map[string]interface{}{
"DBInstanceId": d.Id(),
}
action := "EnableDBResourceGroup"
request["RegionId"] = client.RegionId
if v, ok := d.GetOk("resource_management_mode"); ok && d.HasChange("resource_management_mode") {
update = true
if v == "resourceGroup" {
action = "EnableDBResourceGroup"
} else {
action = "DisableDBResourceGroup"
}
}
if update {
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, request, true)
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{}, []string{"Running", "IDLE"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
update = false
dataShareStatus := ""
setDataShareInstanceReq := map[string]interface{}{
"RegionId": client.RegionId,
"InstanceList": "[\"" + d.Id() + "\"]",
}
if d.HasChange("data_share_status") {
update = true
}
if v, ok := d.GetOk("data_share_status"); ok {
setDataShareInstanceReq["OperationType"] = convertGpdbDbInstanceDataShareStatusRequest(v.(string))
dataShareStatus = v.(string)
}
if update {
action := "SetDataShareInstance"
wait := incrementalWait(3*time.Second, 3*time.Second)
err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutUpdate)), func() *resource.RetryError {
response, err = client.RpcPost("gpdb", "2016-05-03", action, nil, setDataShareInstanceReq, false)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
addDebug(action, response, setDataShareInstanceReq)
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
stateConf := BuildStateConf([]string{}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 60*time.Second, gpdbService.GpdbDbInstanceStateRefreshFunc(d.Id(), "DBInstanceStatus", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
dataShareStatusStateConf := BuildStateConf([]string{}, []string{dataShareStatus}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, gpdbService.GpdbDbInstanceDataShareStatusStateRefreshFunc(d.Id(), []string{}))
if _, err := dataShareStatusStateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
d.SetPartial("data_share_status")
}
d.Partial(false)
return resourceAliCloudGpdbDbInstanceRead(d, meta)
}