Merge pull request #13734 from LabNConsulting/chopps/removeunused

remove mentions of socat
This commit is contained in:
Jafar Al-Gharaibeh 2023-06-08 23:46:45 -05:00 committed by GitHub
commit e48e92e76c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 3 additions and 372 deletions

View File

@ -46,12 +46,6 @@ Installing Topotest Requirements
# To enable the gRPC topotest install: # To enable the gRPC topotest install:
python3 -m pip install grpcio grpcio-tools python3 -m pip install grpcio grpcio-tools
# Install Socat tool to run PIMv6 tests,
# Socat code can be taken from below url,
# which has latest changes done for PIMv6,
# join and traffic:
https://github.com/opensourcerouting/socat/
Enable Coredumps Enable Coredumps
"""""""""""""""" """"""""""""""""

View File

@ -5,6 +5,7 @@
# ("NetDEF") in this file. # ("NetDEF") in this file.
# #
import functools
import ipaddress import ipaddress
import json import json
import os import os
@ -13,7 +14,6 @@ import socket
import subprocess import subprocess
import sys import sys
import traceback import traceback
import functools
from collections import OrderedDict from collections import OrderedDict
from copy import deepcopy from copy import deepcopy
from datetime import datetime, timedelta from datetime import datetime, timedelta
@ -32,9 +32,10 @@ from lib.micronet import comm_error
from lib.topogen import TopoRouter, get_topogen from lib.topogen import TopoRouter, get_topogen
from lib.topolog import get_logger, logger from lib.topolog import get_logger, logger
from lib.topotest import frr_unicode, interface_set_status, version_cmp from lib.topotest import frr_unicode, interface_set_status, version_cmp
from lib import topotest
from munet.testing.util import pause_test from munet.testing.util import pause_test
from lib import topotest
FRRCFG_FILE = "frr_json.conf" FRRCFG_FILE = "frr_json.conf"
FRRCFG_BKUP_FILE = "frr_json_initial.conf" FRRCFG_BKUP_FILE = "frr_json_initial.conf"
@ -1258,143 +1259,6 @@ def add_interfaces_to_vlan(tgen, input_dict):
logger.debug("result %s", result) logger.debug("result %s", result)
def tcpdump_capture_start(
tgen,
router,
intf,
protocol=None,
grepstr=None,
timeout=0,
options=None,
cap_file=None,
background=True,
):
"""
API to capture network packets using tcp dump.
Packages used :
Parameters
----------
* `tgen`: topogen object.
* `router`: router on which ping has to be performed.
* `intf` : interface for capture.
* `protocol` : protocol for which packet needs to be captured.
* `grepstr` : string to filter out tcp dump output.
* `timeout` : Time for which packet needs to be captured.
* `options` : options for TCP dump, all tcpdump options can be used.
* `cap_file` : filename to store capture dump.
* `background` : Make tcp dump run in back ground.
Usage
-----
tcpdump_result = tcpdump_dut(tgen, 'r2', intf, protocol='tcp', timeout=20,
options='-A -vv -x > r2bgp.txt ')
Returns
-------
1) True for successful capture
2) errormsg - when tcp dump fails
"""
logger.debug("Entering lib API: {}".format(sys._getframe().f_code.co_name))
rnode = tgen.gears[router]
if timeout > 0:
cmd = "timeout {}".format(timeout)
else:
cmd = ""
cmdargs = "{} tcpdump".format(cmd)
if intf:
cmdargs += " -i {}".format(str(intf))
if protocol:
cmdargs += " {}".format(str(protocol))
if options:
cmdargs += " -s 0 {}".format(str(options))
if cap_file:
file_name = os.path.join(tgen.logdir, router, cap_file)
cmdargs += " -w {}".format(str(file_name))
# Remove existing capture file
rnode.run("rm -rf {}".format(file_name))
if grepstr:
cmdargs += ' | grep "{}"'.format(str(grepstr))
logger.info("Running tcpdump command: [%s]", cmdargs)
if not background:
rnode.run(cmdargs)
else:
# XXX this & is bogus doesn't work
# rnode.run("nohup {} & /dev/null 2>&1".format(cmdargs))
rnode.run("nohup {} > /dev/null 2>&1".format(cmdargs))
# Check if tcpdump process is running
if background:
result = rnode.run("pgrep tcpdump")
logger.debug("ps -ef | grep tcpdump \n {}".format(result))
if not result:
errormsg = "tcpdump is not running {}".format("tcpdump")
return errormsg
else:
logger.info("Packet capture started on %s: interface %s", router, intf)
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
return True
def tcpdump_capture_stop(tgen, router):
"""
API to capture network packets using tcp dump.
Packages used :
Parameters
----------
* `tgen`: topogen object.
* `router`: router on which ping has to be performed.
* `intf` : interface for capture.
* `protocol` : protocol for which packet needs to be captured.
* `grepstr` : string to filter out tcp dump output.
* `timeout` : Time for which packet needs to be captured.
* `options` : options for TCP dump, all tcpdump options can be used.
* `cap2file` : filename to store capture dump.
* `bakgrnd` : Make tcp dump run in back ground.
Usage
-----
tcpdump_result = tcpdump_dut(tgen, 'r2', intf, protocol='tcp', timeout=20,
options='-A -vv -x > r2bgp.txt ')
Returns
-------
1) True for successful capture
2) errormsg - when tcp dump fails
"""
logger.debug("Entering lib API: {}".format(sys._getframe().f_code.co_name))
rnode = tgen.gears[router]
# Check if tcpdump process is running
result = rnode.run("ps -ef | grep tcpdump")
logger.debug("ps -ef | grep tcpdump \n {}".format(result))
if not re_search(r"{}".format("tcpdump"), result):
errormsg = "tcpdump is not running {}".format("tcpdump")
return errormsg
else:
# XXX this doesn't work with micronet
ppid = tgen.net.nameToNode[rnode.name].pid
rnode.run("set +m; pkill -P %s tcpdump &> /dev/null" % ppid)
logger.info("Stopped tcpdump capture")
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
return True
def create_debug_log_config(tgen, input_dict, build=False): def create_debug_log_config(tgen, input_dict, build=False):
""" """
Enable/disable debug logs for any protocol with defined debug Enable/disable debug logs for any protocol with defined debug
@ -3292,233 +3156,6 @@ def configure_interface_mac(tgen, input_dict):
return True return True
def socat_send_mld_join(
tgen,
server,
protocol_option,
mld_groups,
send_from_intf,
send_from_intf_ip=None,
port=12345,
reuseaddr=True,
):
"""
API to send MLD join using SOCAT tool
Parameters:
-----------
* `tgen` : Topogen object
* `server`: iperf server, from where IGMP join would be sent
* `protocol_option`: Protocol options, ex: UDP6-RECV
* `mld_groups`: IGMP group for which join has to be sent
* `send_from_intf`: Interface from which join would be sent
* `send_from_intf_ip`: Interface IP, default is None
* `port`: Port to be used, default is 12345
* `reuseaddr`: True|False, bydefault True
returns:
--------
errormsg or True
"""
logger.debug("Entering lib API: {}".format(sys._getframe().f_code.co_name))
rnode = tgen.routers()[server]
socat_args = "socat -u "
# UDP4/TCP4/UDP6/UDP6-RECV/UDP6-SEND
if protocol_option:
socat_args += "{}".format(protocol_option)
if port:
socat_args += ":{},".format(port)
if reuseaddr:
socat_args += "{},".format("reuseaddr")
# Group address range to cover
if mld_groups:
if not isinstance(mld_groups, list):
mld_groups = [mld_groups]
for mld_group in mld_groups:
socat_cmd = socat_args
join_option = "ipv6-join-group"
if send_from_intf and not send_from_intf_ip:
socat_cmd += "{}='[{}]:{}'".format(join_option, mld_group, send_from_intf)
else:
socat_cmd += "{}='[{}]:{}:[{}]'".format(
join_option, mld_group, send_from_intf, send_from_intf_ip
)
socat_cmd += " STDOUT"
socat_cmd += " &>{}/socat.logs &".format(tgen.logdir)
# Run socat command to send IGMP join
logger.info("[DUT: {}]: Running command: [{}]".format(server, socat_cmd))
output = rnode.run("set +m; {} echo $!".format(socat_cmd))
# Check if socat join process is running
if output:
pid = output.split()[0]
rnode.run("touch /var/run/frr/socat_join.pid")
rnode.run("echo %s >> /var/run/frr/socat_join.pid" % pid)
else:
errormsg = "Socat join is not sent for {}. Error {}".format(
mld_group, output
)
logger.error(output)
return errormsg
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
return True
def socat_send_pim6_traffic(
tgen,
server,
protocol_option,
mld_groups,
send_from_intf,
port=12345,
multicast_hops=True,
):
"""
API to send pim6 data taffic using SOCAT tool
Parameters:
-----------
* `tgen` : Topogen object
* `server`: iperf server, from where IGMP join would be sent
* `protocol_option`: Protocol options, ex: UDP6-RECV
* `mld_groups`: MLD group for which join has to be sent
* `send_from_intf`: Interface from which join would be sent
* `port`: Port to be used, default is 12345
* `multicast_hops`: multicast-hops count, default is 255
returns:
--------
errormsg or True
"""
logger.debug("Entering lib API: {}".format(sys._getframe().f_code.co_name))
rnode = tgen.routers()[server]
socat_args = "socat -u STDIO "
# UDP4/TCP4/UDP6/UDP6-RECV/UDP6-SEND
if protocol_option:
socat_args += "'{}".format(protocol_option)
# Group address range to cover
if mld_groups:
if not isinstance(mld_groups, list):
mld_groups = [mld_groups]
for mld_group in mld_groups:
socat_cmd = socat_args
if port:
socat_cmd += ":[{}]:{},".format(mld_group, port)
if send_from_intf:
socat_cmd += "interface={0},so-bindtodevice={0},".format(send_from_intf)
if multicast_hops:
socat_cmd += "multicast-hops=255'"
socat_cmd += " >{}/socat.logs &".format(tgen.logdir)
# Run socat command to send pim6 traffic
logger.info(
"[DUT: {}]: Running command: [set +m; ( while sleep 1; do date; done ) | {}]".format(
server, socat_cmd
)
)
# Open a shell script file and write data to it, which will be
# used to send pim6 traffic continously
traffic_shell_script = "{}/{}/traffic.sh".format(tgen.logdir, server)
with open("{}".format(traffic_shell_script), "w") as taffic_sh:
taffic_sh.write(
"#!/usr/bin/env bash\n( while sleep 1; do date; done ) | {}\n".format(
socat_cmd
)
)
rnode.run("chmod 755 {}".format(traffic_shell_script))
output = rnode.run("{} &>/dev/null & echo $!".format(traffic_shell_script))
# Check if socat traffic process is running
if output:
pid = output.split()[0]
rnode.run("touch /var/run/frr/socat_traffic.pid")
rnode.run("echo %s >> /var/run/frr/socat_traffic.pid" % pid)
else:
errormsg = "Socat traffic is not sent for {}. Error {}".format(
mld_group, output
)
logger.error(output)
return errormsg
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
return True
def kill_socat(tgen, dut=None, action=None):
"""
Killing socat process if running for any router in topology
Parameters:
-----------
* `tgen` : Topogen object
* `dut` : Any iperf hostname to send igmp prune
* `action`: to kill mld join using socat
to kill mld traffic using socat
Usage:
------
kill_socat(tgen, dut ="i6", action="remove_mld_join")
"""
logger.debug("Entering lib API: {}".format(sys._getframe().f_code.co_name))
router_list = tgen.routers()
for router, rnode in router_list.items():
if dut is not None and router != dut:
continue
traffic_shell_script = "{}/{}/traffic.sh".format(tgen.logdir, router)
pid_socat_join = rnode.run("cat /var/run/frr/socat_join.pid")
pid_socat_traffic = rnode.run("cat /var/run/frr/socat_traffic.pid")
if action == "remove_mld_join":
pids = pid_socat_join
elif action == "remove_mld_traffic":
pids = pid_socat_traffic
else:
pids = "\n".join([pid_socat_join, pid_socat_traffic])
if os.path.exists(traffic_shell_script):
cmd = (
"ps -ef | grep %s | awk -F' ' '{print $2}' | xargs kill -9"
% traffic_shell_script
)
logger.debug("[DUT: {}]: Running command: [{}]".format(router, cmd))
rnode.run(cmd)
for pid in pids.split("\n"):
pid = pid.strip()
if pid.isdigit():
cmd = "set +m; kill -9 %s &> /dev/null" % pid
logger.debug("[DUT: {}]: Running command: [{}]".format(router, cmd))
rnode.run(cmd)
logger.debug("Exiting lib API: {}".format(sys._getframe().f_code.co_name))
############################################# #############################################
# Verification APIs # Verification APIs
############################################# #############################################