github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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 "github.com/juju/utils/set" 13 gc "launchpad.net/gocheck" 14 15 "github.com/juju/juju/environs/filestorage" 16 "github.com/juju/juju/environs/imagemetadata" 17 "github.com/juju/juju/environs/simplestreams" 18 "github.com/juju/juju/environs/storage" 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 }