github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/environs/imagemetadata/generate_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package imagemetadata_test
     5  
     6  import (
     7  	gc "launchpad.net/gocheck"
     8  
     9  	"github.com/juju/juju/environs/filestorage"
    10  	"github.com/juju/juju/environs/imagemetadata"
    11  	"github.com/juju/juju/environs/imagemetadata/testing"
    12  	"github.com/juju/juju/environs/simplestreams"
    13  	"github.com/juju/juju/environs/storage"
    14  	coretesting "github.com/juju/juju/testing"
    15  )
    16  
    17  var _ = gc.Suite(&generateSuite{})
    18  
    19  type generateSuite struct {
    20  	coretesting.BaseSuite
    21  }
    22  
    23  func assertFetch(c *gc.C, stor storage.Storage, series, arch, region, endpoint, id string) {
    24  	cons := imagemetadata.NewImageConstraint(simplestreams.LookupParams{
    25  		CloudSpec: simplestreams.CloudSpec{region, endpoint},
    26  		Series:    []string{series},
    27  		Arches:    []string{arch},
    28  	})
    29  	dataSource := storage.NewStorageSimpleStreamsDataSource("test datasource", stor, "images")
    30  	metadata, _, err := imagemetadata.Fetch(
    31  		[]simplestreams.DataSource{dataSource}, simplestreams.DefaultIndexPath, cons, false)
    32  	c.Assert(err, gc.IsNil)
    33  	c.Assert(metadata, gc.HasLen, 1)
    34  	c.Assert(metadata[0].Id, gc.Equals, id)
    35  }
    36  
    37  func (s *generateSuite) TestWriteMetadata(c *gc.C) {
    38  	im := []*imagemetadata.ImageMetadata{
    39  		{
    40  			Id:      "1234",
    41  			Arch:    "amd64",
    42  			Version: "13.04",
    43  		},
    44  	}
    45  	cloudSpec := &simplestreams.CloudSpec{
    46  		Region:   "region",
    47  		Endpoint: "endpoint",
    48  	}
    49  	dir := c.MkDir()
    50  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
    51  	c.Assert(err, gc.IsNil)
    52  	err = imagemetadata.MergeAndWriteMetadata("raring", im, cloudSpec, targetStorage)
    53  	c.Assert(err, gc.IsNil)
    54  	metadata := testing.ParseMetadataFromDir(c, dir)
    55  	c.Assert(metadata, gc.HasLen, 1)
    56  	im[0].RegionName = cloudSpec.Region
    57  	im[0].Endpoint = cloudSpec.Endpoint
    58  	c.Assert(im[0], gc.DeepEquals, metadata[0])
    59  	assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "1234")
    60  }
    61  
    62  func (s *generateSuite) TestWriteMetadataMergeOverwriteSameArch(c *gc.C) {
    63  	existingImageMetadata := []*imagemetadata.ImageMetadata{
    64  		{
    65  			Id:      "1234",
    66  			Arch:    "amd64",
    67  			Version: "13.04",
    68  		},
    69  	}
    70  	cloudSpec := &simplestreams.CloudSpec{
    71  		Region:   "region",
    72  		Endpoint: "endpoint",
    73  	}
    74  	dir := c.MkDir()
    75  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
    76  	c.Assert(err, gc.IsNil)
    77  	err = imagemetadata.MergeAndWriteMetadata("raring", existingImageMetadata, cloudSpec, targetStorage)
    78  	c.Assert(err, gc.IsNil)
    79  	newImageMetadata := []*imagemetadata.ImageMetadata{
    80  		{
    81  			Id:      "abcd",
    82  			Arch:    "amd64",
    83  			Version: "13.04",
    84  		},
    85  		{
    86  			Id:      "xyz",
    87  			Arch:    "arm",
    88  			Version: "13.04",
    89  		},
    90  	}
    91  	err = imagemetadata.MergeAndWriteMetadata("raring", newImageMetadata, cloudSpec, targetStorage)
    92  	c.Assert(err, gc.IsNil)
    93  	metadata := testing.ParseMetadataFromDir(c, dir)
    94  	c.Assert(metadata, gc.HasLen, 2)
    95  	for _, im := range newImageMetadata {
    96  		im.RegionName = cloudSpec.Region
    97  		im.Endpoint = cloudSpec.Endpoint
    98  	}
    99  	c.Assert(metadata, gc.DeepEquals, newImageMetadata)
   100  	assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "abcd")
   101  	assertFetch(c, targetStorage, "raring", "arm", "region", "endpoint", "xyz")
   102  }
   103  
   104  func (s *generateSuite) TestWriteMetadataMergeDifferentSeries(c *gc.C) {
   105  	existingImageMetadata := []*imagemetadata.ImageMetadata{
   106  		{
   107  			Id:      "1234",
   108  			Arch:    "amd64",
   109  			Version: "13.04",
   110  		},
   111  	}
   112  	cloudSpec := &simplestreams.CloudSpec{
   113  		Region:   "region",
   114  		Endpoint: "endpoint",
   115  	}
   116  	dir := c.MkDir()
   117  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
   118  	c.Assert(err, gc.IsNil)
   119  	err = imagemetadata.MergeAndWriteMetadata("raring", existingImageMetadata, cloudSpec, targetStorage)
   120  	c.Assert(err, gc.IsNil)
   121  	newImageMetadata := []*imagemetadata.ImageMetadata{
   122  		{
   123  			Id:      "abcd",
   124  			Arch:    "amd64",
   125  			Version: "12.04",
   126  		},
   127  		{
   128  			Id:      "xyz",
   129  			Arch:    "arm",
   130  			Version: "12.04",
   131  		},
   132  	}
   133  	err = imagemetadata.MergeAndWriteMetadata("precise", newImageMetadata, cloudSpec, targetStorage)
   134  	c.Assert(err, gc.IsNil)
   135  	metadata := testing.ParseMetadataFromDir(c, dir)
   136  	c.Assert(metadata, gc.HasLen, 3)
   137  	newImageMetadata = append(newImageMetadata, existingImageMetadata[0])
   138  	for _, im := range newImageMetadata {
   139  		im.RegionName = cloudSpec.Region
   140  		im.Endpoint = cloudSpec.Endpoint
   141  	}
   142  	imagemetadata.Sort(newImageMetadata)
   143  	c.Assert(metadata, gc.DeepEquals, newImageMetadata)
   144  	assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "1234")
   145  	assertFetch(c, targetStorage, "precise", "amd64", "region", "endpoint", "abcd")
   146  }
   147  
   148  func (s *generateSuite) TestWriteMetadataMergeDifferentRegion(c *gc.C) {
   149  	existingImageMetadata := []*imagemetadata.ImageMetadata{
   150  		{
   151  			Id:      "1234",
   152  			Arch:    "amd64",
   153  			Version: "13.04",
   154  		},
   155  	}
   156  	cloudSpec := &simplestreams.CloudSpec{
   157  		Region:   "region",
   158  		Endpoint: "endpoint",
   159  	}
   160  	dir := c.MkDir()
   161  	targetStorage, err := filestorage.NewFileStorageWriter(dir)
   162  	c.Assert(err, gc.IsNil)
   163  	err = imagemetadata.MergeAndWriteMetadata("raring", existingImageMetadata, cloudSpec, targetStorage)
   164  	c.Assert(err, gc.IsNil)
   165  	newImageMetadata := []*imagemetadata.ImageMetadata{
   166  		{
   167  			Id:      "abcd",
   168  			Arch:    "amd64",
   169  			Version: "13.04",
   170  		},
   171  		{
   172  			Id:      "xyz",
   173  			Arch:    "arm",
   174  			Version: "13.04",
   175  		},
   176  	}
   177  	cloudSpec = &simplestreams.CloudSpec{
   178  		Region:   "region2",
   179  		Endpoint: "endpoint2",
   180  	}
   181  	err = imagemetadata.MergeAndWriteMetadata("raring", newImageMetadata, cloudSpec, targetStorage)
   182  	c.Assert(err, gc.IsNil)
   183  	metadata := testing.ParseMetadataFromDir(c, dir)
   184  	c.Assert(metadata, gc.HasLen, 3)
   185  	for _, im := range newImageMetadata {
   186  		im.RegionName = "region2"
   187  		im.Endpoint = "endpoint2"
   188  	}
   189  	existingImageMetadata[0].RegionName = "region"
   190  	existingImageMetadata[0].Endpoint = "endpoint"
   191  	newImageMetadata = append(newImageMetadata, existingImageMetadata[0])
   192  	imagemetadata.Sort(newImageMetadata)
   193  	c.Assert(metadata, gc.DeepEquals, newImageMetadata)
   194  	assertFetch(c, targetStorage, "raring", "amd64", "region", "endpoint", "1234")
   195  	assertFetch(c, targetStorage, "raring", "amd64", "region2", "endpoint2", "abcd")
   196  }