github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/apiserver/machine/machiner_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package machine_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/names"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  	"github.com/juju/juju/apiserver/machine"
    14  	"github.com/juju/juju/apiserver/params"
    15  	apiservertesting "github.com/juju/juju/apiserver/testing"
    16  	"github.com/juju/juju/network"
    17  	"github.com/juju/juju/state"
    18  	statetesting "github.com/juju/juju/state/testing"
    19  )
    20  
    21  type machinerSuite struct {
    22  	commonSuite
    23  
    24  	resources *common.Resources
    25  	machiner  *machine.MachinerAPI
    26  }
    27  
    28  var _ = gc.Suite(&machinerSuite{})
    29  
    30  func (s *machinerSuite) SetUpTest(c *gc.C) {
    31  	s.commonSuite.SetUpTest(c)
    32  
    33  	// Create the resource registry separately to track invocations to
    34  	// Register.
    35  	s.resources = common.NewResources()
    36  
    37  	// Create a machiner API for machine 1.
    38  	machiner, err := machine.NewMachinerAPI(
    39  		s.State,
    40  		s.resources,
    41  		s.authorizer,
    42  	)
    43  	c.Assert(err, jc.ErrorIsNil)
    44  	s.machiner = machiner
    45  }
    46  
    47  func (s *machinerSuite) TestMachinerFailsWithNonMachineAgentUser(c *gc.C) {
    48  	anAuthorizer := s.authorizer
    49  	anAuthorizer.Tag = names.NewUnitTag("ubuntu/1")
    50  	aMachiner, err := machine.NewMachinerAPI(s.State, s.resources, anAuthorizer)
    51  	c.Assert(err, gc.NotNil)
    52  	c.Assert(aMachiner, gc.IsNil)
    53  	c.Assert(err, gc.ErrorMatches, "permission denied")
    54  }
    55  
    56  func (s *machinerSuite) TestSetStatus(c *gc.C) {
    57  	err := s.machine0.SetStatus(state.StatusStarted, "blah", nil)
    58  	c.Assert(err, jc.ErrorIsNil)
    59  	err = s.machine1.SetStatus(state.StatusStopped, "foo", nil)
    60  	c.Assert(err, jc.ErrorIsNil)
    61  
    62  	args := params.SetStatus{
    63  		Entities: []params.EntityStatus{
    64  			{Tag: "machine-1", Status: params.StatusError, Info: "not really"},
    65  			{Tag: "machine-0", Status: params.StatusStopped, Info: "foobar"},
    66  			{Tag: "machine-42", Status: params.StatusStarted, Info: "blah"},
    67  		}}
    68  	result, err := s.machiner.SetStatus(args)
    69  	c.Assert(err, jc.ErrorIsNil)
    70  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
    71  		Results: []params.ErrorResult{
    72  			{nil},
    73  			{apiservertesting.ErrUnauthorized},
    74  			{apiservertesting.ErrUnauthorized},
    75  		},
    76  	})
    77  
    78  	// Verify machine 0 - no change.
    79  	status, info, _, err := s.machine0.Status()
    80  	c.Assert(err, jc.ErrorIsNil)
    81  	c.Assert(status, gc.Equals, state.StatusStarted)
    82  	c.Assert(info, gc.Equals, "blah")
    83  	// ...machine 1 is fine though.
    84  	status, info, _, err = s.machine1.Status()
    85  	c.Assert(err, jc.ErrorIsNil)
    86  	c.Assert(status, gc.Equals, state.StatusError)
    87  	c.Assert(info, gc.Equals, "not really")
    88  }
    89  
    90  func (s *machinerSuite) TestLife(c *gc.C) {
    91  	err := s.machine1.EnsureDead()
    92  	c.Assert(err, jc.ErrorIsNil)
    93  	err = s.machine1.Refresh()
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	c.Assert(s.machine1.Life(), gc.Equals, state.Dead)
    96  
    97  	args := params.Entities{Entities: []params.Entity{
    98  		{Tag: "machine-1"},
    99  		{Tag: "machine-0"},
   100  		{Tag: "machine-42"},
   101  	}}
   102  	result, err := s.machiner.Life(args)
   103  	c.Assert(err, jc.ErrorIsNil)
   104  	c.Assert(result, gc.DeepEquals, params.LifeResults{
   105  		Results: []params.LifeResult{
   106  			{Life: "dead"},
   107  			{Error: apiservertesting.ErrUnauthorized},
   108  			{Error: apiservertesting.ErrUnauthorized},
   109  		},
   110  	})
   111  }
   112  
   113  func (s *machinerSuite) TestEnsureDead(c *gc.C) {
   114  	c.Assert(s.machine0.Life(), gc.Equals, state.Alive)
   115  	c.Assert(s.machine1.Life(), gc.Equals, state.Alive)
   116  
   117  	args := params.Entities{Entities: []params.Entity{
   118  		{Tag: "machine-1"},
   119  		{Tag: "machine-0"},
   120  		{Tag: "machine-42"},
   121  	}}
   122  	result, err := s.machiner.EnsureDead(args)
   123  	c.Assert(err, jc.ErrorIsNil)
   124  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
   125  		Results: []params.ErrorResult{
   126  			{nil},
   127  			{apiservertesting.ErrUnauthorized},
   128  			{apiservertesting.ErrUnauthorized},
   129  		},
   130  	})
   131  
   132  	err = s.machine0.Refresh()
   133  	c.Assert(err, jc.ErrorIsNil)
   134  	c.Assert(s.machine0.Life(), gc.Equals, state.Alive)
   135  	err = s.machine1.Refresh()
   136  	c.Assert(err, jc.ErrorIsNil)
   137  	c.Assert(s.machine1.Life(), gc.Equals, state.Dead)
   138  
   139  	// Try it again on a Dead machine; should work.
   140  	args = params.Entities{
   141  		Entities: []params.Entity{{Tag: "machine-1"}},
   142  	}
   143  	result, err = s.machiner.EnsureDead(args)
   144  	c.Assert(err, jc.ErrorIsNil)
   145  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
   146  		Results: []params.ErrorResult{{nil}},
   147  	})
   148  
   149  	// Verify Life is unchanged.
   150  	err = s.machine1.Refresh()
   151  	c.Assert(err, jc.ErrorIsNil)
   152  	c.Assert(s.machine1.Life(), gc.Equals, state.Dead)
   153  }
   154  
   155  func (s *machinerSuite) TestSetMachineAddresses(c *gc.C) {
   156  	c.Assert(s.machine0.Addresses(), gc.HasLen, 0)
   157  	c.Assert(s.machine1.Addresses(), gc.HasLen, 0)
   158  
   159  	addresses := []network.Address{
   160  		network.NewAddress("127.0.0.1", network.ScopeUnknown),
   161  		network.NewAddress("8.8.8.8", network.ScopeUnknown),
   162  	}
   163  
   164  	args := params.SetMachinesAddresses{MachineAddresses: []params.MachineAddresses{
   165  		{Tag: "machine-1", Addresses: addresses},
   166  		{Tag: "machine-0", Addresses: addresses},
   167  		{Tag: "machine-42", Addresses: addresses},
   168  	}}
   169  
   170  	result, err := s.machiner.SetMachineAddresses(args)
   171  	c.Assert(err, jc.ErrorIsNil)
   172  	c.Assert(result, gc.DeepEquals, params.ErrorResults{
   173  		Results: []params.ErrorResult{
   174  			{nil},
   175  			{apiservertesting.ErrUnauthorized},
   176  			{apiservertesting.ErrUnauthorized},
   177  		},
   178  	})
   179  
   180  	err = s.machine1.Refresh()
   181  	c.Assert(err, jc.ErrorIsNil)
   182  
   183  	expectedAddresses := []network.Address{
   184  		network.NewAddress("8.8.8.8", network.ScopeUnknown),
   185  		network.NewAddress("127.0.0.1", network.ScopeUnknown),
   186  	}
   187  	c.Assert(s.machine1.MachineAddresses(), gc.DeepEquals, expectedAddresses)
   188  	err = s.machine0.Refresh()
   189  	c.Assert(err, jc.ErrorIsNil)
   190  	c.Assert(s.machine0.MachineAddresses(), gc.HasLen, 0)
   191  }
   192  
   193  func (s *machinerSuite) TestWatch(c *gc.C) {
   194  	c.Assert(s.resources.Count(), gc.Equals, 0)
   195  
   196  	args := params.Entities{Entities: []params.Entity{
   197  		{Tag: "machine-1"},
   198  		{Tag: "machine-0"},
   199  		{Tag: "machine-42"},
   200  	}}
   201  	result, err := s.machiner.Watch(args)
   202  	c.Assert(err, jc.ErrorIsNil)
   203  	c.Assert(result, gc.DeepEquals, params.NotifyWatchResults{
   204  		Results: []params.NotifyWatchResult{
   205  			{NotifyWatcherId: "1"},
   206  			{Error: apiservertesting.ErrUnauthorized},
   207  			{Error: apiservertesting.ErrUnauthorized},
   208  		},
   209  	})
   210  
   211  	// Verify the resource was registered and stop when done
   212  	c.Assert(s.resources.Count(), gc.Equals, 1)
   213  	c.Assert(result.Results[0].NotifyWatcherId, gc.Equals, "1")
   214  	resource := s.resources.Get("1")
   215  	defer statetesting.AssertStop(c, resource)
   216  
   217  	// Check that the Watch has consumed the initial event ("returned" in
   218  	// the Watch call)
   219  	wc := statetesting.NewNotifyWatcherC(c, s.State, resource.(state.NotifyWatcher))
   220  	wc.AssertNoChange()
   221  }