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 }