github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/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  	"launchpad.net/juju-core/cmd"
    14  	"launchpad.net/juju-core/environs/filestorage"
    15  	"launchpad.net/juju-core/environs/tools"
    16  	coretesting "launchpad.net/juju-core/testing"
    17  	"launchpad.net/juju-core/testing/testbase"
    18  	"launchpad.net/juju-core/version"
    19  )
    20  
    21  type ValidateToolsMetadataSuite struct {
    22  	testbase.LoggingSuite
    23  	home        *coretesting.FakeHome
    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, &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(&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, 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, gc.IsNil)
    82  	err = tools.WriteMetadata(targetStorage, tm, false)
    83  	if err != nil {
    84  		return err
    85  	}
    86  	return nil
    87  }
    88  
    89  func (s *ValidateToolsMetadataSuite) SetUpTest(c *gc.C) {
    90  	s.LoggingSuite.SetUpTest(c)
    91  	s.home = coretesting.MakeFakeHome(c, metadataTestEnvConfig)
    92  	s.metadataDir = c.MkDir()
    93  	restore := testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "access")
    94  	s.AddCleanup(func(*gc.C) { restore() })
    95  	restore = testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "secret")
    96  	s.AddCleanup(func(*gc.C) { restore() })
    97  }
    98  
    99  func (s *ValidateToolsMetadataSuite) TearDownTest(c *gc.C) {
   100  	s.home.Restore()
   101  	s.LoggingSuite.TearDownTest(c)
   102  }
   103  
   104  func (s *ValidateToolsMetadataSuite) setupEc2LocalMetadata(c *gc.C, region string) {
   105  	ec2Region, ok := aws.Regions[region]
   106  	if !ok {
   107  		c.Fatalf("unknown ec2 region %q", region)
   108  	}
   109  	endpoint := ec2Region.EC2Endpoint
   110  	s.makeLocalMetadata(c, "1.11.4", region, "precise", endpoint)
   111  }
   112  
   113  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingEnvironment(c *gc.C) {
   114  	s.setupEc2LocalMetadata(c, "us-east-1")
   115  	ctx := coretesting.Context(c)
   116  	code := cmd.Main(
   117  		&ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4", "-d", s.metadataDir},
   118  	)
   119  	c.Assert(code, gc.Equals, 0)
   120  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   121  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   122  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   123  }
   124  
   125  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataUsingIncompleteEnvironment(c *gc.C) {
   126  	testbase.PatchEnvironment("AWS_ACCESS_KEY_ID", "")
   127  	testbase.PatchEnvironment("AWS_SECRET_ACCESS_KEY", "")
   128  	s.setupEc2LocalMetadata(c, "us-east-1")
   129  	ctx := coretesting.Context(c)
   130  	code := cmd.Main(
   131  		&ValidateToolsMetadataCommand{}, ctx, []string{"-e", "ec2", "-j", "1.11.4"},
   132  	)
   133  	c.Assert(code, gc.Equals, 1)
   134  	errOut := ctx.Stderr.(*bytes.Buffer).String()
   135  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   136  	c.Check(strippedOut, gc.Matches, `error: environment has no access-key or secret-key`)
   137  }
   138  
   139  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataWithManualParams(c *gc.C) {
   140  	s.setupEc2LocalMetadata(c, "us-west-1")
   141  	ctx := coretesting.Context(c)
   142  	code := cmd.Main(
   143  		&ValidateToolsMetadataCommand{}, ctx, []string{
   144  			"-p", "ec2", "-s", "precise", "-r", "us-west-1", "-j", "1.11.4",
   145  			"-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
   146  	)
   147  	c.Assert(code, gc.Equals, 0)
   148  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   149  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   150  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   151  }
   152  
   153  func (s *ValidateToolsMetadataSuite) TestEc2LocalMetadataNoMatch(c *gc.C) {
   154  	s.setupEc2LocalMetadata(c, "us-east-1")
   155  	ctx := coretesting.Context(c)
   156  	code := cmd.Main(
   157  		&ValidateToolsMetadataCommand{}, ctx, []string{
   158  			"-p", "ec2", "-s", "raring", "-r", "us-west-1",
   159  			"-u", "https://ec2.us-west-1.amazonaws.com", "-d", s.metadataDir},
   160  	)
   161  	c.Assert(code, gc.Equals, 1)
   162  	code = cmd.Main(
   163  		&ValidateToolsMetadataCommand{}, ctx, []string{
   164  			"-p", "ec2", "-s", "precise", "-r", "region",
   165  			"-u", "https://ec2.region.amazonaws.com", "-d", s.metadataDir},
   166  	)
   167  	c.Assert(code, gc.Equals, 1)
   168  	errOut := ctx.Stderr.(*bytes.Buffer).String()
   169  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   170  	c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`)
   171  }
   172  
   173  func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataWithManualParams(c *gc.C) {
   174  	s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")
   175  	ctx := coretesting.Context(c)
   176  	code := cmd.Main(
   177  		&ValidateToolsMetadataCommand{}, ctx, []string{
   178  			"-p", "openstack", "-s", "raring", "-r", "region-2", "-j", "1.11.4",
   179  			"-u", "some-auth-url", "-d", s.metadataDir},
   180  	)
   181  	c.Assert(code, gc.Equals, 0)
   182  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   183  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   184  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   185  }
   186  
   187  func (s *ValidateToolsMetadataSuite) TestOpenstackLocalMetadataNoMatch(c *gc.C) {
   188  	s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")
   189  	ctx := coretesting.Context(c)
   190  	code := cmd.Main(
   191  		&ValidateToolsMetadataCommand{}, ctx, []string{
   192  			"-p", "openstack", "-s", "precise", "-r", "region-2",
   193  			"-u", "some-auth-url", "-d", s.metadataDir},
   194  	)
   195  	c.Assert(code, gc.Equals, 1)
   196  	code = cmd.Main(
   197  		&ValidateToolsMetadataCommand{}, ctx, []string{
   198  			"-p", "openstack", "-s", "raring", "-r", "region-3",
   199  			"-u", "some-auth-url", "-d", s.metadataDir},
   200  	)
   201  	c.Assert(code, gc.Equals, 1)
   202  	errOut := ctx.Stderr.(*bytes.Buffer).String()
   203  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   204  	c.Check(strippedOut, gc.Matches, `.*Resolve Metadata:.*`)
   205  }
   206  
   207  func (s *ValidateToolsMetadataSuite) TestDefaultVersion(c *gc.C) {
   208  	s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url")
   209  	ctx := coretesting.Context(c)
   210  	code := cmd.Main(
   211  		&ValidateToolsMetadataCommand{}, ctx, []string{
   212  			"-p", "openstack", "-s", "raring", "-r", "region-2",
   213  			"-u", "some-auth-url", "-d", s.metadataDir},
   214  	)
   215  	c.Assert(code, gc.Equals, 0)
   216  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   217  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   218  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   219  }
   220  
   221  func (s *ValidateToolsMetadataSuite) TestMajorVersionMatch(c *gc.C) {
   222  	s.makeLocalMetadata(c, "1.11.4", "region-2", "raring", "some-auth-url")
   223  	ctx := coretesting.Context(c)
   224  	code := cmd.Main(
   225  		&ValidateToolsMetadataCommand{}, ctx, []string{
   226  			"-p", "openstack", "-s", "raring", "-r", "region-2",
   227  			"-u", "some-auth-url", "-d", s.metadataDir, "-m", "1"},
   228  	)
   229  	c.Assert(code, gc.Equals, 0)
   230  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   231  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   232  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   233  }
   234  
   235  func (s *ValidateToolsMetadataSuite) TestMajorMinorVersionMatch(c *gc.C) {
   236  	s.makeLocalMetadata(c, "1.12.1", "region-2", "raring", "some-auth-url")
   237  	ctx := coretesting.Context(c)
   238  	code := cmd.Main(
   239  		&ValidateToolsMetadataCommand{}, ctx, []string{
   240  			"-p", "openstack", "-s", "raring", "-r", "region-2",
   241  			"-u", "some-auth-url", "-d", s.metadataDir, "-m", "1.12"},
   242  	)
   243  	c.Assert(code, gc.Equals, 0)
   244  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   245  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   246  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   247  }
   248  
   249  func (s *ValidateToolsMetadataSuite) TestJustDirectory(c *gc.C) {
   250  	s.makeLocalMetadata(c, version.Current.Number.String(), "region-2", "raring", "some-auth-url")
   251  	ctx := coretesting.Context(c)
   252  	code := cmd.Main(
   253  		&ValidateToolsMetadataCommand{}, ctx, []string{"-s", "raring", "-d", s.metadataDir},
   254  	)
   255  	c.Assert(code, gc.Equals, 0)
   256  	errOut := ctx.Stdout.(*bytes.Buffer).String()
   257  	strippedOut := strings.Replace(errOut, "\n", "", -1)
   258  	c.Check(strippedOut, gc.Matches, `Matching Tools Versions:.*Resolve Metadata.*`)
   259  }