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: &params.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  }