github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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 }