github.com/timsutton/packer@v1.3.2/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  	SecurityToken          string `mapstructure:"security_token"`
    19  }
    20  
    21  // Client for AlicloudClient
    22  func (c *AlicloudAccessConfig) Client() (*ecs.Client, error) {
    23  	if err := c.loadAndValidate(); err != nil {
    24  		return nil, err
    25  	}
    26  	if c.SecurityToken == "" {
    27  		c.SecurityToken = os.Getenv("SECURITY_TOKEN")
    28  	}
    29  	client := ecs.NewECSClientWithSecurityToken(c.AlicloudAccessKey, c.AlicloudSecretKey,
    30  		c.SecurityToken, common.Region(c.AlicloudRegion))
    31  
    32  	client.SetBusinessInfo("Packer")
    33  	if _, err := client.DescribeRegions(); err != nil {
    34  		return nil, err
    35  	}
    36  	return client, nil
    37  }
    38  
    39  func (c *AlicloudAccessConfig) Prepare(ctx *interpolate.Context) []error {
    40  	var errs []error
    41  	if err := c.Config(); err != nil {
    42  		errs = append(errs, err)
    43  	}
    44  
    45  	if c.AlicloudRegion != "" && !c.AlicloudSkipValidation {
    46  		if c.validateRegion() != nil {
    47  			errs = append(errs, fmt.Errorf("Unknown alicloud region: %s", c.AlicloudRegion))
    48  		}
    49  	}
    50  
    51  	if len(errs) > 0 {
    52  		return errs
    53  	}
    54  
    55  	return nil
    56  }
    57  
    58  func (c *AlicloudAccessConfig) Config() error {
    59  	if c.AlicloudAccessKey == "" {
    60  		c.AlicloudAccessKey = os.Getenv("ALICLOUD_ACCESS_KEY")
    61  	}
    62  	if c.AlicloudSecretKey == "" {
    63  		c.AlicloudSecretKey = os.Getenv("ALICLOUD_SECRET_KEY")
    64  	}
    65  	if c.AlicloudAccessKey == "" || c.AlicloudSecretKey == "" {
    66  		return fmt.Errorf("ALICLOUD_ACCESS_KEY and ALICLOUD_SECRET_KEY must be set in template file or environment variables.")
    67  	}
    68  	return nil
    69  
    70  }
    71  
    72  func (c *AlicloudAccessConfig) loadAndValidate() error {
    73  	if err := c.validateRegion(); err != nil {
    74  		return err
    75  	}
    76  
    77  	return nil
    78  }
    79  
    80  func (c *AlicloudAccessConfig) validateRegion() error {
    81  
    82  	for _, valid := range common.ValidRegions {
    83  		if c.AlicloudRegion == string(valid) {
    84  			return nil
    85  		}
    86  	}
    87  
    88  	return fmt.Errorf("Not a valid alicloud region: %s", c.AlicloudRegion)
    89  }