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  }