github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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  }