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  }