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