github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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.LXC)
    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.LXC)
    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.LXC)
    62  	c.Assert(err, jc.ErrorIsNil)
    63  
    64  	s.w, err = s.machine.WatchForRebootEvent()
    65  	c.Assert(err, jc.ErrorIsNil)
    66  
    67  	s.wc = statetesting.NewNotifyWatcherC(c, s.State, s.w)
    68  	s.wc.AssertOneChange()
    69  
    70  	s.wC1, err = s.c1.WatchForRebootEvent()
    71  	c.Assert(err, jc.ErrorIsNil)
    72  
    73  	// Initial event on container 1.
    74  	s.wcC1 = statetesting.NewNotifyWatcherC(c, s.State, s.wC1)
    75  	s.wcC1.AssertOneChange()
    76  
    77  	// Get reboot watcher on container 2
    78  	s.wC2, err = s.c2.WatchForRebootEvent()
    79  	c.Assert(err, jc.ErrorIsNil)
    80  
    81  	// Initial event on container 2.
    82  	s.wcC2 = statetesting.NewNotifyWatcherC(c, s.State, s.wC2)
    83  	s.wcC2.AssertOneChange()
    84  
    85  	// Get reboot watcher on container 3
    86  	s.wC3, err = s.c3.WatchForRebootEvent()
    87  	c.Assert(err, jc.ErrorIsNil)
    88  
    89  	// Initial event on container 3.
    90  	s.wcC3 = statetesting.NewNotifyWatcherC(c, s.State, s.wC3)
    91  	s.wcC3.AssertOneChange()
    92  }
    93  
    94  func (s *RebootSuite) TearDownSuit(c *gc.C) {
    95  	if s.w != nil {
    96  		statetesting.AssertStop(c, s.w)
    97  	}
    98  	if s.wC1 != nil {
    99  		statetesting.AssertStop(c, s.wC1)
   100  	}
   101  	if s.wC2 != nil {
   102  		statetesting.AssertStop(c, s.wC2)
   103  	}
   104  	if s.wC3 != nil {
   105  		statetesting.AssertStop(c, s.wC3)
   106  	}
   107  }
   108  
   109  func (s *RebootSuite) TestWatchForRebootEvent(c *gc.C) {
   110  	err := s.machine.SetRebootFlag(true)
   111  	c.Assert(err, jc.ErrorIsNil)
   112  
   113  	s.wc.AssertOneChange()
   114  
   115  	inState, err := s.machine.GetRebootFlag()
   116  	c.Assert(err, jc.ErrorIsNil)
   117  	c.Assert(inState, jc.IsTrue)
   118  
   119  	err = s.machine.SetRebootFlag(false)
   120  	c.Assert(err, jc.ErrorIsNil)
   121  
   122  	s.wc.AssertOneChange()
   123  
   124  	inState, err = s.machine.GetRebootFlag()
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	c.Assert(inState, jc.IsFalse)
   127  
   128  	err = s.machine.SetRebootFlag(true)
   129  	c.Assert(err, jc.ErrorIsNil)
   130  	err = s.machine.SetRebootFlag(false)
   131  	c.Assert(err, jc.ErrorIsNil)
   132  	err = s.machine.SetRebootFlag(true)
   133  	c.Assert(err, jc.ErrorIsNil)
   134  
   135  	s.wc.AssertOneChange()
   136  
   137  	// Stop all watchers and check they are closed
   138  	statetesting.AssertStop(c, s.w)
   139  	s.wc.AssertClosed()
   140  	statetesting.AssertStop(c, s.wC1)
   141  	s.wcC1.AssertClosed()
   142  	statetesting.AssertStop(c, s.wC2)
   143  	s.wcC2.AssertClosed()
   144  	statetesting.AssertStop(c, s.wC3)
   145  	s.wcC3.AssertClosed()
   146  }
   147  
   148  func (s *RebootSuite) TestWatchRebootHappensOnMachine(c *gc.C) {
   149  	// Reboot request happens on machine: everyone see it (including container3)
   150  	err := s.machine.SetRebootFlag(true)
   151  	c.Assert(err, jc.ErrorIsNil)
   152  
   153  	s.wc.AssertOneChange()
   154  	s.wcC1.AssertOneChange()
   155  	s.wcC2.AssertOneChange()
   156  	s.wcC3.AssertOneChange()
   157  
   158  	statetesting.AssertStop(c, s.w)
   159  	s.wc.AssertClosed()
   160  	statetesting.AssertStop(c, s.wC1)
   161  	s.wcC1.AssertClosed()
   162  	statetesting.AssertStop(c, s.wC2)
   163  	s.wcC2.AssertClosed()
   164  	statetesting.AssertStop(c, s.wC3)
   165  	s.wcC3.AssertClosed()
   166  }
   167  
   168  func (s *RebootSuite) TestWatchRebootHappensOnContainer1(c *gc.C) {
   169  	// Reboot request happens on container1: only container1 andcontainer2
   170  	// react
   171  	err := s.c1.SetRebootFlag(true)
   172  	c.Assert(err, jc.ErrorIsNil)
   173  
   174  	s.wc.AssertNoChange()
   175  	s.wcC1.AssertOneChange()
   176  	s.wcC2.AssertOneChange()
   177  	s.wcC3.AssertNoChange()
   178  
   179  	// Stop all watchers and check they are closed
   180  	statetesting.AssertStop(c, s.w)
   181  	s.wc.AssertClosed()
   182  	statetesting.AssertStop(c, s.wC1)
   183  	s.wcC1.AssertClosed()
   184  	statetesting.AssertStop(c, s.wC2)
   185  	s.wcC2.AssertClosed()
   186  	statetesting.AssertStop(c, s.wC3)
   187  	s.wcC3.AssertClosed()
   188  }
   189  
   190  func (s *RebootSuite) TestWatchRebootHappensOnContainer2(c *gc.C) {
   191  	// Reboot request happens on container2: only container2 sees it
   192  	err := s.c2.SetRebootFlag(true)
   193  	c.Assert(err, jc.ErrorIsNil)
   194  
   195  	s.wc.AssertNoChange()
   196  	s.wcC1.AssertNoChange()
   197  	s.wcC2.AssertOneChange()
   198  	s.wcC3.AssertNoChange()
   199  
   200  	// Stop all watchers and check they are closed
   201  	statetesting.AssertStop(c, s.w)
   202  	s.wc.AssertClosed()
   203  	statetesting.AssertStop(c, s.wC1)
   204  	s.wcC1.AssertClosed()
   205  	statetesting.AssertStop(c, s.wC2)
   206  	s.wcC2.AssertClosed()
   207  	statetesting.AssertStop(c, s.wC3)
   208  	s.wcC3.AssertClosed()
   209  }
   210  
   211  func (s *RebootSuite) TestWatchRebootHappensOnContainer3(c *gc.C) {
   212  	// Reboot request happens on container2: only container2 sees it
   213  	err := s.c3.SetRebootFlag(true)
   214  	c.Assert(err, jc.ErrorIsNil)
   215  
   216  	s.wc.AssertNoChange()
   217  	s.wcC1.AssertNoChange()
   218  	s.wcC2.AssertNoChange()
   219  	s.wcC3.AssertOneChange()
   220  
   221  	// Stop all watchers and check they are closed
   222  	statetesting.AssertStop(c, s.w)
   223  	s.wc.AssertClosed()
   224  	statetesting.AssertStop(c, s.wC1)
   225  	s.wcC1.AssertClosed()
   226  	statetesting.AssertStop(c, s.wC2)
   227  	s.wcC2.AssertClosed()
   228  	statetesting.AssertStop(c, s.wC3)
   229  	s.wcC3.AssertClosed()
   230  }