github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/environs/imagemetadata/generate_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package imagemetadata_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 10 corebase "github.com/juju/juju/core/base" 11 "github.com/juju/juju/environs/filestorage" 12 "github.com/juju/juju/environs/imagemetadata" 13 "github.com/juju/juju/environs/imagemetadata/testing" 14 "github.com/juju/juju/environs/simplestreams" 15 sstesting "github.com/juju/juju/environs/simplestreams/testing" 16 "github.com/juju/juju/environs/storage" 17 coretesting "github.com/juju/juju/testing" 18 ) 19 20 var ( 21 testBase = corebase.MustParseBaseFromString("ubuntu@16.04") 22 testVersion = "16.04" 23 ) 24 25 var _ = gc.Suite(&generateSuite{}) 26 27 type generateSuite struct { 28 coretesting.BaseSuite 29 } 30 31 func (s *generateSuite) SetUpTest(c *gc.C) { 32 s.PatchValue(&corebase.UbuntuDistroInfo, "/path/notexists") 33 } 34 35 func assertFetch(c *gc.C, ss *simplestreams.Simplestreams, stor storage.Storage, version, arch, region, endpoint string, ids ...string) { 36 cons, err := imagemetadata.NewImageConstraint(simplestreams.LookupParams{ 37 CloudSpec: simplestreams.CloudSpec{region, endpoint}, 38 Releases: []string{version}, 39 Arches: []string{arch}, 40 }) 41 c.Assert(err, jc.ErrorIsNil) 42 dataSource := storage.NewStorageSimpleStreamsDataSource("test datasource", stor, "images", simplestreams.DEFAULT_CLOUD_DATA, false) 43 metadata, _, err := imagemetadata.Fetch(ss, []simplestreams.DataSource{dataSource}, cons) 44 c.Assert(err, jc.ErrorIsNil) 45 c.Assert(metadata, gc.HasLen, len(ids)) 46 for i, id := range ids { 47 c.Assert(metadata[i].Id, gc.Equals, id) 48 } 49 } 50 51 func (s *generateSuite) TestWriteMetadata(c *gc.C) { 52 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 53 im := []*imagemetadata.ImageMetadata{ 54 { 55 Id: "1234", 56 Arch: "amd64", 57 Version: testVersion, 58 }, 59 } 60 cloudSpec := &simplestreams.CloudSpec{ 61 Region: "region", 62 Endpoint: "endpoint", 63 } 64 dir := c.MkDir() 65 targetStorage, err := filestorage.NewFileStorageWriter(dir) 66 c.Assert(err, jc.ErrorIsNil) 67 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, im, cloudSpec, targetStorage) 68 c.Assert(err, jc.ErrorIsNil) 69 metadata := testing.ParseMetadataFromDir(c, dir) 70 c.Assert(metadata, gc.HasLen, 1) 71 im[0].RegionName = cloudSpec.Region 72 im[0].Endpoint = cloudSpec.Endpoint 73 c.Assert(im[0], gc.DeepEquals, metadata[0]) 74 assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234") 75 } 76 77 func (s *generateSuite) TestWriteMetadataMergeOverwriteSameArch(c *gc.C) { 78 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 79 existingImageMetadata := []*imagemetadata.ImageMetadata{ 80 { 81 Id: "1234", 82 Arch: "amd64", 83 Version: testVersion, 84 }, 85 } 86 cloudSpec := &simplestreams.CloudSpec{ 87 Region: "region", 88 Endpoint: "endpoint", 89 } 90 dir := c.MkDir() 91 targetStorage, err := filestorage.NewFileStorageWriter(dir) 92 c.Assert(err, jc.ErrorIsNil) 93 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage) 94 c.Assert(err, jc.ErrorIsNil) 95 newImageMetadata := []*imagemetadata.ImageMetadata{ 96 { 97 Id: "abcd", 98 Arch: "amd64", 99 Version: testVersion, 100 }, 101 { 102 Id: "xyz", 103 Arch: "arm", 104 Version: testVersion, 105 }, 106 } 107 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage) 108 c.Assert(err, jc.ErrorIsNil) 109 metadata := testing.ParseMetadataFromDir(c, dir) 110 c.Assert(metadata, gc.HasLen, 2) 111 for _, im := range newImageMetadata { 112 im.RegionName = cloudSpec.Region 113 im.Endpoint = cloudSpec.Endpoint 114 } 115 c.Assert(metadata, gc.DeepEquals, newImageMetadata) 116 assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "abcd") 117 assertFetch(c, ss, targetStorage, testVersion, "arm", "region", "endpoint", "xyz") 118 } 119 120 func (s *generateSuite) TestWriteMetadataMergeDifferentSeries(c *gc.C) { 121 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 122 existingImageMetadata := []*imagemetadata.ImageMetadata{ 123 { 124 Id: "1234", 125 Arch: "amd64", 126 Version: testVersion, 127 }, 128 } 129 cloudSpec := &simplestreams.CloudSpec{ 130 Region: "region", 131 Endpoint: "endpoint", 132 } 133 dir := c.MkDir() 134 targetStorage, err := filestorage.NewFileStorageWriter(dir) 135 c.Assert(err, jc.ErrorIsNil) 136 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage) 137 c.Assert(err, jc.ErrorIsNil) 138 newImageMetadata := []*imagemetadata.ImageMetadata{ 139 { 140 Id: "abcd", 141 Arch: "amd64", 142 Version: "12.04", 143 }, 144 { 145 Id: "xyz", 146 Arch: "arm", 147 Version: "12.04", 148 }, 149 } 150 base := corebase.MustParseBaseFromString("ubuntu@12.04") 151 err = imagemetadata.MergeAndWriteMetadata(ss, base, newImageMetadata, cloudSpec, targetStorage) 152 c.Assert(err, jc.ErrorIsNil) 153 metadata := testing.ParseMetadataFromDir(c, dir) 154 c.Assert(metadata, gc.HasLen, 3) 155 newImageMetadata = append(newImageMetadata, existingImageMetadata[0]) 156 for _, im := range newImageMetadata { 157 im.RegionName = cloudSpec.Region 158 im.Endpoint = cloudSpec.Endpoint 159 } 160 imagemetadata.Sort(newImageMetadata) 161 c.Assert(metadata, gc.DeepEquals, newImageMetadata) 162 assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234") 163 assertFetch(c, ss, targetStorage, "12.04", "amd64", "region", "endpoint", "abcd") 164 } 165 166 func (s *generateSuite) TestWriteMetadataMergeDifferentRegion(c *gc.C) { 167 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 168 existingImageMetadata := []*imagemetadata.ImageMetadata{ 169 { 170 Id: "1234", 171 Arch: "amd64", 172 Version: testVersion, 173 }, 174 } 175 cloudSpec := &simplestreams.CloudSpec{ 176 Region: "region", 177 Endpoint: "endpoint", 178 } 179 dir := c.MkDir() 180 targetStorage, err := filestorage.NewFileStorageWriter(dir) 181 c.Assert(err, jc.ErrorIsNil) 182 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage) 183 c.Assert(err, jc.ErrorIsNil) 184 newImageMetadata := []*imagemetadata.ImageMetadata{ 185 { 186 Id: "abcd", 187 Arch: "amd64", 188 Version: testVersion, 189 }, 190 { 191 Id: "xyz", 192 Arch: "arm", 193 Version: testVersion, 194 }, 195 } 196 cloudSpec = &simplestreams.CloudSpec{ 197 Region: "region2", 198 Endpoint: "endpoint2", 199 } 200 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage) 201 c.Assert(err, jc.ErrorIsNil) 202 metadata := testing.ParseMetadataFromDir(c, dir) 203 c.Assert(metadata, gc.HasLen, 3) 204 for _, im := range newImageMetadata { 205 im.RegionName = "region2" 206 im.Endpoint = "endpoint2" 207 } 208 existingImageMetadata[0].RegionName = "region" 209 existingImageMetadata[0].Endpoint = "endpoint" 210 newImageMetadata = append(newImageMetadata, existingImageMetadata[0]) 211 imagemetadata.Sort(newImageMetadata) 212 c.Assert(metadata, gc.DeepEquals, newImageMetadata) 213 assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234") 214 assertFetch(c, ss, targetStorage, testVersion, "amd64", "region2", "endpoint2", "abcd") 215 } 216 217 // lp#1600054 218 func (s *generateSuite) TestWriteMetadataMergeDifferentVirtType(c *gc.C) { 219 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 220 existingImageMetadata := []*imagemetadata.ImageMetadata{ 221 { 222 Id: "1234", 223 Arch: "amd64", 224 Version: testVersion, 225 VirtType: "kvm", 226 }, 227 } 228 cloudSpec := &simplestreams.CloudSpec{ 229 Region: "region", 230 Endpoint: "endpoint", 231 } 232 dir := c.MkDir() 233 targetStorage, err := filestorage.NewFileStorageWriter(dir) 234 c.Assert(err, jc.ErrorIsNil) 235 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage) 236 c.Assert(err, jc.ErrorIsNil) 237 newImageMetadata := []*imagemetadata.ImageMetadata{ 238 { 239 Id: "abcd", 240 Arch: "amd64", 241 Version: testVersion, 242 VirtType: "lxd", 243 }, 244 } 245 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage) 246 c.Assert(err, jc.ErrorIsNil) 247 248 foundMetadata := testing.ParseMetadataFromDir(c, dir) 249 250 expectedMetadata := append(newImageMetadata, existingImageMetadata...) 251 c.Assert(len(foundMetadata), gc.Equals, len(expectedMetadata)) 252 for _, im := range expectedMetadata { 253 im.RegionName = cloudSpec.Region 254 im.Endpoint = cloudSpec.Endpoint 255 } 256 imagemetadata.Sort(expectedMetadata) 257 c.Assert(foundMetadata, gc.DeepEquals, expectedMetadata) 258 assertFetch(c, ss, targetStorage, testVersion, "amd64", "region", "endpoint", "1234", "abcd") 259 } 260 261 func (s *generateSuite) TestWriteIndexRegionOnce(c *gc.C) { 262 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 263 existingImageMetadata := []*imagemetadata.ImageMetadata{ 264 { 265 Id: "1234", 266 Arch: "amd64", 267 Version: testVersion, 268 VirtType: "kvm", 269 }, 270 } 271 cloudSpec := &simplestreams.CloudSpec{ 272 Region: "region", 273 Endpoint: "endpoint", 274 } 275 dir := c.MkDir() 276 targetStorage, err := filestorage.NewFileStorageWriter(dir) 277 c.Assert(err, jc.ErrorIsNil) 278 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage) 279 c.Assert(err, jc.ErrorIsNil) 280 newImageMetadata := []*imagemetadata.ImageMetadata{ 281 { 282 Id: "abcd", 283 Arch: "amd64", 284 Version: testVersion, 285 VirtType: "lxd", 286 }, 287 } 288 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage) 289 c.Assert(err, jc.ErrorIsNil) 290 291 foundIndex, _ := testing.ParseIndexMetadataFromStorage(c, targetStorage) 292 expectedCloudSpecs := []simplestreams.CloudSpec{*cloudSpec} 293 c.Assert(foundIndex.Clouds, jc.SameContents, expectedCloudSpecs) 294 } 295 296 func (s *generateSuite) TestWriteDistinctIndexRegions(c *gc.C) { 297 ss := simplestreams.NewSimpleStreams(sstesting.TestDataSourceFactory()) 298 existingImageMetadata := []*imagemetadata.ImageMetadata{ 299 { 300 Id: "1234", 301 Arch: "amd64", 302 Version: testVersion, 303 VirtType: "kvm", 304 }, 305 } 306 cloudSpec := &simplestreams.CloudSpec{ 307 Region: "region", 308 Endpoint: "endpoint", 309 } 310 dir := c.MkDir() 311 targetStorage, err := filestorage.NewFileStorageWriter(dir) 312 c.Assert(err, jc.ErrorIsNil) 313 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, existingImageMetadata, cloudSpec, targetStorage) 314 c.Assert(err, jc.ErrorIsNil) 315 316 expectedCloudSpecs := []simplestreams.CloudSpec{*cloudSpec} 317 318 newImageMetadata := []*imagemetadata.ImageMetadata{ 319 { 320 Id: "abcd", 321 Arch: "amd64", 322 Version: testVersion, 323 VirtType: "lxd", 324 }, 325 } 326 cloudSpec = &simplestreams.CloudSpec{ 327 Region: "region2", 328 Endpoint: "endpoint2", 329 } 330 err = imagemetadata.MergeAndWriteMetadata(ss, testBase, newImageMetadata, cloudSpec, targetStorage) 331 c.Assert(err, jc.ErrorIsNil) 332 333 foundIndex, _ := testing.ParseIndexMetadataFromStorage(c, targetStorage) 334 expectedCloudSpecs = append(expectedCloudSpecs, *cloudSpec) 335 c.Assert(foundIndex.Clouds, jc.SameContents, expectedCloudSpecs) 336 }