github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/featuretests/cmd_juju_resources_test.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package featuretests
     5  
     6  import (
     7  	"io/ioutil"
     8  	"path/filepath"
     9  	"strings"
    10  
    11  	"github.com/juju/cmd/cmdtesting"
    12  	"github.com/juju/testing"
    13  	jc "github.com/juju/testing/checkers"
    14  	gc "gopkg.in/check.v1"
    15  	charmresource "gopkg.in/juju/charm.v6/resource"
    16  
    17  	"github.com/juju/juju/charmstore"
    18  	"github.com/juju/juju/cmd/juju/resource"
    19  	coretesting "github.com/juju/juju/juju/testing"
    20  	"github.com/juju/juju/state"
    21  	"github.com/juju/juju/testing/factory"
    22  )
    23  
    24  type ResourcesCmdSuite struct {
    25  	coretesting.JujuConnSuite
    26  
    27  	appOne *state.Application
    28  
    29  	charmName   string
    30  	appOneName  string
    31  	unitOneName string
    32  
    33  	client *stubCharmStore
    34  }
    35  
    36  func (s *ResourcesCmdSuite) SetUpTest(c *gc.C) {
    37  	s.JujuConnSuite.SetUpTest(c)
    38  
    39  	s.charmName = "starsay"
    40  	s.appOneName = "app1"
    41  	charmOne := s.AddTestingCharm(c, s.charmName)
    42  
    43  	s.appOne = s.Factory.MakeApplication(c, &factory.ApplicationParams{
    44  		Name:  s.appOneName,
    45  		Charm: charmOne,
    46  	})
    47  	unitOne := s.Factory.MakeUnit(c, &factory.UnitParams{
    48  		Application: s.appOne,
    49  		SetCharmURL: true,
    50  	})
    51  	s.unitOneName = unitOne.Name()
    52  
    53  	s.client = &stubCharmStore{
    54  		stub: &testing.Stub{},
    55  		listResources: func() [][]charmresource.Resource {
    56  			metas := charmOne.Meta().Resources
    57  			rs := []charmresource.Resource{}
    58  			for n, meta := range metas {
    59  				rs = append(rs, charmRes(c, n, meta))
    60  			}
    61  			return [][]charmresource.Resource{rs}
    62  		},
    63  	}
    64  
    65  }
    66  
    67  // This test only verifies that component-based resources commands don't panic.
    68  func (s *ResourcesCmdSuite) TestResourcesCommands(c *gc.C) {
    69  	// check "juju charm-resources..."
    70  	s.runCharmResourcesCommand(c)
    71  
    72  	// check "juju resources <application>"
    73  	context, err := runCommand(c, "resources", s.appOneName)
    74  	c.Assert(err, jc.ErrorIsNil)
    75  	c.Assert(cmdtesting.Stderr(context), gc.Equals, "")
    76  	c.Assert(cmdtesting.Stdout(context), jc.Contains, `
    77  Resource          Supplied by  Revision
    78  install-resource  upload       -
    79  store-resource    upload       -
    80  upload-resource   upload       -
    81  
    82  `[1:])
    83  
    84  	// check "juju resources <unit>"
    85  	context, err = runCommand(c, "resources", s.unitOneName)
    86  	c.Assert(err, jc.ErrorIsNil)
    87  	c.Assert(cmdtesting.Stderr(context), gc.Equals, "")
    88  	c.Assert(cmdtesting.Stdout(context), gc.Equals, `
    89  Resource          Revision
    90  install-resource  -
    91  store-resource    -
    92  upload-resource   -
    93  
    94  `[1:])
    95  
    96  	// check "juju attach-resource"
    97  	context, err = runCommand(c, "attach-resource", s.appOneName, "install-resource=oops")
    98  	c.Assert(err, gc.ErrorMatches, "cmd: error out silently")
    99  	c.Assert(cmdtesting.Stderr(context), jc.Contains, `ERROR failed to upload resource "install-resource": open oops: no such file or directory`)
   100  	c.Assert(cmdtesting.Stdout(context), gc.Equals, "")
   101  
   102  	// Empty files are fine.
   103  	filename := filepath.Join(c.MkDir(), "empty.txt")
   104  	err = ioutil.WriteFile(filename, []byte{}, 0755)
   105  	c.Assert(err, jc.ErrorIsNil)
   106  	_, err = runCommand(c, "attach-resource", s.appOneName, "install-resource="+filename)
   107  	c.Check(err, jc.ErrorIsNil)
   108  }
   109  
   110  func (s *ResourcesCmdSuite) runCharmResourcesCommand(c *gc.C) {
   111  	context, err := cmdtesting.RunCommand(c, resource.NewCharmResourcesCommand(s.client), s.charmName)
   112  	c.Assert(err, jc.ErrorIsNil)
   113  	c.Assert(cmdtesting.Stderr(context), gc.Equals, "")
   114  	c.Assert(cmdtesting.Stdout(context), gc.Equals, `
   115  Resource          Revision
   116  install-resource  1
   117  store-resource    1
   118  upload-resource   1
   119  
   120  `[1:])
   121  	s.client.stub.CheckCallNames(c, "ListResources")
   122  }
   123  
   124  type stubCharmStore struct {
   125  	stub *testing.Stub
   126  
   127  	listResources func() [][]charmresource.Resource
   128  }
   129  
   130  func (s *stubCharmStore) ListResources(charms []charmstore.CharmID) ([][]charmresource.Resource, error) {
   131  	s.stub.AddCall("ListResources", charms)
   132  	return s.listResources(), s.stub.NextErr()
   133  }
   134  
   135  func charmRes(c *gc.C, name string, meta charmresource.Meta) charmresource.Resource {
   136  	content := name
   137  	fp, err := charmresource.GenerateFingerprint(strings.NewReader(content))
   138  	c.Assert(err, jc.ErrorIsNil)
   139  
   140  	res := charmresource.Resource{
   141  		Meta:        meta,
   142  		Origin:      charmresource.OriginStore,
   143  		Revision:    1,
   144  		Fingerprint: fp,
   145  		Size:        int64(len(content)),
   146  	}
   147  	err = res.Validate()
   148  	c.Assert(err, jc.ErrorIsNil)
   149  	return res
   150  }