github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/provider/maas/config.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package maas 5 6 import ( 7 "errors" 8 "fmt" 9 "net/url" 10 "strings" 11 12 "github.com/juju/schema" 13 14 "github.com/juju/juju/environs/config" 15 ) 16 17 var configFields = schema.Fields{ 18 "maas-server": schema.String(), 19 // maas-oauth is a colon-separated triplet of: 20 // consumer-key:resource-token:resource-secret 21 "maas-oauth": schema.String(), 22 // maas-agent-name is an optional UUID to group the instances 23 // acquired from MAAS, to support multiple environments per MAAS user. 24 "maas-agent-name": schema.String(), 25 } 26 var configDefaults = schema.Defaults{ 27 // For backward-compatibility, maas-agent-name is the empty string 28 // by default. However, new environments should all use a UUID. 29 "maas-agent-name": "", 30 } 31 32 type maasEnvironConfig struct { 33 *config.Config 34 attrs map[string]interface{} 35 } 36 37 func (cfg *maasEnvironConfig) maasServer() string { 38 return cfg.attrs["maas-server"].(string) 39 } 40 41 func (cfg *maasEnvironConfig) maasOAuth() string { 42 return cfg.attrs["maas-oauth"].(string) 43 } 44 45 func (cfg *maasEnvironConfig) maasAgentName() string { 46 if uuid, ok := cfg.attrs["maas-agent-name"].(string); ok { 47 return uuid 48 } 49 return "" 50 } 51 52 func (prov maasEnvironProvider) newConfig(cfg *config.Config) (*maasEnvironConfig, error) { 53 validCfg, err := prov.Validate(cfg, nil) 54 if err != nil { 55 return nil, err 56 } 57 result := new(maasEnvironConfig) 58 result.Config = validCfg 59 result.attrs = validCfg.UnknownAttrs() 60 return result, nil 61 } 62 63 var errMalformedMaasOAuth = errors.New("malformed maas-oauth (3 items separated by colons)") 64 65 func (prov maasEnvironProvider) Validate(cfg, oldCfg *config.Config) (*config.Config, error) { 66 // Validate base configuration change before validating MAAS specifics. 67 err := config.Validate(cfg, oldCfg) 68 if err != nil { 69 return nil, err 70 } 71 72 validated, err := cfg.ValidateUnknownAttrs(configFields, configDefaults) 73 if err != nil { 74 return nil, err 75 } 76 77 // Add MAAS specific defaults. 78 providerDefaults := make(map[string]interface{}) 79 80 // Storage. 81 if _, ok := cfg.StorageDefaultBlockSource(); !ok { 82 providerDefaults[config.StorageDefaultBlockSourceKey] = maasStorageProviderType 83 } 84 if len(providerDefaults) > 0 { 85 if cfg, err = cfg.Apply(providerDefaults); err != nil { 86 return nil, err 87 } 88 } 89 90 if oldCfg != nil { 91 oldAttrs := oldCfg.UnknownAttrs() 92 validMaasAgentName := false 93 if oldName, ok := oldAttrs["maas-agent-name"]; !ok || oldName == nil { 94 // If maas-agent-name was nil (because the config was 95 // generated pre-1.16.2 the only correct value for it is "" 96 // See bug #1256179 97 validMaasAgentName = (validated["maas-agent-name"] == "") 98 } else { 99 validMaasAgentName = (validated["maas-agent-name"] == oldName) 100 } 101 if !validMaasAgentName { 102 return nil, fmt.Errorf("cannot change maas-agent-name") 103 } 104 } 105 envCfg := new(maasEnvironConfig) 106 envCfg.Config = cfg 107 envCfg.attrs = validated 108 server := envCfg.maasServer() 109 serverURL, err := url.Parse(server) 110 if err != nil || serverURL.Scheme == "" || serverURL.Host == "" { 111 return nil, fmt.Errorf("malformed maas-server URL '%v': %s", server, err) 112 } 113 oauth := envCfg.maasOAuth() 114 if strings.Count(oauth, ":") != 2 { 115 return nil, errMalformedMaasOAuth 116 } 117 return cfg.Apply(envCfg.attrs) 118 }