Skip to content

Commit

Permalink
[port2alias]: Fix to get right number of return values (sonic-net#1906)
Browse files Browse the repository at this point in the history
What I did
get_port_config was modified to return different set number of arguments in PR: sonic-net/sonic-buildimage#4222. Changes in this PR is:

To address the different set of return values
To get the ports from all namespaces
To add unit-test
How I did it
Modify port2alias to read ports from all namespaces and also add unit-test

How to verify it
Test on single and multi-asic platforms.
unit-test passed.
  • Loading branch information
SuvarnaMeenakshi committed Dec 6, 2021
1 parent 3fa0854 commit 3714f63
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 19 deletions.
19 changes: 18 additions & 1 deletion scripts/port2alias
Original file line number Diff line number Diff line change
@@ -1,11 +1,25 @@
#!/usr/bin/env python3

import sys
import os
from io import StringIO

from portconfig import get_port_config
from sonic_py_common import device_info
from sonic_py_common import multi_asic

# mock the redis for unit test purposes #
try:
if os.environ["UTILITIES_UNIT_TESTING"] == "2":
modules_path = os.path.join(os.path.dirname(__file__), "..")
test_path = os.path.join(modules_path, "tests")
sys.path.insert(0, modules_path)
sys.path.insert(0, test_path)
import mock_tables.dbconnector
import mock_tables.mock_multi_asic
mock_tables.dbconnector.load_namespace_config()
except KeyError:
pass

def translate_line(line, ports):
allowed_symbols = ['-', '_']
Expand Down Expand Up @@ -35,7 +49,10 @@ def translate_line(line, ports):

def main():
(platform, hwsku) = device_info.get_platform_and_hwsku()
(ports, _) = get_port_config(hwsku, platform)
ports = {}
for ns in multi_asic.get_namespace_list():
(ports_ns, _, _) = get_port_config(hwsku=hwsku, platform=platform, asic_name=ns)
ports.update(ports_ns)
for line in sys.stdin:
sys.stdout.write(translate_line(line, ports))

Expand Down
73 changes: 55 additions & 18 deletions tests/port2alias_test.py
Original file line number Diff line number Diff line change
@@ -1,44 +1,81 @@
import os
import sys
from unittest import TestCase
from unittest import mock
from mock import patch
from io import StringIO
import tests.mock_tables.dbconnector
import importlib

from utilities_common.general import load_module_from_source

# Load the file under test
port2alias_path = os.path.join(os.path.dirname(__file__), '..', 'scripts', 'port2alias')
port2alias = load_module_from_source('port2alias', port2alias_path)


class TestPort2Alias(TestCase):
def setUp(self):
self.port2alias = load_module_from_source('port2alias', port2alias_path)
self.ports = {
"Ethernet1": {"alias" : "fortyG0/1"},
"Ethernet2": {"alias" : "fortyG0/2"},
"Ethernet10": {"alias" : "fortyG0/10"},
"Ethernet_11": {"alias" : "fortyG0/11"},
}

@mock.patch('sys.stdout.write')
def test_main(self, mock_stdout):
with patch('sys.stdin', StringIO("Ethernet0")):
self.port2alias.main()
mock_stdout.assert_called_with("etp1")

def test_translate_line_single_word(self):
self.assertEqual(port2alias.translate_line("1", self.ports),"1")
self.assertEqual(port2alias.translate_line("1\n", self.ports),"1\n")
self.assertEqual(port2alias.translate_line("Ethernet1", self.ports),"fortyG0/1")
self.assertEqual(port2alias.translate_line("Ethernet1\n", self.ports),"fortyG0/1\n")
self.assertEqual(port2alias.translate_line("Ethernet2\n", self.ports),"fortyG0/2\n")
self.assertEqual(port2alias.translate_line("Ethernet10\n", self.ports),"fortyG0/10\n")
self.assertEqual(port2alias.translate_line("Ethernet20\n", self.ports),"Ethernet20\n")
self.assertEqual(self.port2alias.translate_line("1", self.ports),"1")
self.assertEqual(self.port2alias.translate_line("1\n", self.ports),"1\n")
self.assertEqual(self.port2alias.translate_line("Ethernet1", self.ports),"fortyG0/1")
self.assertEqual(self.port2alias.translate_line("Ethernet1\n", self.ports),"fortyG0/1\n")
self.assertEqual(self.port2alias.translate_line("Ethernet2\n", self.ports),"fortyG0/2\n")
self.assertEqual(self.port2alias.translate_line("Ethernet10\n", self.ports),"fortyG0/10\n")
self.assertEqual(self.port2alias.translate_line("Ethernet20\n", self.ports),"Ethernet20\n")

def test_translate_line_with_symbol(self):
self.assertEqual(port2alias.translate_line("Ethernet_11\n", self.ports),"fortyG0/11\n")
self.assertEqual(port2alias.translate_line("Ethernet1_1\n", self.ports),"Ethernet1_1\n")
self.assertEqual(port2alias.translate_line("Ethernet1-1\n", self.ports),"Ethernet1-1\n")
self.assertEqual(port2alias.translate_line("Ethernet1/1\n", self.ports),"fortyG0/1/1\n")
self.assertEqual(port2alias.translate_line("Ethernet1:1\n", self.ports),"fortyG0/1:1\n")
self.assertEqual(port2alias.translate_line("Ethernet1 U\n", self.ports),"fortyG0/1 U\n")
self.assertEqual(self.port2alias.translate_line("Ethernet_11\n", self.ports),"fortyG0/11\n")
self.assertEqual(self.port2alias.translate_line("Ethernet1_1\n", self.ports),"Ethernet1_1\n")
self.assertEqual(self.port2alias.translate_line("Ethernet1-1\n", self.ports),"Ethernet1-1\n")
self.assertEqual(self.port2alias.translate_line("Ethernet1/1\n", self.ports),"fortyG0/1/1\n")
self.assertEqual(self.port2alias.translate_line("Ethernet1:1\n", self.ports),"fortyG0/1:1\n")
self.assertEqual(self.port2alias.translate_line("Ethernet1 U\n", self.ports),"fortyG0/1 U\n")

def test_translate_line_multiple_words(self):
self.assertEqual(port2alias.translate_line(" Ethernet1 Ethernet2 \n", self.ports)," fortyG0/1 fortyG0/2 \n")
self.assertEqual(port2alias.translate_line("Ethernet1,Ethernet1,Ethernet1,Ethernet1\n", self.ports),"fortyG0/1,fortyG0/1,fortyG0/1,fortyG0/1\n")
self.assertEqual(self.port2alias.translate_line(" Ethernet1 Ethernet2 \n", self.ports)," fortyG0/1 fortyG0/2 \n")
self.assertEqual(self.port2alias.translate_line("Ethernet1,Ethernet1,Ethernet1,Ethernet1\n", self.ports),"fortyG0/1,fortyG0/1,fortyG0/1,fortyG0/1\n")

def test_translate_line_empty_ports(self):
self.assertEqual(port2alias.translate_line("Ethernet1\n", {}),"Ethernet1\n")
self.assertEqual(self.port2alias.translate_line("Ethernet1\n", {}),"Ethernet1\n")

class TestPort2AliasNamespace(TestCase):
@classmethod
def setup_class(cls):
os.environ['UTILITIES_UNIT_TESTING'] = "2"
from .mock_tables import dbconnector
from .mock_tables import mock_multi_asic
importlib.reload(mock_multi_asic)
dbconnector.load_namespace_config()

def setUp(self):
self.port2alias = load_module_from_source('port2alias', port2alias_path)

@mock.patch('sys.stdout.write')
def test_main(self, mock_stdout):
with patch('sys.stdin', StringIO("Ethernet0")):
self.port2alias.main()
mock_stdout.assert_called_with("Ethernet1/1")

@classmethod
def teardown_class(cls):
print("TEARDOWN")
os.environ['UTILITIES_UNIT_TESTING'] = "0"
# change back to single asic config
from .mock_tables import dbconnector
from .mock_tables import mock_single_asic
importlib.reload(mock_single_asic)
dbconnector.load_namespace_config()

0 comments on commit 3714f63

Please sign in to comment.