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 }