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 }