mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-09 11:18:52 +00:00
tests: [PIMv6] F/W support for multicast pimv6 automation
Enhanced or added new libraries to support multicast pimv6 automation Signed-off-by: Kuldeep Kashyap <kashyapk@vmware.com>
This commit is contained in:
parent
47f3d0905b
commit
d7032129b0
@ -3244,33 +3244,29 @@ def configure_interface_mac(tgen, input_dict):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def socat_send_igmp_join_traffic(
|
def socat_send_mld_join(
|
||||||
tgen,
|
tgen,
|
||||||
server,
|
server,
|
||||||
protocol_option,
|
protocol_option,
|
||||||
igmp_groups,
|
mld_groups,
|
||||||
send_from_intf,
|
send_from_intf,
|
||||||
send_from_intf_ip=None,
|
send_from_intf_ip=None,
|
||||||
port=12345,
|
port=12345,
|
||||||
reuseaddr=True,
|
reuseaddr=True,
|
||||||
join=False,
|
|
||||||
traffic=False,
|
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
API to send IGMP join using SOCAT tool
|
API to send MLD join using SOCAT tool
|
||||||
|
|
||||||
Parameters:
|
Parameters:
|
||||||
-----------
|
-----------
|
||||||
* `tgen` : Topogen object
|
* `tgen` : Topogen object
|
||||||
* `server`: iperf server, from where IGMP join would be sent
|
* `server`: iperf server, from where IGMP join would be sent
|
||||||
* `protocol_option`: Protocol options, ex: UDP6-RECV
|
* `protocol_option`: Protocol options, ex: UDP6-RECV
|
||||||
* `igmp_groups`: IGMP group for which join has to be sent
|
* `mld_groups`: IGMP group for which join has to be sent
|
||||||
* `send_from_intf`: Interface from which join would be sent
|
* `send_from_intf`: Interface from which join would be sent
|
||||||
* `send_from_intf_ip`: Interface IP, default is None
|
* `send_from_intf_ip`: Interface IP, default is None
|
||||||
* `port`: Port to be used, default is 12345
|
* `port`: Port to be used, default is 12345
|
||||||
* `reuseaddr`: True|False, bydefault True
|
* `reuseaddr`: True|False, bydefault True
|
||||||
* `join`: If join needs to be sent
|
|
||||||
* `traffic`: If traffic needs to be sent
|
|
||||||
|
|
||||||
returns:
|
returns:
|
||||||
--------
|
--------
|
||||||
@ -3280,36 +3276,32 @@ def socat_send_igmp_join_traffic(
|
|||||||
logger.debug("Entering lib API: {}".format(sys._getframe().f_code.co_name))
|
logger.debug("Entering lib API: {}".format(sys._getframe().f_code.co_name))
|
||||||
|
|
||||||
rnode = tgen.routers()[server]
|
rnode = tgen.routers()[server]
|
||||||
socat_cmd = "socat -u "
|
socat_args = "socat -u "
|
||||||
|
|
||||||
# UDP4/TCP4/UDP6/UDP6-RECV
|
# UDP4/TCP4/UDP6/UDP6-RECV/UDP6-SEND
|
||||||
if protocol_option:
|
if protocol_option:
|
||||||
socat_cmd += "{}".format(protocol_option)
|
socat_args += "{}".format(protocol_option)
|
||||||
|
|
||||||
if port:
|
if port:
|
||||||
socat_cmd += ":{},".format(port)
|
socat_args += ":{},".format(port)
|
||||||
|
|
||||||
if reuseaddr:
|
if reuseaddr:
|
||||||
socat_cmd += "{},".format("reuseaddr")
|
socat_args += "{},".format("reuseaddr")
|
||||||
|
|
||||||
# Group address range to cover
|
# Group address range to cover
|
||||||
if igmp_groups:
|
if mld_groups:
|
||||||
if not isinstance(igmp_groups, list):
|
if not isinstance(mld_groups, list):
|
||||||
igmp_groups = [igmp_groups]
|
mld_groups = [mld_groups]
|
||||||
|
|
||||||
for igmp_group in igmp_groups:
|
for mld_group in mld_groups:
|
||||||
if join:
|
socat_cmd = socat_args
|
||||||
join_traffic_option = "ipv6-join-group"
|
join_option = "ipv6-join-group"
|
||||||
elif traffic:
|
|
||||||
join_traffic_option = "ipv6-join-group-source"
|
|
||||||
|
|
||||||
if send_from_intf and not send_from_intf_ip:
|
if send_from_intf and not send_from_intf_ip:
|
||||||
socat_cmd += "{}='[{}]:{}'".format(
|
socat_cmd += "{}='[{}]:{}'".format(join_option, mld_group, send_from_intf)
|
||||||
join_traffic_option, igmp_group, send_from_intf
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
socat_cmd += "{}='[{}]:{}:[{}]'".format(
|
socat_cmd += "{}='[{}]:{}:[{}]'".format(
|
||||||
join_traffic_option, igmp_group, send_from_intf, send_from_intf_ip
|
join_option, mld_group, send_from_intf, send_from_intf_ip
|
||||||
)
|
)
|
||||||
|
|
||||||
socat_cmd += " STDOUT"
|
socat_cmd += " STDOUT"
|
||||||
@ -3324,6 +3316,124 @@ def socat_send_igmp_join_traffic(
|
|||||||
return True
|
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".format(traffic_shell_script))
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
if action == "remove_mld_join":
|
||||||
|
cmd = "ps -ef | grep socat | grep UDP6-RECV | grep {}".format(router)
|
||||||
|
elif action == "remove_mld_traffic":
|
||||||
|
cmd = "ps -ef | grep socat | grep UDP6-SEND | grep {}".format(router)
|
||||||
|
else:
|
||||||
|
cmd = "ps -ef | grep socat".format(router)
|
||||||
|
|
||||||
|
awk_cmd = "awk -F' ' '{print $2}' | xargs kill -9 &>/dev/null &"
|
||||||
|
cmd = "{} | {}".format(cmd, awk_cmd)
|
||||||
|
|
||||||
|
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
|
||||||
#############################################
|
#############################################
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user