alibabacloudstack/resource_apsarastack_polardb_account.go (362 lines of code) (raw):
package alibabacloudstack
// Generated By apsara-orchestration-generator
// Product polardb Resouce Account
import (
"encoding/json"
"fmt"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func resourceAlibabacloudStackPolardbAccount() *schema.Resource {
resource := &schema.Resource{
Schema: map[string]*schema.Schema{
"account_description": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"account_name": {
Type: schema.TypeString,
Required: true,
},
"account_password": {
Type: schema.TypeString,
Required: true,
},
"account_type": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"data_base_instance_id": {
Type: schema.TypeString,
Required: true,
},
"database_privileges": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"account_privilege": {
Type: schema.TypeString,
Optional: true,
},
"account_privilege_detail": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"data_base_name": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"priv_exceeded": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"status": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackPolardbAccountCreate,
resourceAlibabacloudStackPolardbAccountRead, resourceAlibabacloudStackPolardbAccountUpdate, resourceAlibabacloudStackPolardbAccountDelete)
return resource
}
func resourceAlibabacloudStackPolardbAccountCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "CreateAccount", "")
PolardbCreateaccountResponse := PolardbCreateaccountResponse{}
if v, ok := d.GetOk("account_description"); ok && v != "" {
request.QueryParams["AccountDescription"] = v.(string)
}
if v, ok := d.GetOk("account_name"); ok && v != "" {
request.QueryParams["AccountName"] = v.(string)
} else {
return fmt.Errorf("AccountName is required")
}
if v, ok := d.GetOk("account_password"); ok && v != "" {
request.QueryParams["AccountPassword"] = v.(string)
} else {
return fmt.Errorf("AccountPassword is required")
}
if v, ok := d.GetOk("account_type"); ok && v != "" {
request.QueryParams["AccountType"] = v.(string)
}
if v, ok := d.GetOk("data_base_instance_id"); ok && v != "" {
request.QueryParams["DBInstanceId"] = v.(string)
} else {
return fmt.Errorf("DataBaseInstanceId is required")
}
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", "CreateAccount", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &PolardbCreateaccountResponse)
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg,
"alibabacloudstack_polardb_account", "CreateAccount", errmsgs.AlibabacloudStackSdkGoERROR)
}
account_name := d.Get("account_name").(string)
data_base_instance_id := d.Get("data_base_instance_id").(string)
d.SetId(fmt.Sprintf("%s", data_base_instance_id+":"+account_name))
return nil
}
func resourceAlibabacloudStackPolardbAccountUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
if d.HasChanges("database_privileges") {
o, n := d.GetChange("database_privileges")
oldPrivileges := o.([]interface{})
newPrivileges := n.([]interface{})
newPrivilegesMap := make(map[string]string)
oldPrivilegesMap := make(map[string]string)
for _, np := range newPrivileges {
privilege := np.(map[string]interface{})
dbName := privilege["data_base_name"].(string)
accountPrivilege := privilege["account_privilege"].(string)
if dbName != "" && accountPrivilege != "" {
newPrivilegesMap[dbName] = accountPrivilege
}
}
for _, op := range oldPrivileges {
privilege := op.(map[string]interface{})
dbName := privilege["data_base_name"].(string)
accountPrivilege := privilege["account_privilege"].(string)
if dbName != "" && accountPrivilege != "" {
oldPrivilegesMap[dbName] = accountPrivilege
}
}
//新增权限的情况:新增dbname或者之前dbname的privilege有更新
grant_database_privilegesList := make([]map[string]interface{}, 0)
for dbName, accountPrivilege := range newPrivilegesMap {
if _, ok := oldPrivilegesMap[dbName]; !ok || oldPrivilegesMap[dbName] != accountPrivilege {
grant_database_privilegesList = append(grant_database_privilegesList, map[string]interface{}{
"account_privilege": accountPrivilege,
"data_base_name": dbName,
})
}
}
fmt.Println("grant_database_privilegesList", grant_database_privilegesList)
revoke_database_privilegesList := make([]map[string]interface{}, 0)
for dbName, accountPrivilege := range oldPrivilegesMap {
if _, ok := newPrivilegesMap[dbName]; !ok || newPrivilegesMap[dbName] != accountPrivilege {
revoke_database_privilegesList = append(revoke_database_privilegesList, map[string]interface{}{
"account_privilege": accountPrivilege,
"data_base_name": dbName,
})
}
}
fmt.Println("revoke_database_privilegesList", revoke_database_privilegesList)
if len(grant_database_privilegesList) > 0 {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "GrantAccountPrivilege", "")
if v, ok := d.GetOk("account_name"); ok {
request.QueryParams["AccountName"] = v.(string)
} else {
return fmt.Errorf("AccountName is required")
}
if v, ok := d.GetOk("data_base_instance_id"); ok {
request.QueryParams["DBInstanceId"] = v.(string)
} else {
return fmt.Errorf("DataBaseInstanceId is required")
}
for _, item := range grant_database_privilegesList {
if v, ok := item["account_privilege"]; ok && v != "" {
request.QueryParams["AccountPrivilege"] = v.(string)
} else {
return fmt.Errorf("AccountPrivilege is required")
}
if v, ok := item["data_base_name"]; ok && v != "" {
request.QueryParams["DBName"] = v.(string)
} else {
return fmt.Errorf("DataBaseName is required")
}
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", "GrantAccountPrivilege", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
}
}
//撤销权限的情况:新增dbname或者之前dbname的privilege有更新
if len(revoke_database_privilegesList) > 0 {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "RevokeAccountPrivilege", "")
if v, ok := d.GetOk("account_name"); ok {
request.QueryParams["AccountName"] = v.(string)
} else {
return fmt.Errorf("AccountName is required")
}
if v, ok := d.GetOk("data_base_instance_id"); ok {
request.QueryParams["DBInstanceId"] = v.(string)
} else {
return fmt.Errorf("DataBaseInstanceId is required")
}
for _, item := range revoke_database_privilegesList {
if v, ok := item["account_privilege"]; ok && v != "" {
request.QueryParams["AccountPrivilege"] = v.(string)
} else {
return fmt.Errorf("AccountPrivilege is required")
}
if v, ok := item["data_base_name"]; ok && v != "" {
request.QueryParams["DBName"] = v.(string)
} else {
return fmt.Errorf("DataBaseName is required")
}
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", "GrantAccountPrivilege", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
}
}
}
if d.HasChanges("account_description") {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ModifyAccountDescription", "")
if v, ok := d.GetOk("account_description"); ok {
request.QueryParams["AccountDescription"] = v.(string)
} else {
return fmt.Errorf("AccountDescription is required")
}
if v, ok := d.GetOk("account_name"); ok {
request.QueryParams["AccountName"] = v.(string)
} else {
return fmt.Errorf("AccountName is required")
}
if v, ok := d.GetOk("data_base_instance_id"); ok {
request.QueryParams["DBInstanceId"] = v.(string)
} else {
return fmt.Errorf("DataBaseInstanceId is required")
}
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", "ModifyAccountDescription", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
}
if d.HasChanges("account_password") {
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "ResetAccountPassword", "")
if v, ok := d.GetOk("account_name"); ok {
request.QueryParams["AccountName"] = v.(string)
} else {
return fmt.Errorf("AccountName is required")
}
if v, ok := d.GetOk("account_password"); ok {
request.QueryParams["AccountPassword"] = v.(string)
} else {
return fmt.Errorf("AccountPassword is required")
}
if v, ok := d.GetOk("data_base_instance_id"); ok {
request.QueryParams["DBInstanceId"] = v.(string)
} else {
return fmt.Errorf("DataBaseInstanceId is required")
}
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", "ResetAccountPassword", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
}
return nil
}
func resourceAlibabacloudStackPolardbAccountRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
polardbaccountservice :=
PolardbService{client}
response, err := polardbaccountservice.DescribeDBAccount(d.Id())
if err != nil {
return errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, "alibabacloudstack_polardb_account", errmsgs.AlibabacloudStackSdkGoERROR)
}
data := response
d.Set("account_description", data.Accounts.DBInstanceAccount[0].AccountDescription)
d.Set("account_name", data.Accounts.DBInstanceAccount[0].AccountName)
d.Set("account_type", data.Accounts.DBInstanceAccount[0].AccountType)
d.Set("data_base_instance_id", data.Accounts.DBInstanceAccount[0].DBInstanceId)
d.Set("priv_exceeded", data.Accounts.DBInstanceAccount[0].PrivExceeded)
d.Set("status", data.Accounts.DBInstanceAccount[0].AccountStatus)
var databasePrivileges []map[string]interface{}
for _, dbPrivilege := range data.Accounts.DBInstanceAccount[0].DatabasePrivileges.DatabasePrivilege {
privilege := map[string]interface{}{
"account_privilege": dbPrivilege.AccountPrivilege,
"account_privilege_detail": dbPrivilege.AccountPrivilegeDetail,
"data_base_name": dbPrivilege.DBName,
}
databasePrivileges = append(databasePrivileges, privilege)
}
d.Set("database_privileges", databasePrivileges)
return nil
}
func resourceAlibabacloudStackPolardbAccountDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := client.NewCommonRequest("POST", "polardb", "2024-01-30", "DeleteAccount", "")
if v, ok := d.GetOk("account_name"); ok && v != "" {
request.QueryParams["AccountName"] = v.(string)
} else {
return fmt.Errorf("AccountName is required")
}
if v, ok := d.GetOk("data_base_instance_id"); ok && v != "" {
request.QueryParams["DBInstanceId"] = v.(string)
} else {
return fmt.Errorf("DataBaseInstanceId is required")
}
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 nil
}
type PolardbCreateaccountResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbGrantaccountprivilegeResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbLockaccountResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbModifyaccountdescriptionResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbResetaccountResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbResetaccountforpgResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbResetaccountpasswordResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbRevokeaccountprivilegeResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbUnlockaccountResponse struct {
RequestId string `json:"RequestId"`
}
type PolardbDeleteaccountResponse struct {
RequestId string `json:"RequestId"`
}