github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/state/stateenvirons/features_test.go (about)

     1  // Copyright 2021 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package stateenvirons
     5  
     6  import (
     7  	"github.com/juju/testing"
     8  	jc "github.com/juju/testing/checkers"
     9  	"github.com/juju/version/v2"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/caas"
    13  	"github.com/juju/juju/core/assumes"
    14  	"github.com/juju/juju/environs"
    15  	"github.com/juju/juju/environs/config"
    16  	"github.com/juju/juju/state"
    17  	coretesting "github.com/juju/juju/testing"
    18  )
    19  
    20  type featuresSuite struct {
    21  	testing.IsolationSuite
    22  }
    23  
    24  var _ = gc.Suite(&featuresSuite{})
    25  
    26  func (s *featuresSuite) TestSupportedFeaturesWithIncompatibleEnviron(c *gc.C) {
    27  	defer func(getter func(Model) (environs.Environ, error)) {
    28  		iaasEnvironGetter = getter
    29  	}(iaasEnvironGetter)
    30  	iaasEnvironGetter = func(Model) (environs.Environ, error) {
    31  		// Not supporting environs.SupportedFeaturesEnumerator
    32  		return nil, nil
    33  	}
    34  
    35  	jujuVersion := version.MustParse("2.9.17")
    36  	m := mockModel{
    37  		jujuVersion: jujuVersion,
    38  		modelType:   state.ModelTypeIAAS,
    39  	}
    40  	fs, err := SupportedFeatures(m, nil)
    41  	c.Assert(err, jc.ErrorIsNil)
    42  
    43  	exp := []assumes.Feature{
    44  		{
    45  			Name:        "juju",
    46  			Description: "the version of Juju used by the model",
    47  			Version:     &jujuVersion,
    48  		},
    49  	}
    50  
    51  	c.Assert(fs.AsList(), gc.DeepEquals, exp)
    52  }
    53  
    54  func (s *featuresSuite) TestSupportedFeaturesWithCompatibleIAASEnviron(c *gc.C) {
    55  	defer func(getter func(Model) (environs.Environ, error)) {
    56  		iaasEnvironGetter = getter
    57  	}(iaasEnvironGetter)
    58  	iaasEnvironGetter = func(Model) (environs.Environ, error) {
    59  		return mockIAASEnvironWithFeatures{}, nil
    60  	}
    61  
    62  	jujuVersion := version.MustParse("2.9.17")
    63  	m := mockModel{
    64  		jujuVersion: jujuVersion,
    65  		modelType:   state.ModelTypeIAAS,
    66  	}
    67  	fs, err := SupportedFeatures(m, nil)
    68  	c.Assert(err, jc.ErrorIsNil)
    69  
    70  	exp := []assumes.Feature{
    71  		{
    72  			Name:        "juju",
    73  			Description: "the version of Juju used by the model",
    74  			Version:     &jujuVersion,
    75  		},
    76  		// The following feature was reported by the environ.
    77  		{Name: "web-scale"},
    78  	}
    79  
    80  	c.Assert(fs.AsList(), gc.DeepEquals, exp)
    81  }
    82  
    83  func (s *featuresSuite) TestSupportedFeaturesWithCompatibleCAASEnviron(c *gc.C) {
    84  	defer func(getter func(Model) (caas.Broker, error)) {
    85  		caasBrokerGetter = getter
    86  	}(caasBrokerGetter)
    87  	caasBrokerGetter = func(Model) (caas.Broker, error) {
    88  		return mockCAASEnvironWithFeatures{}, nil
    89  	}
    90  
    91  	jujuVersion := version.MustParse("2.9.17")
    92  	m := mockModel{
    93  		jujuVersion: jujuVersion,
    94  		modelType:   state.ModelTypeCAAS,
    95  	}
    96  	fs, err := SupportedFeatures(m, nil)
    97  	c.Assert(err, jc.ErrorIsNil)
    98  
    99  	exp := []assumes.Feature{
   100  		{
   101  			Name:        "juju",
   102  			Description: "the version of Juju used by the model",
   103  			Version:     &jujuVersion,
   104  		},
   105  		// The following feature was reported by the environ.
   106  		{Name: "k8s-api"},
   107  	}
   108  
   109  	c.Assert(fs.AsList(), gc.DeepEquals, exp)
   110  }
   111  
   112  type mockModel struct {
   113  	Model
   114  
   115  	jujuVersion version.Number
   116  	modelType   state.ModelType
   117  }
   118  
   119  func (m mockModel) Config() (*config.Config, error) {
   120  	return config.New(config.NoDefaults,
   121  		coretesting.FakeConfig().Merge(coretesting.Attrs{
   122  			config.AgentVersionKey: m.jujuVersion.String(),
   123  		}),
   124  	)
   125  }
   126  
   127  func (m mockModel) Type() state.ModelType {
   128  	return m.modelType
   129  }
   130  
   131  type mockIAASEnvironWithFeatures struct {
   132  	environs.Environ
   133  }
   134  
   135  func (mockIAASEnvironWithFeatures) SupportedFeatures() (assumes.FeatureSet, error) {
   136  	var fs assumes.FeatureSet
   137  	fs.Add(assumes.Feature{Name: "web-scale"})
   138  	return fs, nil
   139  }
   140  
   141  type mockCAASEnvironWithFeatures struct {
   142  	caas.Broker
   143  }
   144  
   145  func (mockCAASEnvironWithFeatures) SupportedFeatures() (assumes.FeatureSet, error) {
   146  	var fs assumes.FeatureSet
   147  	fs.Add(assumes.Feature{Name: "k8s-api"})
   148  	return fs, nil
   149  }