github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/apiserver/reboot/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 reboot_test
     6  
     7  import (
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/apiserver/common"
    12  	"github.com/juju/juju/apiserver/params"
    13  	"github.com/juju/juju/apiserver/reboot"
    14  	apiservertesting "github.com/juju/juju/apiserver/testing"
    15  	"github.com/juju/juju/instance"
    16  	jujutesting "github.com/juju/juju/juju/testing"
    17  	"github.com/juju/juju/state"
    18  	statetesting "github.com/juju/juju/state/testing"
    19  )
    20  
    21  type machines struct {
    22  	machine    *state.Machine
    23  	authorizer apiservertesting.FakeAuthorizer
    24  	resources  *common.Resources
    25  	rebootAPI  *reboot.RebootAPI
    26  	args       params.Entities
    27  
    28  	w  state.NotifyWatcher
    29  	wc statetesting.NotifyWatcherC
    30  }
    31  
    32  type rebootSuite struct {
    33  	jujutesting.JujuConnSuite
    34  
    35  	machine         *machines
    36  	container       *machines
    37  	nestedContainer *machines
    38  }
    39  
    40  var _ = gc.Suite(&rebootSuite{})
    41  
    42  func (s *rebootSuite) setUpMachine(c *gc.C, machine *state.Machine) *machines {
    43  	// Create a FakeAuthorizer so we can check permissions,
    44  	// set up assuming we logged in as a machine agent.
    45  	authorizer := apiservertesting.FakeAuthorizer{
    46  		Tag: machine.Tag(),
    47  	}
    48  
    49  	resources := common.NewResources()
    50  
    51  	rebootAPI, err := reboot.NewRebootAPI(s.State, resources, authorizer)
    52  	c.Assert(err, jc.ErrorIsNil)
    53  
    54  	args := params.Entities{Entities: []params.Entity{
    55  		{Tag: machine.Tag().String()},
    56  	}}
    57  
    58  	resultMachine, err := rebootAPI.WatchForRebootEvent()
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	c.Check(resultMachine.NotifyWatcherId, gc.Not(gc.Equals), "")
    61  	c.Check(resultMachine.Error, gc.IsNil)
    62  
    63  	resourceMachine := resources.Get(resultMachine.NotifyWatcherId)
    64  	c.Check(resourceMachine, gc.NotNil)
    65  
    66  	w := resourceMachine.(state.NotifyWatcher)
    67  	wc := statetesting.NewNotifyWatcherC(c, s.State, w)
    68  	wc.AssertNoChange()
    69  
    70  	return &machines{
    71  		machine:    machine,
    72  		authorizer: authorizer,
    73  		resources:  resources,
    74  		rebootAPI:  rebootAPI,
    75  		args:       args,
    76  		w:          w,
    77  		wc:         wc,
    78  	}
    79  }
    80  
    81  func (s *rebootSuite) SetUpTest(c *gc.C) {
    82  	s.JujuConnSuite.SetUpTest(c)
    83  	var err error
    84  
    85  	template := state.MachineTemplate{
    86  		Series: "quantal",
    87  		Jobs:   []state.MachineJob{state.JobHostUnits},
    88  	}
    89  
    90  	machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
    91  	c.Assert(err, jc.ErrorIsNil)
    92  
    93  	container, err := s.State.AddMachineInsideMachine(template, machine.Id(), instance.LXD)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  
    96  	nestedContainer, err := s.State.AddMachineInsideMachine(template, container.Id(), instance.KVM)
    97  	c.Assert(err, jc.ErrorIsNil)
    98  
    99  	s.machine = s.setUpMachine(c, machine)
   100  	s.container = s.setUpMachine(c, container)
   101  	s.nestedContainer = s.setUpMachine(c, nestedContainer)
   102  }
   103  
   104  func (s *rebootSuite) TearDownTest(c *gc.C) {
   105  	if s.machine.resources != nil {
   106  		s.machine.resources.StopAll()
   107  	}
   108  	if s.machine.w != nil {
   109  		statetesting.AssertStop(c, s.machine.w)
   110  		s.machine.wc.AssertClosed()
   111  	}
   112  
   113  	if s.container.resources != nil {
   114  		s.container.resources.StopAll()
   115  	}
   116  	if s.container.w != nil {
   117  		statetesting.AssertStop(c, s.container.w)
   118  		s.container.wc.AssertClosed()
   119  	}
   120  
   121  	if s.nestedContainer.resources != nil {
   122  		s.nestedContainer.resources.StopAll()
   123  	}
   124  	if s.nestedContainer.w != nil {
   125  		statetesting.AssertStop(c, s.nestedContainer.w)
   126  		s.nestedContainer.wc.AssertClosed()
   127  	}
   128  	s.JujuConnSuite.TearDownTest(c)
   129  }
   130  
   131  func (s *rebootSuite) TestWatchForRebootEvent(c *gc.C) {
   132  	err := s.machine.machine.SetRebootFlag(true)
   133  	c.Assert(err, jc.ErrorIsNil)
   134  
   135  	s.machine.wc.AssertOneChange()
   136  }
   137  
   138  func (s *rebootSuite) TestRequestReboot(c *gc.C) {
   139  	errResult, err := s.machine.rebootAPI.RequestReboot(s.machine.args)
   140  	c.Assert(err, jc.ErrorIsNil)
   141  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   142  		Results: []params.ErrorResult{
   143  			{Error: nil},
   144  		}})
   145  
   146  	s.machine.wc.AssertOneChange()
   147  
   148  	res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args)
   149  	c.Assert(err, jc.ErrorIsNil)
   150  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   151  		Results: []params.RebootActionResult{
   152  			{Result: params.ShouldReboot},
   153  		}})
   154  }
   155  
   156  func (s *rebootSuite) TestClearReboot(c *gc.C) {
   157  	errResult, err := s.machine.rebootAPI.RequestReboot(s.machine.args)
   158  	c.Assert(err, jc.ErrorIsNil)
   159  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   160  		Results: []params.ErrorResult{
   161  			{Error: nil},
   162  		},
   163  	})
   164  
   165  	s.machine.wc.AssertOneChange()
   166  
   167  	res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args)
   168  	c.Assert(err, jc.ErrorIsNil)
   169  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   170  		Results: []params.RebootActionResult{
   171  			{Result: params.ShouldReboot},
   172  		}})
   173  
   174  	errResult, err = s.machine.rebootAPI.ClearReboot(s.machine.args)
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   177  		Results: []params.ErrorResult{
   178  			{Error: nil},
   179  		},
   180  	})
   181  
   182  	res, err = s.machine.rebootAPI.GetRebootAction(s.machine.args)
   183  	c.Assert(err, jc.ErrorIsNil)
   184  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   185  		Results: []params.RebootActionResult{
   186  			{Result: params.ShouldDoNothing},
   187  		}})
   188  }
   189  
   190  func (s *rebootSuite) TestRebootRequestFromMachine(c *gc.C) {
   191  	// Request reboot on the root machine: all machines should see it
   192  	// machine should reboot
   193  	// container should shutdown
   194  	// nested container should shutdown
   195  	errResult, err := s.machine.rebootAPI.RequestReboot(s.machine.args)
   196  	c.Assert(err, jc.ErrorIsNil)
   197  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   198  		Results: []params.ErrorResult{
   199  			{Error: nil},
   200  		}})
   201  
   202  	s.machine.wc.AssertOneChange()
   203  	s.container.wc.AssertOneChange()
   204  	s.nestedContainer.wc.AssertOneChange()
   205  
   206  	res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args)
   207  	c.Assert(err, jc.ErrorIsNil)
   208  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   209  		Results: []params.RebootActionResult{
   210  			{Result: params.ShouldReboot},
   211  		}})
   212  
   213  	res, err = s.container.rebootAPI.GetRebootAction(s.container.args)
   214  	c.Assert(err, jc.ErrorIsNil)
   215  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   216  		Results: []params.RebootActionResult{
   217  			{Result: params.ShouldShutdown},
   218  		}})
   219  
   220  	res, err = s.nestedContainer.rebootAPI.GetRebootAction(s.nestedContainer.args)
   221  	c.Assert(err, jc.ErrorIsNil)
   222  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   223  		Results: []params.RebootActionResult{
   224  			{Result: params.ShouldShutdown},
   225  		}})
   226  
   227  	errResult, err = s.machine.rebootAPI.ClearReboot(s.machine.args)
   228  	c.Assert(err, jc.ErrorIsNil)
   229  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   230  		Results: []params.ErrorResult{
   231  			{Error: nil},
   232  		},
   233  	})
   234  
   235  	s.machine.wc.AssertOneChange()
   236  	s.container.wc.AssertOneChange()
   237  	s.nestedContainer.wc.AssertOneChange()
   238  }
   239  
   240  func (s *rebootSuite) TestRebootRequestFromContainer(c *gc.C) {
   241  	// Request reboot on the container: container and nested container should see it
   242  	// machine should do nothing
   243  	// container should reboot
   244  	// nested container should shutdown
   245  	errResult, err := s.container.rebootAPI.RequestReboot(s.container.args)
   246  	c.Assert(err, jc.ErrorIsNil)
   247  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   248  		Results: []params.ErrorResult{
   249  			{Error: nil},
   250  		}})
   251  
   252  	s.machine.wc.AssertNoChange()
   253  	s.container.wc.AssertOneChange()
   254  	s.nestedContainer.wc.AssertOneChange()
   255  
   256  	res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args)
   257  	c.Assert(err, jc.ErrorIsNil)
   258  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   259  		Results: []params.RebootActionResult{
   260  			{Result: params.ShouldDoNothing},
   261  		}})
   262  
   263  	res, err = s.container.rebootAPI.GetRebootAction(s.container.args)
   264  	c.Assert(err, jc.ErrorIsNil)
   265  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   266  		Results: []params.RebootActionResult{
   267  			{Result: params.ShouldReboot},
   268  		}})
   269  
   270  	res, err = s.nestedContainer.rebootAPI.GetRebootAction(s.nestedContainer.args)
   271  	c.Assert(err, jc.ErrorIsNil)
   272  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   273  		Results: []params.RebootActionResult{
   274  			{Result: params.ShouldShutdown},
   275  		}})
   276  
   277  	errResult, err = s.container.rebootAPI.ClearReboot(s.container.args)
   278  	c.Assert(err, jc.ErrorIsNil)
   279  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   280  		Results: []params.ErrorResult{
   281  			{Error: nil},
   282  		},
   283  	})
   284  
   285  	s.machine.wc.AssertNoChange()
   286  	s.container.wc.AssertOneChange()
   287  	s.nestedContainer.wc.AssertOneChange()
   288  }
   289  
   290  func (s *rebootSuite) TestRebootRequestFromNestedContainer(c *gc.C) {
   291  	// Request reboot on the container: container and nested container should see it
   292  	// machine should do nothing
   293  	// container should do nothing
   294  	// nested container should reboot
   295  	errResult, err := s.nestedContainer.rebootAPI.RequestReboot(s.nestedContainer.args)
   296  	c.Assert(err, jc.ErrorIsNil)
   297  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   298  		Results: []params.ErrorResult{
   299  			{Error: nil},
   300  		}})
   301  
   302  	s.machine.wc.AssertNoChange()
   303  	s.container.wc.AssertNoChange()
   304  	s.nestedContainer.wc.AssertOneChange()
   305  
   306  	res, err := s.machine.rebootAPI.GetRebootAction(s.machine.args)
   307  	c.Assert(err, jc.ErrorIsNil)
   308  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   309  		Results: []params.RebootActionResult{
   310  			{Result: params.ShouldDoNothing},
   311  		}})
   312  
   313  	res, err = s.container.rebootAPI.GetRebootAction(s.container.args)
   314  	c.Assert(err, jc.ErrorIsNil)
   315  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   316  		Results: []params.RebootActionResult{
   317  			{Result: params.ShouldDoNothing},
   318  		}})
   319  
   320  	res, err = s.nestedContainer.rebootAPI.GetRebootAction(s.nestedContainer.args)
   321  	c.Assert(err, jc.ErrorIsNil)
   322  	c.Assert(res, gc.DeepEquals, params.RebootActionResults{
   323  		Results: []params.RebootActionResult{
   324  			{Result: params.ShouldReboot},
   325  		}})
   326  
   327  	errResult, err = s.nestedContainer.rebootAPI.ClearReboot(s.nestedContainer.args)
   328  	c.Assert(err, jc.ErrorIsNil)
   329  	c.Assert(errResult, gc.DeepEquals, params.ErrorResults{
   330  		Results: []params.ErrorResult{
   331  			{Error: nil},
   332  		},
   333  	})
   334  
   335  	s.machine.wc.AssertNoChange()
   336  	s.container.wc.AssertNoChange()
   337  	s.nestedContainer.wc.AssertOneChange()
   338  }