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  }