from bundlewrap.exceptions import NoSuchGroup defaults = { 'apt': { 'packages': { 'pdns-server': {}, 'pdns-tools': {}, 'pdns-backend-bind': {}, 'pdns-backend-pgsql': {}, }, }, 'powerdns': { 'api_key': repo.vault.password_for('{} powerdns api'.format(node.name)), }, 'postgresql': { 'users': { 'powerdns': { 'password': repo.vault.password_for('{} postgresql powerdns'.format(node.name)), }, }, 'databases': { 'powerdns': { 'owner': 'powerdns', }, }, }, } @metadata_reactor def get_ips_of_secondary_nameservers(metadata): # Secondary Nameservers can't be a primary nameserver at the same # time. Return early if this is a secondary server. if metadata.get('powerdns/is_secondary', False): return {} try: nameservers = repo.nodes_in_group(metadata.get('powerdns/secondary_nameservers', '')) except NoSuchGroup: # This probably is no primary nameserver, either. Should be fine. return {} nodes = set() for rnode in nameservers: if rnode.name == node.name: # We can't be primary and secondary at the same time continue nodes.add(rnode.name) return { 'powerdns': { 'my_secondary_servers': nodes, }, } @metadata_reactor def get_ips_of_primary_nameserver(metadata): if not metadata.get('powerdns/is_secondary', False): return {} ips = set() for rnode in repo.nodes: if not node.has_bundle('powerdns'): continue 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, }, }, } return {}