consul: Pass through service_id if specified on a check (#3295)

Fixes #3249
The python-consul library already supports this, so it is just a simple
case of enablement.
This does not break the current logic in `add` of parsing as a check,
then parsing as a service if that fails… because service_name is
mandatory on a service registration and is invalid on a check
registration.
This commit is contained in:
James Hart 2016-11-11 22:44:02 +00:00 committed by Matt Clay
parent 39f4e17838
commit 276c3410a5

View file

@ -185,7 +185,7 @@ EXAMPLES = '''
service_name: nginx
service_port: 80
interval: 60s
http: /status
http: "http://localhost:80/status"
- name: register external service nginx available at 10.1.5.23
consul:
@ -213,6 +213,14 @@ EXAMPLES = '''
script: "/opt/disk_usage.py"
interval: 5m
- name: register an http check against a service that's already registered
consul:
check_name: nginx-check2
check_id: nginx-check2
service_id: nginx
interval: 60s
http: "http://localhost:80/morestatus"
'''
try:
@ -265,7 +273,7 @@ def add_check(module, check):
retrieve the full metadata of an existing check through the consul api.
Without this we can't compare to the supplied check and so we must assume
a change. '''
if not check.name:
if not check.name and not service_id:
module.fail_json(msg='a check name is required for a node level check, one not attached to a service')
consul_api = get_consul_api(module)
@ -278,7 +286,8 @@ def add_check(module, check):
interval=check.interval,
ttl=check.ttl,
http=check.http,
timeout=check.timeout)
timeout=check.timeout,
service_id=check.service_id)
def remove_check(module, check_id):
@ -363,7 +372,8 @@ def parse_check(module):
module.params.get('ttl'),
module.params.get('notes'),
module.params.get('http'),
module.params.get('timeout')
module.params.get('timeout'),
module.params.get('service_id'),
)
@ -451,10 +461,11 @@ class ConsulService():
class ConsulCheck():
def __init__(self, check_id, name, node=None, host='localhost',
script=None, interval=None, ttl=None, notes=None, http=None, timeout=None):
script=None, interval=None, ttl=None, notes=None, http=None, timeout=None, service_id=None):
self.check_id = self.name = name
if check_id:
self.check_id = check_id
self.service_id = service_id
self.notes = notes
self.node = node
self.host = host
@ -488,13 +499,14 @@ class ConsulCheck():
return duration
def register(self, consul_api):
consul_api.agent.check.register(self.name, check_id=self.check_id,
consul_api.agent.check.register(self.name, check_id=self.check_id, service_id=self.service_id,
notes=self.notes,
check=self.check)
def __eq__(self, other):
return (isinstance(other, self.__class__)
and self.check_id == other.check_id
and self.service_id == other.service_id
and self.name == other.name
and self.script == script
and self.interval == interval)
@ -514,6 +526,7 @@ class ConsulCheck():
self._add(data, 'ttl')
self._add(data, 'http')
self._add(data, 'timeout')
self._add(data, 'service_id')
return data
def _add(self, data, key, attr=None):