Skip to content

Commit 0a10fa9

Browse files
authored
Merge pull request gmr#107 from Beahmer89/enable_maint_mode
Add Service Maintenance Functionality
2 parents f596c77 + 028e89a commit 0a10fa9

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

consulate/api/agent.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,21 @@ def deregister(self, service_id):
274274
"""
275275
return self._put_no_response_body(['deregister', service_id])
276276

277+
def maintenance(self, service_id, enable=True, reason=None):
278+
"""Place given service into "maintenance mode".
279+
280+
:param str service_id: The id for the service
281+
:param bool enable: Enable maintenance mode
282+
:param str reason: Reason for putting node in maintenance
283+
:rtype: bool
284+
285+
"""
286+
query_params = {'enable': enable}
287+
if reason:
288+
query_params['reason'] = reason
289+
return self._put_no_response_body(['maintenance', service_id],
290+
query_params)
291+
277292
def checks(self):
278293
"""Return the all the checks that are registered with the local agent.
279294
These checks were either provided through configuration files, or

tests/agent_tests.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,22 @@ def test_service_registration(self):
8888
self.assertIn('test-service', self.consul.agent.services())
8989
self.consul.agent.service.deregister('test-service')
9090

91+
def test_service_maintenance(self):
92+
self.consul.agent.service.register(
93+
'test-service', address='10.0.0.1', port=5672, tags=['foo', 'bar'])
94+
self.assertIn('test-service', self.consul.agent.services())
95+
reason = 'Down for Acceptance'
96+
self.consul.agent.service.maintenance('test-service', reason=reason)
97+
node_in_maintenance = self.consul.catalog.nodes()[0]['Node']
98+
health_check = self.consul.health.node(node_in_maintenance)
99+
self.assertEqual(len(health_check), 2)
100+
self.assertIn(reason, [check['Notes'] for check in health_check])
101+
self.consul.agent.service.maintenance('test-service', enable=False)
102+
health_check = self.consul.health.node(node_in_maintenance)
103+
self.assertEqual(len(health_check), 1)
104+
self.assertNotEqual(reason, health_check[0]['Notes'])
105+
self.consul.agent.service.deregister('test-service')
106+
91107
def test_token(self):
92108
self.assertTrue(
93109
self.consul.agent.token('acl_replication_token', 'foo'))

0 commit comments

Comments
 (0)