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  }