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 }