Charm Interface - HA Cluster
Go to file
Doug Hellmann c7475b06be fix tox python3 overrides
We want to default to running all tox environments under python 3, so
set the basepython value in each environment.

We do not want to specify a minor version number, because we do not
want to have to update the file every time we upgrade python.

We do not want to set the override once in testenv, because that
breaks the more specific versions used in default environments like
py35 and py36.

Change-Id: Id5511088f9b29a801156231f6b95d6add8b68cd5
Signed-off-by: Doug Hellmann <doug@doughellmann.com>
2018-09-26 18:38:40 -04:00
.gitignore First commit of the proposed hacluster interface. 2016-01-05 21:22:27 -07:00
.gitreview Add .gitreview, update tox.ini, update readme. 2016-07-06 12:56:24 +00:00
.zuul.yaml import zuul job settings from project-config 2018-09-11 13:11:47 -04:00
README.md Add .gitreview, update tox.ini, update readme. 2016-07-06 12:56:24 +00:00
common.py Make specifying the nic optional 2018-04-17 10:18:53 +00:00
copyright First commit of the proposed hacluster interface. 2016-01-05 21:22:27 -07:00
interface.yaml First commit of the proposed hacluster interface. 2016-01-05 21:22:27 -07:00
requires.py Make specifying the nic optional 2018-04-17 10:18:53 +00:00
test-requirements.txt Enable the hascluster interface to do less juju work 2017-08-07 16:49:41 +01:00
tox.ini fix tox python3 overrides 2018-09-26 18:38:40 -04:00

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)