github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/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/filestorage" 15 "launchpad.net/juju-core/environs/tools" 16 coretesting "launchpad.net/juju-core/testing" 17 "launchpad.net/juju-core/testing/testbase" 18 "launchpad.net/juju-core/version" 19 ) 20 21 type ValidateToolsMetadataSuite struct { 22 testbase.LoggingSuite 23 home *coretesting.FakeHome 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, &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 targetStorage, err := filestorage.NewFileStorageWriter(s.metadataDir) 81 c.Assert(err, gc.IsNil) 82 err = tools.WriteMetadata(targetStorage, tm, false) 83 if err != nil { 84 return err 85 } 86 return nil 87 } 88 89 func (s *ValidateToolsMetadataSuite) SetUpTest(c *gc.C) { 90 s.LoggingSuite.SetUpTest(c) 91 s.home = coretesting.MakeFakeHome(c, metadataTestEnvConfig) 92 s.metadataDir = c.MkDir() 93 restore := testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 94 s.AddCleanup(func(*gc.C) { restore() }) 95 restore = testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 96 s.AddCleanup(func(*gc.C) { restore() }) 97 } 98 99 func (s *ValidateToolsMetadataSuite) TearDownTest(c *gc.C) { 100 s.home.Restore() 101 s.LoggingSuite.TearDownTest(c) 102 } 103 104 func (s *ValidateToolsMetadataSuite) setupEc2LocalMetadata(c *gc.C, region string) { 105 ec2Region, ok := aws.Regions[region] 106 if !ok { 107 c.Fatalf("unknown ec2 region %q", region) 108 } 109 endpoint := ec2Region.EC2Endpoint 110 s.makeLocalMetadata(c, "1.11.4", region, "precise", endpoint) 111 } 112 113 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 114 s.setupEc2LocalMetadata(c, "us-east-1") 115 ctx := coretesting.Context(c) 116 code := cmd.Main( 117 &ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.metadataDir}, 118 ) 119 c.Assert(code, gc.Equals, 0) 120 errOut := ctx.Stdout.(*bytes.Buffer).String() 121 strippedOut := strings.Replace(errOut, "\n", "", -1) 122 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 123 } 124 125 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 126 testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 127 testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 128 s.setupEc2LocalMetadata(c, "us-east-1") 129 ctx := coretesting.Context(c) 130 code := cmd.Main( 131 &ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4"}, 132 ) 133 c.Assert(code, gc.Equals, 1) 134 errOut := ctx.Stderr.(*bytes.Buffer).String() 135 strippedOut := strings.Replace(errOut, "\n", "", -1) 136 c.Check(strippedOut, gc.Matches, `error: environment has no access-key or secret-key`) 137 } 138 139 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 140 s.setupEc2LocalMetadata(c, "us-west-1") 141 ctx := coretesting.Context(c) 142 code := cmd.Main( 143 &ValidateToolsMetadataCommand{}, ctx, []string{ 144 "-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4", 145 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 146 ) 147 c.Assert(code, gc.Equals, 0) 148 errOut := ctx.Stdout.(*bytes.Buffer).String() 149 strippedOut := strings.Replace(errOut, "\n", "", -1) 150 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 151 } 152 153 func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) { 154 s.setupEc2LocalMetadata(c, "us-east-1") 155 ctx := coretesting.Context(c) 156 code := cmd.Main( 157 &ValidateToolsMetadataCommand{}, ctx, []string{ 158 "-p", "ec2", "-s", "raring", "-r", "us-west-1", 159 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 160 ) 161 c.Assert(code, gc.Equals, 1) 162 code = cmd.Main( 163 &ValidateToolsMetadataCommand{}, ctx, []string{ 164 "-p", "ec2", "-s", "precise", "-r", "region", 165 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir}, 166 ) 167 c.Assert(code, gc.Equals, 1) 168 errOut := ctx.Stderr.(*bytes.Buffer).String() 169 strippedOut := strings.Replace(errOut, "\n", "", -1) 170 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 171 } 172 173 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 174 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 175 ctx := coretesting.Context(c) 176 code := cmd.Main( 177 &ValidateToolsMetadataCommand{}, ctx, []string{ 178 "-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4", 179 "-u", "some-auth-url", "-d", s.metadataDir}, 180 ) 181 c.Assert(code, gc.Equals, 0) 182 errOut := ctx.Stdout.(*bytes.Buffer).String() 183 strippedOut := strings.Replace(errOut, "\n", "", -1) 184 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 185 } 186 187 func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 188 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 189 ctx := coretesting.Context(c) 190 code := cmd.Main( 191 &ValidateToolsMetadataCommand{}, ctx, []string{ 192 "-p", "openstack", "-s", "precise", "-r", "region-2", 193 "-u", "some-auth-url", "-d", s.metadataDir}, 194 ) 195 c.Assert(code, gc.Equals, 1) 196 code = cmd.Main( 197 &ValidateToolsMetadataCommand{}, ctx, []string{ 198 "-p", "openstack", "-s", "raring", "-r", "region-3", 199 "-u", "some-auth-url", "-d", s.metadataDir}, 200 ) 201 c.Assert(code, gc.Equals, 1) 202 errOut := ctx.Stderr.(*bytes.Buffer).String() 203 strippedOut := strings.Replace(errOut, "\n", "", -1) 204 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 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 code := cmd.Main( 211 &ValidateToolsMetadataCommand{}, ctx, []string{ 212 "-p", "openstack", "-s", "raring", "-r", "region-2", 213 "-u", "some-auth-url", "-d", s.metadataDir}, 214 ) 215 c.Assert(code, gc.Equals, 0) 216 errOut := ctx.Stdout.(*bytes.Buffer).String() 217 strippedOut := strings.Replace(errOut, "\n", "", -1) 218 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 219 } 220 221 func (s *ValidateToolsMetadataSuite) TestMajorVersionMatch(c *gc.C) { 222 s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url") 223 ctx := coretesting.Context(c) 224 code := cmd.Main( 225 &ValidateToolsMetadataCommand{}, ctx, []string{ 226 "-p", "openstack", "-s", "raring", "-r", "region-2", 227 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"}, 228 ) 229 c.Assert(code, gc.Equals, 0) 230 errOut := ctx.Stdout.(*bytes.Buffer).String() 231 strippedOut := strings.Replace(errOut, "\n", "", -1) 232 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 233 } 234 235 func (s *ValidateToolsMetadataSuite) TestMajorMinorVersionMatch(c *gc.C) { 236 s.makeLocalMetadata(c, "1.12.1", "region-2", "raring", "some-auth-url") 237 ctx := coretesting.Context(c) 238 code := cmd.Main( 239 &ValidateToolsMetadataCommand{}, ctx, []string{ 240 "-p", "openstack", "-s", "raring", "-r", "region-2", 241 "-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"}, 242 ) 243 c.Assert(code, gc.Equals, 0) 244 errOut := ctx.Stdout.(*bytes.Buffer).String() 245 strippedOut := strings.Replace(errOut, "\n", "", -1) 246 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 247 } 248 249 func (s *ValidateToolsMetadataSuite) TestJustDirectory(c *gc.C) { 250 s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url") 251 ctx := coretesting.Context(c) 252 code := cmd.Main( 253 &ValidateToolsMetadataCommand{}, ctx, []string{"-s", "raring", "-d", s.metadataDir}, 254 ) 255 c.Assert(code, gc.Equals, 0) 256 errOut := ctx.Stdout.(*bytes.Buffer).String() 257 strippedOut := strings.Replace(errOut, "\n", "", -1) 258 c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`) 259 }