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  }