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  }