github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/environs/config.go (about) 1 // Copyright 2011, 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package environs 5 6 import ( 7 "fmt" 8 9 "github.com/juju/errors" 10 "github.com/juju/loggo" 11 12 "github.com/juju/juju/environs/config" 13 ) 14 15 var logger = loggo.GetLogger("juju.environs") 16 17 // ProviderRegistry is an interface that provides methods for registering 18 // and obtaining environment providers by provider name. 19 type ProviderRegistry interface { 20 // RegisterProvider registers a new environment provider with the given 21 // name, and zero or more aliases. If a provider already exists with the 22 // given name or alias, an error will be returned. 23 RegisterProvider(p EnvironProvider, providerType string, providerTypeAliases ...string) error 24 25 // RegisteredProviders returns the names of the registered environment 26 // providers. 27 RegisteredProviders() []string 28 29 // Provider returns the environment provider with the specified name. 30 Provider(providerType string) (EnvironProvider, error) 31 } 32 33 // GlobalProviderRegistry returns the global provider registry. 34 func GlobalProviderRegistry() ProviderRegistry { 35 return globalProviders 36 } 37 38 type globalProviderRegistry struct { 39 // providers maps from provider type to EnvironProvider for 40 // each registered provider type. 41 providers map[string]EnvironProvider 42 // providerAliases is a map of provider type aliases. 43 aliases map[string]string 44 } 45 46 var globalProviders = &globalProviderRegistry{ 47 providers: map[string]EnvironProvider{}, 48 aliases: map[string]string{}, 49 } 50 51 func (r *globalProviderRegistry) RegisterProvider(p EnvironProvider, providerType string, providerTypeAliases ...string) error { 52 if r.providers[providerType] != nil || r.aliases[providerType] != "" { 53 return errors.Errorf("duplicate provider name %q", providerType) 54 } 55 r.providers[providerType] = p 56 for _, alias := range providerTypeAliases { 57 if r.providers[alias] != nil || r.aliases[alias] != "" { 58 return errors.Errorf("duplicate provider alias %q", alias) 59 } 60 r.aliases[alias] = providerType 61 } 62 return nil 63 } 64 65 func (r *globalProviderRegistry) RegisteredProviders() []string { 66 var p []string 67 for k := range r.providers { 68 p = append(p, k) 69 } 70 return p 71 } 72 73 func (r *globalProviderRegistry) Provider(providerType string) (EnvironProvider, error) { 74 if alias, ok := r.aliases[providerType]; ok { 75 providerType = alias 76 } 77 p, ok := r.providers[providerType] 78 if !ok { 79 return nil, errors.NewNotFound( 80 nil, fmt.Sprintf("no registered provider for %q", providerType), 81 ) 82 } 83 return p, nil 84 } 85 86 // RegisterProvider registers a new environment provider. Name gives the name 87 // of the provider, and p the interface to that provider. 88 // 89 // RegisterProvider will panic if the provider name or any of the aliases 90 // are registered more than once. 91 func RegisterProvider(name string, p EnvironProvider, alias ...string) { 92 if err := GlobalProviderRegistry().RegisterProvider(p, name, alias...); err != nil { 93 panic(fmt.Errorf("juju: %v", err)) 94 } 95 } 96 97 // RegisteredProviders enumerate all the environ providers which have been registered. 98 func RegisteredProviders() []string { 99 return GlobalProviderRegistry().RegisteredProviders() 100 } 101 102 // Provider returns the previously registered provider with the given type. 103 func Provider(providerType string) (EnvironProvider, error) { 104 return GlobalProviderRegistry().Provider(providerType) 105 } 106 107 // BootstrapConfig returns a copy of the supplied configuration with the 108 // admin-secret and ca-private-key attributes removed. If the resulting 109 // config is not suitable for bootstrapping an environment, an error is 110 // returned. 111 func BootstrapConfig(cfg *config.Config) (*config.Config, error) { 112 m := cfg.AllAttrs() 113 // We never want to push admin-secret or the root CA private key to the cloud. 114 delete(m, "admin-secret") 115 delete(m, "ca-private-key") 116 cfg, err := config.New(config.NoDefaults, m) 117 if err != nil { 118 return nil, err 119 } 120 if _, ok := cfg.AgentVersion(); !ok { 121 return nil, fmt.Errorf("model configuration has no agent-version") 122 } 123 return cfg, nil 124 }