github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/api/machiner/machiner_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machiner_test
     5  
     6  import (
     7  	stdtesting "testing"
     8  
     9  	"github.com/juju/errors"
    10  	jc "github.com/juju/testing/checkers"
    11  	gc "gopkg.in/check.v1"
    12  	"gopkg.in/juju/names.v2"
    13  
    14  	"github.com/juju/juju/api"
    15  	"github.com/juju/juju/api/machiner"
    16  	apitesting "github.com/juju/juju/api/testing"
    17  	"github.com/juju/juju/apiserver/params"
    18  	"github.com/juju/juju/juju/testing"
    19  	"github.com/juju/juju/network"
    20  	"github.com/juju/juju/state"
    21  	"github.com/juju/juju/status"
    22  	coretesting "github.com/juju/juju/testing"
    23  	"github.com/juju/juju/watcher/watchertest"
    24  )
    25  
    26  func TestAll(t *stdtesting.T) {
    27  	coretesting.MgoTestPackage(t)
    28  }
    29  
    30  type machinerSuite struct {
    31  	testing.JujuConnSuite
    32  	*apitesting.APIAddresserTests
    33  
    34  	st      api.Connection
    35  	machine *state.Machine
    36  
    37  	machiner *machiner.State
    38  }
    39  
    40  var _ = gc.Suite(&machinerSuite{})
    41  
    42  func (s *machinerSuite) SetUpTest(c *gc.C) {
    43  	s.JujuConnSuite.SetUpTest(c)
    44  	m, err := s.State.AddMachine("quantal", state.JobManageModel)
    45  	c.Assert(err, jc.ErrorIsNil)
    46  	err = m.SetProviderAddresses(network.NewAddress("10.0.0.1"))
    47  	c.Assert(err, jc.ErrorIsNil)
    48  
    49  	s.st, s.machine = s.OpenAPIAsNewMachine(c)
    50  	// Create the machiner API facade.
    51  	s.machiner = machiner.NewState(s.st)
    52  	c.Assert(s.machiner, gc.NotNil)
    53  	s.APIAddresserTests = apitesting.NewAPIAddresserTests(s.machiner, s.BackingState)
    54  }
    55  
    56  func (s *machinerSuite) TestMachineAndMachineTag(c *gc.C) {
    57  	machine, err := s.machiner.Machine(names.NewMachineTag("42"))
    58  	c.Assert(err, gc.ErrorMatches, ".*permission denied")
    59  	c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized)
    60  	c.Assert(machine, gc.IsNil)
    61  
    62  	machine1 := names.NewMachineTag("1")
    63  	machine, err = s.machiner.Machine(machine1)
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	c.Assert(machine.Tag(), gc.Equals, machine1)
    66  }
    67  
    68  func (s *machinerSuite) TestSetStatus(c *gc.C) {
    69  	machine, err := s.machiner.Machine(names.NewMachineTag("1"))
    70  	c.Assert(err, jc.ErrorIsNil)
    71  
    72  	statusInfo, err := s.machine.Status()
    73  	c.Assert(err, jc.ErrorIsNil)
    74  	c.Assert(statusInfo.Status, gc.Equals, status.Pending)
    75  	c.Assert(statusInfo.Message, gc.Equals, "")
    76  	c.Assert(statusInfo.Data, gc.HasLen, 0)
    77  
    78  	err = machine.SetStatus(status.Started, "blah", nil)
    79  	c.Assert(err, jc.ErrorIsNil)
    80  
    81  	statusInfo, err = s.machine.Status()
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Assert(statusInfo.Status, gc.Equals, status.Started)
    84  	c.Assert(statusInfo.Message, gc.Equals, "blah")
    85  	c.Assert(statusInfo.Data, gc.HasLen, 0)
    86  	c.Assert(statusInfo.Since, gc.NotNil)
    87  }
    88  
    89  func (s *machinerSuite) TestEnsureDead(c *gc.C) {
    90  	c.Assert(s.machine.Life(), gc.Equals, state.Alive)
    91  
    92  	machine, err := s.machiner.Machine(names.NewMachineTag("1"))
    93  	c.Assert(err, jc.ErrorIsNil)
    94  
    95  	err = machine.EnsureDead()
    96  	c.Assert(err, jc.ErrorIsNil)
    97  
    98  	err = s.machine.Refresh()
    99  	c.Assert(err, jc.ErrorIsNil)
   100  	c.Assert(s.machine.Life(), gc.Equals, state.Dead)
   101  
   102  	err = machine.EnsureDead()
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	err = s.machine.Refresh()
   105  	c.Assert(err, jc.ErrorIsNil)
   106  	c.Assert(s.machine.Life(), gc.Equals, state.Dead)
   107  
   108  	err = s.machine.Remove()
   109  	c.Assert(err, jc.ErrorIsNil)
   110  	err = s.machine.Refresh()
   111  	c.Assert(err, jc.Satisfies, errors.IsNotFound)
   112  
   113  	err = machine.EnsureDead()
   114  	c.Assert(err, gc.ErrorMatches, "machine 1 not found")
   115  	c.Assert(err, jc.Satisfies, params.IsCodeNotFound)
   116  }
   117  
   118  func (s *machinerSuite) TestRefresh(c *gc.C) {
   119  	machine, err := s.machiner.Machine(names.NewMachineTag("1"))
   120  	c.Assert(err, jc.ErrorIsNil)
   121  	c.Assert(machine.Life(), gc.Equals, params.Alive)
   122  
   123  	err = machine.EnsureDead()
   124  	c.Assert(err, jc.ErrorIsNil)
   125  	c.Assert(machine.Life(), gc.Equals, params.Alive)
   126  
   127  	err = machine.Refresh()
   128  	c.Assert(err, jc.ErrorIsNil)
   129  	c.Assert(machine.Life(), gc.Equals, params.Dead)
   130  }
   131  
   132  func (s *machinerSuite) TestSetMachineAddresses(c *gc.C) {
   133  	machine, err := s.machiner.Machine(names.NewMachineTag("1"))
   134  	c.Assert(err, jc.ErrorIsNil)
   135  
   136  	addr := s.machine.Addresses()
   137  	c.Assert(addr, gc.HasLen, 0)
   138  
   139  	setAddresses := network.NewAddresses(
   140  		"8.8.8.8",
   141  		"127.0.0.1",
   142  		"10.0.0.1",
   143  	)
   144  	// Before setting, the addresses are sorted to put public on top,
   145  	// cloud-local next, machine-local last.
   146  	expectAddresses := network.NewAddresses(
   147  		"8.8.8.8",
   148  		"10.0.0.1",
   149  		"127.0.0.1",
   150  	)
   151  	err = machine.SetMachineAddresses(setAddresses)
   152  	c.Assert(err, jc.ErrorIsNil)
   153  
   154  	err = s.machine.Refresh()
   155  	c.Assert(err, jc.ErrorIsNil)
   156  	c.Assert(s.machine.MachineAddresses(), jc.DeepEquals, expectAddresses)
   157  }
   158  
   159  func (s *machinerSuite) TestSetEmptyMachineAddresses(c *gc.C) {
   160  	machine, err := s.machiner.Machine(names.NewMachineTag("1"))
   161  	c.Assert(err, jc.ErrorIsNil)
   162  
   163  	setAddresses := network.NewAddresses(
   164  		"8.8.8.8",
   165  		"127.0.0.1",
   166  		"10.0.0.1",
   167  	)
   168  	err = machine.SetMachineAddresses(setAddresses)
   169  	c.Assert(err, jc.ErrorIsNil)
   170  	err = s.machine.Refresh()
   171  	c.Assert(err, jc.ErrorIsNil)
   172  	c.Assert(s.machine.MachineAddresses(), gc.HasLen, 3)
   173  
   174  	err = machine.SetMachineAddresses(nil)
   175  	c.Assert(err, jc.ErrorIsNil)
   176  	err = s.machine.Refresh()
   177  	c.Assert(err, jc.ErrorIsNil)
   178  	c.Assert(s.machine.MachineAddresses(), gc.HasLen, 0)
   179  }
   180  
   181  func (s *machinerSuite) TestWatch(c *gc.C) {
   182  	machine, err := s.machiner.Machine(names.NewMachineTag("1"))
   183  	c.Assert(err, jc.ErrorIsNil)
   184  	c.Assert(machine.Life(), gc.Equals, params.Alive)
   185  
   186  	w, err := machine.Watch()
   187  	c.Assert(err, jc.ErrorIsNil)
   188  	wc := watchertest.NewNotifyWatcherC(c, w, s.BackingState.StartSync)
   189  	defer wc.AssertStops()
   190  
   191  	// Initial event.
   192  	wc.AssertOneChange()
   193  
   194  	// Change something other than the lifecycle and make sure it's
   195  	// not detected.
   196  	err = machine.SetStatus(status.Started, "not really", nil)
   197  	c.Assert(err, jc.ErrorIsNil)
   198  	wc.AssertNoChange()
   199  
   200  	// Make the machine dead and check it's detected.
   201  	err = machine.EnsureDead()
   202  	c.Assert(err, jc.ErrorIsNil)
   203  	wc.AssertOneChange()
   204  }