github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/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  	s.State.SetStateServingInfo(ssi)
    57  	info, err := apiagent.NewState(st).StateServingInfo()
    58  	c.Assert(err, jc.ErrorIsNil)
    59  	c.Assert(info, jc.DeepEquals, expected)
    60  }
    61  
    62  func (s *servingInfoSuite) TestStateServingInfoPermission(c *gc.C) {
    63  	st, _ := s.OpenAPIAsNewMachine(c)
    64  
    65  	_, err := apiagent.NewState(st).StateServingInfo()
    66  	c.Assert(errors.Cause(err), gc.DeepEquals, &rpc.RequestError{
    67  		Message: "permission denied",
    68  		Code:    "unauthorized access",
    69  	})
    70  }
    71  
    72  func (s *servingInfoSuite) TestIsMaster(c *gc.C) {
    73  	calledIsMaster := false
    74  	var fakeMongoIsMaster = func(session *mgo.Session, m mongo.WithAddresses) (bool, error) {
    75  		calledIsMaster = true
    76  		return true, nil
    77  	}
    78  	s.PatchValue(&apiserveragent.MongoIsMaster, fakeMongoIsMaster)
    79  
    80  	st, _ := s.OpenAPIAsNewMachine(c, state.JobManageModel)
    81  	expected := true
    82  	result, err := apiagent.NewState(st).IsMaster()
    83  
    84  	c.Assert(err, jc.ErrorIsNil)
    85  	c.Assert(result, gc.Equals, expected)
    86  	c.Assert(calledIsMaster, jc.IsTrue)
    87  }
    88  
    89  func (s *servingInfoSuite) TestIsMasterPermission(c *gc.C) {
    90  	st, _ := s.OpenAPIAsNewMachine(c)
    91  	_, err := apiagent.NewState(st).IsMaster()
    92  	c.Assert(errors.Cause(err), gc.DeepEquals, &rpc.RequestError{
    93  		Message: "permission denied",
    94  		Code:    "unauthorized access",
    95  	})
    96  }
    97  
    98  type machineSuite struct {
    99  	testing.JujuConnSuite
   100  	machine *state.Machine
   101  	st      api.Connection
   102  }
   103  
   104  var _ = gc.Suite(&machineSuite{})
   105  
   106  func (s *machineSuite) SetUpTest(c *gc.C) {
   107  	s.JujuConnSuite.SetUpTest(c)
   108  	s.st, s.machine = s.OpenAPIAsNewMachine(c)
   109  }
   110  
   111  func (s *machineSuite) TestMachineEntity(c *gc.C) {
   112  	tag := names.NewMachineTag("42")
   113  	m, err := apiagent.NewState(s.st).Entity(tag)
   114  	c.Assert(err, gc.ErrorMatches, "permission denied")
   115  	c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized)
   116  	c.Assert(m, gc.IsNil)
   117  
   118  	m, err = apiagent.NewState(s.st).Entity(s.machine.Tag())
   119  	c.Assert(err, jc.ErrorIsNil)
   120  	c.Assert(m.Tag(), gc.Equals, s.machine.Tag().String())
   121  	c.Assert(m.Life(), gc.Equals, params.Alive)
   122  	c.Assert(m.Jobs(), gc.DeepEquals, []multiwatcher.MachineJob{multiwatcher.JobHostUnits})
   123  
   124  	err = s.machine.EnsureDead()
   125  	c.Assert(err, jc.ErrorIsNil)
   126  	err = s.machine.Remove()
   127  	c.Assert(err, jc.ErrorIsNil)
   128  
   129  	m, err = apiagent.NewState(s.st).Entity(s.machine.Tag())
   130  	c.Assert(err, gc.ErrorMatches, fmt.Sprintf("machine %s not found", s.machine.Id()))
   131  	c.Assert(err, jc.Satisfies, params.IsCodeNotFound)
   132  	c.Assert(m, gc.IsNil)
   133  }
   134  
   135  func (s *machineSuite) TestEntitySetPassword(c *gc.C) {
   136  	entity, err := apiagent.NewState(s.st).Entity(s.machine.Tag())
   137  	c.Assert(err, jc.ErrorIsNil)
   138  
   139  	err = entity.SetPassword("foo")
   140  	c.Assert(err, gc.ErrorMatches, "password is only 3 bytes long, and is not a valid Agent password")
   141  	err = entity.SetPassword("foo-12345678901234567890")
   142  	c.Assert(err, jc.ErrorIsNil)
   143  	err = entity.ClearReboot()
   144  	c.Assert(err, jc.ErrorIsNil)
   145  
   146  	err = s.machine.Refresh()
   147  	c.Assert(err, jc.ErrorIsNil)
   148  	c.Assert(s.machine.PasswordValid("bar"), jc.IsFalse)
   149  	c.Assert(s.machine.PasswordValid("foo-12345678901234567890"), jc.IsTrue)
   150  
   151  	// Check that we cannot log in to mongo with the correct password.
   152  	// This is because there's no mongo password set for s.machine,
   153  	// which has JobHostUnits
   154  	info := s.MongoInfo(c)
   155  	// TODO(dfc) this entity.Tag should return a Tag
   156  	tag, err := names.ParseTag(entity.Tag())
   157  	c.Assert(err, jc.ErrorIsNil)
   158  	info.Tag = tag
   159  	info.Password = "foo-12345678901234567890"
   160  	err = tryOpenState(s.State.ModelTag(), info)
   161  	c.Assert(errors.Cause(err), jc.Satisfies, errors.IsUnauthorized)
   162  }
   163  
   164  func (s *machineSuite) TestClearReboot(c *gc.C) {
   165  	err := s.machine.SetRebootFlag(true)
   166  	c.Assert(err, jc.ErrorIsNil)
   167  	rFlag, err := s.machine.GetRebootFlag()
   168  	c.Assert(err, jc.ErrorIsNil)
   169  	c.Assert(rFlag, jc.IsTrue)
   170  
   171  	entity, err := apiagent.NewState(s.st).Entity(s.machine.Tag())
   172  	c.Assert(err, jc.ErrorIsNil)
   173  
   174  	err = entity.ClearReboot()
   175  	c.Assert(err, jc.ErrorIsNil)
   176  
   177  	rFlag, err = s.machine.GetRebootFlag()
   178  	c.Assert(err, jc.ErrorIsNil)
   179  	c.Assert(rFlag, jc.IsFalse)
   180  }
   181  
   182  func tryOpenState(modelTag names.ModelTag, info *mongo.MongoInfo) error {
   183  	st, err := state.Open(modelTag, info, mongo.DefaultDialOpts(), environs.NewStatePolicy())
   184  	if err == nil {
   185  		st.Close()
   186  	}
   187  	return err
   188  }