1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
"github.com/juju/errors"
8
"gopkg.in/juju/names.v2"
10
"github.com/juju/juju/cloud"
11
"github.com/juju/juju/environs"
12
"github.com/juju/juju/state"
15
// EnvironConfigGetter implements environs.EnvironConfigGetter
16
// in terms of a *state.State.
17
type EnvironConfigGetter struct {
21
// CloudSpec implements environs.EnvironConfigGetter.
22
func (g EnvironConfigGetter) CloudSpec(tag names.ModelTag) (environs.CloudSpec, error) {
23
model, err := g.GetModel(tag)
25
return environs.CloudSpec{}, errors.Trace(err)
27
cloudName := model.Cloud()
28
regionName := model.CloudRegion()
29
credentialName := model.CloudCredential()
30
modelOwner := model.Owner()
31
return CloudSpec(g.State, cloudName, regionName, credentialName, modelOwner)
34
// CloudSpec returns an environs.CloudSpec from a *state.State,
35
// given the cloud, region and credential names.
37
accessor state.CloudAccessor,
38
cloudName, regionName, credentialName string,
39
credentialOwner names.UserTag,
40
) (environs.CloudSpec, error) {
41
modelCloud, err := accessor.Cloud(cloudName)
43
return environs.CloudSpec{}, errors.Trace(err)
46
var credential *cloud.Credential
47
if credentialName != "" {
48
credentials, err := accessor.CloudCredentials(credentialOwner, cloudName)
50
return environs.CloudSpec{}, errors.Trace(err)
53
credentialValue, ok := credentials[credentialName]
55
return environs.CloudSpec{}, errors.NotFoundf("credential %q", credentialName)
57
credential = &credentialValue
60
return environs.MakeCloudSpec(modelCloud, cloudName, regionName, credential)
63
// NewEnvironFunc defines the type of a function that, given a state.State,
64
// returns a new Environ.
65
type NewEnvironFunc func(*state.State) (environs.Environ, error)
67
// GetNewEnvironFunc returns a NewEnvironFunc, that constructs Environs
68
// using the given environs.NewEnvironFunc.
69
func GetNewEnvironFunc(newEnviron environs.NewEnvironFunc) NewEnvironFunc {
70
return func(st *state.State) (environs.Environ, error) {
71
g := EnvironConfigGetter{st}
72
return environs.GetEnviron(g, newEnviron)