github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/cmd/plugins/juju-metadata/validatetoolsmetadata_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  	jc "github.com/juju/testing/checkers"
    12  	"gopkg.in/amz.v3/aws"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/juju/cmd/envcmd"
    16  	"github.com/juju/juju/environs/filestorage"
    17  	"github.com/juju/juju/environs/tools"
    18  	coretesting "github.com/juju/juju/testing"
    19  	"github.com/juju/juju/version"
    20  )
    21  
    22  type ValidateToolsMetadataSuite struct {
    23  	coretesting.FakeJujuHomeSuite
    24  	metadataDir string
    25  }
    26  
    27  var _ = gc.Suite(&ValidateToolsMetadataSuite{})
    28  
    29  func runValidateToolsMetadata(c *gc.C, args ...string) error {
    30  	_, err := coretesting.RunCommand(c, envcmd.Wrap(&ValidateToolsMetadataCommand{}), args...)
    31  	return err
    32  }
    33  
    34  var validateInitToolsErrorTests = []struct {
    35  	args []string
    36  	err  string
    37  }{
    38  	{
    39  		args: []string{"-p", "ec2", "-s", "series", "-d", "dir"},
    40  		err:  `region required if provider type is specified`,
    41  	}, {
    42  		args: []string{"-p", "ec2", "-s", "series", "-r", "region"},
    43  		err:  `metadata directory required if provider type is specified`,
    44  	}, {
    45  		args: []string{"-s", "series", "-r", "region", "-m", "x"},
    46  		err:  `invalid major version number x: .*`,
    47  	}, {
    48  		args: []string{"-s", "series", "-r", "region", "-m", "2.x"},
    49  		err:  `invalid minor version number x: .*`,
    50  	}, {
    51  		args: []string{"-s", "series", "-r", "region", "-m", "2.2.1"},
    52  		err:  `invalid major.minor version number 2.2.1`,
    53  	},
    54  }
    55  
    56  func (s *ValidateToolsMetadataSuite) TestInitErrors(c *gc.C) {
    57  	for i, t := range validateInitToolsErrorTests {
    58  		c.Logf("test %d", i)
    59  		err := coretesting.InitCommand(envcmd.Wrap(&ValidateToolsMetadataCommand{}), t.args)
    60  		c.Check(err, gc.ErrorMatches, t.err)
    61  	}
    62  }
    63  
    64  func (s *ValidateToolsMetadataSuite) TestInvalidProviderError(c *gc.C) {
    65  	err := runValidateToolsMetadata(c, "-p", "foo", "-s", "series", "-r", "region", "-d", "dir")
    66  	c.Check(err, gc.ErrorMatches, `no registered provider for "foo"`)
    67  }
    68  
    69  func (s *ValidateToolsMetadataSuite) TestUnsupportedProviderError(c *gc.C) {
    70  	err := runValidateToolsMetadata(c, "-p", "local", "-s", "series", "-r", "region", "-d", "dir")
    71  	c.Check(err, gc.ErrorMatches, `local provider does not support tools metadata validation`)
    72  }
    73  
    74  func (s *ValidateToolsMetadataSuite) makeLocalMetadata(c *gc.C, stream, version, region, series, endpoint string) error {
    75  	tm := []*tools.ToolsMetadata{{
    76  		Version: version,
    77  		Arch:    "amd64",
    78  		Release: series,
    79  	}}
    80  	targetStorage, err := filestorage.NewFileStorageWriter(s.metadataDir)
    81  	c.Assert(err, jc.ErrorIsNil)
    82  	streamMetadata := map[string][]*tools.ToolsMetadata{
    83  		stream: tm,
    84  	}
    85  	err = tools.WriteMetadata(targetStorage, streamMetadata, []string{stream}, false)
    86  	if err != nil {
    87  		return err
    88  	}
    89  	return nil
    90  }
    91  
    92  func (s *ValidateToolsMetadataSuite) SetUpTest(c *gc.C) {
    93  	s.FakeJujuHomeSuite.SetUpTest(c)
    94  	coretesting.WriteEnvironments(c, metadataTestEnvConfig)
    95  	s.metadataDir = c.MkDir()
    96  
    97  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
    98  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret")
    99  	// All of the following are recognized as fallbacks by goamz.
   100  	s.PatchEnvironment("AWS_ACCESS_KEY", "")
   101  	s.PatchEnvironment("AWS_SECRET_KEY", "")
   102  	s.PatchEnvironment("EC2_ACCESS_KEY", "")
   103  	s.PatchEnvironment("EC2_SECRET_KEY", "")
   104  }
   105  
   106  func (s *ValidateToolsMetadataSuite) setupEc2LocalMetadata(c *gc.C, region string) {
   107  	ec2Region, ok := aws.Regions[region]
   108  	if !ok {
   109  		c.Fatalf("unknown ec2 region %q", region)
   110  	}
   111  	endpoint := ec2Region.EC2Endpoint
   112  	s.makeLocalMetadata(c, "released", "1.11.4", region, "precise", endpoint)
   113  }
   114  
   115  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) {
   116  	s.setupEc2LocalMetadata(c, "us-east-1")
   117  	ctx := coretesting.Context(c)
   118  	code := cmd.Main(
   119  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.metadataDir},
   120  	)
   121  	c.Assert(code, gc.Equals, 0)
   122  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   123  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   124  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   125  }
   126  
   127  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) {
   128  	// We already unset the other fallbacks recognized by goamz in
   129  	// SetUpTest().
   130  	s.PatchEnvironment("AWS_ACCESS_KEY_ID", "")
   131  	s.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "")
   132  	s.setupEc2LocalMetadata(c, "us-east-1")
   133  	ctx := coretesting.Context(c)
   134  	code := cmd.Main(
   135  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-e", "ec2", "-j", "1.11.4"},
   136  	)
   137  	c.Assert(code, gc.Equals, 1)
   138  	errOut := ctx.Stderr.(*bytes.Buffer).String()
   139  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   140  	c.Check(strippedOut, gc.Matches, `error: .*environment has no access-key or secret-key`)
   141  }
   142  
   143  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) {
   144  	s.setupEc2LocalMetadata(c, "us-west-1")
   145  	ctx := coretesting.Context(c)
   146  	code := cmd.Main(
   147  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   148  			"-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4",
   149  			"-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
   150  	)
   151  	c.Assert(code, gc.Equals, 0)
   152  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   153  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   154  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   155  }
   156  
   157  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) {
   158  	s.setupEc2LocalMetadata(c, "us-east-1")
   159  	ctx := coretesting.Context(c)
   160  	code := cmd.Main(
   161  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   162  			"-p", "ec2", "-s", "raring", "-r", "us-west-1",
   163  			"-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
   164  	)
   165  	c.Assert(code, gc.Equals, 1)
   166  	code = cmd.Main(
   167  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   168  			"-p", "ec2", "-s", "precise", "-r", "region",
   169  			"-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir},
   170  	)
   171  	c.Assert(code, gc.Equals, 1)
   172  	errOut := ctx.Stderr.(*bytes.Buffer).String()
   173  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   174  	c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`)
   175  }
   176  
   177  func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) {
   178  	s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url")
   179  	ctx := coretesting.Context(c)
   180  	code := cmd.Main(
   181  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   182  			"-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4",
   183  			"-u", "some-auth-url", "-d", s.metadataDir},
   184  	)
   185  	c.Assert(code, gc.Equals, 0)
   186  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   187  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   188  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   189  }
   190  
   191  func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) {
   192  	s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url")
   193  	ctx := coretesting.Context(c)
   194  	code := cmd.Main(
   195  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   196  			"-p", "openstack", "-s", "precise", "-r", "region-2",
   197  			"-u", "some-auth-url", "-d", s.metadataDir},
   198  	)
   199  	c.Assert(code, gc.Equals, 1)
   200  	code = cmd.Main(
   201  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   202  			"-p", "openstack", "-s", "raring", "-r", "region-3",
   203  			"-u", "some-auth-url", "-d", s.metadataDir},
   204  	)
   205  	c.Assert(code, gc.Equals, 1)
   206  	errOut := ctx.Stderr.(*bytes.Buffer).String()
   207  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   208  	c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`)
   209  }
   210  
   211  func (s *ValidateToolsMetadataSuite) TestDefaultVersion(c *gc.C) {
   212  	s.makeLocalMetadata(c, "released", version.Current.Number.String(), "region-2", "raring", "some-auth-url")
   213  	ctx := coretesting.Context(c)
   214  	code := cmd.Main(
   215  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   216  			"-p", "openstack", "-s", "raring", "-r", "region-2",
   217  			"-u", "some-auth-url", "-d", s.metadataDir},
   218  	)
   219  	c.Assert(code, gc.Equals, 0)
   220  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   221  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   222  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   223  }
   224  
   225  func (s *ValidateToolsMetadataSuite) TestStream(c *gc.C) {
   226  	s.makeLocalMetadata(c, "proposed", version.Current.Number.String(), "region-2", "raring", "some-auth-url")
   227  	ctx := coretesting.Context(c)
   228  	code := cmd.Main(
   229  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   230  			"-p", "openstack", "-s", "raring", "-r", "region-2",
   231  			"-u", "some-auth-url", "-d", s.metadataDir, "--stream", "proposed"},
   232  	)
   233  	c.Assert(code, gc.Equals, 0)
   234  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   235  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   236  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   237  }
   238  
   239  func (s *ValidateToolsMetadataSuite) TestMajorVersionMatch(c *gc.C) {
   240  	s.makeLocalMetadata(c, "released", "1.11.4", "region-2", "raring", "some-auth-url")
   241  	ctx := coretesting.Context(c)
   242  	code := cmd.Main(
   243  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   244  			"-p", "openstack", "-s", "raring", "-r", "region-2",
   245  			"-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"},
   246  	)
   247  	c.Assert(code, gc.Equals, 0)
   248  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   249  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   250  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   251  }
   252  
   253  func (s *ValidateToolsMetadataSuite) TestMajorMinorVersionMatch(c *gc.C) {
   254  	s.makeLocalMetadata(c, "released", "1.12.1", "region-2", "raring", "some-auth-url")
   255  	ctx := coretesting.Context(c)
   256  	code := cmd.Main(
   257  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{
   258  			"-p", "openstack", "-s", "raring", "-r", "region-2",
   259  			"-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"},
   260  	)
   261  	c.Assert(code, gc.Equals, 0)
   262  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   263  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   264  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   265  }
   266  
   267  func (s *ValidateToolsMetadataSuite) TestJustDirectory(c *gc.C) {
   268  	s.makeLocalMetadata(c, "released", version.Current.Number.String(), "region-2", "raring", "some-auth-url")
   269  	ctx := coretesting.Context(c)
   270  	code := cmd.Main(
   271  		envcmd.Wrap(&ValidateToolsMetadataCommand{}), ctx, []string{"-s", "raring", "-d", s.metadataDir},
   272  	)
   273  	c.Assert(code, gc.Equals, 0)
   274  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   275  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   276  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   277  }