github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/builtin/providers/alicloud/service_alicloud_ecs.go (about)

     1  package alicloud
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"github.com/denverdino/aliyungo/common"
     7  	"github.com/denverdino/aliyungo/ecs"
     8  	"strings"
     9  )
    10  
    11  func (client *AliyunClient) DescribeImage(imageId string) (*ecs.ImageType, error) {
    12  
    13  	pagination := common.Pagination{
    14  		PageNumber: 1,
    15  	}
    16  	args := ecs.DescribeImagesArgs{
    17  		Pagination: pagination,
    18  		RegionId:   client.Region,
    19  		Status:     ecs.ImageStatusAvailable,
    20  	}
    21  
    22  	var allImages []ecs.ImageType
    23  
    24  	for {
    25  		images, _, err := client.ecsconn.DescribeImages(&args)
    26  		if err != nil {
    27  			break
    28  		}
    29  
    30  		if len(images) == 0 {
    31  			break
    32  		}
    33  
    34  		allImages = append(allImages, images...)
    35  
    36  		args.Pagination.PageNumber++
    37  	}
    38  
    39  	if len(allImages) == 0 {
    40  		return nil, common.GetClientErrorFromString("Not found")
    41  	}
    42  
    43  	var image *ecs.ImageType
    44  	imageIds := []string{}
    45  	for _, im := range allImages {
    46  		if im.ImageId == imageId {
    47  			image = &im
    48  		}
    49  		imageIds = append(imageIds, im.ImageId)
    50  	}
    51  
    52  	if image == nil {
    53  		return nil, fmt.Errorf("image_id %s not exists in range %s, all images are %s", imageId, client.Region, imageIds)
    54  	}
    55  
    56  	return image, nil
    57  }
    58  
    59  // DescribeZone validate zoneId is valid in region
    60  func (client *AliyunClient) DescribeZone(zoneID string) (*ecs.ZoneType, error) {
    61  	zones, err := client.ecsconn.DescribeZones(client.Region)
    62  	if err != nil {
    63  		return nil, fmt.Errorf("error to list zones not found")
    64  	}
    65  
    66  	var zone *ecs.ZoneType
    67  	zoneIds := []string{}
    68  	for _, z := range zones {
    69  		if z.ZoneId == zoneID {
    70  			zone = &ecs.ZoneType{
    71  				ZoneId:                    z.ZoneId,
    72  				LocalName:                 z.LocalName,
    73  				AvailableResourceCreation: z.AvailableResourceCreation,
    74  				AvailableDiskCategories:   z.AvailableDiskCategories,
    75  			}
    76  		}
    77  		zoneIds = append(zoneIds, z.ZoneId)
    78  	}
    79  
    80  	if zone == nil {
    81  		return nil, fmt.Errorf("availability_zone not exists in range %s, all zones are %s", client.Region, zoneIds)
    82  	}
    83  
    84  	return zone, nil
    85  }
    86  
    87  func (client *AliyunClient) QueryInstancesByIds(ids []string) (instances []ecs.InstanceAttributesType, err error) {
    88  	idsStr, jerr := json.Marshal(ids)
    89  	if jerr != nil {
    90  		return nil, jerr
    91  	}
    92  
    93  	args := ecs.DescribeInstancesArgs{
    94  		RegionId:    client.Region,
    95  		InstanceIds: string(idsStr),
    96  	}
    97  
    98  	instances, _, errs := client.ecsconn.DescribeInstances(&args)
    99  
   100  	if errs != nil {
   101  		return nil, errs
   102  	}
   103  
   104  	return instances, nil
   105  }
   106  
   107  func (client *AliyunClient) QueryInstancesById(id string) (instance *ecs.InstanceAttributesType, err error) {
   108  	ids := []string{id}
   109  
   110  	instances, errs := client.QueryInstancesByIds(ids)
   111  	if errs != nil {
   112  		return nil, errs
   113  	}
   114  
   115  	if len(instances) == 0 {
   116  		return nil, common.GetClientErrorFromString(InstanceNotfound)
   117  	}
   118  
   119  	return &instances[0], nil
   120  }
   121  
   122  // ResourceAvailable check resource available for zone
   123  func (client *AliyunClient) ResourceAvailable(zone *ecs.ZoneType, resourceType ecs.ResourceType) error {
   124  	available := false
   125  	for _, res := range zone.AvailableResourceCreation.ResourceTypes {
   126  		if res == resourceType {
   127  			available = true
   128  		}
   129  	}
   130  	if !available {
   131  		return fmt.Errorf("%s is not available in %s zone of %s region", resourceType, zone.ZoneId, client.Region)
   132  	}
   133  
   134  	return nil
   135  }
   136  
   137  func (client *AliyunClient) DiskAvailable(zone *ecs.ZoneType, diskCategory ecs.DiskCategory) error {
   138  	available := false
   139  	for _, dist := range zone.AvailableDiskCategories.DiskCategories {
   140  		if dist == diskCategory {
   141  			available = true
   142  		}
   143  	}
   144  	if !available {
   145  		return fmt.Errorf("%s is not available in %s zone of %s region", diskCategory, zone.ZoneId, client.Region)
   146  	}
   147  	return nil
   148  }
   149  
   150  // todo: support syc
   151  func (client *AliyunClient) JoinSecurityGroups(instanceId string, securityGroupIds []string) error {
   152  	for _, sid := range securityGroupIds {
   153  		err := client.ecsconn.JoinSecurityGroup(instanceId, sid)
   154  		if err != nil {
   155  			e, _ := err.(*common.Error)
   156  			if e.ErrorResponse.Code != InvalidInstanceIdAlreadyExists {
   157  				return err
   158  			}
   159  		}
   160  	}
   161  
   162  	return nil
   163  }
   164  
   165  func (client *AliyunClient) LeaveSecurityGroups(instanceId string, securityGroupIds []string) error {
   166  	for _, sid := range securityGroupIds {
   167  		err := client.ecsconn.LeaveSecurityGroup(instanceId, sid)
   168  		if err != nil {
   169  			e, _ := err.(*common.Error)
   170  			if e.ErrorResponse.Code != InvalidSecurityGroupIdNotFound {
   171  				return err
   172  			}
   173  		}
   174  	}
   175  
   176  	return nil
   177  }
   178  
   179  func (client *AliyunClient) DescribeSecurity(securityGroupId string) (*ecs.DescribeSecurityGroupAttributeResponse, error) {
   180  
   181  	args := &ecs.DescribeSecurityGroupAttributeArgs{
   182  		RegionId:        client.Region,
   183  		SecurityGroupId: securityGroupId,
   184  	}
   185  
   186  	return client.ecsconn.DescribeSecurityGroupAttribute(args)
   187  }
   188  
   189  func (client *AliyunClient) DescribeSecurityGroupRule(securityGroupId, types, ip_protocol, port_range string) (*ecs.PermissionType, error) {
   190  
   191  	sg, err := client.DescribeSecurity(securityGroupId)
   192  	if err != nil {
   193  		return nil, err
   194  	}
   195  
   196  	for _, p := range sg.Permissions.Permission {
   197  		if strings.ToLower(string(p.IpProtocol)) == ip_protocol && p.PortRange == port_range {
   198  			return &p, nil
   199  		}
   200  	}
   201  	return nil, nil
   202  
   203  }
   204  
   205  func (client *AliyunClient) RevokeSecurityGroup(args *ecs.RevokeSecurityGroupArgs) error {
   206  	//todo: handle the specal err
   207  	return client.ecsconn.RevokeSecurityGroup(args)
   208  }