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 }