diff --git a/consul/base.py b/consul/base.py index 16489264..63cb0221 100755 --- a/consul/base.py +++ b/consul/base.py @@ -1066,7 +1066,8 @@ def register(self, service=None, check=None, dc=None, - token=None): + token=None, + node_meta=None): """ A low level mechanism for directly registering or updating entries in the catalog. It is usually recommended to use @@ -1116,6 +1117,9 @@ def register(self, *token* is an optional `ACL token`_ to apply to this request. + *node_meta* is an optional meta data used for filtering, a + dictionary formatted as {k1:v1, k2:v2}. + This manipulates the health check entry, but does not setup a script or TTL to actually update the status. The full documentation is `here `_. @@ -1135,6 +1139,10 @@ def register(self, if token: data['WriteRequest'] = {'Token': token} params.append(('token', token)) + if node_meta: + for nodemeta_name, nodemeta_value in node_meta.items(): + params.append(('node-meta', '{0}:{1}'. + format(nodemeta_name, nodemeta_value))) return self.agent.http.put( CB.bool(), '/v1/catalog/register', @@ -1248,9 +1256,8 @@ def nodes( params.append((consistency, '1')) if node_meta: for nodemeta_name, nodemeta_value in node_meta.items(): - params.append(('node-meta', '{}:{}'. + params.append(('node-meta', '{0}:{1}'. format(nodemeta_name, nodemeta_value))) - return self.agent.http.get( CB.json(index=True), '/v1/catalog/nodes', params=params) @@ -1312,9 +1319,8 @@ def services(self, params.append((consistency, '1')) if node_meta: for nodemeta_name, nodemeta_value in node_meta.items(): - params.append(('node-meta', '{}:{}'. + params.append(('node-meta', '{0}:{1}'. format(nodemeta_name, nodemeta_value))) - return self.agent.http.get( CB.json(index=True), '/v1/catalog/services', params=params) @@ -1398,7 +1404,8 @@ def service( consistency=None, dc=None, near=None, - token=None): + token=None, + node_meta=None): """ Returns a tuple of (*index*, *nodes*) of the nodes providing *service* in the *dc* datacenter. *dc* defaults to the current @@ -1423,6 +1430,9 @@ def service( *token* is an optional `ACL token`_ to apply to this request. + *node_meta* is an optional meta data used for filtering, a + dictionary formatted as {k1:v1, k2:v2}. + The response looks like this:: (index, [ @@ -1454,6 +1464,10 @@ def service( consistency = consistency or self.agent.consistency if consistency in ('consistent', 'stale'): params.append((consistency, '1')) + if node_meta: + for nodemeta_name, nodemeta_value in node_meta.items(): + params.append(('node-meta', '{0}:{1}'. + format(nodemeta_name, nodemeta_value))) return self.agent.http.get( CB.json(index=True), '/v1/catalog/service/%s' % service, @@ -1521,9 +1535,8 @@ def service(self, params.append(('token', token)) if node_meta: for nodemeta_name, nodemeta_value in node_meta.items(): - params.append(('node-meta', '{}:{}'. + params.append(('node-meta', '{0}:{1}'. format(nodemeta_name, nodemeta_value))) - return self.agent.http.get( CB.json(index=True), '/v1/health/service/%s' % service, @@ -1577,9 +1590,8 @@ def checks( params.append(('token', token)) if node_meta: for nodemeta_name, nodemeta_value in node_meta.items(): - params.append(('node-meta', '{}:{}'. + params.append(('node-meta', '{0}:{1}'. format(nodemeta_name, nodemeta_value))) - return self.agent.http.get( CB.json(index=True), '/v1/health/checks/%s' % service, @@ -1638,7 +1650,7 @@ def state(self, params.append(('token', token)) if node_meta: for nodemeta_name, nodemeta_value in node_meta.items(): - params.append(('node-meta', '{}:{}'. + params.append(('node-meta', '{0}:{1}'. format(nodemeta_name, nodemeta_value))) return self.agent.http.get( CB.json(index=True), diff --git a/tests/test_base.py b/tests/test_base.py index 33db422c..cd894146 100755 --- a/tests/test_base.py +++ b/tests/test_base.py @@ -48,6 +48,20 @@ def _should_support(c): ) +def _should_support_node_meta(c): + return ( + # catalog + c.catalog.nodes, + c.catalog.services, + lambda **kw: c.catalog.service('foo', **kw), + lambda **kw: c.catalog.register('foo', 'bar', **kw), + # health + lambda **kw: c.health.service('foo', **kw), + lambda **kw: c.health.checks('foo', **kw), + lambda **kw: c.health.state('unknown', **kw), + ) + + class TestIndex(object): """ Tests read requests that should support blocking on an index @@ -80,6 +94,19 @@ def test_implicit(self): assert r(consistency='stale').params == [('stale', '1')] +class TestNodemeta(object): + """ + Tests read requests that should support node_meta + """ + + def test_node_meta(self): + c = Consul() + for r in _should_support_node_meta(c): + assert r().params == [] + assert sorted(r(node_meta={'env': 'prod', 'net': 1}).params) == \ + sorted([('node-meta', 'net:1'), ('node-meta', 'env:prod')]) + + class TestCB(object): def test_status_200_passes(self):