| # |
| # Copyright 2017 the original author or authors. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| """ |
| Some consul related convenience functions |
| """ |
| |
| from structlog import get_logger |
| from consul import Consul |
| from random import randint |
| |
| log = get_logger() |
| |
| |
| def get_endpoint_from_consul(consul_endpoint, service_name): |
| """Look up, from consul, the service name specified by service-name |
| """ |
| log.debug('getting-service-endpoint', consul=consul_endpoint, |
| service=service_name) |
| |
| host = consul_endpoint.split(':')[0].strip() |
| port = int(consul_endpoint.split(':')[1].strip()) |
| |
| consul = Consul(host=host, port=port) |
| _, services = consul.catalog.service(service_name) |
| |
| if len(services) == 0: |
| raise Exception( |
| 'Cannot find service {} in consul'.format(service_name)) |
| |
| # pick a random entry |
| # TODO should we prefer local IP addresses? Probably. |
| |
| service = services[randint(0, len(services) - 1)] |
| endpoint = '{}:{}'.format(service['ServiceAddress'], |
| service['ServicePort']) |
| |
| return endpoint |
| |
| |
| if __name__ == '__main__': |
| get_endpoint_from_consul('10.100.198.220:8500', 'kafka') |