github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/apiserver/client/status_test.go (about)

     1  // Copyright 2014 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package client_test
     5  
     6  import (
     7  	jc "github.com/juju/testing/checkers"
     8  	gc "gopkg.in/check.v1"
     9  
    10  	"github.com/juju/juju/apiserver/client"
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/instance"
    13  	"github.com/juju/juju/state"
    14  	"github.com/juju/juju/testing/factory"
    15  )
    16  
    17  type statusSuite struct {
    18  	baseSuite
    19  }
    20  
    21  var _ = gc.Suite(&statusSuite{})
    22  
    23  func (s *statusSuite) addMachine(c *gc.C) *state.Machine {
    24  	machine, err := s.State.AddMachine("quantal", state.JobHostUnits)
    25  	c.Assert(err, jc.ErrorIsNil)
    26  	return machine
    27  }
    28  
    29  // Complete testing of status functionality happens elsewhere in the codebase,
    30  // these tests just sanity-check the api itself.
    31  
    32  func (s *statusSuite) TestFullStatus(c *gc.C) {
    33  	machine := s.addMachine(c)
    34  	client := s.APIState.Client()
    35  	status, err := client.Status(nil)
    36  	c.Assert(err, jc.ErrorIsNil)
    37  	c.Check(status.EnvironmentName, gc.Equals, "dummyenv")
    38  	c.Check(status.Services, gc.HasLen, 0)
    39  	c.Check(status.Machines, gc.HasLen, 1)
    40  	c.Check(status.Networks, gc.HasLen, 0)
    41  	resultMachine, ok := status.Machines[machine.Id()]
    42  	if !ok {
    43  		c.Fatalf("Missing machine with id %q", machine.Id())
    44  	}
    45  	c.Check(resultMachine.Id, gc.Equals, machine.Id())
    46  	c.Check(resultMachine.Series, gc.Equals, machine.Series())
    47  }
    48  
    49  func (s *statusSuite) TestLegacyStatus(c *gc.C) {
    50  	machine := s.addMachine(c)
    51  	instanceId := "i-fakeinstance"
    52  	err := machine.SetProvisioned(instance.Id(instanceId), "fakenonce", nil)
    53  	c.Assert(err, jc.ErrorIsNil)
    54  	client := s.APIState.Client()
    55  	status, err := client.LegacyStatus()
    56  	c.Assert(err, jc.ErrorIsNil)
    57  	c.Check(status.Machines, gc.HasLen, 1)
    58  	resultMachine, ok := status.Machines[machine.Id()]
    59  	if !ok {
    60  		c.Fatalf("Missing machine with id %q", machine.Id())
    61  	}
    62  	c.Check(resultMachine.InstanceId, gc.Equals, instanceId)
    63  }
    64  
    65  var _ = gc.Suite(&statusUnitTestSuite{})
    66  
    67  type statusUnitTestSuite struct {
    68  	baseSuite
    69  	*factory.Factory
    70  }
    71  
    72  func (s *statusUnitTestSuite) SetUpTest(c *gc.C) {
    73  	s.baseSuite.SetUpTest(c)
    74  	// State gets reset per test, so must the factory.
    75  	s.Factory = factory.NewFactory(s.State)
    76  }
    77  
    78  func (s *statusUnitTestSuite) TestProcessMachinesWithOneMachineAndOneContainer(c *gc.C) {
    79  	host := s.MakeMachine(c, &factory.MachineParams{InstanceId: instance.Id("0")})
    80  	container := s.MakeMachineNested(c, host.Id(), nil)
    81  	machines := map[string][]*state.Machine{
    82  		host.Id(): {host, container},
    83  	}
    84  
    85  	statuses := client.ProcessMachines(machines)
    86  	c.Assert(statuses, gc.Not(gc.IsNil))
    87  
    88  	containerStatus := client.MakeMachineStatus(container)
    89  	c.Check(statuses[host.Id()].Containers[container.Id()].Id, gc.Equals, containerStatus.Id)
    90  }
    91  
    92  func (s *statusUnitTestSuite) TestProcessMachinesWithEmbeddedContainers(c *gc.C) {
    93  	host := s.MakeMachine(c, &factory.MachineParams{InstanceId: instance.Id("1")})
    94  	lxcHost := s.MakeMachineNested(c, host.Id(), nil)
    95  	machines := map[string][]*state.Machine{
    96  		host.Id(): {
    97  			host,
    98  			lxcHost,
    99  			s.MakeMachineNested(c, lxcHost.Id(), nil),
   100  			s.MakeMachineNested(c, host.Id(), nil),
   101  		},
   102  	}
   103  
   104  	statuses := client.ProcessMachines(machines)
   105  	c.Assert(statuses, gc.Not(gc.IsNil))
   106  
   107  	hostContainer := statuses[host.Id()].Containers
   108  	c.Check(hostContainer, gc.HasLen, 2)
   109  	c.Check(hostContainer[lxcHost.Id()].Containers, gc.HasLen, 1)
   110  }
   111  
   112  var testUnits = []struct {
   113  	unitName       string
   114  	setStatus      *state.MeterStatus
   115  	expectedStatus *params.MeterStatus
   116  }{{
   117  	setStatus:      &state.MeterStatus{Code: state.MeterGreen, Info: "test information"},
   118  	expectedStatus: &params.MeterStatus{Color: "green", Message: "test information"},
   119  }, {
   120  	setStatus:      &state.MeterStatus{Code: state.MeterAmber, Info: "test information"},
   121  	expectedStatus: &params.MeterStatus{Color: "amber", Message: "test information"},
   122  }, {
   123  	setStatus:      &state.MeterStatus{Code: state.MeterRed, Info: "test information"},
   124  	expectedStatus: &params.MeterStatus{Color: "red", Message: "test information"},
   125  }, {
   126  	setStatus:      &state.MeterStatus{Code: state.MeterGreen, Info: "test information"},
   127  	expectedStatus: &params.MeterStatus{Color: "green", Message: "test information"},
   128  }, {},
   129  }
   130  
   131  func (s *statusUnitTestSuite) TestMeterStatus(c *gc.C) {
   132  	service := s.MakeService(c, nil)
   133  
   134  	units, err := service.AllUnits()
   135  	c.Assert(err, jc.ErrorIsNil)
   136  	c.Assert(units, gc.HasLen, 0)
   137  
   138  	for i, unit := range testUnits {
   139  		u, err := service.AddUnit()
   140  		testUnits[i].unitName = u.Name()
   141  		c.Assert(err, jc.ErrorIsNil)
   142  		if unit.setStatus != nil {
   143  			err := u.SetMeterStatus(unit.setStatus.Code.String(), unit.setStatus.Info)
   144  			c.Assert(err, jc.ErrorIsNil)
   145  		}
   146  	}
   147  
   148  	client := s.APIState.Client()
   149  	status, err := client.Status(nil)
   150  	c.Assert(err, jc.ErrorIsNil)
   151  	c.Assert(status, gc.NotNil)
   152  	serviceStatus, ok := status.Services[service.Name()]
   153  	c.Assert(ok, gc.Equals, true)
   154  
   155  	c.Assert(serviceStatus.MeterStatuses, gc.HasLen, len(testUnits)-1)
   156  	for _, unit := range testUnits {
   157  		unitStatus, ok := serviceStatus.MeterStatuses[unit.unitName]
   158  
   159  		if unit.expectedStatus != nil {
   160  			c.Assert(ok, gc.Equals, true)
   161  			c.Assert(&unitStatus, gc.DeepEquals, unit.expectedStatus)
   162  		} else {
   163  			c.Assert(ok, gc.Equals, false)
   164  		}
   165  	}
   166  }