github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/stateenvirons/policy.go (about) 1 // Copyright 2014, 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package stateenvirons 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/constraints" 10 "github.com/juju/juju/environs" 11 "github.com/juju/juju/environs/config" 12 "github.com/juju/juju/instance" 13 "github.com/juju/juju/state" 14 "github.com/juju/juju/storage" 15 "github.com/juju/juju/storage/provider" 16 ) 17 18 // environStatePolicy implements state.Policy in 19 // terms of environs.Environ and related types. 20 type environStatePolicy struct { 21 st *state.State 22 getEnviron func(*state.State) (environs.Environ, error) 23 } 24 25 // GetNewPolicyFunc returns a state.NewPolicyFunc that will return 26 // a state.Policy implemented in terms of environs.Environ and 27 // related types. The provided function will be used to construct 28 // environs.Environs given a state.State. 29 func GetNewPolicyFunc(getEnviron func(*state.State) (environs.Environ, error)) state.NewPolicyFunc { 30 return func(st *state.State) state.Policy { 31 return environStatePolicy{st, getEnviron} 32 } 33 } 34 35 // Prechecker implements state.Policy. 36 func (p environStatePolicy) Prechecker() (state.Prechecker, error) { 37 // Environ implements state.Prechecker. 38 return p.getEnviron(p.st) 39 } 40 41 // ConfigValidator implements state.Policy. 42 func (p environStatePolicy) ConfigValidator() (config.Validator, error) { 43 return environProvider(p.st) 44 } 45 46 // ProviderConfigSchemaSource implements state.Policy. 47 func (p environStatePolicy) ProviderConfigSchemaSource() (config.ConfigSchemaSource, error) { 48 provider, err := environProvider(p.st) 49 if err != nil { 50 return nil, errors.Trace(err) 51 } 52 if cs, ok := provider.(config.ConfigSchemaSource); ok { 53 return cs, nil 54 } 55 return nil, errors.NotImplementedf("config.ConfigSource") 56 } 57 58 // ConstraintsValidator implements state.Policy. 59 func (p environStatePolicy) ConstraintsValidator() (constraints.Validator, error) { 60 env, err := p.getEnviron(p.st) 61 if err != nil { 62 return nil, err 63 } 64 return env.ConstraintsValidator() 65 } 66 67 // InstanceDistributor implements state.Policy. 68 func (p environStatePolicy) InstanceDistributor() (instance.Distributor, error) { 69 env, err := p.getEnviron(p.st) 70 if err != nil { 71 return nil, err 72 } 73 if p, ok := env.(instance.Distributor); ok { 74 return p, nil 75 } 76 return nil, errors.NotImplementedf("InstanceDistributor") 77 } 78 79 // StorageProviderRegistry implements state.Policy. 80 func (p environStatePolicy) StorageProviderRegistry() (storage.ProviderRegistry, error) { 81 env, err := p.getEnviron(p.st) 82 if err != nil { 83 return nil, errors.Trace(err) 84 } 85 return NewStorageProviderRegistry(env), nil 86 } 87 88 // NewStorageProviderRegistry returns a storage.ProviderRegistry that chains 89 // the provided Environ with the common storage providers. 90 func NewStorageProviderRegistry(env environs.Environ) storage.ProviderRegistry { 91 return storage.ChainedProviderRegistry{env, provider.CommonStorageProviders()} 92 } 93 94 func environProvider(st *state.State) (environs.EnvironProvider, error) { 95 model, err := st.Model() 96 if err != nil { 97 return nil, errors.Annotate(err, "getting model") 98 } 99 cloud, err := st.Cloud(model.Cloud()) 100 if err != nil { 101 return nil, errors.Annotate(err, "getting cloud") 102 } 103 // EnvironProvider implements state.ConfigValidator. 104 return environs.Provider(cloud.Type) 105 }