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