alicloud/service_alicloud_yundun_bastionhost.go (1,200 lines of code) (raw):

package alicloud import ( "fmt" "time" "github.com/PaesslerAG/jsonpath" "github.com/aliyun/alibaba-cloud-sdk-go/services/ram" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/pkg/errors" ) type YundunBastionhostService struct { client *connectivity.AliyunClient } type BastionhostPolicyRequired struct { PolicyName string PolicyType string } const ( BastionhostRoleDefaultDescription = "Bastionhost will access other cloud resources by playing this role by default" BastionhostRoleName = "AliyunBastionHostDefaultRole" BastionhostAssumeRolePolicy = `{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "bastionhost.aliyuncs.com" ] } } ], "Version": "1" }` ) var bastionhostpolicyRequired = []BastionhostPolicyRequired{ { PolicyName: "AliyunBastionHostRolePolicy", PolicyType: "System", }, } func (s *YundunBastionhostService) DescribeBastionhostInstance(id string) (object map[string]interface{}, err error) { client := s.client var response map[string]interface{} action := "DescribeInstanceAttribute" request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) || IsExpectedErrors(err, []string{"InvalidApi"}) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus"}) { return object, WrapErrorf(NotFoundErr("Instance", id), NotFoundWithResponse, response) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.InstanceAttribute", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.InstanceAttribute", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostInstances(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "DescribeInstances" request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": []string{id}, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) || IsExpectedErrors(err, []string{"InvalidApi"}) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Instances", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Instances", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("BastionhostInstance", id), NotFoundWithResponse, response) } object = v.([]interface{})[0].(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) StartBastionhostInstance(instanceId string, vSwitchId string, securityGroupIds []string) (err error) { client := s.client var response map[string]interface{} action := "StartInstance" request := map[string]interface{}{ "VswitchId": vSwitchId, "InstanceId": instanceId, "SecurityGroupIds": securityGroupIds, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, instanceId, action, AlibabaCloudSdkGoERROR) } return nil } func (s *YundunBastionhostService) UpdateBastionhostInstanceDescription(instanceId string, description string) (err error) { client := s.client var response map[string]interface{} action := "ModifyInstanceAttribute" request := map[string]interface{}{ "Description": description, "InstanceId": instanceId, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, instanceId, action, AlibabaCloudSdkGoERROR) } return nil } func (s *YundunBastionhostService) UpdateBastionhostSecurityGroups(instanceId string, securityGroups []string) (err error) { client := s.client var response map[string]interface{} action := "ConfigInstanceSecurityGroups" request := map[string]interface{}{ "AuthorizedSecurityGroups": securityGroups, "InstanceId": instanceId, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, instanceId, action, AlibabaCloudSdkGoERROR) } return nil } func (s *YundunBastionhostService) UpdateInstanceSpec(schemaSpecMap map[string]string, d *schema.ResourceData, meta interface{}) (err error) { client := s.client var endpoint string action := "ModifyInstance" request := map[string]interface{}{ "RegionId": connectivity.Hangzhou, "InstanceId": d.Id(), "ProductCode": "bastionhost", "ProductType": "bastionhost", "SubscriptionType": "Subscription", "ModifyType": "Upgrade", } if client.IsInternationalAccount() { request["RegionId"] = connectivity.APSouthEast1 request["ProductType"] = "bastionhost_std_public_intl" } parameterMapList := make([]map[string]interface{}, 0) for schemaName, spec := range schemaSpecMap { parameterMapList = append(parameterMapList, map[string]interface{}{ "Code": schemaName, "Value": d.Get(spec), }) } request["Parameter"] = parameterMapList wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(3*time.Minute, func() *resource.RetryError { _, err = client.RpcPostWithEndpoint("BssOpenApi", "2017-12-14", action, nil, request, true, endpoint) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } if !client.IsInternationalAccount() && IsExpectedErrors(err, []string{"NotApplicable"}) { request["RegionId"] = connectivity.APSouthEast1 request["ProductType"] = "bastionhost_std_public_intl" endpoint = connectivity.BssOpenAPIEndpointInternational return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } return nil } func (s *YundunBastionhostService) BastionhostInstanceRefreshFunc(id string, failStates []string) resource.StateRefreshFunc { return func() (interface{}, string, error) { object, err := s.DescribeBastionhostInstance(id) if err != nil { if NotFoundError(err) { // Set this to nil if nothing matched return nil, "", nil } return nil, "", WrapError(err) } for _, failState := range failStates { if fmt.Sprint(object["InstanceStatus"]) == failState { return object, fmt.Sprint(object["InstanceStatus"]), WrapError(Error(FailedToReachTargetStatus, fmt.Sprint(object["InstanceStatus"]))) } } return object, fmt.Sprint(object["InstanceStatus"]), nil } } func (s *YundunBastionhostService) createRole() error { createRoleRequest := ram.CreateCreateRoleRequest() createRoleRequest.RoleName = BastionhostRoleName createRoleRequest.Description = BastionhostRoleDefaultDescription createRoleRequest.AssumeRolePolicyDocument = BastionhostAssumeRolePolicy raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.CreateRole(createRoleRequest) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, BastionhostRoleName, createRoleRequest.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(createRoleRequest.GetActionName(), raw, createRoleRequest.RpcRequest, createRoleRequest) return nil } func (s *YundunBastionhostService) attachPolicy(policyToBeAttached []BastionhostPolicyRequired) error { attachPolicyRequest := ram.CreateAttachPolicyToRoleRequest() for _, policy := range policyToBeAttached { attachPolicyRequest.RoleName = BastionhostRoleName attachPolicyRequest.PolicyName = policy.PolicyName attachPolicyRequest.PolicyType = policy.PolicyType raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.AttachPolicyToRole(attachPolicyRequest) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, BastionhostRoleName, attachPolicyRequest.GetActionName(), AlibabaCloudSdkGoERROR) } if response, err := raw.(*ram.AttachPolicyToRoleResponse); !err || !response.IsSuccess() { return WrapError(errors.New("attach policy to role failed")) } addDebug(attachPolicyRequest.GetActionName(), raw, attachPolicyRequest.RpcRequest, attachPolicyRequest) } return nil } func (s *YundunBastionhostService) ProcessRolePolicy() error { getRoleRequest := ram.CreateGetRoleRequest() getRoleRequest.RoleName = BastionhostRoleName raw, err := s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.GetRole(getRoleRequest) }) response, _ := raw.(*ram.GetRoleResponse) if err != nil || response == nil || response.Role.RoleName != BastionhostRoleName { if err := s.createRole(); err != nil { return err } } addDebug(getRoleRequest.GetActionName(), raw, getRoleRequest.RpcRequest, getRoleRequest) listPolicyForRoleRequest := ram.CreateListPoliciesForRoleRequest() listPolicyForRoleRequest.RoleName = BastionhostRoleName raw, err = s.client.WithRamClient(func(ramClient *ram.Client) (interface{}, error) { return ramClient.ListPoliciesForRole(listPolicyForRoleRequest) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, BastionhostRoleName, listPolicyForRoleRequest.GetActionName(), AlibabaCloudSdkGoERROR) } addDebug(listPolicyForRoleRequest.GetActionName(), raw, listPolicyForRoleRequest.RpcRequest, listPolicyForRoleRequest) var policyToAttach []BastionhostPolicyRequired if response, _ := raw.(*ram.ListPoliciesForRoleResponse); response != nil && response.IsSuccess() { for _, required := range bastionhostpolicyRequired { contains := false for _, policy := range response.Policies.Policy { if required.PolicyName == policy.PolicyName { contains = true } } if !contains { policyToAttach = append(policyToAttach, required) } } } if policyToAttach != nil && len(policyToAttach) > 0 { return s.attachPolicy(policyToAttach) } return nil } func (s *YundunBastionhostService) ListTagResources(id string, resourceType string) (object interface{}, err error) { client := s.client action := "ListTagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": id, } tags := make([]interface{}, 0) var response map[string]interface{} for { wait := incrementalWait(3*time.Second, 5*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } addDebug(action, response, request) v, err := jsonpath.Get("$.TagResources", response) if err != nil { return resource.NonRetryableError(WrapErrorf(err, FailedGetAttributeMsg, id, "$.TagResources", response)) } if v != nil { tags = append(tags, v.([]interface{})...) } return nil }) if err != nil { err = WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) return } if response["NextToken"] == nil { break } request["NextToken"] = response["NextToken"] } return tags, nil } func (s *YundunBastionhostService) setInstanceTags(d *schema.ResourceData, resourceType TagResourceType) (err error) { client := s.client if d.HasChange("tags") { added, removed := parsingTags(d) if len(removed) > 0 { var response map[string]interface{} action := "UntagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": d.Id(), } for i, key := range removed { request[fmt.Sprintf("TagKey.%d", i+1)] = key } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } return nil } if len(added) > 0 { var response map[string]interface{} action := "TagResources" request := map[string]interface{}{ "RegionId": s.client.RegionId, "ResourceType": resourceType, "ResourceId.1": d.Id(), } count := 1 for key, value := range added { request[fmt.Sprintf("Tag.%d.Key", count)] = key request[fmt.Sprintf("Tag.%d.Value", count)] = value count++ } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR) } return nil } } return nil } func (s *YundunBastionhostService) UpdateResourceGroup(resourceId, resourceType, resourceGroupId string) (err error) { client := s.client var response map[string]interface{} action := "MoveResourceGroup" request := map[string]interface{}{ "RegionId": client.RegionId, "ResourceType": resourceType, "ResourceId": resourceId, "ResourceGroupId": resourceGroupId, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, false) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, resourceId, action, AlibabaCloudSdkGoERROR) } return nil } func (s *YundunBastionhostService) DescribeBastionhostUserGroup(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetUserGroup" parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": parts[0], "UserGroupId": parts[1], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:UserGroup", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.UserGroup", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.UserGroup", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostUser(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetUser" parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": parts[0], "UserId": parts[1], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:User", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.User", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.User", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostHostGroup(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetHostGroup" parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostGroupId": parts[1], "InstanceId": parts[0], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:HostGroup", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostGroup", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostGroup", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostUserAttachment(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListUsers" parts, err := ParseResourceId(id, 3) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": parts[0], "UserGroupId": parts[1], "PageNumber": 1, "PageSize": 50, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:UserAttachment", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Users", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Users", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["UserId"]) == parts[2] { idExist = true return v.(map[string]interface{}), nil } } if len(v.([]interface{})) < request["PageSize"].(int) { break } request["PageNumber"] = request["PageNumber"].(int) + 1 } if !idExist { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } return } func (s *YundunBastionhostService) DescribeBastionhostHost(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetHost" parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostId": parts[1], "InstanceId": parts[0], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND", "HostNotFound"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:Host", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Host", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Host", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostHostAccount(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetHostAccount" parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostAccountId": parts[1], "InstanceId": parts[0], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND", "HostAccountNotFound"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:HostAccount", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostAccount", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostAccount", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostHostAttachment(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListHosts" parts, err := ParseResourceId(id, 3) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostGroupId": parts[1], "InstanceId": parts[0], "PageNumber": 1, "PageSize": 0, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:HostAttachment", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.Hosts", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.Hosts", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["HostId"]) == parts[2] { idExist = true return v.(map[string]interface{}), nil } } if len(v.([]interface{})) < request["PageSize"].(int) { break } request["PageNumber"] = request["PageNumber"].(int) + 1 } if !idExist { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } return } func (s *YundunBastionhostService) DescribeBastionhostHostAccountUserAttachment(id string) (object []interface{}, err error) { var response map[string]interface{} client := s.client action := "ListHostAccountsForUser" parts, err := ParseResourceId(id, 3) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostId": parts[2], "InstanceId": parts[0], "UserId": parts[1], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(10*time.Second, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:HostAccountUserAttachment", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostAccounts", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostAccounts", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } return v.([]interface{}), nil } func (s *YundunBastionhostService) DescribeBastionhostHostAccountUserGroupAttachment(id string) (object []interface{}, err error) { var response map[string]interface{} client := s.client action := "ListHostAccountsForUserGroup" parts, err := ParseResourceId(id, 3) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostId": parts[2], "InstanceId": parts[0], "UserGroupId": parts[1], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(10*time.Second, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:HostAccountUserGroupAttachment", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostAccounts", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostAccounts", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } return v.([]interface{}), nil } func (s *YundunBastionhostService) DescribeBastionhostHostGroupAccountUserAttachment(id string) (object []interface{}, err error) { var response map[string]interface{} client := s.client action := "ListHostGroupAccountNamesForUser" parts, err := ParseResourceId(id, 3) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostGroupId": parts[2], "InstanceId": parts[0], "UserId": parts[1], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(10*time.Second, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:HostGroupAccountUserAttachment", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostAccountNames", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostAccountNames", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } return v.([]interface{}), nil } func (s *YundunBastionhostService) DescribeBastionhostHostGroupAccountUserGroupAttachment(id string) (object []interface{}, err error) { var response map[string]interface{} client := s.client action := "ListHostGroupAccountNamesForUserGroup" parts, err := ParseResourceId(id, 3) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostGroupId": parts[2], "InstanceId": parts[0], "UserGroupId": parts[1], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(10*time.Second, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { if IsExpectedErrors(err, []string{"Commodity.BizError.InvalidStatus", "OBJECT_NOT_FOUND"}) { return object, WrapErrorf(NotFoundErr("Bastionhost:HostGroupAccountUserGroupAttachment", id), NotFoundMsg, ProviderERROR, fmt.Sprint(response["RequestId"])) } return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostAccountNames", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostAccountNames", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } return v.([]interface{}), nil } func (s *YundunBastionhostService) EnableInstancePublicAccess(id string) (err error) { var response map[string]interface{} client := s.client action := "EnableInstancePublicAccess" request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return nil } func (s *YundunBastionhostService) DisableInstancePublicAccess(id string) (err error) { var response map[string]interface{} client := s.client action := "DisableInstancePublicAccess" request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } return nil } func (s *YundunBastionhostService) DescribeBastionhostHostShareKey(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetHostShareKey" parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "HostShareKeyId": parts[1], "InstanceId": parts[0], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostShareKey", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostShareKey", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) GetHostShareKey(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetHostShareKey" parts, err := ParseResourceId(id, 2) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "HostShareKeyId": parts[1], "InstanceId": parts[0], } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostShareKey", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostShareKey", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostHostAccountShareKeyAttachment(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "ListHostAccountsForHostShareKey" parts, err := ParseResourceId(id, 3) if err != nil { err = WrapError(err) return } request := map[string]interface{}{ "RegionId": s.client.RegionId, "HostShareKeyId": parts[1], "InstanceId": parts[0], "PageSize": PageSizeMedium, "PageNumber": 1, } idExist := false for { wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.HostAccounts", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.HostAccounts", response) } if len(v.([]interface{})) < 1 { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } for _, v := range v.([]interface{}) { if fmt.Sprint(v.(map[string]interface{})["HostsAccountId"]) == parts[2] { idExist = true return v.(map[string]interface{}), nil } } if len(v.([]interface{})) < request["PageSize"].(int) { break } request["PageNumber"] = request["PageNumber"].(int) + 1 } if !idExist { return object, WrapErrorf(NotFoundErr("Bastionhost", id), NotFoundWithResponse, response) } return } func (s *YundunBastionhostService) DescribeBastionhostAdAuthServer(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetInstanceADAuthServer" request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.AD", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.AD", response) } object = v.(map[string]interface{}) return object, nil } func (s *YundunBastionhostService) DescribeBastionhostLdapAuthServer(id string) (object map[string]interface{}, err error) { var response map[string]interface{} client := s.client action := "GetInstanceLDAPAuthServer" request := map[string]interface{}{ "RegionId": s.client.RegionId, "InstanceId": id, } wait := incrementalWait(3*time.Second, 3*time.Second) err = resource.Retry(5*time.Minute, func() *resource.RetryError { response, err = client.RpcPost("Yundun-bastionhost", "2019-12-09", action, nil, request, true) if err != nil { if NeedRetry(err) { wait() return resource.RetryableError(err) } return resource.NonRetryableError(err) } return nil }) addDebug(action, response, request) if err != nil { return object, WrapErrorf(err, DefaultErrorMsg, id, action, AlibabaCloudSdkGoERROR) } v, err := jsonpath.Get("$.LDAP", response) if err != nil { return object, WrapErrorf(err, FailedGetAttributeMsg, id, "$.LDAP", response) } object = v.(map[string]interface{}) return object, nil }