diff --git a/show/vnet.py b/show/vnet.py index 239e6d2206..450b14c181 100644 --- a/show/vnet.py +++ b/show/vnet.py @@ -70,23 +70,45 @@ def name(vnet_name): """Show vnet name information""" config_db = ConfigDBConnector() config_db.connect() - header = ['vnet name', 'vxlan tunnel', 'vni', 'peer list'] + header = ['vnet name', 'vxlan tunnel', 'vni', 'peer list', 'guid', 'interfaces'] # Fetching data from config_db for VNET vnet_data = config_db.get_entry('VNET', vnet_name) - def tablelize(vnet_key, vnet_data): + if not vnet_data: + click.echo(f"VNET '{vnet_name}' not found!") + return + + # Fetching interfaces bound to this VNET + interfaces = [] + intfs_data = config_db.get_table("INTERFACE") + vlan_intfs_data = config_db.get_table("VLAN_INTERFACE") + + # Check regular interfaces + for intf, data in intfs_data.items(): + if data.get('vnet_name') == vnet_name: + interfaces.append(intf) + + # Check VLAN interfaces + for intf, data in vlan_intfs_data.items(): + if data.get('vnet_name') == vnet_name: + interfaces.append(intf) + + # Function to create tabulated output + def tablelize(vnet_key, vnet_data, interfaces): table = [] - if vnet_data: - r = [] - r.append(vnet_key) - r.append(vnet_data.get('vxlan_tunnel')) - r.append(vnet_data.get('vni')) - r.append(vnet_data.get('peer_list')) - table.append(r) + row = [ + vnet_key, + vnet_data.get('vxlan_tunnel', 'N/A'), + vnet_data.get('vni', 'N/A'), + vnet_data.get('peer_list', 'N/A'), + vnet_data.get('guid', 'N/A'), + ", ".join(interfaces) if interfaces else "No Interfaces" + ] + table.append(row) return table - click.echo(tabulate(tablelize(vnet_name, vnet_data), header)) + click.echo(tabulate(tablelize(vnet_name, vnet_data, interfaces), headers=header)) @vnet.command() @@ -94,7 +116,7 @@ def brief(): """Show vnet brief information""" config_db = ConfigDBConnector() config_db.connect() - header = ['vnet name', 'vxlan tunnel', 'vni', 'peer list'] + header = ['vnet name', 'vxlan tunnel', 'vni', 'peer list', 'guid'] # Fetching data from config_db for VNET vnet_data = config_db.get_table('VNET') @@ -108,6 +130,7 @@ def tablelize(vnet_keys, vnet_data): r.append(vnet_data[k].get('vxlan_tunnel')) r.append(vnet_data[k].get('vni')) r.append(vnet_data[k].get('peer_list')) + r.append(vnet_data[k].get('guid')) table.append(r) return table @@ -147,6 +170,63 @@ def tablelize(vnet_keys, vnet_data, vnet_alias): click.echo(tabulate(tablelize(vnet_keys, vnet_data, vnet_alias), header)) +@vnet.command() +@click.argument('guid', required=True) +def guid(guid): + """Show vnet details using GUID""" + config_db = ConfigDBConnector() + config_db.connect() + + header = ['VNET Name', 'VXLAN Tunnel', 'VNI', 'Peer List', 'GUID', 'Interfaces'] + + # Fetch all VNETs from CONFIG_DB + vnet_table = config_db.get_table('VNET') + + # Find VNET by GUID + vnet_name = None + vnet_data = None + for name, data in vnet_table.items(): + if data.get('guid') == guid: + vnet_name = name + vnet_data = data + break + + if not vnet_name: + click.echo(f"No VNET found with GUID '{guid}'") + return + + # Fetch interfaces bound to this VNET + interfaces = [] + intfs_data = config_db.get_table("INTERFACE") + vlan_intfs_data = config_db.get_table("VLAN_INTERFACE") + + # Check regular interfaces + for intf, data in intfs_data.items(): + if data.get('vnet_name') == vnet_name: + interfaces.append(intf) + + # Check VLAN interfaces + for intf, data in vlan_intfs_data.items(): + if data.get('vnet_name') == vnet_name: + interfaces.append(intf) + + # Function to create tabulated output + def tablelize(vnet_key, vnet_data, interfaces): + table = [] + row = [ + vnet_key, + vnet_data.get('vxlan_tunnel', 'N/A'), + vnet_data.get('vni', 'N/A'), + vnet_data.get('peer_list', 'N/A'), + vnet_data.get('guid', 'N/A'), + ", ".join(interfaces) if interfaces else "No Interfaces" + ] + table.append(row) + return table + + click.echo(tabulate(tablelize(vnet_name, vnet_data, interfaces), headers=header)) + + @vnet.command() def interfaces(): """Show vnet interfaces information""" diff --git a/tests/vnet_input/config_db.json b/tests/vnet_input/config_db.json index 51a75b39c9..0180a61261 100644 --- a/tests/vnet_input/config_db.json +++ b/tests/vnet_input/config_db.json @@ -2,9 +2,16 @@ "VNET|Vnet_2000": { "peer_list": "", "vni": "2000", - "vxlan_tunnel": "tunnel1" + "vxlan_tunnel": "tunnel1", + "guid": "1234-56-7890-1234" }, "VXLAN_TUNNEL|tunnel1": { "src_ip": "10.10.10.10" + }, + "VLAN_INTERFACE|Vlan100": { + "vnet_name": "Vnet_2000" + }, + "INTERFACE|Ethernet4": { + "vnet_name": "Vnet_2000" } } diff --git a/tests/vrf_test.py b/tests/vrf_test.py index a329c36c98..0fbd07661e 100644 --- a/tests/vrf_test.py +++ b/tests/vrf_test.py @@ -11,6 +11,7 @@ DEFAULT_NAMESPACE = '' test_path = os.path.dirname(os.path.abspath(__file__)) mock_db_path = os.path.join(test_path, "vrf_input") +mock_db_path_vnet = os.path.join(test_path, "vnet_input") class TestShowVrf(object): @classmethod @@ -275,3 +276,60 @@ def test_invalid_vrf_name(self): assert result.exit_code != 0 assert ('VrfNameTooLong!!!') not in db.cfgdb.get_table('VRF') assert expected_output in result.output + + +class TestVnet(object): + @classmethod + def setup_class(cls): + os.environ['UTILITIES_UNIT_TESTING'] = "1" + print("SETUP") + + def test_show_vnet_brief(self): + from .mock_tables import dbconnector + jsonfile_config = os.path.join(mock_db_path_vnet, "config_db") + dbconnector.dedicated_dbs['CONFIG_DB'] = jsonfile_config + runner = CliRunner() + + result = runner.invoke(show.cli.commands["vnet"].commands["brief"], []) + print(result.output) + dbconnector.dedicated_dbs = {} + assert result.exit_code == 0 + assert "Vnet_2000" in result.output + assert "1234-56-7890-1234" in result.output + assert "tunnel1" in result.output + + def test_show_vnet_name(self): + from .mock_tables import dbconnector + jsonfile_config = os.path.join(mock_db_path_vnet, "config_db") + dbconnector.dedicated_dbs['CONFIG_DB'] = jsonfile_config + runner = CliRunner() + + result = runner.invoke(show.cli.commands["vnet"].commands["name"], ["Vnet_2000"]) + print(result.output) + dbconnector.dedicated_dbs = {} + assert result.exit_code == 0 + assert "Vnet_2000" in result.output + assert "1234-56-7890-1234" in result.output + assert "Ethernet4" in result.output + assert "Vlan100" in result.output + + def test_show_vnet_guid(self): + from .mock_tables import dbconnector + jsonfile_config = os.path.join(mock_db_path_vnet, "config_db") + dbconnector.dedicated_dbs['CONFIG_DB'] = jsonfile_config + runner = CliRunner() + + result = runner.invoke(show.cli.commands["vnet"].commands["guid"], ["1234-56-7890-1234"]) + print(result.output) + dbconnector.dedicated_dbs = {} + assert result.exit_code == 0 + assert "Vnet_2000" in result.output + assert "1234-56-7890-1234" in result.output + assert "tunnel1" in result.output + assert "Ethernet4" in result.output + assert "Vlan100" in result.output + + @classmethod + def teardown_class(cls): + os.environ['UTILITIES_UNIT_TESTING'] = "0" + print("TEARDOWN")