github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/cmd/juju/storage/remove_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package storage_test 5 6 import ( 7 "github.com/juju/cmd" 8 "github.com/juju/cmd/cmdtesting" 9 "github.com/juju/testing" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/apiserver/params" 14 "github.com/juju/juju/cmd/juju/storage" 15 "github.com/juju/juju/jujuclient/jujuclienttesting" 16 ) 17 18 type RemoveStorageSuite struct { 19 testing.IsolationSuite 20 } 21 22 var _ = gc.Suite(&RemoveStorageSuite{}) 23 24 func (s *RemoveStorageSuite) TestRemoveStorage(c *gc.C) { 25 fake := fakeStorageRemover{results: []params.ErrorResult{ 26 {}, 27 {}, 28 }} 29 cmd := storage.NewRemoveStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 30 ctx, err := cmdtesting.RunCommand(c, cmd, "pgdata/0", "pgdata/1") 31 c.Assert(err, jc.ErrorIsNil) 32 fake.CheckCallNames(c, "NewStorageRemoverCloser", "Remove", "Close") 33 fake.CheckCall(c, 1, "Remove", []string{"pgdata/0", "pgdata/1"}, false, true) 34 c.Assert(cmdtesting.Stderr(ctx), gc.Equals, ` 35 removing pgdata/0 36 removing pgdata/1 37 `[1:]) 38 } 39 40 func (s *RemoveStorageSuite) TestRemoveStorageForce(c *gc.C) { 41 fake := fakeStorageRemover{results: []params.ErrorResult{ 42 {}, 43 {}, 44 }} 45 cmd := storage.NewRemoveStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 46 _, err := cmdtesting.RunCommand(c, cmd, "--force", "pgdata/0", "pgdata/1") 47 c.Assert(err, jc.ErrorIsNil) 48 fake.CheckCall(c, 1, "Remove", []string{"pgdata/0", "pgdata/1"}, true, true) 49 } 50 51 func (s *RemoveStorageSuite) TestRemoveStorageNoDestroy(c *gc.C) { 52 fake := fakeStorageRemover{results: []params.ErrorResult{ 53 {}, 54 {}, 55 }} 56 cmd := storage.NewRemoveStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 57 _, err := cmdtesting.RunCommand(c, cmd, "--no-destroy", "--force", "pgdata/0", "pgdata/1") 58 c.Assert(err, jc.ErrorIsNil) 59 fake.CheckCall(c, 1, "Remove", []string{"pgdata/0", "pgdata/1"}, true, false) 60 } 61 62 func (s *RemoveStorageSuite) TestRemoveStorageError(c *gc.C) { 63 fake := fakeStorageRemover{results: []params.ErrorResult{ 64 {Error: ¶ms.Error{Message: "foo"}}, 65 {Error: ¶ms.Error{Message: "storage is attached", Code: params.CodeStorageAttached}}, 66 }} 67 removeCmd := storage.NewRemoveStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 68 ctx, err := cmdtesting.RunCommand(c, removeCmd, "pgdata/0", "pgdata/1") 69 stderr := cmdtesting.Stderr(ctx) 70 c.Assert(stderr, gc.Equals, `failed to remove pgdata/0: foo 71 failed to remove pgdata/1: storage is attached 72 73 Use the --force option to remove attached storage, or use 74 "juju detach-storage" to explicitly detach the storage 75 before removing. 76 `) 77 c.Assert(err, gc.Equals, cmd.ErrSilent) 78 } 79 80 func (s *RemoveStorageSuite) TestRemoveStorageUnauthorizedError(c *gc.C) { 81 var fake fakeStorageRemover 82 fake.SetErrors(nil, ¶ms.Error{Code: params.CodeUnauthorized, Message: "nope"}) 83 cmd := storage.NewRemoveStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 84 ctx, err := cmdtesting.RunCommand(c, cmd, "pgdata/0") 85 c.Assert(err, gc.ErrorMatches, "nope") 86 c.Assert(cmdtesting.Stderr(ctx), gc.Equals, ` 87 You do not have permission to remove storage. 88 You may ask an administrator to grant you access with "juju grant". 89 90 `) 91 } 92 93 func (s *RemoveStorageSuite) TestRemoveStorageInitErrors(c *gc.C) { 94 s.testRemoveStorageInitError(c, []string{}, "remove-storage requires at least one storage ID") 95 } 96 97 func (s *RemoveStorageSuite) testRemoveStorageInitError(c *gc.C, args []string, expect string) { 98 var fake fakeStorageRemover 99 cmd := storage.NewRemoveStorageCommandForTest(fake.new, jujuclienttesting.MinimalStore()) 100 _, err := cmdtesting.RunCommand(c, cmd, args...) 101 c.Assert(err, gc.ErrorMatches, expect) 102 } 103 104 type fakeStorageRemover struct { 105 testing.Stub 106 results []params.ErrorResult 107 } 108 109 func (f *fakeStorageRemover) new() (storage.StorageRemoverCloser, error) { 110 f.MethodCall(f, "NewStorageRemoverCloser") 111 return f, f.NextErr() 112 } 113 114 func (f *fakeStorageRemover) Close() error { 115 f.MethodCall(f, "Close") 116 return f.NextErr() 117 } 118 119 func (f *fakeStorageRemover) Remove(ids []string, destroyAttached, destroyStorage bool) ([]params.ErrorResult, error) { 120 f.MethodCall(f, "Remove", ids, destroyAttached, destroyStorage) 121 return f.results, f.NextErr() 122 }