github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/status_volume_test.go (about)

     1  // Copyright 2012-2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/state"
    11  	"github.com/juju/juju/status"
    12  	"github.com/juju/juju/testing"
    13  )
    14  
    15  type VolumeStatusSuite struct {
    16  	StorageStateSuiteBase
    17  	machine *state.Machine
    18  	volume  state.Volume
    19  }
    20  
    21  var _ = gc.Suite(&VolumeStatusSuite{})
    22  
    23  func (s *VolumeStatusSuite) SetUpTest(c *gc.C) {
    24  	s.StorageStateSuiteBase.SetUpTest(c)
    25  
    26  	machine, err := s.State.AddOneMachine(state.MachineTemplate{
    27  		Series: "quantal",
    28  		Jobs:   []state.MachineJob{state.JobHostUnits},
    29  		Volumes: []state.MachineVolumeParams{{
    30  			Volume: state.VolumeParams{
    31  				Pool: "environscoped", Size: 1024,
    32  			},
    33  		}},
    34  	})
    35  	c.Assert(err, jc.ErrorIsNil)
    36  
    37  	volumeAttachments, err := machine.VolumeAttachments()
    38  	c.Assert(err, jc.ErrorIsNil)
    39  	c.Assert(volumeAttachments, gc.HasLen, 1)
    40  
    41  	volume, err := s.State.Volume(volumeAttachments[0].Volume())
    42  	c.Assert(err, jc.ErrorIsNil)
    43  
    44  	s.machine = machine
    45  	s.volume = volume
    46  }
    47  
    48  func (s *VolumeStatusSuite) TestInitialStatus(c *gc.C) {
    49  	s.checkInitialStatus(c)
    50  }
    51  
    52  func (s *VolumeStatusSuite) checkInitialStatus(c *gc.C) {
    53  	statusInfo, err := s.volume.Status()
    54  	c.Check(err, jc.ErrorIsNil)
    55  	c.Check(statusInfo.Status, gc.Equals, status.Pending)
    56  	c.Check(statusInfo.Message, gc.Equals, "")
    57  	c.Check(statusInfo.Data, gc.HasLen, 0)
    58  	c.Check(statusInfo.Since, gc.NotNil)
    59  }
    60  
    61  func (s *VolumeStatusSuite) TestSetErrorStatusWithoutInfo(c *gc.C) {
    62  	now := testing.ZeroTime()
    63  	sInfo := status.StatusInfo{
    64  		Status:  status.Error,
    65  		Message: "",
    66  		Since:   &now,
    67  	}
    68  	err := s.volume.SetStatus(sInfo)
    69  	c.Check(err, gc.ErrorMatches, `cannot set status "error" without info`)
    70  
    71  	s.checkInitialStatus(c)
    72  }
    73  
    74  func (s *VolumeStatusSuite) TestSetUnknownStatus(c *gc.C) {
    75  	now := testing.ZeroTime()
    76  	sInfo := status.StatusInfo{
    77  		Status:  status.Status("vliegkat"),
    78  		Message: "orville",
    79  		Since:   &now,
    80  	}
    81  	err := s.volume.SetStatus(sInfo)
    82  	c.Assert(err, gc.ErrorMatches, `cannot set invalid status "vliegkat"`)
    83  
    84  	s.checkInitialStatus(c)
    85  }
    86  
    87  func (s *VolumeStatusSuite) TestSetOverwritesData(c *gc.C) {
    88  	now := testing.ZeroTime()
    89  	sInfo := status.StatusInfo{
    90  		Status:  status.Attaching,
    91  		Message: "blah",
    92  		Data: map[string]interface{}{
    93  			"pew.pew": "zap",
    94  		},
    95  		Since: &now,
    96  	}
    97  	err := s.volume.SetStatus(sInfo)
    98  	c.Check(err, jc.ErrorIsNil)
    99  
   100  	s.checkGetSetStatus(c, status.Attaching)
   101  }
   102  
   103  func (s *VolumeStatusSuite) TestGetSetStatusAlive(c *gc.C) {
   104  	validStatuses := []status.Status{
   105  		status.Attaching, status.Attached, status.Detaching,
   106  		status.Detached, status.Destroying,
   107  	}
   108  	for _, status := range validStatuses {
   109  		s.checkGetSetStatus(c, status)
   110  	}
   111  }
   112  
   113  func (s *VolumeStatusSuite) checkGetSetStatus(c *gc.C, volumeStatus status.Status) {
   114  	now := testing.ZeroTime()
   115  	sInfo := status.StatusInfo{
   116  		Status:  volumeStatus,
   117  		Message: "blah",
   118  		Data: map[string]interface{}{
   119  			"$foo.bar.baz": map[string]interface{}{
   120  				"pew.pew": "zap",
   121  			},
   122  		},
   123  		Since: &now,
   124  	}
   125  	err := s.volume.SetStatus(sInfo)
   126  	c.Check(err, jc.ErrorIsNil)
   127  
   128  	volume, err := s.State.Volume(s.volume.VolumeTag())
   129  	c.Assert(err, jc.ErrorIsNil)
   130  
   131  	statusInfo, err := volume.Status()
   132  	c.Check(err, jc.ErrorIsNil)
   133  	c.Check(statusInfo.Status, gc.Equals, volumeStatus)
   134  	c.Check(statusInfo.Message, gc.Equals, "blah")
   135  	c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{
   136  		"$foo.bar.baz": map[string]interface{}{
   137  			"pew.pew": "zap",
   138  		},
   139  	})
   140  	c.Check(statusInfo.Since, gc.NotNil)
   141  }
   142  
   143  func (s *VolumeStatusSuite) TestGetSetStatusDying(c *gc.C) {
   144  	err := s.State.DestroyVolume(s.volume.VolumeTag())
   145  	c.Assert(err, jc.ErrorIsNil)
   146  
   147  	s.checkGetSetStatus(c, status.Attaching)
   148  }
   149  
   150  func (s *VolumeStatusSuite) TestGetSetStatusDead(c *gc.C) {
   151  	err := s.State.DestroyVolume(s.volume.VolumeTag())
   152  	c.Assert(err, jc.ErrorIsNil)
   153  	err = s.State.DetachVolume(s.machine.MachineTag(), s.volume.VolumeTag())
   154  	c.Assert(err, jc.ErrorIsNil)
   155  	err = s.State.RemoveVolumeAttachment(s.machine.MachineTag(), s.volume.VolumeTag())
   156  	c.Assert(err, jc.ErrorIsNil)
   157  
   158  	volume, err := s.State.Volume(s.volume.VolumeTag())
   159  	c.Assert(err, jc.ErrorIsNil)
   160  	c.Assert(volume.Life(), gc.Equals, state.Dead)
   161  
   162  	// NOTE: it would be more technically correct to reject status updates
   163  	// while Dead, but it's easier and clearer, not to mention more efficient,
   164  	// to just depend on status doc existence.
   165  	s.checkGetSetStatus(c, status.Attaching)
   166  }
   167  
   168  func (s *VolumeStatusSuite) TestGetSetStatusGone(c *gc.C) {
   169  	s.obliterateVolume(c, s.volume.VolumeTag())
   170  
   171  	now := testing.ZeroTime()
   172  	sInfo := status.StatusInfo{
   173  		Status:  status.Attaching,
   174  		Message: "not really",
   175  		Since:   &now,
   176  	}
   177  	err := s.volume.SetStatus(sInfo)
   178  	c.Check(err, gc.ErrorMatches, `cannot set status: volume not found`)
   179  
   180  	statusInfo, err := s.volume.Status()
   181  	c.Check(err, gc.ErrorMatches, `cannot get status: volume not found`)
   182  	c.Check(statusInfo, gc.DeepEquals, status.StatusInfo{})
   183  }
   184  
   185  func (s *VolumeStatusSuite) TestSetStatusPendingUnprovisioned(c *gc.C) {
   186  	now := testing.ZeroTime()
   187  	sInfo := status.StatusInfo{
   188  		Status:  status.Pending,
   189  		Message: "still",
   190  		Since:   &now,
   191  	}
   192  	err := s.volume.SetStatus(sInfo)
   193  	c.Check(err, jc.ErrorIsNil)
   194  }
   195  
   196  func (s *VolumeStatusSuite) TestSetStatusPendingProvisioned(c *gc.C) {
   197  	err := s.State.SetVolumeInfo(s.volume.VolumeTag(), state.VolumeInfo{
   198  		VolumeId: "vol-ume",
   199  	})
   200  	c.Assert(err, jc.ErrorIsNil)
   201  	now := testing.ZeroTime()
   202  	sInfo := status.StatusInfo{
   203  		Status:  status.Pending,
   204  		Message: "",
   205  		Since:   &now,
   206  	}
   207  	err = s.volume.SetStatus(sInfo)
   208  	c.Check(err, gc.ErrorMatches, `cannot set status "pending"`)
   209  }