github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/apiserver/agent/agent_test.go (about) 1 package agent_test 2 3 import ( 4 stdtesting "testing" 5 6 gc "launchpad.net/gocheck" 7 8 "launchpad.net/juju-core/instance" 9 jujutesting "launchpad.net/juju-core/juju/testing" 10 "launchpad.net/juju-core/state" 11 "launchpad.net/juju-core/state/api/params" 12 "launchpad.net/juju-core/state/apiserver/agent" 13 apiservertesting "launchpad.net/juju-core/state/apiserver/testing" 14 coretesting "launchpad.net/juju-core/testing" 15 ) 16 17 func TestPackage(t *stdtesting.T) { 18 coretesting.MgoTestPackage(t) 19 } 20 21 type agentSuite struct { 22 jujutesting.JujuConnSuite 23 24 authorizer apiservertesting.FakeAuthorizer 25 26 machine0 *state.Machine 27 machine1 *state.Machine 28 container *state.Machine 29 agent *agent.API 30 } 31 32 var _ = gc.Suite(&agentSuite{}) 33 34 func (s *agentSuite) SetUpTest(c *gc.C) { 35 s.JujuConnSuite.SetUpTest(c) 36 37 var err error 38 s.machine0, err = s.State.AddMachine("quantal", state.JobManageEnviron) 39 c.Assert(err, gc.IsNil) 40 41 s.machine1, err = s.State.AddMachine("quantal", state.JobHostUnits) 42 c.Assert(err, gc.IsNil) 43 44 template := state.MachineTemplate{ 45 Series: "quantal", 46 Jobs: []state.MachineJob{state.JobHostUnits}, 47 } 48 s.container, err = s.State.AddMachineInsideMachine(template, s.machine1.Id(), instance.LXC) 49 c.Assert(err, gc.IsNil) 50 51 // Create a FakeAuthorizer so we can check permissions, 52 // set up assuming machine 1 has logged in. 53 s.authorizer = apiservertesting.FakeAuthorizer{ 54 Tag: s.machine1.Tag(), 55 LoggedIn: true, 56 MachineAgent: true, 57 } 58 59 // Create a machiner API for machine 1. 60 s.agent, err = agent.NewAPI(s.State, s.authorizer) 61 c.Assert(err, gc.IsNil) 62 } 63 64 func (s *agentSuite) TestAgentFailsWithNonAgent(c *gc.C) { 65 auth := s.authorizer 66 auth.MachineAgent = false 67 auth.UnitAgent = false 68 api, err := agent.NewAPI(s.State, auth) 69 c.Assert(err, gc.NotNil) 70 c.Assert(api, gc.IsNil) 71 c.Assert(err, gc.ErrorMatches, "permission denied") 72 } 73 74 func (s *agentSuite) TestAgentSucceedsWithUnitAgent(c *gc.C) { 75 auth := s.authorizer 76 auth.MachineAgent = false 77 auth.UnitAgent = true 78 _, err := agent.NewAPI(s.State, auth) 79 c.Assert(err, gc.IsNil) 80 } 81 82 func (s *agentSuite) TestGetEntities(c *gc.C) { 83 err := s.container.Destroy() 84 c.Assert(err, gc.IsNil) 85 args := params.Entities{ 86 Entities: []params.Entity{ 87 {Tag: "machine-1"}, 88 {Tag: "machine-0"}, 89 {Tag: "machine-1-lxc-0"}, 90 {Tag: "machine-42"}, 91 }, 92 } 93 results := s.agent.GetEntities(args) 94 c.Assert(results, gc.DeepEquals, params.AgentGetEntitiesResults{ 95 Entities: []params.AgentGetEntitiesResult{ 96 { 97 Life: "alive", 98 Jobs: []params.MachineJob{params.JobHostUnits}, 99 }, 100 {Error: apiservertesting.ErrUnauthorized}, 101 {Error: apiservertesting.ErrUnauthorized}, 102 {Error: apiservertesting.ErrUnauthorized}, 103 }, 104 }) 105 106 // Now login as the machine agent of the container and try again. 107 auth := s.authorizer 108 auth.MachineAgent = true 109 auth.UnitAgent = false 110 auth.Tag = s.container.Tag() 111 containerAgent, err := agent.NewAPI(s.State, auth) 112 c.Assert(err, gc.IsNil) 113 114 results = containerAgent.GetEntities(args) 115 c.Assert(results, gc.DeepEquals, params.AgentGetEntitiesResults{ 116 Entities: []params.AgentGetEntitiesResult{ 117 {Error: apiservertesting.ErrUnauthorized}, 118 {Error: apiservertesting.ErrUnauthorized}, 119 { 120 Life: "dying", 121 Jobs: []params.MachineJob{params.JobHostUnits}, 122 ContainerType: instance.LXC, 123 }, 124 {Error: apiservertesting.ErrUnauthorized}, 125 }, 126 }) 127 } 128 129 func (s *agentSuite) TestGetNotFoundEntity(c *gc.C) { 130 // Destroy the container first, so we can destroy its parent. 131 err := s.container.Destroy() 132 c.Assert(err, gc.IsNil) 133 err = s.container.EnsureDead() 134 c.Assert(err, gc.IsNil) 135 err = s.container.Remove() 136 c.Assert(err, gc.IsNil) 137 138 err = s.machine1.Destroy() 139 c.Assert(err, gc.IsNil) 140 err = s.machine1.EnsureDead() 141 c.Assert(err, gc.IsNil) 142 err = s.machine1.Remove() 143 c.Assert(err, gc.IsNil) 144 results := s.agent.GetEntities(params.Entities{ 145 Entities: []params.Entity{{Tag: "machine-1"}}, 146 }) 147 c.Assert(err, gc.IsNil) 148 c.Assert(results, gc.DeepEquals, params.AgentGetEntitiesResults{ 149 Entities: []params.AgentGetEntitiesResult{{ 150 Error: ¶ms.Error{ 151 Code: params.CodeNotFound, 152 Message: "machine 1 not found", 153 }, 154 }}, 155 }) 156 } 157 158 func (s *agentSuite) TestSetPasswords(c *gc.C) { 159 results, err := s.agent.SetPasswords(params.PasswordChanges{ 160 Changes: []params.PasswordChange{ 161 {Tag: "machine-0", Password: "xxx-12345678901234567890"}, 162 {Tag: "machine-1", Password: "yyy-12345678901234567890"}, 163 {Tag: "machine-42", Password: "zzz-12345678901234567890"}, 164 }, 165 }) 166 c.Assert(err, gc.IsNil) 167 c.Assert(results, gc.DeepEquals, params.ErrorResults{ 168 Results: []params.ErrorResult{ 169 {apiservertesting.ErrUnauthorized}, 170 {nil}, 171 {apiservertesting.ErrUnauthorized}, 172 }, 173 }) 174 err = s.machine1.Refresh() 175 c.Assert(err, gc.IsNil) 176 changed := s.machine1.PasswordValid("yyy-12345678901234567890") 177 c.Assert(changed, gc.Equals, true) 178 } 179 180 func (s *agentSuite) TestShortSetPasswords(c *gc.C) { 181 results, err := s.agent.SetPasswords(params.PasswordChanges{ 182 Changes: []params.PasswordChange{ 183 {Tag: "machine-1", Password: "yyy"}, 184 }, 185 }) 186 c.Assert(err, gc.IsNil) 187 c.Assert(results.Results, gc.HasLen, 1) 188 c.Assert(results.Results[0].Error, gc.ErrorMatches, 189 "password is only 3 bytes long, and is not a valid Agent password") 190 }