github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/cmd/plugins/juju-metadata/imagemetadata_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "io/ioutil" 10 "os" 11 "path/filepath" 12 "strings" 13 14 "github.com/juju/cmd" 15 jc "github.com/juju/testing/checkers" 16 gc "gopkg.in/check.v1" 17 18 "github.com/juju/juju/cmd/envcmd" 19 "github.com/juju/juju/environs/config" 20 "github.com/juju/juju/provider/dummy" 21 "github.com/juju/juju/testing" 22 ) 23 24 type ImageMetadataSuite struct { 25 testing.FakeJujuHomeSuite 26 environ []string 27 dir string 28 } 29 30 var _ = gc.Suite(&ImageMetadataSuite{}) 31 32 func (s *ImageMetadataSuite) SetUpSuite(c *gc.C) { 33 s.FakeJujuHomeSuite.SetUpSuite(c) 34 s.environ = os.Environ() 35 } 36 37 var testCert = ` 38 -----BEGIN PRIVATE KEY----- 39 MIIBCgIBADANBgkqhkiG9w0BAQEFAASB9TCB8gIBAAIxAKQGQxP1i0VfCWn4KmMP 40 taUFn8sMBKjP/9vHnUYdZRvvmoJCA1C6arBUDp8s2DNX+QIDAQABAjBLRqhwN4dU 41 LfqHDKJ/Vg1aD8u3Buv4gYRBxdFR5PveyqHSt5eJ4g/x/4ndsvr2OqUCGQDNfNlD 42 zxHCiEAwZZAPaAkn8jDkFupTljcCGQDMWCujiVZ1NNuBD/N32Yt8P9JDiNzZa08C 43 GBW7VXLxbExpgnhb1V97vjQmTfthXQjYAwIYSTEjoFXm4+Bk5xuBh2IidgSeGZaC 44 FFY9AhkAsteo31cyQw2xJ80SWrmsIw+ps7Cvt5W9 45 -----END PRIVATE KEY----- 46 -----BEGIN CERTIFICATE----- 47 MIIBDzCByqADAgECAgkAgIBb3+lSwzEwDQYJKoZIhvcNAQEFBQAwFTETMBEGA1UE 48 AxQKQEhvc3ROYW1lQDAeFw0xMzA3MTkxNjA1NTRaFw0yMzA3MTcxNjA1NTRaMBUx 49 EzARBgNVBAMUCkBIb3N0TmFtZUAwTDANBgkqhkiG9w0BAQEFAAM7ADA4AjEApAZD 50 E/WLRV8JafgqYw+1pQWfywwEqM//28edRh1lG++agkIDULpqsFQOnyzYM1f5AgMB 51 AAGjDTALMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADMQABKfn08tKfzzqMMD2w 52 PI2fs3bw5bRH8tmGjrsJeEdp9crCBS8I3hKcxCkTTRTowdY= 53 -----END CERTIFICATE----- 54 ` 55 56 func (s *ImageMetadataSuite) SetUpTest(c *gc.C) { 57 s.FakeJujuHomeSuite.SetUpTest(c) 58 s.dir = c.MkDir() 59 // Create a fake certificate so azure test environment can be opened. 60 certfile, err := ioutil.TempFile(s.dir, "") 61 c.Assert(err, jc.ErrorIsNil) 62 filename := certfile.Name() 63 err = ioutil.WriteFile(filename, []byte(testCert), 0644) 64 c.Assert(err, jc.ErrorIsNil) 65 envConfig := strings.Replace(metadataTestEnvConfig, "/home/me/azure.pem", filename, -1) 66 testing.WriteEnvironments(c, envConfig) 67 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 68 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 69 } 70 71 var seriesVersions map[string]string = map[string]string{ 72 "precise": "12.04", 73 "raring": "13.04", 74 "trusty": "14.04", 75 } 76 77 type expectedMetadata struct { 78 series string 79 arch string 80 region string 81 endpoint string 82 } 83 84 func (s *ImageMetadataSuite) assertCommandOutput(c *gc.C, expected expectedMetadata, errOut, indexFileName, imageFileName string) { 85 if expected.region == "" { 86 expected.region = "region" 87 } 88 if expected.endpoint == "" { 89 expected.endpoint = "endpoint" 90 } 91 strippedOut := strings.Replace(errOut, "\n", "", -1) 92 c.Check(strippedOut, gc.Matches, `image metadata files have been written to.*`) 93 indexpath := filepath.Join(s.dir, "images", "streams", "v1", indexFileName) 94 data, err := ioutil.ReadFile(indexpath) 95 c.Assert(err, jc.ErrorIsNil) 96 content := string(data) 97 var indices interface{} 98 err = json.Unmarshal(data, &indices) 99 c.Assert(err, jc.ErrorIsNil) 100 c.Assert(indices.(map[string]interface{})["format"], gc.Equals, "index:1.0") 101 prodId := fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", seriesVersions[expected.series], expected.arch) 102 c.Assert(content, jc.Contains, prodId) 103 c.Assert(content, jc.Contains, fmt.Sprintf(`"region": %q`, expected.region)) 104 c.Assert(content, jc.Contains, fmt.Sprintf(`"endpoint": %q`, expected.endpoint)) 105 c.Assert(content, jc.Contains, fmt.Sprintf(`"path": "streams/v1/%s"`, imageFileName)) 106 107 imagepath := filepath.Join(s.dir, "images", "streams", "v1", imageFileName) 108 data, err = ioutil.ReadFile(imagepath) 109 c.Assert(err, jc.ErrorIsNil) 110 content = string(data) 111 var images interface{} 112 err = json.Unmarshal(data, &images) 113 c.Assert(err, jc.ErrorIsNil) 114 c.Assert(images.(map[string]interface{})["format"], gc.Equals, "products:1.0") 115 c.Assert(content, jc.Contains, prodId) 116 c.Assert(content, jc.Contains, `"id": "1234"`) 117 } 118 119 const ( 120 defaultIndexFileName = "index.json" 121 defaultImageFileName = "com.ubuntu.cloud-released-imagemetadata.json" 122 ) 123 124 func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) { 125 ctx := testing.Context(c) 126 code := cmd.Main( 127 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 128 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"}) 129 c.Assert(code, gc.Equals, 0) 130 out := testing.Stdout(ctx) 131 expected := expectedMetadata{ 132 series: "raring", 133 arch: "arch", 134 } 135 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 136 } 137 138 func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) { 139 ctx := testing.Context(c) 140 code := cmd.Main( 141 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 142 "-d", s.dir, "-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"}) 143 c.Assert(code, gc.Equals, 0) 144 out := testing.Stdout(ctx) 145 expected := expectedMetadata{ 146 series: "raring", 147 arch: "amd64", 148 } 149 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 150 } 151 152 func (s *ImageMetadataSuite) TestImageMetadataFilesLatestLts(c *gc.C) { 153 envConfig := strings.Replace(metadataTestEnvConfig, "default-series: precise", "", -1) 154 testing.WriteEnvironments(c, envConfig) 155 ctx := testing.Context(c) 156 code := cmd.Main( 157 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 158 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"}) 159 c.Assert(code, gc.Equals, 0) 160 out := testing.Stdout(ctx) 161 expected := expectedMetadata{ 162 series: config.LatestLtsSeries(), 163 arch: "arch", 164 } 165 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 166 } 167 168 func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnv(c *gc.C) { 169 ctx := testing.Context(c) 170 code := cmd.Main( 171 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{"-d", s.dir, "-e", "ec2", "-i", "1234"}) 172 c.Assert(code, gc.Equals, 0) 173 out := testing.Stdout(ctx) 174 expected := expectedMetadata{ 175 series: "precise", 176 arch: "amd64", 177 region: "us-east-1", 178 endpoint: "https://ec2.us-east-1.amazonaws.com", 179 } 180 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 181 } 182 183 func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithRegionOverride(c *gc.C) { 184 ctx := testing.Context(c) 185 code := cmd.Main( 186 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 187 "-d", s.dir, "-e", "ec2", "-r", "us-west-1", "-u", "https://ec2.us-west-1.amazonaws.com", "-i", "1234"}) 188 c.Assert(code, gc.Equals, 0) 189 out := testing.Stdout(ctx) 190 expected := expectedMetadata{ 191 series: "precise", 192 arch: "amd64", 193 region: "us-west-1", 194 endpoint: "https://ec2.us-west-1.amazonaws.com", 195 } 196 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 197 } 198 199 func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithNoHasRegion(c *gc.C) { 200 ctx := testing.Context(c) 201 code := cmd.Main( 202 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 203 "-d", s.dir, "-e", "azure", "-r", "region", "-u", "endpoint", "-i", "1234"}) 204 c.Assert(code, gc.Equals, 0) 205 out := testing.Stdout(ctx) 206 expected := expectedMetadata{ 207 series: "raring", 208 arch: "amd64", 209 region: "region", 210 endpoint: "endpoint", 211 } 212 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 213 } 214 215 type errTestParams struct { 216 args []string 217 } 218 219 var errTests = []errTestParams{ 220 { 221 // Missing image id 222 args: []string{"-r", "region", "-a", "arch", "-u", "endpoint", "-s", "precise"}, 223 }, 224 { 225 // Missing region 226 args: []string{"-i", "1234", "-a", "arch", "-u", "endpoint", "-s", "precise"}, 227 }, 228 { 229 // Missing endpoint 230 args: []string{"-i", "1234", "-u", "endpoint", "-a", "arch", "-s", "precise"}, 231 }, 232 { 233 // Missing endpoint/region for environment with no HasRegion interface 234 args: []string{"-i", "1234", "-e", "azure"}, 235 }, 236 } 237 238 func (s *ImageMetadataSuite) TestImageMetadataBadArgs(c *gc.C) { 239 testing.MakeSampleJujuHome(c) 240 s.AddCleanup(func(*gc.C) { 241 dummy.Reset() 242 }) 243 for i, t := range errTests { 244 c.Logf("test: %d", i) 245 ctx := testing.Context(c) 246 code := cmd.Main(envcmd.Wrap(&ImageMetadataCommand{}), ctx, t.args) 247 c.Check(code, gc.Equals, 1) 248 } 249 }