Add more common code
Add methods for setting up hacluster resources in interface to allow external code to cleanly call <interface>.add_<resource> rather than having to import specific methods from common.py
This commit is contained in:
parent
67fe406e20
commit
e5f2140cf5
41
common.py
41
common.py
|
@ -11,9 +11,9 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import ipaddress
|
||||||
from six import string_types
|
from six import string_types
|
||||||
|
|
||||||
|
|
||||||
class CRM(dict):
|
class CRM(dict):
|
||||||
"""
|
"""
|
||||||
Configuration object for Pacemaker resources for the HACluster
|
Configuration object for Pacemaker resources for the HACluster
|
||||||
|
@ -511,3 +511,42 @@ class ResourceDescriptor(object):
|
||||||
configure the specific details under the covers.
|
configure the specific details under the covers.
|
||||||
"""
|
"""
|
||||||
pass
|
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)
|
||||||
|
|
47
requires.py
47
requires.py
|
@ -11,6 +11,7 @@
|
||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
|
import relations.hacluster.common
|
||||||
from charms.reactive import hook
|
from charms.reactive import hook
|
||||||
from charms.reactive import RelationBase
|
from charms.reactive import RelationBase
|
||||||
from charms.reactive import scopes
|
from charms.reactive import scopes
|
||||||
|
@ -61,5 +62,51 @@ class HAClusterRequires(RelationBase):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
relation_data = {k: v for k, v in crm.items() if v}
|
relation_data = {k: v for k, v in crm.items() if v}
|
||||||
|
print(relation_data)
|
||||||
self.set_local(**relation_data)
|
self.set_local(**relation_data)
|
||||||
self.set_remote(**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
|
||||||
|
"""
|
||||||
|
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.VirtualIP(
|
||||||
|
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
|
||||||
|
"""
|
||||||
|
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.InitService(
|
||||||
|
name,
|
||||||
|
service,))
|
||||||
|
self.set_local(resources=resources)
|
||||||
|
|
Loading…
Reference in New Issue