github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/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 "github.com/juju/cmd" 11 jc "github.com/juju/testing/checkers" 12 "gopkg.in/amz.v3/aws" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/cmd/envcmd" 16 "github.com/juju/juju/environs/filestorage" 17 "github.com/juju/juju/environs/tools" 18 coretesting "github.com/juju/juju/testing" 19 "github.com/juju/juju/version" 20 ) 21 22 type ValidateToolsMetadataSuite struct { 23 coretesting.FakeJujuHomeSuite 24 metadataDir string 25 } 26 27 var _ = gc.Suite(&ValidateToolsMetadataSuite{}) 28 29 func runValidateToolsMetadata(c *gc.C, args ...string) error { 30 _, err := coretesting.RunCommand(c, envcmd.Wrap(&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(envcmd.Wrap(&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, stream, version, region, series, endpoint string) error { 75 tm := []*tools.ToolsMetadata{{ 76 Version: version, 77 Arch: "amd64", 78 Release: series, 79 }} 80 targetStorage, err := filestorage.NewFileStorageWriter(s.metadataDir) 81 c.Assert(err, jc.ErrorIsNil) 82 streamMetadata := map[string][]*tools.ToolsMetadata{ 83 stream: tm, 84 } 85 err = tools.WriteMetadata(targetStorage, streamMetadata, []string{stream}, false) 86 if err != nil { 87 return err 88 } 89 return nil 90 } 91 92 func (s *ValidateToolsMetadataSuite) SetUpTest(c *gc.C) { 93 s.FakeJujuHomeSuite.SetUpTest(c) 94 coretesting.WriteEnvironments(c, metadataTestEnvConfig) 95 s.metadataDir = c.MkDir() 96 97 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 98 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 99 // All of the following are recognized as fallbacks by goamz. 100 s.PatchEnvironment("AWS_ACCESS_KEY", "") 101 s.PatchEnvironment("AWS_SECRET_KEY", "") 102 s.PatchEnvironment("EC2_ACCESS_KEY", "") 103 s.PatchEnvironment("EC2_SECRET_KEY", "") 104 } 105 106 func (s *ValidateToolsMetadataSuite) setupEc2LocalMetadata(c *gc.C, region string) { 107 ec2Region, ok := aws.Regions[region] 108 if !ok { 109 c.Fatalf("unknown ec2 region %q", region) 110 } 111 endpoint := ec2Region.EC2Endpoint 112 s.makeLocalMetadata(c, "released", "1.11.4", region, "precise", endpoint) 113 } 114 115 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 116 s.setupEc2LocalMetadata(c, "us-east-1") 117 ctx := coretesting.Context(c) 118 code := cmd.Main( 119 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.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:.*Resolve Metadata.*`) 125 } 126 127 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 128 // We already unset the other fallbacks recognized by goamz in 129 // SetUpTest(). 130 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 131 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 132 s.setupEc2LocalMetadata(c, "us-east-1") 133 ctx := coretesting.Context(c) 134 code := cmd.Main( 135 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4"}, 136 ) 137 c.Assert(code, gc.Equals, 1) 138 errOut := ctx.Stderr.(*bytes.Buffer).String() 139 strippedOut := strings.Replace(errOut, "\n", "", -1) 140 c.Check(strippedOut, gc.Matches, `error: .*environment has no access-key or secret-key`) 141 } 142 143 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 144 s.setupEc2LocalMetadata(c, "us-west-1") 145 ctx := coretesting.Context(c) 146 code := cmd.Main( 147 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 148 "-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4", 149 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 150 ) 151 c.Assert(code, gc.Equals, 0) 152 errOut := ctx.Stdout.(*bytes.Buffer).String() 153 strippedOut := strings.Replace(errOut, "\n", "", -1) 154 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 155 } 156 157 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) { 158 s.setupEc2LocalMetadata(c, "us-east-1") 159 ctx := coretesting.Context(c) 160 code := cmd.Main( 161 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 162 "-p", "ec2", "-s", "raring", "-r", "us-west-1", 163 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 164 ) 165 c.Assert(code, gc.Equals, 1) 166 code = cmd.Main( 167 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 168 "-p", "ec2", "-s", "precise", "-r", "region", 169 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir}, 170 ) 171 c.Assert(code, gc.Equals, 1) 172 errOut := ctx.Stderr.(*bytes.Buffer).String() 173 strippedOut := strings.Replace(errOut, "\n", "", -1) 174 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 175 } 176 177 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 178 s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url") 179 ctx := coretesting.Context(c) 180 code := cmd.Main( 181 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 182 "-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4", 183 "-u", "some-auth-url", "-d", s.metadataDir}, 184 ) 185 c.Assert(code, gc.Equals, 0) 186 errOut := ctx.Stdout.(*bytes.Buffer).String() 187 strippedOut := strings.Replace(errOut, "\n", "", -1) 188 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 189 } 190 191 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 192 s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url") 193 ctx := coretesting.Context(c) 194 code := cmd.Main( 195 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 196 "-p", "openstack", "-s", "precise", "-r", "region-2", 197 "-u", "some-auth-url", "-d", s.metadataDir}, 198 ) 199 c.Assert(code, gc.Equals, 1) 200 code = cmd.Main( 201 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 202 "-p", "openstack", "-s", "raring", "-r", "region-3", 203 "-u", "some-auth-url", "-d", s.metadataDir}, 204 ) 205 c.Assert(code, gc.Equals, 1) 206 errOut := ctx.Stderr.(*bytes.Buffer).String() 207 strippedOut := strings.Replace(errOut, "\n", "", -1) 208 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 209 } 210 211 func (s *ValidateToolsMetadataSuite) TestDefaultVersion(c *gc.C) { 212 s.makeLocalMetadata(c, "released", version.Current.Number.String(), "region-2", "raring", "some-auth-url") 213 ctx := coretesting.Context(c) 214 code := cmd.Main( 215 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 216 "-p", "openstack", "-s", "raring", "-r", "region-2", 217 "-u", "some-auth-url", "-d", s.metadataDir}, 218 ) 219 c.Assert(code, gc.Equals, 0) 220 errOut := ctx.Stdout.(*bytes.Buffer).String() 221 strippedOut := strings.Replace(errOut, "\n", "", -1) 222 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 223 } 224 225 func (s *ValidateToolsMetadataSuite) TestStream(c *gc.C) { 226 s.makeLocalMetadata(c, "proposed", version.Current.Number.String(), "region-2", "raring", "some-auth-url") 227 ctx := coretesting.Context(c) 228 code := cmd.Main( 229 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 230 "-p", "openstack", "-s", "raring", "-r", "region-2", 231 "-u", "some-auth-url", "-d", s.metadataDir, "--stream", "proposed"}, 232 ) 233 c.Assert(code, gc.Equals, 0) 234 errOut := ctx.Stdout.(*bytes.Buffer).String() 235 strippedOut := strings.Replace(errOut, "\n", "", -1) 236 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 237 } 238 239 func (s *ValidateToolsMetadataSuite) TestMajorVersionMatch(c *gc.C) { 240 s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url") 241 ctx := coretesting.Context(c) 242 code := cmd.Main( 243 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 244 "-p", "openstack", "-s", "raring", "-r", "region-2", 245 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"}, 246 ) 247 c.Assert(code, gc.Equals, 0) 248 errOut := ctx.Stdout.(*bytes.Buffer).String() 249 strippedOut := strings.Replace(errOut, "\n", "", -1) 250 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 251 } 252 253 func (s *ValidateToolsMetadataSuite) TestMajorMinorVersionMatch(c *gc.C) { 254 s.makeLocalMetadata(c, "released", "1.12.1", "region-2", "raring", "some-auth-url") 255 ctx := coretesting.Context(c) 256 code := cmd.Main( 257 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 258 "-p", "openstack", "-s", "raring", "-r", "region-2", 259 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"}, 260 ) 261 c.Assert(code, gc.Equals, 0) 262 errOut := ctx.Stdout.(*bytes.Buffer).String() 263 strippedOut := strings.Replace(errOut, "\n", "", -1) 264 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 265 } 266 267 func (s *ValidateToolsMetadataSuite) TestJustDirectory(c *gc.C) { 268 s.makeLocalMetadata(c, "released", version.Current.Number.String(), "region-2", "raring", "some-auth-url") 269 ctx := coretesting.Context(c) 270 code := cmd.Main( 271 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-s", "raring", "-d", s.metadataDir}, 272 ) 273 c.Assert(code, gc.Equals, 0) 274 errOut := ctx.Stdout.(*bytes.Buffer).String() 275 strippedOut := strings.Replace(errOut, "\n", "", -1) 276 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 277 }