github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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/charmrevisionupdater" 11 "github.com/juju/juju/apiserver/charmrevisionupdater/testing" 12 "github.com/juju/juju/apiserver/client" 13 "github.com/juju/juju/apiserver/common" 14 "github.com/juju/juju/apiserver/params" 15 apiservertesting "github.com/juju/juju/apiserver/testing" 16 "github.com/juju/juju/instance" 17 jujutesting "github.com/juju/juju/juju/testing" 18 "github.com/juju/juju/state" 19 "github.com/juju/juju/testing/factory" 20 ) 21 22 type statusSuite struct { 23 baseSuite 24 } 25 26 var _ = gc.Suite(&statusSuite{}) 27 28 func (s *statusSuite) addMachine(c *gc.C) *state.Machine { 29 machine, err := s.State.AddMachine("quantal", state.JobHostUnits) 30 c.Assert(err, jc.ErrorIsNil) 31 return machine 32 } 33 34 // Complete testing of status functionality happens elsewhere in the codebase, 35 // these tests just sanity-check the api itself. 36 37 func (s *statusSuite) TestFullStatus(c *gc.C) { 38 machine := s.addMachine(c) 39 client := s.APIState.Client() 40 status, err := client.Status(nil) 41 c.Assert(err, jc.ErrorIsNil) 42 c.Check(status.ModelName, gc.Equals, "admin") 43 c.Check(status.Services, gc.HasLen, 0) 44 c.Check(status.Machines, gc.HasLen, 1) 45 resultMachine, ok := status.Machines[machine.Id()] 46 if !ok { 47 c.Fatalf("Missing machine with id %q", machine.Id()) 48 } 49 c.Check(resultMachine.Id, gc.Equals, machine.Id()) 50 c.Check(resultMachine.Series, gc.Equals, machine.Series()) 51 } 52 53 var _ = gc.Suite(&statusUnitTestSuite{}) 54 55 type statusUnitTestSuite struct { 56 baseSuite 57 *factory.Factory 58 } 59 60 func (s *statusUnitTestSuite) SetUpTest(c *gc.C) { 61 s.baseSuite.SetUpTest(c) 62 // State gets reset per test, so must the factory. 63 s.Factory = factory.NewFactory(s.State) 64 } 65 66 func (s *statusUnitTestSuite) TestProcessMachinesWithOneMachineAndOneContainer(c *gc.C) { 67 host := s.MakeMachine(c, &factory.MachineParams{InstanceId: instance.Id("0")}) 68 container := s.MakeMachineNested(c, host.Id(), nil) 69 machines := map[string][]*state.Machine{ 70 host.Id(): {host, container}, 71 } 72 73 statuses := client.ProcessMachines(machines) 74 c.Assert(statuses, gc.Not(gc.IsNil)) 75 76 containerStatus := client.MakeMachineStatus(container) 77 c.Check(statuses[host.Id()].Containers[container.Id()].Id, gc.Equals, containerStatus.Id) 78 } 79 80 func (s *statusUnitTestSuite) TestProcessMachinesWithEmbeddedContainers(c *gc.C) { 81 host := s.MakeMachine(c, &factory.MachineParams{InstanceId: instance.Id("1")}) 82 lxcHost := s.MakeMachineNested(c, host.Id(), nil) 83 machines := map[string][]*state.Machine{ 84 host.Id(): { 85 host, 86 lxcHost, 87 s.MakeMachineNested(c, lxcHost.Id(), nil), 88 s.MakeMachineNested(c, host.Id(), nil), 89 }, 90 } 91 92 statuses := client.ProcessMachines(machines) 93 c.Assert(statuses, gc.Not(gc.IsNil)) 94 95 hostContainer := statuses[host.Id()].Containers 96 c.Check(hostContainer, gc.HasLen, 2) 97 c.Check(hostContainer[lxcHost.Id()].Containers, gc.HasLen, 1) 98 } 99 100 var testUnits = []struct { 101 unitName string 102 setStatus *state.MeterStatus 103 expectedStatus *params.MeterStatus 104 }{{ 105 setStatus: &state.MeterStatus{Code: state.MeterGreen, Info: "test information"}, 106 expectedStatus: ¶ms.MeterStatus{Color: "green", Message: "test information"}, 107 }, { 108 setStatus: &state.MeterStatus{Code: state.MeterAmber, Info: "test information"}, 109 expectedStatus: ¶ms.MeterStatus{Color: "amber", Message: "test information"}, 110 }, { 111 setStatus: &state.MeterStatus{Code: state.MeterRed, Info: "test information"}, 112 expectedStatus: ¶ms.MeterStatus{Color: "red", Message: "test information"}, 113 }, { 114 setStatus: &state.MeterStatus{Code: state.MeterGreen, Info: "test information"}, 115 expectedStatus: ¶ms.MeterStatus{Color: "green", Message: "test information"}, 116 }, {}, 117 } 118 119 func (s *statusUnitTestSuite) TestMeterStatus(c *gc.C) { 120 service := s.MakeService(c, nil) 121 122 units, err := service.AllUnits() 123 c.Assert(err, jc.ErrorIsNil) 124 c.Assert(units, gc.HasLen, 0) 125 126 for i, unit := range testUnits { 127 u, err := service.AddUnit() 128 testUnits[i].unitName = u.Name() 129 c.Assert(err, jc.ErrorIsNil) 130 if unit.setStatus != nil { 131 err := u.SetMeterStatus(unit.setStatus.Code.String(), unit.setStatus.Info) 132 c.Assert(err, jc.ErrorIsNil) 133 } 134 } 135 136 client := s.APIState.Client() 137 status, err := client.Status(nil) 138 c.Assert(err, jc.ErrorIsNil) 139 c.Assert(status, gc.NotNil) 140 serviceStatus, ok := status.Services[service.Name()] 141 c.Assert(ok, gc.Equals, true) 142 143 c.Assert(serviceStatus.MeterStatuses, gc.HasLen, len(testUnits)-1) 144 for _, unit := range testUnits { 145 unitStatus, ok := serviceStatus.MeterStatuses[unit.unitName] 146 147 if unit.expectedStatus != nil { 148 c.Assert(ok, gc.Equals, true) 149 c.Assert(&unitStatus, gc.DeepEquals, unit.expectedStatus) 150 } else { 151 c.Assert(ok, gc.Equals, false) 152 } 153 } 154 } 155 156 type statusUpgradeUnitSuite struct { 157 testing.CharmSuite 158 jujutesting.JujuConnSuite 159 160 charmrevisionupdater *charmrevisionupdater.CharmRevisionUpdaterAPI 161 resources *common.Resources 162 authoriser apiservertesting.FakeAuthorizer 163 } 164 165 var _ = gc.Suite(&statusUpgradeUnitSuite{}) 166 167 func (s *statusUpgradeUnitSuite) SetUpSuite(c *gc.C) { 168 s.JujuConnSuite.SetUpSuite(c) 169 s.CharmSuite.SetUpSuite(c, &s.JujuConnSuite) 170 } 171 172 func (s *statusUpgradeUnitSuite) TearDownSuite(c *gc.C) { 173 s.CharmSuite.TearDownSuite(c) 174 s.JujuConnSuite.TearDownSuite(c) 175 } 176 177 func (s *statusUpgradeUnitSuite) SetUpTest(c *gc.C) { 178 s.JujuConnSuite.SetUpTest(c) 179 s.CharmSuite.SetUpTest(c) 180 s.resources = common.NewResources() 181 s.AddCleanup(func(_ *gc.C) { s.resources.StopAll() }) 182 s.authoriser = apiservertesting.FakeAuthorizer{ 183 EnvironManager: true, 184 } 185 var err error 186 s.charmrevisionupdater, err = charmrevisionupdater.NewCharmRevisionUpdaterAPI(s.State, s.resources, s.authoriser) 187 c.Assert(err, jc.ErrorIsNil) 188 } 189 190 func (s *statusUpgradeUnitSuite) TearDownTest(c *gc.C) { 191 s.CharmSuite.TearDownTest(c) 192 s.JujuConnSuite.TearDownTest(c) 193 } 194 195 func (s *statusUpgradeUnitSuite) TestUpdateRevisions(c *gc.C) { 196 s.AddMachine(c, "0", state.JobManageModel) 197 s.SetupScenario(c) 198 client := s.APIState.Client() 199 status, _ := client.Status(nil) 200 201 serviceStatus, ok := status.Services["mysql"] 202 c.Assert(ok, gc.Equals, true) 203 c.Assert(serviceStatus.CanUpgradeTo, gc.Equals, "") 204 205 // Update to the latest available charm revision. 206 result, err := s.charmrevisionupdater.UpdateLatestRevisions() 207 c.Assert(err, jc.ErrorIsNil) 208 c.Assert(result.Error, gc.IsNil) 209 210 // Check if CanUpgradeTo suggest the latest revision. 211 status, _ = client.Status(nil) 212 serviceStatus, ok = status.Services["mysql"] 213 c.Assert(ok, gc.Equals, true) 214 c.Assert(serviceStatus.CanUpgradeTo, gc.Equals, "cs:quantal/mysql-23") 215 }