From 4a640d241165709b903db2e7c9adbf4c12a83b63 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 5 Apr 2021 15:36:17 +0000 Subject: [PATCH 1/3] First time config push --- orchagent/port.h | 2 ++ orchagent/portsorch.cpp | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/orchagent/port.h b/orchagent/port.h index 90a813a2bc..09954812fb 100644 --- a/orchagent/port.h +++ b/orchagent/port.h @@ -125,6 +125,8 @@ class Port std::unordered_set m_ingress_acl_tables_uset; std::unordered_set m_egress_acl_tables_uset; + bool m_fec_cfg = false; + bool m_an_cfg = false; }; } diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index fc8f62b867..4caf987dea 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -2354,12 +2354,13 @@ void PortsOrch::doPortTask(Consumer &consumer) } else { - if (an != -1 && an != p.m_autoneg) + if (an != -1 && (!p.m_an_cfg || an != p.m_autoneg)) { if (setPortAutoNeg(p.m_port_id, an)) { SWSS_LOG_NOTICE("Set port %s AutoNeg to %u", alias.c_str(), an); p.m_autoneg = an; + p.m_an_cfg = true; m_portList[alias] = p; // Once AN is changed @@ -2492,7 +2493,7 @@ void PortsOrch::doPortTask(Consumer &consumer) if (fec_mode_map.find(fec_mode) != fec_mode_map.end()) { /* reset fec mode upon mode change */ - if (p.m_fec_mode != fec_mode_map[fec_mode]) + if (!p.m_fec_cfg || p.m_fec_mode != fec_mode_map[fec_mode]) { if (p.m_admin_state_up) { @@ -2506,6 +2507,7 @@ void PortsOrch::doPortTask(Consumer &consumer) p.m_admin_state_up = false; p.m_fec_mode = fec_mode_map[fec_mode]; + p.m_fec_cfg = true; if (setPortFec(p, p.m_fec_mode)) { @@ -2523,6 +2525,7 @@ void PortsOrch::doPortTask(Consumer &consumer) { /* Port is already down, setting fec mode*/ p.m_fec_mode = fec_mode_map[fec_mode]; + p.m_fec_cfg = true; if (setPortFec(p, p.m_fec_mode)) { m_portList[alias] = p; From c6e2acb3ed6fe317b5c77227088000bb48bd53eb Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Mon, 5 Apr 2021 16:12:06 +0000 Subject: [PATCH 2/3] Addressing comments --- orchagent/port.h | 4 ++-- tests/test_port.py | 23 +++++++++++++++++++++++ tests/test_port_an.py | 23 +++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/orchagent/port.h b/orchagent/port.h index 09954812fb..663b5dc720 100644 --- a/orchagent/port.h +++ b/orchagent/port.h @@ -125,8 +125,8 @@ class Port std::unordered_set m_ingress_acl_tables_uset; std::unordered_set m_egress_acl_tables_uset; - bool m_fec_cfg = false; - bool m_an_cfg = false; + bool m_fec_cfg = false; + bool m_an_cfg = false; }; } diff --git a/tests/test_port.py b/tests/test_port.py index 6df8565072..468bf24990 100644 --- a/tests/test_port.py +++ b/tests/test_port.py @@ -70,6 +70,29 @@ def test_PortNotification(self, dvs, testlog): assert oper_status == "up" + def test_PortFecForce(self, dvs, testlog): + db = swsscommon.DBConnector(0, dvs.redis_sock, 0) + adb = swsscommon.DBConnector(1, dvs.redis_sock, 0) + + tbl = swsscommon.Table(db, "PORT_TABLE") + ptbl = swsscommon.ProducerStateTable(db, "PORT_TABLE") + atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") + + # set fec + fvs = swsscommon.FieldValuePairs([("fec","none")]) + ptbl.set("Ethernet0", fvs) + + time.sleep(1) + + # get fec + (status, fvs) = atbl.get(dvs.asicdb.portnamemap["Ethernet0"]) + assert status == True + + assert "SAI_PORT_ATTR_FEC_MODE" in [fv[0] for fv in fvs] + for fv in fvs: + if fv[0] == "SAI_PORT_ATTR_FEC_MODE": + assert fv[1] == "SAI_PORT_FEC_MODE_NONE" + def test_PortFec(self, dvs, testlog): dvs.runcmd("config interface startup Ethernet0") dvs.runcmd("config interface ip add Ethernet0 10.0.0.0/31") diff --git a/tests/test_port_an.py b/tests/test_port_an.py index 16e7e04dba..e6ade7a1ec 100644 --- a/tests/test_port_an.py +++ b/tests/test_port_an.py @@ -6,6 +6,29 @@ class TestPortAutoNeg(object): + def test_PortAutoNegForce(self, dvs, testlog): + + db = swsscommon.DBConnector(0, dvs.redis_sock, 0) + + tbl = swsscommon.ProducerStateTable(db, "PORT_TABLE") + + fvs = swsscommon.FieldValuePairs([("autoneg","0"), ("speed", "1000")]) + + tbl.set("Ethernet0", fvs) + + time.sleep(1) + + adb = swsscommon.DBConnector(1, dvs.redis_sock, 0) + + atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") + (status, fvs) = atbl.get(dvs.asicdb.portnamemap["Ethernet0"]) + assert status == True + + assert "SAI_PORT_ATTR_AUTO_NEG_MODE" in [fv[0] for fv in fvs] + for fv in fvs: + if fv[0] == "SAI_PORT_ATTR_AUTO_NEG_MODE": + assert fv[1] == "false" + def test_PortAutoNegCold(self, dvs, testlog): db = swsscommon.DBConnector(0, dvs.redis_sock, 0) From a171a5391b12bb7dd9173bf64b7cf610b6963151 Mon Sep 17 00:00:00 2001 From: Sudharsan Dhamal Gopalarathnam Date: Tue, 6 Apr 2021 03:58:13 +0000 Subject: [PATCH 3/3] Modifying Unit tests --- tests/test_port.py | 27 +++++++++++++-------------- tests/test_port_an.py | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/tests/test_port.py b/tests/test_port.py index 468bf24990..d5edc74adc 100644 --- a/tests/test_port.py +++ b/tests/test_port.py @@ -72,26 +72,25 @@ def test_PortNotification(self, dvs, testlog): def test_PortFecForce(self, dvs, testlog): db = swsscommon.DBConnector(0, dvs.redis_sock, 0) - adb = swsscommon.DBConnector(1, dvs.redis_sock, 0) + adb = dvs.get_asic_db() - tbl = swsscommon.Table(db, "PORT_TABLE") ptbl = swsscommon.ProducerStateTable(db, "PORT_TABLE") - atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") # set fec fvs = swsscommon.FieldValuePairs([("fec","none")]) ptbl.set("Ethernet0", fvs) - - time.sleep(1) - - # get fec - (status, fvs) = atbl.get(dvs.asicdb.portnamemap["Ethernet0"]) - assert status == True - - assert "SAI_PORT_ATTR_FEC_MODE" in [fv[0] for fv in fvs] - for fv in fvs: - if fv[0] == "SAI_PORT_ATTR_FEC_MODE": - assert fv[1] == "SAI_PORT_FEC_MODE_NONE" + fvs = swsscommon.FieldValuePairs([("fec","rs")]) + ptbl.set("Ethernet4", fvs) + + # validate if fec none is pushed to asic db when set first time + port_oid = adb.port_name_map["Ethernet0"] + expected_fields = {"SAI_PORT_ATTR_FEC_MODE":"SAI_PORT_FEC_MODE_NONE"} + adb.wait_for_field_match("ASIC_STATE:SAI_OBJECT_TYPE_PORT", port_oid, expected_fields) + + # validate if fec rs is pushed to asic db when set first time + port_oid = adb.port_name_map["Ethernet4"] + expected_fields = {"SAI_PORT_ATTR_FEC_MODE":"SAI_PORT_FEC_MODE_RS"} + adb.wait_for_field_match("ASIC_STATE:SAI_OBJECT_TYPE_PORT", port_oid, expected_fields) def test_PortFec(self, dvs, testlog): dvs.runcmd("config interface startup Ethernet0") diff --git a/tests/test_port_an.py b/tests/test_port_an.py index e6ade7a1ec..e1b84be2dc 100644 --- a/tests/test_port_an.py +++ b/tests/test_port_an.py @@ -9,25 +9,25 @@ class TestPortAutoNeg(object): def test_PortAutoNegForce(self, dvs, testlog): db = swsscommon.DBConnector(0, dvs.redis_sock, 0) + adb = dvs.get_asic_db() tbl = swsscommon.ProducerStateTable(db, "PORT_TABLE") - - fvs = swsscommon.FieldValuePairs([("autoneg","0"), ("speed", "1000")]) - + fvs = swsscommon.FieldValuePairs([("autoneg","0")]) tbl.set("Ethernet0", fvs) - time.sleep(1) + tbl = swsscommon.ProducerStateTable(db, "PORT_TABLE") + fvs = swsscommon.FieldValuePairs([("autoneg","1"), ("speed", "1000")]) + tbl.set("Ethernet4", fvs) - adb = swsscommon.DBConnector(1, dvs.redis_sock, 0) + # validate if autoneg false is pushed to asic db when set first time + port_oid = adb.port_name_map["Ethernet0"] + expected_fields = {"SAI_PORT_ATTR_AUTO_NEG_MODE":"false"} + adb.wait_for_field_match("ASIC_STATE:SAI_OBJECT_TYPE_PORT", port_oid, expected_fields) - atbl = swsscommon.Table(adb, "ASIC_STATE:SAI_OBJECT_TYPE_PORT") - (status, fvs) = atbl.get(dvs.asicdb.portnamemap["Ethernet0"]) - assert status == True - - assert "SAI_PORT_ATTR_AUTO_NEG_MODE" in [fv[0] for fv in fvs] - for fv in fvs: - if fv[0] == "SAI_PORT_ATTR_AUTO_NEG_MODE": - assert fv[1] == "false" + # validate if autoneg true is pushed to asic db when set first time + port_oid = adb.port_name_map["Ethernet4"] + expected_fields = {"SAI_PORT_ATTR_AUTO_NEG_MODE":"true"} + adb.wait_for_field_match("ASIC_STATE:SAI_OBJECT_TYPE_PORT", port_oid, expected_fields) def test_PortAutoNegCold(self, dvs, testlog):