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 }