def test_update_hacluster_vip_multiple_vip(self): self.get_hacluster_config.return_value = { 'vip': '10.5.100.1 ffff::1 ffaa::1' } test_data = {'resources': {}, 'resource_params': {}} expected = { 'groups': { 'grp_testservice_vips': ('res_testservice_242d562_vip ' 'res_testservice_856d56f_vip ' 'res_testservice_f563c5d_vip') }, 'delete_resources': [ 'res_testservice_eth1_vip', 'res_testservice_eth1_vip_ipv6addr', 'res_testservice_eth2_vip' ], 'resource_params': { 'res_testservice_242d562_vip': ('params ip="10.5.100.1" op monitor ' 'timeout="20s" interval="10s" depth="0"'), 'res_testservice_856d56f_vip': ('params ipv6addr="ffff::1" op monitor ' 'timeout="20s" interval="10s" depth="0"'), 'res_testservice_f563c5d_vip': ('params ipv6addr="ffaa::1" op monitor ' 'timeout="20s" interval="10s" depth="0"'), }, 'resources': { 'res_testservice_242d562_vip': 'ocf:heartbeat:IPaddr2', 'res_testservice_856d56f_vip': 'ocf:heartbeat:IPv6addr', 'res_testservice_f563c5d_vip': 'ocf:heartbeat:IPv6addr', } } ha.update_hacluster_vip('testservice', test_data) self.assertEqual(test_data, expected)
def test_update_hacluster_vip_multiple_vip(self): self.get_hacluster_config.return_value = { 'vip': '10.5.100.1 ffff::1 ffaa::1' } test_data = {'resources': {}, 'resource_params': {}} expected = { 'groups': { 'grp_testservice_vips': ('res_testservice_eth1_vip ' 'res_testservice_eth1_vip_ipv6addr ' 'res_testservice_eth2_vip') }, 'resource_params': { 'res_testservice_eth1_vip': ('params ip="10.5.100.1"' ' cidr_netmask="255.255.255.0"' ' nic="eth1"'), 'res_testservice_eth1_vip_ipv6addr': ('params ipv6addr="ffff::1"' ' cidr_netmask="64"' ' nic="eth1"'), 'res_testservice_eth2_vip': ('params ipv6addr="ffaa::1"' ' cidr_netmask="32"' ' nic="eth2"'), }, 'resources': { 'res_testservice_eth1_vip': 'ocf:heartbeat:IPaddr2', 'res_testservice_eth1_vip_ipv6addr': 'ocf:heartbeat:IPv6addr', 'res_testservice_eth2_vip': 'ocf:heartbeat:IPv6addr', } } ha.update_hacluster_vip('testservice', test_data) self.assertEqual(test_data, expected)
def ha_relation_joined(relation_id=None): sstpsswd = sst_password() _relation_data = { 'resources': { 'res_mysql_monitor': 'ocf:percona:mysql_monitor'}, 'resource_params': { 'res_mysql_monitor': RES_MONITOR_PARAMS % {'sstpass': sstpsswd}}, 'clones': { 'cl_mysql_monitor': 'res_mysql_monitor meta interleave=true'}, 'delete_resources': ['loc_percona_cluster', 'grp_percona_cluster', 'res_mysql_vip'] } if config('dns-ha'): update_hacluster_dns_ha('mysql', _relation_data) group_name = DNSHA_GROUP_NAME.format(service='mysql') else: update_hacluster_vip('mysql', _relation_data) group_name = VIP_GROUP_NAME.format(service='mysql') _relation_data['locations'] = { 'loc_mysql': '{} rule inf: writable eq 1'.format(group_name)} _relation_data['colocations'] = { 'colo_mysql': 'inf: {} cl_mysql_monitor'.format(group_name)} settings = { 'json_{}'.format(k): json.dumps(v, **JSON_ENCODE_OPTIONS) for k, v in _relation_data.items() if v } for rel_id in relation_ids('ha'): relation_set(relation_id=rel_id, **settings)
def ha_relation_joined(relation_id=None): sstpsswd = sst_password() _relation_data = { 'resources': { 'res_mysql_monitor': 'ocf:percona:mysql_monitor'}, 'resource_params': { 'res_mysql_monitor': RES_MONITOR_PARAMS % {'sstpass': sstpsswd}}, 'clones': { 'cl_mysql_monitor': 'res_mysql_monitor meta interleave=true'}, 'delete_resources': ['loc_percona_cluster', 'grp_percona_cluster', 'res_mysql_vip'] } if config('dns-ha'): update_hacluster_dns_ha('mysql', _relation_data) group_name = DNSHA_GROUP_NAME.format(service='mysql') else: update_hacluster_vip('mysql', _relation_data) group_name = VIP_GROUP_NAME.format(service='mysql') _relation_data['locations'] = { 'loc_mysql': '{} rule inf: writable eq 1'.format(group_name)} _relation_data['colocations'] = { 'colo_mysql': 'inf: {} cl_mysql_monitor'.format(group_name)} settings = { 'json_{}'.format(k): json.dumps(v, **JSON_ENCODE_OPTIONS) for k, v in _relation_data.items() if v } for rel_id in relation_ids('ha'): relation_set(relation_id=rel_id, **settings)
def on_joined(self, event): if not self.cluster.is_ag_ready: logger.warning('The availability group is not ready. Defering ' 'hacluster on_joined until AG is ready.') event.defer() return logger.info('Installing Microsoft SQL Server HA components') retry_on_error()(apt_install)(packages=self.APT_PACKAGES, fatal=True) self.setup_pacemaker_mssql_login() rel_data = { 'resources': { 'ag_cluster': 'ocf:mssql:ag' }, 'resource_params': { 'ag_cluster': 'params ag_name="{ag_name}" ' 'meta failure-timeout=60s ' 'op start timeout=60s ' 'op stop timeout=60s ' 'op promote timeout=60s ' 'op demote timeout=10s ' 'op monitor timeout=60s interval=10s ' 'op monitor timeout=60s interval=11s role="Master" ' 'op monitor timeout=60s interval=12s role="Slave" ' 'op notify timeout=60s'.format(ag_name=self.cluster.AG_NAME) }, 'ms': { 'ms-ag_cluster': 'ag_cluster meta ' 'master-max="1" master-node-max="1" ' 'clone-max="3" clone-node-max="1" notify="true"' } } update_hacluster_vip('mssql', rel_data) group_name = VIP_GROUP_NAME.format(service='mssql') rel_data.update({ 'colocations': { 'vip_on_master': 'inf: {} ms-ag_cluster:Master'.format(group_name) }, 'orders': { 'ag_first': 'inf: ms-ag_cluster:promote {}:start'.format(group_name) } }) rel = self.model.get_relation(event.relation.name, event.relation.id) for k, v in rel_data.items(): rel.data[self.unit]['json_{}'.format(k)] = json.dumps( v, **JSON_ENCODE_OPTIONS)
def test_update_hacluster_vip_single_vip(self): self.get_hacluster_config.return_value = {'vip': '10.5.100.1'} test_data = {'resources': {}, 'resource_params': {}} expected = { 'groups': { 'grp_testservice_vips': 'res_testservice_eth1_vip' }, 'resource_params': { 'res_testservice_eth1_vip': ('params ip="10.5.100.1"' ' cidr_netmask="255.255.255.0"' ' nic="eth1"') }, 'resources': { 'res_testservice_eth1_vip': 'ocf:heartbeat:IPaddr2' } } ha.update_hacluster_vip('testservice', test_data) self.assertEqual(test_data, expected)
def test_update_hacluster_vip_single_vip_fallback(self): self.get_hacluster_config.return_value = {'vip': '10.5.100.1'} test_data = {'resources': {}, 'resource_params': {}} expected = { 'delete_resources': ['res_testservice_eth1_vip'], 'groups': { 'grp_testservice_vips': 'res_testservice_242d562_vip' }, 'resource_params': { 'res_testservice_242d562_vip': ('params ip="10.5.100.1" op monitor ' 'timeout="20s" interval="10s" depth="0"') }, 'resources': { 'res_testservice_242d562_vip': 'ocf:heartbeat:IPaddr2' } } ha.update_hacluster_vip('testservice', test_data) self.assertEqual(test_data, expected)
def test_update_hacluster_config_vip(self): self.get_iface_for_address.side_effect = lambda x: None self.get_netmask_for_address.side_effect = lambda x: None self.conf = {'vip_iface': 'eth1', 'vip_cidr': '255.255.255.0'} self.get_hacluster_config.return_value = {'vip': '10.5.100.1'} test_data = {'resources': {}, 'resource_params': {}} expected = { 'delete_resources': ['res_testservice_eth1_vip'], 'groups': { 'grp_testservice_vips': 'res_testservice_242d562_vip' }, 'resource_params': { 'res_testservice_242d562_vip': ('params ip="10.5.100.1" cidr_netmask="255.255.255.0" ' 'nic="eth1" op monitor timeout="20s" ' 'interval="10s" depth="0"') }, 'resources': { 'res_testservice_242d562_vip': 'ocf:heartbeat:IPaddr2' } } ha.update_hacluster_vip('testservice', test_data) self.assertEqual(test_data, expected)