github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  	"github.com/juju/schema"
     9  	"gopkg.in/juju/environschema.v1"
    10  
    11  	"github.com/juju/juju/cloud"
    12  	"github.com/juju/juju/environs"
    13  	"github.com/juju/juju/environs/config"
    14  )
    15  
    16  type environProvider struct {
    17  	environProviderCredentials
    18  }
    19  
    20  var providerInstance environProvider
    21  
    22  // Open implements environs.EnvironProvider.
    23  func (environProvider) Open(args environs.OpenParams) (environs.Environ, error) {
    24  	if err := validateCloudSpec(args.Cloud); err != nil {
    25  		return nil, errors.Annotate(err, "validating cloud spec")
    26  	}
    27  	env, err := newEnviron(args.Cloud, args.Config)
    28  	return env, errors.Trace(err)
    29  }
    30  
    31  // PrepareConfig implements environs.EnvironProvider.
    32  func (p environProvider) PrepareConfig(args environs.PrepareConfigParams) (*config.Config, error) {
    33  	if err := validateCloudSpec(args.Cloud); err != nil {
    34  		return nil, errors.Annotate(err, "validating cloud spec")
    35  	}
    36  	return configWithDefaults(args.Config)
    37  }
    38  
    39  func validateCloudSpec(spec environs.CloudSpec) error {
    40  	if err := spec.Validate(); err != nil {
    41  		return errors.Trace(err)
    42  	}
    43  	if spec.Credential == nil {
    44  		return errors.NotValidf("missing credential")
    45  	}
    46  	switch authType := spec.Credential.AuthType(); authType {
    47  	case cloud.OAuth2AuthType, cloud.JSONFileAuthType:
    48  	default:
    49  		return errors.NotSupportedf("%q auth-type", authType)
    50  	}
    51  	return nil
    52  }
    53  
    54  // Schema returns the configuration schema for an environment.
    55  func (environProvider) Schema() environschema.Fields {
    56  	fields, err := config.Schema(configSchema)
    57  	if err != nil {
    58  		panic(err)
    59  	}
    60  	return fields
    61  }
    62  
    63  // ConfigSchema returns extra config attributes specific
    64  // to this provider only.
    65  func (p environProvider) ConfigSchema() schema.Fields {
    66  	return configFields
    67  }
    68  
    69  // ConfigDefaults returns the default values for the
    70  // provider specific config attributes.
    71  func (p environProvider) ConfigDefaults() schema.Defaults {
    72  	return configDefaults
    73  }
    74  
    75  // UpgradeModelConfig is specified in the ModelConfigUpgrader interface.
    76  func (environProvider) UpgradeConfig(cfg *config.Config) (*config.Config, error) {
    77  	return configWithDefaults(cfg)
    78  }
    79  
    80  func configWithDefaults(cfg *config.Config) (*config.Config, error) {
    81  	defaults := make(map[string]interface{})
    82  	if _, ok := cfg.StorageDefaultBlockSource(); !ok {
    83  		// Set the default block source.
    84  		defaults[config.StorageDefaultBlockSourceKey] = storageProviderType
    85  	}
    86  	if len(defaults) == 0 {
    87  		return cfg, nil
    88  	}
    89  	return cfg.Apply(defaults)
    90  }
    91  
    92  // Validate implements environs.EnvironProvider.Validate.
    93  func (environProvider) Validate(cfg, old *config.Config) (*config.Config, error) {
    94  	newCfg, err := newConfig(cfg, old)
    95  	if err != nil {
    96  		return nil, errors.Annotate(err, "invalid config")
    97  	}
    98  	return newCfg.config, nil
    99  }