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