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