Charm Interface - HA Cluster
Go to file
Samuel Walladge d91e83a1fa Use the passed arguments in remove_dnsha
This appears to be a typo, where self.service_name and self.endpoint_type
was used in the same way as seen in other methods,
but self.service_name or self.endpoint_type is not defined in this class,
or any subclasses of it.
So we can use the passed name and endpoint_type arguments here.

Closes-Bug: #2037515
Change-Id: I12c561057372c11632b2d97fa1763fc92d89f479
2023-11-28 11:50:11 +10:30
interface_hacluster Use the passed arguments in remove_dnsha 2023-11-28 11:50:11 +10:30
unit_tests Update jobs to fix the CI 2023-11-06 10:15:38 +10:30
.gitignore Migrate from testr to stestr 2021-02-10 11:18:06 +00:00
.gitreview OpenDev Migration Patch 2019-04-19 19:48:31 +00:00
.stestr.conf Migrate from testr to stestr 2021-02-10 11:18:06 +00:00
.zuul.yaml Update jobs to fix the CI 2023-11-06 10:15:38 +10:30
README.md Add .gitreview, update tox.ini, update readme. 2016-07-06 12:56:24 +00:00
copyright First commit of the proposed hacluster interface. 2016-01-05 21:22:27 -07:00
interface.yaml Add OPS framework interface 2021-09-21 09:44:55 +00:00
requires.py Move common requires code 2021-08-26 12:03:41 +00:00
setup.cfg Add OPS framework interface 2021-09-21 09:44:55 +00:00
setup.py Add OPS framework interface 2021-09-21 09:44:55 +00:00
test-requirements.txt Add OPS framework interface 2021-09-21 09:44:55 +00:00
tox.ini Update jobs to fix the CI 2023-11-06 10:15:38 +10:30

README.md

Overview

This interface handles the communication with the hacluster subordinate charm using the ha interface protocol.

Usage

Requires

The interface layer will set the following reactive states, as appropriate:

  • {relation_name}.connected The relation is established and ready for the local charm to configure the hacluster subordinate charm. The configuration of the resources to manage for the hacluster charm can be managed via one of the following methods:

    • manage_resources method
    • bind_on method

    Configuration of the managed resources within the hacluster can be managed by passing common.CRM object definitions to the manage_resources method.

  • {relation_name}.available The hacluster is up and ready.

For example:

from charms.reactive import when, when_not
from charms.reactive import set_state, remove_state

from relations.hacluster.common import CRM


@when('ha.connected')
def cluster_connected(hacluster):

    resources = CRM()
    resources.primitive('res_vip', 'ocf:IPAddr2',
                        params='ip=10.0.3.100 nic=eth0',
                        op='monitor interval="10s"')
    resources.clone('cl_res_vip', 'res_vip')

    hacluster.bind_on(iface='eth0', mcastport=4430)
    hacluster.manage_resources(resources)

Additionally, for more code clarity a custom object implements the interface defined in common.ResourceDescriptor can be used to simplify the code for reuse.

For example:

import ipaddress

from relation.hacluster.common import CRM
from relation.hacluster.common import ResourceDescriptor

class VirtualIP(ResourceDescriptor):
    def __init__(self, vip, nic='eth0'):
        self.vip = vip
        self.nic = 'eth0'

    def configure_resource(self, crm):
        ipaddr = ipaddress.ip_address(self.vip)
        if isinstance(ipaddr, ipaddress.IPv4Address):
            res_type = 'ocf:heartbeat:IPAddr2'
            res_parms = 'ip={ip} nic={nic}'.format(ip=self.vip,
                                                   nic=self.nic)
        else:
            res_type = 'ocf:heartbeat:IPv6addr'
            res_params = 'ipv6addr={ip} nic={nic}'.format(ip=self.vip,
                                                          nic=self.nic)

        crm.primitive('res_vip', res_type, params=res_params,
                      op='monitor interval="10s"')
        crm.clone('cl_res_vip', 'res_vip')

Once the VirtualIP class above has been defined in charm code, it can make the code a bit cleaner. The example above can thusly be written as:

@when('ha.connected')
def cluster_connected(hacluster):
    resources = CRM()
    resources.add(VirtualIP('10.0.3.100'))

    hacluster.bind_on(iface='eth0', mcastport=4430)
    hacluster.manage_resources(resources)