forked from juju/juju
-
Notifications
You must be signed in to change notification settings - Fork 0
/
provider.go
128 lines (108 loc) · 3.67 KB
/
provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// Copyright 2014 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
package gce
import (
stdcontext "context"
"github.com/juju/errors"
"github.com/juju/jsonschema"
"github.com/juju/schema"
"gopkg.in/juju/environschema.v1"
"github.com/juju/juju/cloud"
"github.com/juju/juju/environs"
environscloudspec "github.com/juju/juju/environs/cloudspec"
"github.com/juju/juju/environs/config"
"github.com/juju/juju/environs/context"
)
const (
// provider version 1 introduces labels for disks,
// for associating them with a model and controller.
providerVersion1 = 1
currentProviderVersion = providerVersion1
)
type environProvider struct {
environProviderCredentials
}
var providerInstance environProvider
// Version is part of the EnvironProvider interface.
func (environProvider) Version() int {
return currentProviderVersion
}
// Open implements environs.EnvironProvider.
func (environProvider) Open(_ stdcontext.Context, args environs.OpenParams) (environs.Environ, error) {
if err := validateCloudSpec(args.Cloud); err != nil {
return nil, errors.Annotate(err, "validating cloud spec")
}
env, err := newEnviron(args.Cloud, args.Config)
return env, errors.Trace(err)
}
// CloudSchema returns the schema used to validate input for add-cloud. Since
// this provider does not support custom clouds, this always returns nil.
func (p environProvider) CloudSchema() *jsonschema.Schema {
return nil
}
// Ping tests the connection to the cloud, to verify the endpoint is valid.
func (p environProvider) Ping(ctx context.ProviderCallContext, endpoint string) error {
return errors.NotImplementedf("Ping")
}
// PrepareConfig implements environs.EnvironProvider.
func (p environProvider) PrepareConfig(args environs.PrepareConfigParams) (*config.Config, error) {
if err := validateCloudSpec(args.Cloud); err != nil {
return nil, errors.Annotate(err, "validating cloud spec")
}
return configWithDefaults(args.Config)
}
func validateCloudSpec(spec environscloudspec.CloudSpec) error {
if err := spec.Validate(); err != nil {
return errors.Trace(err)
}
if spec.Credential == nil {
return errors.NotValidf("missing credential")
}
switch authType := spec.Credential.AuthType(); authType {
case cloud.OAuth2AuthType, cloud.JSONFileAuthType:
default:
return errors.NotSupportedf("%q auth-type", authType)
}
return nil
}
// Schema returns the configuration schema for an environment.
func (environProvider) Schema() environschema.Fields {
fields, err := config.Schema(configSchema)
if err != nil {
panic(err)
}
return fields
}
// ConfigSchema returns extra config attributes specific
// to this provider only.
func (p environProvider) ConfigSchema() schema.Fields {
return configFields
}
// ConfigDefaults returns the default values for the
// provider specific config attributes.
func (p environProvider) ConfigDefaults() schema.Defaults {
return configDefaults
}
// UpgradeModelConfig is specified in the ModelConfigUpgrader interface.
func (environProvider) UpgradeConfig(cfg *config.Config) (*config.Config, error) {
return configWithDefaults(cfg)
}
func configWithDefaults(cfg *config.Config) (*config.Config, error) {
defaults := make(map[string]interface{})
if _, ok := cfg.StorageDefaultBlockSource(); !ok {
// Set the default block source.
defaults[config.StorageDefaultBlockSourceKey] = storageProviderType
}
if len(defaults) == 0 {
return cfg, nil
}
return cfg.Apply(defaults)
}
// Validate implements environs.EnvironProvider.Validate.
func (environProvider) Validate(cfg, old *config.Config) (*config.Config, error) {
newCfg, err := newConfig(cfg, old)
if err != nil {
return nil, errors.Annotate(err, "invalid config")
}
return newCfg.config, nil
}