github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/api/agent/machine_test.go (about)

     1  // Copyright 2012, 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package agent_test
     5  
     6  import (
     7  	"fmt"
     8  	stdtesting "testing"
     9  
    10  	"github.com/juju/errors"
    11  	"github.com/juju/names"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  	"gopkg.in/mgo.v2"
    15  
    16  	"github.com/juju/juju/api"
    17  	apiserveragent "github.com/juju/juju/apiserver/agent"
    18  	"github.com/juju/juju/apiserver/params"
    19  	"github.com/juju/juju/environs"
    20  	"github.com/juju/juju/juju/testing"
    21  	"github.com/juju/juju/mongo"
    22  	"github.com/juju/juju/state"
    23  	"github.com/juju/juju/state/multiwatcher"
    24  	coretesting "github.com/juju/juju/testing"
    25  )
    26  
    27  func TestAll(t *stdtesting.T) {
    28  	coretesting.MgoTestPackage(t)
    29  }
    30  
    31  type servingInfoSuite struct {
    32  	testing.JujuConnSuite
    33  }
    34  
    35  var _ = gc.Suite(&servingInfoSuite{})
    36  
    37  func (s *servingInfoSuite) TestStateServingInfo(c *gc.C) {
    38  	st, _ := s.OpenAPIAsNewMachine(c, state.JobManageEnviron)
    39  
    40  	ssi := state.StateServingInfo{
    41  		PrivateKey:   "some key",
    42  		Cert:         "Some cert",
    43  		SharedSecret: "really, really secret",
    44  		APIPort:      33,
    45  		StatePort:    44,
    46  	}
    47  	expected := params.StateServingInfo{
    48  		PrivateKey:   ssi.PrivateKey,
    49  		Cert:         ssi.Cert,
    50  		SharedSecret: ssi.SharedSecret,
    51  		APIPort:      ssi.APIPort,
    52  		StatePort:    ssi.StatePort,
    53  	}
    54  	s.State.SetStateServingInfo(ssi)
    55  	info, err := st.Agent().StateServingInfo()
    56  	c.Assert(err, jc.ErrorIsNil)
    57  	c.Assert(info, jc.DeepEquals, expected)
    58  }
    59  
    60  func (s *servingInfoSuite) TestStateServingInfoPermission(c *gc.C) {
    61  	st, _ := s.OpenAPIAsNewMachine(c)
    62  
    63  	_, err := st.Agent().StateServingInfo()
    64  	c.Assert(err, gc.ErrorMatches, "permission denied")
    65  }
    66  
    67  func (s *servingInfoSuite) TestIsMaster(c *gc.C) {
    68  	calledIsMaster := false
    69  	var fakeMongoIsMaster = func(session *mgo.Session, m mongo.WithAddresses) (bool, error) {
    70  		calledIsMaster = true
    71  		return true, nil
    72  	}
    73  	s.PatchValue(&apiserveragent.MongoIsMaster, fakeMongoIsMaster)
    74  
    75  	st, _ := s.OpenAPIAsNewMachine(c, state.JobManageEnviron)
    76  	expected := true
    77  	result, err := st.Agent().IsMaster()
    78  
    79  	c.Assert(err, jc.ErrorIsNil)
    80  	c.Assert(result, gc.Equals, expected)
    81  	c.Assert(calledIsMaster, jc.IsTrue)
    82  }
    83  
    84  func (s *servingInfoSuite) TestIsMasterPermission(c *gc.C) {
    85  	st, _ := s.OpenAPIAsNewMachine(c)
    86  	_, err := st.Agent().IsMaster()
    87  	c.Assert(err, gc.ErrorMatches, "permission denied")
    88  }
    89  
    90  type machineSuite struct {
    91  	testing.JujuConnSuite
    92  	machine *state.Machine
    93  	st      *api.State
    94  }
    95  
    96  var _ = gc.Suite(&machineSuite{})
    97  
    98  func (s *machineSuite) SetUpTest(c *gc.C) {
    99  	s.JujuConnSuite.SetUpTest(c)
   100  	s.st, s.machine = s.OpenAPIAsNewMachine(c)
   101  }
   102  
   103  func (s *machineSuite) TestMachineEntity(c *gc.C) {
   104  	tag := names.NewMachineTag("42")
   105  	m, err := s.st.Agent().Entity(tag)
   106  	c.Assert(err, gc.ErrorMatches, "permission denied")
   107  	c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized)
   108  	c.Assert(m, gc.IsNil)
   109  
   110  	m, err = s.st.Agent().Entity(s.machine.Tag())
   111  	c.Assert(err, jc.ErrorIsNil)
   112  	c.Assert(m.Tag(), gc.Equals, s.machine.Tag().String())
   113  	c.Assert(m.Life(), gc.Equals, params.Alive)
   114  	c.Assert(m.Jobs(), gc.DeepEquals, []multiwatcher.MachineJob{multiwatcher.JobHostUnits})
   115  
   116  	err = s.machine.EnsureDead()
   117  	c.Assert(err, jc.ErrorIsNil)
   118  	err = s.machine.Remove()
   119  	c.Assert(err, jc.ErrorIsNil)
   120  
   121  	m, err = s.st.Agent().Entity(s.machine.Tag())
   122  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("machine %s not found", s.machine.Id()))
   123  	c.Assert(err, jc.Satisfies, params.IsCodeNotFound)
   124  	c.Assert(m, gc.IsNil)
   125  }
   126  
   127  func (s *machineSuite) TestEntitySetPassword(c *gc.C) {
   128  	entity, err := s.st.Agent().Entity(s.machine.Tag())
   129  	c.Assert(err, jc.ErrorIsNil)
   130  
   131  	err = entity.SetPassword("foo")
   132  	c.Assert(err, gc.ErrorMatches, "password is only 3 bytes long, and is not a valid Agent password")
   133  	err = entity.SetPassword("foo-12345678901234567890")
   134  	c.Assert(err, jc.ErrorIsNil)
   135  	err = entity.ClearReboot()
   136  	c.Assert(err, jc.ErrorIsNil)
   137  
   138  	err = s.machine.Refresh()
   139  	c.Assert(err, jc.ErrorIsNil)
   140  	c.Assert(s.machine.PasswordValid("bar"), jc.IsFalse)
   141  	c.Assert(s.machine.PasswordValid("foo-12345678901234567890"), jc.IsTrue)
   142  
   143  	// Check that we cannot log in to mongo with the correct password.
   144  	// This is because there's no mongo password set for s.machine,
   145  	// which has JobHostUnits
   146  	info := s.MongoInfo(c)
   147  	// TODO(dfc) this entity.Tag should return a Tag
   148  	tag, err := names.ParseTag(entity.Tag())
   149  	c.Assert(err, jc.ErrorIsNil)
   150  	info.Tag = tag
   151  	info.Password = "foo-12345678901234567890"
   152  	err = tryOpenState(info)
   153  	c.Assert(err, jc.Satisfies, errors.IsUnauthorized)
   154  }
   155  
   156  func (s *machineSuite) TestClearReboot(c *gc.C) {
   157  	err := s.machine.SetRebootFlag(true)
   158  	c.Assert(err, jc.ErrorIsNil)
   159  	rFlag, err := s.machine.GetRebootFlag()
   160  	c.Assert(err, jc.ErrorIsNil)
   161  	c.Assert(rFlag, jc.IsTrue)
   162  
   163  	entity, err := s.st.Agent().Entity(s.machine.Tag())
   164  	c.Assert(err, jc.ErrorIsNil)
   165  
   166  	err = entity.ClearReboot()
   167  	c.Assert(err, jc.ErrorIsNil)
   168  
   169  	rFlag, err = s.machine.GetRebootFlag()
   170  	c.Assert(err, jc.ErrorIsNil)
   171  	c.Assert(rFlag, jc.IsFalse)
   172  }
   173  
   174  func tryOpenState(info *mongo.MongoInfo) error {
   175  	st, err := state.Open(info, mongo.DialOpts{}, environs.NewStatePolicy())
   176  	if err == nil {
   177  		st.Close()
   178  	}
   179  	return err
   180  }