github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/provider/gce/provider.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package gce
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/environs"
    10  	"github.com/juju/juju/environs/config"
    11  )
    12  
    13  type environProvider struct{}
    14  
    15  var providerInstance environProvider
    16  
    17  // Open implements environs.EnvironProvider.
    18  func (environProvider) Open(cfg *config.Config) (environs.Environ, error) {
    19  	env, err := newEnviron(cfg)
    20  	return env, errors.Trace(err)
    21  }
    22  
    23  // PrepareForBootstrap implements environs.EnvironProvider.
    24  func (p environProvider) PrepareForBootstrap(ctx environs.BootstrapContext, cfg *config.Config) (environs.Environ, error) {
    25  	cfg, err := p.PrepareForCreateEnvironment(cfg)
    26  	if err != nil {
    27  		return nil, errors.Trace(err)
    28  	}
    29  	env, err := newEnviron(cfg)
    30  	if err != nil {
    31  		return nil, errors.Trace(err)
    32  	}
    33  
    34  	if ctx.ShouldVerifyCredentials() {
    35  		if err := env.gce.VerifyCredentials(); err != nil {
    36  			return nil, errors.Trace(err)
    37  		}
    38  	}
    39  	return env, nil
    40  }
    41  
    42  // PrepareForCreateEnvironment is specified in the EnvironProvider interface.
    43  func (environProvider) PrepareForCreateEnvironment(cfg *config.Config) (*config.Config, error) {
    44  	return cfg, nil
    45  }
    46  
    47  // RestrictedConfigAttributes is specified in the EnvironProvider interface.
    48  func (environProvider) RestrictedConfigAttributes() []string {
    49  	return []string{
    50  		cfgPrivateKey,
    51  		cfgClientID,
    52  		cfgClientEmail,
    53  		cfgRegion,
    54  		cfgProjectID,
    55  		cfgImageEndpoint,
    56  	}
    57  }
    58  
    59  // Validate implements environs.EnvironProvider.
    60  func (environProvider) Validate(cfg, old *config.Config) (valid *config.Config, err error) {
    61  	if old == nil {
    62  		ecfg, err := newValidConfig(cfg, configDefaults)
    63  		if err != nil {
    64  			return nil, errors.Annotate(err, "invalid config")
    65  		}
    66  		return ecfg.Config, nil
    67  	}
    68  
    69  	// The defaults should be set already, so we pass nil.
    70  	ecfg, err := newValidConfig(old, nil)
    71  	if err != nil {
    72  		return nil, errors.Annotate(err, "invalid base config")
    73  	}
    74  
    75  	if err := ecfg.update(cfg); err != nil {
    76  		return nil, errors.Annotate(err, "invalid config change")
    77  	}
    78  
    79  	return ecfg.Config, nil
    80  }
    81  
    82  // SecretAttrs implements environs.EnvironProvider.
    83  func (environProvider) SecretAttrs(cfg *config.Config) (map[string]string, error) {
    84  	// The defaults should be set already, so we pass nil.
    85  	ecfg, err := newValidConfig(cfg, nil)
    86  	if err != nil {
    87  		return nil, errors.Trace(err)
    88  	}
    89  	return ecfg.secret(), nil
    90  }
    91  
    92  // BoilerplateConfig implements environs.EnvironProvider.
    93  func (environProvider) BoilerplateConfig() string {
    94  	// boilerplateConfig is kept in config.go, in the hope that people editing
    95  	// config will keep it up to date.
    96  	return boilerplateConfig
    97  }