func resourceAlibabacloudStackPolardbAccountUpdate()

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
}