Skip to content

Commit

Permalink
tests for fallbacks
Browse files Browse the repository at this point in the history
  • Loading branch information
smn committed Jul 17, 2015
1 parent 1d3955d commit f214390
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 14 deletions.
31 changes: 20 additions & 11 deletions consular/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ def register_marathon_event_callback(self, events_url):
returnValue(registered)

def log_http_response(self, response, method, path, data):
print 'got response', repr(response)
log.msg('%s %s with %s returned: %s' % (
method, path, data, response.code))
return response
Expand All @@ -96,16 +97,7 @@ def marathon_request(self, method, path, data=None):
method, '%s%s' % (self.marathon_endpoint, path), data)

def consul_request(self, method, url, data=None):
d = self._request(method, url, data, timeout=self.fallback_timeout)
d.addErrback(self.consul_request_error_handler)
return d

def consul_request_error_handler(self, failure):
print 'fail!', failure

def fallback_consul_request(self, method, path, data=None):
return self._request(
method, '%s%s' % (self.consul_endpoint, path), data)
return self._request(method, url, data, timeout=self.fallback_timeout)

def _request(self, method, url, data, timeout=None):
d = self.request(
Expand Down Expand Up @@ -182,7 +174,7 @@ def register_service(self, agent_endpoint,
app_id, service_id, address, port):
log.msg('Registering %s at %s with %s at %s:%s.' % (
app_id, agent_endpoint, service_id, address, port))
return self.consul_request(
d = self.consul_request(
'PUT',
'%s/v1/agent/service/register' % (agent_endpoint,),
{
Expand All @@ -191,6 +183,23 @@ def register_service(self, agent_endpoint,
'Address': address,
'Port': port,
})
d.addErrback(
self.register_service_fallback, app_id, service_id, address, port)
return d

def register_service_fallback(self, failure,
app_id, service_id, address, port):
log.msg('Falling back for %s at %s with %s at %s:%s.' % (
app_id, self.consul_endpoint, service_id, address, port))
return self.consul_request(
'PUT',
'%s/v1/agent/service/register' % (self.consul_endpoint,),
{
'Name': app_id,
'ID': service_id,
'Address': address,
'Port': port,
})

def deregister_service(self, agent_endpoint, app_id, service_id):
log.msg('Deregistering %s at %s with %s' % (
Expand Down
30 changes: 27 additions & 3 deletions consular/tests/test_main.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,8 @@ def test_TASK_RUNNING(self):
'Address': 'slave-1234.acme.org',
'Port': 31372,
}))
request['deferred'].callback('ok')
request['deferred'].callback(
FakeResponse(200, [], json.dumps({})))
response = yield d
self.assertEqual((yield response.json()), {
'status': 'ok'
Expand All @@ -195,7 +196,8 @@ def test_TASK_KILLED(self):
request['url'],
('http://slave-1234.acme.org:8500'
'/v1/agent/service/deregister/my-app_0-1396592784349'))
request['deferred'].callback('ok')
request['deferred'].callback(
FakeResponse(200, [], json.dumps({})))
response = yield d
self.assertEqual((yield response.json()), {
'status': 'ok'
Expand Down Expand Up @@ -254,7 +256,8 @@ def test_sync_app_task(self):
'Port': 1234,
}))
self.assertEqual(consul_request['method'], 'PUT')
consul_request['deferred'].callback('')
consul_request['deferred'].callback(
FakeResponse(200, [], json.dumps({})))
yield d

@inlineCallbacks
Expand Down Expand Up @@ -369,3 +372,24 @@ def test_purge_dead_services(self):
deregister_request['deferred'].callback(
FakeResponse(200, [], json.dumps({})))
yield d

@inlineCallbacks
def test_fallback_to_main_consul(self):
self.consular.register_service(
'http://foo:8500', 'app_id', 'service_id', 'foo', 1234)
request = yield self.requests.get()
self.assertEqual(
request['url'],
'http://foo:8500/v1/agent/service/register')
request['deferred'].errback(Exception('Something terrible'))

fallback_request = yield self.requests.get()
self.assertEqual(
fallback_request['url'],
'http://localhost:8500/v1/agent/service/register')
self.assertEqual(fallback_request['data'], json.dumps({
'Name': 'app_id',
'ID': 'service_id',
'Address': 'foo',
'Port': 1234,
}))

0 comments on commit f214390

Please sign in to comment.