github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/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  	gc "launchpad.net/gocheck"
    11  
    12  	"launchpad.net/juju-core/environs"
    13  	"launchpad.net/juju-core/errors"
    14  	"launchpad.net/juju-core/juju/testing"
    15  	"launchpad.net/juju-core/state"
    16  	"launchpad.net/juju-core/state/api"
    17  	"launchpad.net/juju-core/state/api/params"
    18  	coretesting "launchpad.net/juju-core/testing"
    19  	jc "launchpad.net/juju-core/testing/checkers"
    20  )
    21  
    22  func TestAll(t *stdtesting.T) {
    23  	coretesting.MgoTestPackage(t)
    24  }
    25  
    26  type machineSuite struct {
    27  	testing.JujuConnSuite
    28  	machine *state.Machine
    29  	st      *api.State
    30  }
    31  
    32  var _ = gc.Suite(&machineSuite{})
    33  
    34  func (s *machineSuite) SetUpTest(c *gc.C) {
    35  	s.JujuConnSuite.SetUpTest(c)
    36  	s.st, s.machine = s.OpenAPIAsNewMachine(c)
    37  }
    38  
    39  func (s *machineSuite) TestMachineEntity(c *gc.C) {
    40  	m, err := s.st.Agent().Entity("42")
    41  	c.Assert(err, gc.ErrorMatches, "permission denied")
    42  	c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized)
    43  	c.Assert(m, gc.IsNil)
    44  
    45  	m, err = s.st.Agent().Entity(s.machine.Tag())
    46  	c.Assert(err, gc.IsNil)
    47  	c.Assert(m.Tag(), gc.Equals, s.machine.Tag())
    48  	c.Assert(m.Life(), gc.Equals, params.Alive)
    49  	c.Assert(m.Jobs(), gc.DeepEquals, []params.MachineJob{params.JobHostUnits})
    50  
    51  	err = s.machine.EnsureDead()
    52  	c.Assert(err, gc.IsNil)
    53  	err = s.machine.Remove()
    54  	c.Assert(err, gc.IsNil)
    55  
    56  	m, err = s.st.Agent().Entity(s.machine.Tag())
    57  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("machine %s not found", s.machine.Id()))
    58  	c.Assert(err, jc.Satisfies, params.IsCodeNotFound)
    59  	c.Assert(m, gc.IsNil)
    60  }
    61  
    62  func (s *machineSuite) TestEntitySetPassword(c *gc.C) {
    63  	entity, err := s.st.Agent().Entity(s.machine.Tag())
    64  	c.Assert(err, gc.IsNil)
    65  
    66  	err = entity.SetPassword("foo")
    67  	c.Assert(err, gc.ErrorMatches, "password is only 3 bytes long, and is not a valid Agent password")
    68  	err = entity.SetPassword("foo-12345678901234567890")
    69  	c.Assert(err, gc.IsNil)
    70  
    71  	err = s.machine.Refresh()
    72  	c.Assert(err, gc.IsNil)
    73  	c.Assert(s.machine.PasswordValid("bar"), gc.Equals, false)
    74  	c.Assert(s.machine.PasswordValid("foo-12345678901234567890"), gc.Equals, true)
    75  
    76  	// Check that we cannot log in to mongo with the correct password.
    77  	// This is because there's no mongo password set for s.machine,
    78  	// which has JobHostUnits
    79  	info := s.StateInfo(c)
    80  	info.Tag = entity.Tag()
    81  	info.Password = "foo-12345678901234567890"
    82  	err = tryOpenState(info)
    83  	c.Assert(err, jc.Satisfies, errors.IsUnauthorizedError)
    84  }
    85  
    86  func tryOpenState(info *state.Info) error {
    87  	st, err := state.Open(info, state.DialOpts{}, environs.NewStatePolicy())
    88  	if err == nil {
    89  		st.Close()
    90  	}
    91  	return err
    92  }