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