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: &params.Error{Message: "foo"}},
    65  		{Error: &params.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, &params.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  }