github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/cmd/plugins/juju-metadata/validateimagemetadata_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 "gopkg.in/amz.v3/aws" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/cmd/envcmd" 15 "github.com/juju/juju/environs/filestorage" 16 "github.com/juju/juju/environs/imagemetadata" 17 "github.com/juju/juju/environs/simplestreams" 18 coretesting "github.com/juju/juju/testing" 19 ) 20 21 type ValidateImageMetadataSuite struct { 22 coretesting.FakeJujuHomeSuite 23 metadataDir string 24 } 25 26 var _ = gc.Suite(&ValidateImageMetadataSuite{}) 27 28 func runValidateImageMetadata(c *gc.C, args ...string) error { 29 _, err := coretesting.RunCommand(c, envcmd.Wrap(&ValidateImageMetadataCommand{}), args...) 30 return err 31 } 32 33 var validateInitImageErrorTests = []struct { 34 args []string 35 err string 36 }{ 37 { 38 args: []string{"-p", "ec2", "-r", "region", "-d", "dir"}, 39 err: `series required if provider type is specified`, 40 }, { 41 args: []string{"-p", "ec2", "-s", "series", "-d", "dir"}, 42 err: `region required if provider type is specified`, 43 }, { 44 args: []string{"-p", "ec2", "-s", "series", "-r", "region"}, 45 err: `metadata directory required if provider type is specified`, 46 }, 47 } 48 49 func (s *ValidateImageMetadataSuite) TestInitErrors(c *gc.C) { 50 for i, t := range validateInitImageErrorTests { 51 c.Logf("test %d", i) 52 err := coretesting.InitCommand(envcmd.Wrap(&ValidateImageMetadataCommand{}), t.args) 53 c.Check(err, gc.ErrorMatches, t.err) 54 } 55 } 56 57 func (s *ValidateImageMetadataSuite) TestInvalidProviderError(c *gc.C) { 58 err := runValidateImageMetadata(c, "-p", "foo", "-s", "series", "-r", "region", "-d", "dir") 59 c.Check(err, gc.ErrorMatches, `no registered provider for "foo"`) 60 } 61 62 func (s *ValidateImageMetadataSuite) TestUnsupportedProviderError(c *gc.C) { 63 err := runValidateImageMetadata(c, "-p", "local", "-s", "series", "-r", "region", "-d", "dir") 64 c.Check(err, gc.ErrorMatches, `local provider does not support image metadata validation`) 65 } 66 67 func (s *ValidateImageMetadataSuite) makeLocalMetadata(c *gc.C, id, region, series, endpoint, stream string) error { 68 im := &imagemetadata.ImageMetadata{ 69 Id: id, 70 Arch: "amd64", 71 Stream: stream, 72 } 73 cloudSpec := simplestreams.CloudSpec{ 74 Region: region, 75 Endpoint: endpoint, 76 } 77 targetStorage, err := filestorage.NewFileStorageWriter(s.metadataDir) 78 if err != nil { 79 return err 80 } 81 err = imagemetadata.MergeAndWriteMetadata(series, []*imagemetadata.ImageMetadata{im}, &cloudSpec, targetStorage) 82 if err != nil { 83 return err 84 } 85 return nil 86 } 87 88 const metadataTestEnvConfig = ` 89 default: ec2 90 91 environments: 92 ec2: 93 type: ec2 94 default-series: precise 95 region: us-east-1 96 97 azure: 98 type: azure 99 default-series: raring 100 location: US West 101 management-subscription-id: foo 102 storage-account-name: bar 103 management-certificate-path: /home/me/azure.pem 104 ` 105 106 func (s *ValidateImageMetadataSuite) SetUpTest(c *gc.C) { 107 s.FakeJujuHomeSuite.SetUpTest(c) 108 s.metadataDir = c.MkDir() 109 coretesting.WriteEnvironments(c, metadataTestEnvConfig) 110 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access") 111 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret") 112 // All of the following are recognized as fallbacks by goamz. 113 s.PatchEnvironment("AWS_ACCESS_KEY", "") 114 s.PatchEnvironment("AWS_SECRET_KEY", "") 115 s.PatchEnvironment("EC2_ACCESS_KEY", "") 116 s.PatchEnvironment("EC2_SECRET_KEY", "") 117 } 118 119 func (s *ValidateImageMetadataSuite) setupEc2LocalMetadata(c *gc.C, region, stream string) { 120 ec2Region, ok := aws.Regions[region] 121 if !ok { 122 c.Fatalf("unknown ec2 region %q", region) 123 } 124 endpoint := ec2Region.EC2Endpoint 125 s.makeLocalMetadata(c, "1234", region, "precise", endpoint, stream) 126 } 127 128 func (s *ValidateImageMetadataSuite) assertEc2LocalMetadataUsingEnvironment(c *gc.C, stream string) { 129 s.setupEc2LocalMetadata(c, "us-east-1", stream) 130 ctx := coretesting.Context(c) 131 code := cmd.Main( 132 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{"-e", "ec2", "-d", s.metadataDir, "-m", stream}, 133 ) 134 c.Assert(code, gc.Equals, 0) 135 errOut := ctx.Stdout.(*bytes.Buffer).String() 136 strippedOut := strings.Replace(errOut, "\n", "", -1) 137 c.Check( 138 strippedOut, gc.Matches, 139 `ImageIds:.*"1234".*Region:.*us-east-1.*Resolve Metadata:.*source: local metadata directory.*`) 140 } 141 142 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 143 s.assertEc2LocalMetadataUsingEnvironment(c, "") 144 s.assertEc2LocalMetadataUsingEnvironment(c, imagemetadata.ReleasedStream) 145 s.assertEc2LocalMetadataUsingEnvironment(c, "daily") 146 } 147 148 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 149 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 150 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 151 s.PatchEnvironment("EC2_ACCESS_KEY", "") 152 s.PatchEnvironment("EC2_SECRET_KEY", "") 153 s.setupEc2LocalMetadata(c, "us-east-1", "") 154 ctx := coretesting.Context(c) 155 code := cmd.Main( 156 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{"-e", "ec2", "-d", s.metadataDir}, 157 ) 158 c.Assert(code, gc.Equals, 1) 159 errOut := ctx.Stderr.(*bytes.Buffer).String() 160 strippedOut := strings.Replace(errOut, "\n", "", -1) 161 c.Check(strippedOut, gc.Matches, `error: .*environment has no access-key or secret-key`) 162 } 163 164 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 165 s.setupEc2LocalMetadata(c, "us-west-1", "") 166 ctx := coretesting.Context(c) 167 code := cmd.Main( 168 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 169 "-p", "ec2", "-s", "precise", "-r", "us-west-1", 170 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 171 ) 172 c.Assert(code, gc.Equals, 0) 173 errOut := ctx.Stdout.(*bytes.Buffer).String() 174 strippedOut := strings.Replace(errOut, "\n", "", -1) 175 c.Check( 176 strippedOut, gc.Matches, 177 `ImageIds:.*"1234".*Region:.*us-west-1.*Resolve Metadata:.*source: local metadata directory.*`) 178 } 179 180 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) { 181 s.setupEc2LocalMetadata(c, "us-east-1", "") 182 ctx := coretesting.Context(c) 183 code := cmd.Main( 184 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 185 "-p", "ec2", "-s", "raring", "-r", "us-west-1", 186 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 187 ) 188 c.Assert(code, gc.Equals, 1) 189 code = cmd.Main( 190 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 191 "-p", "ec2", "-s", "precise", "-r", "region", 192 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir}, 193 ) 194 c.Assert(code, gc.Equals, 1) 195 errOut := ctx.Stderr.(*bytes.Buffer).String() 196 strippedOut := strings.Replace(errOut, "\n", "", -1) 197 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 198 } 199 200 func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 201 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "") 202 ctx := coretesting.Context(c) 203 code := cmd.Main( 204 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 205 "-p", "openstack", "-s", "raring", "-r", "region-2", 206 "-u", "some-auth-url", "-d", s.metadataDir}, 207 ) 208 c.Assert(code, gc.Equals, 0) 209 errOut := ctx.Stdout.(*bytes.Buffer).String() 210 strippedOut := strings.Replace(errOut, "\n", "", -1) 211 c.Check( 212 strippedOut, gc.Matches, 213 `ImageIds:.*"1234".*Region:.*region-2.*Resolve Metadata:.*source: local metadata directory.*`) 214 } 215 216 func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 217 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "") 218 ctx := coretesting.Context(c) 219 code := cmd.Main( 220 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 221 "-p", "openstack", "-s", "precise", "-r", "region-2", 222 "-u", "some-auth-url", "-d", s.metadataDir}, 223 ) 224 c.Assert(code, gc.Equals, 1) 225 errOut := ctx.Stderr.(*bytes.Buffer).String() 226 strippedOut := strings.Replace(errOut, "\n", "", -1) 227 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 228 code = cmd.Main( 229 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 230 "-p", "openstack", "-s", "raring", "-r", "region-3", 231 "-u", "some-auth-url", "-d", s.metadataDir}, 232 ) 233 c.Assert(code, gc.Equals, 1) 234 errOut = ctx.Stderr.(*bytes.Buffer).String() 235 strippedOut = strings.Replace(errOut, "\n", "", -1) 236 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 237 }