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  }