github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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 "github.com/juju/juju/cmd" 14 "github.com/juju/juju/cmd/envcmd" 15 "github.com/juju/juju/environs/filestorage" 16 "github.com/juju/juju/environs/tools" 17 coretesting "github.com/juju/juju/testing" 18 "github.com/juju/juju/version" 19 ) 20 21 type ValidateToolsMetadataSuite struct { 22 coretesting.FakeJujuHomeSuite 23 metadataDir string 24 } 25 26 var _ = gc.Suite(&ValidateToolsMetadataSuite{}) 27 28 func runValidateToolsMetadata(c *gc.C, args ...string) error { 29 _, err := coretesting.RunCommand(c, envcmd.Wrap(&ValidateToolsMetadataCommand{}), args...) 30 return err 31 } 32 33 var validateInitToolsErrorTests = []struct { 34 args []string 35 err string 36 }{ 37 { 38 args: []string{"-p", "ec2", "-s", "series", "-d", "dir"}, 39 err: `region required if provider type is specified`, 40 }, { 41 args: []string{"-p", "ec2", "-s", "series", "-r", "region"}, 42 err: `metadata directory required if provider type is specified`, 43 }, { 44 args: []string{"-s", "series", "-r", "region", "-m", "x"}, 45 err: `invalid major version number x: .*`, 46 }, { 47 args: []string{"-s", "series", "-r", "region", "-m", "2.x"}, 48 err: `invalid minor version number x: .*`, 49 }, { 50 args: []string{"-s", "series", "-r", "region", "-m", "2.2.1"}, 51 err: `invalid major.minor version number 2.2.1`, 52 }, 53 } 54 55 func (s *ValidateToolsMetadataSuite) TestInitErrors(c *gc.C) { 56 for i, t := range validateInitToolsErrorTests { 57 c.Logf("test %d", i) 58 err := coretesting.InitCommand(envcmd.Wrap(&ValidateToolsMetadataCommand{}), t.args) 59 c.Check(err, gc.ErrorMatches, t.err) 60 } 61 } 62 63 func (s *ValidateToolsMetadataSuite) TestInvalidProviderError(c *gc.C) { 64 err := runValidateToolsMetadata(c, "-p", "foo", "-s", "series", "-r", "region", "-d", "dir") 65 c.Check(err, gc.ErrorMatches, `no registered provider for "foo"`) 66 } 67 68 func (s *ValidateToolsMetadataSuite) TestUnsupportedProviderError(c *gc.C) { 69 err := runValidateToolsMetadata(c, "-p", "local", "-s", "series", "-r", "region", "-d", "dir") 70 c.Check(err, gc.ErrorMatches, `local provider does not support tools metadata validation`) 71 } 72 73 func (s *ValidateToolsMetadataSuite) makeLocalMetadata(c *gc.C, version, region, series, endpoint string) error { 74 tm := []*tools.ToolsMetadata{{ 75 Version: version, 76 Arch: "amd64", 77 Release: series, 78 }} 79 targetStorage, err := filestorage.NewFileStorageWriter(s.metadataDir) 80 c.Assert(err, gc.IsNil) 81 err = tools.WriteMetadata(targetStorage, tm, false) 82 if err != nil { 83 return err 84 } 85 return nil 86 } 87 88 func (s *ValidateToolsMetadataSuite) SetUpTest(c *gc.C) { 89 s.FakeJujuHomeSuite.SetUpTest(c) 90 coretesting.WriteEnvironments(c, metadataTestEnvConfig) 91 s.metadataDir = c.MkDir() 92 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 93 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 94 } 95 96 func (s *ValidateToolsMetadataSuite) setupEc2LocalMetadata(c *gc.C, region string) { 97 ec2Region, ok := aws.Regions[region] 98 if !ok { 99 c.Fatalf("unknown ec2 region %q", region) 100 } 101 endpoint := ec2Region.EC2Endpoint 102 s.makeLocalMetadata(c, "1.11.4", region, "precise", endpoint) 103 } 104 105 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 106 s.setupEc2LocalMetadata(c, "us-east-1") 107 ctx := coretesting.Context(c) 108 code := cmd.Main( 109 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.metadataDir}, 110 ) 111 c.Assert(code, gc.Equals, 0) 112 errOut := ctx.Stdout.(*bytes.Buffer).String() 113 strippedOut := strings.Replace(errOut, "\n", "", -1) 114 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 115 } 116 117 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 118 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 119 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 120 s.setupEc2LocalMetadata(c, "us-east-1") 121 ctx := coretesting.Context(c) 122 code := cmd.Main( 123 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4"}, 124 ) 125 c.Assert(code, gc.Equals, 1) 126 errOut := ctx.Stderr.(*bytes.Buffer).String() 127 strippedOut := strings.Replace(errOut, "\n", "", -1) 128 c.Check(strippedOut, gc.Matches, `error: environment has no access-key or secret-key`) 129 } 130 131 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 132 s.setupEc2LocalMetadata(c, "us-west-1") 133 ctx := coretesting.Context(c) 134 code := cmd.Main( 135 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 136 "-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4", 137 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 138 ) 139 c.Assert(code, gc.Equals, 0) 140 errOut := ctx.Stdout.(*bytes.Buffer).String() 141 strippedOut := strings.Replace(errOut, "\n", "", -1) 142 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 143 } 144 145 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) { 146 s.setupEc2LocalMetadata(c, "us-east-1") 147 ctx := coretesting.Context(c) 148 code := cmd.Main( 149 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 150 "-p", "ec2", "-s", "raring", "-r", "us-west-1", 151 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 152 ) 153 c.Assert(code, gc.Equals, 1) 154 code = cmd.Main( 155 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 156 "-p", "ec2", "-s", "precise", "-r", "region", 157 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir}, 158 ) 159 c.Assert(code, gc.Equals, 1) 160 errOut := ctx.Stderr.(*bytes.Buffer).String() 161 strippedOut := strings.Replace(errOut, "\n", "", -1) 162 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 163 } 164 165 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 166 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 167 ctx := coretesting.Context(c) 168 code := cmd.Main( 169 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 170 "-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4", 171 "-u", "some-auth-url", "-d", s.metadataDir}, 172 ) 173 c.Assert(code, gc.Equals, 0) 174 errOut := ctx.Stdout.(*bytes.Buffer).String() 175 strippedOut := strings.Replace(errOut, "\n", "", -1) 176 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 177 } 178 179 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 180 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 181 ctx := coretesting.Context(c) 182 code := cmd.Main( 183 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 184 "-p", "openstack", "-s", "precise", "-r", "region-2", 185 "-u", "some-auth-url", "-d", s.metadataDir}, 186 ) 187 c.Assert(code, gc.Equals, 1) 188 code = cmd.Main( 189 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 190 "-p", "openstack", "-s", "raring", "-r", "region-3", 191 "-u", "some-auth-url", "-d", s.metadataDir}, 192 ) 193 c.Assert(code, gc.Equals, 1) 194 errOut := ctx.Stderr.(*bytes.Buffer).String() 195 strippedOut := strings.Replace(errOut, "\n", "", -1) 196 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 197 } 198 199 func (s *ValidateToolsMetadataSuite) TestDefaultVersion(c *gc.C) { 200 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url") 201 ctx := coretesting.Context(c) 202 code := cmd.Main( 203 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 204 "-p", "openstack", "-s", "raring", "-r", "region-2", 205 "-u", "some-auth-url", "-d", s.metadataDir}, 206 ) 207 c.Assert(code, gc.Equals, 0) 208 errOut := ctx.Stdout.(*bytes.Buffer).String() 209 strippedOut := strings.Replace(errOut, "\n", "", -1) 210 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 211 } 212 213 func (s *ValidateToolsMetadataSuite) TestMajorVersionMatch(c *gc.C) { 214 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 215 ctx := coretesting.Context(c) 216 code := cmd.Main( 217 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 218 "-p", "openstack", "-s", "raring", "-r", "region-2", 219 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"}, 220 ) 221 c.Assert(code, gc.Equals, 0) 222 errOut := ctx.Stdout.(*bytes.Buffer).String() 223 strippedOut := strings.Replace(errOut, "\n", "", -1) 224 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 225 } 226 227 func (s *ValidateToolsMetadataSuite) TestMajorMinorVersionMatch(c *gc.C) { 228 s.makeLocalMetadata(c, "1.12.1", "region-2", "raring", "some-auth-url") 229 ctx := coretesting.Context(c) 230 code := cmd.Main( 231 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 232 "-p", "openstack", "-s", "raring", "-r", "region-2", 233 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"}, 234 ) 235 c.Assert(code, gc.Equals, 0) 236 errOut := ctx.Stdout.(*bytes.Buffer).String() 237 strippedOut := strings.Replace(errOut, "\n", "", -1) 238 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 239 } 240 241 func (s *ValidateToolsMetadataSuite) TestJustDirectory(c *gc.C) { 242 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url") 243 ctx := coretesting.Context(c) 244 code := cmd.Main( 245 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-s", "raring", "-d", s.metadataDir}, 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 }