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