From 5be9202441785666f012a0c2c916eb93a1e23ee3 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 4 Mar 2022 10:21:26 +0000 Subject: [PATCH 1/2] Introduce 'host' and 'shard' service discovery subdomains Start decoupling the service discovery namespaces. Individual backends can now be reached as ".host." and ".shard.", as well as the legacy names. --- plugins/inventory/float.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/plugins/inventory/float.py b/plugins/inventory/float.py index e9fa22b6..6038e2f2 100644 --- a/plugins/inventory/float.py +++ b/plugins/inventory/float.py @@ -205,23 +205,26 @@ def _host_dns_map(name, inventory): # Return all service-related DNS names for a specific host. -def _host_service_names(name, service_name, inventory, assignments): +def _host_service_names(name, service_name, inventory, is_leader): # Use a set for deduplication when hostname == shard_id. names = set([ service_name, name + '.' + service_name, + name + '.host.' + service_name, ]) if 'shard_id' in inventory['hosts'][name]: - names.add(inventory['hosts'][name]['shard_id'] + '.' + service_name) - if assignments.is_master(service_name, name): + shard_id = inventory['hosts'][name]['shard_id'] + names.add(shard_id + '.' + service_name) + names.add(shard_id + '.shard.' + service_name) + if is_leader: names.add(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, assignments): - names = _host_service_names(name, service_name, inventory, assignments) +def _service_credential_params(name, service_name, inventory, is_leader): + names = _host_service_names(name, service_name, inventory, is_leader) names.append('localhost') names.append(name) addrs = _host_addrs(name, inventory) @@ -250,7 +253,8 @@ def _service_dns(src_host, service_name, service, inventory, assignments): # and use the target IP on that network. overlay = _common_net_overlay(src_host, hostname, inventory) addrs = _host_net_overlay_addrs(hostname, inventory, overlay) - for name in _host_service_names(hostname, service_name, inventory, assignments): + is_leader = assignments.is_master(service_name, hostname) + for name in _host_service_names(hostname, service_name, inventory, is_leader): dns.setdefault(name, []).extend(addrs) return dns @@ -415,7 +419,8 @@ def _host_vars(name, inventory, services, assignments): enabled_systemd_units.add(u) for c in services[s].get('service_credentials', []): if c.get('enable_server', True): - params = _service_credential_params(name, s, inventory, assignments) + params = _service_credential_params( + name, s, inventory, assignments.is_master(s, name)) hv['float_host_service_credentials'].append({ 'credentials': c, 'service': s, 'mode': 'server', 'x509_params': params}) -- GitLab From 0dd973a886b7ed141346b6f87a2432e3e85ee697 Mon Sep 17 00:00:00 2001 From: ale Date: Fri, 4 Mar 2022 10:26:11 +0000 Subject: [PATCH 2/2] Add index-based service discovery names Backends can now be reached as ".index.", 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