Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 489ce2f4 authored by Lucas Bates's avatar Lucas Bates Committed by David S. Miller
Browse files

tc-testing: Restore original behaviour for namespaces in tdc



This patch restores the original behaviour for tdc prior to the
introduction of the plugin system, where the network namespace
functionality was split from the main script.

It introduces the concept of required plugins for testcases,
and will automatically load any plugin that isn't already
enabled when said plugin is required by even one testcase.

Additionally, the -n option for the nsPlugin is deprecated
so the default action is to make use of the namespaces.
Instead, we introduce -N to not use them, but still create
the veth pair.

buildebpfPlugin's -B option is also deprecated.

If a test cases requires the features of a specific plugin
in order to pass, it should instead include a new key/value
pair describing plugin interactions:

        "plugins": {
                "requires": "buildebpfPlugin"
        },

A test case can have more than one required plugin: a list
can be inserted as the value for 'requires'.

Signed-off-by: default avatarLucas Bates <lucasb@mojatatu.com>
Acked-by: default avatarDavide Caratti <dcaratti@redhat.com>
Tested-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 27d92807
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -12,10 +12,10 @@ REQUIREMENTS
*  Minimum Python version of 3.4. Earlier 3.X versions may work but are not
   guaranteed.

*  The kernel must have network namespace support
*  The kernel must have network namespace support if using nsPlugin

*  The kernel must have veth support available, as a veth pair is created
   prior to running the tests.
   prior to running the tests when using nsPlugin.

*  The kernel must have the appropriate infrastructure enabled to run all tdc
   unit tests. See the config file in this directory for minimum required
@@ -53,8 +53,12 @@ commands being tested must be run as root. The code that enforces
execution by root uid has been moved into a plugin (see PLUGIN
ARCHITECTURE, below).

If nsPlugin is linked, all tests are executed inside a network
namespace to prevent conflicts within the host.
Tests that use a network device should have nsPlugin.py listed as a
requirement for that test. nsPlugin executes all commands within a
network namespace and creates a veth pair which may be used in those test
cases. To disable execution within the namespace, pass the -N option
to tdc when starting a test run; the veth pair will still be created
by the plugin.

Running tdc without any arguments will run all tests. Refer to the section
on command line arguments for more information, or run:
@@ -154,8 +158,8 @@ action:
netns:
  options for nsPlugin (run commands in net namespace)

  -n, --namespace
                        Run commands in namespace as specified in tdc_config.py
  -N, --no-namespace
                        Do not run commands in a network namespace.

valgrind:
  options for valgrindPlugin (run command under test under Valgrind)
@@ -171,7 +175,8 @@ was in the tdc.py script has been moved into the plugins.

The plugins are in the directory plugin-lib.  The are executed from
directory plugins.  Put symbolic links from plugins to plugin-lib,
and name them according to the order you want them to run.
and name them according to the order you want them to run. This is not
necessary if a test case being run requires a specific plugin to work.

Example:

@@ -223,7 +228,8 @@ directory:
  - rootPlugin.py:
      implements the enforcement of running as root
  - nsPlugin.py:
      sets up a network namespace and runs all commands in that namespace
      sets up a network namespace and runs all commands in that namespace,
      while also setting up dummy devices to be used in testing.
  - valgrindPlugin.py
      runs each command in the execute stage under valgrind,
      and checks for leaks.
+3 −2
Original line number Diff line number Diff line
@@ -34,8 +34,9 @@ class SubPlugin(TdcPlugin):
            'buildebpf',
            'options for buildebpfPlugin')
        self.argparser_group.add_argument(
            '-B', '--buildebpf', action='store_true',
            help='build eBPF programs')
            '--nobuildebpf', action='store_false', default=True,
            dest='buildebpf',
            help='Don\'t build eBPF programs')

        return self.argparser

+20 −6
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ class SubPlugin(TdcPlugin):

        if self.args.namespace:
            self._ns_create()
        else:
            self._ports_create()

    def post_suite(self, index):
        '''run commands after test_runner goes into a test loop'''
@@ -27,6 +29,8 @@ class SubPlugin(TdcPlugin):

        if self.args.namespace:
            self._ns_destroy()
        else:
            self._ports_destroy()

    def add_args(self, parser):
        super().add_args(parser)
@@ -34,8 +38,8 @@ class SubPlugin(TdcPlugin):
            'netns',
            'options for nsPlugin(run commands in net namespace)')
        self.argparser_group.add_argument(
            '-n', '--namespace', action='store_true',
            help='Run commands in namespace')
            '-N', '--no-namespace', action='store_false', default=True,
            dest='namespace', help='Don\'t run commands in namespace')
        return self.argparser

    def adjust_command(self, stage, command):
@@ -73,20 +77,30 @@ class SubPlugin(TdcPlugin):
            print('adjust_command:  return command [{}]'.format(command))
        return command

    def _ports_create(self):
        cmd = 'ip link add $DEV0 type veth peer name $DEV1'
        self._exec_cmd('pre', cmd)
        cmd = 'ip link set $DEV0 up'
        self._exec_cmd('pre', cmd)
        if not self.args.namespace:
            cmd = 'ip link set $DEV1 up'
            self._exec_cmd('pre', cmd)

    def _ports_destroy(self):
        cmd = 'ip link del $DEV0'
        self._exec_cmd('post', cmd)

    def _ns_create(self):
        '''
        Create the network namespace in which the tests will be run and set up
        the required network devices for it.
        '''
        self._ports_create()
        if self.args.namespace:
            cmd = 'ip netns add {}'.format(self.args.NAMES['NS'])
            self._exec_cmd('pre', cmd)
            cmd = 'ip link add $DEV0 type veth peer name $DEV1'
            self._exec_cmd('pre', cmd)
            cmd = 'ip link set $DEV1 netns {}'.format(self.args.NAMES['NS'])
            self._exec_cmd('pre', cmd)
            cmd = 'ip link set $DEV0 up'
            self._exec_cmd('pre', cmd)
            cmd = 'ip -n {} link set $DEV1 up'.format(self.args.NAMES['NS'])
            self._exec_cmd('pre', cmd)
            if self.args.device:
+6 −0
Original line number Diff line number Diff line
@@ -54,6 +54,9 @@
            "actions",
            "bpf"
        ],
        "plugins": {
                "requires": "buildebpfPlugin"
        },
        "setup": [
            [
                "$TC action flush action bpf",
@@ -78,6 +81,9 @@
            "actions",
            "bpf"
        ],
        "plugins": {
                "requires": "buildebpfPlugin"
        },
        "setup": [
            [
                "$TC action flush action bpf",
+162 −0
Original line number Diff line number Diff line
@@ -6,6 +6,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress"
        ],
@@ -25,6 +28,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress"
        ],
@@ -44,6 +50,114 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress"
        ],
@@ -872,6 +986,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: protocol 802_3 prio 3 handle 7 fw action ok"
@@ -892,6 +1009,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: prio 6 handle 2 fw action continue index 5"
@@ -912,6 +1032,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress"
        ],
@@ -931,6 +1054,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress"
        ],
@@ -950,6 +1076,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 5 prio 7 fw action pass",
@@ -972,6 +1101,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 5 prio 7 fw action pass",
@@ -994,6 +1126,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 5 prio 7 fw action pass",
@@ -1015,6 +1150,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 1 prio 4 fw action ok",
@@ -1036,6 +1174,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 4 prio 2 chain 13 fw action pipe",
@@ -1057,6 +1198,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 2 prio 4 fw action drop"
@@ -1077,6 +1221,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 3 prio 4 fw action continue"
@@ -1097,6 +1244,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 4 prio 2 protocol arp fw action pipe"
@@ -1117,6 +1267,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 4 prio 2 fw action pipe flowid 45"
@@ -1137,6 +1290,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 1 prio 2 fw action ok"
@@ -1157,6 +1313,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 1 prio 2 fw action ok"
@@ -1177,6 +1336,9 @@
            "filter",
            "fw"
        ],
	"plugins": {
		"requires": "nsPlugin"
	},
        "setup": [
            "$TC qdisc add dev $DEV1 ingress",
            "$TC filter add dev $DEV1 parent ffff: handle 1 prio 2 fw action ok index 3"
Loading