github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/apiserver/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.blockDestroyEnvironment(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.state.addStorageForUnit = func(u names.UnitTag, name string, cons state.StorageConstraints) error {
    93  		s.calls = append(s.calls, addStorageForUnitCall)
    94  		return 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.state.addStorageForUnit = func(u names.UnitTag, name string, cons state.StorageConstraints) error {
   122  		s.calls = append(s.calls, addStorageForUnitCall)
   123  		if name == "" {
   124  			return errors.Errorf(msg)
   125  		}
   126  		return nil
   127  	}
   128  	failures, err := s.api.AddToUnit(params.StoragesAddParams{
   129  		[]params.StorageAddParams{
   130  			wrong0,
   131  			right,
   132  			wrong1}})
   133  	c.Assert(err, jc.ErrorIsNil)
   134  	c.Assert(failures.Results, gc.HasLen, 3)
   135  	c.Assert(failures.Results[0].Error.Error(), gc.Matches, ".*is not a valid tag.*")
   136  	c.Assert(failures.Results[1].Error, gc.IsNil)
   137  	c.Assert(failures.Results[2].Error.Error(), gc.Matches, fmt.Sprintf(".*%v.*", msg))
   138  
   139  	s.assertCalls(c, []string{getBlockForTypeCall, addStorageForUnitCall, addStorageForUnitCall})
   140  }
   141  
   142  func (s *storageAddSuite) TestStorageAddUnitNotFoundErr(c *gc.C) {
   143  	msg := "sanity"
   144  	s.state.addStorageForUnit = func(u names.UnitTag, name string, cons state.StorageConstraints) error {
   145  		s.calls = append(s.calls, addStorageForUnitCall)
   146  		return errors.NotFoundf(msg)
   147  	}
   148  
   149  	args := params.StorageAddParams{
   150  		UnitTag:     s.unitTag.String(),
   151  		StorageName: "data",
   152  	}
   153  	failures, err := s.api.AddToUnit(params.StoragesAddParams{[]params.StorageAddParams{args}})
   154  	c.Assert(err, jc.ErrorIsNil)
   155  	c.Assert(failures.Results, gc.HasLen, 1)
   156  	c.Assert(failures.Results[0].Error.Error(), gc.Matches, "sanity not found")
   157  	c.Assert(failures.Results[0].Error, jc.Satisfies, params.IsCodeNotFound)
   158  }