Skip to content

Commit 4bf28ed

Browse files
authored
Merge pull request sonic-net#649 from lguohan/vstest
[vstest]: various vstest fixes and enhancements
2 parents e8e3ddc + 8620a51 commit 4bf28ed

24 files changed

+277
-197
lines changed

orchagent/dtelorch.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ DTelOrch::DTelOrch(DBConnector *db, vector<string> tableNames, PortsOrch *portOr
4040

4141
attr.id = SAI_DTEL_ATTR_INT_L4_DSCP;
4242

43+
attr.value.aclfield.enable = true;
4344
attr.value.aclfield.data.u8 = 0x11;
4445
attr.value.aclfield.mask.u8 = 0x3f;
4546

@@ -661,6 +662,8 @@ void DTelOrch::doDtelTableTask(Consumer &consumer)
661662
goto dtel_table_continue;
662663
}
663664

665+
attr.value.aclfield.enable = true;
666+
664667
status = sai_dtel_api->set_dtel_attribute(dtelId, &attr);
665668
if (status != SAI_STATUS_SUCCESS)
666669
{

tests/conftest.py

+113-33
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import tarfile
1111
import StringIO
1212
import subprocess
13+
from datetime import datetime
1314
from swsscommon import swsscommon
1415

1516
def ensure_system(cmd):
@@ -20,6 +21,8 @@ def ensure_system(cmd):
2021
def pytest_addoption(parser):
2122
parser.addoption("--dvsname", action="store", default=None,
2223
help="dvs name")
24+
parser.addoption("--keeptb", action="store_true", default=False,
25+
help="keep testbed after test")
2326

2427
class AsicDbValidator(object):
2528
def __init__(self, dvs):
@@ -110,14 +113,14 @@ def __init__(self, ctn_name, pid, i):
110113
ensure_system("nsenter -t %d -n ip link set arp off dev %s" % (pid, self.vifname))
111114
ensure_system("nsenter -t %d -n sysctl -w net.ipv6.conf.%s.disable_ipv6=1" % (pid, self.vifname))
112115

113-
def __del__(self):
116+
def destroy(self):
114117
if self.cleanup:
115118
pids = subprocess.check_output("ip netns pids %s" % (self.nsname), shell=True)
116119
if pids:
117120
for pid in pids.split('\n'):
118121
if len(pid) > 0:
119122
os.system("kill %s" % int(pid))
120-
os.system("ip netns delete %s" % self.nsname)
123+
ensure_system("ip netns delete %s" % self.nsname)
121124

122125
def runcmd(self, cmd):
123126
return os.system("ip netns exec %s %s" % (self.nsname, cmd))
@@ -126,25 +129,28 @@ def runcmd_async(self, cmd):
126129
return subprocess.Popen("ip netns exec %s %s" % (self.nsname, cmd), shell=True)
127130

128131
class DockerVirtualSwitch(object):
129-
def __init__(self, name=None):
130-
self.pnames = ['fpmsyncd',
131-
'intfmgrd',
132-
'intfsyncd',
133-
'neighsyncd',
134-
'orchagent',
135-
'portsyncd',
136-
'redis-server',
137-
'rsyslogd',
138-
'syncd',
139-
'teamsyncd',
140-
'vlanmgrd',
141-
'zebra']
142-
self.mount = "/var/run/redis-vs"
143-
self.redis_sock = self.mount + '/' + "redis.sock"
132+
def __init__(self, name=None, keeptb=False):
133+
self.basicd = ['redis-server',
134+
'rsyslogd']
135+
self.swssd = ['orchagent',
136+
'intfmgrd',
137+
'intfsyncd',
138+
'neighsyncd',
139+
'portsyncd',
140+
'vlanmgrd',
141+
'vrfmgrd',
142+
'portmgrd']
143+
self.syncd = ['syncd']
144+
self.rtd = ['fpmsyncd', 'zebra']
145+
self.teamd = ['teamsyncd', 'teammgrd']
146+
self.alld = self.basicd + self.swssd + self.syncd + self.rtd + self.teamd
144147
self.client = docker.from_env()
145148

146149
self.ctn = None
147-
self.cleanup = True
150+
if keeptb:
151+
self.cleanup = False
152+
else:
153+
self.cleanup = True
148154
if name != None:
149155
# get virtual switch container
150156
for ctn in self.client.containers.list():
@@ -183,6 +189,11 @@ def __init__(self, name=None):
183189
server = VirtualServer(self.ctn_sw.name, self.ctn_sw_pid, i)
184190
self.servers.append(server)
185191

192+
# mount redis to base to unique directory
193+
self.mount = "/var/run/redis-vs/{}".format(self.ctn_sw.name)
194+
os.system("mkdir -p {}".format(self.mount))
195+
self.redis_sock = self.mount + '/' + "redis.sock"
196+
186197
# create virtual switch container
187198
self.ctn = self.client.containers.run('docker-sonic-vs', privileged=True, detach=True,
188199
network_mode="container:%s" % self.ctn_sw.name,
@@ -207,8 +218,9 @@ def destroy(self):
207218
if self.cleanup:
208219
self.ctn.remove(force=True)
209220
self.ctn_sw.remove(force=True)
221+
os.system("rm -rf {}".format(self.mount))
210222
for s in self.servers:
211-
del(s)
223+
s.destroy()
212224

213225
def check_ready(self, timeout=30):
214226
'''check if all processes in the dvs is ready'''
@@ -232,13 +244,17 @@ def check_ready(self, timeout=30):
232244

233245
# check if all processes are running
234246
ready = True
235-
for pname in self.pnames:
247+
for pname in self.alld:
236248
try:
237249
if process_status[pname] != "RUNNING":
238250
ready = False
239251
except KeyError:
240252
ready = False
241253

254+
# check if start.sh exited
255+
if process_status["start.sh"] != "EXITED":
256+
ready = False
257+
242258
if ready == True:
243259
break
244260

@@ -251,6 +267,20 @@ def check_ready(self, timeout=30):
251267
def restart(self):
252268
self.ctn.restart()
253269

270+
# start processes in SWSS
271+
def start_swss(self):
272+
cmd = ""
273+
for pname in self.swssd:
274+
cmd += "supervisorctl start {}; ".format(pname)
275+
self.runcmd(['sh', '-c', cmd])
276+
277+
# stop processes in SWSS
278+
def stop_swss(self):
279+
cmd = ""
280+
for pname in self.swssd:
281+
cmd += "supervisorctl stop {}; ".format(pname)
282+
self.runcmd(['sh', '-c', cmd])
283+
254284
def init_asicdb_validator(self):
255285
self.asicdb = AsicDbValidator(self)
256286

@@ -273,6 +303,57 @@ def copy_file(self, path, filename):
273303
self.ctn.put_archive(path, tarstr.getvalue())
274304
tarstr.close()
275305

306+
def get_logs(self, modname=None):
307+
stream, stat = self.ctn.get_archive("/var/log/")
308+
if modname == None:
309+
log_dir = "log"
310+
else:
311+
log_dir = "log/{}".format(modname)
312+
os.system("rm -rf {}".format(log_dir))
313+
os.system("mkdir -p {}".format(log_dir))
314+
p = subprocess.Popen(["tar", "--no-same-owner", "-C", "./{}".format(log_dir), "-x"], stdin=subprocess.PIPE)
315+
for x in stream:
316+
p.stdin.write(x)
317+
p.stdin.close()
318+
p.wait()
319+
if p.returncode:
320+
raise RuntimeError("Failed to unpack the archive.")
321+
os.system("chmod a+r -R log")
322+
323+
def add_log_marker(self):
324+
marker = "=== start marker {} ===".format(datetime.now().isoformat())
325+
self.ctn.exec_run("logger {}".format(marker))
326+
return marker
327+
328+
def SubscribeAsicDbObject(self, objpfx):
329+
r = redis.Redis(unix_socket_path=self.redis_sock, db=swsscommon.ASIC_DB)
330+
pubsub = r.pubsub()
331+
pubsub.psubscribe("__keyspace@1__:ASIC_STATE:%s*" % objpfx)
332+
return pubsub
333+
334+
def CountSubscribedObjects(self, pubsub, ignore=None, timeout=10):
335+
nadd = 0
336+
ndel = 0
337+
idle = 0
338+
while True and idle < timeout:
339+
message = pubsub.get_message()
340+
if message:
341+
print message
342+
if ignore:
343+
fds = message['channel'].split(':')
344+
if fds[2] in ignore:
345+
continue
346+
if message['data'] == 'hset':
347+
nadd += 1
348+
elif message['data'] == 'del':
349+
ndel += 1
350+
idle = 0
351+
else:
352+
time.sleep(1)
353+
idle += 1
354+
355+
return (nadd, ndel)
356+
276357
def get_map_iface_bridge_port_id(self, asic_db):
277358
port_id_2_iface = self.asicdb.portoidmap
278359
tbl = swsscommon.Table(asic_db, "ASIC_STATE:SAI_OBJECT_TYPE_BRIDGE_PORT")
@@ -481,21 +562,20 @@ def setReadOnlyAttr(self, obj, attr, val):
481562

482563
ntf.send("set_ro", key, fvp)
483564

484-
# start processes in SWSS
485-
def start_swss(self):
486-
self.runcmd(['sh', '-c', 'supervisorctl start orchagent; supervisorctl start portsyncd; supervisorctl start intfsyncd; \
487-
supervisorctl start neighsyncd; supervisorctl start intfmgrd; supervisorctl start vlanmgrd; \
488-
supervisorctl start buffermgrd; supervisorctl start arp_update'])
489-
490-
# stop processes in SWSS
491-
def stop_swss(self):
492-
self.runcmd(['sh', '-c', 'supervisorctl stop orchagent; supervisorctl stop portsyncd; supervisorctl stop intfsyncd; \
493-
supervisorctl stop neighsyncd; supervisorctl stop intfmgrd; supervisorctl stop vlanmgrd; \
494-
supervisorctl stop buffermgrd; supervisorctl stop arp_update'])
495-
496565
@pytest.yield_fixture(scope="module")
497566
def dvs(request):
498567
name = request.config.getoption("--dvsname")
499-
dvs = DockerVirtualSwitch(name)
568+
keeptb = request.config.getoption("--keeptb")
569+
dvs = DockerVirtualSwitch(name, keeptb)
500570
yield dvs
571+
if name == None:
572+
dvs.get_logs(request.module.__name__)
573+
else:
574+
dvs.get_logs()
501575
dvs.destroy()
576+
577+
@pytest.yield_fixture
578+
def testlog(request, dvs):
579+
dvs.runcmd("logger === start test %s ===" % request.node.name)
580+
yield testlog
581+
dvs.runcmd("logger === finish test %s ===" % request.node.name)

0 commit comments

Comments
 (0)