Merge lp:~allenap/maas/region-rpc-broken--bug-1581654 into lp:~maas-committers/maas/trunk

Proposed by Gavin Panella
Status: Merged
Approved by: Andres Rodriguez
Approved revision: no longer in the source branch.
Merged at revision: 5024
Proposed branch: lp:~allenap/maas/region-rpc-broken--bug-1581654
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 136 lines (+46/-12)
2 files modified
src/maasserver/rpc/regionservice.py (+17/-8)
src/maasserver/rpc/tests/test_regionservice.py (+29/-4)
To merge this branch: bzr merge lp:~allenap/maas/region-rpc-broken--bug-1581654
Reviewer Review Type Date Requested Status
Lee Trager (community) Approve
Review via email: mp+294685@code.launchpad.net

Commit message

Fix getRegionID.

To post a comment you must log in.
Revision history for this message
Lee Trager (ltrager) wrote :

LGTM! Ran with make run, didn't see any exceptions.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/rpc/regionservice.py'
--- src/maasserver/rpc/regionservice.py 2016-05-13 17:29:37 +0000
+++ src/maasserver/rpc/regionservice.py 2016-05-13 21:52:14 +0000
@@ -106,6 +106,7 @@
106)106)
107from twisted.internet.defer import (107from twisted.internet.defer import (
108 CancelledError,108 CancelledError,
109 fail,
109 inlineCallbacks,110 inlineCallbacks,
110 maybeDeferred,111 maybeDeferred,
111 returnValue,112 returnValue,
@@ -482,6 +483,20 @@
482 endpoint=endpoint, rack_controller=rack_controller).delete()483 endpoint=endpoint, rack_controller=rack_controller).delete()
483484
484485
486def getRegionID():
487 """Obtain the region ID from the advertising service.
488
489 :return: :class:`Deferred`
490 """
491 try:
492 advertise = eventloop.services.getServiceNamed("rpc-advertise")
493 except:
494 return fail()
495 else:
496 return advertise.advertising.get().addCallback(
497 lambda advertising: advertising.region_id)
498
499
485@implementer(IConnection)500@implementer(IConnection)
486class RegionServer(Region):501class RegionServer(Region):
487 """The RPC protocol supported by a region controller, server version.502 """The RPC protocol supported by a region controller, server version.
@@ -512,12 +527,6 @@
512 digest_local = calculate_digest(secret, message, salt)527 digest_local = calculate_digest(secret, message, salt)
513 returnValue(digest == digest_local)528 returnValue(digest == digest_local)
514529
515 def getRegionID(self):
516 """Obtain the region ID from the advertising service."""
517 advertise = eventloop.services.getServiceNamed("rpc-advertise")
518 advertise.advertising.get().addCallback(
519 lambda advertising: advertising.region_id)
520
521 @region.RegisterRackController.responder530 @region.RegisterRackController.responder
522 @inlineCallbacks531 @inlineCallbacks
523 def register(532 def register(
@@ -549,7 +558,7 @@
549 # Get the region ID if we're dealing with a non-local rack; we558 # Get the region ID if we're dealing with a non-local rack; we
550 # won't need to bother for local racks.559 # won't need to bother for local racks.
551 if self.hostIsRemote:560 if self.hostIsRemote:
552 region_id = yield self.getRegionID()561 region_id = yield getRegionID()
553562
554 # Only register the connection into the database when its a valid563 # Only register the connection into the database when its a valid
555 # IPv4 and IPv6. Only time it is not an IPv4 or IPv6 address is564 # IPv4 and IPv6. Only time it is not an IPv4 or IPv6 address is
@@ -626,7 +635,7 @@
626635
627 def connectionLost(self, reason):636 def connectionLost(self, reason):
628 if self.hostIsRemote:637 if self.hostIsRemote:
629 self.getRegionID().addCallback(638 getRegionID().addCallback(
630 lambda region_id: deferToDatabase(639 lambda region_id: deferToDatabase(
631 unregisterConnection, region_id, self.ident, self.host))640 unregisterConnection, region_id, self.ident, self.host))
632 self.factory.service._removeConnectionFor(self.ident, self)641 self.factory.service._removeConnectionFor(self.ident, self)
633642
=== modified file 'src/maasserver/rpc/tests/test_regionservice.py'
--- src/maasserver/rpc/tests/test_regionservice.py 2016-05-13 17:29:37 +0000
+++ src/maasserver/rpc/tests/test_regionservice.py 2016-05-13 21:52:14 +0000
@@ -65,6 +65,7 @@
65 regionservice,65 regionservice,
66)66)
67from maasserver.rpc.regionservice import (67from maasserver.rpc.regionservice import (
68 getRegionID,
68 Region,69 Region,
69 RegionAdvertising,70 RegionAdvertising,
70 RegionAdvertisingService,71 RegionAdvertisingService,
@@ -90,6 +91,8 @@
90)91)
91from maasserver.utils.threads import deferToDatabase92from maasserver.utils.threads import deferToDatabase
92from maastesting.matchers import (93from maastesting.matchers import (
94 IsFiredDeferred,
95 IsUnfiredDeferred,
93 MockAnyCall,96 MockAnyCall,
94 MockCalledOnce,97 MockCalledOnce,
95 MockCalledOnceWith,98 MockCalledOnceWith,
@@ -1155,6 +1158,28 @@
1155 endpoint=endpoint, rack_controller=rack_controller).first())1158 endpoint=endpoint, rack_controller=rack_controller).first())
11561159
11571160
1161class TestGetRegionID(MAASTestCase):
1162 """Tests for `getRegionID`."""
1163
1164 def test__getRegionID_fails_when_advertising_service_not_running(self):
1165 region_id = getRegionID()
1166 self.assertThat(region_id, IsFiredDeferred())
1167 error = self.assertRaises(KeyError, extract_result, region_id)
1168 self.assertThat(str(error), Equals(repr('rpc-advertise')))
1169
1170 def test__getRegionID_returns_the_region_ID_when_available(self):
1171 service = RegionAdvertisingService()
1172 service.setName("rpc-advertise")
1173 service.setServiceParent(eventloop.services)
1174 self.addCleanup(service.disownServiceParent)
1175 region_id = getRegionID()
1176 self.assertThat(region_id, IsUnfiredDeferred())
1177 service.advertising.set(
1178 RegionAdvertising(sentinel.region_id, sentinel.process_id))
1179 self.assertThat(region_id, IsFiredDeferred())
1180 self.assertThat(region_id.result, Is(sentinel.region_id))
1181
1182
1158class TestRegionServer(MAASTransactionServerTestCase):1183class TestRegionServer(MAASTransactionServerTestCase):
11591184
1160 def test_interfaces(self):1185 def test_interfaces(self):
@@ -1209,7 +1234,8 @@
1209 protocol.ident = factory.make_name("node")1234 protocol.ident = factory.make_name("node")
1210 protocol.host = sentinel.host1235 protocol.host = sentinel.host
1211 protocol.hostIsRemote = True1236 protocol.hostIsRemote = True
1212 protocol.getRegionID = lambda: succeed(sentinel.region_id)1237 getRegionID = self.patch_autospec(regionservice, "getRegionID")
1238 getRegionID.return_value = succeed(sentinel.region_id)
1213 connectionLost_up_call = self.patch(amp.AMP, "connectionLost")1239 connectionLost_up_call = self.patch(amp.AMP, "connectionLost")
1214 service.connections[protocol.ident] = {protocol}1240 service.connections[protocol.ident] = {protocol}
12151241
@@ -1348,10 +1374,9 @@
1348 self.assertIsNotNone(responder)1374 self.assertIsNotNone(responder)
13491375
1350 def installFakeRegionAdvertisingService(self):1376 def installFakeRegionAdvertisingService(self):
1351 service = Service()1377 service = RegionAdvertisingService()
1352 service.setName("rpc-advertise")1378 service.setName("rpc-advertise")
1353 service.advertising = DeferredValue()1379 service.advertising.set(RegionAdvertising(
1354 service.advertising.set(Mock(
1355 region_id=factory.make_name("region-id"),1380 region_id=factory.make_name("region-id"),
1356 process_id=randint(1000, 9999)))1381 process_id=randint(1000, 9999)))
1357 service.setServiceParent(eventloop.services)1382 service.setServiceParent(eventloop.services)