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