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 }