On Wed, May 22, 2019 at 2:37 PM Shekhar Sharma <[email protected]> wrote:
>
> This patch solves the problem with the 'version' in the constructor of
> argparse (line 1325). A new argument has been added for printing the version.
> Now the file will run in python2 as well as python3.
>
> Thanks eric for the hint! :-)
>
> Signed-off-by: Shekhar Sharma <[email protected]>
> ---
> tests/py/nft-test.py | 125 ++++++++++++++++++++++++++++++-------------
> 1 file changed, 88 insertions(+), 37 deletions(-)
>
> diff --git a/tests/py/nft-test.py b/tests/py/nft-test.py
> index 1c0afd0e..bb643ccc 100755
> --- a/tests/py/nft-test.py
> +++ b/tests/py/nft-test.py
> @@ -13,6 +13,8 @@
> # Thanks to the Outreach Program for Women (OPW) for sponsoring this test
> # infrastructure.
>
> +from __future__ import print_function
> +#from nftables import Nftables
> import sys
> import os
> import argparse
> @@ -22,7 +24,6 @@ import json
> TESTS_PATH = os.path.dirname(os.path.abspath(__file__))
> sys.path.insert(0, os.path.join(TESTS_PATH, '../../py/'))
>
> -from nftables import Nftables
>
> TESTS_DIRECTORY = ["any", "arp", "bridge", "inet", "ip", "ip6"]
> LOGFILE = "/tmp/nftables-test.log"
> @@ -171,27 +172,31 @@ def print_differences_error(filename, lineno, cmd):
> print_error(reason, filename, lineno)
>
>
> -def table_exist(table, filename, lineno):
> +def table_exist(table, filename, lineno, netns):
> '''
> Exists a table.
> '''
> cmd = "list table %s" % table
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> return True if (ret == 0) else False
>
>
> -def table_flush(table, filename, lineno):
> +def table_flush(table, filename, lineno, netns):
> '''
> Flush a table.
> '''
> cmd = "flush table %s" % table
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> execute_cmd(cmd, filename, lineno)
>
> return cmd
>
>
> -def table_create(table, filename, lineno):
> +def table_create(table, filename, lineno, netns):
> '''
> Adds a table.
> '''
> @@ -205,6 +210,8 @@ def table_create(table, filename, lineno):
>
> # We add a new table
> cmd = "add table %s" % table
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> if ret != 0:
> @@ -233,7 +240,7 @@ def table_create(table, filename, lineno):
> return 0
>
>
> -def table_delete(table, filename=None, lineno=None):
> +def table_delete(table, filename=None, lineno=None, netns=0):
> '''
> Deletes a table.
> '''
> @@ -243,6 +250,8 @@ def table_delete(table, filename=None, lineno=None):
> return -1
>
> cmd = "delete table %s" % table
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
> if ret != 0:
> reason = "%s: I cannot delete table %s. Giving up!" % (cmd, table)
> @@ -258,17 +267,19 @@ def table_delete(table, filename=None, lineno=None):
> return 0
>
>
> -def chain_exist(chain, table, filename):
> +def chain_exist(chain, table, filename, netns):
> '''
> Checks a chain
> '''
> cmd = "list chain %s %s" % (table, chain)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, chain.lineno)
>
> return True if (ret == 0) else False
>
>
> -def chain_create(chain, table, filename):
> +def chain_create(chain, table, filename, netns):
> '''
> Adds a chain
> '''
> @@ -279,6 +290,8 @@ def chain_create(chain, table, filename):
> return -1
>
> cmd = "add chain %s %s" % (table, chain)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> if chain.config:
> cmd += " { %s; }" % chain.config
>
> @@ -297,7 +310,7 @@ def chain_create(chain, table, filename):
> return 0
>
>
> -def chain_delete(chain, table, filename=None, lineno=None):
> +def chain_delete(chain, table, filename=None, lineno=None, netns=0):
> '''
> Flushes and deletes a chain.
> '''
> @@ -308,6 +321,8 @@ def chain_delete(chain, table, filename=None,
> lineno=None):
> return -1
>
> cmd = "flush chain %s %s" % (table, chain)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
> if ret != 0:
> reason = "I cannot " + cmd
> @@ -315,6 +330,8 @@ def chain_delete(chain, table, filename=None,
> lineno=None):
> return -1
>
> cmd = "delete chain %s %s" % (table, chain)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
> if ret != 0:
> reason = "I cannot " + cmd
> @@ -340,7 +357,7 @@ def chain_get_by_name(name):
> return chain
>
>
> -def set_add(s, test_result, filename, lineno):
> +def set_add(s, test_result, filename, lineno, netns):
> '''
> Adds a set.
> '''
> @@ -362,6 +379,8 @@ def set_add(s, test_result, filename, lineno):
> flags = "flags %s; " % flags
>
> cmd = "add set %s %s { type %s;%s %s}" % (table, s.name, s.type,
> s.timeout, flags)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> if (ret == 0 and test_result == "fail") or \
> @@ -379,7 +398,7 @@ def set_add(s, test_result, filename, lineno):
> return 0
>
>
> -def set_add_elements(set_element, set_name, state, filename, lineno):
> +def set_add_elements(set_element, set_name, state, filename, lineno, netns):
> '''
> Adds elements to the set.
> '''
> @@ -399,6 +418,8 @@ def set_add_elements(set_element, set_name, state,
> filename, lineno):
>
> element = ", ".join(set_element)
> cmd = "add element %s %s { %s }" % (table, set_name, element)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> if (state == "fail" and ret == 0) or (state == "ok" and ret != 0):
> @@ -416,12 +437,14 @@ def set_add_elements(set_element, set_name, state,
> filename, lineno):
>
>
> def set_delete_elements(set_element, set_name, table, filename=None,
> - lineno=None):
> + lineno=None, netns=0):
> '''
> Deletes elements in a set.
> '''
> for element in set_element:
> cmd = "delete element %s %s { %s }" % (table, set_name, element)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
> if ret != 0:
> reason = "I cannot delete element %s " \
> @@ -432,11 +455,11 @@ def set_delete_elements(set_element, set_name, table,
> filename=None,
> return 0
>
>
> -def set_delete(table, filename=None, lineno=None):
> +def set_delete(table, filename=None, lineno=None, netns=0):
> '''
> Deletes set and its content.
> '''
> - for set_name in all_set.keys():
> + for set_name in list(all_set.keys()):
> # Check if exists the set
> if not set_exist(set_name, table, filename, lineno):
> reason = "The set %s does not exist, " \
> @@ -450,6 +473,8 @@ def set_delete(table, filename=None, lineno=None):
>
> # We delete the set.
> cmd = "delete set %s %s" % (table, set_name)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> # Check if the set still exists after I deleted it.
> @@ -461,21 +486,25 @@ def set_delete(table, filename=None, lineno=None):
> return 0
>
>
> -def set_exist(set_name, table, filename, lineno):
> +def set_exist(set_name, table, filename, lineno, netns):
> '''
> Check if the set exists.
> '''
> cmd = "list set %s %s" % (table, set_name)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> return True if (ret == 0) else False
>
>
> -def _set_exist(s, filename, lineno):
> +def _set_exist(s, filename, lineno, netns):
> '''
> Check if the set exists.
> '''
> cmd = "list set %s %s %s" % (s.family, s.table, s.name)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> return True if (ret == 0) else False
> @@ -509,7 +538,7 @@ def set_check_element(rule1, rule2):
> return cmp(rule1[end1:], rule2[end2:])
>
>
> -def obj_add(o, test_result, filename, lineno):
> +def obj_add(o, test_result, filename, lineno, netns):
> '''
> Adds an object.
> '''
> @@ -528,6 +557,8 @@ def obj_add(o, test_result, filename, lineno):
> return -1
>
> cmd = "add %s %s %s %s" % (o.type, table, o.name, o.spcf)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> if (ret == 0 and test_result == "fail") or \
> @@ -554,7 +585,7 @@ def obj_add(o, test_result, filename, lineno):
> print_error(reason, filename, lineno)
> return -1
>
> -def obj_delete(table, filename=None, lineno=None):
> +def obj_delete(table, filename=None, lineno=None, netns=0):
> '''
> Deletes object.
> '''
> @@ -568,6 +599,8 @@ def obj_delete(table, filename=None, lineno=None):
>
> # We delete the object.
> cmd = "delete %s %s %s" % (o.type, table, o.name)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> # Check if the object still exists after I deleted it.
> @@ -579,21 +612,25 @@ def obj_delete(table, filename=None, lineno=None):
> return 0
>
>
> -def obj_exist(o, table, filename, lineno):
> +def obj_exist(o, table, filename, lineno, netns):
> '''
> Check if the object exists.
> '''
> cmd = "list %s %s %s" % (o.type, table, o.name)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> return True if (ret == 0) else False
>
>
> -def _obj_exist(o, filename, lineno):
> +def _obj_exist(o, filename, lineno, netns):
> '''
> Check if the object exists.
> '''
> cmd = "list %s %s %s %s" % (o.type, o.family, o.table, o.name)
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno)
>
> return True if (ret == 0) else False
> @@ -688,7 +725,7 @@ def json_dump_normalize(json_string, human_readable =
> False):
> return json.dumps(json_obj, sort_keys = True)
>
>
> -def rule_add(rule, filename, lineno, force_all_family_option, filename_path):
> +def rule_add(rule, filename, lineno, force_all_family_option, filename_path,
> netns):
> '''
> Adds a rule
> '''
> @@ -766,6 +803,8 @@ def rule_add(rule, filename, lineno,
> force_all_family_option, filename_path):
>
> # Add rule and check return code
> cmd = "add rule %s %s %s" % (table, chain, rule[0])
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
> ret = execute_cmd(cmd, filename, lineno, payload_log,
> debug="netlink")
>
> state = rule[1].rstrip()
> @@ -862,6 +901,8 @@ def rule_add(rule, filename, lineno,
> force_all_family_option, filename_path):
>
> # Add rule and check return code
> cmd = "add rule %s %s %s" % (table, chain,
> rule_output.rstrip())
> + if netns:
> + cmd = "ip netns exec ___nftables-container-test" + cmd
Apart from Pablo's comments, you could do this as a one-liner:
cmd = "ip netns exec ___nftables-container-test {}".format(cmd) if
netns else ...
of course keeping in mind the char limit.
> ret = execute_cmd(cmd, filename, lineno, payload_log,
> debug="netlink")
>
> if ret != 0:
> @@ -946,6 +987,7 @@ def rule_add(rule, filename, lineno,
> force_all_family_option, filename_path):
> nftables.set_stateless_output(stateless_old)
>
> json_output = json.loads(json_output)
> +
> for item in json_output["nftables"]:
> if "rule" in item:
> del(item["rule"]["handle"])
> @@ -1002,9 +1044,9 @@ def execute_cmd(cmd, filename, lineno,
> stdout_log=False, debug=False):
> :param debug: temporarily set these debug flags
> '''
> global log_file
> - print >> log_file, "command: %s" % cmd
> + print("command: %s" % cmd, file=log_file)
You might want to use .format() method and make your print statement
cleaner and less error prone.
> if debug_option:
> - print cmd
> + print(cmd)
>
> if debug:
> debug_old = nftables.get_debug()
> @@ -1193,12 +1235,14 @@ def run_test_file(filename, force_all_family_option,
> specific_file):
> filename_path = os.path.join(TESTS_PATH, filename)
> f = open(filename_path)
> tests = passed = total_unit_run = total_warning = total_error = 0
> + if netns:
> + execute_cmd("ip netns add ___nftables-container-test", filename, 0)
>
> for lineno, line in enumerate(f):
> sys.stdout.flush()
>
> if signal_received == 1:
> - print "\nSignal received. Cleaning up and Exitting..."
> + print("\nSignal received. Cleaning up and Exitting...")
> cleanup_on_exit()
> sys.exit(0)
>
> @@ -1305,14 +1349,15 @@ def run_test_file(filename, force_all_family_option,
> specific_file):
>
> if specific_file:
> if force_all_family_option:
> - print print_result_all(filename, tests, total_warning,
> total_error,
> - total_unit_run)
> + print(print_result_all(filename, tests, total_warning,
> total_error,
> + total_unit_run))
> else:
> - print print_result(filename, tests, total_warning, total_error)
> + print(print_result(filename, tests, total_warning, total_error))
> else:
> if tests == passed and tests > 0:
> - print filename + ": " + Colors.GREEN + "OK" + Colors.ENDC
> -
> + print(filename + ": " + Colors.GREEN + "OK" + Colors.ENDC)
> + if netns:
> + execute_cmd("ip netns del ___nftables-container-test", filename,
> 0)
> f.close()
> del table_list[:]
> del chain_list[:]
> @@ -1322,7 +1367,7 @@ def run_test_file(filename, force_all_family_option,
> specific_file):
>
>
> def main():
> - parser = argparse.ArgumentParser(description='Run nft tests',
> version='1.0')
> + parser = argparse.ArgumentParser(description='Run nft tests')
>
> parser.add_argument('filenames', nargs='*', metavar='path/to/file.t',
> help='Run only these tests')
> @@ -1341,6 +1386,12 @@ def main():
> dest='enable_json',
> help='test JSON functionality as well')
>
> + parser.add_argument('-N', '--netns', action='store_true',
> + help='Test namespace path')
> +
> + parser.add_argument('-v', '--version', action='version', version='1.0',
> + help='prints the version information')
> +
> args = parser.parse_args()
> global debug_option, need_fix_option, enable_json_option
> debug_option = args.debug
> @@ -1353,15 +1404,15 @@ def main():
> signal.signal(signal.SIGTERM, signal_handler)
>
> if os.getuid() != 0:
> - print "You need to be root to run this, sorry"
> + print("You need to be root to run this, sorry")
> return
>
> # Change working directory to repository root
> os.chdir(TESTS_PATH + "/../..")
>
> if not os.path.exists('src/.libs/libnftables.so'):
> - print "The nftables library does not exist. " \
> - "You need to build the project."
> + print("The nftables library does not exist. " \
> + "You need to build the project.")
> return
>
> global nftables
> @@ -1411,18 +1462,18 @@ def main():
> run_total += file_unit_run
>
> if test_files == 0:
> - print "No test files to run"
> + print("No test files to run")
> else:
> if not specific_file:
> if force_all_family_option:
> - print "%d test files, %d files passed, %d unit tests, " \
> + print("%d test files, %d files passed, %d unit tests, " \
> "%d total executed, %d error, %d warning" \
> % (test_files, files_ok, tests, run_total, errors,
> - warnings)
> + warnings))
> else:
> - print "%d test files, %d files passed, %d unit tests, " \
> + print("%d test files, %d files passed, %d unit tests, " \
> "%d error, %d warning" \
> - % (test_files, files_ok, tests, errors, warnings)
> + % (test_files, files_ok, tests, errors, warnings))
>
>
> if __name__ == '__main__':
> --
> 2.21.0.windows.1
>
--
Shivani
https://about.me/shivani.bhardwaj