From 887a7256b8818cfcdd484da8c9ac08610690db34 Mon Sep 17 00:00:00 2001 From: Liam Young Date: Wed, 1 Jun 2016 09:54:14 +0000 Subject: [PATCH] Add more common code Add methods for setting up hacluster resources in interface to allow external code to cleanly call .add_ rather than having to import specific methods from common.py --- common.py | 39 +++++++++++++++++++++++++++++++++++++++ requires.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/common.py b/common.py index 2ac68f7..6f1174b 100644 --- a/common.py +++ b/common.py @@ -511,3 +511,42 @@ class ResourceDescriptor(object): configure the specific details under the covers. """ pass + +class InitService(ResourceDescriptor): + def __init__(self, service_name, init_service_name): + self.service_name = service_name + self.init_service_name = init_service_name + + def configure_resource(self, crm): + res_key = 'res_{}_{}'.format( + self.service_name.replace('-', '_'), + self.init_service_name.replace('-', '_')) + clone_key = 'cl_{}'.format(res_key) + res_type = 'lsb:{}'.format(self.init_service_name) + crm.primitive(res_key, res_type, params='op monitor interval="5s"') + crm.init_services(self.init_service_name) + crm.clone(clone_key, res_key) + + +class VirtualIP(ResourceDescriptor): + def __init__(self, service_name, vip, nic=None, cidr=None): + self.service_name = service_name + self.vip = vip + self.nic = nic + self.cidr = cidr + + def configure_resource(self, crm): + vip_key = 'res_{}_{}_vip'.format(self.service_name, self.nic) + ipaddr = ipaddress.ip_address(self.vip) + if isinstance(ipaddr, ipaddress.IPv4Address): + res_type = 'ocf:heartbeat:IPaddr2' + res_params = 'ip="{}"'.format(self.vip) + else: + res_type = 'ocf:heartbeat:IPv6addr' + res_params = 'ipv6addr="{}"'.format(self.vip) + + if self.nic: + res_params = '{} nic="{}"'.format(res_params, self.nic) + if self.cidr: + res_params = '{} cidr_netmask="{}"'.format(res_params, self.cidr) + crm.primitive(vip_key, res_type, params=res_params) diff --git a/requires.py b/requires.py index 498ced9..9750ab4 100644 --- a/requires.py +++ b/requires.py @@ -11,6 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import relations.hacluster.common from charms.reactive import hook from charms.reactive import RelationBase from charms.reactive import scopes @@ -63,3 +64,44 @@ class HAClusterRequires(RelationBase): relation_data = {k: v for k, v in crm.items() if v} self.set_local(**relation_data) self.set_remote(**relation_data) + + + def bind_resources(self, iface, mcastport=None): + """Inform the ha subordinate about each service it should manage. The + child class specifies the services via self.ha_resources + + @param hacluster interface + """ + if not mcastport: + mcastport=4440 + resources = self.get_local('resources') + self.bind_on(iface=iface, mcastport=mcastport) + self.manage_resources(resources) + + + def add_vip(self, name, vip, iface, netmask): + """Add a VirtualIP object for each user specified vip to self.resources + """ + resources = self.get_local('resources') + if not resources: + resources=relations.hacluster.common.CRM() + resources.add( + relations.hacluster.common.VirtualIP( + self.name, + vip, + nic=iface, + cidr=netmask,)) + self.set_local(resources=resources) + + + def add_init_service(self, name, service): + """Add a InitService object for haproxy to self.resources + """ + resources = self.get_local('resources') + if not resources: + resources=relations.hacluster.common.CRM() + resources.add( + relations.hacluster.common.InitService( + name, + service,)) + self.set_local(resources=resources)