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: ¶ms.MeterStatus{Color: "green", Message: "test information"}, 119 }, { 120 setStatus: &state.MeterStatus{Code: state.MeterAmber, Info: "test information"}, 121 expectedStatus: ¶ms.MeterStatus{Color: "amber", Message: "test information"}, 122 }, { 123 setStatus: &state.MeterStatus{Code: state.MeterRed, Info: "test information"}, 124 expectedStatus: ¶ms.MeterStatus{Color: "red", Message: "test information"}, 125 }, { 126 setStatus: &state.MeterStatus{Code: state.MeterGreen, Info: "test information"}, 127 expectedStatus: ¶ms.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 }