Skip to content

Commit

Permalink
Merge "[ST] Handle non-existent ZK data gracefully in Schema Transfor…
Browse files Browse the repository at this point in the history
…mer."
  • Loading branch information
Zuul v3 CI authored and opencontrail-ci-admin committed Nov 1, 2019
2 parents a43dd92 + 325d158 commit 84e517d
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
2 changes: 2 additions & 0 deletions src/config/schema-transformer/schema_transformer/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,8 @@ def alloc_route_target(self, ri_fq_name, asn, zk_only=False):
# end alloc_route_target

def free_route_target(self, ri_fq_name, asn):
if ri_fq_name is None or ri_fq_name == '':
return
try:
rtgt = self.get_route_target(ri_fq_name)
self._rt_cf.remove(ri_fq_name)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ def update_autonomous_system(cls, new_asn):
(new_asn <= 0xFFFF and asn > 0xFFFF)):
ri_fq_name_in_str = cls._object_db.get_ri_from_route_target(
int(target), asn)
if ri_fq_name_in_str is None or ri_fq_name_in_str == '':
continue
# free_route_target has to be called before alloc_route_target.
# as get_route_target(ri_fq_name) inside free_route_target
# will return wrong values if this order is changed.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

from cfgm_common.tests import test_common
import gevent
from vnc_api.vnc_api import NoIdError, RouteTargetList
from vnc_api.vnc_api import GlobalSystemConfig, NoIdError, RouteTargetList
from vnc_cfg_api_server import db_manage

from schema_transformer.db import SchemaTransformerDB
from schema_transformer.resources.routing_instance import RoutingInstanceST
from .test_case import retries, STTestCase
from .test_policy import VerifyPolicy
Expand Down Expand Up @@ -87,6 +88,52 @@ def wait_for_route_target(self, vn_obj):
return self._vnc_lib.route_target_read(
ri_obj.get_route_target_refs()[0]['to'])

def test_asn_change_when_zk_rt_missing(self):
vn_obj = self.create_virtual_network('vn_for_asn' + self.id(),
'10.0.0.0/24')
ri_fq_name = vn_obj.fq_name + [vn_obj.fq_name[-1]]
rt_obj = self.wait_for_route_target(vn_obj)
rt_id_str = "%(#)010d" % {
'#': int(rt_obj.get_fq_name_str().split(':')[-1])}
db_checker = db_manage.DatabaseChecker(
*db_manage._parse_args('check --cluster_id %s' % self._cluster_id))
path = '%s%s%s' % (
self._cluster_id, db_checker.BASE_RTGT_ID_ZK_PATH, rt_id_str)
self.assertEqual(db_checker._zk_client.get(path)[0],
':'.join(ri_fq_name))
with db_checker._zk_client.patch_path(path):
errors = db_checker.check_route_targets_id()
error_types = [type(x) for x in errors]
self.assertIn(db_manage.SchemaRTgtIdExtraError, error_types)
self.assertIn(db_manage.ConfigRTgtIdExtraError, error_types)

free_rt_orig = SchemaTransformerDB.free_route_target

# Flag to be used to check free_route_target function failure
has_test_failed = [False]

def mock_free_rt(*args, **kwargs):
try:
return free_rt_orig(*args, **kwargs)
except Exception:
has_test_failed[0] = True

SchemaTransformerDB.free_route_target = mock_free_rt
gsc = self._vnc_lib.global_system_config_read(
GlobalSystemConfig().fq_name)

gsc.enable_4byte_as = True
gsc.autonomous_system = 81000
self._vnc_lib.global_system_config_update(gsc)

# Wait for Schema_tranformer to process ASN change
gevent.sleep(10)
SchemaTransformerDB.free_route_target = free_rt_orig
if has_test_failed[0]:
self.fail("free_route_target failed in schema transformer")

# test_db_manage_zk_route_target_missing

def test_db_manage_zk_route_target_missing(self):
vn_obj = self.create_virtual_network('vn_' + self.id(), '10.0.0.0/24')
ri_fq_name = vn_obj.fq_name + [vn_obj.fq_name[-1]]
Expand Down

0 comments on commit 84e517d

Please sign in to comment.