Merge lp:~allenap/maas/rack-controller-service--bug-1578800 into lp:~maas-committers/maas/trunk

Proposed by Gavin Panella
Status: Merged
Approved by: Gavin Panella
Approved revision: no longer in the source branch.
Merged at revision: 4999
Proposed branch: lp:~allenap/maas/rack-controller-service--bug-1578800
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 233 lines (+51/-37)
2 files modified
src/maasserver/rack_controller.py (+5/-5)
src/maasserver/tests/test_rack_controller.py (+46/-32)
To merge this branch: bzr merge lp:~allenap/maas/rack-controller-service--bug-1578800
Reviewer Review Type Date Requested Status
Mike Pontillo (community) Approve
Review via email: mp+293993@code.launchpad.net

Commit message

Update RackControllerService to use the new RegionAdvertisingService API.

Description of the change

RackControllerService's tests relied a little too heavily on mocks, meaning changes to RegionAdvertisingService's API did not cause test failures. This branch still uses mocks, but I've specified spec objects, and used real DeferredValue and RegionAdvertising instances where possible.

To post a comment you must log in.
Revision history for this message
Mike Pontillo (mpontillo) wrote :

Looks good to me; thanks for the fix.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/rack_controller.py'
--- src/maasserver/rack_controller.py 2016-04-11 16:23:26 +0000
+++ src/maasserver/rack_controller.py 2016-05-06 10:30:32 +0000
@@ -91,12 +91,12 @@
91 """Start listening for messages."""91 """Start listening for messages."""
92 super(RackControllerService, self).startService()92 super(RackControllerService, self).startService()
9393
94 def cb_registerWithPostgres(processId):94 def cb_registerWithPostgres(advertising):
95 # Register the coreHandler with postgres.95 # Register the coreHandler with postgres.
96 self.processId = processId96 self.processId = advertising.process_id
97 self.postgresListener.register(97 self.postgresListener.register(
98 "sys_core_%d" % processId, self.coreHandler)98 "sys_core_%d" % self.processId, self.coreHandler)
99 return processId99 return self.processId
100100
101 @transactional101 @transactional
102 def cb_getManagingProcesses(processId):102 def cb_getManagingProcesses(processId):
@@ -122,7 +122,7 @@
122 failure.trap(CancelledError)122 failure.trap(CancelledError)
123 self.starting = None123 self.starting = None
124124
125 self.starting = self.advertisingService.processId.get()125 self.starting = self.advertisingService.advertising.get()
126 self.starting.addCallback(cb_registerWithPostgres)126 self.starting.addCallback(cb_registerWithPostgres)
127 self.starting.addCallback(127 self.starting.addCallback(
128 partial(deferToDatabase, cb_getManagingProcesses))128 partial(deferToDatabase, cb_getManagingProcesses))
129129
=== modified file 'src/maasserver/tests/test_rack_controller.py'
--- src/maasserver/tests/test_rack_controller.py 2016-04-11 16:23:26 +0000
+++ src/maasserver/tests/test_rack_controller.py 2016-05-06 10:30:32 +0000
@@ -6,10 +6,19 @@
6__all__ = []6__all__ = []
77
8import random8import random
9from unittest.mock import (
10 call,
11 Mock,
12 sentinel,
13)
914
10from crochet import wait_for15from crochet import wait_for
11from maasserver import rack_controller16from maasserver import rack_controller
12from maasserver.rack_controller import RackControllerService17from maasserver.rack_controller import RackControllerService
18from maasserver.rpc.regionservice import (
19 RegionAdvertising,
20 RegionAdvertisingService,
21)
13from maasserver.testing.factory import factory22from maasserver.testing.factory import factory
14from maasserver.testing.testcase import MAASServerTestCase23from maasserver.testing.testcase import MAASServerTestCase
15from maasserver.utils.orm import transactional24from maasserver.utils.orm import transactional
@@ -20,11 +29,7 @@
20 MockCallsMatch,29 MockCallsMatch,
21 MockNotCalled,30 MockNotCalled,
22)31)
23from mock import (32from provisioningserver.utils.twisted import DeferredValue
24 call,
25 MagicMock,
26 sentinel,
27)
28from testtools import ExpectedException33from testtools import ExpectedException
29from testtools.matchers import MatchesStructure34from testtools.matchers import MatchesStructure
30from twisted.internet import reactor35from twisted.internet import reactor
@@ -54,21 +59,23 @@
54 advertisingService=sentinel.advertiser))59 advertisingService=sentinel.advertiser))
5560
56 def test_startService_sets_starting_to_result_of_processId_get(self):61 def test_startService_sets_starting_to_result_of_processId_get(self):
57 defer = MagicMock()62 advertising = Mock(DeferredValue, get=Mock())
58 advertiser = MagicMock()63 advertiser = Mock(RegionAdvertisingService, advertising=advertising)
59 advertiser.processId.get.return_value = defer
60 service = RackControllerService(sentinel.listener, advertiser)64 service = RackControllerService(sentinel.listener, advertiser)
61 observed = service.startService()65 observed = service.startService()
62 self.assertEqual(defer, observed)66 self.assertEqual(advertising.get.return_value, observed)
63 self.assertEqual(defer, service.starting)67 self.assertEqual(advertising.get.return_value, service.starting)
6468
65 @wait_for_reactor69 @wait_for_reactor
66 @inlineCallbacks70 @inlineCallbacks
67 def test_startService_registers_with_postgres_listener(self):71 def test_startService_registers_with_postgres_listener(self):
68 regionProcessId = random.randint(0, 100)72 regionProcessId = random.randint(0, 100)
69 advertiser = MagicMock()73
70 advertiser.processId.get.return_value = succeed(regionProcessId)74 advertising = DeferredValue()
71 listener = MagicMock()75 advertising.set(RegionAdvertising(sentinel.region_id, regionProcessId))
76 advertiser = Mock(RegionAdvertisingService, advertising=advertising)
77
78 listener = Mock()
72 service = RackControllerService(listener, advertiser)79 service = RackControllerService(listener, advertiser)
73 yield service.startService()80 yield service.startService()
74 self.assertThat(81 self.assertThat(
@@ -82,18 +89,22 @@
82 @inlineCallbacks89 @inlineCallbacks
83 def test_startService_clears_starting_once_complete(self):90 def test_startService_clears_starting_once_complete(self):
84 regionProcessId = random.randint(0, 100)91 regionProcessId = random.randint(0, 100)
85 advertiser = MagicMock()92
86 advertiser.processId.get.return_value = succeed(regionProcessId)93 advertising = DeferredValue()
87 listener = MagicMock()94 advertising.set(RegionAdvertising(sentinel.region_id, regionProcessId))
95 advertiser = Mock(RegionAdvertisingService, advertising=advertising)
96
97 listener = Mock()
88 service = RackControllerService(listener, advertiser)98 service = RackControllerService(listener, advertiser)
89 yield service.startService()99 yield service.startService()
90 self.assertIsNone(service.starting)100 self.assertIsNone(service.starting)
91101
92 @wait_for_reactor102 @wait_for_reactor
93 def test_startService_handles_cancel(self):103 def test_startService_handles_cancel(self):
94 advertiser = MagicMock()104 advertising = DeferredValue()
95 advertiser.processId.get.return_value = Deferred()105 advertiser = Mock(RegionAdvertisingService, advertising=advertising)
96 listener = MagicMock()106
107 listener = Mock()
97 service = RackControllerService(listener, advertiser)108 service = RackControllerService(listener, advertiser)
98 starting = service.startService()109 starting = service.startService()
99 self.assertIs(starting, service.starting)110 self.assertIs(starting, service.starting)
@@ -116,9 +127,12 @@
116127
117 process, rack_controllers = yield deferToDatabase(128 process, rack_controllers = yield deferToDatabase(
118 create_process_and_racks)129 create_process_and_racks)
119 advertiser = MagicMock()130
120 advertiser.processId.get.return_value = succeed(process.id)131 advertising = DeferredValue()
121 listener = MagicMock()132 advertising.set(RegionAdvertising(sentinel.region_id, process.id))
133 advertiser = Mock(RegionAdvertisingService, advertising=advertising)
134
135 listener = Mock()
122 service = RackControllerService(listener, advertiser)136 service = RackControllerService(listener, advertiser)
123 mock_coreHandler = self.patch(service, "coreHandler")137 mock_coreHandler = self.patch(service, "coreHandler")
124 yield service.startService()138 yield service.startService()
@@ -132,7 +146,7 @@
132 @wait_for_reactor146 @wait_for_reactor
133 @inlineCallbacks147 @inlineCallbacks
134 def test_stopService_handles_canceling_startup(self):148 def test_stopService_handles_canceling_startup(self):
135 listener = MagicMock()149 listener = Mock()
136 service = RackControllerService(150 service = RackControllerService(
137 listener, sentinel.advertiser)151 listener, sentinel.advertiser)
138 service.processId = random.randint(0, 100)152 service.processId = random.randint(0, 100)
@@ -148,7 +162,7 @@
148 @inlineCallbacks162 @inlineCallbacks
149 def test_stopService_calls_unregister_for_the_process(self):163 def test_stopService_calls_unregister_for_the_process(self):
150 processId = random.randint(0, 100)164 processId = random.randint(0, 100)
151 listener = MagicMock()165 listener = Mock()
152 service = RackControllerService(166 service = RackControllerService(
153 listener, sentinel.advertiser)167 listener, sentinel.advertiser)
154 service.processId = processId168 service.processId = processId
@@ -166,7 +180,7 @@
166 random.randint(0, 100)180 random.randint(0, 100)
167 for _ in range(3)181 for _ in range(3)
168 }182 }
169 listener = MagicMock()183 listener = Mock()
170 service = RackControllerService(184 service = RackControllerService(
171 listener, sentinel.advertiser)185 listener, sentinel.advertiser)
172 service.processId = processId186 service.processId = processId
@@ -183,7 +197,7 @@
183 def test_coreHandler_unwatch_calls_unregister(self):197 def test_coreHandler_unwatch_calls_unregister(self):
184 processId = random.randint(0, 100)198 processId = random.randint(0, 100)
185 rack_id = random.randint(0, 100)199 rack_id = random.randint(0, 100)
186 listener = MagicMock()200 listener = Mock()
187 service = RackControllerService(201 service = RackControllerService(
188 listener, sentinel.advertiser)202 listener, sentinel.advertiser)
189 service.processId = processId203 service.processId = processId
@@ -199,7 +213,7 @@
199 def test_coreHandler_unwatch_doesnt_call_unregister(self):213 def test_coreHandler_unwatch_doesnt_call_unregister(self):
200 processId = random.randint(0, 100)214 processId = random.randint(0, 100)
201 rack_id = random.randint(0, 100)215 rack_id = random.randint(0, 100)
202 listener = MagicMock()216 listener = Mock()
203 service = RackControllerService(217 service = RackControllerService(
204 listener, sentinel.advertiser)218 listener, sentinel.advertiser)
205 service.processId = processId219 service.processId = processId
@@ -210,7 +224,7 @@
210 def test_coreHandler_watch_calls_register_and_startProcessing(self):224 def test_coreHandler_watch_calls_register_and_startProcessing(self):
211 processId = random.randint(0, 100)225 processId = random.randint(0, 100)
212 rack_id = random.randint(0, 100)226 rack_id = random.randint(0, 100)
213 listener = MagicMock()227 listener = Mock()
214 service = RackControllerService(228 service = RackControllerService(
215 listener, sentinel.advertiser)229 listener, sentinel.advertiser)
216 service.processId = processId230 service.processId = processId
@@ -226,7 +240,7 @@
226 def test_coreHandler_watch_doesnt_call_register(self):240 def test_coreHandler_watch_doesnt_call_register(self):
227 processId = random.randint(0, 100)241 processId = random.randint(0, 100)
228 rack_id = random.randint(0, 100)242 rack_id = random.randint(0, 100)
229 listener = MagicMock()243 listener = Mock()
230 service = RackControllerService(244 service = RackControllerService(
231 listener, sentinel.advertiser)245 listener, sentinel.advertiser)
232 service.processId = processId246 service.processId = processId
@@ -242,7 +256,7 @@
242 def test_coreHandler_raises_ValueError_for_unknown_action(self):256 def test_coreHandler_raises_ValueError_for_unknown_action(self):
243 processId = random.randint(0, 100)257 processId = random.randint(0, 100)
244 rack_id = random.randint(0, 100)258 rack_id = random.randint(0, 100)
245 listener = MagicMock()259 listener = Mock()
246 service = RackControllerService(260 service = RackControllerService(
247 listener, sentinel.advertiser)261 listener, sentinel.advertiser)
248 service.processId = processId262 service.processId = processId
@@ -252,7 +266,7 @@
252266
253 def test_dhcpHandler_adds_to_needsDHCPUpdate(self):267 def test_dhcpHandler_adds_to_needsDHCPUpdate(self):
254 rack_id = random.randint(0, 100)268 rack_id = random.randint(0, 100)
255 listener = MagicMock()269 listener = Mock()
256 service = RackControllerService(270 service = RackControllerService(
257 listener, sentinel.advertiser)271 listener, sentinel.advertiser)
258 service.watching = set([rack_id])272 service.watching = set([rack_id])
@@ -263,7 +277,7 @@
263277
264 def test_dhcpHandler_doesnt_add_to_needsDHCPUpdate(self):278 def test_dhcpHandler_doesnt_add_to_needsDHCPUpdate(self):
265 rack_id = random.randint(0, 100)279 rack_id = random.randint(0, 100)
266 listener = MagicMock()280 listener = Mock()
267 service = RackControllerService(281 service = RackControllerService(
268 listener, sentinel.advertiser)282 listener, sentinel.advertiser)
269 mock_startProcessing = self.patch(service, "startProcessing")283 mock_startProcessing = self.patch(service, "startProcessing")