Skip to content

Commit 84e517d

Browse files
Zuul v3 CIopencontrail-ci-admin
authored andcommitted
Merge "[ST] Handle non-existent ZK data gracefully in Schema Transformer."
2 parents a43dd92 + 325d158 commit 84e517d

3 files changed

Lines changed: 52 additions & 1 deletion

File tree

src/config/schema-transformer/schema_transformer/db.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ def alloc_route_target(self, ri_fq_name, asn, zk_only=False):
235235
# end alloc_route_target
236236

237237
def free_route_target(self, ri_fq_name, asn):
238+
if ri_fq_name is None or ri_fq_name == '':
239+
return
238240
try:
239241
rtgt = self.get_route_target(ri_fq_name)
240242
self._rt_cf.remove(ri_fq_name)

src/config/schema-transformer/schema_transformer/resources/global_system_config.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ def update_autonomous_system(cls, new_asn):
8383
(new_asn <= 0xFFFF and asn > 0xFFFF)):
8484
ri_fq_name_in_str = cls._object_db.get_ri_from_route_target(
8585
int(target), asn)
86+
if ri_fq_name_in_str is None or ri_fq_name_in_str == '':
87+
continue
8688
# free_route_target has to be called before alloc_route_target.
8789
# as get_route_target(ri_fq_name) inside free_route_target
8890
# will return wrong values if this order is changed.

src/config/schema-transformer/schema_transformer/tests/test_route_target.py

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

55
from cfgm_common.tests import test_common
66
import gevent
7-
from vnc_api.vnc_api import NoIdError, RouteTargetList
7+
from vnc_api.vnc_api import GlobalSystemConfig, NoIdError, RouteTargetList
88
from vnc_cfg_api_server import db_manage
99

10+
from schema_transformer.db import SchemaTransformerDB
1011
from schema_transformer.resources.routing_instance import RoutingInstanceST
1112
from .test_case import retries, STTestCase
1213
from .test_policy import VerifyPolicy
@@ -87,6 +88,52 @@ def wait_for_route_target(self, vn_obj):
8788
return self._vnc_lib.route_target_read(
8889
ri_obj.get_route_target_refs()[0]['to'])
8990

91+
def test_asn_change_when_zk_rt_missing(self):
92+
vn_obj = self.create_virtual_network('vn_for_asn' + self.id(),
93+
'10.0.0.0/24')
94+
ri_fq_name = vn_obj.fq_name + [vn_obj.fq_name[-1]]
95+
rt_obj = self.wait_for_route_target(vn_obj)
96+
rt_id_str = "%(#)010d" % {
97+
'#': int(rt_obj.get_fq_name_str().split(':')[-1])}
98+
db_checker = db_manage.DatabaseChecker(
99+
*db_manage._parse_args('check --cluster_id %s' % self._cluster_id))
100+
path = '%s%s%s' % (
101+
self._cluster_id, db_checker.BASE_RTGT_ID_ZK_PATH, rt_id_str)
102+
self.assertEqual(db_checker._zk_client.get(path)[0],
103+
':'.join(ri_fq_name))
104+
with db_checker._zk_client.patch_path(path):
105+
errors = db_checker.check_route_targets_id()
106+
error_types = [type(x) for x in errors]
107+
self.assertIn(db_manage.SchemaRTgtIdExtraError, error_types)
108+
self.assertIn(db_manage.ConfigRTgtIdExtraError, error_types)
109+
110+
free_rt_orig = SchemaTransformerDB.free_route_target
111+
112+
# Flag to be used to check free_route_target function failure
113+
has_test_failed = [False]
114+
115+
def mock_free_rt(*args, **kwargs):
116+
try:
117+
return free_rt_orig(*args, **kwargs)
118+
except Exception:
119+
has_test_failed[0] = True
120+
121+
SchemaTransformerDB.free_route_target = mock_free_rt
122+
gsc = self._vnc_lib.global_system_config_read(
123+
GlobalSystemConfig().fq_name)
124+
125+
gsc.enable_4byte_as = True
126+
gsc.autonomous_system = 81000
127+
self._vnc_lib.global_system_config_update(gsc)
128+
129+
# Wait for Schema_tranformer to process ASN change
130+
gevent.sleep(10)
131+
SchemaTransformerDB.free_route_target = free_rt_orig
132+
if has_test_failed[0]:
133+
self.fail("free_route_target failed in schema transformer")
134+
135+
# test_db_manage_zk_route_target_missing
136+
90137
def test_db_manage_zk_route_target_missing(self):
91138
vn_obj = self.create_virtual_network('vn_' + self.id(), '10.0.0.0/24')
92139
ri_fq_name = vn_obj.fq_name + [vn_obj.fq_name[-1]]

0 commit comments

Comments
 (0)