Skip to content

Commit b922e6f

Browse files
ralonsohmnasiadka
authored andcommitted
HA_Chassis_Group create command with HA_Chassis assignation
This new command allows to create a "HA_Chassis_Group" register and the corresponding "HA_Chassis" child registers. If the parent "HA_Chassis_Group" register already exists, it allows to update the priority of the "HA_Chassis" registers or deleting the discarded ones. Partial-Bug: #2092271 Change-Id: I73ed014ae6a36e171c1eace8bea45010cf8415fa Conflicts: neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py
1 parent e2c1c20 commit b922e6f

File tree

3 files changed

+154
-0
lines changed

3 files changed

+154
-0
lines changed

neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/commands.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
# under the License.
1414

1515
import abc
16+
import copy
17+
import uuid
1618

1719
from oslo_utils import timeutils
1820
from ovsdbapp.backend.ovs_idl import command
@@ -100,6 +102,49 @@ def _add_gateway_chassis(api, txn, lrp_name, val):
100102
return 'gateway_chassis', uuid_list
101103

102104

105+
def _sync_ha_chassis_group(txn, nb_api, name, chassis_priority,
106+
may_exist=False, table_name='HA_Chassis_Group',
107+
**columns):
108+
result = None
109+
hcg = nb_api.lookup(table_name, name, default=None)
110+
if hcg:
111+
if not may_exist:
112+
raise RuntimeError(_('HA_Chassis_Group %s exists' % name))
113+
else:
114+
hcg = txn.insert(nb_api._tables[table_name])
115+
hcg.name = name
116+
command.BaseCommand.set_columns(hcg, **columns)
117+
result = hcg.uuid
118+
119+
# HA_Chassis registers handling.
120+
# Remove the non-existing chassis in ``self.chassis_priority``
121+
hc_to_remove = []
122+
for hc in getattr(hcg, 'ha_chassis', []):
123+
if hc.chassis_name not in chassis_priority:
124+
hc_to_remove.append(hc)
125+
126+
for hc in hc_to_remove:
127+
hcg.delvalue('ha_chassis', hc)
128+
hc.delete()
129+
130+
# Update the priority of the existing chassis.
131+
for hc in getattr(hcg, 'ha_chassis', []):
132+
hc_priority = chassis_priority.pop(hc.chassis_name)
133+
hc.priority = hc_priority
134+
135+
# Add the non-existing HA_Chassis registers.
136+
for hc_name, priority in chassis_priority.items():
137+
hc = txn.insert(nb_api.tables['HA_Chassis'])
138+
hc.chassis_name = hc_name
139+
hc.priority = priority
140+
hcg.addvalue('ha_chassis', hc)
141+
142+
if not result:
143+
result = rowview.RowView(hcg)
144+
145+
return result
146+
147+
103148
class CheckLivenessCommand(command.BaseCommand):
104149
def run_idl(self, txn):
105150
# txn.pre_commit responsible for updating nb_global.nb_cfg, but
@@ -1089,3 +1134,22 @@ def run_idl(self, txn):
10891134
virtual_parents)
10901135

10911136
setattr(lsp, 'options', options)
1137+
1138+
1139+
class HAChassisGroupWithHCAddCommand(command.AddCommand):
1140+
table_name = 'HA_Chassis_Group'
1141+
1142+
def __init__(self, api, name, chassis_priority, may_exist=False,
1143+
**columns):
1144+
super().__init__(api)
1145+
self.name = name
1146+
self.chassis_priority = copy.deepcopy(chassis_priority)
1147+
self.may_exist = may_exist
1148+
self.columns = columns
1149+
1150+
def run_idl(self, txn):
1151+
# HA_Chassis_Group register creation.
1152+
self.result = _sync_ha_chassis_group(
1153+
txn, self.api, self.name, self.chassis_priority,
1154+
may_exist=self.may_exist, table_name=self.table_name,
1155+
**self.columns)

neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/impl_idl_ovn.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,12 @@ def set_router_mac_age_limit(self, router=None):
906906
return cmd.SetLRouterMacAgeLimitCommand(
907907
self, router, cfg.get_ovn_mac_binding_age_threshold())
908908

909+
def ha_chassis_group_with_hc_add(self, name, chassis_priority,
910+
may_exist=False, **columns):
911+
return cmd.HAChassisGroupWithHCAddCommand(
912+
self, name, chassis_priority, may_exist=may_exist,
913+
**columns)
914+
909915

910916
class OvsdbSbOvnIdl(sb_impl_idl.OvnSbApiIdlImpl, Backend):
911917
@n_utils.classproperty

neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_impl_idl.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# under the License.
1313
#
1414

15+
from collections import abc
1516
import copy
1617
from unittest import mock
1718
import uuid
@@ -695,6 +696,89 @@ def test_modify_static_route_external_ids(self):
695696

696697
self.assertEqual(external_ids, lr.static_routes[0].external_ids)
697698

699+
def _cleanup_delete_hcg(self, hcg_name):
700+
if isinstance(hcg_name, str):
701+
self.nbapi.db_destroy('HA_Chassis_Group', hcg_name).execute(
702+
check_error=True)
703+
elif isinstance(hcg_name, abc.Iterable):
704+
for _hcg_name in hcg_name:
705+
self.nbapi.db_destroy('HA_Chassis_Group', _hcg_name).execute(
706+
check_error=True)
707+
708+
def _check_hcg(self, hcg, hcg_name, chassis_priority,
709+
chassis_priority_deleted=None):
710+
self.assertEqual(hcg_name, hcg.name)
711+
self.assertEqual(len(chassis_priority), len(hcg.ha_chassis))
712+
for hc in hcg.ha_chassis:
713+
self.assertEqual(chassis_priority[hc.chassis_name], hc.priority)
714+
715+
if chassis_priority_deleted:
716+
for hc_name in chassis_priority_deleted:
717+
self.assertIsNone(
718+
self.nbapi.lookup('HA_Chassis', hc_name, default=None))
719+
720+
def test_ha_chassis_group_with_hc_add_no_existing_hcg(self):
721+
chassis_priority = {'ch1': 1, 'ch2': 2, 'ch3': 3, 'ch4': 4}
722+
hcg_name = uuidutils.generate_uuid()
723+
self.addCleanup(self._cleanup_delete_hcg, hcg_name)
724+
hcg = self.nbapi.ha_chassis_group_with_hc_add(
725+
hcg_name, chassis_priority).execute(check_error=True)
726+
self._check_hcg(hcg, hcg_name, chassis_priority)
727+
728+
def test_ha_chassis_group_with_hc_add_existing_hcg(self):
729+
chassis_priority = {'ch1': 1, 'ch2': 2, 'ch3': 3, 'ch4': 4}
730+
hcg_name = uuidutils.generate_uuid()
731+
self.addCleanup(self._cleanup_delete_hcg, hcg_name)
732+
self.nbapi.ha_chassis_group_with_hc_add(
733+
hcg_name, chassis_priority).execute(check_error=True)
734+
cmd = self.nbapi.ha_chassis_group_with_hc_add(
735+
hcg_name, chassis_priority)
736+
self.assertRaises(RuntimeError, cmd.execute, check_error=True)
737+
738+
def test_ha_chassis_group_with_hc_add_existing_hcg_may_exist(self):
739+
chassis_priority = {'ch1': 1, 'ch2': 2, 'ch3': 3, 'ch4': 4}
740+
hcg_name = uuidutils.generate_uuid()
741+
self.addCleanup(self._cleanup_delete_hcg, hcg_name)
742+
hcg = None
743+
for _ in range(2):
744+
hcg = self.nbapi.ha_chassis_group_with_hc_add(
745+
hcg_name, chassis_priority, may_exist=True).execute(
746+
check_error=True)
747+
self._check_hcg(hcg, hcg_name, chassis_priority)
748+
749+
def test_ha_chassis_group_with_hc_add_existing_hcg_update_chassis(self):
750+
# This test:
751+
# - adds new chassis: ch5, ch6
752+
# - removes others: ch3, ch4
753+
# - changes the priority of the existing ones ch1, ch2
754+
chassis_priority = {'ch1': 1, 'ch2': 2, 'ch3': 3, 'ch4': 4}
755+
hcg_name = uuidutils.generate_uuid()
756+
self.addCleanup(self._cleanup_delete_hcg, hcg_name)
757+
self.nbapi.ha_chassis_group_with_hc_add(
758+
hcg_name, chassis_priority).execute(check_error=True)
759+
760+
chassis_priority = {'ch1': 2, 'ch2': 1, 'ch5': 3, 'ch6': 4}
761+
hcg = self.nbapi.ha_chassis_group_with_hc_add(
762+
hcg_name, chassis_priority, may_exist=True).execute(
763+
check_error=True)
764+
self._check_hcg(hcg, hcg_name, chassis_priority,
765+
chassis_priority_deleted=['ch3', 'ch4'])
766+
767+
def test_ha_chassis_group_with_hc_add_two_hcg(self):
768+
# Both HCG will have the same chassis priority (the same chassis
769+
# names, that is something very common.
770+
chassis_priority1 = {'ch1': 1, 'ch2': 2, 'ch3': 3, 'ch4': 4}
771+
chassis_priority2 = {'ch1': 11, 'ch2': 12, 'ch3': 13, 'ch4': 14}
772+
hcg_name1 = uuidutils.generate_uuid()
773+
hcg_name2 = uuidutils.generate_uuid()
774+
self.addCleanup(self._cleanup_delete_hcg, [hcg_name1, hcg_name2])
775+
hcg1 = self.nbapi.ha_chassis_group_with_hc_add(
776+
hcg_name1, chassis_priority1).execute(check_error=True)
777+
hcg2 = self.nbapi.ha_chassis_group_with_hc_add(
778+
hcg_name2, chassis_priority2).execute(check_error=True)
779+
self._check_hcg(hcg1, hcg_name1, chassis_priority1)
780+
self._check_hcg(hcg2, hcg_name2, chassis_priority2)
781+
698782

699783
class TestIgnoreConnectionTimeout(BaseOvnIdlTest):
700784
@classmethod

0 commit comments

Comments
 (0)