github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/environs/imagemetadata/testing/testing.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package testing 5 6 import ( 7 "fmt" 8 "io/ioutil" 9 "path" 10 "sort" 11 12 gc "launchpad.net/gocheck" 13 14 "launchpad.net/juju-core/environs/filestorage" 15 "launchpad.net/juju-core/environs/imagemetadata" 16 "launchpad.net/juju-core/environs/simplestreams" 17 "launchpad.net/juju-core/environs/storage" 18 "launchpad.net/juju-core/utils/set" 19 ) 20 21 // ParseMetadataFromDir loads ImageMetadata from the specified directory. 22 func ParseMetadataFromDir(c *gc.C, metadataDir string) []*imagemetadata.ImageMetadata { 23 stor, err := filestorage.NewFileStorageReader(metadataDir) 24 c.Assert(err, gc.IsNil) 25 return ParseMetadataFromStorage(c, stor) 26 } 27 28 // ParseMetadataFromStorage loads ImageMetadata from the specified storage reader. 29 func ParseMetadataFromStorage(c *gc.C, stor storage.StorageReader) []*imagemetadata.ImageMetadata { 30 source := storage.NewStorageSimpleStreamsDataSource("test storage reader", stor, "images") 31 32 // Find the simplestreams index file. 33 params := simplestreams.ValueParams{ 34 DataType: "image-ids", 35 ValueTemplate: imagemetadata.ImageMetadata{}, 36 } 37 const requireSigned = false 38 indexPath := simplestreams.UnsignedIndex 39 indexRef, err := simplestreams.GetIndexWithFormat( 40 source, indexPath, "index:1.0", requireSigned, simplestreams.CloudSpec{}, params) 41 c.Assert(err, gc.IsNil) 42 c.Assert(indexRef.Indexes, gc.HasLen, 1) 43 44 imageIndexMetadata := indexRef.Indexes["com.ubuntu.cloud:custom"] 45 c.Assert(imageIndexMetadata, gc.NotNil) 46 47 // Read the products file contents. 48 r, err := stor.Get(path.Join("images", imageIndexMetadata.ProductsFilePath)) 49 defer r.Close() 50 c.Assert(err, gc.IsNil) 51 data, err := ioutil.ReadAll(r) 52 c.Assert(err, gc.IsNil) 53 54 // Parse the products file metadata. 55 url, err := source.URL(imageIndexMetadata.ProductsFilePath) 56 c.Assert(err, gc.IsNil) 57 cloudMetadata, err := simplestreams.ParseCloudMetadata(data, "products:1.0", url, imagemetadata.ImageMetadata{}) 58 c.Assert(err, gc.IsNil) 59 60 // Collate the metadata. 61 imageMetadataMap := make(map[string]*imagemetadata.ImageMetadata) 62 var expectedProductIds set.Strings 63 var imageVersions set.Strings 64 for _, mc := range cloudMetadata.Products { 65 for _, items := range mc.Items { 66 for key, item := range items.Items { 67 imageMetadata := item.(*imagemetadata.ImageMetadata) 68 imageMetadataMap[key] = imageMetadata 69 imageVersions.Add(key) 70 productId := fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", mc.Version, imageMetadata.Arch) 71 expectedProductIds.Add(productId) 72 } 73 } 74 } 75 76 // Make sure index's product IDs are all represented in the products metadata. 77 sort.Strings(imageIndexMetadata.ProductIds) 78 c.Assert(imageIndexMetadata.ProductIds, gc.DeepEquals, expectedProductIds.SortedValues()) 79 80 imageMetadata := make([]*imagemetadata.ImageMetadata, len(imageMetadataMap)) 81 for i, key := range imageVersions.SortedValues() { 82 imageMetadata[i] = imageMetadataMap[key] 83 } 84 return imageMetadata 85 }