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  }