From 0dd973a886b7ed141346b6f87a2432e3e85ee697 Mon Sep 17 00:00:00 2001 From: ale <ale@incal.net> Date: Fri, 4 Mar 2022 10:26:11 +0000 Subject: [PATCH] Add index-based service discovery names Backends can now be reached as "<index>.index.<service>", where index is 0-based and will change depending on the service assignment, so it is not guaranteed to stay constant for a specific backend. --- plugins/inventory/float.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/plugins/inventory/float.py b/plugins/inventory/float.py index 6038e2f2..49f81dc5 100644 --- a/plugins/inventory/float.py +++ b/plugins/inventory/float.py @@ -205,26 +205,27 @@ def _host_dns_map(name, inventory): # Return all service-related DNS names for a specific host. -def _host_service_names(name, service_name, inventory, is_leader): +def _host_service_names(name, service_name, inventory, is_leader, host_service_idx): # Use a set for deduplication when hostname == shard_id. names = set([ service_name, - name + '.' + service_name, - name + '.host.' + service_name, + f'{name}.{service_name}', + f'{name}.host.{service_name}', + f'{host_service_idx}.index.{service_name}', ]) if 'shard_id' in inventory['hosts'][name]: shard_id = inventory['hosts'][name]['shard_id'] - names.add(shard_id + '.' + service_name) - names.add(shard_id + '.shard.' + service_name) + names.add(f'{shard_id}.{service_name}') + names.add(f'{shard_id}.shard.{service_name}') if is_leader: - names.add(service_name + '-master') + names.add(f'{service_name}-master') return list(names) # Return host-specific parameters for the X509 service credentials # associated with a service. -def _service_credential_params(name, service_name, inventory, is_leader): - names = _host_service_names(name, service_name, inventory, is_leader) +def _service_credential_params(name, service_name, inventory, is_leader, host_service_idx): + names = _host_service_names(name, service_name, inventory, is_leader, host_service_idx) names.append('localhost') names.append(name) addrs = _host_addrs(name, inventory) @@ -248,13 +249,15 @@ def _common_net_overlay(hosta, hostb, inventory): # Build the service discovery DNS map for a service as seen from src_host. def _service_dns(src_host, service_name, service, inventory, assignments): dns = {} - for hostname in assignments.get_by_service(service_name): + for host_service_idx, hostname in enumerate( + assignments.get_by_service(service_name)): # Find the overlay in common between source and target host, # and use the target IP on that network. overlay = _common_net_overlay(src_host, hostname, inventory) addrs = _host_net_overlay_addrs(hostname, inventory, overlay) is_leader = assignments.is_master(service_name, hostname) - for name in _host_service_names(hostname, service_name, inventory, is_leader): + for name in _host_service_names( + hostname, service_name, inventory, is_leader, host_service_idx): dns.setdefault(name, []).extend(addrs) return dns @@ -420,7 +423,7 @@ def _host_vars(name, inventory, services, assignments): for c in services[s].get('service_credentials', []): if c.get('enable_server', True): params = _service_credential_params( - name, s, inventory, assignments.is_master(s, name)) + name, s, inventory, assignments.is_master(s, name), idx) hv['float_host_service_credentials'].append({ 'credentials': c, 'service': s, 'mode': 'server', 'x509_params': params}) -- GitLab