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