Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit f260cb7

Browse files
committed
Flesh out more stub functions.
1 parent 141ec04 commit f260cb7

File tree

4 files changed

+52
-12
lines changed

4 files changed

+52
-12
lines changed

synapse/appservice/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
logger = logging.getLogger(__name__)
2121

2222

23+
class ApplicationServiceState(object):
24+
DOWN = "down"
25+
UP = "up"
26+
27+
2328
class ApplicationService(object):
2429
"""Defines an application service. This definition is mostly what is
2530
provided to the /register AS API.

synapse/appservice/scheduler.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@
4949
components.
5050
"""
5151

52+
from synapse.appservice import ApplicationServiceState
5253
from twisted.internet import defer
54+
import logging
55+
56+
logger = logging.getLogger(__name__)
5357

5458

5559
class AppServiceScheduler(object):
@@ -162,21 +166,36 @@ def start_polling(self):
162166
if txn.send(self.as_api):
163167
txn.complete(self.store)
164168
else:
165-
# TODO mark AS as down
166169
self._start_recoverer(service)
167170
self.clock.call_later(1000, self.start_polling)
168171

169-
def on_recovered(self, service):
170-
# TODO mark AS as UP
171-
pass
172+
@defer.inlineCallbacks
173+
def on_recovered(self, recoverer):
174+
applied_state = yield self.store.set_appservice_state(
175+
recoverer.service,
176+
ApplicationServiceState.UP
177+
)
178+
if not applied_state:
179+
logger.error("Failed to apply appservice state UP to service %s",
180+
recoverer.service)
172181

173182
def add_recoverers(self, recoverers):
174183
for r in recoverers:
175184
self.recoverers.append(r)
176185

186+
@defer.inlineCallbacks
177187
def _start_recoverer(self, service):
178-
recoverer = self.recoverer_fn(service, self.on_recovered)
179-
recoverer.recover()
188+
applied_state = yield self.store.set_appservice_state(
189+
service,
190+
ApplicationServiceState.DOWN
191+
)
192+
if applied_state:
193+
recoverer = self.recoverer_fn(service, self.on_recovered)
194+
self.add_recoverers([recoverer])
195+
recoverer.recover()
196+
else:
197+
logger.error("Failed to apply appservice state DOWN to service %s",
198+
service)
180199

181200
def _is_service_up(self, service):
182201
pass
@@ -193,7 +212,9 @@ class _Recoverer(object):
193212
@staticmethod
194213
@defer.inlineCallbacks
195214
def start(clock, store, as_api, callback):
196-
services = yield store.get_failing_appservices()
215+
services = yield store.get_appservices_by_state(
216+
ApplicationServiceState.DOWN
217+
)
197218
recoverers = [
198219
_Recoverer(clock, store, as_api, s, callback) for s in services
199220
]
@@ -228,7 +249,7 @@ def retry(self):
228249
self._set_service_recovered()
229250

230251
def _set_service_recovered(self):
231-
self.callback(self.service)
252+
self.callback(self)
232253

233254
@defer.inlineCallbacks
234255
def _get_oldest_txn(self):

synapse/storage/appservice.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,15 +343,28 @@ class ApplicationServiceTransactionStore(SQLBaseStore):
343343
def __init__(self, hs):
344344
super(ApplicationServiceTransactionStore, self).__init__(hs)
345345

346-
def get_failing_appservices(self):
347-
"""Get a list of application services which are down.
346+
def get_appservices_by_state(self, state):
347+
"""Get a list of application services based on their state.
348348
349+
Args:
350+
state(ApplicationServiceState): The state to filter on.
349351
Returns:
350352
A Deferred which resolves to a list of ApplicationServices, which
351353
may be empty.
352354
"""
353355
pass
354356

357+
def set_appservice_state(self, service, state):
358+
"""Set the application service state.
359+
360+
Args:
361+
service(ApplicationService): The service whose state to set.
362+
state(ApplicationServiceState): The connectivity state to apply.
363+
Returns:
364+
A Deferred which resolves to True if the state was set successfully.
365+
"""
366+
pass
367+
355368
def complete_appservice_txn(self, txn_id, service):
356369
"""Completes an application service transaction.
357370

tests/appservice/test_scheduler.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ def take_txn(*args, **kwargs):
5757
self.assertEquals(1, txn.complete.call_count)
5858
# 2 because it needs to get None to know there are no more txns
5959
self.assertEquals(2, self.store.get_oldest_txn.call_count)
60-
self.assertEquals(1, self.callback.call_count)
60+
self.callback.assert_called_once_with(self.recoverer)
61+
self.assertEquals(self.recoverer.service, self.service)
6162

6263
def test_recover_retry_txn(self):
6364
txn = Mock()
@@ -91,7 +92,7 @@ def take_txn(*args, **kwargs):
9192
self.clock.advance_time(16000)
9293
self.assertEquals(1, txn.send.call_count) # new mock reset call count
9394
self.assertEquals(1, txn.complete.call_count)
94-
self.assertEquals(1, self.callback.call_count)
95+
self.callback.assert_called_once_with(self.recoverer)
9596

9697
class ApplicationServiceSchedulerEventGrouperTestCase(unittest.TestCase):
9798

0 commit comments

Comments
 (0)