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  }