github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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 jc "github.com/juju/testing/checkers" 15 gc "launchpad.net/gocheck" 16 17 "github.com/juju/juju/cmd" 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 func (s *ImageMetadataSuite) SetUpTest(c *gc.C) { 38 s.FakeJujuHomeSuite.SetUpTest(c) 39 s.dir = c.MkDir() 40 // Create a fake certificate so azure test environment can be opened. 41 certfile, err := ioutil.TempFile(s.dir, "") 42 c.Assert(err, gc.IsNil) 43 filename := certfile.Name() 44 err = ioutil.WriteFile(filename, []byte("test certificate"), 0644) 45 c.Assert(err, gc.IsNil) 46 envConfig := strings.Replace(metadataTestEnvConfig, "/home/me/azure.pem", filename, -1) 47 testing.WriteEnvironments(c, envConfig) 48 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 49 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 50 } 51 52 var seriesVersions map[string]string = map[string]string{ 53 "precise": "12.04", 54 "raring": "13.04", 55 "trusty": "14.04", 56 } 57 58 type expectedMetadata struct { 59 series string 60 arch string 61 region string 62 endpoint string 63 } 64 65 func (s *ImageMetadataSuite) assertCommandOutput(c *gc.C, expected expectedMetadata, errOut, indexFileName, imageFileName string) { 66 if expected.region == "" { 67 expected.region = "region" 68 } 69 if expected.endpoint == "" { 70 expected.endpoint = "endpoint" 71 } 72 strippedOut := strings.Replace(errOut, "\n", "", -1) 73 c.Check(strippedOut, gc.Matches, `image metadata files have been written to.*`) 74 indexpath := filepath.Join(s.dir, "images", "streams", "v1", indexFileName) 75 data, err := ioutil.ReadFile(indexpath) 76 c.Assert(err, gc.IsNil) 77 content := string(data) 78 var indices interface{} 79 err = json.Unmarshal(data, &indices) 80 c.Assert(err, gc.IsNil) 81 c.Assert(indices.(map[string]interface{})["format"], gc.Equals, "index:1.0") 82 prodId := fmt.Sprintf("com.ubuntu.cloud:server:%s:%s", seriesVersions[expected.series], expected.arch) 83 c.Assert(content, jc.Contains, prodId) 84 c.Assert(content, jc.Contains, fmt.Sprintf(`"region": %q`, expected.region)) 85 c.Assert(content, jc.Contains, fmt.Sprintf(`"endpoint": %q`, expected.endpoint)) 86 c.Assert(content, jc.Contains, fmt.Sprintf(`"path": "streams/v1/%s"`, imageFileName)) 87 88 imagepath := filepath.Join(s.dir, "images", "streams", "v1", imageFileName) 89 data, err = ioutil.ReadFile(imagepath) 90 c.Assert(err, gc.IsNil) 91 content = string(data) 92 var images interface{} 93 err = json.Unmarshal(data, &images) 94 c.Assert(err, gc.IsNil) 95 c.Assert(images.(map[string]interface{})["format"], gc.Equals, "products:1.0") 96 c.Assert(content, jc.Contains, prodId) 97 c.Assert(content, jc.Contains, `"id": "1234"`) 98 } 99 100 const ( 101 defaultIndexFileName = "index.json" 102 defaultImageFileName = "com.ubuntu.cloud:released:imagemetadata.json" 103 ) 104 105 func (s *ImageMetadataSuite) TestImageMetadataFilesNoEnv(c *gc.C) { 106 ctx := testing.Context(c) 107 code := cmd.Main( 108 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 109 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint", "-s", "raring"}) 110 c.Assert(code, gc.Equals, 0) 111 out := testing.Stdout(ctx) 112 expected := expectedMetadata{ 113 series: "raring", 114 arch: "arch", 115 } 116 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 117 } 118 119 func (s *ImageMetadataSuite) TestImageMetadataFilesDefaultArch(c *gc.C) { 120 ctx := testing.Context(c) 121 code := cmd.Main( 122 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 123 "-d", s.dir, "-i", "1234", "-r", "region", "-u", "endpoint", "-s", "raring"}) 124 c.Assert(code, gc.Equals, 0) 125 out := testing.Stdout(ctx) 126 expected := expectedMetadata{ 127 series: "raring", 128 arch: "amd64", 129 } 130 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 131 } 132 133 func (s *ImageMetadataSuite) TestImageMetadataFilesLatestLts(c *gc.C) { 134 envConfig := strings.Replace(metadataTestEnvConfig, "default-series: precise", "", -1) 135 testing.WriteEnvironments(c, envConfig) 136 ctx := testing.Context(c) 137 code := cmd.Main( 138 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 139 "-d", s.dir, "-i", "1234", "-r", "region", "-a", "arch", "-u", "endpoint"}) 140 c.Assert(code, gc.Equals, 0) 141 out := testing.Stdout(ctx) 142 expected := expectedMetadata{ 143 series: config.LatestLtsSeries(), 144 arch: "arch", 145 } 146 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 147 } 148 149 func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnv(c *gc.C) { 150 ctx := testing.Context(c) 151 code := cmd.Main( 152 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{"-d", s.dir, "-e", "ec2", "-i", "1234"}) 153 c.Assert(code, gc.Equals, 0) 154 out := testing.Stdout(ctx) 155 expected := expectedMetadata{ 156 series: "precise", 157 arch: "amd64", 158 region: "us-east-1", 159 endpoint: "https://ec2.us-east-1.amazonaws.com", 160 } 161 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 162 } 163 164 func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithRegionOverride(c *gc.C) { 165 ctx := testing.Context(c) 166 code := cmd.Main( 167 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 168 "-d", s.dir, "-e", "ec2", "-r", "us-west-1", "-u", "https://ec2.us-west-1.amazonaws.com", "-i", "1234"}) 169 c.Assert(code, gc.Equals, 0) 170 out := testing.Stdout(ctx) 171 expected := expectedMetadata{ 172 series: "precise", 173 arch: "amd64", 174 region: "us-west-1", 175 endpoint: "https://ec2.us-west-1.amazonaws.com", 176 } 177 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 178 } 179 180 func (s *ImageMetadataSuite) TestImageMetadataFilesUsingEnvWithNoHasRegion(c *gc.C) { 181 ctx := testing.Context(c) 182 code := cmd.Main( 183 envcmd.Wrap(&ImageMetadataCommand{}), ctx, []string{ 184 "-d", s.dir, "-e", "azure", "-r", "region", "-u", "endpoint", "-i", "1234"}) 185 c.Assert(code, gc.Equals, 0) 186 out := testing.Stdout(ctx) 187 expected := expectedMetadata{ 188 series: "raring", 189 arch: "amd64", 190 region: "region", 191 endpoint: "endpoint", 192 } 193 s.assertCommandOutput(c, expected, out, defaultIndexFileName, defaultImageFileName) 194 } 195 196 type errTestParams struct { 197 args []string 198 } 199 200 var errTests = []errTestParams{ 201 { 202 // Missing image id 203 args: []string{"-r", "region", "-a", "arch", "-u", "endpoint", "-s", "precise"}, 204 }, 205 { 206 // Missing region 207 args: []string{"-i", "1234", "-a", "arch", "-u", "endpoint", "-s", "precise"}, 208 }, 209 { 210 // Missing endpoint 211 args: []string{"-i", "1234", "-u", "endpoint", "-a", "arch", "-s", "precise"}, 212 }, 213 { 214 // Missing endpoint/region for environment with no HasRegion interface 215 args: []string{"-i", "1234", "-e", "azure"}, 216 }, 217 } 218 219 func (s *ImageMetadataSuite) TestImageMetadataBadArgs(c *gc.C) { 220 testing.MakeSampleJujuHome(c) 221 s.AddCleanup(func(*gc.C) { 222 dummy.Reset() 223 }) 224 for i, t := range errTests { 225 c.Logf("test: %d", i) 226 ctx := testing.Context(c) 227 code := cmd.Main(envcmd.Wrap(&ImageMetadataCommand{}), ctx, t.args) 228 c.Check(code, gc.Equals, 1) 229 } 230 }