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