Skip to content

Soumyamishra vnet sanity #3838

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 18 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 91 additions & 11 deletions show/vnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,31 +70,53 @@ def name(vnet_name):
"""Show vnet name <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()
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')
Expand All @@ -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

Expand Down Expand Up @@ -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"""
Expand Down
9 changes: 8 additions & 1 deletion tests/vnet_input/config_db.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
}
58 changes: 58 additions & 0 deletions tests/vrf_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
Loading