github.com/Pankov404/juju@v0.0.0-20150703034450-be266991dceb/apiserver/storage/volumelist_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 "github.com/juju/errors" 8 "github.com/juju/names" 9 jc "github.com/juju/testing/checkers" 10 gc "gopkg.in/check.v1" 11 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/apiserver/storage" 14 "github.com/juju/juju/state" 15 ) 16 17 type volumeSuite struct { 18 baseStorageSuite 19 } 20 21 var _ = gc.Suite(&volumeSuite{}) 22 23 func (s *volumeSuite) TestGroupAttachmentsByVolumeEmpty(c *gc.C) { 24 c.Assert(storage.GroupAttachmentsByVolume(nil), gc.IsNil) 25 c.Assert(storage.GroupAttachmentsByVolume([]state.VolumeAttachment{}), gc.IsNil) 26 } 27 28 func (s *volumeSuite) TestGroupAttachmentsByVolume(c *gc.C) { 29 volumeTag1 := names.NewVolumeTag("0") 30 volumeTag2 := names.NewVolumeTag("0/1") 31 machineTag := names.NewMachineTag("0") 32 attachments := []state.VolumeAttachment{ 33 &mockVolumeAttachment{VolumeTag: volumeTag1, MachineTag: machineTag}, 34 &mockVolumeAttachment{VolumeTag: volumeTag2, MachineTag: machineTag}, 35 &mockVolumeAttachment{VolumeTag: volumeTag2, MachineTag: machineTag}, 36 } 37 expected := map[string][]params.VolumeAttachment{ 38 volumeTag1.String(): { 39 storage.ConvertStateVolumeAttachmentToParams(attachments[0])}, 40 volumeTag2.String(): { 41 storage.ConvertStateVolumeAttachmentToParams(attachments[1]), 42 storage.ConvertStateVolumeAttachmentToParams(attachments[2]), 43 }, 44 } 45 c.Assert( 46 storage.GroupAttachmentsByVolume(attachments), 47 jc.DeepEquals, 48 expected) 49 } 50 51 func (s *volumeSuite) TestCreateVolumeItemInvalidTag(c *gc.C) { 52 found := storage.CreateVolumeItem(s.api, "666", nil) 53 c.Assert(found.Error, gc.ErrorMatches, ".*not a valid tag.*") 54 } 55 56 func (s *volumeSuite) TestCreateVolumeItemNonexistingVolume(c *gc.C) { 57 s.state.volume = func(tag names.VolumeTag) (state.Volume, error) { 58 return s.volume, errors.Errorf("not volume for tag %v", tag) 59 } 60 found := storage.CreateVolumeItem(s.api, names.NewVolumeTag("666").String(), nil) 61 c.Assert(found.Error, gc.ErrorMatches, ".*volume for tag.*") 62 } 63 64 func (s *volumeSuite) TestCreateVolumeItemNoUnit(c *gc.C) { 65 s.storageInstance.owner = names.NewServiceTag("test-service") 66 found := storage.CreateVolumeItem(s.api, s.volumeTag.String(), nil) 67 c.Assert(found.Error, gc.IsNil) 68 c.Assert(found.Error, gc.IsNil) 69 expected, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 70 c.Assert(err, jc.ErrorIsNil) 71 c.Assert(found.Volume, gc.DeepEquals, expected) 72 } 73 74 func (s *volumeSuite) TestCreateVolumeItemNoStorageInstance(c *gc.C) { 75 s.volume = &mockVolume{tag: s.volumeTag, hasNoStorage: true} 76 found := storage.CreateVolumeItem(s.api, s.volumeTag.String(), nil) 77 c.Assert(found.Error, gc.IsNil) 78 c.Assert(found.Error, gc.IsNil) 79 expected, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 80 c.Assert(err, jc.ErrorIsNil) 81 c.Assert(found.Volume, gc.DeepEquals, expected) 82 } 83 84 func (s *volumeSuite) TestCreateVolumeItem(c *gc.C) { 85 found := storage.CreateVolumeItem(s.api, s.volumeTag.String(), nil) 86 c.Assert(found.Error, gc.IsNil) 87 c.Assert(found.Error, gc.IsNil) 88 expected, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 89 c.Assert(err, jc.ErrorIsNil) 90 c.Assert(found.Volume, gc.DeepEquals, expected) 91 } 92 93 func (s *volumeSuite) TestGetVolumeItemsEmpty(c *gc.C) { 94 c.Assert(storage.GetVolumeItems(s.api, nil), gc.IsNil) 95 c.Assert(storage.GetVolumeItems(s.api, []state.VolumeAttachment{}), gc.IsNil) 96 } 97 98 func (s *volumeSuite) TestGetVolumeItems(c *gc.C) { 99 machineTag := names.NewMachineTag("0") 100 attachments := []state.VolumeAttachment{ 101 &mockVolumeAttachment{VolumeTag: s.volumeTag, MachineTag: machineTag}, 102 &mockVolumeAttachment{VolumeTag: s.volumeTag, MachineTag: machineTag}, 103 } 104 expectedVolume, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 105 c.Assert(err, jc.ErrorIsNil) 106 expected := []params.VolumeItem{ 107 params.VolumeItem{ 108 Volume: expectedVolume, 109 Attachments: storage.ConvertStateVolumeAttachmentsToParams(attachments)}, 110 } 111 c.Assert( 112 storage.GetVolumeItems(s.api, attachments), 113 jc.DeepEquals, 114 expected) 115 } 116 117 func (s *volumeSuite) TestFilterVolumesNoItems(c *gc.C) { 118 s.state.machineVolumeAttachments = 119 func(machine names.MachineTag) ([]state.VolumeAttachment, error) { 120 return nil, nil 121 } 122 filter := params.VolumeFilter{ 123 Machines: []string{s.machineTag.String()}} 124 125 c.Assert(storage.FilterVolumes(s.api, filter), gc.IsNil) 126 } 127 128 func (s *volumeSuite) TestFilterVolumesErrorMachineAttachments(c *gc.C) { 129 s.state.machineVolumeAttachments = 130 func(machine names.MachineTag) ([]state.VolumeAttachment, error) { 131 return nil, errors.Errorf("not for machine %v", machine) 132 } 133 filter := params.VolumeFilter{ 134 Machines: []string{s.machineTag.String()}} 135 136 found := storage.FilterVolumes(s.api, filter) 137 c.Assert(found, gc.HasLen, 1) 138 c.Assert(found[0].Error, gc.ErrorMatches, ".*for machine.*") 139 } 140 141 func (s *volumeSuite) TestFilterVolumes(c *gc.C) { 142 filter := params.VolumeFilter{ 143 Machines: []string{s.machineTag.String()}} 144 145 expectedVolume, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 146 c.Assert(err, jc.ErrorIsNil) 147 expected := params.VolumeItem{ 148 Volume: expectedVolume, 149 Attachments: storage.ConvertStateVolumeAttachmentsToParams( 150 []state.VolumeAttachment{s.volumeAttachment}, 151 ), 152 } 153 found := storage.FilterVolumes(s.api, filter) 154 c.Assert(found, gc.HasLen, 1) 155 c.Assert(found[0], gc.DeepEquals, expected) 156 } 157 158 func (s *volumeSuite) TestVolumeAttachments(c *gc.C) { 159 expectedVolume, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 160 c.Assert(err, jc.ErrorIsNil) 161 expected := params.VolumeItem{ 162 Volume: expectedVolume, 163 Attachments: storage.ConvertStateVolumeAttachmentsToParams( 164 []state.VolumeAttachment{s.volumeAttachment}, 165 ), 166 } 167 168 found := storage.VolumeAttachments(s.api, []state.Volume{s.volume}) 169 c.Assert(found, gc.HasLen, 1) 170 c.Assert(found[0], gc.DeepEquals, expected) 171 } 172 173 func (s *volumeSuite) TestVolumeAttachmentsEmpty(c *gc.C) { 174 s.state.volumeAttachments = 175 func(volume names.VolumeTag) ([]state.VolumeAttachment, error) { 176 return nil, nil 177 } 178 expectedVolume, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 179 c.Assert(err, jc.ErrorIsNil) 180 expected := params.VolumeItem{ 181 Volume: expectedVolume, 182 } 183 184 found := storage.VolumeAttachments(s.api, []state.Volume{s.volume}) 185 c.Assert(found, gc.HasLen, 1) 186 c.Assert(found[0], gc.DeepEquals, expected) 187 } 188 189 func (s *volumeSuite) TestVolumeAttachmentsError(c *gc.C) { 190 s.state.volumeAttachments = 191 func(volume names.VolumeTag) ([]state.VolumeAttachment, error) { 192 return nil, errors.Errorf("not for volume %v", volume) 193 } 194 195 found := storage.VolumeAttachments(s.api, []state.Volume{s.volume}) 196 c.Assert(found, gc.HasLen, 1) 197 c.Assert(found[0].Error, gc.ErrorMatches, ".*for volume.*") 198 } 199 200 func (s *volumeSuite) TestListVolumeAttachmentsEmpty(c *gc.C) { 201 s.state.allVolumes = 202 func() ([]state.Volume, error) { 203 return nil, nil 204 } 205 items, err := storage.ListVolumeAttachments(s.api) 206 c.Assert(err, jc.ErrorIsNil) 207 c.Assert(items, gc.IsNil) 208 } 209 210 func (s *volumeSuite) TestListVolumeAttachmentsError(c *gc.C) { 211 msg := "inventing error" 212 s.state.allVolumes = 213 func() ([]state.Volume, error) { 214 return nil, errors.New(msg) 215 } 216 items, err := storage.ListVolumeAttachments(s.api) 217 c.Assert(errors.Cause(err), gc.ErrorMatches, msg) 218 c.Assert(items, gc.IsNil) 219 } 220 221 func (s *volumeSuite) TestListVolumeAttachments(c *gc.C) { 222 expectedVolume, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 223 c.Assert(err, jc.ErrorIsNil) 224 expected := params.VolumeItem{ 225 Volume: expectedVolume, 226 Attachments: storage.ConvertStateVolumeAttachmentsToParams( 227 []state.VolumeAttachment{s.volumeAttachment}, 228 ), 229 } 230 231 items, err := storage.ListVolumeAttachments(s.api) 232 c.Assert(err, jc.ErrorIsNil) 233 c.Assert(items, gc.HasLen, 1) 234 c.Assert(items[0], gc.DeepEquals, expected) 235 } 236 237 func (s *volumeSuite) TestListVolumesEmptyFilter(c *gc.C) { 238 expectedVolume, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 239 c.Assert(err, jc.ErrorIsNil) 240 expected := params.VolumeItem{ 241 Volume: expectedVolume, 242 Attachments: storage.ConvertStateVolumeAttachmentsToParams( 243 []state.VolumeAttachment{s.volumeAttachment}, 244 ), 245 } 246 found, err := s.api.ListVolumes(params.VolumeFilter{}) 247 c.Assert(err, jc.ErrorIsNil) 248 c.Assert(found.Results, gc.HasLen, 1) 249 c.Assert(found.Results[0], gc.DeepEquals, expected) 250 } 251 252 func (s *volumeSuite) TestListVolumesError(c *gc.C) { 253 msg := "inventing error" 254 s.state.allVolumes = 255 func() ([]state.Volume, error) { 256 return nil, errors.New(msg) 257 } 258 259 items, err := s.api.ListVolumes(params.VolumeFilter{}) 260 c.Assert(errors.Cause(err), gc.ErrorMatches, msg) 261 c.Assert(items, gc.DeepEquals, params.VolumeItemsResult{}) 262 } 263 264 func (s *volumeSuite) TestListVolumesFilter(c *gc.C) { 265 expectedVolume, err := storage.ConvertStateVolumeToParams(s.api, s.volume) 266 c.Assert(err, jc.ErrorIsNil) 267 expected := params.VolumeItem{ 268 Volume: expectedVolume, 269 Attachments: storage.ConvertStateVolumeAttachmentsToParams( 270 []state.VolumeAttachment{s.volumeAttachment}, 271 ), 272 } 273 filter := params.VolumeFilter{ 274 Machines: []string{s.machineTag.String()}} 275 found, err := s.api.ListVolumes(filter) 276 c.Assert(err, jc.ErrorIsNil) 277 c.Assert(found.Results, gc.HasLen, 1) 278 c.Assert(found.Results[0], gc.DeepEquals, expected) 279 }