From 82fd758b7bb0e2605eab6a8e9e1394b4e9daed7b Mon Sep 17 00:00:00 2001 From: isabelmsft Date: Sun, 27 Nov 2022 06:19:42 +0000 Subject: [PATCH] add new tables yang validation --- config/main.py | 211 ++++++++++++++++++++++++++++++++---------------- config/vxlan.py | 60 +++++++++++--- 2 files changed, 192 insertions(+), 79 deletions(-) diff --git a/config/main.py b/config/main.py index 0b2eb9cdca..07a3aa5b60 100644 --- a/config/main.py +++ b/config/main.py @@ -2881,55 +2881,79 @@ def warm_restart_enable(ctx, module): @click.argument('seconds', metavar='', required=True, type=int) @click.pass_context def warm_restart_neighsyncd_timer(ctx, seconds): - db = ctx.obj['db'] - if seconds not in range(1, 9999): - ctx.fail("neighsyncd warm restart timer must be in range 1-9999") - db.mod_entry('WARM_RESTART', 'swss', {'neighsyncd_timer': seconds}) + db = ValidatedConfigDBConnector(ctx.obj['db']) + if ADHOC_VALIDATION: + if seconds not in range(1, 9999): + ctx.fail("neighsyncd warm restart timer must be in range 1-9999") + try: + db.mod_entry('WARM_RESTART', 'swss', {'neighsyncd_timer': seconds}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @warm_restart.command('bgp_timer') @click.argument('seconds', metavar='', required=True, type=int) @click.pass_context def warm_restart_bgp_timer(ctx, seconds): - db = ctx.obj['db'] - if seconds not in range(1, 3600): - ctx.fail("bgp warm restart timer must be in range 1-3600") - db.mod_entry('WARM_RESTART', 'bgp', {'bgp_timer': seconds}) + db = ValidatedConfigDBConnector(ctx.obj['db']) + if ADHOC_VALIDATION: + if seconds not in range(1, 3600): + ctx.fail("bgp warm restart timer must be in range 1-3600") + try: + db.mod_entry('WARM_RESTART', 'bgp', {'bgp_timer': seconds}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @warm_restart.command('teamsyncd_timer') @click.argument('seconds', metavar='', required=True, type=int) @click.pass_context def warm_restart_teamsyncd_timer(ctx, seconds): - db = ctx.obj['db'] - if seconds not in range(1, 3600): - ctx.fail("teamsyncd warm restart timer must be in range 1-3600") - db.mod_entry('WARM_RESTART', 'teamd', {'teamsyncd_timer': seconds}) + db = ValidatedConfigDBConnector(ctx.obj['db']) + if ADHOC_VALIDATION: + if seconds not in range(1, 3600): + ctx.fail("teamsyncd warm restart timer must be in range 1-3600") + try: + db.mod_entry('WARM_RESTART', 'teamd', {'teamsyncd_timer': seconds}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @warm_restart.command('bgp_eoiu') @click.argument('enable', metavar='', default='true', required=False, type=click.Choice(["true", "false"])) @click.pass_context def warm_restart_bgp_eoiu(ctx, enable): - db = ctx.obj['db'] - db.mod_entry('WARM_RESTART', 'bgp', {'bgp_eoiu': enable}) - + db = ValidatedConfigDBConnector(ctx.obj['db']) + try: + db.mod_entry('WARM_RESTART', 'bgp', {'bgp_eoiu': enable}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) def vrf_add_management_vrf(config_db): """Enable management vrf in config DB""" + config_db = ValidatedConfigDBConnector(config_db) entry = config_db.get_entry('MGMT_VRF_CONFIG', "vrf_global") if entry and entry['mgmtVrfEnabled'] == 'true' : click.echo("ManagementVRF is already Enabled.") return None - config_db.mod_entry('MGMT_VRF_CONFIG', "vrf_global", {"mgmtVrfEnabled": "true"}) + try: + config_db.mod_entry('MGMT_VRF_CONFIG', "vrf_global", {"mgmtVrfEnabled": "true"}) + except ValueError as e: + ctx = click.get_current_context() + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) def vrf_delete_management_vrf(config_db): """Disable management vrf in config DB""" + config_db = ValidatedConfigDBConnector(config_db) entry = config_db.get_entry('MGMT_VRF_CONFIG', "vrf_global") if not entry or entry['mgmtVrfEnabled'] == 'false' : click.echo("ManagementVRF is already Disabled.") return None - config_db.mod_entry('MGMT_VRF_CONFIG', "vrf_global", {"mgmtVrfEnabled": "false"}) + try: + config_db.mod_entry('MGMT_VRF_CONFIG', "vrf_global", {"mgmtVrfEnabled": "false"}) + except ValueError as e: + ctx = click.get_current_context() + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @config.group(cls=clicommon.AbbreviationGroup) @@ -4707,26 +4731,30 @@ def remove_queue(db, interface_name, queue_map): @click.pass_context def cable_length(ctx, interface_name, length): """Set interface cable length""" - config_db = ctx.obj["config_db"] + config_db = ValidatedConfigDBConnector(ctx.obj["config_db"]) if not is_dynamic_buffer_enabled(config_db): ctx.fail("This command can only be supported on a system with dynamic buffer enabled") + + if ADHOC_VALIDATION: + # Check whether port is legal + ports = config_db.get_entry("PORT", interface_name) + if not ports: + ctx.fail("Port {} doesn't exist".format(interface_name)) - # Check whether port is legal - ports = config_db.get_entry("PORT", interface_name) - if not ports: - ctx.fail("Port {} doesn't exist".format(interface_name)) - - try: - assert "m" == length[-1] - except Exception: - ctx.fail("Invalid cable length. Should be in format m, like 300m".format(cable_length)) + try: + assert "m" == length[-1] + except Exception: + ctx.fail("Invalid cable length. Should be in format m, like 300m".format(cable_length)) keys = config_db.get_keys("CABLE_LENGTH") cable_length_set = {} cable_length_set[interface_name] = length - config_db.mod_entry("CABLE_LENGTH", keys[0], cable_length_set) + try: + config_db.mod_entry("CABLE_LENGTH", keys[0], cable_length_set) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) # # 'transceiver' subgroup ('config interface transceiver ...') @@ -5151,7 +5179,10 @@ def add_vrf(ctx, vrf_name): if (vrf_name == 'mgmt' or vrf_name == 'management'): vrf_add_management_vrf(config_db) else: - config_db.set_entry('VRF', vrf_name, {"NULL": "NULL"}) + try: + config_db.set_entry('VRF', vrf_name, {"NULL": "NULL"}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vrf.command('del') @click.argument('vrf_name', metavar='', required=True) @@ -5173,7 +5204,10 @@ def del_vrf(ctx, vrf_name): vrf_delete_management_vrf(config_db) else: del_interface_bind_to_vrf(config_db, vrf_name) - config_db.set_entry('VRF', vrf_name, None) + try: + config_db.set_entry('VRF', vrf_name, None) + except JsonPatchConflict as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) click.echo("VRF {} deleted and all associated IP addresses removed.".format(vrf_name)) @vrf.command('add_vrf_vni_map') @@ -6273,7 +6307,7 @@ def sflow(ctx): @click.pass_context def enable(ctx): """Enable sFlow""" - config_db = ctx.obj['db'] + config_db = ValidatedConfigDBConnector(ctx.obj['db']) sflow_tbl = config_db.get_table('SFLOW') if not sflow_tbl: @@ -6281,7 +6315,10 @@ def enable(ctx): else: sflow_tbl['global']['admin_state'] = 'up' - config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + try: + config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) try: proc = subprocess.Popen("systemctl is-active sflow", shell=True, text=True, stdout=subprocess.PIPE) @@ -6301,7 +6338,7 @@ def enable(ctx): @click.pass_context def disable(ctx): """Disable sFlow""" - config_db = ctx.obj['db'] + config_db = ValidatedConfigDBConnector(ctx.obj['db']) sflow_tbl = config_db.get_table('SFLOW') if not sflow_tbl: @@ -6309,7 +6346,10 @@ def disable(ctx): else: sflow_tbl['global']['admin_state'] = 'down' - config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + try: + config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) # # 'sflow' command ('config sflow polling-interval ...') @@ -6320,17 +6360,21 @@ def disable(ctx): @click.pass_context def polling_int(ctx, interval): """Set polling-interval for counter-sampling (0 to disable)""" - if interval not in range(5, 301) and interval != 0: - click.echo("Polling interval must be between 5-300 (0 to disable)") + if ADHOC_VALIDATION: + if interval not in range(5, 301) and interval != 0: + click.echo("Polling interval must be between 5-300 (0 to disable)") - config_db = ctx.obj['db'] + config_db = ValidatedConfigDBConnector(ctx.obj['db']) sflow_tbl = config_db.get_table('SFLOW') if not sflow_tbl: sflow_tbl = {'global': {'admin_state': 'down'}} sflow_tbl['global']['polling_interval'] = interval - config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + try: + config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) def is_valid_sample_rate(rate): return rate.isdigit() and int(rate) in range(256, 8388608 + 1) @@ -6352,18 +6396,25 @@ def interface(ctx): @click.argument('ifname', metavar='', required=True, type=str) @click.pass_context def enable(ctx, ifname): - config_db = ctx.obj['db'] - if not interface_name_is_valid(config_db, ifname) and ifname != 'all': - click.echo("Invalid interface name") - return + config_db = ValidatedConfigDBConnector(ctx.obj['db']) + if ADHOC_VALIDATION: + if not interface_name_is_valid(config_db, ifname) and ifname != 'all': + click.echo("Invalid interface name") + return intf_dict = config_db.get_table('SFLOW_SESSION') if intf_dict and ifname in intf_dict: intf_dict[ifname]['admin_state'] = 'up' - config_db.mod_entry('SFLOW_SESSION', ifname, intf_dict[ifname]) + try: + config_db.mod_entry('SFLOW_SESSION', ifname, intf_dict[ifname]) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) else: - config_db.mod_entry('SFLOW_SESSION', ifname, {'admin_state': 'up'}) + try: + config_db.mod_entry('SFLOW_SESSION', ifname, {'admin_state': 'up'}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) # # 'sflow' command ('config sflow interface disable ...') @@ -6372,19 +6423,26 @@ def enable(ctx, ifname): @click.argument('ifname', metavar='', required=True, type=str) @click.pass_context def disable(ctx, ifname): - config_db = ctx.obj['db'] - if not interface_name_is_valid(config_db, ifname) and ifname != 'all': - click.echo("Invalid interface name") - return + config_db = ValidatedConfigDBConnector(ctx.obj['db']) + if ADHOC_VALIDATION: + if not interface_name_is_valid(config_db, ifname) and ifname != 'all': + click.echo("Invalid interface name") + return intf_dict = config_db.get_table('SFLOW_SESSION') if intf_dict and ifname in intf_dict: intf_dict[ifname]['admin_state'] = 'down' - config_db.mod_entry('SFLOW_SESSION', ifname, intf_dict[ifname]) + try: + config_db.mod_entry('SFLOW_SESSION', ifname, intf_dict[ifname]) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) else: - config_db.mod_entry('SFLOW_SESSION', ifname, - {'admin_state': 'down'}) + try: + config_db.mod_entry('SFLOW_SESSION', ifname, + {'admin_state': 'down'}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) # # 'sflow' command ('config sflow interface sample-rate ...') @@ -6394,13 +6452,14 @@ def disable(ctx, ifname): @click.argument('rate', metavar='', required=True, type=str) @click.pass_context def sample_rate(ctx, ifname, rate): - config_db = ctx.obj['db'] - if not interface_name_is_valid(config_db, ifname) and ifname != 'all': - click.echo('Invalid interface name') - return - if not is_valid_sample_rate(rate) and rate != 'default': - click.echo('Error: Sample rate must be between 256 and 8388608 or default') - return + config_db = ValidatedConfigDBConnector(ctx.obj['db']) + if ADHOC_VALIDATION: + if not interface_name_is_valid(config_db, ifname) and ifname != 'all': + click.echo('Invalid interface name') + return + if not is_valid_sample_rate(rate) and rate != 'default': + click.echo('Error: Sample rate must be between 256 and 8388608 or default') + return sess_dict = config_db.get_table('SFLOW_SESSION') @@ -6409,13 +6468,22 @@ def sample_rate(ctx, ifname, rate): if 'sample_rate' not in sess_dict[ifname]: return del sess_dict[ifname]['sample_rate'] - config_db.set_entry('SFLOW_SESSION', ifname, sess_dict[ifname]) + try: + config_db.set_entry('SFLOW_SESSION', ifname, sess_dict[ifname]) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) return sess_dict[ifname]['sample_rate'] = rate - config_db.mod_entry('SFLOW_SESSION', ifname, sess_dict[ifname]) + try: + config_db.mod_entry('SFLOW_SESSION', ifname, sess_dict[ifname]) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) else: if rate != 'default': - config_db.mod_entry('SFLOW_SESSION', ifname, {'sample_rate': rate}) + try: + config_db.mod_entry('SFLOW_SESSION', ifname, {'sample_rate': rate}) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) # @@ -6510,11 +6578,12 @@ def agent_id(ctx): @click.pass_context def add(ctx, ifname): """Add sFlow agent information""" - if ifname not in netifaces.interfaces(): - click.echo("Invalid interface name") - return + if ADHOC_VALIDATION: + if ifname not in netifaces.interfaces(): + click.echo("Invalid interface name") + return - config_db = ctx.obj['db'] + config_db = ValidatedConfigDBConnector(ctx.obj['db']) sflow_tbl = config_db.get_table('SFLOW') if not sflow_tbl: @@ -6525,7 +6594,10 @@ def add(ctx, ifname): return sflow_tbl['global']['agent_id'] = ifname - config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + try: + config_db.mod_entry('SFLOW', 'global', sflow_tbl['global']) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) # # 'sflow' command ('config sflow agent-id del') @@ -6534,7 +6606,7 @@ def add(ctx, ifname): @click.pass_context def delete(ctx): """Delete sFlow agent information""" - config_db = ctx.obj['db'] + config_db = ValidatedConfigDBConnector(ctx.obj['db']) sflow_tbl = config_db.get_table('SFLOW') if not sflow_tbl: @@ -6545,7 +6617,10 @@ def delete(ctx): return sflow_tbl['global'].pop('agent_id') - config_db.set_entry('SFLOW', 'global', sflow_tbl['global']) + try: + config_db.set_entry('SFLOW', 'global', sflow_tbl['global']) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) # # set ipv6 link local mode on a given interface diff --git a/config/vxlan.py b/config/vxlan.py index be0a961001..ea24b33514 100644 --- a/config/vxlan.py +++ b/config/vxlan.py @@ -1,6 +1,11 @@ import click import utilities_common.cli as clicommon +import jsonpatch +from jsonpatch import JsonPatchConflict +from .validated_config_db_connector import ValidatedConfigDBConnector + +ADHOC_VALIDATION = True # # 'vxlan' group ('config vxlan ...') # @@ -15,9 +20,11 @@ def vxlan(): def add_vxlan(db, vxlan_name, src_ip): """Add VXLAN""" ctx = click.get_current_context() + config_db = ValidatedConfigDBConnector(db.cfgdb) - if not clicommon.is_ipaddress(src_ip): - ctx.fail("{} invalid src ip address".format(src_ip)) + if ADHOC_VALIDATION: + if not clicommon.is_ipaddress(src_ip): + ctx.fail("{} invalid src ip address".format(src_ip)) vxlan_keys = db.cfgdb.get_keys('VXLAN_TUNNEL') if not vxlan_keys: @@ -29,7 +36,10 @@ def add_vxlan(db, vxlan_name, src_ip): ctx.fail("VTEP already configured.") fvs = {'src_ip': src_ip} - db.cfgdb.set_entry('VXLAN_TUNNEL', vxlan_name, fvs) + try: + config_db.set_entry('VXLAN_TUNNEL', vxlan_name, fvs) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vxlan.command('del') @click.argument('vxlan_name', metavar='', required=True) @@ -37,6 +47,7 @@ def add_vxlan(db, vxlan_name, src_ip): def del_vxlan(db, vxlan_name): """Del VXLAN""" ctx = click.get_current_context() + config_db = ValidatedConfigDBConnector(db.cfgdb) vxlan_keys = db.cfgdb.get_keys('VXLAN_TUNNEL') if vxlan_name not in vxlan_keys: @@ -66,7 +77,10 @@ def del_vxlan(db, vxlan_name): if ('vxlan_tunnel' in vnet_table[vnet_key] and vnet_table[vnet_key]['vxlan_tunnel'] == vxlan_name): ctx.fail("Please delete all VNET configuration referencing the tunnel " + vxlan_name) - db.cfgdb.set_entry('VXLAN_TUNNEL', vxlan_name, None) + try: + config_db.set_entry('VXLAN_TUNNEL', vxlan_name, None) + except JsonPatchConflict as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vxlan.group('evpn_nvo') def vxlan_evpn_nvo(): @@ -79,6 +93,7 @@ def vxlan_evpn_nvo(): def add_vxlan_evpn_nvo(db, nvo_name, vxlan_name): """Add NVO""" ctx = click.get_current_context() + config_db = validatedConfigDBConnector(db.cfgdb) vxlan_keys = db.cfgdb.get_keys("VXLAN_EVPN_NVO|*") if not vxlan_keys: vxlan_count = 0 @@ -92,7 +107,10 @@ def add_vxlan_evpn_nvo(db, nvo_name, vxlan_name): ctx.fail("VTEP {} not configured".format(vxlan_name)) fvs = {'source_vtep': vxlan_name} - db.cfgdb.set_entry('VXLAN_EVPN_NVO', nvo_name, fvs) + try: + config_db.set_entry('VXLAN_EVPN_NVO', nvo_name, fvs) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vxlan_evpn_nvo.command('del') @click.argument('nvo_name', metavar='', required=True) @@ -100,6 +118,7 @@ def add_vxlan_evpn_nvo(db, nvo_name, vxlan_name): def del_vxlan_evpn_nvo(db, nvo_name): """Del NVO""" ctx = click.get_current_context() + config_db = ValidatedConfigDBConnector(db.cfgdb) vxlan_keys = db.cfgdb.get_keys('VXLAN_TUNNEL_MAP') if not vxlan_keys: vxlan_count = 0 @@ -107,8 +126,11 @@ def del_vxlan_evpn_nvo(db, nvo_name): vxlan_count = len(vxlan_keys) if(vxlan_count > 0): - ctx.fail("Please delete all VLAN VNI mappings.") - db.cfgdb.set_entry('VXLAN_EVPN_NVO', nvo_name, None) + ctx.fail("Please delete all VLAN VNI mappings.") + try: + config_db.set_entry('VXLAN_EVPN_NVO', nvo_name, None) + except JsonPatchConflict as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vxlan.group('map') def vxlan_map(): @@ -122,6 +144,7 @@ def vxlan_map(): def add_vxlan_map(db, vxlan_name, vlan, vni): """Add VLAN-VNI map entry""" ctx = click.get_current_context() + config_db = ValidatedConfigDBConnector(db.cfgdb) if not vlan.isdigit(): ctx.fail("Invalid vlan {}. Only valid vlan is accepted".format(vni)) @@ -152,7 +175,10 @@ def add_vxlan_map(db, vxlan_name, vlan, vni): fvs = {'vni': vni, 'vlan' : vlan_name} mapname = vxlan_name + '|' + 'map_' + vni + '_' + vlan_name - db.cfgdb.set_entry('VXLAN_TUNNEL_MAP', mapname, fvs) + try: + config_db.set_entry('VXLAN_TUNNEL_MAP', mapname, fvs) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vxlan_map.command('del') @click.argument('vxlan_name', metavar='', required=True) @@ -162,6 +188,7 @@ def add_vxlan_map(db, vxlan_name, vlan, vni): def del_vxlan_map(db, vxlan_name, vlan, vni): """Del VLAN-VNI map entry""" ctx = click.get_current_context() + config_db = ValidatedConfigDBConnector(db.cfgdb) if not vlan.isdigit(): ctx.fail("Invalid vlan {}. Only valid vlan is accepted".format(vni)) @@ -189,7 +216,10 @@ def del_vxlan_map(db, vxlan_name, vlan, vni): mapname = vxlan_name + '|' + 'map_' + vni + '_' + vlan db.cfgdb.set_entry('VXLAN_TUNNEL_MAP', mapname, None) mapname = vxlan_name + '|' + 'map_' + vni + '_Vlan' + vlan - db.cfgdb.set_entry('VXLAN_TUNNEL_MAP', mapname, None) + try: + config_db.set_entry('VXLAN_TUNNEL_MAP', mapname, None) + except JsonPatchConflict as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vxlan.group('map_range') def vxlan_map_range(): @@ -203,6 +233,7 @@ def vxlan_map_range(): @clicommon.pass_db def add_vxlan_map_range(db, vxlan_name, vlan_start, vlan_end, vni_start): """Add Range of vlan-vni mappings""" + config_db = ValidatedConfigDBConnector(db.cfgdb) ctx = click.get_current_context() if clicommon.is_vlanid_in_range(vlan_start) is False: ctx.fail(" Invalid Vlan Id , Valid Range : 1 to 4094 ") @@ -244,7 +275,10 @@ def add_vxlan_map_range(db, vxlan_name, vlan_start, vlan_end, vni_start): fvs = {'vni': vni_name, 'vlan' : vlan_name} mapname = vxlan_name + '|' + 'map_' + vni_name + '_' + vlan_name - db.cfgdb.set_entry('VXLAN_TUNNEL_MAP', mapname, fvs) + try: + config_db.set_entry('VXLAN_TUNNEL_MAP', mapname, fvs) + except ValueError as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e)) @vxlan_map_range.command('del') @click.argument('vxlan_name', metavar='', required=True) @@ -255,6 +289,7 @@ def add_vxlan_map_range(db, vxlan_name, vlan_start, vlan_end, vni_start): def del_vxlan_map_range(db, vxlan_name, vlan_start, vlan_end, vni_start): """Del Range of vlan-vni mappings""" ctx = click.get_current_context() + config_db = ValidatedConfigDBConnector(db.cfgdb) if clicommon.is_vlanid_in_range(vlan_start) is False: ctx.fail(" Invalid Vlan Id , Valid Range : 1 to 4094 ") if clicommon.is_vlanid_in_range(vlan_end) is False: @@ -279,5 +314,8 @@ def del_vxlan_map_range(db, vxlan_name, vlan_start, vlan_end, vni_start): continue mapname = vxlan_name + '|' + 'map_' + vni_name + '_' + vlan_name - db.cfgdb.set_entry('VXLAN_TUNNEL_MAP', mapname, None) + try: + config_db.set_entry('VXLAN_TUNNEL_MAP', mapname, None) + except JsonPatchConflict as e: + ctx.fail("Invalid ConfigDB. Error: {}".format(e))