def cmd_select(ctx, # type: click.Context
backend, # type: str
host, # type: str
port, # type: int
filter_address, # type: str
filter_service_name, # type: str
filter_service_tags, # type: str
hash_method, # type: proxenos.rendezvous.HashMethod
key, # type: str
):
# type: (...) -> None
"""Selects a node from a cluster."""
if port is None:
port = DEFAULT_PORTS[backend]
driver_manager = stevedore.driver.DriverManager(
namespace=proxenos.mappers.NAMESPACE,
name=backend,
invoke_on_load=False)
try:
mapper = driver_manager.driver(host=host, port=port)
except proxenos.errors.ServiceDiscoveryConnectionError as err:
click.secho(str(err), fg='red')
ctx.exit(proxenos.const.ExitCode.CONNECTION_FAILURE)
mapper.update()
cluster = mapper.cluster.copy()
# TODO(darvid): Add filtering support in the mapper API itself
if filter_service_tags:
pattern = re.compile(filter_service_tags)
cluster = {service for service in cluster
if all(pattern.match(tag) for tag in service.tags)}
if filter_service_name:
pattern = re.compile(filter_service_name)
cluster = {service for service in cluster
if pattern.match(service.name)}
if filter_address:
pattern = re.compile(filter_address)
cluster = {service for service in cluster
if pattern.match(str(service.socket_address))}
service = proxenos.rendezvous.select_node(
cluster, key, hash_method=hash_method)
if service is None:
ctx.exit(proxenos.const.ExitCode.SERVICES_NOT_FOUND)
click.echo(str(service.socket_address))
评论列表
文章目录