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 }