From 5be9202441785666f012a0c2c916eb93a1e23ee3 Mon Sep 17 00:00:00 2001
From: ale <ale@incal.net>
Date: Fri, 4 Mar 2022 10:21:26 +0000
Subject: [PATCH] Introduce 'host' and 'shard' service discovery subdomains

Start decoupling the service discovery namespaces.

Individual backends can now be reached as "<host>.host.<service>" and
"<shard_id>.shard.<service>", 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