in alibabacloudstack/resource_apsarastack_polardb_account.go [145:343]
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
}