github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/apiserver/imagemetadata/updatefrompublished_test.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package imagemetadata_test 5 6 import ( 7 jc "github.com/juju/testing/checkers" 8 gc "gopkg.in/check.v1" 9 10 "github.com/juju/juju/cmd/envcmd" 11 "github.com/juju/juju/environs" 12 "github.com/juju/juju/environs/config" 13 "github.com/juju/juju/environs/configstore" 14 "github.com/juju/juju/environs/imagemetadata" 15 "github.com/juju/juju/environs/jujutest" 16 "github.com/juju/juju/provider/dummy" 17 "github.com/juju/juju/state/cloudimagemetadata" 18 "github.com/juju/juju/testing" 19 ) 20 21 var ( 22 testRoundTripper = &jujutest.ProxyRoundTripper{} 23 ) 24 25 func init() { 26 // Prepare mock http transport for overriding metadata and images output in tests. 27 testRoundTripper.RegisterForScheme("test") 28 } 29 30 // useTestImageData causes the given content to be served when published metadata is requested. 31 func useTestImageData(files map[string]string) { 32 if files != nil { 33 testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil) 34 imagemetadata.DefaultBaseURL = "test:" 35 } else { 36 testRoundTripper.Sub = nil 37 imagemetadata.DefaultBaseURL = "" 38 } 39 } 40 41 // TODO (anastasiamac 2015-09-04) This metadata is so verbose. 42 // Need to generate the text by creating a struct and marshalling it. 43 var testImagesData = map[string]string{ 44 "/streams/v1/index.json": ` 45 { 46 "index": { 47 "com.ubuntu.cloud:released:precise": { 48 "updated": "Wed, 01 May 2013 13:31:26 +0000", 49 "clouds": [ 50 { 51 "region": "us-east-1", 52 "endpoint": "https://ec2.us-east-1.amazonaws.com" 53 } 54 ], 55 "cloudname": "aws", 56 "datatype": "image-ids", 57 "format": "products:1.0", 58 "products": [ 59 "com.ubuntu.cloud:server:12.04:amd64", 60 "com.ubuntu.cloud:server:14.04:amd64" 61 ], 62 "path": "streams/v1/image_metadata.json" 63 } 64 }, 65 "updated": "Wed, 01 May 2013 13:31:26 +0000", 66 "format": "index:1.0" 67 } 68 `, 69 "/streams/v1/image_metadata.json": ` 70 { 71 "updated": "Wed, 01 May 2013 13:31:26 +0000", 72 "content_id": "com.ubuntu.cloud:released:aws", 73 "region": "nz-east-1", 74 "endpoint": "https://anywhere", 75 "products": { 76 "com.ubuntu.cloud:server:14.04:amd64": { 77 "release": "trusty", 78 "version": "14.04", 79 "arch": "amd64", 80 "versions": { 81 "20140118": { 82 "items": { 83 "nzww1pe": { 84 "root_store": "ebs", 85 "virt": "pv", 86 "id": "ami-36745463" 87 } 88 }, 89 "pubname": "ubuntu-trusty-14.04-amd64-server-20140118", 90 "label": "release" 91 } 92 } 93 }, 94 "com.ubuntu.cloud:server:12.04:amd64": { 95 "release": "precise", 96 "version": "12.04", 97 "arch": "amd64", 98 "region": "au-east-1", 99 "endpoint": "https://somewhere", 100 "versions": { 101 "20121218": { 102 "region": "au-east-2", 103 "endpoint": "https://somewhere-else", 104 "items": { 105 "usww1pe": { 106 "root_store": "ebs", 107 "virt": "pv", 108 "id": "ami-26745463" 109 } 110 }, 111 "pubname": "ubuntu-precise-12.04-amd64-server-20121218", 112 "label": "release" 113 } 114 } 115 } 116 }, 117 "_aliases": { 118 "crsn": { 119 "uswest3": { 120 "region": "us-west-3", 121 "endpoint": "https://ec2.us-west-3.amazonaws.com" 122 } 123 } 124 }, 125 "format": "products:1.0" 126 } 127 `, 128 } 129 130 var _ = gc.Suite(&imageMetadataUpdateSuite{}) 131 132 type imageMetadataUpdateSuite struct { 133 baseImageMetadataSuite 134 } 135 136 func (s *imageMetadataUpdateSuite) SetUpSuite(c *gc.C) { 137 s.BaseSuite.SetUpSuite(c) 138 useTestImageData(testImagesData) 139 } 140 141 func (s *imageMetadataUpdateSuite) TearDownSuite(c *gc.C) { 142 useTestImageData(nil) 143 s.BaseSuite.TearDownSuite(c) 144 } 145 146 func (s *imageMetadataUpdateSuite) SetUpTest(c *gc.C) { 147 s.baseImageMetadataSuite.SetUpTest(c) 148 } 149 150 func (s *imageMetadataUpdateSuite) TestUpdateFromPublishedImages(c *gc.C) { 151 saved := []cloudimagemetadata.Metadata{} 152 expected := []cloudimagemetadata.Metadata{ 153 cloudimagemetadata.Metadata{ 154 cloudimagemetadata.MetadataAttributes{ 155 RootStorageType: "ebs", 156 VirtType: "pv", 157 Arch: "amd64", 158 Series: "trusty", 159 Region: "nz-east-1", 160 Source: "public", 161 Stream: "released"}, 162 "ami-36745463", 163 }, 164 cloudimagemetadata.Metadata{ 165 cloudimagemetadata.MetadataAttributes{ 166 RootStorageType: "ebs", 167 VirtType: "pv", 168 Arch: "amd64", 169 Series: "precise", 170 Region: "au-east-2", 171 Source: "public", 172 Stream: "released"}, 173 "ami-26745463", 174 }, 175 } 176 177 // testingEnvConfig prepares an environment configuration using 178 // the dummy provider. 179 s.state.environConfig = func() (*config.Config, error) { 180 s.calls = append(s.calls, environConfig) 181 cfg, err := config.New(config.NoDefaults, dummy.SampleConfig()) 182 c.Assert(err, jc.ErrorIsNil) 183 env, err := environs.Prepare(cfg, envcmd.BootstrapContext(testing.Context(c)), configstore.NewMem()) 184 c.Assert(err, jc.ErrorIsNil) 185 return env.Config(), err 186 } 187 188 s.state.saveMetadata = func(m cloudimagemetadata.Metadata) error { 189 s.calls = append(s.calls, saveMetadata) 190 saved = append(saved, m) 191 return nil 192 } 193 194 err := s.api.UpdateFromPublishedImages() 195 c.Assert(err, jc.ErrorIsNil) 196 s.assertCalls(c, []string{environConfig, saveMetadata, saveMetadata}) 197 198 c.Assert(saved, jc.SameContents, expected) 199 }