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

     1  // Copyright 2014 Cloudbase Solutions SRL.
     2  // Copyright 2014 Canonical Ltd.
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  package state_test
     6  
     7  import (
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/instance"
    12  	"github.com/juju/juju/state"
    13  	statetesting "github.com/juju/juju/state/testing"
    14  )
    15  
    16  type RebootSuite struct {
    17  	ConnSuite
    18  
    19  	machine *state.Machine
    20  	c1      *state.Machine
    21  	c2      *state.Machine
    22  	c3      *state.Machine
    23  
    24  	w   state.NotifyWatcher
    25  	wC1 state.NotifyWatcher
    26  	wC2 state.NotifyWatcher
    27  	wC3 state.NotifyWatcher
    28  
    29  	wc   statetesting.NotifyWatcherC
    30  	wcC1 statetesting.NotifyWatcherC
    31  	wcC2 statetesting.NotifyWatcherC
    32  	wcC3 statetesting.NotifyWatcherC
    33  }
    34  
    35  var _ = gc.Suite(&RebootSuite{})
    36  
    37  func (s *RebootSuite) SetUpTest(c *gc.C) {
    38  	s.ConnSuite.SetUpTest(c)
    39  	var err error
    40  
    41  	// Add machine
    42  	s.machine, err = s.State.AddMachine("quantal", state.JobManageModel)
    43  	c.Assert(err, jc.ErrorIsNil)
    44  	// Add first container
    45  	s.c1, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
    46  		Series: "quantal",
    47  		Jobs:   []state.MachineJob{state.JobHostUnits},
    48  	}, s.machine.Id(), instance.LXD)
    49  	c.Assert(err, jc.ErrorIsNil)
    50  	// Add second container
    51  	s.c2, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
    52  		Series: "quantal",
    53  		Jobs:   []state.MachineJob{state.JobHostUnits},
    54  	}, s.c1.Id(), instance.LXD)
    55  	c.Assert(err, jc.ErrorIsNil)
    56  
    57  	// Add container on the same level as the first container.
    58  	s.c3, err = s.State.AddMachineInsideMachine(state.MachineTemplate{
    59  		Series: "quantal",
    60  		Jobs:   []state.MachineJob{state.JobHostUnits},
    61  	}, s.machine.Id(), instance.LXD)
    62  	c.Assert(err, jc.ErrorIsNil)
    63  
    64  	s.w = s.machine.WatchForRebootEvent()
    65  
    66  	s.wc = statetesting.NewNotifyWatcherC(c, s.State, s.w)
    67  	s.wc.AssertOneChange()
    68  
    69  	s.wC1 = s.c1.WatchForRebootEvent()
    70  
    71  	// Initial event on container 1.
    72  	s.wcC1 = statetesting.NewNotifyWatcherC(c, s.State, s.wC1)
    73  	s.wcC1.AssertOneChange()
    74  
    75  	// Get reboot watcher on container 2
    76  	s.wC2 = s.c2.WatchForRebootEvent()
    77  
    78  	// Initial event on container 2.
    79  	s.wcC2 = statetesting.NewNotifyWatcherC(c, s.State, s.wC2)
    80  	s.wcC2.AssertOneChange()
    81  
    82  	// Get reboot watcher on container 3
    83  	s.wC3 = s.c3.WatchForRebootEvent()
    84  
    85  	// Initial event on container 3.
    86  	s.wcC3 = statetesting.NewNotifyWatcherC(c, s.State, s.wC3)
    87  	s.wcC3.AssertOneChange()
    88  }
    89  
    90  func (s *RebootSuite) TearDownSuit(c *gc.C) {
    91  	if s.w != nil {
    92  		statetesting.AssertStop(c, s.w)
    93  	}
    94  	if s.wC1 != nil {
    95  		statetesting.AssertStop(c, s.wC1)
    96  	}
    97  	if s.wC2 != nil {
    98  		statetesting.AssertStop(c, s.wC2)
    99  	}
   100  	if s.wC3 != nil {
   101  		statetesting.AssertStop(c, s.wC3)
   102  	}
   103  }
   104  
   105  func (s *RebootSuite) TestWatchForRebootEvent(c *gc.C) {
   106  	err := s.machine.SetRebootFlag(true)
   107  	c.Assert(err, jc.ErrorIsNil)
   108  
   109  	s.wc.AssertOneChange()
   110  
   111  	inState, err := s.machine.GetRebootFlag()
   112  	c.Assert(err, jc.ErrorIsNil)
   113  	c.Assert(inState, jc.IsTrue)
   114  
   115  	err = s.machine.SetRebootFlag(false)
   116  	c.Assert(err, jc.ErrorIsNil)
   117  
   118  	s.wc.AssertOneChange()
   119  
   120  	inState, err = s.machine.GetRebootFlag()
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	c.Assert(inState, jc.IsFalse)
   123  
   124  	err = s.machine.SetRebootFlag(true)
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	err = s.machine.SetRebootFlag(false)
   127  	c.Assert(err, jc.ErrorIsNil)
   128  	err = s.machine.SetRebootFlag(true)
   129  	c.Assert(err, jc.ErrorIsNil)
   130  
   131  	s.wc.AssertOneChange()
   132  
   133  	// Stop all watchers and check they are closed
   134  	statetesting.AssertStop(c, s.w)
   135  	s.wc.AssertClosed()
   136  	statetesting.AssertStop(c, s.wC1)
   137  	s.wcC1.AssertClosed()
   138  	statetesting.AssertStop(c, s.wC2)
   139  	s.wcC2.AssertClosed()
   140  	statetesting.AssertStop(c, s.wC3)
   141  	s.wcC3.AssertClosed()
   142  }
   143  
   144  func (s *RebootSuite) TestWatchRebootHappensOnMachine(c *gc.C) {
   145  	// Reboot request happens on machine: everyone see it (including container3)
   146  	err := s.machine.SetRebootFlag(true)
   147  	c.Assert(err, jc.ErrorIsNil)
   148  
   149  	s.wc.AssertOneChange()
   150  	s.wcC1.AssertOneChange()
   151  	s.wcC2.AssertOneChange()
   152  	s.wcC3.AssertOneChange()
   153  
   154  	statetesting.AssertStop(c, s.w)
   155  	s.wc.AssertClosed()
   156  	statetesting.AssertStop(c, s.wC1)
   157  	s.wcC1.AssertClosed()
   158  	statetesting.AssertStop(c, s.wC2)
   159  	s.wcC2.AssertClosed()
   160  	statetesting.AssertStop(c, s.wC3)
   161  	s.wcC3.AssertClosed()
   162  }
   163  
   164  func (s *RebootSuite) TestWatchRebootHappensOnContainer1(c *gc.C) {
   165  	// Reboot request happens on container1: only container1 andcontainer2
   166  	// react
   167  	err := s.c1.SetRebootFlag(true)
   168  	c.Assert(err, jc.ErrorIsNil)
   169  
   170  	s.wc.AssertNoChange()
   171  	s.wcC1.AssertOneChange()
   172  	s.wcC2.AssertOneChange()
   173  	s.wcC3.AssertNoChange()
   174  
   175  	// Stop all watchers and check they are closed
   176  	statetesting.AssertStop(c, s.w)
   177  	s.wc.AssertClosed()
   178  	statetesting.AssertStop(c, s.wC1)
   179  	s.wcC1.AssertClosed()
   180  	statetesting.AssertStop(c, s.wC2)
   181  	s.wcC2.AssertClosed()
   182  	statetesting.AssertStop(c, s.wC3)
   183  	s.wcC3.AssertClosed()
   184  }
   185  
   186  func (s *RebootSuite) TestWatchRebootHappensOnContainer2(c *gc.C) {
   187  	// Reboot request happens on container2: only container2 sees it
   188  	err := s.c2.SetRebootFlag(true)
   189  	c.Assert(err, jc.ErrorIsNil)
   190  
   191  	s.wc.AssertNoChange()
   192  	s.wcC1.AssertNoChange()
   193  	s.wcC2.AssertOneChange()
   194  	s.wcC3.AssertNoChange()
   195  
   196  	// Stop all watchers and check they are closed
   197  	statetesting.AssertStop(c, s.w)
   198  	s.wc.AssertClosed()
   199  	statetesting.AssertStop(c, s.wC1)
   200  	s.wcC1.AssertClosed()
   201  	statetesting.AssertStop(c, s.wC2)
   202  	s.wcC2.AssertClosed()
   203  	statetesting.AssertStop(c, s.wC3)
   204  	s.wcC3.AssertClosed()
   205  }
   206  
   207  func (s *RebootSuite) TestWatchRebootHappensOnContainer3(c *gc.C) {
   208  	// Reboot request happens on container2: only container2 sees it
   209  	err := s.c3.SetRebootFlag(true)
   210  	c.Assert(err, jc.ErrorIsNil)
   211  
   212  	s.wc.AssertNoChange()
   213  	s.wcC1.AssertNoChange()
   214  	s.wcC2.AssertNoChange()
   215  	s.wcC3.AssertOneChange()
   216  
   217  	// Stop all watchers and check they are closed
   218  	statetesting.AssertStop(c, s.w)
   219  	s.wc.AssertClosed()
   220  	statetesting.AssertStop(c, s.wC1)
   221  	s.wcC1.AssertClosed()
   222  	statetesting.AssertStop(c, s.wC2)
   223  	s.wcC2.AssertClosed()
   224  	statetesting.AssertStop(c, s.wC3)
   225  	s.wcC3.AssertClosed()
   226  }