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