alibabacloudstack/service_apsarastack_ecs.go (1,832 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"log"
"regexp"
"strings"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
"time"
"strconv"
"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/helper/sdk_patch/datahub_patch"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
type EcsService struct {
client *connectivity.AlibabacloudStackClient
}
func (s *EcsService) JudgeRegionValidation(key, region string) error {
request := ecs.CreateDescribeRegionsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeRegions(request)
})
if err != nil {
return fmt.Errorf("DescribeRegions got an error: %#v", err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
resp, _ := raw.(*ecs.DescribeRegionsResponse)
if resp == nil || len(resp.Regions.Region) < 1 {
return errmsgs.GetNotFoundErrorFromString("There is no any available region.")
}
var rs []string
for _, v := range resp.Regions.Region {
if v.RegionId == region {
return nil
}
rs = append(rs, v.RegionId)
}
return fmt.Errorf("'%s' is invalid. Expected on %v.", key, strings.Join(rs, ", "))
}
func (s *EcsService) DescribeZone(id string) (zone ecs.Zone, err error) {
request := ecs.CreateDescribeZonesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeZones(request)
})
response, ok := raw.(*ecs.DescribeZonesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.Zones.Zone) < 1 {
return zone, errmsgs.WrapError(errmsgs.Error("There is no any availability zone in region %s.", s.client.RegionId))
}
zoneIds := []string{}
for _, z := range response.Zones.Zone {
if z.ZoneId == id {
return z, nil
}
zoneIds = append(zoneIds, z.ZoneId)
}
return zone, errmsgs.WrapError(errmsgs.Error("availability_zone %s not exists in region %s, all zones are %s", id, s.client.RegionId, zoneIds))
}
func (s *EcsService) DescribeZones(d *schema.ResourceData) (zones []ecs.Zone, err error) {
request := ecs.CreateDescribeZonesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeZones(request)
})
response, ok := raw.(*ecs.DescribeZonesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "apsarastak_instance_type_families", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.Zones.Zone) < 1 {
return zones, errmsgs.WrapError(errmsgs.Error("There is no any availability zone in region %s.", s.client.RegionId))
}
if v, ok := d.GetOk("zone_id"); ok {
zoneIds := []string{}
for _, z := range response.Zones.Zone {
if z.ZoneId == v.(string) {
return []ecs.Zone{z}, nil
}
zoneIds = append(zoneIds, z.ZoneId)
}
return zones, errmsgs.WrapError(errmsgs.Error("availability_zone %s not exists in region %s, all zones are %s", v.(string), s.client.RegionId, zoneIds))
} else {
return response.Zones.Zone, nil
}
}
func (s *EcsService) DescribeInstance(id string) (instance ecs.Instance, err error) {
request := ecs.CreateDescribeInstancesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceIds = convertListToJsonString([]interface{}{id})
var raw interface{}
wait := incrementalWait(1*time.Second, 1*time.Second)
err = resource.Retry(10*time.Minute, func() *resource.RetryError {
raw, err = s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeInstances(request)
})
if err != nil {
if errmsgs.IsThrottling(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
return nil
})
response, ok := raw.(*ecs.DescribeInstancesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
if len(response.Instances.Instance) < 1 {
return instance, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Instance", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
}
log.Printf("[ECS Creation]: Getting Instance Details using DescribeInstances API: %s", response.Instances.Instance[0].Status)
return response.Instances.Instance[0], nil
}
func (s *EcsService) DescribeInstanceAttribute(id string) (instance ecs.DescribeInstanceAttributeResponse, err error) {
request := ecs.CreateDescribeInstanceAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeInstanceAttribute(request)
})
response, ok := raw.(*ecs.DescribeInstanceAttributeResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return instance, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if response.InstanceId != id {
return instance, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Instance", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
}
return *response, nil
}
func (s *EcsService) DescribeInstanceDisksByType(id string, rg string, disk_type string) (disks []ecs.Disk, err error) {
request := ecs.CreateDescribeDisksRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = id
//request.DiskType = string(DiskTypeSystem)
var response *ecs.DescribeDisksResponse
wait := incrementalWait(1*time.Second, 1*time.Second)
err = resource.Retry(10*time.Minute, func() *resource.RetryError {
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeDisks(request)
})
if err != nil {
if errmsgs.IsThrottling(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ = raw.(*ecs.DescribeDisksResponse)
if len(response.Disks.Disk) < 1 {
return resource.RetryableError(err)
}
return nil
})
if err != nil {
return disks, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR)
}
log.Printf("[ECS Creation]: Getting Disks Query Params : %s ", request.GetQueryParams())
log.Printf("[ECS Creation]: Getting Disks response : %s ", response)
//log.Printf("[ECS Creation]: Getting Disks Details: %s, Instance ID: %s, Id_to_compare: %s ",response.Disks.Disk[0],response.Disks.Disk[0].InstanceId,id)
if len(response.Disks.Disk) < 1 || response.Disks.Disk[0].InstanceId != id {
return disks, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Instance", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
}
for _, diskdata := range response.Disks.Disk {
if diskdata.InstanceId == id && diskdata.Type == string(disk_type) {
disks = append(disks, diskdata)
}
}
if len(disks) > 0 {
return disks, nil
}
return disks, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Instance", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
}
func (s *EcsService) ResourceAvailable(zone ecs.Zone, resourceType ResourceType) error {
for _, res := range zone.AvailableResourceCreation.ResourceTypes {
if res == string(resourceType) {
return nil
}
}
return errmsgs.WrapError(errmsgs.Error("%s is not available in %s zone of %s region", resourceType, zone.ZoneId, s.client.Region))
}
func (s *EcsService) DiskAvailable(zone ecs.Zone, diskCategory DiskCategory) error {
for _, disk := range zone.AvailableDiskCategories.DiskCategories {
if disk == string(diskCategory) {
return nil
}
}
return errmsgs.WrapError(errmsgs.Error("%s is not available in %s zone of %s region", diskCategory, zone.ZoneId, s.client.Region))
}
func (s *EcsService) JoinSecurityGroups(instanceId string, securityGroupIds []string) error {
request := ecs.CreateJoinSecurityGroupRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = instanceId
for _, sid := range securityGroupIds {
request.SecurityGroupId = sid
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.JoinSecurityGroup(request)
})
response, ok := raw.(*ecs.JoinSecurityGroupResponse)
if err != nil && errmsgs.IsExpectedErrors(err, []string{"InvalidInstanceId.AlreadyExists"}) {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, instanceId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
return nil
}
func (s *EcsService) LeaveSecurityGroups(instanceId string, securityGroupIds []string) error {
request := ecs.CreateLeaveSecurityGroupRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = instanceId
for _, sid := range securityGroupIds {
request.SecurityGroupId = sid
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.LeaveSecurityGroup(request)
})
response, ok := raw.(*ecs.LeaveSecurityGroupResponse)
if err != nil && errmsgs.IsExpectedErrors(err, []string{"InvalidSecurityGroupId.NotFound"}) {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, instanceId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
return nil
}
func (s *EcsService) DoEcsDescribesecuritygroupattributeRequest(id string) (group ecs.DescribeSecurityGroupAttributeResponse, err error) {
return s.DescribeSecurityGroup(id)
}
func (s *EcsService) DescribeSecurityGroup(id string) (group ecs.DescribeSecurityGroupAttributeResponse, err error) {
request := ecs.CreateDescribeSecurityGroupAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.SecurityGroupId = id
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeSecurityGroupAttribute(request)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidSecurityGroupId.NotFound"}) {
err = errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*ecs.DescribeSecurityGroupAttributeResponse)
if response.SecurityGroupId != id {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Security Group", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return
}
return *response, nil
}
func (s *EcsService) DescribeSecurityGroupRule(id string) (rule ecs.Permission, err error) {
parts, err := ParseResourceId(id, 8)
if err != nil {
return rule, errmsgs.WrapError(err)
}
groupId, direction, ipProtocol, portRange, nicType, cidr_ip, policy := parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6]
priority, err := strconv.Atoi(parts[7])
if err != nil {
return rule, errmsgs.WrapError(err)
}
request := ecs.CreateDescribeSecurityGroupAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.SecurityGroupId = groupId
request.Direction = direction
request.NicType = nicType
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeSecurityGroupAttribute(request)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidSecurityGroupId.NotFound"}) {
err = errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
response, _ := raw.(*ecs.DescribeSecurityGroupAttributeResponse)
if response == nil {
return rule, errmsgs.GetNotFoundErrorFromString(errmsgs.GetNotFoundMessage("Security Group", groupId))
}
for _, ru := range response.Permissions.Permission {
if strings.ToLower(string(ru.IpProtocol)) == ipProtocol && ru.PortRange == portRange {
cidr := ru.SourceCidrIp
if direction == string(DirectionIngress) && cidr == "" {
cidr = ru.SourceGroupId
}
if direction == string(DirectionEgress) {
if cidr = ru.DestCidrIp; cidr == "" {
cidr = ru.DestGroupId
}
}
if cidr == cidr_ip && strings.ToLower(string(ru.Policy)) == policy && ru.Priority == strconv.Itoa(priority) {
return ru, nil
}
}
}
return rule, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Security Group Rule", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
}
func (s *EcsService) DescribeAvailableResources(d *schema.ResourceData, meta interface{}, destination DestinationResource) (zoneId string, validZones []ecs.AvailableZone, requestId string, err error) {
client := meta.(*connectivity.AlibabacloudStackClient)
request := ecs.CreateDescribeAvailableResourceRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DestinationResource = string(destination)
request.IoOptimized = string(IOOptimized)
if v, ok := d.GetOk("availability_zone"); ok && strings.TrimSpace(v.(string)) != "" {
zoneId = strings.TrimSpace(v.(string))
} else if v, ok := d.GetOk("vswitch_id"); ok && strings.TrimSpace(v.(string)) != "" {
vpcService := VpcService{s.client}
if vsw, err := vpcService.DescribeVSwitch(strings.TrimSpace(v.(string))); err == nil {
zoneId = vsw.ZoneId
}
}
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeAvailableResource(request)
})
response, ok := raw.(*ecs.DescribeAvailableResourceResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return "", nil, "", errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackGoClientFailure, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
requestId = response.RequestId
if len(response.AvailableZones.AvailableZone) < 1 {
err = errmsgs.WrapError(errmsgs.Error("There are no availability resources in the region: %s. RequestId: %s.", client.RegionId, requestId))
return
}
valid := false
soldout := false
var expectedZones []string
for _, zone := range response.AvailableZones.AvailableZone {
if zone.Status == string(SoldOut) {
if zone.ZoneId == zoneId {
soldout = true
}
continue
}
if zoneId != "" && zone.ZoneId == zoneId {
valid = true
validZones = append(make([]ecs.AvailableZone, 1), zone)
break
}
expectedZones = append(expectedZones, zone.ZoneId)
validZones = append(validZones, zone)
}
if zoneId != "" {
if !valid {
err = errmsgs.WrapError(errmsgs.Error("Availability zone %s status is not available in the region %s. Expected availability zones: %s. RequestId: %s.",
zoneId, client.RegionId, strings.Join(expectedZones, ", "), requestId))
return
}
if soldout {
err = errmsgs.WrapError(errmsgs.Error("Availability zone %s status is sold out in the region %s. Expected availability zones: %s. RequestId: %s.",
zoneId, client.RegionId, strings.Join(expectedZones, ", "), requestId))
return
}
}
if len(validZones) <= 0 {
err = errmsgs.WrapError(errmsgs.Error("There is no availability resources in the region %s. Please choose another region. RequestId: %s.", client.RegionId, response.RequestId))
return
}
return
}
func (s *EcsService) InstanceTypeValidation(targetType, zoneId string, validZones []ecs.AvailableZone) error {
mapInstanceTypeToZones := make(map[string]string)
var expectedInstanceTypes []string
for _, zone := range validZones {
if zoneId != "" && zoneId != zone.ZoneId {
continue
}
for _, r := range zone.AvailableResources.AvailableResource {
if r.Type == string(InstanceTypeResource) {
for _, t := range r.SupportedResources.SupportedResource {
if t.Status == string(SoldOut) {
continue
}
if targetType == t.Value {
return nil
}
if _, ok := mapInstanceTypeToZones[t.Value]; !ok {
expectedInstanceTypes = append(expectedInstanceTypes, t.Value)
mapInstanceTypeToZones[t.Value] = t.Value
}
}
}
}
}
if zoneId != "" {
return errmsgs.WrapError(errmsgs.Error("The instance type %s is solded out or is not supported in the zone %s. Expected instance types: %s", targetType, zoneId, strings.Join(expectedInstanceTypes, ", ")))
}
return errmsgs.WrapError(errmsgs.Error("The instance type %s is solded out or is not supported in the region %s. Expected instance types: %s", targetType, s.client.RegionId, strings.Join(expectedInstanceTypes, ", ")))
}
func (s *EcsService) QueryInstancesWithKeyPair(instanceIdsStr, keyPair string) (instanceIds []string, instances []ecs.Instance, err error) {
request := ecs.CreateDescribeInstancesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.PageSize = requests.NewInteger(PageSizeLarge)
request.PageNumber = requests.NewInteger(1)
request.InstanceIds = instanceIdsStr
request.KeyPairName = keyPair
for {
raw, e := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeInstances(request)
})
object, ok := raw.(*ecs.DescribeInstancesResponse)
if e != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(object.BaseResponse)
}
err = errmsgs.WrapErrorf(e, errmsgs.RequestV1ErrorMsg, keyPair, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(object.Instances.Instance) < 0 {
return
}
for _, inst := range object.Instances.Instance {
instanceIds = append(instanceIds, inst.InstanceId)
instances = append(instances, inst)
}
if len(instances) < PageSizeLarge {
break
}
if page, e := getNextpageNumber(request.PageNumber); e != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(raw.(*responses.BaseResponse))
}
err = errmsgs.WrapErrorf(e, errmsgs.RequestV1ErrorMsg, keyPair, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
} else {
request.PageNumber = page
}
}
return
}
func (s *EcsService) DoEcsDescribekeypairsRequest(id string) (keyPair ecs.KeyPair, err error) {
return s.DescribeKeyPair(id)
}
func (s *EcsService) DescribeKeyPair(id string) (keyPair ecs.KeyPair, err error) {
request := ecs.CreateDescribeKeyPairsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.KeyPairName = id
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeKeyPairs(request)
})
object, ok := raw.(*ecs.DescribeKeyPairsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(object.BaseResponse)
}
return keyPair, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(object.KeyPairs.KeyPair) < 1 || object.KeyPairs.KeyPair[0].KeyPairName != id {
return keyPair, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KeyPair", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, object.RequestId)
}
return object.KeyPairs.KeyPair[0], nil
}
func (s *EcsService) DescribeKeyPairAttachment(id string) (keyPair ecs.KeyPair, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidKeyPair.NotFound"}) {
err = errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
return
}
keyPairName := parts[0]
keyPair, err = s.DescribeKeyPair(keyPairName)
if err != nil {
return keyPair, errmsgs.WrapError(err)
}
if keyPair.KeyPairName != keyPairName {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("KeyPairAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return keyPair, nil
}
func (s *EcsService) DoEcsDescribedisksRequest(id string) (disk ecs.Disk, err error) {
return s.DescribeDisk(id)
}
func (s *EcsService) DescribeDisk(id string) (disk ecs.Disk, err error) {
request := ecs.CreateDescribeDisksRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.DiskIds = convertListToJsonString([]interface{}{id})
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeDisks(request)
})
response, ok := raw.(*ecs.DescribeDisksResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return disk, errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
if len(response.Disks.Disk) < 1 || response.Disks.Disk[0].DiskId != id {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Disk", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return response.Disks.Disk[0], nil
}
func (s *EcsService) DescribeDiskAttachment(id string) (disk ecs.Disk, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return disk, errmsgs.WrapError(err)
}
disk, err = s.DescribeDisk(parts[0])
if err != nil {
return disk, errmsgs.WrapError(err)
}
if disk.InstanceId != parts[1] && disk.Status != string(InUse) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("DiskAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
}
return
}
func (s *EcsService) DescribeDisksByType(instanceId string, diskType DiskType) (disk []ecs.Disk, err error) {
request := ecs.CreateDescribeDisksRequest()
s.client.InitRpcRequest(*request.RpcRequest)
if instanceId != "" {
request.InstanceId = instanceId
}
request.DiskType = string(diskType)
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeDisks(request)
})
resp, ok := raw.(*ecs.DescribeDisksResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "DescribeDisks", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if resp == nil {
return
}
return resp.Disks.Disk, nil
}
func (s *EcsService) DescribeTags(resourceId string, resourceType TagResourceType) (tags []ecs.Tag, err error) {
request := ecs.CreateDescribeTagsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceType = string(resourceType)
request.ResourceId = resourceId
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeTags(request)
})
response, ok := raw.(*ecs.DescribeTagsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, resourceId, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.Tags.Tag) < 1 {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Tags", resourceId)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return
}
return response.Tags.Tag, nil
}
func (s *EcsService) DescribeImageById(id string) (image ecs.Image, err error) {
request := ecs.CreateDescribeImagesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ImageId = id
request.ImageOwnerAlias = "self"
request.Status = fmt.Sprintf("%s,%s,%s,%s,%s", "Creating", "Waiting", "Available", "UnAvailable", "CreateFailed")
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeImages(request)
})
resp, ok := raw.(*ecs.DescribeImagesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "DescribeImage", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if resp == nil || len(resp.Images.Image) < 1 {
return image, errmsgs.GetNotFoundErrorFromString(errmsgs.GetNotFoundMessage("Image", id))
}
return resp.Images.Image[0], nil
}
func (s *EcsService) deleteImage(d *schema.ResourceData) error {
object, err := s.DescribeImageById(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
request := ecs.CreateDeleteImageRequest()
s.client.InitRpcRequest(*request.RpcRequest)
if force, ok := d.GetOk("force"); ok {
request.Force = requests.NewBoolean(force.(bool))
}
request.ImageId = object.ImageId
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DeleteImage(request)
})
response, ok := raw.(*ecs.DeleteImageResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutCreate), 3*time.Second, s.ImageStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
return nil
}
func (s *EcsService) updateImage(d *schema.ResourceData) error {
d.Partial(true)
err := setTags(s.client, TagResourceImage, d)
if err != nil {
return errmsgs.WrapError(err)
} else {
//d.SetPartial("tags")
}
request := ecs.CreateModifyImageAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ImageId = d.Id()
if d.HasChanges("description", "name", "image_name") {
if description, ok := d.GetOk("description"); ok {
request.Description = description.(string)
}
if imageName, ok := connectivity.GetResourceDataOk(d, "image_name", "name"); ok {
request.ImageName = imageName.(string)
}
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.ModifyImageAttribute(request)
})
response, ok := raw.(*ecs.ModifyImageAttributeResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
//d.SetPartial("name")
//d.SetPartial("image_name")
//d.SetPartial("description")
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
}
d.Partial(false)
return nil
}
func (s *EcsService) DoEcsDescribenetworkinterfacesRequest(id string) (networkInterface ecs.NetworkInterfaceSet, err error) {
return s.DescribeNetworkInterface(id)
}
func (s *EcsService) DescribeNetworkInterface(id string) (networkInterface ecs.NetworkInterfaceSet, err error) {
request := ecs.CreateDescribeNetworkInterfacesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
eniIds := []string{id}
request.NetworkInterfaceId = &eniIds
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeNetworkInterfaces(request)
})
response, ok := raw.(*ecs.DescribeNetworkInterfacesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return networkInterface, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
var found = bool(false)
var result = &ecs.DescribeNetworkInterfacesResponse{}
for _, k := range response.NetworkInterfaceSets.NetworkInterfaceSet {
if k.NetworkInterfaceId == id {
found = true
result.NetworkInterfaceSets.NetworkInterfaceSet = append(result.NetworkInterfaceSets.NetworkInterfaceSet, ecs.NetworkInterfaceSet{
NetworkInterfaceId: k.NetworkInterfaceId,
Status: k.Status,
Type: k.Type,
VpcId: k.VpcId,
VSwitchId: k.VSwitchId,
ZoneId: k.ZoneId,
PrivateIpAddress: k.PrivateIpAddress,
MacAddress: k.MacAddress,
NetworkInterfaceName: k.NetworkInterfaceName,
Description: k.Description,
InstanceId: k.InstanceId,
CreationTime: k.CreationTime,
ResourceGroupId: k.ResourceGroupId,
ServiceID: k.ServiceID,
ServiceManaged: k.ServiceManaged,
QueueNumber: k.QueueNumber,
OwnerId: k.OwnerId,
SecurityGroupIds: k.SecurityGroupIds,
AssociatedPublicIp: k.AssociatedPublicIp,
Attachment: k.Attachment,
PrivateIpSets: k.PrivateIpSets,
Ipv6Sets: k.Ipv6Sets,
Tags: k.Tags,
})
return result.NetworkInterfaceSets.NetworkInterfaceSet[0], nil
}
}
if !found {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("NetworkInterface", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return
}
return response.NetworkInterfaceSets.NetworkInterfaceSet[0], nil
}
func (s *EcsService) DescribeNetworkInterfaceAttachment(id string) (networkInterface ecs.NetworkInterfaceSet, err error) {
parts, err := ParseResourceId(id, 2)
if err != nil {
return networkInterface, errmsgs.WrapError(err)
}
eniId, instanceId := parts[0], parts[1]
request := ecs.CreateDescribeNetworkInterfacesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.InstanceId = instanceId
eniIds := []string{eniId}
request.NetworkInterfaceId = &eniIds
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeNetworkInterfaces(request)
})
response, ok := raw.(*ecs.DescribeNetworkInterfacesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return networkInterface, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
var found = bool(false)
var result = &ecs.DescribeNetworkInterfacesResponse{}
for _, k := range response.NetworkInterfaceSets.NetworkInterfaceSet {
if k.NetworkInterfaceId == eniId {
found = true
result.NetworkInterfaceSets.NetworkInterfaceSet = append(result.NetworkInterfaceSets.NetworkInterfaceSet, ecs.NetworkInterfaceSet{
NetworkInterfaceId: k.NetworkInterfaceId,
Status: k.Status,
Type: k.Type,
VpcId: k.VpcId,
VSwitchId: k.VSwitchId,
ZoneId: k.ZoneId,
PrivateIpAddress: k.PrivateIpAddress,
MacAddress: k.MacAddress,
NetworkInterfaceName: k.NetworkInterfaceName,
Description: k.Description,
InstanceId: k.InstanceId,
CreationTime: k.CreationTime,
ResourceGroupId: k.ResourceGroupId,
ServiceID: k.ServiceID,
ServiceManaged: k.ServiceManaged,
QueueNumber: k.QueueNumber,
OwnerId: k.OwnerId,
SecurityGroupIds: k.SecurityGroupIds,
AssociatedPublicIp: k.AssociatedPublicIp,
Attachment: k.Attachment,
PrivateIpSets: k.PrivateIpSets,
Ipv6Sets: k.Ipv6Sets,
Tags: k.Tags,
})
return result.NetworkInterfaceSets.NetworkInterfaceSet[0], nil
}
}
if !found {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("NetworkInterfaceAttachment", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return
}
return response.NetworkInterfaceSets.NetworkInterfaceSet[0], nil
}
// WaitForInstance waits for instance to given status
func (s *EcsService) WaitForEcsInstance(instanceId string, status Status, timeout int) error {
if timeout <= 0 {
timeout = DefaultTimeout
}
for {
instance, err := s.DescribeInstance(instanceId)
if err != nil && !errmsgs.NotFoundError(err) {
return err
}
if instance.Status == string(status) {
//Sleep one more time for timing issues
time.Sleep(DefaultIntervalMedium * time.Second)
break
}
timeout = timeout - DefaultIntervalShort
if timeout <= 0 {
return errmsgs.GetTimeErrorFromString(errmsgs.GetTimeoutMessage("ECS Instance", string(status)))
}
time.Sleep(DefaultIntervalShort * time.Second)
}
return nil
}
// WaitForInstance waits for instance to given status
func (s *EcsService) InstanceStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeInstance(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.Status == failState {
return object, object.Status, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.Status))
}
}
return object, object.Status, nil
}
}
func (s *EcsService) deleteImageforDest(d *schema.ResourceData, region string) error {
object, err := s.DescribeImageById(d.Id())
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return errmsgs.WrapError(err)
}
request := ecs.CreateDeleteImageRequest()
s.client.InitRpcRequest(*request.RpcRequest)
if force, ok := d.GetOk("force"); ok {
request.Force = requests.NewBoolean(force.(bool))
}
request.RegionId = region
request.ImageId = object.ImageId
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DeleteImage(request)
})
response, ok := raw.(*ecs.DeleteImageResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutCreate), 3*time.Second, s.ImageStateRefreshFunc(d.Id(), []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return errmsgs.WrapErrorf(err, errmsgs.IdMsg, d.Id())
}
return nil
}
func (s *EcsService) DescribeImage(id, region string) (image ecs.Image, err error) {
request := ecs.CreateDescribeImagesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.RegionId = region
request.ImageId = id
request.ImageOwnerAlias = "self"
request.Status = fmt.Sprintf("%s,%s,%s,%s,%s", "Creating", "Waiting", "Available", "UnAvailable", "CreateFailed")
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeImages(request)
})
log.Printf("[DEBUG] status %#v", raw)
if err != nil {
return
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
resp, ok := raw.(*ecs.DescribeImagesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return image, err
}
if resp == nil || len(resp.Images.Image) < 1 {
return image, errmsgs.GetNotFoundErrorFromString(errmsgs.GetNotFoundMessage("Image", id))
}
return resp.Images.Image[0], nil
}
func (s *EcsService) ImageStateRefreshFuncforcopy(id string, region string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeImage(id, region)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.Status == failState {
return object, object.Status, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.Status))
}
}
return object, object.Status, nil
}
}
func (s *EcsService) WaitForDisk(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeDisk(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
// Disk need 3-5 seconds to get ExpiredTime after the status is available
if object.Status == string(status) && object.ExpiredTime != "" {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(time.Duration(1) * time.Second)
}
}
func (s *EcsService) WaitForSecurityGroup(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
_, err := s.DescribeSecurityGroup(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR)
}
}
}
func (s *EcsService) WaitForKeyPair(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
_, err := s.DescribeKeyPair(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR)
}
}
}
func (s *EcsService) WaitForDiskAttachment(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeDiskAttachment(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(time.Duration(1) * time.Second)
}
}
func (s *EcsService) WaitForNetworkInterface(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeNetworkInterface(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
}
}
func (s *EcsService) QueryPrivateIps(eniId string) ([]string, error) {
if eni, err := s.DescribeNetworkInterface(eniId); err != nil {
return nil, fmt.Errorf("Describe NetworkInterface(%s) failed, %s", eniId, err)
} else {
filterIps := make([]string, 0, len(eni.PrivateIpSets.PrivateIpSet))
for i := range eni.PrivateIpSets.PrivateIpSet {
if eni.PrivateIpSets.PrivateIpSet[i].Primary {
continue
}
filterIps = append(filterIps, eni.PrivateIpSets.PrivateIpSet[i].PrivateIpAddress)
}
return filterIps, nil
}
}
func (s *EcsService) WaitForVpcAttributesChanged(instanceId, vswitchId, privateIp string) error {
deadline := time.Now().Add(DefaultTimeout * time.Second)
for {
if time.Now().After(deadline) {
return errmsgs.WrapError(errmsgs.Error("Wait for VPC attributes changed timeout"))
}
time.Sleep(DefaultIntervalShort * time.Second)
instance, err := s.DescribeInstance(instanceId)
if err != nil {
return errmsgs.WrapError(err)
}
if instance.VpcAttributes.PrivateIpAddress.IpAddress[0] != privateIp {
continue
}
if instance.VpcAttributes.VSwitchId != vswitchId {
continue
}
return nil
}
}
func (s *EcsService) WaitForPrivateIpsCountChanged(eniId string, count int) error {
deadline := time.Now().Add(DefaultTimeout * time.Second)
for {
if time.Now().After(deadline) {
return fmt.Errorf("Wait for private IP addrsses count changed timeout")
}
time.Sleep(DefaultIntervalShort * time.Second)
ips, err := s.QueryPrivateIps(eniId)
if err != nil {
return fmt.Errorf("Query private IP failed, %s", err)
}
if len(ips) == count {
return nil
}
}
}
func (s *EcsService) WaitForPrivateIpsListChanged(eniId string, ipList []string) error {
deadline := time.Now().Add(DefaultTimeout * time.Second)
for {
if time.Now().After(deadline) {
return fmt.Errorf("Wait for private IP addrsses list changed timeout")
}
time.Sleep(DefaultIntervalShort * time.Second)
ips, err := s.QueryPrivateIps(eniId)
if err != nil {
return fmt.Errorf("Query private IP failed, %s", err)
}
if len(ips) != len(ipList) {
continue
}
diff := false
for i := range ips {
exist := false
for j := range ipList {
if ips[i] == ipList[j] {
exist = true
break
}
}
if !exist {
diff = true
break
}
}
if !diff {
return nil
}
}
}
func (s *EcsService) WaitForModifySecurityGroupPolicy(id, target string, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeSecurityGroup(id)
if err != nil {
return errmsgs.WrapError(err)
}
if object.InnerAccessPolicy == target {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.InnerAccessPolicy, target, errmsgs.ProviderERROR)
}
}
}
func (s *EcsService) AttachKeyPair(keyName string, instanceIds []interface{}) (err error) {
request := ecs.CreateAttachKeyPairRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.KeyPairName = keyName
request.InstanceIds = convertListToJsonString(instanceIds)
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.AttachKeyPair(request)
})
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"ServiceUnavailable"}) {
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
return nil
})
resp, ok := raw.(*ecs.AttachKeyPairResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, keyName, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return err
}
return nil
}
func (s *EcsService) SnapshotStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeSnapshot(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.Status == failState {
return object, object.Status, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.Status))
}
}
return object, object.Status, nil
}
}
func (s *EcsService) ImageStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeImageById(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.Status == failState {
return object, object.Status, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.Status))
}
}
return object, object.Status, nil
}
}
func (s *EcsService) TaskStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeTaskById(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.TaskStatus == failState {
return object, object.TaskStatus, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.TaskStatus))
}
}
return object, object.TaskStatus, nil
}
}
func (s *EcsService) DescribeTaskById(id string) (task *ecs.DescribeTaskAttributeResponse, err error) {
request := ecs.CreateDescribeTaskAttributeRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.TaskId = id
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeTaskAttribute(request)
})
task, ok := raw.(*ecs.DescribeTaskAttributeResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(task.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return task, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if task.TaskId == "" {
return task, errmsgs.GetNotFoundErrorFromString(errmsgs.GetNotFoundMessage("task", id))
}
return task, nil
}
func (s *EcsService) DoEcsDescribesnapshotsRequest(id string) (*ecs.Snapshot, error) {
return s.DescribeSnapshot(id)
}
func (s *EcsService) DescribeSnapshot(id string) (*ecs.Snapshot, error) {
snapshot := &ecs.Snapshot{}
request := ecs.CreateDescribeSnapshotsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.SnapshotIds = fmt.Sprintf("[\"%s\"]", id)
request.QueryParams["SnapshotId"] = id
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeSnapshots(request)
})
response, ok := raw.(*ecs.DescribeSnapshotsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return snapshot, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
for _, k := range response.Snapshots.Snapshot {
if k.SnapshotId == id {
return &k, nil
}
}
if len(response.Snapshots.Snapshot) < 1 || response.Snapshots.Snapshot[0].SnapshotId != id {
return snapshot, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("Snapshot", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
}
return &response.Snapshots.Snapshot[0], nil
}
func (s *EcsService) DoEcsDescribeautosnapshotpolicyexRequest(id string) (*ecs.AutoSnapshotPolicy, error) {
return s.DescribeSnapshotPolicy(id)
}
func (s *EcsService) DescribeSnapshotPolicy(id string) (*ecs.AutoSnapshotPolicy, error) {
policy := &ecs.AutoSnapshotPolicy{}
request := ecs.CreateDescribeAutoSnapshotPolicyExRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.AutoSnapshotPolicyId = id
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeAutoSnapshotPolicyEx(request)
})
response, ok := raw.(*ecs.DescribeAutoSnapshotPolicyExResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return policy, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.AutoSnapshotPolicies.AutoSnapshotPolicy) != 1 ||
response.AutoSnapshotPolicies.AutoSnapshotPolicy[0].AutoSnapshotPolicyId != id {
return policy, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("SnapshotPolicy", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
}
return &response.AutoSnapshotPolicies.AutoSnapshotPolicy[0], nil
}
func (s *EcsService) DoEcsDescribereservedinstancesRequest(id string) (reservedInstance ecs.ReservedInstance, err error) {
return s.DescribeReservedInstance(id)
}
func (s *EcsService) DescribeReservedInstance(id string) (reservedInstance ecs.ReservedInstance, err error) {
request := ecs.CreateDescribeReservedInstancesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ReservedInstanceId = &[]string{id}
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeReservedInstances(request)
})
response, ok := raw.(*ecs.DescribeReservedInstancesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return reservedInstance, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.ReservedInstances.ReservedInstance) != 1 ||
response.ReservedInstances.ReservedInstance[0].ReservedInstanceId != id {
return reservedInstance, errmsgs.GetNotFoundErrorFromString(errmsgs.GetNotFoundMessage("PurchaseReservedInstance", id))
}
return response.ReservedInstances.ReservedInstance[0], nil
}
func (s *EcsService) WaitForReservedInstance(id string, status Status, timeout int) error {
deadLine := time.Now().Add(time.Duration(timeout) * time.Second)
for {
reservedInstance, err := s.DescribeReservedInstance(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if reservedInstance.Status == string(status) {
return nil
}
if time.Now().After(deadLine) {
return errmsgs.WrapErrorf(errmsgs.GetTimeErrorFromString("ECS WaitForSnapshotPolicy"), errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, reservedInstance.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *EcsService) WaitForSnapshotPolicy(id string, status Status, timeout int) error {
deadLine := time.Now().Add(time.Duration(timeout) * time.Second)
for {
snapshotPolicy, err := s.DescribeSnapshotPolicy(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
}
return errmsgs.WrapError(err)
}
if snapshotPolicy.Status == string(status) {
return nil
}
if time.Now().After(deadLine) {
return errmsgs.WrapErrorf(errmsgs.GetTimeErrorFromString("ECS WaitForSnapshotPolicy"), errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, snapshotPolicy.Status, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *EcsService) DescribeLaunchTemplate(id string) (set ecs.LaunchTemplateSet, err error) {
request := ecs.CreateDescribeLaunchTemplatesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.LaunchTemplateId = &[]string{id}
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeLaunchTemplates(request)
})
response, ok := raw.(*ecs.DescribeLaunchTemplatesResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return set, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.LaunchTemplateSets.LaunchTemplateSet) != 1 ||
response.LaunchTemplateSets.LaunchTemplateSet[0].LaunchTemplateId != id {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LaunchTemplate", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return
}
return response.LaunchTemplateSets.LaunchTemplateSet[0], nil
}
func (s *EcsService) DescribeLaunchTemplateVersion(id string, version int) (set ecs.LaunchTemplateVersionSet, err error) {
request := ecs.CreateDescribeLaunchTemplateVersionsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.LaunchTemplateId = id
request.LaunchTemplateVersion = &[]string{strconv.FormatInt(int64(version), 10)}
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeLaunchTemplateVersions(request)
})
response, ok := raw.(*ecs.DescribeLaunchTemplateVersionsResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidLaunchTemplate.NotFound"}) {
err = errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
return set, err
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return set, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.LaunchTemplateVersionSets.LaunchTemplateVersionSet) != 1 ||
response.LaunchTemplateVersionSets.LaunchTemplateVersionSet[0].LaunchTemplateId != id {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("LaunchTemplateVersion", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return
}
return response.LaunchTemplateVersionSets.LaunchTemplateVersionSet[0], nil
}
func (s *EcsService) WaitForLaunchTemplate(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeLaunchTemplate(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.LaunchTemplateId == id && string(status) != string(Deleted) {
return nil
}
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, Null, string(status), errmsgs.ProviderERROR)
}
time.Sleep(DefaultIntervalShort * time.Second)
}
}
func (s *EcsService) DescribeImageShareByImageId(id string) (imageShare *ecs.DescribeImageSharePermissionResponse, err error) {
request := ecs.CreateDescribeImageSharePermissionRequest()
s.client.InitRpcRequest(*request.RpcRequest)
parts, err := ParseResourceId(id, 2)
if err != nil {
return imageShare, errmsgs.WrapError(err)
}
request.ImageId = parts[0]
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeImageSharePermission(request)
})
resp, ok := raw.(*ecs.DescribeImageSharePermissionResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidImageId.NotFound"}) {
return imageShare, errmsgs.WrapErrorf(err, errmsgs.NotFoundMsg, errmsgs.AlibabacloudStackSdkGoERROR)
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(resp.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return imageShare, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(resp.Accounts.Account) == 0 {
return imageShare, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ModifyImageSharePermission", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, resp.RequestId)
}
return resp, nil
}
func (s *EcsService) WaitForAutoProvisioningGroup(id string, status Status, timeout int) error {
deadline := time.Now().Add(time.Duration(timeout) * time.Second)
for {
object, err := s.DescribeAutoProvisioningGroup(id)
if err != nil {
if errmsgs.NotFoundError(err) {
if status == Deleted {
return nil
}
} else {
return errmsgs.WrapError(err)
}
}
if object.Status == string(status) {
return nil
}
time.Sleep(DefaultIntervalShort * time.Second)
if time.Now().After(deadline) {
return errmsgs.WrapErrorf(err, errmsgs.WaitTimeoutMsg, id, GetFunc(1), timeout, object.Status, string(status), errmsgs.ProviderERROR)
}
}
}
func (s *EcsService) DescribeAutoProvisioningGroup(id string) (group ecs.AutoProvisioningGroup, err error) {
request := ecs.CreateDescribeAutoProvisioningGroupsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.AutoProvisioningGroupId = &[]string{id}
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeAutoProvisioningGroups(request)
})
response, ok := raw.(*ecs.DescribeAutoProvisioningGroupsResponse)
if err != nil {
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return group, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
for _, v := range response.AutoProvisioningGroups.AutoProvisioningGroup {
if v.AutoProvisioningGroupId == id {
return v, nil
}
}
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("AutoProvisioningGroup", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return
}
func (s *EcsService) tagsToMap(tags []ecs.Tag) map[string]string {
result := make(map[string]string)
for _, t := range tags {
if !s.ecsTagIgnored(t) {
result[t.TagKey] = t.TagValue
}
}
return result
}
func (s *EcsService) ecsTagIgnored(t ecs.Tag) bool {
filter := []string{"^aliyun", "^acs:", "^ascm:", "^http://", "^https://"}
for _, v := range filter {
log.Printf("[DEBUG] Matching prefix %v with %v\n", v, t.TagKey)
ok, _ := regexp.MatchString(v, t.TagKey)
if ok {
log.Printf("[DEBUG] Found AlibabacloudStack Cloud specific tag %s (val: %s), ignoring.\n", t.TagKey, t.TagValue)
return true
}
}
return false
}
func (s *EcsService) SetResourceTags(d *schema.ResourceData, resourceType string) error {
oldItems, newItems := d.GetChange("tags")
added := make([]ecs.TagResourcesTag, 0)
for key, value := range newItems.(map[string]interface{}) {
added = append(added, ecs.TagResourcesTag{
Key: key,
Value: value.(string),
})
}
removed := make([]string, 0)
for key, _ := range oldItems.(map[string]interface{}) {
removed = append(removed, key)
}
if len(removed) > 0 {
request := ecs.CreateUntagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.ResourceType = resourceType
request.TagKey = &removed
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.UntagResources(request)
})
addDebug(request.GetActionName(), raw)
response, ok := raw.(*ecs.UntagResourcesResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidRegionId.NotFound", "InvalidResourceId.NotFound", "InvalidResourceType.NotFound", "MissingParameter.RegionId", "MissingParameter.ResourceIds", "MissingParameter.ResourceType", "MissingParameter.TagOwnerBid", "MissingParameter.TagOwnerUid", "MissingParameter.Tags"}) {
return nil
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return err
}
}
if len(added) > 0 {
request := ecs.CreateTagResourcesRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.ResourceId = &[]string{d.Id()}
request.ResourceType = resourceType
request.Tag = &added
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.TagResources(request)
})
addDebug(request.GetActionName(), raw)
response, ok := raw.(*ecs.TagResourcesResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidRegionId.NotFound", "InvalidResourceId.NotFound", "InvalidResourceType.NotFound", "MissingParameter.RegionId", "MissingParameter.ResourceIds", "MissingParameter.ResourceType", "MissingParameter.TagOwnerBid", "MissingParameter.TagOwnerUid", "MissingParameter.Tags"}) {
return nil
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return err
}
}
return nil
}
func (s *EcsService) SetResourceTagsNew(d *schema.ResourceData, resourceType string) error {
if d.HasChange("tags") {
added, removed := parsingTags(d)
removedTagKeys := make([]string, 0)
for _, v := range removed {
if !ignoredTags(v, "") {
removedTagKeys = append(removedTagKeys, v)
}
}
if len(removedTagKeys) > 0 {
action := "UnTagResources"
request := map[string]interface{}{
"ResourceType": resourceType,
"ResourceId.1": d.Id(),
}
for i, key := range removedTagKeys {
request[fmt.Sprintf("TagKey.%d", i+1)] = key
}
_, err := s.client.DoTeaRequest("POST", "Ecs", "2019-05-10", action, "", nil, nil, request)
if err != nil {
return err
}
}
if len(added) > 0 {
action := "TagResources"
request := map[string]interface{}{
"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++
}
_, err := s.client.DoTeaRequest("POST", "Ecs", "2019-05-10", action, "", nil, nil, request)
if err != nil {
return err
}
}
}
return nil
}
func (s *EcsService) DoEcsDescribededicatedhostautorenewRequest(id string) (object ecs.DedicatedHost, err error) {
return s.DescribeEcsDedicatedHost(id)
}
func (s *EcsService) DescribeEcsDedicatedHost(id string) (object ecs.DedicatedHost, err error) {
request := ecs.CreateDescribeDedicatedHostsRequest()
s.client.InitRpcRequest(*request.RpcRequest)
request.PageNumber = requests.NewInteger(1)
request.PageSize = requests.NewInteger(20)
for {
raw, err := s.client.WithEcsClient(func(ecsClient *ecs.Client) (interface{}, error) {
return ecsClient.DescribeDedicatedHosts(request)
})
response, ok := raw.(*ecs.DescribeDedicatedHostsResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidLockReason.NotFound"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("EcsDedicatedHost", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return object, err
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(response.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return object, err
}
addDebug(request.GetActionName(), raw, request.RpcRequest, request)
if len(response.DedicatedHosts.DedicatedHost) < 1 {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("EcsDedicatedHost", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, response.RequestId)
return object, err
}
for _, object := range response.DedicatedHosts.DedicatedHost {
if object.DedicatedHostId == id {
return object, nil
}
}
if len(response.DedicatedHosts.DedicatedHost) < PageSizeMedium {
break
}
if page, err := getNextpageNumber(request.PageNumber); err != nil {
return object, errmsgs.WrapError(err)
} else {
request.PageNumber = page
}
}
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("EcsDedicatedHost", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR, "")
return
}
func (s *EcsService) EcsDedicatedHostStateRefreshFunc(id string, failStates []string) resource.StateRefreshFunc {
return func() (interface{}, string, error) {
object, err := s.DescribeEcsDedicatedHost(id)
if err != nil {
if errmsgs.NotFoundError(err) {
// Set this to nil as if we didn't find anything.
return nil, "", nil
}
return nil, "", errmsgs.WrapError(err)
}
for _, failState := range failStates {
if object.Status == failState {
return object, object.Status, errmsgs.WrapError(errmsgs.Error(errmsgs.FailedToReachTargetStatus, object.Status))
}
}
return object, object.Status, nil
}
}
func (s *EcsService) DoEcsDescribestoragesetdetailsRequest(id string) (result *datahub_patch.EcsDescribeEcsEbsStorageSetsResult, err error) {
return s.DescribeEcsEbsStorageSet(id)
}
func (s *EcsService) DescribeEcsEbsStorageSet(id string) (result *datahub_patch.EcsDescribeEcsEbsStorageSetsResult, err error) {
resp := &datahub_patch.EcsDescribeEcsEbsStorageSetsResult{}
request := s.client.NewCommonRequest("GET", "Ecs", "2014-05-26", "DescribeStorageSets", "")
request.QueryParams["PageNumber"] = "1"
request.QueryParams["PageSize"] = "20"
//response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2014-05-26"), StringPointer("AK"), nil, request, &runtime)
raw, err := s.client.WithEcsClient(func(EcsClient *ecs.Client) (interface{}, error) {
return EcsClient.ProcessCommonRequest(request)
})
addDebug("DescribeStorageSets", raw, request)
bresponse, ok := raw.(*responses.CommonResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidRegionId.NotFound", "Operation.Forbidden"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("EcsEbsStorageSet", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return resp, err
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return resp, err
}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), resp)
//v, err := jsonpath.Get("$.Commands.Command", bresponse)
if err != nil {
return resp, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Commands.Command", raw)
}
//if len(v.([]interface{})) < 1 {
// return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, raw)
//} else {
// if v.([]interface{})[0].(map[string]interface{})["CommandId"].(string) != id {
// return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, raw)
// }
//}
//object = v.([]interface{})[0].(map[string]interface{})
return resp, nil
}
func (s *EcsService) DoEcsDescribecommandsRequest(id string) (result *datahub_patch.EcsDescribeEcsCommandResult, err error) {
return s.DescribeEcsCommand(id)
}
func (s *EcsService) DescribeEcsCommand(id string) (result *datahub_patch.EcsDescribeEcsCommandResult, err error) {
action := "DescribeCommands"
resp := &datahub_patch.EcsDescribeEcsCommandResult{}
request := s.client.NewCommonRequest("GET", "Ecs", "2014-05-26", action, "")
mergeMaps(request.QueryParams, map[string]string{
"CommandId": id,
"PageNumber": "1",
"PageSize": "20",
})
//response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2014-05-26"), StringPointer("AK"), nil, request, &runtime)
raw, err := s.client.WithEcsClient(func(EcsClient *ecs.Client) (interface{}, error) {
return EcsClient.ProcessCommonRequest(request)
})
bresponse, ok := raw.(*responses.CommonResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"InvalidRegionId.NotFound", "Operation.Forbidden"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("EcsCommand", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return resp, err
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return resp, err
}
addDebug(action, raw, request)
err = json.Unmarshal(bresponse.GetHttpContentBytes(), resp)
//v, err := jsonpath.Get("$.Commands.Command", bresponse)
if err != nil {
return resp, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.Commands.Command", raw)
}
//if len(v.([]interface{})) < 1 {
// return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, raw)
//} else {
// if v.([]interface{})[0].(map[string]interface{})["CommandId"].(string) != id {
// return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, raw)
// }
//}
//object = v.([]interface{})[0].(map[string]interface{})
return resp, nil
}
func (s *EcsService) DoEcsDescribehpcclustersRequest(id string) (result *datahub_patch.EcsDescribeEcsHpcClusterResult, err error) {
return s.DescribeEcsHpcCluster(id)
}
func (s *EcsService) DescribeEcsHpcCluster(id string) (result *datahub_patch.EcsDescribeEcsHpcClusterResult, err error) {
//var response map[string]interface{}
resp := &datahub_patch.EcsDescribeEcsHpcClusterResult{}
action := "DescribeHpcClusters"
ids, err := json.Marshal([]string{id})
if err != nil {
return nil, err
}
//request := map[string]interface{}{
//
// "HpcClusterIds": string(ids),
//}
ClientToken := buildClientToken("DescribeHpcClusters")
request := s.client.NewCommonRequest("POST", "Ecs", "2014-05-26", action, "")
request.QueryParams["HpcClusterIds"] = string(ids)
request.QueryParams["ClientToken"] = ClientToken
raw, err := s.client.WithEcsClient(func(EcsClient *ecs.Client) (interface{}, error) {
return EcsClient.ProcessCommonRequest(request)
})
//response, err = conn.DoRequest(StringPointer(action), nil, StringPointer("POST"), StringPointer("2014-05-26"), StringPointer("AK"), nil, request, &runtime)
bresponse, ok := raw.(*responses.CommonResponse)
if err != nil {
if errmsgs.IsExpectedErrors(err, []string{"NotExists.HpcCluster"}) {
err = errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("EcsHpcCluster", id)), errmsgs.NotFoundMsg, errmsgs.ProviderERROR)
return resp, err
}
errmsg := ""
if ok {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
err = errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, id, request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
return resp, err
}
addDebug(action, raw, request)
err = json.Unmarshal(bresponse.GetHttpContentBytes(), resp)
if err != nil {
return resp, errmsgs.WrapErrorf(err, errmsgs.DefaultErrorMsg, id, action, errmsgs.AlibabacloudStackSdkGoERROR)
}
//v, err := jsonpath.Get("$.HpcClusters.HpcCluster", raw)
//if err != nil {
// return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.HpcClusters.HpcCluster", raw)
//}
//if len(v.([]interface{})) < 1 {
// return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, raw)
//} else {
// if v.([]interface{})[0].(map[string]interface{})["HpcClusterId"].(string) != id {
// return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, raw)
// }
//}
//object = v.([]interface{})[0].(map[string]interface{})
return resp, nil
}
func (s *EcsService) DoEcsDescribedeploymentsetsRequest(id string) (object map[string]interface{}, err error) {
return s.DescribeEcsDeploymentSet(id)
}
func (s *EcsService) DescribeEcsDeploymentSet(id string) (object map[string]interface{}, err error) {
var response map[string]interface{}
request := map[string]interface{}{
"DeploymentSetIds": convertListToJsonString([]interface{}{id}),
}
response, err = s.client.DoTeaRequest("POST", "Ecs", "2014-05-26", "DescribeDeploymentSets", "", nil, nil, request)
if err != nil {
return object, err
}
v, err := jsonpath.Get("$.DeploymentSets.DeploymentSet", response)
if err != nil {
return object, errmsgs.WrapErrorf(err, errmsgs.FailedGetAttributeMsg, id, "$.DeploymentSets.DeploymentSet", response)
}
if len(v.([]interface{})) < 1 {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, response)
} else {
if v.([]interface{})[0].(map[string]interface{})["DeploymentSetId"].(string) != id {
return object, errmsgs.WrapErrorf(errmsgs.Error(errmsgs.GetNotFoundMessage("ECS", id)), errmsgs.NotFoundWithResponse, response)
}
}
object = v.([]interface{})[0].(map[string]interface{})
return object, nil
}