github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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  	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/environs"
    21  	"github.com/juju/juju/juju/testing"
    22  	"github.com/juju/juju/mongo"
    23  	"github.com/juju/juju/mongo/mongotest"
    24  	"github.com/juju/juju/rpc"
    25  	"github.com/juju/juju/state"
    26  	"github.com/juju/juju/state/multiwatcher"
    27  	coretesting "github.com/juju/juju/testing"
    28  )
    29  
    30  func TestAll(t *stdtesting.T) {
    31  	coretesting.MgoTestPackage(t)
    32  }
    33  
    34  type servingInfoSuite struct {
    35  	testing.JujuConnSuite
    36  }
    37  
    38  var _ = gc.Suite(&servingInfoSuite{})
    39  
    40  func (s *servingInfoSuite) TestStateServingInfo(c *gc.C) {
    41  	st, _ := s.OpenAPIAsNewMachine(c, state.JobManageModel)
    42  
    43  	ssi := state.StateServingInfo{
    44  		PrivateKey:   "some key",
    45  		Cert:         "Some cert",
    46  		SharedSecret: "really, really secret",
    47  		APIPort:      33,
    48  		StatePort:    44,
    49  	}
    50  	expected := params.StateServingInfo{
    51  		PrivateKey:   ssi.PrivateKey,
    52  		Cert:         ssi.Cert,
    53  		SharedSecret: ssi.SharedSecret,
    54  		APIPort:      ssi.APIPort,
    55  		StatePort:    ssi.StatePort,
    56  	}
    57  	s.State.SetStateServingInfo(ssi)
    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(), 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, info *mongo.MongoInfo) error {
   184  	st, err := state.Open(modelTag, info, mongotest.DialOpts(), environs.NewStatePolicy())
   185  	if err == nil {
   186  		st.Close()
   187  	}
   188  	return err
   189  }