launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/provider/ec2/config.go (about)

     1  // Copyright 2011, 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package ec2
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"launchpad.net/goamz/aws"
    10  
    11  	"launchpad.net/juju-core/environs/config"
    12  	"launchpad.net/juju-core/schema"
    13  )
    14  
    15  var configFields = schema.Fields{
    16  	"access-key":     schema.String(),
    17  	"secret-key":     schema.String(),
    18  	"region":         schema.String(),
    19  	"control-bucket": schema.String(),
    20  }
    21  
    22  var configDefaults = schema.Defaults{
    23  	"access-key": "",
    24  	"secret-key": "",
    25  	"region":     "us-east-1",
    26  }
    27  
    28  type environConfig struct {
    29  	*config.Config
    30  	attrs map[string]interface{}
    31  }
    32  
    33  func (c *environConfig) region() string {
    34  	return c.attrs["region"].(string)
    35  }
    36  
    37  func (c *environConfig) controlBucket() string {
    38  	return c.attrs["control-bucket"].(string)
    39  }
    40  
    41  func (c *environConfig) accessKey() string {
    42  	return c.attrs["access-key"].(string)
    43  }
    44  
    45  func (c *environConfig) secretKey() string {
    46  	return c.attrs["secret-key"].(string)
    47  }
    48  
    49  func (p environProvider) newConfig(cfg *config.Config) (*environConfig, error) {
    50  	valid, err := p.Validate(cfg, nil)
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  	return &environConfig{valid, valid.UnknownAttrs()}, nil
    55  }
    56  
    57  func (p environProvider) Validate(cfg, old *config.Config) (valid *config.Config, err error) {
    58  	// Check for valid changes for the base config values.
    59  	if err := config.Validate(cfg, old); err != nil {
    60  		return nil, err
    61  	}
    62  	validated, err := cfg.ValidateUnknownAttrs(configFields, configDefaults)
    63  	if err != nil {
    64  		return nil, err
    65  	}
    66  	ecfg := &environConfig{cfg, validated}
    67  	if ecfg.accessKey() == "" || ecfg.secretKey() == "" {
    68  		auth, err := aws.EnvAuth()
    69  		if err != nil || ecfg.accessKey() != "" || ecfg.secretKey() != "" {
    70  			return nil, fmt.Errorf("environment has no access-key or secret-key")
    71  		}
    72  		ecfg.attrs["access-key"] = auth.AccessKey
    73  		ecfg.attrs["secret-key"] = auth.SecretKey
    74  	}
    75  	if _, ok := aws.Regions[ecfg.region()]; !ok {
    76  		return nil, fmt.Errorf("invalid region name %q", ecfg.region())
    77  	}
    78  
    79  	if old != nil {
    80  		attrs := old.UnknownAttrs()
    81  		if region, _ := attrs["region"].(string); ecfg.region() != region {
    82  			return nil, fmt.Errorf("cannot change region from %q to %q", region, ecfg.region())
    83  		}
    84  		if bucket, _ := attrs["control-bucket"].(string); ecfg.controlBucket() != bucket {
    85  			return nil, fmt.Errorf("cannot change control-bucket from %q to %q", bucket, ecfg.controlBucket())
    86  		}
    87  	}
    88  
    89  	// ssl-hostname-verification cannot be disabled
    90  	if !ecfg.SSLHostnameVerification() {
    91  		return nil, fmt.Errorf("disabling ssh-hostname-verification is not supported")
    92  	}
    93  
    94  	// Apply the coerced unknown values back into the config.
    95  	return cfg.Apply(ecfg.attrs)
    96  }