github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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 apiserveragent "github.com/juju/juju/apiserver/agent" 18 "github.com/juju/juju/apiserver/params" 19 "github.com/juju/juju/environs" 20 "github.com/juju/juju/juju/testing" 21 "github.com/juju/juju/mongo" 22 "github.com/juju/juju/state" 23 "github.com/juju/juju/state/multiwatcher" 24 coretesting "github.com/juju/juju/testing" 25 ) 26 27 func TestAll(t *stdtesting.T) { 28 coretesting.MgoTestPackage(t) 29 } 30 31 type servingInfoSuite struct { 32 testing.JujuConnSuite 33 } 34 35 var _ = gc.Suite(&servingInfoSuite{}) 36 37 func (s *servingInfoSuite) TestStateServingInfo(c *gc.C) { 38 st, _ := s.OpenAPIAsNewMachine(c, state.JobManageEnviron) 39 40 ssi := state.StateServingInfo{ 41 PrivateKey: "some key", 42 Cert: "Some cert", 43 SharedSecret: "really, really secret", 44 APIPort: 33, 45 StatePort: 44, 46 } 47 expected := params.StateServingInfo{ 48 PrivateKey: ssi.PrivateKey, 49 Cert: ssi.Cert, 50 SharedSecret: ssi.SharedSecret, 51 APIPort: ssi.APIPort, 52 StatePort: ssi.StatePort, 53 } 54 s.State.SetStateServingInfo(ssi) 55 info, err := st.Agent().StateServingInfo() 56 c.Assert(err, jc.ErrorIsNil) 57 c.Assert(info, jc.DeepEquals, expected) 58 } 59 60 func (s *servingInfoSuite) TestStateServingInfoPermission(c *gc.C) { 61 st, _ := s.OpenAPIAsNewMachine(c) 62 63 _, err := st.Agent().StateServingInfo() 64 c.Assert(err, gc.ErrorMatches, "permission denied") 65 } 66 67 func (s *servingInfoSuite) TestIsMaster(c *gc.C) { 68 calledIsMaster := false 69 var fakeMongoIsMaster = func(session *mgo.Session, m mongo.WithAddresses) (bool, error) { 70 calledIsMaster = true 71 return true, nil 72 } 73 s.PatchValue(&apiserveragent.MongoIsMaster, fakeMongoIsMaster) 74 75 st, _ := s.OpenAPIAsNewMachine(c, state.JobManageEnviron) 76 expected := true 77 result, err := st.Agent().IsMaster() 78 79 c.Assert(err, jc.ErrorIsNil) 80 c.Assert(result, gc.Equals, expected) 81 c.Assert(calledIsMaster, jc.IsTrue) 82 } 83 84 func (s *servingInfoSuite) TestIsMasterPermission(c *gc.C) { 85 st, _ := s.OpenAPIAsNewMachine(c) 86 _, err := st.Agent().IsMaster() 87 c.Assert(err, gc.ErrorMatches, "permission denied") 88 } 89 90 type machineSuite struct { 91 testing.JujuConnSuite 92 machine *state.Machine 93 st *api.State 94 } 95 96 var _ = gc.Suite(&machineSuite{}) 97 98 func (s *machineSuite) SetUpTest(c *gc.C) { 99 s.JujuConnSuite.SetUpTest(c) 100 s.st, s.machine = s.OpenAPIAsNewMachine(c) 101 } 102 103 func (s *machineSuite) TestMachineEntity(c *gc.C) { 104 tag := names.NewMachineTag("42") 105 m, err := s.st.Agent().Entity(tag) 106 c.Assert(err, gc.ErrorMatches, "permission denied") 107 c.Assert(err, jc.Satisfies, params.IsCodeUnauthorized) 108 c.Assert(m, gc.IsNil) 109 110 m, err = s.st.Agent().Entity(s.machine.Tag()) 111 c.Assert(err, jc.ErrorIsNil) 112 c.Assert(m.Tag(), gc.Equals, s.machine.Tag().String()) 113 c.Assert(m.Life(), gc.Equals, params.Alive) 114 c.Assert(m.Jobs(), gc.DeepEquals, []multiwatcher.MachineJob{multiwatcher.JobHostUnits}) 115 116 err = s.machine.EnsureDead() 117 c.Assert(err, jc.ErrorIsNil) 118 err = s.machine.Remove() 119 c.Assert(err, jc.ErrorIsNil) 120 121 m, err = s.st.Agent().Entity(s.machine.Tag()) 122 c.Assert(err, gc.ErrorMatches, fmt.Sprintf("machine %s not found", s.machine.Id())) 123 c.Assert(err, jc.Satisfies, params.IsCodeNotFound) 124 c.Assert(m, gc.IsNil) 125 } 126 127 func (s *machineSuite) TestEntitySetPassword(c *gc.C) { 128 entity, err := s.st.Agent().Entity(s.machine.Tag()) 129 c.Assert(err, jc.ErrorIsNil) 130 131 err = entity.SetPassword("foo") 132 c.Assert(err, gc.ErrorMatches, "password is only 3 bytes long, and is not a valid Agent password") 133 err = entity.SetPassword("foo-12345678901234567890") 134 c.Assert(err, jc.ErrorIsNil) 135 err = entity.ClearReboot() 136 c.Assert(err, jc.ErrorIsNil) 137 138 err = s.machine.Refresh() 139 c.Assert(err, jc.ErrorIsNil) 140 c.Assert(s.machine.PasswordValid("bar"), jc.IsFalse) 141 c.Assert(s.machine.PasswordValid("foo-12345678901234567890"), jc.IsTrue) 142 143 // Check that we cannot log in to mongo with the correct password. 144 // This is because there's no mongo password set for s.machine, 145 // which has JobHostUnits 146 info := s.MongoInfo(c) 147 // TODO(dfc) this entity.Tag should return a Tag 148 tag, err := names.ParseTag(entity.Tag()) 149 c.Assert(err, jc.ErrorIsNil) 150 info.Tag = tag 151 info.Password = "foo-12345678901234567890" 152 err = tryOpenState(info) 153 c.Assert(err, jc.Satisfies, errors.IsUnauthorized) 154 } 155 156 func (s *machineSuite) TestClearReboot(c *gc.C) { 157 err := s.machine.SetRebootFlag(true) 158 c.Assert(err, jc.ErrorIsNil) 159 rFlag, err := s.machine.GetRebootFlag() 160 c.Assert(err, jc.ErrorIsNil) 161 c.Assert(rFlag, jc.IsTrue) 162 163 entity, err := s.st.Agent().Entity(s.machine.Tag()) 164 c.Assert(err, jc.ErrorIsNil) 165 166 err = entity.ClearReboot() 167 c.Assert(err, jc.ErrorIsNil) 168 169 rFlag, err = s.machine.GetRebootFlag() 170 c.Assert(err, jc.ErrorIsNil) 171 c.Assert(rFlag, jc.IsFalse) 172 } 173 174 func tryOpenState(info *mongo.MongoInfo) error { 175 st, err := state.Open(info, mongo.DialOpts{}, environs.NewStatePolicy()) 176 if err == nil { 177 st.Close() 178 } 179 return err 180 }