github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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.v2/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 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 97 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 98 } 99 100 func (s *ValidateToolsMetadataSuite) setupEc2LocalMetadata(c *gc.C, region string) { 101 ec2Region, ok := aws.Regions[region] 102 if !ok { 103 c.Fatalf("unknown ec2 region %q", region) 104 } 105 endpoint := ec2Region.EC2Endpoint 106 s.makeLocalMetadata(c, "released", "1.11.4", region, "precise", endpoint) 107 } 108 109 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 110 s.setupEc2LocalMetadata(c, "us-east-1") 111 ctx := coretesting.Context(c) 112 code := cmd.Main( 113 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.metadataDir}, 114 ) 115 c.Assert(code, gc.Equals, 0) 116 errOut := ctx.Stdout.(*bytes.Buffer).String() 117 strippedOut := strings.Replace(errOut, "\n", "", -1) 118 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 119 } 120 121 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 122 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 123 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 124 s.setupEc2LocalMetadata(c, "us-east-1") 125 ctx := coretesting.Context(c) 126 code := cmd.Main( 127 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4"}, 128 ) 129 c.Assert(code, gc.Equals, 1) 130 errOut := ctx.Stderr.(*bytes.Buffer).String() 131 strippedOut := strings.Replace(errOut, "\n", "", -1) 132 c.Check(strippedOut, gc.Matches, `error: .*environment has no access-key or secret-key`) 133 } 134 135 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 136 s.setupEc2LocalMetadata(c, "us-west-1") 137 ctx := coretesting.Context(c) 138 code := cmd.Main( 139 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 140 "-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4", 141 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 142 ) 143 c.Assert(code, gc.Equals, 0) 144 errOut := ctx.Stdout.(*bytes.Buffer).String() 145 strippedOut := strings.Replace(errOut, "\n", "", -1) 146 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 147 } 148 149 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) { 150 s.setupEc2LocalMetadata(c, "us-east-1") 151 ctx := coretesting.Context(c) 152 code := cmd.Main( 153 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 154 "-p", "ec2", "-s", "raring", "-r", "us-west-1", 155 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 156 ) 157 c.Assert(code, gc.Equals, 1) 158 code = cmd.Main( 159 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 160 "-p", "ec2", "-s", "precise", "-r", "region", 161 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir}, 162 ) 163 c.Assert(code, gc.Equals, 1) 164 errOut := ctx.Stderr.(*bytes.Buffer).String() 165 strippedOut := strings.Replace(errOut, "\n", "", -1) 166 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 167 } 168 169 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 170 s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url") 171 ctx := coretesting.Context(c) 172 code := cmd.Main( 173 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 174 "-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4", 175 "-u", "some-auth-url", "-d", s.metadataDir}, 176 ) 177 c.Assert(code, gc.Equals, 0) 178 errOut := ctx.Stdout.(*bytes.Buffer).String() 179 strippedOut := strings.Replace(errOut, "\n", "", -1) 180 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 181 } 182 183 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 184 s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url") 185 ctx := coretesting.Context(c) 186 code := cmd.Main( 187 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 188 "-p", "openstack", "-s", "precise", "-r", "region-2", 189 "-u", "some-auth-url", "-d", s.metadataDir}, 190 ) 191 c.Assert(code, gc.Equals, 1) 192 code = cmd.Main( 193 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 194 "-p", "openstack", "-s", "raring", "-r", "region-3", 195 "-u", "some-auth-url", "-d", s.metadataDir}, 196 ) 197 c.Assert(code, gc.Equals, 1) 198 errOut := ctx.Stderr.(*bytes.Buffer).String() 199 strippedOut := strings.Replace(errOut, "\n", "", -1) 200 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 201 } 202 203 func (s *ValidateToolsMetadataSuite) TestDefaultVersion(c *gc.C) { 204 s.makeLocalMetadata(c, "released", version.Current.Number.String(), "region-2", "raring", "some-auth-url") 205 ctx := coretesting.Context(c) 206 code := cmd.Main( 207 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 208 "-p", "openstack", "-s", "raring", "-r", "region-2", 209 "-u", "some-auth-url", "-d", s.metadataDir}, 210 ) 211 c.Assert(code, gc.Equals, 0) 212 errOut := ctx.Stdout.(*bytes.Buffer).String() 213 strippedOut := strings.Replace(errOut, "\n", "", -1) 214 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 215 } 216 217 func (s *ValidateToolsMetadataSuite) TestStream(c *gc.C) { 218 s.makeLocalMetadata(c, "proposed", version.Current.Number.String(), "region-2", "raring", "some-auth-url") 219 ctx := coretesting.Context(c) 220 code := cmd.Main( 221 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 222 "-p", "openstack", "-s", "raring", "-r", "region-2", 223 "-u", "some-auth-url", "-d", s.metadataDir, "--stream", "proposed"}, 224 ) 225 c.Assert(code, gc.Equals, 0) 226 errOut := ctx.Stdout.(*bytes.Buffer).String() 227 strippedOut := strings.Replace(errOut, "\n", "", -1) 228 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 229 } 230 231 func (s *ValidateToolsMetadataSuite) TestMajorVersionMatch(c *gc.C) { 232 s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url") 233 ctx := coretesting.Context(c) 234 code := cmd.Main( 235 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 236 "-p", "openstack", "-s", "raring", "-r", "region-2", 237 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"}, 238 ) 239 c.Assert(code, gc.Equals, 0) 240 errOut := ctx.Stdout.(*bytes.Buffer).String() 241 strippedOut := strings.Replace(errOut, "\n", "", -1) 242 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 243 } 244 245 func (s *ValidateToolsMetadataSuite) TestMajorMinorVersionMatch(c *gc.C) { 246 s.makeLocalMetadata(c, "released", "1.12.1", "region-2", "raring", "some-auth-url") 247 ctx := coretesting.Context(c) 248 code := cmd.Main( 249 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{ 250 "-p", "openstack", "-s", "raring", "-r", "region-2", 251 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"}, 252 ) 253 c.Assert(code, gc.Equals, 0) 254 errOut := ctx.Stdout.(*bytes.Buffer).String() 255 strippedOut := strings.Replace(errOut, "\n", "", -1) 256 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 257 } 258 259 func (s *ValidateToolsMetadataSuite) TestJustDirectory(c *gc.C) { 260 s.makeLocalMetadata(c, "released", version.Current.Number.String(), "region-2", "raring", "some-auth-url") 261 ctx := coretesting.Context(c) 262 code := cmd.Main( 263 envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-s", "raring", "-d", s.metadataDir}, 264 ) 265 c.Assert(code, gc.Equals, 0) 266 errOut := ctx.Stdout.(*bytes.Buffer).String() 267 strippedOut := strings.Replace(errOut, "\n", "", -1) 268 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 269 }