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