Skip to content

Commit aa2590f

Browse files
committed
[tests][twamporch] TWAMP Light orchagent implementation. (sonic-net#2927)
* add TWAMP Light vstest cases Signed-off-by: Xiaodong Hu <[email protected]>
1 parent 277ba28 commit aa2590f

File tree

5 files changed

+433
-0
lines changed

5 files changed

+433
-0
lines changed

tests/conftest.py

+9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from dvslib import dvs_policer
2929
from dvslib import dvs_hash
3030
from dvslib import dvs_switch
31+
from dvslib import dvs_twamp
3132

3233
from buffer_model import enable_dynamic_buffer
3334

@@ -1945,6 +1946,14 @@ def dvs_hash_manager(request, dvs):
19451946
def dvs_switch_manager(request, dvs):
19461947
request.cls.dvs_switch = dvs_switch.DVSSwitch(dvs.get_asic_db())
19471948

1949+
@pytest.fixture(scope="class")
1950+
def dvs_twamp_manager(request, dvs):
1951+
request.cls.dvs_twamp = dvs_twamp.DVSTwamp(dvs.get_asic_db(),
1952+
dvs.get_config_db(),
1953+
dvs.get_state_db(),
1954+
dvs.get_counters_db(),
1955+
dvs.get_app_db())
1956+
19481957
##################### DPB fixtures ###########################################
19491958
def create_dpb_config_file(dvs):
19501959
cmd = "sonic-cfggen -j /etc/sonic/init_cfg.json -j /tmp/ports.json --print-data > /tmp/dpb_config_db.json"

tests/dvslib/dvs_twamp.py

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
"""Utilities for interacting with TWAMP Light objects when writing VS tests."""
2+
3+
class DVSTwamp(object):
4+
def __init__(self, adb, cdb, sdb, cntrdb, appdb):
5+
self.asic_db = adb
6+
self.config_db = cdb
7+
self.state_db = sdb
8+
self.counters_db = cntrdb
9+
self.app_db = appdb
10+
11+
def create_twamp_light_session_sender_packet_count(self, name, sip, sport, dip, dport, packet_count=100, tx_interval=100, timeout=5, stats_interval=None):
12+
twamp_light_entry = {"mode": "LIGHT",
13+
"role": "SENDER",
14+
"src_ip": sip,
15+
"src_udp_port": sport,
16+
"dst_ip": dip,
17+
"dst_udp_port": dport,
18+
"packet_count": packet_count,
19+
"tx_interval": tx_interval,
20+
"timeout": timeout
21+
}
22+
if stats_interval:
23+
twamp_light_entry["statistics_interval"] = str(stats_interval)
24+
else:
25+
twamp_light_entry["statistics_interval"] = str(int(packet_count) * int(tx_interval) + int(timeout)*1000)
26+
self.config_db.create_entry("TWAMP_SESSION", name, twamp_light_entry)
27+
28+
def create_twamp_light_session_sender_continuous(self, name, sip, sport, dip, dport, monitor_time=0, tx_interval=100, timeout=5, stats_interval=None):
29+
twamp_light_entry = {"mode": "LIGHT",
30+
"role": "SENDER",
31+
"src_ip": sip,
32+
"src_udp_port": sport,
33+
"dst_ip": dip,
34+
"dst_udp_port": dport,
35+
"monitor_time": monitor_time,
36+
"tx_interval": tx_interval,
37+
"timeout": timeout
38+
}
39+
if stats_interval:
40+
twamp_light_entry["statistics_interval"] = str(stats_interval)
41+
else:
42+
twamp_light_entry["statistics_interval"] = str(int(monitor_time)*1000)
43+
self.config_db.create_entry("TWAMP_SESSION", name, twamp_light_entry)
44+
45+
def create_twamp_light_session_reflector(self, name, sip, sport, dip, dport):
46+
twamp_light_entry = {"mode": "LIGHT",
47+
"role": "REFLECTOR",
48+
"src_ip": sip,
49+
"src_udp_port": sport,
50+
"dst_ip": dip,
51+
"dst_udp_port": dport
52+
}
53+
self.config_db.create_entry("TWAMP_SESSION", name, twamp_light_entry)
54+
55+
def start_twamp_light_sender(self, name):
56+
twamp_light_entry = {"admin_state": "enabled"}
57+
self.config_db.create_entry("TWAMP_SESSION", name, twamp_light_entry)
58+
59+
def stop_twamp_light_sender(self, name):
60+
twamp_light_entry = {"admin_state": "disabled"}
61+
self.config_db.create_entry("TWAMP_SESSION", name, twamp_light_entry)
62+
63+
def remove_twamp_light_session(self, name):
64+
self.config_db.delete_entry("TWAMP_SESSION", name)
65+
66+
def get_twamp_light_session_status(self, name):
67+
return self.get_twamp_light_session_state(name)["status"]
68+
69+
def get_twamp_light_session_state(self, name):
70+
tbl = swsscommon.Table(self.sdb, "TWAMP_SESSION_TABLE")
71+
(status, fvs) = tbl.get(name)
72+
assert status == True
73+
assert len(fvs) > 0
74+
return { fv[0]: fv[1] for fv in fvs }
75+
76+
def verify_session_status(self, name, status="active", expected=1):
77+
self.state_db.wait_for_n_keys("TWAMP_SESSION_TABLE", expected)
78+
if expected:
79+
self.state_db.wait_for_field_match("TWAMP_SESSION_TABLE", name, {"status": status})
80+
81+
def verify_no_session(self):
82+
self.config_db.wait_for_n_keys("TWAMP_SESSION", 0)
83+
self.state_db.wait_for_n_keys("TWAMP_SESSION_TABLE", 0)
84+
85+
def verify_session_asic_db(self, dvs, name, asic_table=None, expected=1):
86+
session_oids = self.asic_db.wait_for_n_keys("ASIC_STATE:SAI_OBJECT_TYPE_TWAMP_SESSION", expected)
87+
session_oid = session_oids[0]
88+
dvs.asic_db.wait_for_field_match("ASIC_STATE:SAI_OBJECT_TYPE_TWAMP_SESSION", session_oid, asic_table)
89+
90+
def verify_session_counter_db(self, dvs, name, counter_table=None, expected=1, expected_item=1):
91+
fvs = dvs.counters_db.get_entry("COUNTERS_TWAMP_SESSION_NAME_MAP", "")
92+
fvs = dict(fvs)
93+
total_key = self.counters_db.db_connection.keys("COUNTERS:{}".format(fvs[name]))
94+
assert len(total_key) == expected, "TWAMP Light counter entries are not available in counter db"
95+
dvs.counters_db.wait_for_field_match("COUNTERS", fvs[name], counter_table)
96+
item_keys = self.counters_db.db_connection.keys("COUNTERS:{}:INDEX:*".format(fvs[name]))
97+
assert len(item_keys) == expected_item, "TWAMP Light counter entries are not available in counter db"
98+

tests/mock_tests/mock_orchagent_main.h

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "nhgorch.h"
2929
#include "copporch.h"
3030
#include "directory.h"
31+
#include "twamporch.h"
3132

3233
extern int gBatchSize;
3334

@@ -86,3 +87,4 @@ extern sai_mpls_api_t* sai_mpls_api;
8687
extern sai_counter_api_t* sai_counter_api;
8788
extern sai_samplepacket_api_t *sai_samplepacket_api;
8889
extern sai_fdb_api_t* sai_fdb_api;
90+
extern sai_twamp_api_t* sai_twamp_api;

tests/mock_tests/ut_saihelper.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ namespace ut_helper
8989
sai_api_query(SAI_API_MPLS, (void**)&sai_mpls_api);
9090
sai_api_query(SAI_API_COUNTER, (void**)&sai_counter_api);
9191
sai_api_query(SAI_API_FDB, (void**)&sai_fdb_api);
92+
sai_api_query(SAI_API_TWAMP, (void**)&sai_twamp_api);
9293

9394
return SAI_STATUS_SUCCESS;
9495
}
@@ -118,6 +119,7 @@ namespace ut_helper
118119
sai_buffer_api = nullptr;
119120
sai_queue_api = nullptr;
120121
sai_counter_api = nullptr;
122+
sai_twamp_api = nullptr;
121123

122124
return SAI_STATUS_SUCCESS;
123125
}

0 commit comments

Comments
 (0)