diff --git a/config/chassis_modules.py b/config/chassis_modules.py index 6e783ed856..8e76623bbc 100644 --- a/config/chassis_modules.py +++ b/config/chassis_modules.py @@ -3,6 +3,7 @@ import click import utilities_common.cli as clicommon +from utilities_common import constants # # 'chassis_modules' group ('config chassis_modules ...') @@ -16,11 +17,11 @@ def chassis_modules(): # 'shutdown' subcommand ('config chassis_modules shutdown ...') # @chassis_modules.command('shutdown') -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('chassis_module_name', metavar='', required=True) def shutdown_chassis_module(db, chassis_module_name): """Chassis-module shutdown of module""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] ctx = click.get_current_context() if not chassis_module_name.startswith("SUPERVISOR") and \ @@ -35,10 +36,10 @@ def shutdown_chassis_module(db, chassis_module_name): # 'startup' subcommand ('config chassis_modules startup ...') # @chassis_modules.command('startup') -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('chassis_module_name', metavar='', required=True) def startup_chassis_module(db, chassis_module_name): """Chassis-module startup of module""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] config_db.set_entry('CHASSIS_MODULE', chassis_module_name, None) diff --git a/config/console.py b/config/console.py index b28aeda672..b2b3bca0cd 100644 --- a/config/console.py +++ b/config/console.py @@ -1,5 +1,6 @@ import click import utilities_common.cli as clicommon +from utilities_common import constants # # 'console' group ('config console ...') @@ -13,10 +14,10 @@ def console(): # 'console enable' group ('config console enable') # @console.command('enable') -@clicommon.pass_db +@clicommon.pass_multi_asic_db def enable_console_switch(db): """Enable console switch""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] table = "CONSOLE_SWITCH" dataKey1 = 'console_mgmt' @@ -29,10 +30,10 @@ def enable_console_switch(db): # 'console disable' group ('config console disable') # @console.command('disable') -@clicommon.pass_db +@clicommon.pass_multi_asic_db def disable_console_switch(db): """Disable console switch""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] table = "CONSOLE_SWITCH" dataKey1 = 'console_mgmt' @@ -45,14 +46,14 @@ def disable_console_switch(db): # 'console add' group ('config console add ...') # @console.command('add') -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('linenum', metavar='', required=True, type=click.IntRange(0, 65535)) @click.option('--baud', '-b', metavar='', required=True, type=click.INT) @click.option('--flowcontrol', '-f', metavar='', required=False, is_flag=True) @click.option('--devicename', '-d', metavar='', required=False) def add_console_setting(db, linenum, baud, flowcontrol, devicename): """Add Console-realted configuration tasks""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] table = "CONSOLE_PORT" dataKey1 = 'baud_rate' @@ -79,11 +80,11 @@ def add_console_setting(db, linenum, baud, flowcontrol, devicename): # 'console del' group ('config console del ...') # @console.command('del') -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('linenum', metavar='', required=True, type=click.IntRange(0, 65535)) def remove_console_setting(db, linenum): """Remove Console-related configuration tasks""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] table = "CONSOLE_PORT" @@ -98,12 +99,12 @@ def remove_console_setting(db, linenum): # 'console remote_device' group ('config console remote_device ...') # @console.command('remote_device') -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('linenum', metavar='', required=True, type=click.IntRange(0, 65535)) @click.argument('devicename', metavar='', required=False) def upate_console_remote_device_name(db, linenum, devicename): """Update remote device name for a console line""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] ctx = click.get_current_context() table = "CONSOLE_PORT" @@ -130,12 +131,12 @@ def upate_console_remote_device_name(db, linenum, devicename): # 'console baud' group ('config console baud ...') # @console.command('baud') -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('linenum', metavar='', required=True, type=click.IntRange(0, 65535)) @click.argument('baud', metavar='', required=True, type=click.INT) def update_console_baud(db, linenum, baud): """Update baud for a console line""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] ctx = click.get_current_context() table = "CONSOLE_PORT" @@ -157,12 +158,12 @@ def update_console_baud(db, linenum, baud): # 'console flow_control' group ('config console flow_control ...') # @console.command('flow_control') -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('mode', metavar='', required=True, type=click.Choice(["enable", "disable"])) @click.argument('linenum', metavar='', required=True, type=click.IntRange(0, 65535)) def update_console_flow_control(db, mode, linenum): """Update flow control setting for a console line""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] ctx = click.get_current_context() table = "CONSOLE_PORT" diff --git a/config/feature.py b/config/feature.py index 8a90ae798d..888fb5e067 100644 --- a/config/feature.py +++ b/config/feature.py @@ -1,7 +1,7 @@ import sys import click -from utilities_common.cli import AbbreviationGroup, pass_db +from utilities_common.cli import AbbreviationGroup, pass_multi_asic_db # # 'feature' group ('config feature ...') @@ -17,20 +17,28 @@ def feature(): @feature.command('state', short_help="Enable/disable a feature") @click.argument('name', metavar='', required=True) @click.argument('state', metavar='', required=True, type=click.Choice(["enabled", "disabled"])) -@pass_db +@pass_multi_asic_db def feature_state(db, name, state): """Enable/disable a feature""" - entry_data = db.cfgdb.get_entry('FEATURE', name) + entry_data_set = set() - if not entry_data: - click.echo("Feature '{}' doesn't exist".format(name)) + for ns, cfgdb in db.cfgdb.items(): + entry_data = cfgdb.get_entry('FEATURE', name) + if not entry_data: + click.echo("Feature '{}' doesn't exist".format(name)) + sys.exit(1) + entry_data_set.add(entry_data['state']) + + if len(entry_data_set) > 1: + click.echo("Feature '{}' state is not consistent across namespaces".format(name)) sys.exit(1) if entry_data['state'] == "always_enabled": click.echo("Feature '{}' state is always enabled and can not be modified".format(name)) return - db.cfgdb.mod_entry('FEATURE', name, {'state': state}) + for ns, cfgdb in db.cfgdb.items(): + cfgdb.mod_entry('FEATURE', name, {'state': state}) # # 'autorestart' command ('config feature autorestart ...') @@ -38,17 +46,25 @@ def feature_state(db, name, state): @feature.command(name='autorestart', short_help="Enable/disable autosrestart of a feature") @click.argument('name', metavar='', required=True) @click.argument('autorestart', metavar='', required=True, type=click.Choice(["enabled", "disabled"])) -@pass_db +@pass_multi_asic_db def feature_autorestart(db, name, autorestart): """Enable/disable autorestart of a feature""" - entry_data = db.cfgdb.get_entry('FEATURE', name) + entry_data_set = set() - if not entry_data: - click.echo("Feature '{}' doesn't exist".format(name)) - sys.exit(1) + for ns, cfgdb in db.cfgdb.items(): + entry_data = cfgdb.get_entry('FEATURE', name) + if not entry_data: + click.echo("Feature '{}' doesn't exist".format(name)) + sys.exit(1) + entry_data_set.add(entry_data['auto_restart']) + if len(entry_data_set) > 1: + click.echo("Feature '{}' auto-restart is not consistent across namespaces".format(name)) + sys.exit(1) + if entry_data['auto_restart'] == "always_enabled": click.echo("Feature '{}' auto-restart is always enabled and can not be modified".format(name)) return - db.cfgdb.mod_entry('FEATURE', name, {'auto_restart': autorestart}) + for ns, cfgdb in db.cfgdb.items(): + cfgdb.mod_entry('FEATURE', name, {'auto_restart': autorestart}) diff --git a/config/kube.py b/config/kube.py index 08cca628d8..3f117a7999 100644 --- a/config/kube.py +++ b/config/kube.py @@ -12,7 +12,7 @@ import yaml from sonic_py_common import device_info from swsssdk import ConfigDBConnector -from utilities_common.db import Db +from utilities_common.multi_asic import MultiAsicDb from .utils import log @@ -31,7 +31,7 @@ def _update_kube_server(field, val): config_db.connect() table = "KUBERNETES_MASTER" key = "SERVER" - db_data = Db().get_data(table, key) + db_data = MultiAsicDb().get_default_namespace_data(table, key) def_data = { "IP": "", "insecure": "False", @@ -112,7 +112,7 @@ def _get_labels(): labels.append("sonic_version={}".format(version_info['build_version'])) labels.append("hwsku={}".format(hwsku)) - lh = Db().get_data('DEVICE_METADATA', 'localhost') + lh = MultiAsicDb().get_default_namespace_data('DEVICE_METADATA', 'localhost') labels.append("deployment_type={}".format( lh['type'] if lh and 'type' in lh else "Unknown")) labels.append("enable_pods=True") @@ -215,7 +215,7 @@ def kube_join(force=False): log.log_error("Lock {} is active; Bail out".format(LOCK_FILE)) return - db_data = Db().get_data('KUBERNETES_MASTER', 'SERVER') + db_data = MultiAsicDb().get_default_namespace_data('KUBERNETES_MASTER', 'SERVER') if not db_data or 'IP' not in db_data or not db_data['IP']: log.log_error("Kubernetes server is not configured") diff --git a/config/main.py b/config/main.py index a074a55924..ce93b0b18e 100644 --- a/config/main.py +++ b/config/main.py @@ -18,7 +18,8 @@ from sonic_py_common.interface import get_interface_table_name, get_port_table_name from swsssdk import ConfigDBConnector, SonicDBConfig from swsscommon.swsscommon import SonicV2Connector -from utilities_common.db import Db +from utilities_common import constants +from utilities_common.multi_asic import MultiAsicDb from utilities_common.intf_filter import parse_interface_in_filter import utilities_common.cli as clicommon from .utils import log @@ -870,7 +871,7 @@ def config(ctx): if os.geteuid() != 0: exit("Root privileges are required for this operation") - ctx.obj = Db() + ctx.obj = MultiAsicDb() # Add groups from other modules @@ -1001,7 +1002,7 @@ def load(filename, yes): @click.option('-l', '--load-sysinfo', is_flag=True, help='load system default information (mac, portmap etc) first.') @click.option('-n', '--no_service_restart', default=False, is_flag=True, help='Do not restart docker services') @click.argument('filename', required=False) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def reload(db, filename, yes, load_sysinfo, no_service_restart): """Clear current configuration and import a previous saved config DB dump file. : Names of configuration file(s) to load, separated by comma with no spaces in between @@ -1044,7 +1045,7 @@ def reload(db, filename, yes, load_sysinfo, no_service_restart): #Stop services before config push if not no_service_restart: log.log_info("'reload' stopping services...") - _stop_services(db.cfgdb) + _stop_services(db.cfgdb[DEFAULT_NAMESPACE]) # In Single ASIC platforms we have single DB service. In multi-ASIC platforms we have a global DB # service running in the host + DB services running in each ASIC namespace created per ASIC. @@ -1115,9 +1116,9 @@ def reload(db, filename, yes, load_sysinfo, no_service_restart): # We first run "systemctl reset-failed" to remove the "failed" # status from all services before we attempt to restart them if not no_service_restart: - _reset_failed_services(db.cfgdb) + _reset_failed_services(db.cfgdb[DEFAULT_NAMESPACE]) log.log_info("'reload' restarting services...") - _restart_services(db.cfgdb) + _restart_services(db.cfgdb[DEFAULT_NAMESPACE]) @config.command("load_mgmt_config") @click.option('-y', '--yes', is_flag=True, callback=_abort_if_false, @@ -1148,7 +1149,7 @@ def load_mgmt_config(filename): @click.option('-y', '--yes', is_flag=True, callback=_abort_if_false, expose_value=False, prompt='Reload config from minigraph?') @click.option('-n', '--no_service_restart', default=False, is_flag=True, help='Do not restart docker services') -@clicommon.pass_db +@clicommon.pass_multi_asic_db def load_minigraph(db, no_service_restart): """Reconfigure based on minigraph.""" log.log_info("'load_minigraph' executing...") @@ -1156,7 +1157,7 @@ def load_minigraph(db, no_service_restart): #Stop services before config push if not no_service_restart: log.log_info("'load_minigraph' stopping services...") - _stop_services(db.cfgdb) + _stop_services(db.cfgdb[DEFAULT_NAMESPACE]) # For Single Asic platform the namespace list has the empty string # for mulit Asic platform the empty string to generate the config @@ -1212,10 +1213,10 @@ def load_minigraph(db, no_service_restart): # We first run "systemctl reset-failed" to remove the "failed" # status from all services before we attempt to restart them if not no_service_restart: - _reset_failed_services(db.cfgdb) + _reset_failed_services(db.cfgdb[DEFAULT_NAMESPACE]) #FIXME: After config DB daemon is implemented, we'll no longer need to restart every service. log.log_info("'load_minigraph' restarting services...") - _restart_services(db.cfgdb) + _restart_services(db.cfgdb[DEFAULT_NAMESPACE]) click.echo("Please note setting loaded from minigraph will be lost after system reboot. To preserve setting, run `config save`.") @@ -3358,10 +3359,10 @@ def profile(ctx): @click.option('--size', metavar='', type=int, help="Set reserved size size") @click.option('--dynamic_th', metavar='', type=str, help="Set dynamic threshold") @click.option('--pool', metavar='', type=str, help="Buffer pool") -@clicommon.pass_db +@clicommon.pass_multi_asic_db def add_profile(db, profile, xon, xoff, size, dynamic_th, pool): """Add or modify a buffer profile""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] ctx = click.get_current_context() profile_entry = config_db.get_entry('BUFFER_PROFILE', profile) @@ -3378,10 +3379,10 @@ def add_profile(db, profile, xon, xoff, size, dynamic_th, pool): @click.option('--size', metavar='', type=int, help="Set reserved size size") @click.option('--dynamic_th', metavar='', type=str, help="Set dynamic threshold") @click.option('--pool', metavar='', type=str, help="Buffer pool") -@clicommon.pass_db +@clicommon.pass_multi_asic_db def set_profile(db, profile, xon, xoff, size, dynamic_th, pool): """Add or modify a buffer profile""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] ctx = click.get_current_context() profile_entry = config_db.get_entry('BUFFER_PROFILE', profile) @@ -3455,10 +3456,10 @@ def update_profile(ctx, config_db, profile_name, xon, xoff, size, dynamic_th, po @profile.command('remove') @click.argument('profile', metavar='', required=True) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def remove_profile(db, profile): """Delete a buffer profile""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] ctx = click.get_current_context() full_profile_name = '[BUFFER_PROFILE|{}]'.format(profile) diff --git a/config/vlan.py b/config/vlan.py index 718f31f917..ea4cf85bf7 100644 --- a/config/vlan.py +++ b/config/vlan.py @@ -3,6 +3,7 @@ from time import sleep from .utils import log +from utilities_common import constants # # 'vlan' group ('config vlan ...') @@ -14,7 +15,7 @@ def vlan(): @vlan.command('add') @click.argument('vid', metavar='', required=True, type=int) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def add_vlan(db, vid): """Add VLAN""" @@ -24,14 +25,14 @@ def add_vlan(db, vid): ctx.fail("Invalid VLAN ID {} (1-4094)".format(vid)) vlan = 'Vlan{}'.format(vid) - if clicommon.check_if_vlanid_exist(db.cfgdb, vlan): + if clicommon.check_if_vlanid_exist(db.cfgdb[constants.DEFAULT_NAMESPACE], vlan): ctx.fail("{} already exists".format(vlan)) - db.cfgdb.set_entry('VLAN', vlan, {'vlanid': vid}) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN', vlan, {'vlanid': vid}) @vlan.command('del') @click.argument('vid', metavar='', required=True, type=int) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def del_vlan(db, vid): """Delete VLAN""" @@ -43,13 +44,13 @@ def del_vlan(db, vid): ctx.fail("Invalid VLAN ID {} (1-4094)".format(vid)) vlan = 'Vlan{}'.format(vid) - if clicommon.check_if_vlanid_exist(db.cfgdb, vlan) == False: + if clicommon.check_if_vlanid_exist(db.cfgdb[constants.DEFAULT_NAMESPACE], vlan) == False: ctx.fail("{} does not exist".format(vlan)) - keys = [ (k, v) for k, v in db.cfgdb.get_table('VLAN_MEMBER') if k == 'Vlan{}'.format(vid) ] + keys = [ (k, v) for k, v in db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('VLAN_MEMBER') if k == 'Vlan{}'.format(vid) ] for k in keys: - db.cfgdb.set_entry('VLAN_MEMBER', k, None) - db.cfgdb.set_entry('VLAN', 'Vlan{}'.format(vid), None) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN_MEMBER', k, None) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN', 'Vlan{}'.format(vid), None) def restart_ndppd(): verify_swss_running_cmd = "docker container inspect -f '{{.State.Status}}' swss" @@ -71,7 +72,7 @@ def restart_ndppd(): @vlan.command('proxy_arp') @click.argument('vid', metavar='', required=True, type=int) @click.argument('mode', metavar='', required=True, type=click.Choice(["enabled", "disabled"])) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def config_proxy_arp(db, vid, mode): """Configure proxy ARP for a VLAN""" @@ -81,10 +82,10 @@ def config_proxy_arp(db, vid, mode): vlan = 'Vlan{}'.format(vid) - if not clicommon.is_valid_vlan_interface(db.cfgdb, vlan): + if not clicommon.is_valid_vlan_interface(db.cfgdb[constants.DEFAULT_NAMESPACE], vlan): ctx.fail("Interface {} does not exist".format(vlan)) - db.cfgdb.set_entry('VLAN_INTERFACE', vlan, {"proxy_arp": mode}) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN_INTERFACE', vlan, {"proxy_arp": mode}) click.echo('Proxy ARP setting saved to ConfigDB') restart_ndppd() # @@ -98,7 +99,7 @@ def vlan_member(): @click.argument('vid', metavar='', required=True, type=int) @click.argument('port', metavar='port', required=True) @click.option('-u', '--untagged', is_flag=True) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def add_vlan_member(db, vid, port, untagged): """Add VLAN member""" @@ -110,7 +111,7 @@ def add_vlan_member(db, vid, port, untagged): ctx.fail("Invalid VLAN ID {} (1-4094)".format(vid)) vlan = 'Vlan{}'.format(vid) - if clicommon.check_if_vlanid_exist(db.cfgdb, vlan) == False: + if clicommon.check_if_vlanid_exist(db.cfgdb[constants.DEFAULT_NAMESPACE], vlan) == False: ctx.fail("{} does not exist".format(vlan)) if clicommon.get_interface_naming_mode() == "alias": @@ -120,29 +121,29 @@ def add_vlan_member(db, vid, port, untagged): if port is None: ctx.fail("cannot find port name for alias {}".format(alias)) - if clicommon.is_port_mirror_dst_port(db.cfgdb, port): + if clicommon.is_port_mirror_dst_port(db.cfgdb[constants.DEFAULT_NAMESPACE], port): ctx.fail("{} is configured as mirror destination port".format(port)) - if clicommon.is_port_vlan_member(db.cfgdb, port, vlan): + if clicommon.is_port_vlan_member(db.cfgdb[constants.DEFAULT_NAMESPACE], port, vlan): ctx.fail("{} is already a member of {}".format(port, vlan)) - if clicommon.is_valid_port(db.cfgdb, port): + if clicommon.is_valid_port(db.cfgdb[constants.DEFAULT_NAMESPACE], port): is_port = True - elif clicommon.is_valid_portchannel(db.cfgdb, port): + elif clicommon.is_valid_portchannel(db.cfgdb[constants.DEFAULT_NAMESPACE], port): is_port = False else: ctx.fail("{} does not exist".format(port)) - if (is_port and clicommon.is_port_router_interface(db.cfgdb, port)) or \ - (not is_port and clicommon.is_pc_router_interface(db.cfgdb, port)): + if (is_port and clicommon.is_port_router_interface(db.cfgdb[constants.DEFAULT_NAMESPACE], port)) or \ + (not is_port and clicommon.is_pc_router_interface(db.cfgdb[constants.DEFAULT_NAMESPACE], port)): ctx.fail("{} is a router interface!".format(port)) - db.cfgdb.set_entry('VLAN_MEMBER', (vlan, port), {'tagging_mode': "untagged" if untagged else "tagged" }) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN_MEMBER', (vlan, port), {'tagging_mode': "untagged" if untagged else "tagged" }) @vlan_member.command('del') @click.argument('vid', metavar='', required=True, type=int) @click.argument('port', metavar='', required=True) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def del_vlan_member(db, vid, port): """Delete VLAN member""" @@ -154,7 +155,7 @@ def del_vlan_member(db, vid, port): ctx.fail("Invalid VLAN ID {} (1-4094)".format(vid)) vlan = 'Vlan{}'.format(vid) - if clicommon.check_if_vlanid_exist(db.cfgdb, vlan) == False: + if clicommon.check_if_vlanid_exist(db.cfgdb[constants.DEFAULT_NAMESPACE], vlan) == False: ctx.fail("{} does not exist".format(vlan)) if clicommon.get_interface_naming_mode() == "alias": @@ -164,10 +165,10 @@ def del_vlan_member(db, vid, port): if port is None: ctx.fail("cannot find port name for alias {}".format(alias)) - if not clicommon.is_port_vlan_member(db.cfgdb, port, vlan): + if not clicommon.is_port_vlan_member(db.cfgdb[constants.DEFAULT_NAMESPACE], port, vlan): ctx.fail("{} is not a member of {}".format(port, vlan)) - db.cfgdb.set_entry('VLAN_MEMBER', (vlan, port), None) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN_MEMBER', (vlan, port), None) @vlan.group(cls=clicommon.AbbreviationGroup, name='dhcp_relay') def vlan_dhcp_relay(): @@ -176,7 +177,7 @@ def vlan_dhcp_relay(): @vlan_dhcp_relay.command('add') @click.argument('vid', metavar='', required=True, type=int) @click.argument('dhcp_relay_destination_ip', metavar='', required=True) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def add_vlan_dhcp_relay_destination(db, vid, dhcp_relay_destination_ip): """ Add a destination IP address to the VLAN's DHCP relay """ @@ -186,7 +187,7 @@ def add_vlan_dhcp_relay_destination(db, vid, dhcp_relay_destination_ip): ctx.fail('{} is invalid IP address'.format(dhcp_relay_destination_ip)) vlan_name = 'Vlan{}'.format(vid) - vlan = db.cfgdb.get_entry('VLAN', vlan_name) + vlan = db.cfgdb[constants.DEFAULT_NAMESPACE].get_entry('VLAN', vlan_name) if len(vlan) == 0: ctx.fail("{} doesn't exist".format(vlan_name)) @@ -197,7 +198,7 @@ def add_vlan_dhcp_relay_destination(db, vid, dhcp_relay_destination_ip): dhcp_relay_dests.append(dhcp_relay_destination_ip) vlan['dhcp_servers'] = dhcp_relay_dests - db.cfgdb.set_entry('VLAN', vlan_name, vlan) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN', vlan_name, vlan) click.echo("Added DHCP relay destination address {} to {}".format(dhcp_relay_destination_ip, vlan_name)) try: click.echo("Restarting DHCP relay service...") @@ -210,7 +211,7 @@ def add_vlan_dhcp_relay_destination(db, vid, dhcp_relay_destination_ip): @vlan_dhcp_relay.command('del') @click.argument('vid', metavar='', required=True, type=int) @click.argument('dhcp_relay_destination_ip', metavar='', required=True) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def del_vlan_dhcp_relay_destination(db, vid, dhcp_relay_destination_ip): """ Remove a destination IP address from the VLAN's DHCP relay """ @@ -220,7 +221,7 @@ def del_vlan_dhcp_relay_destination(db, vid, dhcp_relay_destination_ip): ctx.fail('{} is invalid IP address'.format(dhcp_relay_destination_ip)) vlan_name = 'Vlan{}'.format(vid) - vlan = db.cfgdb.get_entry('VLAN', vlan_name) + vlan = db.cfgdb[constants.DEFAULT_NAMESPACE].get_entry('VLAN', vlan_name) if len(vlan) == 0: ctx.fail("{} doesn't exist".format(vlan_name)) @@ -233,7 +234,7 @@ def del_vlan_dhcp_relay_destination(db, vid, dhcp_relay_destination_ip): del vlan['dhcp_servers'] else: vlan['dhcp_servers'] = dhcp_relay_dests - db.cfgdb.set_entry('VLAN', vlan_name, vlan) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry('VLAN', vlan_name, vlan) click.echo("Removed DHCP relay destination address {} from {}".format(dhcp_relay_destination_ip, vlan_name)) try: click.echo("Restarting DHCP relay service...") diff --git a/consutil/lib.py b/consutil/lib.py index 0172ac5644..98634ab55f 100644 --- a/consutil/lib.py +++ b/consutil/lib.py @@ -12,6 +12,7 @@ import sys import os from sonic_py_common import device_info + from utilities_common import constants except ImportError as e: raise ImportError("%s - required module not found" % str(e)) @@ -82,8 +83,8 @@ def get(self, target, use_device=False): raise LineNotFoundError def _init_all(self): - config_db = self._db.cfgdb - state_db = self._db.db + config_db = self._db.cfgdb[constants.DEFAULT_NAMESPACE] + state_db = self._db.db[constants.DEFAULT_NAMESPACE] # Querying CONFIG_DB to get configured console ports keys = config_db.get_keys(CONSOLE_PORT_TABLE) @@ -226,7 +227,7 @@ def refresh(self): self._update_state(IDLE_FLAG, "", "") def _update_state(self, state, pid, date, line_num=None): - state_db = self._db.db + state_db = self._db.db[constants.DEFAULT_NAMESPACE] line_key = "{}|{}".format(CONSOLE_PORT_TABLE, self.line_num if line_num is None else line_num) state_db.set(state_db.STATE_DB, line_key, STATE_KEY, state) state_db.set(state_db.STATE_DB, line_key, PID_KEY, pid) diff --git a/consutil/main.py b/consutil/main.py index b4ee3fa4fe..7d75345ad2 100644 --- a/consutil/main.py +++ b/consutil/main.py @@ -17,10 +17,10 @@ raise ImportError("%s - required module not found" % str(e)) @click.group() -@clicommon.pass_db +@clicommon.pass_multi_asic_db def consutil(db): """consutil - Command-line utility for interacting with switches via console device""" - config_db = db.cfgdb + config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] data = config_db.get_entry(CONSOLE_SWITCH_TABLE, FEATURE_KEY) if FEATURE_ENABLED_KEY not in data or data[FEATURE_ENABLED_KEY] == "no": click.echo("Console switch feature is disabled") @@ -30,7 +30,7 @@ def consutil(db): # 'show' subcommand @consutil.command() -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.option('--brief', '-b', metavar='', required=False, is_flag=True) def show(db, brief): """Show all ports and their info include available ttyUSB devices unless specified brief mode""" @@ -54,7 +54,7 @@ def show(db, brief): # 'clear' subcommand @consutil.command() -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('target') @click.option('--devicename', '-d', is_flag=True, help="clear by name - if flag is set, interpret target as device name instead") def clear(db, target, devicename): @@ -76,7 +76,7 @@ def clear(db, target, devicename): # 'connect' subcommand @consutil.command() -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('target') @click.option('--devicename', '-d', is_flag=True, help="connect by name - if flag is set, interpret target as device name instead") def connect(db, target, devicename): diff --git a/crm/main.py b/crm/main.py index 37e0b8eb12..8eca8cb2f4 100644 --- a/crm/main.py +++ b/crm/main.py @@ -3,8 +3,9 @@ import click import swsssdk from tabulate import tabulate -from utilities_common import multi_asic as multi_asic_util from sonic_py_common import multi_asic +from utilities_common import multi_asic as multi_asic_util +from utilities_common import constants class Crm: def __init__(self, db=None): @@ -197,7 +198,7 @@ def cli(ctx): Utility entry point. """ # Use the db object if given as input. - db = None if ctx.obj is None else ctx.obj.cfgdb + db = None if ctx.obj is None else ctx.obj.cfgdb[constants.DEFAULT_NAMESPACE] context = { "crm": Crm(db) diff --git a/pfcwd/main.py b/pfcwd/main.py index c55038b9b2..b502351816 100644 --- a/pfcwd/main.py +++ b/pfcwd/main.py @@ -415,7 +415,7 @@ def show(): @multi_asic_util.multi_asic_click_options @click.option('-e', '--empty', is_flag=True) @click.argument('queues', nargs=-1) - @clicommon.pass_db + @clicommon.pass_multi_asic_db def stats(db, namespace, display, empty, queues): """ Show PFC Watchdog stats per queue """ if (len(queues)): @@ -426,7 +426,7 @@ def stats(db, namespace, display, empty, queues): @show.command() @multi_asic_util.multi_asic_click_options @click.argument('ports', nargs=-1) - @clicommon.pass_db + @clicommon.pass_multi_asic_db def config(db, namespace, display, ports): """ Show PFC Watchdog configuration """ PfcwdCli(db, namespace, display).config(ports) @@ -441,7 +441,7 @@ class Start(object): @click.option('--restoration-time', '-r', type=click.IntRange(100, 60000)) @click.argument('ports', nargs=-1) @click.argument('detection-time', type=click.IntRange(100, 5000)) - @clicommon.pass_db + @clicommon.pass_multi_asic_db def start(db, action, restoration_time, ports, detection_time): """ Start PFC watchdog on port(s). To config all ports, use all as input. @@ -460,7 +460,7 @@ def start(db, action, restoration_time, ports, detection_time): class Interval(object): @cli.command() @click.argument('poll_interval', type=click.IntRange(100, 3000)) - @clicommon.pass_db + @clicommon.pass_multi_asic_db def interval(db, poll_interval): """ Set PFC watchdog counter polling interval """ PfcwdCli(db).interval(poll_interval) @@ -470,7 +470,7 @@ def interval(db, poll_interval): class Stop(object): @cli.command() @click.argument('ports', nargs=-1) - @clicommon.pass_db + @clicommon.pass_multi_asic_db def stop(db, ports): """ Stop PFC watchdog on port(s) """ PfcwdCli(db).stop(ports) @@ -479,7 +479,7 @@ def stop(db, ports): # Set WD default configuration on server facing ports when enable flag is on class StartDefault(object): @cli.command("start_default") - @clicommon.pass_db + @clicommon.pass_multi_asic_db def start_default(db): """ Start PFC WD by default configurations """ PfcwdCli(db).start_default() @@ -489,7 +489,7 @@ def start_default(db): class CounterPoll(object): @cli.command('counter_poll') @click.argument('counter_poll', type=click.Choice(['enable', 'disable'])) - @clicommon.pass_db + @clicommon.pass_multi_asic_db def counter_poll(db, counter_poll): """ Enable/disable counter polling """ PfcwdCli(db).counter_poll(counter_poll) @@ -499,7 +499,7 @@ def counter_poll(db, counter_poll): class BigRedSwitch(object): @cli.command('big_red_switch') @click.argument('big_red_switch', type=click.Choice(['enable', 'disable'])) - @clicommon.pass_db + @clicommon.pass_multi_asic_db def big_red_switch(db, big_red_switch): """ Enable/disable BIG_RED_SWITCH mode """ PfcwdCli(db).big_red_switch(big_red_switch) diff --git a/show/chassis_modules.py b/show/chassis_modules.py index 5a13a32419..527a1f3144 100644 --- a/show/chassis_modules.py +++ b/show/chassis_modules.py @@ -1,9 +1,9 @@ import click +import utilities_common.cli as clicommon from natsort import natsorted from tabulate import tabulate from swsssdk import SonicV2Connector - -import utilities_common.cli as clicommon +from utilities_common import constants CHASSIS_MODULE_INFO_TABLE = 'CHASSIS_MODULE_TABLE' CHASSIS_MODULE_INFO_KEY_TEMPLATE = 'CHASSIS_MODULE {}' @@ -18,13 +18,13 @@ def chassis_modules(): pass @chassis_modules.command() -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.argument('chassis_module_name', metavar='', required=False) def status(db, chassis_module_name): """Show chassis-modules status""" header = ['Name', 'Description', 'Physical-Slot', 'Oper-Status', 'Admin-Status'] - chassis_cfg_table = db.cfgdb.get_table('CHASSIS_MODULE') + chassis_cfg_table = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('CHASSIS_MODULE') state_db = SonicV2Connector(host="127.0.0.1") state_db.connect(state_db.STATE_DB) diff --git a/show/feature.py b/show/feature.py index e3dfd907a3..7a6d5b0a09 100644 --- a/show/feature.py +++ b/show/feature.py @@ -2,7 +2,8 @@ from natsort import natsorted from tabulate import tabulate -from utilities_common.cli import AbbreviationGroup, pass_db +from utilities_common import constants +from utilities_common.cli import AbbreviationGroup, pass_multi_asic_db # # 'feature' group (show feature ...) @@ -17,11 +18,11 @@ def feature(): # @feature.command('status', short_help="Show feature state") @click.argument('feature_name', required=False) -@pass_db +@pass_multi_asic_db def feature_status(db, feature_name): header = ['Feature', 'State', 'AutoRestart'] body = [] - feature_table = db.cfgdb.get_table('FEATURE') + feature_table = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('FEATURE') if feature_name: if feature_table and feature_name in feature_table: body.append([feature_name, feature_table[feature_name]['state'], \ @@ -39,11 +40,11 @@ def feature_status(db, feature_name): # @feature.command('autorestart', short_help="Show auto-restart state for a feature") @click.argument('feature_name', required=False) -@pass_db +@pass_multi_asic_db def feature_autorestart(db, feature_name): header = ['Feature', 'AutoRestart'] body = [] - feature_table = db.cfgdb.get_table('FEATURE') + feature_table = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('FEATURE') if feature_name: if feature_table and feature_name in feature_table: body.append([feature_name, feature_table[feature_name]['auto_restart']]) diff --git a/show/interfaces/__init__.py b/show/interfaces/__init__.py index 83e230acf1..099122d81c 100644 --- a/show/interfaces/__init__.py +++ b/show/interfaces/__init__.py @@ -1,11 +1,11 @@ import json - import click import utilities_common.cli as clicommon import utilities_common.multi_asic as multi_asic_util from natsort import natsorted -from tabulate import tabulate from sonic_py_common import multi_asic +from tabulate import tabulate +from utilities_common import constants from . import portchannel @@ -223,16 +223,16 @@ def neighbor(): # 'expected' subcommand ("show interface neighbor expected") @neighbor.command() @click.argument('interfacename', required=False) -@clicommon.pass_db +@clicommon.pass_multi_asic_db def expected(db, interfacename): """Show expected neighbor information by interfaces""" - neighbor_dict = db.cfgdb.get_table("DEVICE_NEIGHBOR") + neighbor_dict = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table("DEVICE_NEIGHBOR") if neighbor_dict is None: click.echo("DEVICE_NEIGHBOR information is not present.") return - neighbor_metadata_dict = db.cfgdb.get_table("DEVICE_NEIGHBOR_METADATA") + neighbor_metadata_dict = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table("DEVICE_NEIGHBOR_METADATA") if neighbor_metadata_dict is None: click.echo("DEVICE_NEIGHBOR_METADATA information is not present.") return @@ -330,7 +330,7 @@ def lpmode(interfacename, verbose): @click.option('--namespace', '-n', 'namespace', default=None, show_default=True, type=click.Choice(multi_asic_util.multi_asic_ns_choices()), help='Namespace name or all') @click.option('--verbose', is_flag=True, help="Enable verbose output") -@clicommon.pass_db +@clicommon.pass_multi_asic_db def presence(db, interfacename, namespace, verbose): """Show interface transceiver presence""" diff --git a/show/kube.py b/show/kube.py index fbcfbe3e23..d25fd7ce91 100644 --- a/show/kube.py +++ b/show/kube.py @@ -1,9 +1,9 @@ import os import click -from sonic_py_common import device_info -from utilities_common.db import Db import utilities_common.cli as clicommon +from sonic_py_common import device_info +from utilities_common.multi_asic import MultiAsicDb KUBE_ADMIN_CONF = "/etc/sonic/kube_admin.conf" KUBECTL_CMD = "kubectl --kubeconfig /etc/sonic/kube_admin.conf {}" @@ -58,7 +58,7 @@ def status(): @kubernetes.command() def server(): """Show kube configuration""" - kube_fvs = Db().get_data(REDIS_KUBE_TABLE, REDIS_KUBE_KEY) + kube_fvs = MultiAsicDb().get_default_namespace_data(REDIS_KUBE_TABLE, REDIS_KUBE_KEY) if kube_fvs: _print_entry(kube_fvs, "{} {}".format( REDIS_KUBE_TABLE, REDIS_KUBE_KEY)) diff --git a/show/main.py b/show/main.py index c6f02987ff..23d47e19b3 100644 --- a/show/main.py +++ b/show/main.py @@ -12,7 +12,6 @@ from swsssdk import ConfigDBConnector from swsscommon.swsscommon import SonicV2Connector from tabulate import tabulate -from utilities_common.db import Db from . import acl from . import bgp_common @@ -134,7 +133,7 @@ def connect_config_db(): def cli(ctx): """SONiC command line - 'show' command""" - ctx.obj = Db() + ctx.obj = multi_asic_util.MultiAsicDb() # Add groups from other modules diff --git a/show/sflow.py b/show/sflow.py index a84a4bdff1..51f022b68a 100644 --- a/show/sflow.py +++ b/show/sflow.py @@ -3,28 +3,29 @@ from natsort import natsorted from swsscommon.swsscommon import SonicV2Connector from tabulate import tabulate +from utilities_common import constants # # 'sflow group ("show sflow ...") # @click.group(invoke_without_command=True) -@clicommon.pass_db +@clicommon.pass_multi_asic_db @click.pass_context def sflow(ctx, db): """Show sFlow related information""" if ctx.invoked_subcommand is None: - show_sflow_global(db.cfgdb) + show_sflow_global(db.cfgdb[constants.DEFAULT_NAMESPACE]) # # 'interface' command ("show sflow interface ...") # @sflow.command('interface') -@clicommon.pass_db +@clicommon.pass_multi_asic_db def sflow_interface(db): """Show sFlow interface information""" - show_sflow_interface(db.cfgdb) + show_sflow_interface(db.cfgdb[constants.DEFAULT_NAMESPACE]) def sflow_appDB_connect(): diff --git a/show/vlan.py b/show/vlan.py index f95d21a402..8e25751f9d 100644 --- a/show/vlan.py +++ b/show/vlan.py @@ -1,8 +1,8 @@ import click +import utilities_common.cli as clicommon from natsort import natsorted from tabulate import tabulate - -import utilities_common.cli as clicommon +from utilities_common import constants @click.group(cls=clicommon.AliasedGroup) def vlan(): @@ -11,16 +11,16 @@ def vlan(): @vlan.command() @click.option('--verbose', is_flag=True, help="Enable verbose output") -@clicommon.pass_db +@clicommon.pass_multi_asic_db def brief(db, verbose): """Show all bridge information""" header = ['VLAN ID', 'IP Address', 'Ports', 'Port Tagging', 'DHCP Helper Address', 'Proxy ARP'] body = [] # Fetching data from config db for VLAN, VLAN_INTERFACE and VLAN_MEMBER - vlan_dhcp_helper_data = db.cfgdb.get_table('VLAN') - vlan_ip_data = db.cfgdb.get_table('VLAN_INTERFACE') - vlan_ports_data = db.cfgdb.get_table('VLAN_MEMBER') + vlan_dhcp_helper_data = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('VLAN') + vlan_ip_data = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('VLAN_INTERFACE') + vlan_ports_data = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('VLAN_MEMBER') # Defining dictionaries for DHCP Helper address, Interface Gateway IP, # VLAN ports and port tagging @@ -104,11 +104,11 @@ def brief(db, verbose): click.echo(tabulate(body, header, tablefmt="grid")) @vlan.command() -@clicommon.pass_db +@clicommon.pass_multi_asic_db def config(db): - data = db.cfgdb.get_table('VLAN') + data = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('VLAN') keys = list(data.keys()) - member_data = db.cfgdb.get_table('VLAN_MEMBER') + member_data = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('VLAN_MEMBER') def tablelize(keys, data): table = [] @@ -129,7 +129,7 @@ def tablelize(keys, data): else: r.append(m) - entry = db.cfgdb.get_entry('VLAN_MEMBER', (k, m)) + entry = db.cfgdb[constants.DEFAULT_NAMESPACE].get_entry('VLAN_MEMBER', (k, m)) mode = entry.get('tagging_mode') if mode is None: r.append('?') diff --git a/tests/buffer_test.py b/tests/buffer_test.py index cf32f39d55..0c2939b5e3 100644 --- a/tests/buffer_test.py +++ b/tests/buffer_test.py @@ -9,7 +9,8 @@ import show.main as show import config.main as config -from utilities_common.db import Db +from utilities_common import constants +from utilities_common.multi_asic import MultiAsicDb from .buffer_input.buffer_test_vectors import * @@ -34,24 +35,24 @@ def setUp(self): def test_config_buffer_profile_headroom(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["buffer"].commands["profile"].commands["add"], ["testprofile", "--dynamic_th", "3", "--xon", "18432", "--xoff", "32768"], obj=db) print(result.exit_code) print(result.output) assert result.exit_code == 0 - profile = db.cfgdb.get_entry('BUFFER_PROFILE', 'testprofile') + profile = db.cfgdb[constants.DEFAULT_NAMESPACE].get_entry('BUFFER_PROFILE', 'testprofile') assert profile == {'dynamic_th': '3', 'pool': '[BUFFER_POOL|ingress_lossless_pool]', 'xon': '18432', 'xoff': '32768', 'size': '51200'} def test_config_buffer_profile_dynamic_th(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["buffer"].commands["profile"].commands["add"], ["testprofile", "--dynamic_th", "3"], obj=db) print(result.exit_code) print(result.output) assert result.exit_code == 0 - profile = db.cfgdb.get_entry('BUFFER_PROFILE', 'testprofile') + profile = db.cfgdb[constants.DEFAULT_NAMESPACE].get_entry('BUFFER_PROFILE', 'testprofile') assert profile == {'dynamic_th': '3', 'pool': '[BUFFER_POOL|ingress_lossless_pool]', 'headroom_type': 'dynamic'} def test_config_buffer_profile_add_existing(self): diff --git a/tests/chassis_modules_test.py b/tests/chassis_modules_test.py index 754845eba2..89dac6ecc6 100644 --- a/tests/chassis_modules_test.py +++ b/tests/chassis_modules_test.py @@ -9,7 +9,7 @@ import show.main as show import config.main as config import tests.mock_tables.dbconnector -from utilities_common.db import Db +from utilities_common.multi_asic import MultiAsicDb show_linecard0_shutdown_output="""\ LINE-CARD0 line-card 1 Empty down @@ -71,7 +71,7 @@ def test_show_incorrect_module(self): def test_config_shutdown_module(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["chassis-modules"].commands["shutdown"], ["LINE-CARD0"], obj=db) print(result.exit_code) print(result.output) @@ -90,7 +90,7 @@ def test_config_shutdown_module(self): def test_config_startup_module(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["chassis-modules"].commands["startup"], ["LINE-CARD0"], obj=db) print(result.exit_code) print(result.output) @@ -106,7 +106,7 @@ def test_config_startup_module(self): def test_config_incorrect_module(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["chassis-modules"].commands["shutdown"], ["TEST-CARD0"], obj=db) print(result.exit_code) print(result.output) diff --git a/tests/config_test.py b/tests/config_test.py index 1ca37fb7a9..0e238f4076 100644 --- a/tests/config_test.py +++ b/tests/config_test.py @@ -5,7 +5,7 @@ import click from click.testing import CliRunner -from utilities_common.db import Db +from utilities_common.multi_asic import MultiAsicDb load_minigraph_command_output="""\ Executing stop of service telemetry... @@ -77,7 +77,7 @@ def test_load_minigraph(self, get_cmd_module, setup_single_broacom_asic): def test_load_minigraph_with_disabled_telemetry(self, get_cmd_module, setup_single_broacom_asic): with mock.patch("utilities_common.cli.run_command", mock.MagicMock(side_effect=mock_run_command_side_effect)) as mock_run_command: (config, show) = get_cmd_module - db = Db() + db = MultiAsicDb() runner = CliRunner() result = runner.invoke(config.config.commands["feature"].commands["state"], ["telemetry", "disabled"], obj=db) assert result.exit_code == 0 diff --git a/tests/console_test.py b/tests/console_test.py index c38b7ebb56..604c992f7a 100644 --- a/tests/console_test.py +++ b/tests/console_test.py @@ -11,9 +11,10 @@ import tests.mock_tables.dbconnector from click.testing import CliRunner -from utilities_common.db import Db from consutil.lib import * from sonic_py_common import device_info +from utilities_common import constants +from utilities_common.multi_asic import MultiAsicDb class TestConfigConsoleCommands(object): @classmethod @@ -22,7 +23,7 @@ def setup_class(cls): def test_enable_console_switch(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["console"].commands["enable"]) print(result.exit_code) @@ -31,7 +32,7 @@ def test_enable_console_switch(self): def test_disable_console_switch(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["console"].commands["disable"]) print(result.exit_code) @@ -40,8 +41,8 @@ def test_disable_console_switch(self): def test_console_add_exists(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "baud_rate" : "9600" }) # add a console setting which the port exists result = runner.invoke(config.config.commands["console"].commands["add"], ["1", '--baud', "9600"], obj=db) @@ -52,7 +53,7 @@ def test_console_add_exists(self): def test_console_add_no_baud(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # add a console setting without baud result = runner.invoke(config.config.commands["console"].commands["add"], ["1"], obj=db) @@ -63,8 +64,8 @@ def test_console_add_no_baud(self): def test_console_add_name_conflict(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch1" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch1" }) # add a console setting which the device name has been used by other port result = runner.invoke(config.config.commands["console"].commands["add"], ["1", '--baud', "9600", "--devicename", "switch1"], obj=db) @@ -75,7 +76,7 @@ def test_console_add_name_conflict(self): def test_console_add_success(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # add a console setting without flow control option result = runner.invoke(config.config.commands["console"].commands["add"], ["0", '--baud', "9600"], obj=db) @@ -97,7 +98,7 @@ def test_console_add_success(self): def test_console_del_non_exists(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # remote a console port setting which is not exists result = runner.invoke(config.config.commands["console"].commands["del"], ["0"], obj=db) @@ -108,8 +109,8 @@ def test_console_del_non_exists(self): def test_console_del_success(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) # add a console setting which the port exists result = runner.invoke(config.config.commands["console"].commands["del"], ["1"], obj=db) @@ -119,7 +120,7 @@ def test_console_del_success(self): def test_update_console_remote_device_name_non_exists(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # trying to update a console line remote device configuration which is not exists result = runner.invoke(config.config.commands["console"].commands["remote_device"], ["1", "switch1"], obj=db) @@ -130,9 +131,9 @@ def test_update_console_remote_device_name_non_exists(self): def test_update_console_remote_device_name_conflict(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "baud": "9600" }) - db.cfgdb.set_entry("CONSOLE_PORT", 2, { "baud": "9600", "remote_device" : "switch1" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "baud": "9600" }) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 2, { "baud": "9600", "remote_device" : "switch1" }) # trying to update a console line remote device configuration which is not exists result = runner.invoke(config.config.commands["console"].commands["remote_device"], ["1", "switch1"], obj=db) @@ -143,8 +144,8 @@ def test_update_console_remote_device_name_conflict(self): def test_update_console_remote_device_name_existing_and_same(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch1" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch1" }) # trying to update a console line remote device configuration which is existing and same with user provided value result = runner.invoke(config.config.commands["console"].commands["remote_device"], ["2", "switch1"], obj=db) @@ -154,8 +155,8 @@ def test_update_console_remote_device_name_existing_and_same(self): def test_update_console_remote_device_name_reset(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch1" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch1" }) # trying to reset a console line remote device configuration which is not exists result = runner.invoke(config.config.commands["console"].commands["remote_device"], ["2"], obj=db) @@ -165,8 +166,8 @@ def test_update_console_remote_device_name_reset(self): def test_update_console_remote_device_name_success(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) # trying to set a console line remote device configuration result = runner.invoke(config.config.commands["console"].commands["remote_device"], ["1", "switch1"], obj=db) @@ -176,8 +177,8 @@ def test_update_console_remote_device_name_success(self): def test_update_console_baud_no_change(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) # trying to set a console line baud which is same with existing one result = runner.invoke(config.config.commands["console"].commands["baud"], ["1", "9600"], obj=db) @@ -187,7 +188,7 @@ def test_update_console_baud_no_change(self): def test_update_console_baud_non_exists(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # trying to set a console line baud which is not exists result = runner.invoke(config.config.commands["console"].commands["baud"], ["1", "9600"], obj=db) @@ -198,8 +199,8 @@ def test_update_console_baud_non_exists(self): def test_update_console_baud_success(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) # trying to set a console line baud result = runner.invoke(config.config.commands["console"].commands["baud"], ["1", "115200"], obj=db) @@ -209,8 +210,8 @@ def test_update_console_baud_success(self): def test_update_console_flow_control_no_change(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600", "flow_control" : "0" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600", "flow_control" : "0" }) # trying to set a console line flow control option which is same with existing one result = runner.invoke(config.config.commands["console"].commands["flow_control"], ["disable", "1"], obj=db) @@ -220,7 +221,7 @@ def test_update_console_flow_control_no_change(self): def test_update_console_flow_control_non_exists(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # trying to set a console line flow control option which is not exists result = runner.invoke(config.config.commands["console"].commands["flow_control"], ["enable", "1"], obj=db) @@ -231,8 +232,8 @@ def test_update_console_flow_control_non_exists(self): def test_update_console_flow_control_success(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600", "flow_control" : "0" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600", "flow_control" : "0" }) # trying to set a console line flow control option result = runner.invoke(config.config.commands["console"].commands["flow_control"], ["enable", "1"], obj=db) @@ -246,21 +247,21 @@ def setup_class(cls): print("SETUP") def test_console_port_provider_get_all_configured_only_empty(self): - db = Db() + db = MultiAsicDb() provider = ConsolePortProvider(db, configured_only=True) assert len(list(provider.get_all())) == 0 def test_console_port_provider_get_all_configured_only_nonempty(self): - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) provider = ConsolePortProvider(db, configured_only=True) assert len(list(provider.get_all())) == 1 @mock.patch('consutil.lib.SysInfoProvider.list_console_ttys', mock.MagicMock(return_value=["/dev/ttyUSB0", "/dev/ttyUSB1"])) def test_console_port_provider_get_all_with_ttys(self): - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) provider = ConsolePortProvider(db, configured_only=False) ports = list(provider.get_all()) @@ -268,8 +269,8 @@ def test_console_port_provider_get_all_with_ttys(self): assert len(ports) == 2 def test_console_port_provider_get_line_success(self): - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", "1", { "baud_rate" : "9600" }) provider = ConsolePortProvider(db, configured_only=True) port = provider.get("1") @@ -278,13 +279,13 @@ def test_console_port_provider_get_line_success(self): def test_console_port_provider_get_line_not_found(self): with pytest.raises(LineNotFoundError): - db = Db() + db = MultiAsicDb() provider = ConsolePortProvider(db, configured_only=True) provider.get("1") def test_console_port_provider_get_line_by_device_success(self): - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch2" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch2" }) provider = ConsolePortProvider(db, configured_only=True) port = provider.get("switch2", use_device=True) @@ -293,15 +294,15 @@ def test_console_port_provider_get_line_by_device_success(self): def test_console_port_provider_get_line_by_device_not_found(self): with pytest.raises(LineNotFoundError): - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch2" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch2" }) provider = ConsolePortProvider(db, configured_only=True) provider.get("switch1") @mock.patch('consutil.lib.SysInfoProvider.list_active_console_processes', mock.MagicMock(return_value={ "1" : ("223", "2020/11/2")})) def test_console_port_info_refresh_without_session(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1" }) port.refresh() @@ -311,7 +312,7 @@ def test_console_port_info_refresh_without_session(self): @mock.patch('consutil.lib.SysInfoProvider.list_active_console_processes', mock.MagicMock(return_value={ "2" : ("223", "2020/11/2")})) def test_console_port_info_refresh_without_session_idle(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1" }) port.refresh() @@ -319,7 +320,7 @@ def test_console_port_info_refresh_without_session_idle(self): @mock.patch('consutil.lib.SysInfoProvider.get_active_console_process_info', mock.MagicMock(return_value=("1", "223", "2020/11/2"))) def test_console_port_info_refresh_with_session(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1" }) port._session = ConsoleSession(port, mock.MagicMock(pid="223")) @@ -332,7 +333,7 @@ def test_console_port_info_refresh_with_session(self): @mock.patch('consutil.lib.SysInfoProvider.get_active_console_process_info', mock.MagicMock(return_value=("2", "223", "2020/11/2"))) def test_console_port_info_refresh_with_session_line_mismatch(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1" }) port._session = ConsoleSession(port, mock.MagicMock(pid="223")) @@ -345,7 +346,7 @@ def test_console_port_info_refresh_with_session_line_mismatch(self): @mock.patch('consutil.lib.SysInfoProvider.get_active_console_process_info', mock.MagicMock(return_value=None)) def test_console_port_info_refresh_with_session_process_ended(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1" }) port._session = ConsoleSession(port, mock.MagicMock(pid="223")) @@ -355,7 +356,7 @@ def test_console_port_info_refresh_with_session_process_ended(self): assert port.busy == False def test_console_port_info_connect_state_busy(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "CUR_STATE" : { "state" : "busy" } }) port.refresh = mock.MagicMock(return_value=None) @@ -363,7 +364,7 @@ def test_console_port_info_connect_state_busy(self): port.connect() def test_console_port_info_connect_invalid_config(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "CUR_STATE" : { "state" : "idle" } }) port.refresh = mock.MagicMock(return_value=None) @@ -371,7 +372,7 @@ def test_console_port_info_connect_invalid_config(self): port.connect() def test_console_port_info_connect_device_busy(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "baud_rate" : "9600", "CUR_STATE" : { "state" : "idle" } }) port.refresh = mock.MagicMock(return_value=None) @@ -383,7 +384,7 @@ def test_console_port_info_connect_device_busy(self): port.connect() def test_console_port_info_connect_connection_fail(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "baud_rate" : "9600", "CUR_STATE" : { "state" : "idle" } }) port.refresh = mock.MagicMock(return_value=None) @@ -395,7 +396,7 @@ def test_console_port_info_connect_connection_fail(self): port.connect() def test_console_port_info_connect_success(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "baud_rate" : "9600", "CUR_STATE" : { "state" : "idle" } }) port.refresh = mock.MagicMock(return_value=None) @@ -408,7 +409,7 @@ def test_console_port_info_connect_success(self): assert session.port.line_num == "1" def test_console_port_info_clear_session_line_not_busy(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "baud_rate" : "9600", "CUR_STATE" : { "state" : "idle" } }) port.refresh = mock.MagicMock(return_value=None) @@ -416,14 +417,14 @@ def test_console_port_info_clear_session_line_not_busy(self): @mock.patch('consutil.lib.SysInfoProvider.run_command', mock.MagicMock(return_value=None)) def test_console_port_info_clear_session_with_state_db(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "baud_rate" : "9600", "CUR_STATE" : { "state" : "busy", "pid" : "223" } }) port.refresh = mock.MagicMock(return_value=None) assert port.clear_session() def test_console_port_info_clear_session_with_existing_session(self): - db = Db() + db = MultiAsicDb() port = ConsolePortInfo(db, { "LINE" : "1", "baud_rate" : "9600", "CUR_STATE" : { "state" : "busy" } }) port._session = ConsoleSession(port, None) port._session.close = mock.MagicMock(return_value=None) @@ -492,7 +493,7 @@ def setup_class(cls): @mock.patch('consutil.main.show', mock.MagicMock(return_value=None)) def test_consutil_feature_disabled_null_config(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(consutil.consutil, ['show'], obj=db) print(result.exit_code) @@ -504,8 +505,8 @@ def test_consutil_feature_disabled_null_config(self): @mock.patch('consutil.main.show', mock.MagicMock(return_value=None)) def test_consutil_feature_disabled_config(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_SWITCH", "console_mgmt", { "enabled" : "no" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_SWITCH", "console_mgmt", { "enabled" : "no" }) result = runner.invoke(consutil.consutil, ['show'], obj=db) print(result.exit_code) @@ -517,8 +518,8 @@ def test_consutil_feature_disabled_config(self): @mock.patch('consutil.main.show', mock.MagicMock(return_value=None)) def test_consutil_feature_enabled(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_SWITCH", "console_mgmt", { "enabled" : "yes" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_SWITCH", "console_mgmt", { "enabled" : "yes" }) result = runner.invoke(consutil.consutil, ['show'], obj=db) print(result.exit_code) @@ -540,14 +541,14 @@ def setup_class(cls): @mock.patch('consutil.lib.SysInfoProvider.init_device_prefix', mock.MagicMock(return_value=None)) def test_show(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) - db.cfgdb.set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch2", "baud_rate" : "9600" }) - db.cfgdb.set_entry("CONSOLE_PORT", 3, { "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 2, { "remote_device" : "switch2", "baud_rate" : "9600" }) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 3, { "baud_rate" : "9600" }) - db.db.set(db.db.STATE_DB, "CONSOLE_PORT|2", "state", "busy") - db.db.set(db.db.STATE_DB, "CONSOLE_PORT|2", "pid", "223") - db.db.set(db.db.STATE_DB, "CONSOLE_PORT|2", "start_time", "Wed Mar 6 08:31:35 2019") + db.db[constants.DEFAULT_NAMESPACE].set(db.db[constants.DEFAULT_NAMESPACE].STATE_DB, "CONSOLE_PORT|2", "state", "busy") + db.db[constants.DEFAULT_NAMESPACE].set(db.db[constants.DEFAULT_NAMESPACE].STATE_DB, "CONSOLE_PORT|2", "pid", "223") + db.db[constants.DEFAULT_NAMESPACE].set(db.db[constants.DEFAULT_NAMESPACE].STATE_DB, "CONSOLE_PORT|2", "start_time", "Wed Mar 6 08:31:35 2019") # use '--brief' option to avoid access system result = runner.invoke(consutil.consutil.commands["show"], ['--brief'], obj=db) @@ -565,8 +566,8 @@ def setup_class(cls): @mock.patch('consutil.lib.SysInfoProvider.init_device_prefix', mock.MagicMock(return_value=None)) def test_connect_target_nonexists(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) result = runner.invoke(consutil.consutil.commands["connect"], ['2'], obj=db) print(result.exit_code) @@ -585,8 +586,8 @@ def test_connect_target_nonexists(self): @mock.patch('consutil.lib.ConsolePortInfo.connect', mock.MagicMock(side_effect=LineBusyError())) def test_connect_line_busy(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) result = runner.invoke(consutil.consutil.commands["connect"], ['1'], obj=db) print(result.exit_code) @@ -604,7 +605,7 @@ def test_connect_line_busy(self): @mock.patch('consutil.lib.SysInfoProvider.init_device_prefix', mock.MagicMock(return_value=None)) def test_connect_no_baud(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(consutil.consutil.commands["connect"], ['1'], obj=db) print(result.exit_code) @@ -617,7 +618,7 @@ def test_connect_no_baud(self): @mock.patch('consutil.lib.ConsolePortInfo.connect', mock.MagicMock(side_effect=ConnectionFailedError())) def test_connect_picocom_err(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(consutil.consutil.commands["connect"], ['1'], obj=db) print(result.exit_code) @@ -630,8 +631,8 @@ def test_connect_picocom_err(self): @mock.patch('consutil.lib.ConsolePortInfo.connect', mock.MagicMock(return_value=mock.MagicMock(interact=mock.MagicMock(return_value=None)))) def test_connect_success(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) result = runner.invoke(consutil.consutil.commands["connect"], ['1'], obj=db) print(result.exit_code) @@ -649,7 +650,7 @@ def setup_class(cls): @mock.patch('os.geteuid', mock.MagicMock(return_value=1)) def test_clear_without_root(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(consutil.consutil.commands["clear"], ['1'], obj=db) print(result.exit_code) @@ -662,7 +663,7 @@ def test_clear_without_root(self): @mock.patch('os.geteuid', mock.MagicMock(return_value=0)) def test_clear_line_not_found(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(consutil.consutil.commands["clear"], ['2'], obj=db) print(result.exit_code) @@ -676,8 +677,8 @@ def test_clear_line_not_found(self): @mock.patch('consutil.lib.ConsolePortInfo.clear_session', mock.MagicMock(return_value=False)) def test_clear_idle(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) result = runner.invoke(consutil.consutil.commands["clear"], ['1'], obj=db) print(result.exit_code) @@ -691,8 +692,8 @@ def test_clear_idle(self): @mock.patch('consutil.lib.ConsolePortInfo.clear_session', mock.MagicMock(return_value=True)) def test_clear_success(self): runner = CliRunner() - db = Db() - db.cfgdb.set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("CONSOLE_PORT", 1, { "remote_device" : "switch1", "baud_rate" : "9600" }) result = runner.invoke(consutil.consutil.commands["clear"], ['1'], obj=db) print(result.exit_code) diff --git a/tests/crm_test.py b/tests/crm_test.py index 2ddb1b2108..36e43e9633 100644 --- a/tests/crm_test.py +++ b/tests/crm_test.py @@ -1,9 +1,10 @@ +from importlib import reload import os import sys from click.testing import CliRunner import crm.main as crm -from utilities_common.db import Db +from utilities_common.multi_asic import MultiAsicDb # Expected output for CRM @@ -717,7 +718,7 @@ def setup_class(cls): def test_crm_show_summary(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'summary'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -731,7 +732,7 @@ def test_crm_show_summary(self): def test_crm_show_thresholds_acl_group(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'acl', 'group'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -747,7 +748,7 @@ def test_crm_show_thresholds_acl_group(self): def test_crm_show_thresholds_acl_table(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'acl', 'table'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -770,7 +771,7 @@ def test_crm_show_thresholds_all(self): def test_crm_show_thresholds_fdb(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'fdb'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -786,7 +787,7 @@ def test_crm_show_thresholds_fdb(self): def test_crm_show_thresholds_ipv4_neighbor(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv4', 'neighbor'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -802,7 +803,7 @@ def test_crm_show_thresholds_ipv4_neighbor(self): def test_crm_show_thresholds_ipv4_nexthop(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv4', 'nexthop'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -818,7 +819,7 @@ def test_crm_show_thresholds_ipv4_nexthop(self): def test_crm_show_thresholds_ipv4_route(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv4', 'route'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -834,7 +835,7 @@ def test_crm_show_thresholds_ipv4_route(self): def test_crm_show_thresholds_ipv6_neighbor(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv6', 'neighbor'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -850,7 +851,7 @@ def test_crm_show_thresholds_ipv6_neighbor(self): def test_crm_show_thresholds_ipv6_nexthop(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv6', 'nexthop'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -866,7 +867,7 @@ def test_crm_show_thresholds_ipv6_nexthop(self): def test_crm_show_thresholds_ipv6_route(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv6', 'route'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -882,7 +883,7 @@ def test_crm_show_thresholds_ipv6_route(self): def test_crm_show_thresholds_nexthop_group_member(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'nexthop', 'group', 'member'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -898,7 +899,7 @@ def test_crm_show_thresholds_nexthop_group_member(self): def test_crm_show_thresholds_nexthop_group_object(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'nexthop', 'group', 'object'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1009,11 +1010,12 @@ def setup_class(cls): os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "multi_asic" from .mock_tables import dbconnector from .mock_tables import mock_multi_asic + reload(mock_multi_asic) dbconnector.load_namespace_config() def test_crm_show_summary(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'summary'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1027,7 +1029,7 @@ def test_crm_show_summary(self): def test_crm_show_thresholds_acl_group(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'acl', 'group'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1043,7 +1045,7 @@ def test_crm_show_thresholds_acl_group(self): def test_crm_show_thresholds_acl_table(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'acl', 'table'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1066,7 +1068,7 @@ def test_crm_show_thresholds_all(self): def test_crm_show_thresholds_fdb(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'fdb'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1082,7 +1084,7 @@ def test_crm_show_thresholds_fdb(self): def test_crm_show_thresholds_ipv4_neighbor(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv4', 'neighbor'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1098,7 +1100,7 @@ def test_crm_show_thresholds_ipv4_neighbor(self): def test_crm_show_thresholds_ipv4_nexthop(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv4', 'nexthop'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1114,7 +1116,7 @@ def test_crm_show_thresholds_ipv4_nexthop(self): def test_crm_show_thresholds_ipv4_route(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv4', 'route'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1130,7 +1132,7 @@ def test_crm_show_thresholds_ipv4_route(self): def test_crm_show_thresholds_ipv6_neighbor(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv6', 'neighbor'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1146,7 +1148,7 @@ def test_crm_show_thresholds_ipv6_neighbor(self): def test_crm_show_thresholds_ipv6_nexthop(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv6', 'nexthop'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1162,7 +1164,7 @@ def test_crm_show_thresholds_ipv6_nexthop(self): def test_crm_show_thresholds_ipv6_route(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'ipv6', 'route'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1178,7 +1180,7 @@ def test_crm_show_thresholds_ipv6_route(self): def test_crm_show_thresholds_nexthop_group_member(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'nexthop', 'group', 'member'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1194,7 +1196,7 @@ def test_crm_show_thresholds_nexthop_group_member(self): def test_crm_show_thresholds_nexthop_group_object(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(crm.cli, ['show', 'thresholds', 'nexthop', 'group', 'object'], obj=db) print(sys.stderr, result.output) assert result.exit_code == 0 @@ -1298,3 +1300,4 @@ def teardown_class(cls): os.environ["UTILITIES_UNIT_TESTING"] = "0" os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "" from .mock_tables import mock_single_asic + reload(mock_single_asic) diff --git a/tests/feature_test.py b/tests/feature_test.py index c260a4b5f6..1cf0dcc930 100644 --- a/tests/feature_test.py +++ b/tests/feature_test.py @@ -1,6 +1,6 @@ from click.testing import CliRunner - -from utilities_common.db import Db +from importlib import reload +from utilities_common.multi_asic import MultiAsicDb show_feature_status_output="""\ Feature State AutoRestart @@ -76,6 +76,12 @@ --------- -------------- database always_enabled """ +config_feature_bgp_inconsistent_state_output="""\ +Feature 'bgp' state is not consistent across namespaces +""" +config_feature_bgp_inconsistent_autorestart_output="""\ +Feature 'bgp' auto-restart is not consistent across namespaces +""" class TestFeature(object): @classmethod @@ -145,7 +151,7 @@ def test_show_unknown_autorestart_status(self, get_cmd_module): def test_config_bgp_feature_state(self, get_cmd_module): (config, show) = get_cmd_module - db = Db() + db = MultiAsicDb() runner = CliRunner() result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "disabled"], obj=db) print(result.exit_code) @@ -158,7 +164,7 @@ def test_config_bgp_feature_state(self, get_cmd_module): def test_config_bgp_autorestart(self, get_cmd_module): (config, show) = get_cmd_module - db = Db() + db = MultiAsicDb() runner = CliRunner() result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "disabled"], obj=db) print(result.exit_code) @@ -171,7 +177,7 @@ def test_config_bgp_autorestart(self, get_cmd_module): def test_config_database_feature_state(self, get_cmd_module): (config, show) = get_cmd_module - db = Db() + db = MultiAsicDb() runner = CliRunner() result = runner.invoke(config.config.commands["feature"].commands["state"], ["database", "disabled"], obj=db) print(result.exit_code) @@ -190,7 +196,7 @@ def test_config_database_feature_state(self, get_cmd_module): def test_config_database_feature_autorestart(self, get_cmd_module): (config, show) = get_cmd_module - db = Db() + db = MultiAsicDb() runner = CliRunner() result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["database", "disabled"], obj=db) print(result.exit_code) @@ -217,3 +223,101 @@ def test_config_unknown_feature(self, get_cmd_module): @classmethod def teardown_class(cls): print("TEARDOWN") + +class TestFeatureMultiAsic(object): + @classmethod + def setup_class(cls): + print("SETUP") + + def test_config_bgp_feature_inconsistent_state(self, get_cmd_module): + from .mock_tables import dbconnector + from .mock_tables import mock_multi_asic_3_asics + reload(mock_multi_asic_3_asics) + dbconnector.load_namespace_config() + (config, show) = get_cmd_module + db = MultiAsicDb() + runner = CliRunner() + result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "disabled"], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 1 + assert result.output == config_feature_bgp_inconsistent_state_output + result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "enabled"], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 1 + assert result.output == config_feature_bgp_inconsistent_state_output + + def test_config_bgp_feature_inconsistent_autorestart(self, get_cmd_module): + from .mock_tables import dbconnector + from .mock_tables import mock_multi_asic_3_asics + reload(mock_multi_asic_3_asics) + dbconnector.load_namespace_config() + (config, show) = get_cmd_module + db = MultiAsicDb() + runner = CliRunner() + result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "disabled"], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 1 + assert result.output == config_feature_bgp_inconsistent_autorestart_output + result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "enabled"], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 1 + assert result.output == config_feature_bgp_inconsistent_autorestart_output + + def test_config_bgp_feature_consistent_state(self, get_cmd_module): + from .mock_tables import dbconnector + from .mock_tables import mock_multi_asic + reload(mock_multi_asic) + dbconnector.load_namespace_config() + (config, show) = get_cmd_module + db = MultiAsicDb() + runner = CliRunner() + result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "disabled"], obj=db) + print(result.exit_code) + assert result.exit_code == 0 + result = runner.invoke(show.cli.commands["feature"].commands["status"], ["bgp"], obj=db) + print(result.output) + assert result.exit_code == 0 + assert result.output == show_feature_bgp_disabled_status_output + result = runner.invoke(config.config.commands["feature"].commands["state"], ["bgp", "enabled"], obj=db) + print(result.exit_code) + print(result.output) + assert result.exit_code == 0 + result = runner.invoke(show.cli.commands["feature"].commands["status"], ["bgp"], obj=db) + print(result.output) + assert result.exit_code == 0 + assert result.output == show_feature_bgp_status_output + + def test_config_bgp_feature_consistent_autorestart(self, get_cmd_module): + from .mock_tables import dbconnector + from .mock_tables import mock_multi_asic + reload(mock_multi_asic) + dbconnector.load_namespace_config() + (config, show) = get_cmd_module + db = MultiAsicDb() + runner = CliRunner() + result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "disabled"], obj=db) + print(result.exit_code) + assert result.exit_code == 0 + result = runner.invoke(show.cli.commands["feature"].commands["autorestart"], ["bgp"], obj=db) + print(result.output) + print(result.exit_code) + assert result.exit_code == 0 + assert result.output == show_feature_bgp_disabled_autorestart_output + result = runner.invoke(config.config.commands["feature"].commands["autorestart"], ["bgp", "enabled"], obj=db) + print(result.exit_code) + assert result.exit_code == 0 + result = runner.invoke(show.cli.commands["feature"].commands["autorestart"], ["bgp"], obj=db) + print(result.output) + print(result.exit_code) + assert result.exit_code == 0 + assert result.output == show_feature_bgp_autorestart_output + + @classmethod + def teardown_class(cls): + print("TEARDOWN") + from .mock_tables import mock_single_asic + reload(mock_single_asic) diff --git a/tests/fgnhg_test.py b/tests/fgnhg_test.py index bfa08509dd..154b292822 100644 --- a/tests/fgnhg_test.py +++ b/tests/fgnhg_test.py @@ -5,7 +5,6 @@ import config.main as config import show.main as show -from utilities_common.db import Db show_fgnhg_hash_view_output="""\ diff --git a/tests/ip_show_routes_multi_asic_test.py b/tests/ip_show_routes_multi_asic_test.py index c889a65430..384cda4f6b 100644 --- a/tests/ip_show_routes_multi_asic_test.py +++ b/tests/ip_show_routes_multi_asic_test.py @@ -1,4 +1,5 @@ import os +from importlib import reload import pytest @@ -16,6 +17,7 @@ def setup_class(cls): os.environ["UTILITIES_UNIT_TESTING"] = "2" os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "multi_asic" from .mock_tables import mock_multi_asic_3_asics + reload(mock_multi_asic_3_asics) from .mock_tables import dbconnector dbconnector.load_namespace_config() @@ -224,7 +226,5 @@ def teardown_class(cls): os.environ["PATH"] = os.pathsep.join(os.environ["PATH"].split(os.pathsep)[:-1]) os.environ["UTILITIES_UNIT_TESTING"] = "0" os.environ["UTILITIES_UNIT_TESTING_TOPOLOGY"] = "" - import imp - from sonic_py_common import multi_asic - imp.reload(multi_asic) - import mock_tables.dbconnector + from .mock_tables import mock_single_asic + reload(mock_single_asic) diff --git a/tests/kube_test.py b/tests/kube_test.py index 2a39c241d6..b34e560ca0 100644 --- a/tests/kube_test.py +++ b/tests/kube_test.py @@ -1,7 +1,7 @@ import os import sys from click.testing import CliRunner -from utilities_common.db import Db +from utilities_common.multi_asic import MultiAsicDb show_server_output_0="""\ Kubernetes server is not configured @@ -43,7 +43,7 @@ def __check_res(self, result, info, op): def test_kube_server(self, get_cmd_module): (config, show) = get_cmd_module - db = Db() + db = MultiAsicDb() runner = CliRunner() # Check server not configured diff --git a/tests/mock_tables/asic0/config_db.json b/tests/mock_tables/asic0/config_db.json index 51f61e7fc7..826daf4c6e 100644 --- a/tests/mock_tables/asic0/config_db.json +++ b/tests/mock_tables/asic0/config_db.json @@ -162,5 +162,10 @@ }, "PEER_SWITCH|sonic" : { "address_ipv4": "10.2.2.2" + }, + "FEATURE|bgp": { + "state": "enabled", + "auto_restart": "enabled", + "high_mem_alert": "disabled" } } diff --git a/tests/mock_tables/asic1/config_db.json b/tests/mock_tables/asic1/config_db.json index 066732e615..9bd34c08a1 100644 --- a/tests/mock_tables/asic1/config_db.json +++ b/tests/mock_tables/asic1/config_db.json @@ -131,5 +131,10 @@ }, "PEER_SWITCH|sonic" : { "address_ipv4": "10.2.2.2" + }, + "FEATURE|bgp": { + "state": "enabled", + "auto_restart": "enabled", + "high_mem_alert": "disabled" } } diff --git a/tests/mock_tables/asic2/config_db.json b/tests/mock_tables/asic2/config_db.json index be5af80bf4..532d85bcbb 100644 --- a/tests/mock_tables/asic2/config_db.json +++ b/tests/mock_tables/asic2/config_db.json @@ -119,5 +119,10 @@ "PFC_WD|GLOBAL": { "BIG_RED_SWITCH": "enable", "POLL_INTERVAL": "199" + }, + "FEATURE|bgp": { + "state": "disabled", + "auto_restart": "disabled", + "high_mem_alert": "disabled" } } diff --git a/tests/muxcable_test.py b/tests/muxcable_test.py index 7fad557f4a..d3981c5c91 100644 --- a/tests/muxcable_test.py +++ b/tests/muxcable_test.py @@ -5,7 +5,7 @@ import mock_tables.dbconnector from click.testing import CliRunner from unittest import mock -from utilities_common.db import Db +from utilities_common.multi_asic import MultiAsicDb sys.modules['sonic_platform_base'] = mock.Mock() sys.modules['sonic_platform_base.sonic_sfp'] = mock.Mock() @@ -157,7 +157,7 @@ def setup_class(cls): def test_muxcable_status(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(show.cli.commands["muxcable"].commands["status"], obj=db) assert(result.exit_code == 102) @@ -165,7 +165,7 @@ def test_muxcable_status(self): def test_muxcable_status_json(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(show.cli.commands["muxcable"].commands["status"], ["--json"], obj=db) @@ -174,7 +174,7 @@ def test_muxcable_status_json(self): def test_muxcable_status_config(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(show.cli.commands["muxcable"].commands["config"], obj=db) @@ -183,7 +183,7 @@ def test_muxcable_status_config(self): def test_muxcable_status_config_json(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(show.cli.commands["muxcable"].commands["config"], ["--json"], obj=db) @@ -192,7 +192,7 @@ def test_muxcable_status_config_json(self): def test_muxcable_config_json_with_incorrect_port(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(show.cli.commands["muxcable"].commands["config"], ["Ethernet33", "--json"], obj=db) @@ -200,7 +200,7 @@ def test_muxcable_config_json_with_incorrect_port(self): def test_muxcable_status_json_with_correct_port(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 result = runner.invoke(show.cli.commands["muxcable"].commands["status"], ["Ethernet0", "--json"], obj=db) @@ -209,7 +209,7 @@ def test_muxcable_status_json_with_correct_port(self): def test_muxcable_status_json_port_incorrect_index(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 1 result = runner.invoke(show.cli.commands["muxcable"].commands["status"], ["Ethernet0", "--json"], obj=db) @@ -218,13 +218,13 @@ def test_muxcable_status_json_port_incorrect_index(self): def test_muxcable_status_with_patch(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(show.cli.commands["muxcable"], obj=db) def test_muxcable_status_json_with_incorrect_port(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 result = runner.invoke(show.cli.commands["muxcable"].commands["status"], ["Ethernet33", "--json"], obj=db) @@ -233,7 +233,7 @@ def test_muxcable_status_json_with_incorrect_port(self): def test_muxcable_config_with_correct_port(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 result = runner.invoke(show.cli.commands["muxcable"].commands["config"], ["Ethernet0"], obj=db) @@ -242,7 +242,7 @@ def test_muxcable_config_with_correct_port(self): def test_muxcable_config_json_with_correct_port(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 result = runner.invoke(show.cli.commands["muxcable"].commands["config"], ["Ethernet0", "--json"], obj=db) @@ -251,7 +251,7 @@ def test_muxcable_config_json_with_correct_port(self): def test_muxcable_config_json_port_with_incorrect_index(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 1 result = runner.invoke(show.cli.commands["muxcable"].commands["config"], ["Ethernet0", "--json"], obj=db) @@ -260,7 +260,7 @@ def test_muxcable_config_json_port_with_incorrect_index(self): def test_muxcable_config_json_with_incorrect_port_patch(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 result = runner.invoke(show.cli.commands["muxcable"].commands["config"], ["Ethernet33", "--json"], obj=db) @@ -269,7 +269,7 @@ def test_muxcable_config_json_with_incorrect_port_patch(self): def test_muxcable_status_json_port_eth0(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 result = runner.invoke(show.cli.commands["muxcable"].commands["status"], ["Ethernet0"], obj=db) @@ -278,7 +278,7 @@ def test_muxcable_status_json_port_eth0(self): def test_config_muxcable_tabular_port_Ethernet8_active(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 @@ -288,7 +288,7 @@ def test_config_muxcable_tabular_port_Ethernet8_active(self): def test_config_muxcable_tabular_port_Ethernet8_auto(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 @@ -298,7 +298,7 @@ def test_config_muxcable_tabular_port_Ethernet8_auto(self): def test_config_muxcable_mode_auto_json(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["muxcable"].commands["mode"], ["auto", "all", "--json"], obj=db) @@ -307,7 +307,7 @@ def test_config_muxcable_mode_auto_json(self): def test_config_muxcable_mode_active_json(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["muxcable"].commands["mode"], ["active", "all", "--json"], obj=db) f = open("newfile1", "w") @@ -318,7 +318,7 @@ def test_config_muxcable_mode_active_json(self): def test_config_muxcable_json_port_auto_Ethernet0(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 @@ -329,7 +329,7 @@ def test_config_muxcable_json_port_auto_Ethernet0(self): def test_config_muxcable_json_port_active_Ethernet0(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 @@ -340,13 +340,13 @@ def test_config_muxcable_json_port_active_Ethernet0(self): def test_config_muxcable_mode_auto_tabular(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["muxcable"].commands["mode"], ["auto", "all"], obj=db) assert(result.exit_code == 100) def test_config_muxcable_mode_active_tabular(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["muxcable"].commands["mode"], ["active", "all"], obj=db) f = open("newfile", "w") @@ -356,7 +356,7 @@ def test_config_muxcable_mode_active_tabular(self): def test_config_muxcable_tabular_port(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 @@ -366,7 +366,7 @@ def test_config_muxcable_tabular_port(self): def test_config_muxcable_tabular_port_Ethernet4_active(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 @@ -376,7 +376,7 @@ def test_config_muxcable_tabular_port_Ethernet4_active(self): def test_config_muxcable_tabular_port_Ethernet4_auto(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 @@ -386,7 +386,7 @@ def test_config_muxcable_tabular_port_Ethernet4_auto(self): def test_config_muxcable_tabular_port_with_incorrect_index(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 2 @@ -396,7 +396,7 @@ def test_config_muxcable_tabular_port_with_incorrect_index(self): def test_config_muxcable_tabular_port_with_incorrect_port_index(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 7 @@ -407,7 +407,7 @@ def test_config_muxcable_tabular_port_with_incorrect_port_index(self): def test_config_muxcable_tabular_port_with_incorrect_port(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() with mock.patch('sonic_platform_base.sonic_sfp.sfputilhelper') as patched_util: patched_util.SfpUtilHelper.return_value.get_asic_id_for_logical_port.return_value = 0 diff --git a/tests/pfcwd_test.py b/tests/pfcwd_test.py index afbd1d0a74..f2deb80fbf 100644 --- a/tests/pfcwd_test.py +++ b/tests/pfcwd_test.py @@ -3,7 +3,7 @@ import sys from click.testing import CliRunner -from utilities_common.db import Db +from utilities_common.multi_asic import MultiAsicDb from .pfcwd_input.pfcwd_test_vectors import * @@ -48,7 +48,7 @@ def test_pfcwd_show_stats_invalid_queue(self): def executor(self, testcase): import pfcwd.main as pfcwd runner = CliRunner() - db = Db() + db = MultiAsicDb() for input in testcase: exec_cmd = "" @@ -82,7 +82,7 @@ def test_pfcwd_start_ports_valid(self): # pfcwd start --action drop --restoration-time 200 Ethernet0 200 import pfcwd.main as pfcwd runner = CliRunner() - db = Db() + db = MultiAsicDb() # get initial config result = runner.invoke( @@ -116,7 +116,7 @@ def test_pfcwd_start_actions(self): # pfcwd start --action fwd --restoration-time 200 Ethernet0 200 import pfcwd.main as pfcwd runner = CliRunner() - db = Db() + db = MultiAsicDb() # get initial config result = runner.invoke( @@ -190,7 +190,7 @@ def test_pfcwd_start_ports_invalid(self): # pfcwd start --action drop --restoration-time 200 Ethernet0 200 import pfcwd.main as pfcwd runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke( pfcwd.cli.commands["start"], @@ -271,7 +271,7 @@ def test_pfcwd_start_ports_masic_valid(self): # pfcwd start --action forward --restoration-time 200 Ethernet0 200 import pfcwd.main as pfcwd runner = CliRunner() - db = Db() + db = MultiAsicDb() # get initial config result = runner.invoke( pfcwd.cli.commands["show"].commands["config"], @@ -304,7 +304,7 @@ def test_pfcwd_start_actions_masic(self): # pfcwd start --action drop --restoration-time 200 Ethernet0 200 import pfcwd.main as pfcwd runner = CliRunner() - db = Db() + db = MultiAsicDb() # get initial config result = runner.invoke( pfcwd.cli.commands["show"].commands["config"], @@ -377,7 +377,7 @@ def test_pfcwd_start_ports_masic_invalid(self): # --action drop --restoration-time 200 Ethernet0 Ethernet500 200 import pfcwd.main as pfcwd runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke( pfcwd.cli.commands["start"], diff --git a/tests/sflow_test.py b/tests/sflow_test.py index 0e15f1e027..ade345cbb2 100644 --- a/tests/sflow_test.py +++ b/tests/sflow_test.py @@ -4,7 +4,8 @@ from unittest import mock from click.testing import CliRunner -from utilities_common.db import Db +from utilities_common import constants +from utilities_common.multi_asic import MultiAsicDb import show.main as show import config.main as config @@ -47,23 +48,23 @@ def setup_class(cls): def test_show_sflow(self): runner = CliRunner() - result = runner.invoke(show.cli.commands["sflow"], [], obj=Db()) + result = runner.invoke(show.cli.commands["sflow"], [], obj=MultiAsicDb()) print(result.exit_code, result.output) assert result.exit_code == 0 assert result.output == show_sflow_output def test_show_sflow_intf(self): runner = CliRunner() - result = runner.invoke(show.cli.commands["sflow"].commands["interface"], [], obj=Db()) + result = runner.invoke(show.cli.commands["sflow"].commands["interface"], [], obj=MultiAsicDb()) print(result.exit_code, result.output) assert result.exit_code == 0 assert result.output == show_sflow_intf_output def test_config_sflow_disable_enable(self): # config sflow - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} #disable result = runner.invoke(config.config.commands["sflow"].commands["disable"], [], obj=obj) @@ -98,9 +99,9 @@ def test_config_sflow_disable_enable(self): return def test_config_sflow_agent_id(self): - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} # mock netifaces.interface config.netifaces.interfaces = mock.MagicMock(return_value = "Ethernet0") @@ -138,9 +139,9 @@ def test_config_sflow_agent_id(self): return def test_config_sflow_collector(self): - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} # del a collector result = runner.invoke(config.config.commands["sflow"]. @@ -178,9 +179,9 @@ def test_config_sflow_collector(self): return def test_config_sflow_polling_interval(self): - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} # set to 20 result = runner.invoke(config.config.commands["sflow"]. @@ -209,9 +210,9 @@ def test_config_sflow_polling_interval(self): return def test_config_sflow_intf_enable_disable(self): - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} # mock interface_name_is_valid config.interface_name_is_valid = mock.MagicMock(return_value = True) @@ -224,7 +225,7 @@ def test_config_sflow_intf_enable_disable(self): # we can not use 'show sflow interface', becasue 'show sflow interface' # gets data from appDB, we need to fetch data from configDB for verification - sflowSession = db.cfgdb.get_table('SFLOW_SESSION') + sflowSession = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('SFLOW_SESSION') assert sflowSession["Ethernet1"]["admin_state"] == "up" # intf disable @@ -234,15 +235,15 @@ def test_config_sflow_intf_enable_disable(self): assert result.exit_code == 0 # verify in configDb - sflowSession = db.cfgdb.get_table('SFLOW_SESSION') + sflowSession = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('SFLOW_SESSION') assert sflowSession["Ethernet1"]["admin_state"] == "down" return def test_config_sflow_intf_sample_rate(self): - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} # mock interface_name_is_valid config.interface_name_is_valid = mock.MagicMock(return_value = True) @@ -256,15 +257,15 @@ def test_config_sflow_intf_sample_rate(self): # we can not use 'show sflow interface', becasue 'show sflow interface' # gets data from appDB, we need to fetch data from configDB for verification - sflowSession = db.cfgdb.get_table('SFLOW_SESSION') + sflowSession = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('SFLOW_SESSION') assert sflowSession["Ethernet2"]["sample_rate"] == "2500" return def test_config_disable_all_intf(self): - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} # disable all interfaces result = runner.invoke(config.config.commands["sflow"]. @@ -273,13 +274,13 @@ def test_config_disable_all_intf(self): assert result.exit_code == 0 # verify in configDb - sflowSession = db.cfgdb.get_table('SFLOW_SESSION') + sflowSession = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('SFLOW_SESSION') assert sflowSession["all"]["admin_state"] == "down" def test_config_enable_all_intf(self): - db = Db() + db = MultiAsicDb() runner = CliRunner() - obj = {'db':db.cfgdb} + obj = {'db':db.cfgdb[constants.DEFAULT_NAMESPACE]} # enable all interfaces result = runner.invoke(config.config.commands["sflow"].commands["interface"]. commands["enable"], ["all"], obj=obj) @@ -287,7 +288,7 @@ def test_config_enable_all_intf(self): assert result.exit_code == 0 # verify in configDb - sflowSession = db.cfgdb.get_table('SFLOW_SESSION') + sflowSession = db.cfgdb[constants.DEFAULT_NAMESPACE].get_table('SFLOW_SESSION') assert sflowSession["all"]["admin_state"] == "up" @classmethod diff --git a/tests/vlan_test.py b/tests/vlan_test.py index dedcbc7e23..f683d0efee 100644 --- a/tests/vlan_test.py +++ b/tests/vlan_test.py @@ -6,7 +6,8 @@ import config.main as config import show.main as show -from utilities_common.db import Db +from utilities_common import constants +from utilities_common.multi_asic import MultiAsicDb show_vlan_brief_output="""\ +-----------+-----------------+------------+----------------+-----------------------+-------------+ @@ -193,9 +194,9 @@ def test_show_vlan_brief_in_alias_mode(self): def test_show_vlan_brief_explicit_proxy_arp_disable(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() - db.cfgdb.set_entry("VLAN_INTERFACE", "Vlan1000", {"proxy_arp": "disabled"}) + db.cfgdb[constants.DEFAULT_NAMESPACE].set_entry("VLAN_INTERFACE", "Vlan1000", {"proxy_arp": "disabled"}) def test_show_vlan_config(self): runner = CliRunner() @@ -290,7 +291,7 @@ def test_config_vlan_add_nonexist_portchannel_member(self): def test_config_vlan_add_portchannel_member(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["vlan"].commands["member"].commands["add"], \ ["1000", "PortChannel1001", "--untagged"], obj=db) @@ -307,7 +308,7 @@ def test_config_vlan_add_portchannel_member(self): def test_config_vlan_add_rif_portchannel_member(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["vlan"].commands["member"].commands["add"], \ ["1000", "PortChannel0001", "--untagged"], obj=db) @@ -318,7 +319,7 @@ def test_config_vlan_add_rif_portchannel_member(self): def test_config_vlan_del_vlan(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["vlan"].commands["del"], ["1000"], obj=db) print(result.exit_code) @@ -344,7 +345,7 @@ def test_config_vlan_del_nonexist_vlan_member(self): def test_config_add_del_vlan_and_vlan_member(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # add vlan 1001 result = runner.invoke(config.config.commands["vlan"].commands["add"], ["1001"], obj=db) @@ -387,7 +388,7 @@ def test_config_add_del_vlan_and_vlan_member(self): def test_config_add_del_vlan_and_vlan_member_in_alias_mode(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() os.environ['SONIC_CLI_IFACE_MODE'] = "alias" @@ -487,7 +488,7 @@ def test_config_vlan_add_dhcp_relay_with_exist_ip(self): def test_config_vlan_add_del_dhcp_relay_dest(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() # add new relay dest with mock.patch("utilities_common.cli.run_command") as mock_run_command: @@ -548,8 +549,8 @@ def test_config_vlan_remove_dhcp_relay_dest_with_nonexist_vlanid(self): def test_config_vlan_proxy_arp_with_nonexist_vlan_intf_table(self): modes = ["enabled", "disabled"] runner = CliRunner() - db = Db() - db.cfgdb.delete_table("VLAN_INTERFACE") + db = MultiAsicDb() + db.cfgdb[constants.DEFAULT_NAMESPACE].delete_table("VLAN_INTERFACE") for mode in modes: result = runner.invoke(config.config.commands["vlan"].commands["proxy_arp"], ["1000", mode], obj=db) @@ -563,7 +564,7 @@ def test_config_vlan_proxy_arp_with_nonexist_vlan_intf_table(self): def test_config_vlan_proxy_arp_with_nonexist_vlan_intf(self): modes = ["enabled", "disabled"] runner = CliRunner() - db = Db() + db = MultiAsicDb() for mode in modes: result = runner.invoke(config.config.commands["vlan"].commands["proxy_arp"], ["1001", mode], obj=db) @@ -576,7 +577,7 @@ def test_config_vlan_proxy_arp_with_nonexist_vlan_intf(self): def test_config_vlan_proxy_arp_enable(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["vlan"].commands["proxy_arp"], ["1000", "enabled"], obj=db) @@ -584,11 +585,11 @@ def test_config_vlan_proxy_arp_enable(self): print(result.output) assert result.exit_code == 0 - assert db.cfgdb.get_entry("VLAN_INTERFACE", "Vlan1000") == {"proxy_arp": "enabled"} + assert db.cfgdb[constants.DEFAULT_NAMESPACE].get_entry("VLAN_INTERFACE", "Vlan1000") == {"proxy_arp": "enabled"} def test_config_vlan_proxy_arp_disable(self): runner = CliRunner() - db = Db() + db = MultiAsicDb() result = runner.invoke(config.config.commands["vlan"].commands["proxy_arp"], ["2000", "disabled"], obj=db) @@ -596,7 +597,7 @@ def test_config_vlan_proxy_arp_disable(self): print(result.output) assert result.exit_code == 0 - assert db.cfgdb.get_entry("VLAN_INTERFACE", "Vlan2000") == {"proxy_arp": "disabled"} + assert db.cfgdb[constants.DEFAULT_NAMESPACE].get_entry("VLAN_INTERFACE", "Vlan2000") == {"proxy_arp": "disabled"} @classmethod def teardown_class(cls): diff --git a/utilities_common/cli.py b/utilities_common/cli.py index 2379b4a603..19a0b343ca 100644 --- a/utilities_common/cli.py +++ b/utilities_common/cli.py @@ -9,11 +9,12 @@ from natsort import natsorted from sonic_py_common import multi_asic -from utilities_common.db import Db +from utilities_common import constants +from utilities_common.multi_asic import MultiAsicDb VLAN_SUB_INTERFACE_SEPARATOR = '.' -pass_db = click.make_pass_decorator(Db, ensure=True) +pass_multi_asic_db = click.make_pass_decorator(MultiAsicDb, ensure=True) class AbbreviationGroup(click.Group): """This subclass of click.Group supports abbreviated subgroup/subcommand names @@ -120,7 +121,7 @@ def __init__(self, db=None): if db is None: self.port_dict = multi_asic.get_port_table() else: - self.config_db = db.cfgdb + self.config_db = db.cfgdb[constants.DEFAULT_NAMESPACE] self.port_dict = self.config_db.get_table('PORT') self.alias_max_length = 0 diff --git a/utilities_common/db.py b/utilities_common/db.py deleted file mode 100644 index f6b4189190..0000000000 --- a/utilities_common/db.py +++ /dev/null @@ -1,30 +0,0 @@ -from sonic_py_common import multi_asic -from swsssdk import ConfigDBConnector, SonicV2Connector -from utilities_common import constants -from utilities_common.multi_asic import multi_asic_ns_choices - - -class Db(object): - def __init__(self): - self.cfgdb_clients = {} - self.db_clients = {} - self.cfgdb = ConfigDBConnector() - self.cfgdb.connect() - self.db = SonicV2Connector(host="127.0.0.1") - for db_id in self.db.get_db_list(): - self.db.connect(db_id) - - self.cfgdb_clients[constants.DEFAULT_NAMESPACE] = self.cfgdb - self.db_clients[constants.DEFAULT_NAMESPACE] = self.db - - if multi_asic.is_multi_asic(): - self.ns_list = multi_asic_ns_choices() - for ns in self.ns_list: - self.cfgdb_clients[ns] = ( - multi_asic.connect_config_db_for_ns(ns) - ) - self.db_clients[ns] = multi_asic.connect_to_all_dbs_for_ns(ns) - - def get_data(self, table, key): - data = self.cfgdb.get_table(table) - return data[key] if key in data else None diff --git a/utilities_common/multi_asic.py b/utilities_common/multi_asic.py index 51a6a18b65..97259eaa9e 100644 --- a/utilities_common/multi_asic.py +++ b/utilities_common/multi_asic.py @@ -124,13 +124,13 @@ def wrapped_run_on_all_asics(self, *args, **kwargs): for ns in ns_list: self.multi_asic.current_namespace = ns # if object instance already has db connections, use them - if self.multi_asic.db and self.multi_asic.db.cfgdb_clients.get(ns): - self.config_db = self.multi_asic.db.cfgdb_clients[ns] + if self.multi_asic.db and self.multi_asic.db.cfgdb.get(ns): + self.config_db = self.multi_asic.db.cfgdb[ns] else: self.config_db = multi_asic.connect_config_db_for_ns(ns) - if self.multi_asic.db and self.multi_asic.db.db_clients.get(ns): - self.db = self.multi_asic.db.db_clients[ns] + if self.multi_asic.db and self.multi_asic.db.db.get(ns): + self.db = self.multi_asic.db.db[ns] else: self.db = multi_asic.connect_to_all_dbs_for_ns(ns) @@ -148,3 +148,17 @@ def multi_asic_args(parser=None): parser.add_argument('-n', '--namespace', default=None, help='Display interfaces for specific namespace') return parser + +class MultiAsicDb(object): + def __init__(self): + self.db = {} + self.cfgdb = {} + ns_list = { constants.DEFAULT_NAMESPACE } + ns_list.update(multi_asic.get_namespace_list()) + for ns in ns_list: + self.db[ns] = multi_asic.connect_to_all_dbs_for_ns(ns) + self.cfgdb[ns] = multi_asic.connect_config_db_for_ns(ns) + + def get_default_namespace_data(self, table, key): + data = self.cfgdb[constants.DEFAULT_NAMESPACE].get_table(table) + return data[key] if key in data else None