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