launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/cmd/plugins/juju-metadata/validatetoolsmetadata_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package main 5 6 import ( 7 "bytes" 8 "strings" 9 10 "launchpad.net/goamz/aws" 11 gc "launchpad.net/gocheck" 12 13 "launchpad.net/juju-core/cmd" 14 "launchpad.net/juju-core/environs/simplestreams" 15 "launchpad.net/juju-core/environs/tools" 16 "launchpad.net/juju-core/juju/osenv" 17 coretesting "launchpad.net/juju-core/testing" 18 "launchpad.net/juju-core/testing/testbase" 19 "launchpad.net/juju-core/version" 20 ) 21 22 type ValidateToolsMetadataSuite struct { 23 testbase.LoggingSuite 24 home *coretesting.FakeHome 25 } 26 27 var _ = gc.Suite(&ValidateToolsMetadataSuite{}) 28 29 func runValidateToolsMetadata(c *gc.C, args ...string) error { 30 _, err := coretesting.RunCommand(c, &ValidateToolsMetadataCommand{}, args) 31 return err 32 } 33 34 var validateInitToolsErrorTests = []struct { 35 args []string 36 err string 37 }{ 38 { 39 args: []string{"-p", "ec2", "-s", "series", "-d", "dir"}, 40 err: `region required if provider type is specified`, 41 }, { 42 args: []string{"-p", "ec2", "-s", "series", "-r", "region"}, 43 err: `metadata directory required if provider type is specified`, 44 }, { 45 args: []string{"-s", "series", "-r", "region", "-m", "x"}, 46 err: `invalid major version number x: .*`, 47 }, { 48 args: []string{"-s", "series", "-r", "region", "-m", "2.x"}, 49 err: `invalid minor version number x: .*`, 50 }, { 51 args: []string{"-s", "series", "-r", "region", "-m", "2.2.1"}, 52 err: `invalid major.minor version number 2.2.1`, 53 }, 54 } 55 56 func (s *ValidateToolsMetadataSuite) TestInitErrors(c *gc.C) { 57 for i, t := range validateInitToolsErrorTests { 58 c.Logf("test %d", i) 59 err := coretesting.InitCommand(&ValidateToolsMetadataCommand{}, t.args) 60 c.Check(err, gc.ErrorMatches, t.err) 61 } 62 } 63 64 func (s *ValidateToolsMetadataSuite) TestInvalidProviderError(c *gc.C) { 65 err := runValidateToolsMetadata(c, "-p", "foo", "-s", "series", "-r", "region", "-d", "dir") 66 c.Check(err, gc.ErrorMatches, `no registered provider for "foo"`) 67 } 68 69 func (s *ValidateToolsMetadataSuite) TestUnsupportedProviderError(c *gc.C) { 70 err := runValidateToolsMetadata(c, "-p", "local", "-s", "series", "-r", "region", "-d", "dir") 71 c.Check(err, gc.ErrorMatches, `local provider does not support tools metadata validation`) 72 } 73 74 func (s *ValidateToolsMetadataSuite) makeLocalMetadata(c *gc.C, version, region, series, endpoint string) error { 75 tm := tools.ToolsMetadata{ 76 Version: version, 77 Arch: "amd64", 78 Release: series, 79 } 80 cloudSpec := simplestreams.CloudSpec{ 81 Region: region, 82 Endpoint: endpoint, 83 } 84 _, err := tools.MakeBoilerplate(&tm, &cloudSpec, false) 85 if err != nil { 86 return err 87 } 88 return nil 89 } 90 91 func (s *ValidateToolsMetadataSuite) SetUpTest(c *gc.C) { 92 s.LoggingSuite.SetUpTest(c) 93 s.home = coretesting.MakeFakeHome(c, metadataTestEnvConfig) 94 restore := testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 95 s.AddCleanup(func(*gc.C) { restore() }) 96 restore = testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 97 s.AddCleanup(func(*gc.C) { restore() }) 98 } 99 100 func (s *ValidateToolsMetadataSuite) TearDownTest(c *gc.C) { 101 s.home.Restore() 102 s.LoggingSuite.TearDownTest(c) 103 } 104 105 func (s *ValidateToolsMetadataSuite) setupEc2LocalMetadata(c *gc.C, region string) { 106 ec2Region, ok := aws.Regions[region] 107 if !ok { 108 c.Fatalf("unknown ec2 region %q", region) 109 } 110 endpoint := ec2Region.EC2Endpoint 111 s.makeLocalMetadata(c, "1.11.4", region, "precise", endpoint) 112 } 113 114 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 115 s.setupEc2LocalMetadata(c, "us-east-1") 116 ctx := coretesting.Context(c) 117 metadataDir := osenv.JujuHomePath("") 118 code := cmd.Main( 119 &ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", metadataDir}, 120 ) 121 c.Assert(code, gc.Equals, 0) 122 errOut := ctx.Stdout.(*bytes.Buffer).String() 123 strippedOut := strings.Replace(errOut, "\n", "", -1) 124 c.Check(strippedOut, gc.Matches, `matching tools versions:.*`) 125 } 126 127 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 128 testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 129 testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 130 s.setupEc2LocalMetadata(c, "us-east-1") 131 ctx := coretesting.Context(c) 132 code := cmd.Main( 133 &ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4"}, 134 ) 135 c.Assert(code, gc.Equals, 1) 136 errOut := ctx.Stderr.(*bytes.Buffer).String() 137 strippedOut := strings.Replace(errOut, "\n", "", -1) 138 c.Check(strippedOut, gc.Matches, `error: environment has no access-key or secret-key`) 139 } 140 141 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 142 s.setupEc2LocalMetadata(c, "us-west-1") 143 ctx := coretesting.Context(c) 144 metadataDir := osenv.JujuHomePath("") 145 code := cmd.Main( 146 &ValidateToolsMetadataCommand{}, ctx, []string{ 147 "-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4", 148 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", metadataDir}, 149 ) 150 c.Assert(code, gc.Equals, 0) 151 errOut := ctx.Stdout.(*bytes.Buffer).String() 152 strippedOut := strings.Replace(errOut, "\n", "", -1) 153 c.Check(strippedOut, gc.Matches, `matching tools versions:.*`) 154 } 155 156 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) { 157 s.setupEc2LocalMetadata(c, "us-east-1") 158 ctx := coretesting.Context(c) 159 metadataDir := osenv.JujuHomePath("") 160 code := cmd.Main( 161 &ValidateToolsMetadataCommand{}, ctx, []string{ 162 "-p", "ec2", "-s", "raring", "-r", "us-west-1", 163 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", metadataDir}, 164 ) 165 c.Assert(code, gc.Equals, 1) 166 code = cmd.Main( 167 &ValidateToolsMetadataCommand{}, ctx, []string{ 168 "-p", "ec2", "-s", "precise", "-r", "region", 169 "-u", "https://ec2.region.amazonaws.com", "-d", metadataDir}, 170 ) 171 c.Assert(code, gc.Equals, 1) 172 } 173 174 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 175 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 176 ctx := coretesting.Context(c) 177 metadataDir := osenv.JujuHomePath("") 178 code := cmd.Main( 179 &ValidateToolsMetadataCommand{}, ctx, []string{ 180 "-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4", 181 "-u", "some-auth-url", "-d", metadataDir}, 182 ) 183 c.Assert(code, gc.Equals, 0) 184 errOut := ctx.Stdout.(*bytes.Buffer).String() 185 strippedOut := strings.Replace(errOut, "\n", "", -1) 186 c.Check(strippedOut, gc.Matches, `matching tools versions:.*`) 187 } 188 189 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 190 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 191 ctx := coretesting.Context(c) 192 metadataDir := osenv.JujuHomePath("") 193 code := cmd.Main( 194 &ValidateToolsMetadataCommand{}, ctx, []string{ 195 "-p", "openstack", "-s", "precise", "-r", "region-2", 196 "-u", "some-auth-url", "-d", metadataDir}, 197 ) 198 c.Assert(code, gc.Equals, 1) 199 code = cmd.Main( 200 &ValidateToolsMetadataCommand{}, ctx, []string{ 201 "-p", "openstack", "-s", "raring", "-r", "region-3", 202 "-u", "some-auth-url", "-d", metadataDir}, 203 ) 204 c.Assert(code, gc.Equals, 1) 205 } 206 207 func (s *ValidateToolsMetadataSuite) TestDefaultVersion(c *gc.C) { 208 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url") 209 ctx := coretesting.Context(c) 210 metadataDir := osenv.JujuHomePath("") 211 code := cmd.Main( 212 &ValidateToolsMetadataCommand{}, ctx, []string{ 213 "-p", "openstack", "-s", "raring", "-r", "region-2", 214 "-u", "some-auth-url", "-d", metadataDir}, 215 ) 216 c.Assert(code, gc.Equals, 0) 217 errOut := ctx.Stdout.(*bytes.Buffer).String() 218 strippedOut := strings.Replace(errOut, "\n", "", -1) 219 c.Check(strippedOut, gc.Matches, `matching tools versions:.*`) 220 } 221 222 func (s *ValidateToolsMetadataSuite) TestMajorVersionMatch(c *gc.C) { 223 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 224 ctx := coretesting.Context(c) 225 metadataDir := osenv.JujuHomePath("") 226 code := cmd.Main( 227 &ValidateToolsMetadataCommand{}, ctx, []string{ 228 "-p", "openstack", "-s", "raring", "-r", "region-2", 229 "-u", "some-auth-url", "-d", metadataDir, "-m", "1"}, 230 ) 231 c.Assert(code, gc.Equals, 0) 232 errOut := ctx.Stdout.(*bytes.Buffer).String() 233 strippedOut := strings.Replace(errOut, "\n", "", -1) 234 c.Check(strippedOut, gc.Matches, `matching tools versions:.*`) 235 } 236 237 func (s *ValidateToolsMetadataSuite) TestMajorMinorVersionMatch(c *gc.C) { 238 s.makeLocalMetadata(c, "1.12.1", "region-2", "raring", "some-auth-url") 239 ctx := coretesting.Context(c) 240 metadataDir := osenv.JujuHomePath("") 241 code := cmd.Main( 242 &ValidateToolsMetadataCommand{}, ctx, []string{ 243 "-p", "openstack", "-s", "raring", "-r", "region-2", 244 "-u", "some-auth-url", "-d", metadataDir, "-m", "1.12"}, 245 ) 246 c.Assert(code, gc.Equals, 0) 247 errOut := ctx.Stdout.(*bytes.Buffer).String() 248 strippedOut := strings.Replace(errOut, "\n", "", -1) 249 c.Check(strippedOut, gc.Matches, `matching tools versions:.*`) 250 } 251 252 func (s *ValidateToolsMetadataSuite) TestJustDirectory(c *gc.C) { 253 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url") 254 ctx := coretesting.Context(c) 255 metadataDir := osenv.JujuHomePath("") 256 code := cmd.Main( 257 &ValidateToolsMetadataCommand{}, ctx, []string{"-s", "raring", "-d", metadataDir}, 258 ) 259 c.Assert(code, gc.Equals, 0) 260 errOut := ctx.Stdout.(*bytes.Buffer).String() 261 strippedOut := strings.Replace(errOut, "\n", "", -1) 262 c.Check(strippedOut, gc.Matches, `matching tools versions:.*`) 263 }