alibabacloudstack/service_apsarastack_ram.go (799 lines of code) (raw):

package alibabacloudstack import ( "encoding/json" "fmt" "reflect" "sort" "strconv" "strings" "time" "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests" "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs" "github.com/aliyun/alibaba-cloud-sdk-go/services/ram" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity" "github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" ) type Effect string const ( Allow Effect = "Allow" Deny Effect = "Deny" ) type Principal struct { Service []string RAM []string } type RolePolicyStatement struct { Effect Effect Action string Principal Principal } type RolePolicy struct { Statement []RolePolicyStatement Version string } type PolicyStatement struct { Effect Effect Action interface{} Resource interface{} } type Policy struct { Statement []PolicyStatement Version string } type RamService struct { client *connectivity.AlibabacloudStackClient } func (s *RamService) ParseRolePolicyDocument(policyDocument string) (RolePolicy, error) { var policy RolePolicy err := json.Unmarshal([]byte(policyDocument), &policy) if err != nil { return RolePolicy{}, errmsgs.WrapError(err) } return policy, nil } func (s *RamService) ParsePolicyDocument(policyDocument string) (statement []map[string]interface{}, version string, err error) { policy := Policy{} err = json.Unmarshal([]byte(policyDocument), &policy) if err != nil { err = errmsgs.WrapError(err) return } version = policy.Version statement = make([]map[string]interface{}, 0, len(policy.Statement)) for _, v := range policy.Statement { item := make(map[string]interface{}) item["effect"] = v.Effect if val, ok := v.Action.([]interface{}); ok { item["action"] = val } else { item["action"] = []interface{}{v.Action} } if val, ok := v.Resource.([]interface{}); ok { item["resource"] = val } else { item["resource"] = []interface{}{v.Resource} } statement = append(statement, item) } return } func (s *RamService) AssembleRolePolicyDocument(ramUser, service []interface{}, version string) (string, error) { services := expandStringList(service) users := expandStringList(ramUser) statement := RolePolicyStatement{ Effect: Allow, Action: "sts:AssumeRole", Principal: Principal{ RAM: users, Service: services, }, } policy := RolePolicy{ Version: version, Statement: []RolePolicyStatement{statement}, } data, err := json.Marshal(policy) if err != nil { return "", errmsgs.WrapError(err) } return string(data), nil } func (s *RamService) AssemblePolicyDocument(document []interface{}, version string) (string, error) { var statements []PolicyStatement for _, v := range document { doc := v.(map[string]interface{}) actions := expandStringList(doc["action"].([]interface{})) resources := expandStringList(doc["resource"].([]interface{})) statement := PolicyStatement{ Effect: Effect(doc["effect"].(string)), Action: actions, Resource: resources, } statements = append(statements, statement) } policy := Policy{ Version: version, Statement: statements, } data, err := json.Marshal(policy) if err != nil { return "", errmsgs.WrapError(err) } return string(data), nil } func (s *RamService) JudgeRolePolicyPrincipal(roleName string) error { request := ram.CreateGetRoleRequest() s.client.InitRpcRequest(*request.RpcRequest) request.RoleName = roleName raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetRole(request) }) resp, ok := raw.(*ram.GetRoleResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse) } return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, roleName, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) policy, err := s.ParseRolePolicyDocument(resp.Role.AssumeRolePolicyDocument) if err != nil { return errmsgs.WrapError(err) } for _, v := range policy.Statement { for _, val := range v.Principal.Service { if strings.Trim(val, " ") == "ecs.aliyuncs.com" { return nil } } } return errmsgs.WrapError(fmt.Errorf("Role policy services must contains 'ecs.aliyuncs.com', Now is \n%v.", resp.Role.AssumeRolePolicyDocument)) } func (s *RamService) GetIntersection(dataMap []map[string]interface{}, allDataMap map[string]interface{}) (allData []interface{}) { for _, v := range dataMap { if len(v) > 0 { for key := range allDataMap { if _, ok := v[key]; !ok { allDataMap[key] = nil } } } } for _, v := range allDataMap { if v != nil { allData = append(allData, v) } } return } func (s *RamService) DescribeRamUser(id string) (*ram.User, error) { user := &ram.User{} listUsersRequest := ram.CreateListUsersRequest() s.client.InitRpcRequest(*listUsersRequest.RpcRequest) listUsersRequest.MaxItems = requests.NewInteger(100) var userName string for { raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.ListUsers(listUsersRequest) }) response, ok := raw.(*ram.ListUsersResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return user, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, listUsersRequest.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(listUsersRequest.GetActionName(), raw, listUsersRequest.RegionId, listUsersRequest) for _, user := range response.Users.User { if user.UserId == id { userName = user.UserName break } } if userName != "" || !response.IsTruncated { break } listUsersRequest.Marker = response.Marker } if userName == "" { // the d.Id() has changed from userName to userId since v1.44.0, add the logic for backward compatibility. userName = id } getUserRequest := ram.CreateGetUserRequest() s.client.InitRpcRequest(*getUserRequest.RpcRequest) getUserRequest.UserName = userName raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetUser(getUserRequest) }) response, ok := raw.(*ram.GetUserResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist.User"}) { return user, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return user, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, getUserRequest.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(getUserRequest.GetActionName(), raw, getUserRequest.RpcRequest, getUserRequest) return &response.User, nil } func (s *RamService) WaitForRamUser(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamUser(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } return errmsgs.WrapError(err) } if object.UserId == id { break } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.DefaultTimeoutMsg, id, GetFunc(1), errmsgs.ProviderERROR) } } return nil } func (s *RamService) DescribeRamGroupMembership(id string) (*ram.ListUsersForGroupResponse, error) { response := &ram.ListUsersForGroupResponse{} request := ram.CreateListUsersForGroupRequest() s.client.InitRpcRequest(*request.RpcRequest) request.GroupName = id raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.ListUsersForGroup(request) }) response, ok := raw.(*ram.ListUsersForGroupResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if len(response.Users.User) > 0 { return response, nil } return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } func (s *RamService) WaitForRamGroupMembership(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamGroupMembership(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, strconv.Itoa(len(object.Users.User)), status, errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamLoginProfile(id string) (*ram.GetLoginProfileResponse, error) { response := &ram.GetLoginProfileResponse{} request := ram.CreateGetLoginProfileRequest() s.client.InitRpcRequest(*request.RpcRequest) request.UserName = id raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetLoginProfile(request) }) response, ok := raw.(*ram.GetLoginProfileResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist.User.LoginProfile", "EntityNotExist.User"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return response, nil } func (s *RamService) WaitForRamLoginProfile(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamLoginProfile(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.LoginProfile.UserName == id { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.LoginProfile.UserName, id, errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamGroupPolicyAttachment(id string) (*ram.Policy, error) { response := &ram.Policy{} request := ram.CreateListPoliciesForGroupRequest() s.client.InitRpcRequest(*request.RpcRequest) parts, err := ParseResourceId(id, 4) if err != nil { return response, errmsgs.WrapError(err) } request.GroupName = parts[3] raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.ListPoliciesForGroup(request) }) listPoliciesForGroupResponse, ok := raw.(*ram.ListPoliciesForGroupResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(listPoliciesForGroupResponse.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist.Group"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if len(listPoliciesForGroupResponse.Policies.Policy) > 0 { for _, v := range listPoliciesForGroupResponse.Policies.Policy { if v.PolicyName == parts[1] && v.PolicyType == parts[2] { return &v, nil } } } return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } func (s *RamService) WaitForRamGroupPolicyAttachment(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 4) if err != nil { return errmsgs.WrapError(err) } for { object, err := s.DescribeRamGroupPolicyAttachment(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.PolicyName, parts[1], errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamAccountAlias(id string) (*ram.GetAccountAliasResponse, error) { response := &ram.GetAccountAliasResponse{} request := ram.CreateGetAccountAliasRequest() s.client.InitRpcRequest(*request.RpcRequest) raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetAccountAlias(request) }) response, ok := raw.(*ram.GetAccountAliasResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return response, nil } func (s *RamService) DescribeRamAccessKey(id, userName string) (*ram.AccessKey, error) { key := &ram.AccessKey{} request := ram.CreateListAccessKeysRequest() s.client.InitRpcRequest(*request.RpcRequest) request.UserName = userName raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.ListAccessKeys(request) }) response, ok := raw.(*ram.ListAccessKeysResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist"}) { return key, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RamAccessKey", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return key, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) for _, accessKey := range response.AccessKeys.AccessKey { if accessKey.AccessKeyId == id { return &accessKey, nil } } return key, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("RamAccessKey", id)), errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } func (s *RamService) WaitForRamAccessKey(id, useName string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamAccessKey(id, useName) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if string(status) == object.Status { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, status, errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamPolicy(id string) (*ram.GetPolicyResponse, error) { response := &ram.GetPolicyResponse{} request := ram.CreateGetPolicyRequest() s.client.InitRpcRequest(*request.RpcRequest) request.PolicyName = id request.PolicyType = "Custom" raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetPolicy(request) }) response, ok := raw.(*ram.GetPolicyResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist.Policy"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return response, nil } func (s *RamService) WaitForRamPolicy(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamPolicy(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.Policy.PolicyName == id { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Policy.PolicyName, id, errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamRoleAttachment(id string) (*ecs.DescribeInstanceRamRoleResponse, error) { response := &ecs.DescribeInstanceRamRoleResponse{} parts, err := ParseResourceId(id, 2) if err != nil { return response, errmsgs.WrapError(err) } request := ecs.CreateDescribeInstanceRamRoleRequest() s.client.InitRpcRequest(*request.RpcRequest) request.InstanceIds = fmt.Sprintf("[\"%s\"]", parts[1]) var raw interface{} err = resource.Retry(5*time.Minute, func() *resource.RetryError { raw, err = s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) { return ecsClient.DescribeInstanceRamRole(request) }) if err != nil { if errmsgs.IsExpectedErrors(err, []string{"unexpected end of JSON input"}) { return resource.RetryableError(errmsgs.WrapError(err)) } return resource.NonRetryableError(err) } return nil }) response, ok := raw.(*ecs.DescribeInstanceRamRoleResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"InvalidRamRole.NotFound"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) instRoleSets := response.InstanceRamRoleSets.InstanceRamRoleSet if len(instRoleSets) > 0 { var instIds []string for _, item := range instRoleSets { if item.RamRoleName == parts[0] { instIds = append(instIds, item.InstanceId) } } ids := strings.Split(strings.TrimRight(strings.TrimLeft(strings.Replace(strings.Split(id, ":")[1], "\"", "", -1), "["), "]"), ",") sort.Strings(instIds) sort.Strings(ids) if reflect.DeepEqual(instIds, ids) { return response, nil } } return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } func (s *RamService) WaitForRamRoleAttachment(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamRoleAttachment(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, strconv.Itoa(object.TotalCount), status, errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamRole(id string) (*ram.GetRoleResponse, error) { response := &ram.GetRoleResponse{} request := ram.CreateGetRoleRequest() s.client.InitRpcRequest(*request.RpcRequest) request.RoleName = id raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetRole(request) }) response, ok := raw.(*ram.GetRoleResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(raw.(*ram.GetRoleResponse).BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist.Role"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return response, nil } func (s *RamService) WaitForRamRole(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamRole(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.Role.RoleName == id && status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Role.RoleName, id, errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamUserPolicyAttachment(id string) (*ram.Policy, error) { response := &ram.Policy{} request := ram.CreateListPoliciesForUserRequest() s.client.InitRpcRequest(*request.RpcRequest) parts, err := ParseResourceId(id, 4) if err != nil { return response, errmsgs.WrapError(err) } request.UserName = parts[3] raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.ListPoliciesForUser(request) }) listPoliciesForUserResponse, ok := raw.(*ram.ListPoliciesForUserResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(raw.(*ram.ListPoliciesForUserResponse).BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if len(listPoliciesForUserResponse.Policies.Policy) > 0 { for _, v := range listPoliciesForUserResponse.Policies.Policy { if v.PolicyName == parts[1] && v.PolicyType == parts[2] { return &v, nil } } } return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } func (s *RamService) WaitForRamUserPolicyAttachment(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 4) if err != nil { return errmsgs.WrapError(err) } for { object, err := s.DescribeRamUserPolicyAttachment(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.PolicyName, parts[1], errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamRolePolicyAttachment(id string) (*ram.Policy, error) { response := &ram.Policy{} request := ram.CreateListPoliciesForRoleRequest() s.client.InitRpcRequest(*request.RpcRequest) parts, err := ParseResourceId(id, 4) if err != nil { return response, errmsgs.WrapError(err) } request.RoleName = parts[3] raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.ListPoliciesForRole(request) }) listPoliciesForRoleResponse, ok := raw.(*ram.ListPoliciesForRoleResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(raw.(*ram.ListPoliciesForRoleResponse).BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist.Role"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if len(listPoliciesForRoleResponse.Policies.Policy) > 0 { for _, v := range listPoliciesForRoleResponse.Policies.Policy { if v.PolicyName == parts[1] && v.PolicyType == parts[2] { return &v, nil } } } return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.ProviderERROR) } func (s *RamService) WaitForRamRolePolicyAttachment(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) parts, err := ParseResourceId(id, 4) if err != nil { return errmsgs.WrapError(err) } for { object, err := s.DescribeRamRolePolicyAttachment(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.PolicyName, parts[1], errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamGroup(id string) (*ram.GetGroupResponse, error) { response := &ram.GetGroupResponse{} request := ram.CreateGetGroupRequest() s.client.InitRpcRequest(*request.RpcRequest) request.GroupName = id raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetGroup(request) }) response, ok := raw.(*ram.GetGroupResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } if errmsgs.IsExpectedErrors(err, []string{"EntityNotExist.Group"}) { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) if response.Group.GroupName != id { return response, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR) } return response, nil } func (s *RamService) WaitForRamGroup(id string, status Status, timeout int) error { deadline := time.Now().Add(time.Duration(timeout) * time.Second) for { object, err := s.DescribeRamGroup(id) if err != nil { if errmsgs.NotFoundError(err) { if status == Deleted { return nil } } else { return errmsgs.WrapError(err) } } if object.Group.GroupName == id && status != Deleted { return nil } if time.Now().After(deadline) { return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Group.GroupName, id, errmsgs.ProviderERROR) } } } func (s *RamService) DescribeRamAccountPasswordPolicy(id string) (*ram.GetPasswordPolicyResponse, error) { response := &ram.GetPasswordPolicyResponse{} request := ram.CreateGetPasswordPolicyRequest() s.client.InitRpcRequest(*request.RpcRequest) raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetPasswordPolicy(request) }) response, ok := raw.(*ram.GetPasswordPolicyResponse) if err != nil { errmsg := "" if ok { errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse) } return response, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg) } addDebug(request.GetActionName(), raw, request.RpcRequest, request) return response, nil }