Add functions for managing DNS Entries

Add code for managing DNS Entries via hacluster. This is part of the
effort to enable DNS HA in the reactive charms.

Change-Id: I1a6cdeffa3aa8657b957ba68cd09face27f93b27
Partial-Bug: #1727376
This commit is contained in:
Liam Young 2017-10-26 09:53:46 +01:00 committed by Liam Young
parent c01416b7eb
commit 09ead5622e
2 changed files with 66 additions and 0 deletions

View File

@ -582,3 +582,39 @@ class VirtualIP(ResourceDescriptor):
if self.cidr:
res_params = '{} cidr_netmask="{}"'.format(res_params, self.cidr)
crm.primitive(vip_key, res_type, params=res_params)
class DNSEntry(ResourceDescriptor):
def __init__(self, service_name, ip, fqdn, endpoint_type):
"""Class for managing DNS entries
:param service_name: string - Name of service
:param ip: string - IP to point DNS entry at
:param fqdn: string - DNS Entry
:param endpoint_type: string - The type of the endpoint represented by
the DNS record eg public, admin etc
:returns: None
"""
self.service_name = service_name
self.ip = ip
self.fqdn = fqdn
self.endpoint_type = endpoint_type
def configure_resource(self, crm, res_type='ocf:maas:dns'):
"""Configure new DNS resource in crm
:param crm: CRM() instance - Config object for Pacemaker resources
:param res_type: string - Corosync Open Cluster Framework resource
agent to use for DNS HA
:returns: None
"""
res_key = 'res_{}_{}_hostname'.format(
self.service_name.replace('-', '_'),
self.endpoint_type)
res_params = ''
if self.fqdn:
res_params = '{} fqdn="{}"'.format(res_params, self.fqdn)
if self.ip:
res_params = '{} ip_address="{}"'.format(res_params, self.ip)
crm.primitive(res_key, res_type, params=res_params)

View File

@ -132,3 +132,33 @@ class HAClusterRequires(RelationBase):
resources.add(
relations.hacluster.common.InitService(name, service, clone))
self.set_local(resources=resources)
def add_dnsha(self, name, ip, fqdn, endpoint_type):
"""Add a DNS entry to self.resources
:param name: string - Name of service
:param ip: string - IP address dns entry should resolve to
:param fqdn: string - The DNS entry name
:param endpoint_type: string - Public, private, internal etc
:returns: None
"""
resource_dict = self.get_local('resources')
if resource_dict:
resources = relations.hacluster.common.CRM(**resource_dict)
else:
resources = relations.hacluster.common.CRM()
resources.add(
relations.hacluster.common.DNSEntry(name, ip, fqdn, endpoint_type))
# DNS Group
group = 'grp_{}_hostnames'.format(name)
dns_res_group_members = []
if resource_dict:
dns_resources = resource_dict.get('resources')
if dns_resources:
for dns_res in dns_resources:
if 'hostname' in dns_res:
dns_res_group_members.append(dns_res)
resources.group(group, *dns_res_group_members)
self.set_local(resources=resources)