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