[DISCUSSION] python version requirement
by Ondrej Lichtner
Hi all,
since we've moved to python3 that is actively developed and versions
move between various long term/short term support cycles, we should also
adapt LNST to this cycle of updating which minimal version of python
LNST requires.
TL;DR: The main questions I'm asking are:
* how do we _implement_ a python version requirement?
* how do we _upgrade_/_migrate_ in the future?
* how do we _document_ a python version requirement?
* which version do we want to use _now_?
More context:
I think at the moment we have a "soft" requirement for python3.6. Soft
because we:
* probably haven't tested on anything older
* it's not explicitly configured/documented anywhere
At the same time, there are now at least two reasons to start thinking
about moving to python3.8:
* I remember Perry asking about the f-string feature introduced in 3.8
* while working with Adrian on the TRex refactoring I started thinking
about a feature for the lnst.Tests package that I've had in mind for a
while, which requires a 3.7 feature
* python3.8 is the current version on Fedora32, is available in RHEL8
(via dnf install python38), and python3.7 was skipped
The lnst.Tests feature I'm thinking of is "lazy" and "dynamic" loading
of BaseTestModule derived modules - for example at the moment, if a
Recipe imports any module from lnst.Tests (e.g. lnst.Tests.Ping), the
entire package is parsed and "loaded", which means that the python
environment will also parse and load lnst.Tests.TRex. This means that a
basic hello world recipe that simply calls Ping, will in some way
require load time dependencies of TRex.
The "lazy" and "dynamic" loading of test modules would ensure that when
a recipe calls:
from lnst.Tests import Ping
Only the Ping module will be parsed, loaded and imported, and nothing
else. And the dynamicity here could mean that we could be able to extend
test modules exported by the lnst.Tests package via the lnst-ctl config
file, for example for user/tester implemented test modules that are not
tracked in the main lnst repository.
I wrote a rough patch to experiment with this:
---
diff --git a/lnst/Tests/__init__.py b/lnst/Tests/__init__.py
index f7c6c90..a39b6f4 100644
--- a/lnst/Tests/__init__.py
+++ b/lnst/Tests/__init__.py
@@ -12,8 +12,26 @@
olichtne(a)redhat.com (Ondrej Lichtner)
"""
-from lnst.Tests.Ping import Ping
-from lnst.Tests.PacketAssert import PacketAssert
-from lnst.Tests.Iperf import IperfClient, IperfServer
+# from lnst.Tests.Ping import Ping
+# from lnst.Tests.PacketAssert import PacketAssert
+# from lnst.Tests.Iperf import IperfClient, IperfServer
+import importlib
+
+lazy_load_modules = {
+ "Ping": "lnst.Tests.Ping",
+ "PacketAssert": "lnst.Tests.PacketAssert",
+ "IperfClient": "lnst.Tests.Iperf",
+ "IperfServer": "lnst.Tests.Iperf",
+}
+
+
+def __getattr__(name):
+ if name not in lazy_load_modules:
+ raise ImportError("Cannot import {}".format(name))
+ mod = importlib.import_module(lazy_load_modules[name])
+ globals()[name] = getattr(mod, name)
+ return globals()[name]
+
+
+# #TODO add support for test classes from lnst-ctl.conf
-#TODO add support for test classes from lnst-ctl.conf
---
However this requires the ability to define __getattr__ for a module,
which is introduced as a python3.7 feature via PEP562 [0].
-Ondrej
[0] https://www.python.org/dev/peps/pep-0562/
2 years, 11 months
[PATCH 0/4] IpsecEspAead, PacketAssert and XfrmTools docs
by jurbanov@redhat.com
From: Jozef Urbanovsky <jurbanov(a)redhat.com>
Hi team,
This patch extends the documentation of IpsecEspAeadRecipe based on
Jan's feedback. Adding forgotten reference to the specific_scenarios.
Both PacketAssert modules (RecipeCommon and Tests)
are extended with documentation.
Jozef Urbanovsky (4):
docs.source.specific_scenarios: add ipsec_esp_aead_recipe
lnst.RecipeCommon.PacketAssert: add documentation
lnst.Recipes.ENRT.XfrmTools: add documentation
lnst.Recipes.ENRT.IpsecEspAeadRecipe: extend and fix documentation
docs/source/specific_scenarios.rst | 1 +
lnst/RecipeCommon/PacketAssert.py | 27 +++++++++++++++++++
lnst/Recipes/ENRT/IpsecEspAeadRecipe.py | 23 +++++++++++-----
lnst/Recipes/ENRT/XfrmTools.py | 36 +++++++++++++++++++++++++
lnst/Tests/PacketAssert.py | 20 ++++++++++++++
5 files changed, 100 insertions(+), 7 deletions(-)
--
2.25.4
3 years, 5 months
[PATCH] docs: add BondRecipe documentation
by aloughla@redhat.com
From: Aniss Loughlam <aloughla(a)redhat.com>
Signed-off-by: Aniss Loughlam <aloughla(a)redhat.com>
---
docs/source/bond_recipe.rst | 6 ++++++
docs/source/specific_scenarios.rst | 1 +
2 files changed, 7 insertions(+)
create mode 100644 docs/source/bond_recipe.rst
diff --git a/docs/source/bond_recipe.rst b/docs/source/bond_recipe.rst
new file mode 100644
index 0000000..921ceaf
--- /dev/null
+++ b/docs/source/bond_recipe.rst
@@ -0,0 +1,6 @@
+BondRecipe
+^^^^^^^^^^^^^^^^^^^
+
+.. autoclass:: lnst.Recipes.ENRT.BondRecipe.BondRecipe
+ :members:
+ :show-inheritance:
diff --git a/docs/source/specific_scenarios.rst b/docs/source/specific_scenarios.rst
index b78577c..ee70313 100644
--- a/docs/source/specific_scenarios.rst
+++ b/docs/source/specific_scenarios.rst
@@ -3,6 +3,7 @@ Specific ENRT scenarios
.. toctree::
simple_network_recipe
+ bond_recipe
team_recipe
vlans_recipe
vlans_over_bond_recipe
--
2.25.4
3 years, 5 months
[PATCH] RecipeResults.py: Stop excluding RemoteDevices from export
by pgagne@redhat.com
From: Perry Gagne <pgagne(a)redhat.com>
Was able to figure out the issues with exporting Devices, so we don't need to exclude them anymore.
Signed-off-by: Perry Gagne <pgagne(a)redhat.com>
---
lnst/Common/ConnectionHandler.py | 7 +++++++
lnst/Controller/Machine.py | 8 ++++++++
lnst/Controller/RecipeResults.py | 5 -----
lnst/Devices/RemoteDevice.py | 2 ++
4 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/lnst/Common/ConnectionHandler.py b/lnst/Common/ConnectionHandler.py
index a74d4a8..04bf7be 100644
--- a/lnst/Common/ConnectionHandler.py
+++ b/lnst/Common/ConnectionHandler.py
@@ -133,3 +133,10 @@ class ConnectionHandler(object):
def clear_connections(self):
self._connections = []
self._connection_mapping = {}
+
+ def __getstate__(self):
+ state = self.__dict__.copy()
+ # Remove things that can't be pickled
+ state['_connections'] = []
+ state['_connection_mapping'] = {}
+ return state
\ No newline at end of file
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 4b9afcb..5920d69 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -589,3 +589,11 @@ class Machine(object):
def get_security(self):
return self._security
+
+ def __getstate__(self):
+ state = self.__dict__.copy()
+ # Remove things that can't be pickled
+ state['_msg_dispatcher'] = None
+ if self.get_libvirt_domain():
+ state['_domain_ctl'] = None
+ return state
\ No newline at end of file
diff --git a/lnst/Controller/RecipeResults.py b/lnst/Controller/RecipeResults.py
index 941ea8d..38a4170 100644
--- a/lnst/Controller/RecipeResults.py
+++ b/lnst/Controller/RecipeResults.py
@@ -118,11 +118,6 @@ class DeviceConfigResult(BaseResult):
def device(self):
return self._device
- def __getstate__(self):
- state = self.__dict__.copy()
- # Remove things that can't be pickled
- state['_device'] = None
- return state
class DeviceCreateResult(DeviceConfigResult):
@property
diff --git a/lnst/Devices/RemoteDevice.py b/lnst/Devices/RemoteDevice.py
index f11fa65..7891514 100644
--- a/lnst/Devices/RemoteDevice.py
+++ b/lnst/Devices/RemoteDevice.py
@@ -108,6 +108,8 @@ class RemoteDevice(object):
def __getattr__(self, name):
if name == "_inited":
return False
+ if not self._inited:
+ return super(RemoteDevice, self).__getattr__(name)
attr = getattr(self._dev_cls, name)
--
2.26.2
3 years, 5 months
[PATCH] Add documentation
by aloughla@redhat.com
From: Aniss Loughlam <aloughla(a)redhat.com>
Signed-off-by: Aniss Loughlam <aloughla(a)redhat.com>
---
docs/source/bond_recipe.rst | 6 ++++++
docs/source/specific_scenarios.rst | 1 +
2 files changed, 7 insertions(+)
create mode 100644 docs/source/bond_recipe.rst
diff --git a/docs/source/bond_recipe.rst b/docs/source/bond_recipe.rst
new file mode 100644
index 0000000..921ceaf
--- /dev/null
+++ b/docs/source/bond_recipe.rst
@@ -0,0 +1,6 @@
+BondRecipe
+^^^^^^^^^^^^^^^^^^^
+
+.. autoclass:: lnst.Recipes.ENRT.BondRecipe.BondRecipe
+ :members:
+ :show-inheritance:
diff --git a/docs/source/specific_scenarios.rst b/docs/source/specific_scenarios.rst
index b78577c..ee70313 100644
--- a/docs/source/specific_scenarios.rst
+++ b/docs/source/specific_scenarios.rst
@@ -3,6 +3,7 @@ Specific ENRT scenarios
.. toctree::
simple_network_recipe
+ bond_recipe
team_recipe
vlans_recipe
vlans_over_bond_recipe
--
2.25.4
3 years, 5 months
[PATCH] Add documentation
by aloughla@redhat.com
From: Aniss Loughlam <aloughla(a)redhat.com>
Signed-off-by: Aniss Loughlam <aloughla(a)redhat.com>
---
docs/source/bond_recipe.rst | 6 ++++++
docs/source/specific_scenarios.rst | 1 +
2 files changed, 7 insertions(+)
create mode 100644 docs/source/bond_recipe.rst
diff --git a/docs/source/bond_recipe.rst b/docs/source/bond_recipe.rst
new file mode 100644
index 0000000..0573ef4
--- /dev/null
+++ b/docs/source/bond_recipe.rst
@@ -0,0 +1,6 @@
+BondRecipe
+^^^^^^^^^^^^^^^^^^^
+
+.. autoclass:: lnst.Recipes.ENRT.TeamRecipe.TeamRecipe
+ :members:
+ :show-inheritance:
diff --git a/docs/source/specific_scenarios.rst b/docs/source/specific_scenarios.rst
index b78577c..ee70313 100644
--- a/docs/source/specific_scenarios.rst
+++ b/docs/source/specific_scenarios.rst
@@ -3,6 +3,7 @@ Specific ENRT scenarios
.. toctree::
simple_network_recipe
+ bond_recipe
team_recipe
vlans_recipe
vlans_over_bond_recipe
--
2.25.4
3 years, 5 months
[PATCH] Host: export pool xml params to the matches Host object
by olichtne@redhat.com
From: Ondrej Lichtner <olichtne(a)redhat.com>
These can be useful to retrieve additional information about the host
that we are running our tests on even if these parameters weren't
directly requested for matching.
Signed-off-by: Ondrej Lichtner <olichtne(a)redhat.com>
---
lnst/Controller/Host.py | 1 +
lnst/Controller/Machine.py | 4 +++-
lnst/Controller/SlavePoolManager.py | 2 +-
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/lnst/Controller/Host.py b/lnst/Controller/Host.py
index 89b6b25..a50a7ad 100644
--- a/lnst/Controller/Host.py
+++ b/lnst/Controller/Host.py
@@ -40,6 +40,7 @@ class Host(Namespace):
def __init__(self, machine, **kwargs):
super(Host, self).__init__(machine)
self.params = Parameters()
+ self.params._from_dict(self._machine._pool_params)
self.params._from_dict(self._machine._slave_desc)
self._machine.set_initns(self)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 4b9afcb..f63fd6f 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -45,7 +45,7 @@ class Machine(object):
"""
def __init__(self, m_id, hostname, msg_dispatcher, ctl_config,
- libvirt_domain=None, rpcport=None, security=None):
+ libvirt_domain=None, rpcport=None, security=None, pool_params=None):
self._id = m_id
self._hostname = hostname
self._mapped = False
@@ -59,6 +59,8 @@ def __init__(self, m_id, hostname, msg_dispatcher, ctl_config,
self._security["privkey"] = ctl_config.get_option("security",
"privkey")
+ self._pool_params = pool_params
+
self._domain_ctl = None
self._network_bridges = None
self._libvirt_domain = libvirt_domain
diff --git a/lnst/Controller/SlavePoolManager.py b/lnst/Controller/SlavePoolManager.py
index 3456332..fc863c1 100644
--- a/lnst/Controller/SlavePoolManager.py
+++ b/lnst/Controller/SlavePoolManager.py
@@ -73,7 +73,7 @@ def __init__(self, pools, msg_dispatcher, ctl_config, pool_checks=True):
pool[m_id] = Machine(m_id, hostname, self._msg_dispatcher,
ctl_config, libvirt_domain, rpc_port,
- m_spec["security"])
+ m_spec["security"], params)
pool[m_id].init_connection()
#TODO check if all described devices are available
--
2.28.0
3 years, 5 months
[PATCH] RecipeResults.py: Added __get_state__ to DeviceMethodCallResult
by pgagne@redhat.com
From: Perry Gagne <pgagne(a)redhat.com>
Had to exclude args since they might contain Device objects (ex. when creating a team device)
I have a couple ideas for a more thorough approch here, but whated to commit this right away to unblock
testing since it might cause beaker jobs to fail.
Signed-off-by: Perry Gagne <pgagne(a)redhat.com>
---
lnst/Controller/RecipeResults.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/lnst/Controller/RecipeResults.py b/lnst/Controller/RecipeResults.py
index 941ea8d..c2e2c3e 100644
--- a/lnst/Controller/RecipeResults.py
+++ b/lnst/Controller/RecipeResults.py
@@ -183,6 +183,11 @@ class DeviceMethodCallResult(DeviceConfigResult):
),
)
+ def __getstate__(self):
+ state = super(DeviceMethodCallResult, self).__getstate__()
+ # Remove things that can't be pickled
+ state['_args'] = None # Could be device object (ex. port of team device).
+ return state
class DeviceAttrSetResult(DeviceConfigResult):
def __init__(self, success, device, attr_name, value, old_value):
--
2.26.2
3 years, 5 months
[PATCH] TeamRecipe.py: Add docs
by pgagne@redhat.com
From: Perry Gagne <pgagne(a)redhat.com>
Added docstrings and sphinx configs.
Signed-off-by: Perry Gagne <pgagne(a)redhat.com>
---
docs/source/specific_scenarios.rst | 1 +
docs/source/team_recipe.rst | 6 ++
lnst/Recipes/ENRT/TeamRecipe.py | 125 +++++++++++++++++++++++++++++
3 files changed, 132 insertions(+)
create mode 100644 docs/source/team_recipe.rst
diff --git a/docs/source/specific_scenarios.rst b/docs/source/specific_scenarios.rst
index c3d8190..b78577c 100644
--- a/docs/source/specific_scenarios.rst
+++ b/docs/source/specific_scenarios.rst
@@ -3,5 +3,6 @@ Specific ENRT scenarios
.. toctree::
simple_network_recipe
+ team_recipe
vlans_recipe
vlans_over_bond_recipe
diff --git a/docs/source/team_recipe.rst b/docs/source/team_recipe.rst
new file mode 100644
index 0000000..b45df44
--- /dev/null
+++ b/docs/source/team_recipe.rst
@@ -0,0 +1,6 @@
+TeamRecipe
+^^^^^^^^^^^^^^^^^^^
+
+.. autoclass:: lnst.Recipes.ENRT.TeamRecipe.TeamRecipe
+ :members:
+ :show-inheritance:
diff --git a/lnst/Recipes/ENRT/TeamRecipe.py b/lnst/Recipes/ENRT/TeamRecipe.py
index b8233c8..932e75f 100644
--- a/lnst/Recipes/ENRT/TeamRecipe.py
+++ b/lnst/Recipes/ENRT/TeamRecipe.py
@@ -14,6 +14,38 @@ from lnst.Devices import TeamDevice
class TeamRecipe(PerfReversibleFlowMixin, CommonHWSubConfigMixin, OffloadSubConfigMixin,
BaseEnrtRecipe):
+ """
+ This recipe implements Enrt testing for a network scenario that looks
+ as follows
+
+ .. code-block:: none
+
+ .--------.
+ .----------------+ |
+ | .-------+ switch +-------.
+ | | '--------' |
+ .-------------------. |
+ | | team0 | | |
+ | .---'--. .---'--. | .---'--.
+ .----|-| eth0 |-| eth1 |-|----. .----| eth0 |----.
+ | | '------' '------' | | | '------' |
+ | '-------------------' | | |
+ | | | |
+ | host1 | | host2 |
+ '-----------------------------' '----------------'
+
+
+ The recipe provides additional recipe parameters to configure the teaming
+ device.
+
+ :param runner_name:
+ (mandatory test parameter) the teamd runner to be use on
+ the team0 device (ex. `activebackup`, `roundrobin`, etc)
+
+ All sub configurations are included via Mixin classes.
+
+ The actual test machinery is implemented in the :any:`BaseEnrtRecipe` class.
+ """
host1 = HostReq()
host1.eth0 = DeviceReq(label="tnet", driver=RecipeParam("driver"))
host1.eth1 = DeviceReq(label="tnet", driver=RecipeParam("driver"))
@@ -30,6 +62,16 @@ class TeamRecipe(PerfReversibleFlowMixin, CommonHWSubConfigMixin, OffloadSubConf
runner_name = StrParam(mandatory=True)
def test_wide_configuration(self):
+ """
+ Test wide configuration for this recipe involves creating a team
+ device using the two matched physical devices as ports on host1.
+ The `teamd` daemon is configured with the `runner_name` according
+ to the recipe parameters. IPv4 and IPv6 addresses are added to
+ the teaming device and to the matched ethernet device on host2.
+
+ | host1.team0 = 192.168.10.1/24 and fc00:0:0:1::1/64
+ | host2.eth0 = 192.168.10.2/24 and fc00:0:0:1::2/64
+ """
host1, host2 = self.matched.host1, self.matched.host2
teamd_config = {'runner': {'name': self.params.runner_name}}
@@ -56,6 +98,10 @@ class TeamRecipe(PerfReversibleFlowMixin, CommonHWSubConfigMixin, OffloadSubConf
return configuration
def generate_test_wide_description(self, config):
+ """
+ Test wide description is extended with the configured IP addresses, the
+ configured team device ports, and runner name.
+ """
host1, host2 = self.matched.host1, self.matched.host2
desc = super().generate_test_wide_description(config)
desc += [
@@ -83,33 +129,112 @@ class TeamRecipe(PerfReversibleFlowMixin, CommonHWSubConfigMixin, OffloadSubConf
super().test_wide_deconfiguration(config)
def generate_ping_endpoints(self, config):
+ """
+ The ping endpoints for this recipe are the configured team device on
+ host1 and the matched ethernet device on host2.
+
+ Returned as::
+
+ [PingEndpoints(self.matched.host1.team0, self.matched.host2.eth0),
+ PingEndpoints(self.matched.host2.eth0, self.matched.host1.team0)]
+ """
return [
PingEndpoints(self.matched.host1.team0, self.matched.host2.eth0),
PingEndpoints(self.matched.host2.eth0, self.matched.host1.team0)
]
def generate_perf_endpoints(self, config):
+ """
+ The perf endpoints for this recipe are the configured team device on
+ host1 and the matched ethernet device on host2. The traffic egresses
+ the team device.
+
+ | host1.team0
+ | host2.eth0
+
+ Returned as::
+
+ [(self.matched.host1.team0, self.matched.host2.eth0)]
+
+ """
return [(self.matched.host1.team0, self.matched.host2.eth0)]
@property
def offload_nics(self):
+ """
+ The `offload_nics` property value for this scenario is a list containing
+ the configured team device on host1 and the matched ethernet device
+ on host2.
+
+ | host1.team0
+ | host2.eth0
+
+ For detailed explanation of this property see :any:`OffloadSubConfigMixin`
+ class and :any:`OffloadSubConfigMixin.offload_nics`.
+ """
return [self.matched.host1.team0, self.matched.host2.eth0]
@property
def mtu_hw_config_dev_list(self):
+ """
+ The `mtu_hw_config_dev_list` property value for this scenario is a list
+ containing the configured teaming device on host1 and the matched ethernet
+ device on host2.
+
+ | host1.team0
+ | host2.eth0
+
+ For detailed explanation of this property see :any:`MTUHWConfigMixin`
+ class and :any:`MTUHWConfigMixin.mtu_hw_config_dev_list`.
+ """
return [self.matched.host1.team0, self.matched.host2.eth0]
@property
def coalescing_hw_config_dev_list(self):
+ """
+ The `coalescing_hw_config_dev_list` property value for this scenario is a
+ list containing the matched physical devices used to create the teaming
+ device on host1 and the matched ethernet device on host2.
+
+ | host1.eth0, host.eth1
+ | host2.eth0
+
+ For detailed explanation of this property see :any:`CoalescingHWConfigMixin`
+ class and :any:`CoalescingHWConfigMixin.coalescing_hw_config_dev_list`.
+ """
host1, host2 = self.matched.host1, self.matched.host2
return [host1.eth0, host1.eth1, host2.eth0]
@property
def dev_interrupt_hw_config_dev_list(self):
+ """
+ The `dev_interrupt_hw_config_dev_list` property value for this scenario
+ is a list containing the matched physical devices used to create the
+ teaming device on host1 and the matched ethernet device on host2.
+
+ | host1.eth0, host1.eth1
+ | host2.eth0
+
+ For detailed explanation of this property see
+ :any:`DevInterruptHWConfigMixin` class and
+ :any:`DevInterruptHWConfigMixin.dev_interrupt_hw_config_dev_list`.
+ """
host1, host2 = self.matched.host1, self.matched.host2
return [host1.eth0, host1.eth1, host2.eth0]
@property
def parallel_stream_qdisc_hw_config_dev_list(self):
+ """
+ The `parallel_stream_qdisc_hw_config_dev_list` property value for this
+ scenario is a list containing the matched physical devices used to create
+ the teaming device on host1 and the matched ethernet device on host2.
+
+ | host1.eth0, host.eth1
+ | host2.eth0
+
+ For detailed explanation of this property see
+ :any:`ParallelStreamQDiscHWConfigMixin` class and
+ :any:`ParallelStreamQDiscHWConfigMixin.parallel_stream_qdisc_hw_config_dev_list`.
+ """
host1, host2 = self.matched.host1, self.matched.host2
return [host1.eth0, host1.eth1, host2.eth0]
--
2.26.2
3 years, 5 months
[PATCH] PerfReversibleFlowMixin.py: Fixup docs
by pgagne@redhat.com
From: Perry Gagne <pgagne(a)redhat.com>
Did some cleanup of the docstrings and add sphinx rst files
Signed-off-by: Perry Gagne <pgagne(a)redhat.com>
---
.../config_mixin_classes/perf_reverse_mixin.rst | 6 ++++++
docs/source/config_mixins.rst | 1 +
.../ENRT/ConfigMixins/PerfReversibleFlowMixin.py | 14 ++++++--------
3 files changed, 13 insertions(+), 8 deletions(-)
create mode 100644 docs/source/config_mixin_classes/perf_reverse_mixin.rst
diff --git a/docs/source/config_mixin_classes/perf_reverse_mixin.rst b/docs/source/config_mixin_classes/perf_reverse_mixin.rst
new file mode 100644
index 0000000..6d0e726
--- /dev/null
+++ b/docs/source/config_mixin_classes/perf_reverse_mixin.rst
@@ -0,0 +1,6 @@
+PerfReversibleFlowMixin
+================
+
+.. autoclass:: lnst.Recipes.ENRT.ConfigMixins.PerfReversibleFlowMixin.PerfReversibleFlowMixin
+ :members:
+ :show-inheritance:
diff --git a/docs/source/config_mixins.rst b/docs/source/config_mixins.rst
index 8558fc9..b766a0c 100644
--- a/docs/source/config_mixins.rst
+++ b/docs/source/config_mixins.rst
@@ -12,3 +12,4 @@ ENRT Config Mixins
config_mixin_classes/dev_interrupt_mixin
config_mixin_classes/parallel_stream_qdisc_mixin
config_mixin_classes/pause_frames_mixin
+ config_mixin_classes/perf_reverse_mixin.rst
diff --git a/lnst/Recipes/ENRT/ConfigMixins/PerfReversibleFlowMixin.py b/lnst/Recipes/ENRT/ConfigMixins/PerfReversibleFlowMixin.py
index a5bcfad..48210d0 100644
--- a/lnst/Recipes/ENRT/ConfigMixins/PerfReversibleFlowMixin.py
+++ b/lnst/Recipes/ENRT/ConfigMixins/PerfReversibleFlowMixin.py
@@ -9,19 +9,17 @@ class PerfReversibleFlowMixin(object):
For example:
- SimpleNetworkRecipe is symmetrical since both endpoints are of the same type
- (both plain interfaces).
+ SimpleNetworkRecipe is symmetrical since both endpoints are of the same type (both plain interfaces).
- TeamRecipe is asymmetrical because one endpoint is a team device and the
- other is a plain interface.
+ TeamRecipe is asymmetrical because one endpoint is a team device and the other is a plain interface.
- So TeamRecipe could use this mixin to indicate that is can be reversed.
+ So TeamRecipe could use this mixin to indicate that the flow of traffic can be reversed.
- This can be controlled by the perf_reverse parameter:
+ This can be controlled by the `perf_reverse` parameter:
:param perf_reverse:
- Parameter used by the :any:`generate_flow_combinations` generator. To
- specify that the flow of traffic between the endpoints should be reversed.
+ Parameter used by the :any:`generate_flow_combinations` generator.
+ To specify that the flow of traffic between the endpoints should be reversed.
:type perf_reverse: :any:`BoolParam` (default False)
"""
perf_reverse = BoolParam(default=False)
--
2.26.2
3 years, 5 months