github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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.v2/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 } 113 114 func (s *ValidateImageMetadataSuite) setupEc2LocalMetadata(c *gc.C, region, stream string) { 115 ec2Region, ok := aws.Regions[region] 116 if !ok { 117 c.Fatalf("unknown ec2 region %q", region) 118 } 119 endpoint := ec2Region.EC2Endpoint 120 s.makeLocalMetadata(c, "1234", region, "precise", endpoint, stream) 121 } 122 123 func (s *ValidateImageMetadataSuite) assertEc2LocalMetadataUsingEnvironment(c *gc.C, stream string) { 124 s.setupEc2LocalMetadata(c, "us-east-1", stream) 125 ctx := coretesting.Context(c) 126 code := cmd.Main( 127 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{"-e", "ec2", "-d", s.metadataDir, "-m", stream}, 128 ) 129 c.Assert(code, gc.Equals, 0) 130 errOut := ctx.Stdout.(*bytes.Buffer).String() 131 strippedOut := strings.Replace(errOut, "\n", "", -1) 132 c.Check( 133 strippedOut, gc.Matches, 134 `ImageIds:.*"1234".*Region:.*us-east-1.*Resolve Metadata:.*source: local metadata directory.*`) 135 } 136 137 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 138 s.assertEc2LocalMetadataUsingEnvironment(c, "") 139 s.assertEc2LocalMetadataUsingEnvironment(c, imagemetadata.ReleasedStream) 140 s.assertEc2LocalMetadataUsingEnvironment(c, "daily") 141 } 142 143 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 144 s.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 145 s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 146 s.PatchEnvironment("EC2_ACCESS_KEY", "") 147 s.PatchEnvironment("EC2_SECRET_KEY", "") 148 s.setupEc2LocalMetadata(c, "us-east-1", "") 149 ctx := coretesting.Context(c) 150 code := cmd.Main( 151 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{"-e", "ec2", "-d", s.metadataDir}, 152 ) 153 c.Assert(code, gc.Equals, 1) 154 errOut := ctx.Stderr.(*bytes.Buffer).String() 155 strippedOut := strings.Replace(errOut, "\n", "", -1) 156 c.Check(strippedOut, gc.Matches, `error: .*environment has no access-key or secret-key`) 157 } 158 159 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 160 s.setupEc2LocalMetadata(c, "us-west-1", "") 161 ctx := coretesting.Context(c) 162 code := cmd.Main( 163 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 164 "-p", "ec2", "-s", "precise", "-r", "us-west-1", 165 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 166 ) 167 c.Assert(code, gc.Equals, 0) 168 errOut := ctx.Stdout.(*bytes.Buffer).String() 169 strippedOut := strings.Replace(errOut, "\n", "", -1) 170 c.Check( 171 strippedOut, gc.Matches, 172 `ImageIds:.*"1234".*Region:.*us-west-1.*Resolve Metadata:.*source: local metadata directory.*`) 173 } 174 175 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) { 176 s.setupEc2LocalMetadata(c, "us-east-1", "") 177 ctx := coretesting.Context(c) 178 code := cmd.Main( 179 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 180 "-p", "ec2", "-s", "raring", "-r", "us-west-1", 181 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 182 ) 183 c.Assert(code, gc.Equals, 1) 184 code = cmd.Main( 185 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 186 "-p", "ec2", "-s", "precise", "-r", "region", 187 "-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir}, 188 ) 189 c.Assert(code, gc.Equals, 1) 190 errOut := ctx.Stderr.(*bytes.Buffer).String() 191 strippedOut := strings.Replace(errOut, "\n", "", -1) 192 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 193 } 194 195 func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 196 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "") 197 ctx := coretesting.Context(c) 198 code := cmd.Main( 199 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 200 "-p", "openstack", "-s", "raring", "-r", "region-2", 201 "-u", "some-auth-url", "-d", s.metadataDir}, 202 ) 203 c.Assert(code, gc.Equals, 0) 204 errOut := ctx.Stdout.(*bytes.Buffer).String() 205 strippedOut := strings.Replace(errOut, "\n", "", -1) 206 c.Check( 207 strippedOut, gc.Matches, 208 `ImageIds:.*"1234".*Region:.*region-2.*Resolve Metadata:.*source: local metadata directory.*`) 209 } 210 211 func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 212 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "") 213 ctx := coretesting.Context(c) 214 code := cmd.Main( 215 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 216 "-p", "openstack", "-s", "precise", "-r", "region-2", 217 "-u", "some-auth-url", "-d", s.metadataDir}, 218 ) 219 c.Assert(code, gc.Equals, 1) 220 errOut := ctx.Stderr.(*bytes.Buffer).String() 221 strippedOut := strings.Replace(errOut, "\n", "", -1) 222 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 223 code = cmd.Main( 224 envcmd.Wrap(&ValidateImageMetadataCommand{}), ctx, []string{ 225 "-p", "openstack", "-s", "raring", "-r", "region-3", 226 "-u", "some-auth-url", "-d", s.metadataDir}, 227 ) 228 c.Assert(code, gc.Equals, 1) 229 errOut = ctx.Stderr.(*bytes.Buffer).String() 230 strippedOut = strings.Replace(errOut, "\n", "", -1) 231 c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`) 232 }