github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/status_filesystem_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 FilesystemStatusSuite struct { 16 StorageStateSuiteBase 17 machine *state.Machine 18 filesystem state.Filesystem 19 } 20 21 var _ = gc.Suite(&FilesystemStatusSuite{}) 22 23 func (s *FilesystemStatusSuite) 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 Filesystems: []state.MachineFilesystemParams{{ 30 Filesystem: state.FilesystemParams{ 31 Pool: "environscoped", Size: 1024, 32 }, 33 }}, 34 }) 35 c.Assert(err, jc.ErrorIsNil) 36 37 filesystemAttachments, err := s.State.MachineFilesystemAttachments(machine.MachineTag()) 38 c.Assert(err, jc.ErrorIsNil) 39 c.Assert(filesystemAttachments, gc.HasLen, 1) 40 41 filesystem, err := s.State.Filesystem(filesystemAttachments[0].Filesystem()) 42 c.Assert(err, jc.ErrorIsNil) 43 44 s.machine = machine 45 s.filesystem = filesystem 46 } 47 48 func (s *FilesystemStatusSuite) TestInitialStatus(c *gc.C) { 49 s.checkInitialStatus(c) 50 } 51 52 func (s *FilesystemStatusSuite) checkInitialStatus(c *gc.C) { 53 statusInfo, err := s.filesystem.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 *FilesystemStatusSuite) 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.filesystem.SetStatus(sInfo) 69 c.Check(err, gc.ErrorMatches, `cannot set status "error" without info`) 70 71 s.checkInitialStatus(c) 72 } 73 74 func (s *FilesystemStatusSuite) 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.filesystem.SetStatus(sInfo) 82 c.Assert(err, gc.ErrorMatches, `cannot set invalid status "vliegkat"`) 83 84 s.checkInitialStatus(c) 85 } 86 87 func (s *FilesystemStatusSuite) 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.filesystem.SetStatus(sInfo) 98 c.Check(err, jc.ErrorIsNil) 99 100 s.checkGetSetStatus(c) 101 } 102 103 func (s *FilesystemStatusSuite) TestGetSetStatusAlive(c *gc.C) { 104 s.checkGetSetStatus(c) 105 } 106 107 func (s *FilesystemStatusSuite) checkGetSetStatus(c *gc.C) { 108 now := testing.ZeroTime() 109 sInfo := status.StatusInfo{ 110 Status: status.Attaching, 111 Message: "blah", 112 Data: map[string]interface{}{ 113 "$foo.bar.baz": map[string]interface{}{ 114 "pew.pew": "zap", 115 }, 116 }, 117 Since: &now, 118 } 119 err := s.filesystem.SetStatus(sInfo) 120 c.Check(err, jc.ErrorIsNil) 121 122 filesystem, err := s.State.Filesystem(s.filesystem.FilesystemTag()) 123 c.Assert(err, jc.ErrorIsNil) 124 125 statusInfo, err := filesystem.Status() 126 c.Check(err, jc.ErrorIsNil) 127 c.Check(statusInfo.Status, gc.Equals, status.Attaching) 128 c.Check(statusInfo.Message, gc.Equals, "blah") 129 c.Check(statusInfo.Data, jc.DeepEquals, map[string]interface{}{ 130 "$foo.bar.baz": map[string]interface{}{ 131 "pew.pew": "zap", 132 }, 133 }) 134 c.Check(statusInfo.Since, gc.NotNil) 135 } 136 137 func (s *FilesystemStatusSuite) TestGetSetStatusDying(c *gc.C) { 138 err := s.State.DestroyFilesystem(s.filesystem.FilesystemTag()) 139 c.Assert(err, jc.ErrorIsNil) 140 141 s.checkGetSetStatus(c) 142 } 143 144 func (s *FilesystemStatusSuite) TestGetSetStatusDead(c *gc.C) { 145 err := s.State.DestroyFilesystem(s.filesystem.FilesystemTag()) 146 c.Assert(err, jc.ErrorIsNil) 147 err = s.State.DetachFilesystem(s.machine.MachineTag(), s.filesystem.FilesystemTag()) 148 c.Assert(err, jc.ErrorIsNil) 149 err = s.State.RemoveFilesystemAttachment(s.machine.MachineTag(), s.filesystem.FilesystemTag()) 150 c.Assert(err, jc.ErrorIsNil) 151 152 filesystem, err := s.State.Filesystem(s.filesystem.FilesystemTag()) 153 c.Assert(err, jc.ErrorIsNil) 154 c.Assert(filesystem.Life(), gc.Equals, state.Dead) 155 156 // NOTE: it would be more technically correct to reject status updates 157 // while Dead, but it's easier and clearer, not to mention more efficient, 158 // to just depend on status doc existence. 159 s.checkGetSetStatus(c) 160 } 161 162 func (s *FilesystemStatusSuite) TestGetSetStatusGone(c *gc.C) { 163 s.obliterateFilesystem(c, s.filesystem.FilesystemTag()) 164 165 now := testing.ZeroTime() 166 sInfo := status.StatusInfo{ 167 Status: status.Attaching, 168 Message: "not really", 169 Since: &now, 170 } 171 err := s.filesystem.SetStatus(sInfo) 172 c.Check(err, gc.ErrorMatches, `cannot set status: filesystem not found`) 173 174 statusInfo, err := s.filesystem.Status() 175 c.Check(err, gc.ErrorMatches, `cannot get status: filesystem not found`) 176 c.Check(statusInfo, gc.DeepEquals, status.StatusInfo{}) 177 } 178 179 func (s *FilesystemStatusSuite) TestSetStatusPendingUnprovisioned(c *gc.C) { 180 now := testing.ZeroTime() 181 sInfo := status.StatusInfo{ 182 Status: status.Pending, 183 Message: "still", 184 Since: &now, 185 } 186 err := s.filesystem.SetStatus(sInfo) 187 c.Check(err, jc.ErrorIsNil) 188 } 189 190 func (s *FilesystemStatusSuite) TestSetStatusPendingProvisioned(c *gc.C) { 191 err := s.State.SetFilesystemInfo(s.filesystem.FilesystemTag(), state.FilesystemInfo{ 192 FilesystemId: "fs-id", 193 }) 194 c.Assert(err, jc.ErrorIsNil) 195 now := testing.ZeroTime() 196 sInfo := status.StatusInfo{ 197 Status: status.Pending, 198 Message: "", 199 Since: &now, 200 } 201 err = s.filesystem.SetStatus(sInfo) 202 c.Check(err, gc.ErrorMatches, `cannot set status "pending"`) 203 }