launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/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, filestorage.UseDefaultTmpDir) 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(strippedOut, gc.Matches, `matching image ids for region "us-east-1":.*`) 137 } 138 139 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) { 140 s.assertEc2LocalMetadataUsingEnvironment(c, "") 141 s.assertEc2LocalMetadataUsingEnvironment(c, imagemetadata.ReleasedStream) 142 s.assertEc2LocalMetadataUsingEnvironment(c, "daily") 143 } 144 145 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) { 146 testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "") 147 testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "") 148 testbase.PatchEnvironment("EC2_ACCESS_KEY", "") 149 testbase.PatchEnvironment("EC2_SECRET_KEY", "") 150 s.setupEc2LocalMetadata(c, "us-east-1", "") 151 ctx := coretesting.Context(c) 152 code := cmd.Main( 153 &ValidateImageMetadataCommand{}, ctx, []string{"-e", "ec2", "-d", s.metadataDir}, 154 ) 155 c.Assert(code, gc.Equals, 1) 156 errOut := ctx.Stderr.(*bytes.Buffer).String() 157 strippedOut := strings.Replace(errOut, "\n", "", -1) 158 c.Check(strippedOut, gc.Matches, `error: environment has no access-key or secret-key`) 159 } 160 161 func (s *ValidateImageMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) { 162 s.setupEc2LocalMetadata(c, "us-west-1", "") 163 ctx := coretesting.Context(c) 164 code := cmd.Main( 165 &ValidateImageMetadataCommand{}, ctx, []string{ 166 "-p", "ec2", "-s", "precise", "-r", "us-west-1", 167 "-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir}, 168 ) 169 c.Assert(code, gc.Equals, 0) 170 errOut := ctx.Stdout.(*bytes.Buffer).String() 171 strippedOut := strings.Replace(errOut, "\n", "", -1) 172 c.Check(strippedOut, gc.Matches, `matching image ids for region "us-west-1":.*`) 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 &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 &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 } 191 192 func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) { 193 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "") 194 ctx := coretesting.Context(c) 195 code := cmd.Main( 196 &ValidateImageMetadataCommand{}, ctx, []string{ 197 "-p", "openstack", "-s", "raring", "-r", "region-2", 198 "-u", "some-auth-url", "-d", s.metadataDir}, 199 ) 200 c.Assert(code, gc.Equals, 0) 201 errOut := ctx.Stdout.(*bytes.Buffer).String() 202 strippedOut := strings.Replace(errOut, "\n", "", -1) 203 c.Check(strippedOut, gc.Matches, `matching image ids for region "region-2":.*`) 204 } 205 206 func (s *ValidateImageMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) { 207 s.makeLocalMetadata(c, "1234", "region-2", "raring", "some-auth-url", "") 208 ctx := coretesting.Context(c) 209 code := cmd.Main( 210 &ValidateImageMetadataCommand{}, ctx, []string{ 211 "-p", "openstack", "-s", "precise", "-r", "region-2", 212 "-u", "some-auth-url", "-d", s.metadataDir}, 213 ) 214 c.Assert(code, gc.Equals, 1) 215 code = cmd.Main( 216 &ValidateImageMetadataCommand{}, ctx, []string{ 217 "-p", "openstack", "-s", "raring", "-r", "region-3", 218 "-u", "some-auth-url", "-d", s.metadataDir}, 219 ) 220 c.Assert(code, gc.Equals, 1) 221 }