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  }