alibabacloudstack/resource_apsarastack_polardb_instance.go (858 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"log"
"strconv"
"strings"
"time"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/go-uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceAlibabacloudStackPolardbInstance() *schema.Resource {
resource := &schema.Resource{
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(40 * time.Minute),
Update: schema.DefaultTimeout(30 * time.Minute),
Delete: schema.DefaultTimeout(20 * time.Minute),
},
Schema: map[string]*schema.Schema{
"engine": {
Type: schema.TypeString,
ForceNew: true,
Required: true,
ValidateFunc: validation.StringInSlice([]string{"MySQL", "PolarDB_PPAS", "PolarDB_PG"}, false),
},
"engine_version": {
Type: schema.TypeString,
ForceNew: true,
Required: true,
},
"zone_id_slave1": {
Type: schema.TypeString,
Optional: true,
},
"zone_id_slave2": {
Type: schema.TypeString,
Optional: true,
},
"tde_status": {
Type: schema.TypeBool,
Optional: true,
},
"encrypt_algorithm": {
Type: schema.TypeString,
Optional: true,
Default: "aes-256",
ValidateFunc: validation.StringInSlice([]string{"sm4-128", "aes-256"}, false),
},
"enable_ssl": {
Type: schema.TypeBool,
Optional: true,
ForceNew: false,
},
"storage_type": {
Type: schema.TypeString,
ForceNew: true,
ValidateFunc: validation.StringInSlice([]string{"local_ssd", "cloud_ssd", "cloud_pperf", "cloud_sperf"}, false),
Optional: true,
Computed: true,
Deprecated: "Field 'storage_type' is deprecated and will be removed in a future release. Please use new field 'db_instance_storage_type' instead.",
ConflictsWith: []string{"db_instance_storage_type"},
},
"db_instance_storage_type": {
Type: schema.TypeString,
ForceNew: true,
ValidateFunc: validation.StringInSlice([]string{"local_ssd", "cloud_ssd", "cloud_pperf", "cloud_sperf"}, false),
Optional: true,
Computed: true,
ConflictsWith: []string{"storage_type"},
},
"encryption_key": {
Type: schema.TypeString,
Optional: true,
},
"encryption": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
Default: false,
},
"instance_type": {
Type: schema.TypeString,
Optional: true,
Computed: true,
Deprecated: "Field 'instance_type' is deprecated and will be removed in a future release. Please use new field 'db_instance_class' instead.",
ConflictsWith: []string{"db_instance_class"},
},
"db_instance_class": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ConflictsWith: []string{"instance_type"},
},
"instance_storage": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
Deprecated: "Field 'instance_storage' is deprecated and will be removed in a future release. Please use new field 'db_instance_storage' instead.",
ConflictsWith: []string{"db_instance_storage"},
},
"db_instance_storage": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ConflictsWith: []string{"instance_storage"},
},
"instance_charge_type": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{string(Postpaid), string(Prepaid)}, false),
Optional: true,
Computed: true,
Deprecated: "Field 'instance_charge_type' is deprecated and will be removed in a future release. Please use new field 'payment_type' instead.",
ConflictsWith: []string{"payment_type"},
},
"payment_type": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{string(Postpaid), string(Prepaid)}, false),
Optional: true,
Computed: true,
ConflictsWith: []string{"instance_charge_type"},
},
"period": {
Type: schema.TypeInt,
ValidateFunc: validation.IntInSlice([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 24, 36}),
Optional: true,
Default: 1,
DiffSuppressFunc: PostPaidDiffSuppressFunc,
},
"monitoring_period": {
Type: schema.TypeInt,
ValidateFunc: validation.IntInSlice([]int{5, 60, 300}),
Optional: true,
Computed: true,
},
"auto_renew": {
Type: schema.TypeBool,
Optional: true,
Default: false,
DiffSuppressFunc: PostPaidDiffSuppressFunc,
},
"auto_renew_period": {
Type: schema.TypeInt,
ValidateFunc: validation.IntBetween(1, 12),
Optional: true,
Default: 1,
DiffSuppressFunc: PostPaidAndRenewDiffSuppressFunc,
},
"zone_id": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Computed: true,
},
"vswitch_id": {
Type: schema.TypeString,
ForceNew: true,
Optional: true,
},
"instance_name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: validation.StringLenBetween(2, 256),
Deprecated: "Field 'instance_name' is deprecated and will be removed in a future release. Please use new field 'db_instance_description' instead.",
ConflictsWith: []string{"db_instance_description"},
},
"db_instance_description": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: validation.StringLenBetween(2, 256),
ConflictsWith: []string{"instance_name"},
},
"connection_string": {
Type: schema.TypeString,
Computed: true,
},
"port": {
Type: schema.TypeString,
Computed: true,
},
"security_ips": {
Type: schema.TypeSet,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
Optional: true,
},
"security_ip_mode": {
Type: schema.TypeString,
ValidateFunc: validation.StringInSlice([]string{NormalMode, SafetyMode}, false),
Optional: true,
Default: NormalMode,
},
"parameters": {
Type: schema.TypeSet,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Required: true,
},
"value": {
Type: schema.TypeString,
Required: true,
},
},
},
Set: parameterToHash,
Optional: true,
Computed: true,
},
"maintain_time": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"role_arn": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackPolardbInstanceCreate, resourceAlibabacloudStackPolardbInstanceRead, resourceAlibabacloudStackPolardbInstanceUpdate, resourceAlibabacloudStackPolardbInstanceDelete)
return resource
}
func resourceAlibabacloudStackPolardbInstanceCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
PolardbService := PolardbService{client}
vpcService := VpcService{client}
var VSwitchId, InstanceNetworkType, ZoneIdSlave1, ZoneIdSlave2, ZoneId, VPCId, arnrole string
var encryption bool
EncryptionKey := d.Get("encryption_key").(string)
encryption = d.Get("encryption").(bool)
EncryptAlgorithm := d.Get("encrypt_algorithm").(string)
log.Print("Encryption key input")
if EncryptionKey != "" && encryption == true {
log.Print("Encryption key condition passed")
req := client.NewCommonRequest("POST", "polardb", "2024-01-30", "CheckCloudResourceAuthorized", "")
req.QueryParams["TargetRegionId"] = client.RegionId
var arnresp RoleARN
bresponse, err := client.ProcessCommonRequest(req)
addDebug(req.GetActionName(), bresponse, req, req.QueryParams)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "CheckCloudResourceAuthorized", req.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &arnresp)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "CheckCloudResourceAuthorized", errmsgs.AlibabacloudStackSdkGoERROR)
}
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "CheckCloudResourceAuthorized", req.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
}
arnrole = arnresp.RoleArn
d.Set("role_arn", arnrole)
log.Printf("check arnrole %v", arnrole)
} else if EncryptionKey == "" && encryption == true {
return errmsgs.WrapErrorf(nil, "Add EncryptionKey or Set encryption to false", "CheckCloudResourceAuthorized", errmsgs.AlibabacloudStackSdkGoERROR)
} else if EncryptionKey != "" && encryption == false {
return errmsgs.WrapErrorf(nil, "Set encryption to true", "CheckCloudResourceAuthorized", errmsgs.AlibabacloudStackSdkGoERROR)
} else {
log.Print("Encryption key condition failed")
}
d.Set("encryption", encryption)
log.Printf("encryptionbool %v", d.Get("encryption").(bool))
enginever := Trim(d.Get("engine_version").(string))
engine := Trim(d.Get("engine").(string))
DBInstanceStorage := connectivity.GetResourceData(d, "db_instance_storage", "instance_storage").(int)
if err := errmsgs.CheckEmpty(DBInstanceStorage, schema.TypeString, "db_instance_storage", "instance_storage"); err != nil {
return errmsgs.WrapError(err)
}
DBInstanceClass := Trim(connectivity.GetResourceData(d, "db_instance_class", "instance_type").(string))
if err := errmsgs.CheckEmpty(DBInstanceClass, schema.TypeString, "db_instance_class", "instance_type"); err != nil {
return errmsgs.WrapError(err)
}
DBInstanceNetType := string(Intranet)
DBInstanceDescription := connectivity.GetResourceData(d, "db_instance_description", "instance_name").(string)
if zone, ok := d.GetOk("zone_id"); ok && Trim(zone.(string)) != "" {
ZoneId = Trim(zone.(string))
}
vswitchId := Trim(d.Get("vswitch_id").(string))
InstanceNetworkType = string(Classic)
if vswitchId != "" {
VSwitchId = vswitchId
InstanceNetworkType = strings.ToUpper(string(Vpc))
// check vswitchId in zone
vsw, err := vpcService.DescribeVSwitch(vswitchId)
if err != nil {
return nil
}
if ZoneId == "" {
ZoneId = vsw.ZoneId
}
VPCId = vsw.VpcId
}
payType := string(Postpaid)
if v, ok := connectivity.GetResourceDataOk(d, "payment_type", "instance_charge_type"); ok && Trim(v.(string)) != "" {
payType = Trim(v.(string))
}
DBInstanceStorageType := connectivity.GetResourceData(d, "db_instance_storage_type", "storage_type").(string)
if err := errmsgs.CheckEmpty(DBInstanceStorageType, schema.TypeString, "db_instance_storage_type", "storage_type"); err != nil {
return errmsgs.WrapError(err)
}
ZoneIdSlave1 = d.Get("zone_id_slave1").(string)
ZoneIdSlave2 = d.Get("zone_id_slave2").(string)
SecurityIPList := LOCAL_HOST_IP
if len(d.Get("security_ips").(*schema.Set).List()) > 0 {
SecurityIPList = strings.Join(expandStringList(d.Get("security_ips").(*schema.Set).List())[:], COMMA_SEPARATED)
}
uuid, err := uuid.GenerateUUID()
if err != nil {
uuid = resource.UniqueId()
}
ClientToken := fmt.Sprintf("Terraform-AlibabacloudStack-%d-%s", time.Now().Unix(), uuid)
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "CreateDBInstance", "")
PolardbCreatedbinstanceResponse := PolardbCreatedbinstanceResponse{}
mergeMaps(request.QueryParams, map[string]string{
"EngineVersion": enginever,
"Engine": engine,
"Encryption": strconv.FormatBool(encryption),
"DBInstanceStorage": strconv.Itoa(DBInstanceStorage),
"DBInstanceClass": DBInstanceClass,
"DBInstanceNetType": DBInstanceNetType,
"DBInstanceDescription": DBInstanceDescription,
"InstanceNetworkType": InstanceNetworkType,
"VSwitchId": VSwitchId,
"PayType": payType,
"DBInstanceStorageType": DBInstanceStorageType,
"SecurityIPList": SecurityIPList,
"ClientToken": ClientToken,
"ZoneIdSlave1": ZoneIdSlave1,
"ZoneIdSlave2": ZoneIdSlave2,
"EncryptionKey": EncryptionKey,
"ZoneId": ZoneId,
"VPCId": VPCId,
"RoleARN": arnrole,
})
if tde := d.Get("tde_status"); tde == true && engine != "MySQL" {
request.QueryParams["TdeStatus"] = "1"
request.QueryParams["EncryptAlgorithm"] = EncryptAlgorithm
request.QueryParams["RoleARN"] = arnrole
if EncryptionKey != "" {
request.QueryParams["EncryptionKey"] = EncryptionKey
}
}
log.Printf("request245 %v", request.QueryParams)
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_polardb_db_instance", "CreateDBInstance", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug("CreateDBInstance", bresponse, request, request.QueryParams)
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbCreatedbinstanceResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "CreateDBInstance", errmsgs.AlibabacloudStackSdkGoERROR)
}
d.SetId(PolardbCreatedbinstanceResponse.DBInstanceId)
d.Set("connection_string", PolardbCreatedbinstanceResponse.ConnectionString)
stateConf := BuildStateConfByTimes([]string{"Creating"}, []string{"Running"}, d.Timeout(schema.TimeoutCreate), 5*time.Minute, PolardbService.PolardbDBInstanceStateRefreshFunc(d, client, d.Id(), []string{"Deleting"}), 100)
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
tde := d.Get("tde_status").(bool)
log.Printf(" ============================================= tde:%t, engine:%s", tde, engine)
if tde == true && engine == "MySQL" {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceTDE", "")
PolardbModifydbinstancetdeResponse := PolardbModifydbinstancetdeResponse{}
request.QueryParams["TDEStatus"] = "Enabled"
request.QueryParams["RoleARN"] = arnrole
request.QueryParams["EncryptAlgorithm"] = EncryptAlgorithm
if EncryptionKey != "" {
request.QueryParams["EncryptionKey"] = EncryptionKey
}
bresponse, err := client.ProcessCommonRequest(request)
addDebug("ModifyDBInstanceTDE", bresponse, request, request.QueryParams)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceTDE", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifydbinstancetdeResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceTDE", errmsgs.AlibabacloudStackSdkGoERROR)
}
stateConf := BuildStateConf([]string{"Disabled"}, []string{"Enabled"}, d.Timeout(schema.TimeoutCreate), 2*time.Minute, PolardbService.PolardbDBInstanceTdeStateRefreshFunc(d, client, d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
log.Print("enabled TDE")
}
if ssl := d.Get("enable_ssl"); ssl == true {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceSSL", "")
PolardbModifydbinstancesslResponse := PolardbModifydbinstancesslResponse{}
//request.QueryParams["Forwardedregionid"] = client.RegionId
request.QueryParams["DBInstanceId"] = d.Id()
request.QueryParams["SSLEnabled"] = "1"
request.QueryParams["ConnectionString"] = d.Get("connection_string").(string)
bresponse, err := client.ProcessCommonRequest(request)
addDebug("ModifyDBInstanceSSL", bresponse, request, request.QueryParams)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceSSL", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifydbinstancesslResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceSSL", errmsgs.AlibabacloudStackSdkGoERROR)
}
var target, process string
if engine == "MySQL" {
target = "Yes"
process = "No"
} else {
target = "on"
process = "off"
}
stateConf := BuildStateConf([]string{process}, []string{target}, d.Timeout(schema.TimeoutCreate), 2*time.Minute, PolardbService.PolardbDBInstanceSslStateRefreshFunc(d, client, d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
log.Print("enabled SSL")
}
return nil
}
func resourceAlibabacloudStackPolardbInstanceUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
PolardbService := PolardbService{client}
d.Partial(true)
stateConf := BuildStateConf([]string{"DBInstanceClassChanging", "DBInstanceNetTypeChanging"}, []string{"Running"}, d.Timeout(schema.TimeoutUpdate), 1*time.Minute, PolardbService.PolardbDBInstanceStateRefreshFunc(d, client, d.Id(), []string{"Deleting"}))
if d.HasChange("parameters") {
if err := PolardbService.ModifyParameters(d, client, "parameters"); 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 {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstancePayType", "")
PolardbModifydbinstancepaytypeResponse := PolardbModifydbinstancepaytypeResponse{}
request.QueryParams["DBInstanceId"] = d.Id()
request.QueryParams["PayType"] = string(payType)
request.QueryParams["AutoPay"] = "true"
period := d.Get("period").(int)
request.QueryParams["UsedTime"] = strconv.Itoa(period)
request.QueryParams["Period"] = string(Month)
if period > 9 {
request.QueryParams["UsedTime"] = strconv.Itoa(period / 12)
request.QueryParams["Period"] = string(Year)
}
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstancePayType", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifydbinstancepaytypeResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstancePayType", errmsgs.AlibabacloudStackSdkGoERROR)
}
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 := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyInstanceAutoRenewalAttribute", "")
PolardbModifyinstanceautorenewalattributeResponse := PolardbModifyinstanceautorenewalattributeResponse{}
request.QueryParams["DBInstanceId"] = d.Id()
auto_renew := d.Get("auto_renew").(bool)
if auto_renew {
request.QueryParams["AutoRenew"] = "True"
} else {
request.QueryParams["AutoRenew"] = "False"
}
request.QueryParams["Duration"] = strconv.Itoa(d.Get("auto_renew_period").(int))
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyInstanceAutoRenewalAttribute", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifyinstanceautorenewalattributeResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyInstanceAutoRenewalAttribute", errmsgs.AlibabacloudStackSdkGoERROR)
}
}
if d.HasChange("monitoring_period") {
period := d.Get("monitoring_period").(int)
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceMonitor", "")
PolardbModifydbinstancemonitorResponse := PolardbModifydbinstancemonitorResponse{}
request.QueryParams["DBInstanceId"] = d.Id()
request.QueryParams["Period"] = strconv.Itoa(period)
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceMonitor", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifydbinstancemonitorResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceMonitor", errmsgs.AlibabacloudStackSdkGoERROR)
}
}
if d.HasChange("maintain_time") {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceMaintainTime", "")
PolardbModifydbinstancemaintaintimeResponse := PolardbModifydbinstancemaintaintimeResponse{}
request.QueryParams["DBInstanceId"] = d.Id()
request.QueryParams["MaintainTime"] = d.Get("maintain_time").(string)
request.QueryParams["ClientToken"] = buildClientToken(request.GetActionName())
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceMaintainTime", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifydbinstancemaintaintimeResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceMaintainTime", errmsgs.AlibabacloudStackSdkGoERROR)
}
}
if d.IsNewResource() {
d.Partial(false)
return nil
}
if d.HasChanges("instance_name", "db_instance_description") {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceDescription", "")
PolardbModifydbinstancedescriptionResponse := PolardbModifydbinstancedescriptionResponse{}
request.QueryParams["DBInstanceId"] = d.Id()
request.QueryParams["DBInstanceDescription"] = connectivity.GetResourceData(d, "db_instance_description", "instance_name").(string)
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceDescription", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifydbinstancedescriptionResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceDescription", errmsgs.AlibabacloudStackSdkGoERROR)
}
}
if d.HasChange("security_ips") {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifySecurityIps", "")
PolardbModifysecurityipsResponse := PolardbModifysecurityipsResponse{}
ipList := expandStringList(d.Get("security_ips").(*schema.Set).List())
ipstr := strings.Join(ipList[:], COMMA_SEPARATED)
if ipstr == "" {
ipstr = LOCAL_HOST_IP
}
if err := PolardbService.ModifyDBSecurityIps(d, client, ipstr); err != nil {
return errmsgs.WrapError(err)
}
request.QueryParams["DBInstanceId"] = d.Id()
request.QueryParams["SecurityIps"] = ipstr
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifySecurityIps", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifysecurityipsResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifySecurityIps", errmsgs.AlibabacloudStackSdkGoERROR)
}
}
update := false
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceSpec", "")
PolardbModifydbinstancespecResponse := PolardbModifydbinstancespecResponse{}
request.QueryParams["DBInstanceId"] = d.Id()
if v, ok := connectivity.GetResourceDataOk(d, "payment_type", "instance_charge_type"); ok {
request.QueryParams["PayType"] = v.(string)
} else {
request.QueryParams["PayType"] = string(Postpaid)
}
if d.HasChanges("instance_type", "db_instance_class") {
request.QueryParams["DBInstanceClass"] = connectivity.GetResourceData(d, "db_instance_class", "instance_type").(string)
if err := errmsgs.CheckEmpty(request.QueryParams["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.QueryParams["DBInstanceStorage"] = strconv.Itoa(connectivity.GetResourceData(d, "db_instance_storage", "instance_storage").(int))
if err := errmsgs.CheckEmpty(request.QueryParams["DBInstanceStorage"], schema.TypeString, "db_instance_storage", "instance_storage"); err != nil {
return errmsgs.WrapError(err)
}
update = true
}
if update {
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
// wait instance status is running before modifying
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceSpec", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbModifydbinstancespecResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_db_instance", "ModifyDBInstanceSpec", errmsgs.AlibabacloudStackSdkGoERROR)
}
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
}
d.Partial(false)
engine := Trim(d.Get("engine").(string))
if d.HasChange("tde_status") && d.Get("tde_status").(bool) && engine == "MySQL" {
tde_req := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceTDE", "")
tde_req.QueryParams["DBInstanceId"] = d.Id()
tde_req.QueryParams["TDEStatus"] = "Enabled"
bresponse, err := client.ProcessCommonRequest(tde_req)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_polardb_account", "DeleteAccount", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
stateConf := BuildStateConf([]string{"Disabled"}, []string{"Enabled"}, d.Timeout(schema.TimeoutCreate), 2*time.Minute, PolardbService.PolardbDBInstanceTdeStateRefreshFunc(d, client, d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
log.Print("Updated TDE")
}
if d.HasChange("enable_ssl") {
ssl := d.Get("enable_ssl").(bool)
ssl_req := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyDBInstanceSSL", "")
ssl_req.QueryParams["DBInstanceId"] = d.Id()
ssl_req.QueryParams["ConnectionString"] = d.Get("connection_string").(string)
var target, process string
engine := Trim(d.Get("engine").(string))
if ssl == true {
ssl_req.QueryParams["SSLEnabled"] = "1"
if engine == "MySQL" {
target = "Yes"
process = "No"
} else {
target = "on"
process = "off"
}
} else {
ssl_req.QueryParams["SSLEnabled"] = "0"
if engine == "MySQL" {
target = "off"
process = "on"
} else {
target = "No"
process = "Yes"
}
}
bresponse, err := client.ProcessCommonRequest(ssl_req)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_polardb_account", "DeleteAccount", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
stateConf := BuildStateConf([]string{process}, []string{target}, d.Timeout(schema.TimeoutCreate), 2*time.Minute, PolardbService.PolardbDBInstanceSslStateRefreshFunc(d, client, d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
if err := PolardbService.WaitForDBInstance(d, client, Running, DefaultLongTimeout); err != nil {
return errmsgs.WrapError(err)
}
if ssl == true {
log.Print("Updated SSL to true")
} else {
log.Print("Updated SSL to false")
}
}
return nil
}
func resourceAlibabacloudStackPolardbInstanceRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
PolardbService := PolardbService{client}
instance, err := PolardbService.DoPolardbDescribedbinstanceattributeRequest(d.Id(), client)
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
ips, err := PolardbService.GetSecurityIps(d, client)
if err != nil {
return errmsgs.WrapError(err)
}
// 未完成
// tags, err := rdsService.describeTags(d)
// if err != nil {
// return errmsgs.WrapError(err)
// }
// if len(tags) > 0 {
// d.Set("tags", rdsService.tagsToMap(tags))
// }
monitoringPeriod, err := PolardbService.DoPolardbDescribedbinstancemonitorRequest(d, client)
if err != nil {
return errmsgs.WrapError(err)
}
period, err := strconv.Atoi(monitoringPeriod.Period)
if err != nil {
return errmsgs.WrapError(err)
}
d.Set("monitoring_period", period)
d.Set("security_ips", ips)
d.Set("security_ip_mode", instance.Items.DBInstanceAttribute[0].SecurityIPMode)
d.Set("engine", instance.Items.DBInstanceAttribute[0].Engine)
d.Set("engine_version", instance.Items.DBInstanceAttribute[0].EngineVersion)
connectivity.SetResourceData(d, instance.Items.DBInstanceAttribute[0].DBInstanceClass, "db_instance_class", "instance_type")
d.Set("port", instance.Items.DBInstanceAttribute[0].Port)
connectivity.SetResourceData(d, instance.Items.DBInstanceAttribute[0].DBInstanceStorage, "db_instance_storage", "instance_storage")
d.Set("zone_id", instance.Items.DBInstanceAttribute[0].ZoneId)
connectivity.SetResourceData(d, instance.Items.DBInstanceAttribute[0].PayType, "payment_type", "instance_charge_type")
d.Set("period", d.Get("period"))
d.Set("vswitch_id", instance.Items.DBInstanceAttribute[0].VSwitchId)
d.Set("connection_string", instance.Items.DBInstanceAttribute[0].ConnectionString)
connectivity.SetResourceData(d, instance.Items.DBInstanceAttribute[0].DBInstanceDescription, "db_instance_description", "instance_name")
d.Set("maintain_time", instance.Items.DBInstanceAttribute[0].MaintainTime)
connectivity.SetResourceData(d, instance.Items.DBInstanceAttribute[0].DBInstanceStorageType, "db_instance_storage_type", "storage_type")
engine := Trim(d.Get("engine").(string))
ssl_object, err := PolardbService.DescribeDBInstanceSSL(d.Id())
ssl := false
if (engine == "MySQL" && ssl_object["SSLEnabled"].(string) == "Yes") || (engine != "MySQL" && ssl_object["SSLEnabled"].(string) == "on") {
ssl = true
}
d.Set("enable_ssl", ssl)
tde_object, err := PolardbService.DescribeDBInstanceTDE(d.Id())
if err != nil {
return errmsgs.WrapError(err)
}
d.Set("tde_status", tde_object["TDEStatus"].(string) == "Enabled")
d.Set("encrypt_algorithm", tde_object["EncryptAlgorithm"].(string))
if err = PolardbService.RefreshParameters(d, client, "parameters"); err != nil {
return errmsgs.WrapError(err)
}
if instance.Items.DBInstanceAttribute[0].PayType == string(Prepaid) {
response, err := PolardbService.DoPolardbDescribeinstanceautorenewalattributeRequest(d, client)
if response != nil && len(response.Items.Item) > 0 {
renew := response.Items.Item[0]
d.Set("auto_renew", renew.AutoRenew == "True")
d.Set("auto_renew_period", renew.Duration)
}
period, err := computePeriodByUnit(instance.Items.DBInstanceAttribute[0].CreationTime, instance.Items.DBInstanceAttribute[0].ExpireTime, d.Get("period").(int), "Month")
if err != nil {
return errmsgs.WrapError(err)
}
d.Set("period", period)
}
return nil
}
func resourceAlibabacloudStackPolardbInstanceDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
PolardbService := PolardbService{client}
instance, err := PolardbService.DoPolardbDescribedbinstanceattributeRequest(d.Id(), client)
if err != nil {
if errmsgs.NotFoundError(err) {
return nil
}
return errmsgs.WrapError(err)
}
if PayType(instance.Items.DBInstanceAttribute[0].PayType) == Prepaid {
return errmsgs.WrapError(errmsgs.Error("At present, 'Prepaid' instance cannot be deleted and must wait it to be expired and release it automatically."))
}
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "DeleteDBInstance", "")
request.QueryParams["DBInstanceId"] = d.Id()
bresponse, err := client.ProcessCommonRequest(request)
if err != nil {
if bresponse == nil {
return errmsgs.WrapErrorf(err, "Process Common Request Failed")
}
errmsg := errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_polardb_account", "DeleteAccount", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
return PolardbService.WaitForDBInstance(d, client, Deleted, DefaultLongTimeout)
}
type PolardbCreatedbinstanceResponse struct {
RequestId string `json:"RequestId"`
DBInstanceId string `json:"DBInstanceId"`
OrderId string `json:"OrderId"`
ConnectionString string `json:"ConnectionString"`
Port string `json:"Port"`
}
type PolardbModifydbinstancedescriptionResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifydbinstancemaintaintimeResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifydbinstancemonitorResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifydbinstancepaytypeResponse struct {
RequestId string `json:"RequestId"`
DBInstanceId string `json:"DBInstanceId"`
OrderId int `json:"OrderId"`
}
type PolardbModifydbinstancesslResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifydbinstancespecResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifydbinstancetdeResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifyinstanceautorenewalattributeResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbDeletedbinstanceResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifysecurityipsResponse struct {
RequestId string `json:"RequestId"`
TaskId interface{} `json:"TaskId"`
}