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