github.com/mmcquillan/packer@v1.1.1-0.20171009221028-c85cf0483a5d/builder/alicloud/ecs/access_config.go (about) 1 package ecs 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/denverdino/aliyungo/common" 8 "github.com/denverdino/aliyungo/ecs" 9 "github.com/hashicorp/packer/template/interpolate" 10 ) 11 12 // Config of alicloud 13 type AlicloudAccessConfig struct { 14 AlicloudAccessKey string `mapstructure:"access_key"` 15 AlicloudSecretKey string `mapstructure:"secret_key"` 16 AlicloudRegion string `mapstructure:"region"` 17 AlicloudSkipValidation bool `mapstructure:"skip_region_validation"` 18 } 19 20 // Client for AlicloudClient 21 func (c *AlicloudAccessConfig) Client() (*ecs.Client, error) { 22 if err := c.loadAndValidate(); err != nil { 23 return nil, err 24 } 25 client := ecs.NewECSClient(c.AlicloudAccessKey, c.AlicloudSecretKey, common.Region(c.AlicloudRegion)) 26 client.SetBusinessInfo("Packer") 27 if _, err := client.DescribeRegions(); err != nil { 28 return nil, err 29 } 30 return client, nil 31 } 32 33 func (c *AlicloudAccessConfig) Prepare(ctx *interpolate.Context) []error { 34 var errs []error 35 if err := c.Config(); err != nil { 36 errs = append(errs, err) 37 } 38 39 if c.AlicloudRegion != "" && !c.AlicloudSkipValidation { 40 if c.validateRegion() != nil { 41 errs = append(errs, fmt.Errorf("Unknown alicloud region: %s", c.AlicloudRegion)) 42 } 43 } 44 45 if len(errs) > 0 { 46 return errs 47 } 48 49 return nil 50 } 51 52 func (c *AlicloudAccessConfig) Config() error { 53 if c.AlicloudAccessKey == "" { 54 c.AlicloudAccessKey = os.Getenv("ALICLOUD_ACCESS_KEY") 55 } 56 if c.AlicloudSecretKey == "" { 57 c.AlicloudSecretKey = os.Getenv("ALICLOUD_SECRET_KEY") 58 } 59 if c.AlicloudAccessKey == "" || c.AlicloudSecretKey == "" { 60 return fmt.Errorf("ALICLOUD_ACCESS_KEY and ALICLOUD_SECRET_KEY must be set in template file or environment variables.") 61 } 62 return nil 63 64 } 65 66 func (c *AlicloudAccessConfig) loadAndValidate() error { 67 if err := c.validateRegion(); err != nil { 68 return err 69 } 70 71 return nil 72 } 73 74 func (c *AlicloudAccessConfig) validateRegion() error { 75 76 for _, valid := range common.ValidRegions { 77 if c.AlicloudRegion == string(valid) { 78 return nil 79 } 80 } 81 82 return fmt.Errorf("Not a valid alicloud region: %s", c.AlicloudRegion) 83 }