From 4d6b867bb3e14c06cbb04e9047a762b5d411b779 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 17 Oct 2020 12:57:35 +0200 Subject: [PATCH] bundles/powerdns: add metadata reactor for automatic node-dns-generation --- bundles/powerdns/metadata.py | 51 +++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/bundles/powerdns/metadata.py b/bundles/powerdns/metadata.py index 14c0370..1161c37 100644 --- a/bundles/powerdns/metadata.py +++ b/bundles/powerdns/metadata.py @@ -52,25 +52,40 @@ def get_ips_of_primary_nameservers(metadata): @metadata_reactor -def get_ips_of_primary_nameserver(metadata): - if not metadata.get('powerdns/is_secondary', False): - return {} +def generate_dns_entries_for_nodes(metadata): + results = set() - ips = set() for rnode in repo.nodes: - if not node.has_bundle('powerdns'): - continue + node_name_split = rnode.name.split('.') + node_name_split.reverse() + dns_name = '.'.join(node_name_split) + ip4 = None + ip6 = None - if node.name in rnode.metadata.get('powerdns/my_secondary_servers', set()): - return { - 'powerdns': { - 'my_primary_server': { - 'ips': { - str(ip) for ip in repo.libs.tools.resolve_identifier(repo, rnode.name) - }, - 'node': rnode.name, - }, + # We only need this for GCE, because machines over there don't + # have a public ipv4 address. + if rnode.metadata.get('external_ipv4', None): + ip4 = rnode.metadata.get('external_ipv4') + + for iface, config in sorted(rnode.metadata.get('interfaces', {}).items()): + if not ip4 and 'ipv4' in config: + ip4 = sorted(config['ipv4'])[0] + + if not ip6 and 'ipv6' in config: + ip6 = sorted(config['ipv6'])[0] + + if ip4: + results.add('{} IN A {}'.format(dns_name, ip4)) + + if ip6: + results.add('{} IN AAAA {}'.format(dns_name, ip6)) + + return { + 'powerdns': { + 'bind-zones': { + 'kunbox.net': { + 'records': results, }, - } - - return {} + }, + }, + }