github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/environs/statepolicy.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package environs 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/constraints" 10 "github.com/juju/juju/environs/config" 11 "github.com/juju/juju/environs/simplestreams" 12 "github.com/juju/juju/state" 13 ) 14 15 // environStatePolicy implements state.Policy in 16 // terms of environs.Environ and related types. 17 type environStatePolicy struct{} 18 19 var _ state.Policy = environStatePolicy{} 20 21 // NewStatePolicy returns a state.Policy that is 22 // implemented in terms of Environ and related 23 // types. 24 func NewStatePolicy() state.Policy { 25 return environStatePolicy{} 26 } 27 28 func (environStatePolicy) Prechecker(cfg *config.Config) (state.Prechecker, error) { 29 // Environ implements state.Prechecker. 30 return New(cfg) 31 } 32 33 func (environStatePolicy) ConfigValidator(providerType string) (state.ConfigValidator, error) { 34 // EnvironProvider implements state.ConfigValidator. 35 return Provider(providerType) 36 } 37 38 func (environStatePolicy) EnvironCapability(cfg *config.Config) (state.EnvironCapability, error) { 39 // Environ implements state.EnvironCapability. 40 return New(cfg) 41 } 42 43 func (environStatePolicy) ConstraintsValidator(cfg *config.Config, querier state.SupportedArchitecturesQuerier) (constraints.Validator, error) { 44 env, err := New(cfg) 45 if err != nil { 46 return nil, err 47 } 48 49 // Ensure that supported architectures are filtered based on cloud specification. 50 // TODO (anastasiamac 2015-12-22) this cries for a test \o/ 51 region := "" 52 if cloudEnv, ok := env.(simplestreams.HasRegion); ok { 53 cloudCfg, err := cloudEnv.Region() 54 if err != nil { 55 return nil, err 56 } 57 region = cloudCfg.Region 58 } 59 arches, err := querier.SupportedArchitectures(env.Config().AgentStream(), region) 60 if err != nil { 61 return nil, err 62 } 63 64 // Construct provider specific validator. 65 val, err := env.ConstraintsValidator() 66 if err != nil { 67 return nil, err 68 } 69 70 // Update validator architectures with supported architectures from stored 71 // cloud image metadata. 72 if len(arches) != 0 { 73 val.UpdateVocabulary(constraints.Arch, arches) 74 } 75 return val, nil 76 } 77 78 func (environStatePolicy) InstanceDistributor(cfg *config.Config) (state.InstanceDistributor, error) { 79 env, err := New(cfg) 80 if err != nil { 81 return nil, err 82 } 83 if p, ok := env.(state.InstanceDistributor); ok { 84 return p, nil 85 } 86 return nil, errors.NotImplementedf("InstanceDistributor") 87 }