github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/environs/imagemetadata_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package environs_test 5 6 import ( 7 stdcontext "context" 8 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/environs" 14 "github.com/juju/juju/environs/bootstrap" 15 "github.com/juju/juju/environs/imagemetadata" 16 "github.com/juju/juju/environs/simplestreams" 17 sstesting "github.com/juju/juju/environs/simplestreams/testing" 18 envtesting "github.com/juju/juju/environs/testing" 19 "github.com/juju/juju/jujuclient" 20 "github.com/juju/juju/provider/dummy" 21 "github.com/juju/juju/testing" 22 coretesting "github.com/juju/juju/testing" 23 ) 24 25 type ImageMetadataSuite struct { 26 coretesting.BaseSuite 27 } 28 29 var _ = gc.Suite(&ImageMetadataSuite{}) 30 31 func (s *ImageMetadataSuite) TearDownTest(c *gc.C) { 32 dummy.Reset(c) 33 s.BaseSuite.TearDownTest(c) 34 } 35 36 func (s *ImageMetadataSuite) env(c *gc.C, imageMetadataURL, stream string, defaultsDisabled bool) environs.Environ { 37 attrs := dummy.SampleConfig() 38 if stream != "" { 39 attrs = attrs.Merge(testing.Attrs{ 40 "image-stream": stream, 41 }) 42 } 43 if imageMetadataURL != "" { 44 attrs = attrs.Merge(testing.Attrs{ 45 "image-metadata-url": imageMetadataURL, 46 }) 47 } 48 if defaultsDisabled { 49 attrs = attrs.Merge(testing.Attrs{ 50 "image-metadata-defaults-disabled": true, 51 }) 52 } 53 env, err := bootstrap.PrepareController( 54 false, 55 envtesting.BootstrapContext(stdcontext.TODO(), c), 56 jujuclient.NewMemStore(), 57 bootstrap.PrepareParams{ 58 ControllerConfig: testing.FakeControllerConfig(), 59 ControllerName: attrs["name"].(string), 60 ModelConfig: attrs, 61 Cloud: dummy.SampleCloudSpec(), 62 AdminSecret: "admin-secret", 63 }, 64 ) 65 c.Assert(err, jc.ErrorIsNil) 66 return env.(environs.Environ) 67 } 68 69 func (s *ImageMetadataSuite) TestImageMetadataURLsNoConfigURL(c *gc.C) { 70 env := s.env(c, "", "", false) 71 sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 72 c.Assert(err, jc.ErrorIsNil) 73 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 74 {"http://cloud-images.ubuntu.com/releases/", imagemetadata.SimplestreamsImagesPublicKey, true}, 75 }) 76 } 77 78 func (s *ImageMetadataSuite) TestImageMetadataURLs(c *gc.C) { 79 env := s.env(c, "config-image-metadata-url", "", false) 80 sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 81 c.Assert(err, jc.ErrorIsNil) 82 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 83 {"config-image-metadata-url/", "", false}, 84 {"http://cloud-images.ubuntu.com/releases/", imagemetadata.SimplestreamsImagesPublicKey, true}, 85 }) 86 } 87 88 func (s *ImageMetadataSuite) TestImageMetadataURLsNoDefaults(c *gc.C) { 89 env := s.env(c, "https://custom.meta.data/", "", true) 90 sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 91 c.Assert(err, jc.ErrorIsNil) 92 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 93 {"https://custom.meta.data/", "", false}, 94 }) 95 } 96 97 func (s *ImageMetadataSuite) TestImageMetadataURLsNoDefaultsNoConfigURL(c *gc.C) { 98 env := s.env(c, "", "", true) 99 sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 100 c.Assert(err, jc.ErrorIsNil) 101 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{}) 102 } 103 104 func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncs(c *gc.C) { 105 factory := sstesting.TestDataSourceFactory() 106 environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { 107 return factory.NewDataSource(simplestreams.Config{ 108 Description: "id0", 109 BaseURL: "betwixt/releases", 110 HostnameVerification: false, 111 Priority: simplestreams.DEFAULT_CLOUD_DATA}), nil 112 }) 113 environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { 114 return factory.NewDataSource(simplestreams.Config{ 115 Description: "id1", 116 BaseURL: "yoink", 117 HostnameVerification: false, 118 Priority: simplestreams.SPECIFIC_CLOUD_DATA}), nil 119 }) 120 // overwrite the one previously registered against id1 121 environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { 122 return nil, errors.NewNotSupported(nil, "oyvey") 123 }) 124 environs.RegisterUserImageDataSourceFunc("id2", func(environs.Environ) (simplestreams.DataSource, error) { 125 return factory.NewDataSource(simplestreams.Config{ 126 Description: "id2", 127 BaseURL: "foobar", 128 HostnameVerification: false, 129 Priority: simplestreams.CUSTOM_CLOUD_DATA}), nil 130 }) 131 defer environs.UnregisterImageDataSourceFunc("id0") 132 defer environs.UnregisterImageDataSourceFunc("id1") 133 defer environs.UnregisterImageDataSourceFunc("id2") 134 135 env := s.env(c, "config-image-metadata-url", "", false) 136 sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 137 c.Assert(err, jc.ErrorIsNil) 138 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 139 {"config-image-metadata-url/", "", false}, 140 {"foobar/", "", false}, 141 {"betwixt/releases/", "", false}, 142 {"http://cloud-images.ubuntu.com/releases/", imagemetadata.SimplestreamsImagesPublicKey, true}, 143 }) 144 } 145 146 func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncsNoDefaultsNoConfigURL(c *gc.C) { 147 factory := sstesting.TestDataSourceFactory() 148 environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { 149 return factory.NewDataSource(simplestreams.Config{ 150 Description: "id0", 151 BaseURL: "betwixt/releases", 152 HostnameVerification: false, 153 Priority: simplestreams.DEFAULT_CLOUD_DATA}), nil 154 }) 155 environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { 156 return factory.NewDataSource(simplestreams.Config{ 157 Description: "id1", 158 BaseURL: "yoink", 159 HostnameVerification: false, 160 Priority: simplestreams.SPECIFIC_CLOUD_DATA}), nil 161 }) 162 // overwrite the one previously registered against id1 163 environs.RegisterImageDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) { 164 return nil, errors.NewNotSupported(nil, "oyvey") 165 }) 166 environs.RegisterUserImageDataSourceFunc("id2", func(environs.Environ) (simplestreams.DataSource, error) { 167 return factory.NewDataSource(simplestreams.Config{ 168 Description: "id2", 169 BaseURL: "foobar", 170 HostnameVerification: false, 171 Priority: simplestreams.CUSTOM_CLOUD_DATA}), nil 172 }) 173 defer environs.UnregisterImageDataSourceFunc("id0") 174 defer environs.UnregisterImageDataSourceFunc("id1") 175 defer environs.UnregisterImageDataSourceFunc("id2") 176 177 env := s.env(c, "", "", true) 178 sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 179 c.Assert(err, jc.ErrorIsNil) 180 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 181 {"foobar/", "", false}, 182 {"betwixt/releases/", "", false}, 183 }) 184 } 185 186 func (s *ImageMetadataSuite) TestImageMetadataURLsRegisteredFuncsError(c *gc.C) { 187 environs.RegisterImageDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) { 188 return nil, errors.New("oyvey!") 189 }) 190 defer environs.UnregisterImageDataSourceFunc("id0") 191 192 env := s.env(c, "config-image-metadata-url", "", false) 193 _, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 194 c.Assert(err, gc.ErrorMatches, "oyvey!") 195 } 196 197 func (s *ImageMetadataSuite) TestImageMetadataURLsNonReleaseStream(c *gc.C) { 198 env := s.env(c, "", "daily", false) 199 sources, err := environs.ImageMetadataSources(env, sstesting.TestDataSourceFactory()) 200 c.Assert(err, jc.ErrorIsNil) 201 sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{ 202 {"http://cloud-images.ubuntu.com/daily/", imagemetadata.SimplestreamsImagesPublicKey, true}, 203 }) 204 }