github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/storage/storageadd_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package storage_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/names.v2"
    13  
    14  	"github.com/juju/juju/apiserver/params"
    15  	"github.com/juju/juju/state"
    16  )
    17  
    18  type storageAddSuite struct {
    19  	baseStorageSuite
    20  }
    21  
    22  var _ = gc.Suite(&storageAddSuite{})
    23  
    24  func (s *storageAddSuite) assertStorageAddedNoErrors(c *gc.C, args params.StorageAddParams) {
    25  	s.assertStoragesAddedNoErrors(c,
    26  		params.StoragesAddParams{[]params.StorageAddParams{args}},
    27  	)
    28  }
    29  
    30  func (s *storageAddSuite) assertStoragesAddedNoErrors(c *gc.C, args params.StoragesAddParams) {
    31  	failures, err := s.api.AddToUnit(args)
    32  	c.Assert(err, jc.ErrorIsNil)
    33  	c.Assert(failures.Results, gc.HasLen, len(args.Storages))
    34  	for _, one := range failures.Results {
    35  		c.Assert(one.Error, gc.IsNil)
    36  	}
    37  }
    38  
    39  func (s *storageAddSuite) TestStorageAddEmpty(c *gc.C) {
    40  	s.assertStoragesAddedNoErrors(c, params.StoragesAddParams{Storages: nil})
    41  	s.assertStoragesAddedNoErrors(c, params.StoragesAddParams{Storages: []params.StorageAddParams{}})
    42  }
    43  
    44  func (s *storageAddSuite) TestStorageAddUnit(c *gc.C) {
    45  	args := params.StorageAddParams{
    46  		UnitTag:     s.unitTag.String(),
    47  		StorageName: "data",
    48  	}
    49  	s.assertStorageAddedNoErrors(c, args)
    50  	s.assertCalls(c, []string{getBlockForTypeCall, addStorageForUnitCall})
    51  }
    52  
    53  func (s *storageAddSuite) TestStorageAddUnitBlocked(c *gc.C) {
    54  	s.blockAllChanges(c, "TestStorageAddUnitBlocked")
    55  
    56  	args := params.StorageAddParams{
    57  		UnitTag:     s.unitTag.String(),
    58  		StorageName: "data",
    59  	}
    60  	_, err := s.api.AddToUnit(params.StoragesAddParams{[]params.StorageAddParams{args}})
    61  	s.assertBlocked(c, err, "TestStorageAddUnitBlocked")
    62  }
    63  
    64  func (s *storageAddSuite) TestStorageAddUnitDestroyIgnored(c *gc.C) {
    65  	s.blockDestroyModel(c, "TestStorageAddUnitDestroyIgnored")
    66  	s.blockRemoveObject(c, "TestStorageAddUnitDestroyIgnored")
    67  
    68  	args := params.StorageAddParams{
    69  		UnitTag:     s.unitTag.String(),
    70  		StorageName: "data",
    71  	}
    72  	s.assertStorageAddedNoErrors(c, args)
    73  	s.assertCalls(c, []string{getBlockForTypeCall, addStorageForUnitCall})
    74  }
    75  
    76  func (s *storageAddSuite) TestStorageAddUnitInvalidName(c *gc.C) {
    77  	args := params.StorageAddParams{
    78  		UnitTag:     "invalid-unit-name",
    79  		StorageName: "data",
    80  	}
    81  	failures, err := s.api.AddToUnit(params.StoragesAddParams{[]params.StorageAddParams{args}})
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(failures.Results, gc.HasLen, 1)
    84  	c.Assert(failures.Results[0].Error.Error(), gc.Matches, "\"invalid-unit-name\" is not a valid tag")
    85  
    86  	expectedCalls := []string{getBlockForTypeCall}
    87  	s.assertCalls(c, expectedCalls)
    88  }
    89  
    90  func (s *storageAddSuite) TestStorageAddUnitStateError(c *gc.C) {
    91  	msg := "add test directive error"
    92  	s.storageAccessor.addStorageForUnit = func(u names.UnitTag, name string, cons state.StorageConstraints) ([]names.StorageTag, error) {
    93  		s.stub.AddCall(addStorageForUnitCall)
    94  		return nil, errors.Errorf(msg)
    95  	}
    96  
    97  	args := params.StorageAddParams{
    98  		UnitTag:     s.unitTag.String(),
    99  		StorageName: "data",
   100  	}
   101  	failures, err := s.api.AddToUnit(params.StoragesAddParams{[]params.StorageAddParams{args}})
   102  	c.Assert(err, jc.ErrorIsNil)
   103  	c.Assert(failures.Results, gc.HasLen, 1)
   104  	c.Assert(failures.Results[0].Error.Error(), gc.Matches, fmt.Sprintf(".*%v.*", msg))
   105  
   106  	s.assertCalls(c, []string{getBlockForTypeCall, addStorageForUnitCall})
   107  }
   108  
   109  func (s *storageAddSuite) TestStorageAddUnitResultOrder(c *gc.C) {
   110  	wrong0 := params.StorageAddParams{
   111  		StorageName: "data",
   112  	}
   113  	right := params.StorageAddParams{
   114  		UnitTag:     s.unitTag.String(),
   115  		StorageName: "data",
   116  	}
   117  	wrong1 := params.StorageAddParams{
   118  		UnitTag: s.unitTag.String(),
   119  	}
   120  	msg := "storage name missing error"
   121  	s.storageAccessor.addStorageForUnit = func(u names.UnitTag, name string, cons state.StorageConstraints) ([]names.StorageTag, error) {
   122  		s.stub.AddCall(addStorageForUnitCall)
   123  		if name == "" {
   124  			return nil, errors.Errorf(msg)
   125  		}
   126  		return nil, nil
   127  	}
   128  	failures, err := s.api.AddToUnit(params.StoragesAddParams{
   129  		[]params.StorageAddParams{
   130  			wrong0,
   131  			right,
   132  			wrong1,
   133  		}},
   134  	)
   135  	c.Assert(err, jc.ErrorIsNil)
   136  	c.Assert(failures.Results, gc.HasLen, 3)
   137  	c.Assert(failures.Results[0].Error.Error(), gc.Matches, ".*is not a valid tag.*")
   138  	c.Assert(failures.Results[1].Error, gc.IsNil)
   139  	c.Assert(failures.Results[2].Error.Error(), gc.Matches, fmt.Sprintf(".*%v.*", msg))
   140  
   141  	s.assertCalls(c, []string{getBlockForTypeCall, addStorageForUnitCall, addStorageForUnitCall})
   142  }
   143  
   144  func (s *storageAddSuite) TestStorageAddUnitTags(c *gc.C) {
   145  	tags := []names.StorageTag{names.NewStorageTag("foo/0"), names.NewStorageTag("foo/1")}
   146  	s.storageAccessor.addStorageForUnit = func(u names.UnitTag, name string, cons state.StorageConstraints) ([]names.StorageTag, error) {
   147  		return tags, nil
   148  	}
   149  
   150  	args := params.StorageAddParams{
   151  		UnitTag:     s.unitTag.String(),
   152  		StorageName: "data",
   153  	}
   154  	results, err := s.api.AddToUnit(params.StoragesAddParams{[]params.StorageAddParams{args}})
   155  	c.Assert(err, jc.ErrorIsNil)
   156  	c.Assert(results.Results, jc.DeepEquals, []params.AddStorageResult{{
   157  		Result: &params.AddStorageDetails{
   158  			StorageTags: []string{"storage-foo-0", "storage-foo-1"},
   159  		},
   160  	}})
   161  }
   162  
   163  func (s *storageAddSuite) TestStorageAddUnitNotFoundErr(c *gc.C) {
   164  	msg := "sanity"
   165  	s.storageAccessor.addStorageForUnit = func(u names.UnitTag, name string, cons state.StorageConstraints) ([]names.StorageTag, error) {
   166  		s.stub.AddCall(addStorageForUnitCall)
   167  		return nil, errors.NotFoundf(msg)
   168  	}
   169  
   170  	args := params.StorageAddParams{
   171  		UnitTag:     s.unitTag.String(),
   172  		StorageName: "data",
   173  	}
   174  	failures, err := s.api.AddToUnit(params.StoragesAddParams{[]params.StorageAddParams{args}})
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	c.Assert(failures.Results, gc.HasLen, 1)
   177  	c.Assert(failures.Results[0].Error.Error(), gc.Matches, "sanity not found")
   178  	c.Assert(failures.Results[0].Error, jc.Satisfies, params.IsCodeNotFound)
   179  }