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 }