github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/provisioner/imagemetadata_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package provisioner_test 5 6 import ( 7 "github.com/juju/errors" 8 jc "github.com/juju/testing/checkers" 9 gc "gopkg.in/check.v1" 10 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/apiserver/provisioner" 13 "github.com/juju/juju/environs/imagemetadata" 14 imagetesting "github.com/juju/juju/environs/imagemetadata/testing" 15 sstesting "github.com/juju/juju/environs/simplestreams/testing" 16 "github.com/juju/juju/juju/keys" 17 "github.com/juju/juju/state/cloudimagemetadata" 18 ) 19 20 // useTestImageData causes the given content to be served when published metadata is requested. 21 func useTestImageData(c *gc.C, files map[string]string) { 22 if files != nil { 23 sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil) 24 } else { 25 sstesting.SetRoundTripperFiles(nil, nil) 26 } 27 } 28 29 type ImageMetadataSuite struct { 30 provisionerSuite 31 } 32 33 var _ = gc.Suite(&ImageMetadataSuite{}) 34 35 func (s *ImageMetadataSuite) SetUpSuite(c *gc.C) { 36 s.provisionerSuite.SetUpSuite(c) 37 38 // Make sure that there is nothing in data sources. 39 // Each individual tests will decide if it needs metadata there. 40 imagetesting.PatchOfficialDataSources(&s.CleanupSuite, "test:/daily") 41 s.PatchValue(&imagemetadata.SimplestreamsImagesPublicKey, sstesting.SignedMetadataPublicKey) 42 s.PatchValue(&keys.JujuPublicKey, sstesting.SignedMetadataPublicKey) 43 useTestImageData(c, nil) 44 } 45 46 func (s *ImageMetadataSuite) TearDownSuite(c *gc.C) { 47 useTestImageData(c, nil) 48 s.provisionerSuite.TearDownSuite(c) 49 } 50 51 func (s *ImageMetadataSuite) SetUpTest(c *gc.C) { 52 s.provisionerSuite.SetUpTest(c) 53 } 54 55 func (s *ImageMetadataSuite) TestMetadataNone(c *gc.C) { 56 api, err := provisioner.NewProvisionerAPI(s.State, s.resources, s.authorizer) 57 c.Assert(err, jc.ErrorIsNil) 58 59 result, err := api.ProvisioningInfo(s.getTestMachinesTags(c)) 60 c.Assert(err, jc.ErrorIsNil) 61 62 expected := make([][]params.CloudImageMetadata, len(s.machines)) 63 for i, _ := range result.Results { 64 expected[i] = nil 65 } 66 s.assertImageMetadataResults(c, result, expected...) 67 } 68 69 func (s *ImageMetadataSuite) TestMetadataNotInStateButInDataSources(c *gc.C) { 70 // ensure metadata in data sources and not in state 71 useTestImageData(c, testImagesData) 72 73 criteria := cloudimagemetadata.MetadataFilter{Stream: "daily"} 74 found, err := s.State.CloudImageMetadataStorage.FindMetadata(criteria) 75 c.Assert(errors.IsNotFound(err), jc.IsTrue) 76 c.Assert(found, gc.HasLen, 0) 77 78 api, err := provisioner.NewProvisionerAPI(s.State, s.resources, s.authorizer) 79 c.Assert(err, jc.ErrorIsNil) 80 81 result, err := api.ProvisioningInfo(s.getTestMachinesTags(c)) 82 c.Assert(err, jc.ErrorIsNil) 83 84 expected := s.expectedDataSoureImageMetadata() 85 s.assertImageMetadataResults(c, result, expected...) 86 87 // Also make sure that these images metadata has been written to state for re-use 88 saved, err := s.State.CloudImageMetadataStorage.FindMetadata(criteria) 89 c.Assert(err, jc.ErrorIsNil) 90 stateExpected := s.convertCloudImageMetadata(expected[0]) 91 if len(saved["default cloud images"]) == len(stateExpected) { 92 for i, image := range saved["default cloud images"] { 93 stateExpected[i].DateCreated = image.DateCreated 94 } 95 } 96 c.Assert(saved, gc.DeepEquals, map[string][]cloudimagemetadata.Metadata{ 97 "default cloud images": stateExpected, 98 }) 99 } 100 101 func (s *ImageMetadataSuite) TestMetadataFromState(c *gc.C) { 102 api, err := provisioner.NewProvisionerAPI(s.State, s.resources, s.authorizer) 103 c.Assert(err, jc.ErrorIsNil) 104 105 expected := s.expectedDataSoureImageMetadata() 106 107 // Write metadata to state. 108 metadata := s.convertCloudImageMetadata(expected[0]) 109 for _, m := range metadata { 110 err := s.State.CloudImageMetadataStorage.SaveMetadata( 111 []cloudimagemetadata.Metadata{m}, 112 ) 113 c.Assert(err, jc.ErrorIsNil) 114 } 115 116 result, err := api.ProvisioningInfo(s.getTestMachinesTags(c)) 117 c.Assert(err, jc.ErrorIsNil) 118 119 s.assertImageMetadataResults(c, result, expected...) 120 } 121 122 func (s *ImageMetadataSuite) getTestMachinesTags(c *gc.C) params.Entities { 123 124 testMachines := make([]params.Entity, len(s.machines)) 125 126 for i, m := range s.machines { 127 testMachines[i] = params.Entity{Tag: m.Tag().String()} 128 } 129 return params.Entities{Entities: testMachines} 130 } 131 132 func (s *ImageMetadataSuite) convertCloudImageMetadata(all []params.CloudImageMetadata) []cloudimagemetadata.Metadata { 133 expected := make([]cloudimagemetadata.Metadata, len(all)) 134 for i, one := range all { 135 expected[i] = cloudimagemetadata.Metadata{ 136 cloudimagemetadata.MetadataAttributes{ 137 Region: one.Region, 138 Version: one.Version, 139 Series: one.Series, 140 Arch: one.Arch, 141 VirtType: one.VirtType, 142 RootStorageType: one.RootStorageType, 143 Source: one.Source, 144 Stream: one.Stream, 145 }, 146 one.Priority, 147 one.ImageId, 148 0, 149 } 150 } 151 return expected 152 } 153 154 func (s *ImageMetadataSuite) expectedDataSoureImageMetadata() [][]params.CloudImageMetadata { 155 expected := make([][]params.CloudImageMetadata, len(s.machines)) 156 for i, _ := range s.machines { 157 expected[i] = []params.CloudImageMetadata{ 158 {ImageId: "ami-1126745463", 159 Region: "another_dummy_region", 160 Version: "12.10", 161 Series: "quantal", 162 Arch: "amd64", 163 VirtType: "pv", 164 RootStorageType: "ebs", 165 Source: "default cloud images", 166 Stream: "daily", 167 Priority: 10, 168 }, 169 {ImageId: "ami-26745463", 170 Region: "dummy_region", 171 Version: "12.10", 172 Series: "quantal", 173 Arch: "amd64", 174 VirtType: "pv", 175 RootStorageType: "ebs", 176 Stream: "daily", 177 Source: "default cloud images", 178 Priority: 10}, 179 } 180 } 181 return expected 182 } 183 184 func (s *ImageMetadataSuite) assertImageMetadataResults(c *gc.C, obtained params.ProvisioningInfoResults, expected ...[]params.CloudImageMetadata) { 185 c.Assert(obtained.Results, gc.HasLen, len(expected)) 186 for i, one := range obtained.Results { 187 // We are only concerned with images here 188 c.Assert(one.Result.ImageMetadata, gc.DeepEquals, expected[i]) 189 } 190 } 191 192 // TODO (anastasiamac 2015-09-04) This metadata is so verbose. 193 // Need to generate the text by creating a struct and marshalling it. 194 var testImagesData = map[string]string{ 195 "/daily/streams/v1/index.json": ` 196 { 197 "index": { 198 "com.ubuntu.cloud:daily:aws": { 199 "updated": "Wed, 01 May 2013 13:31:26 +0000", 200 "clouds": [ 201 { 202 "region": "dummy_region", 203 "endpoint": "https://anywhere" 204 }, 205 { 206 "region": "another_dummy_region", 207 "endpoint": "" 208 } 209 ], 210 "cloudname": "aws", 211 "datatype": "image-ids", 212 "format": "products:1.0", 213 "products": [ 214 "com.ubuntu.cloud.daily:server:12.10:amd64", 215 "com.ubuntu.cloud.daily:server:14.04:amd64" 216 ], 217 "path": "streams/v1/image_metadata.json" 218 } 219 }, 220 "updated": "Wed, 27 May 2015 13:31:26 +0000", 221 "format": "index:1.0" 222 } 223 `, 224 "/daily/streams/v1/image_metadata.json": ` 225 { 226 "updated": "Wed, 27 May 2015 13:31:26 +0000", 227 "content_id": "com.ubuntu.cloud:daily:aws", 228 "products": { 229 "com.ubuntu.cloud.daily:server:14.04:amd64": { 230 "release": "trusty", 231 "version": "14.04", 232 "arch": "amd64", 233 "versions": { 234 "20140118": { 235 "items": { 236 "nzww1pe": { 237 "root_store": "ebs", 238 "virt": "pv", 239 "crsn": "da1", 240 "id": "ami-36745463" 241 }, 242 "nzww1pe2": { 243 "root_store": "ebs", 244 "virt": "pv", 245 "crsn": "da2", 246 "id": "ami-1136745463" 247 } 248 }, 249 "pubname": "ubuntu-trusty-14.04-amd64-server-20140118", 250 "label": "release" 251 } 252 } 253 }, 254 "com.ubuntu.cloud.daily:server:12.10:amd64": { 255 "release": "quantal", 256 "version": "12.10", 257 "arch": "amd64", 258 "versions": { 259 "20121218": { 260 "items": { 261 "usww1pe": { 262 "root_store": "ebs", 263 "virt": "pv", 264 "crsn": "da1", 265 "id": "ami-26745463" 266 }, 267 "usww1pe2": { 268 "root_store": "ebs", 269 "virt": "pv", 270 "crsn": "da2", 271 "id": "ami-1126745463" 272 } 273 }, 274 "pubname": "ubuntu-quantal-12.10-amd64-server-20121218", 275 "label": "release" 276 } 277 } 278 } 279 }, 280 "_aliases": { 281 "crsn": { 282 "da1": { 283 "region": "dummy_region", 284 "endpoint": "https://anywhere" 285 }, 286 "da2": { 287 "region": "another_dummy_region", 288 "endpoint": "" 289 } 290 } 291 }, 292 "format": "products:1.0" 293 } 294 `, 295 }