From ff82b169f562755001f9055d6566e95df4d61063 Mon Sep 17 00:00:00 2001 From: Sangita Maity Date: Thu, 5 Dec 2019 11:23:06 -0800 Subject: [PATCH 1/3] [test] Adding platform.json configuration file test Signed-off-by: Sangita Maity --- src/sonic-device-data/src/Makefile | 3 + src/sonic-device-data/tests/media_checker | 2 +- .../tests/platformJson_checker | 102 ++++++++++++++++++ 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100755 src/sonic-device-data/tests/platformJson_checker diff --git a/src/sonic-device-data/src/Makefile b/src/sonic-device-data/src/Makefile index aca0cbea2a4d..b47dd383fb0c 100644 --- a/src/sonic-device-data/src/Makefile +++ b/src/sonic-device-data/src/Makefile @@ -11,4 +11,7 @@ test: for f in $$(find ../../../device -name media_settings.json); do ./media_checker $$f done + for f in $$(find ../../../device -name platform.json); do + ./platformJson_checker $$f + done popd diff --git a/src/sonic-device-data/tests/media_checker b/src/sonic-device-data/tests/media_checker index 6b4139585a24..132756cb4b77 100755 --- a/src/sonic-device-data/tests/media_checker +++ b/src/sonic-device-data/tests/media_checker @@ -138,7 +138,7 @@ def main(argv): # Load target file if len(argv) == 0: - files = glob.glob('*.json') + files = glob.glob('*media_settings.json') else: files = argv diff --git a/src/sonic-device-data/tests/platformJson_checker b/src/sonic-device-data/tests/platformJson_checker new file mode 100755 index 000000000000..b51c4d2d4cf5 --- /dev/null +++ b/src/sonic-device-data/tests/platformJson_checker @@ -0,0 +1,102 @@ +#!/usr/bin/env python +try: + import re + import sys + import glob + import json +except ImportError as e: + raise ImportError (str(e) + "- required module not found") +try: + basestring +except NameError: + basestring = str + +# Global variable +PORT_ATTRIBUTES = ["index", "lanes", "alias_at_lanes", "breakout_modes"] +ATTR_LEN = len(PORT_ATTRIBUTES) +PORT_REG = "Ethernet(\d+)" +PLATFORM_JSON = '*platform.json' +INTF_KEY = "interfaces" + +def usage(): + print "Usage: " + sys.argv[0] + " " + sys.exit(1) + + +def check_port_attr(port_attr): + for each_key in port_attr: + if each_key not in PORT_ATTRIBUTES: + print "Error: "+ each_key + " is not the correct Port attribute." + return False + if not port_attr[each_key]: + print "Error: "+ each_key + " has no value." + return False + if not isinstance(port_attr[each_key], basestring): + print "Error:value type of "+ each_key + " must be string." + return False + return True + +def check_file(platform_json_file): + try: + platform_cap_file = open(platform_json_file,"r") + platform_file_data = platform_cap_file.read() + port_dict = json.loads(platform_file_data) + + for each_port in port_dict[INTF_KEY]: + + # Validate port at top level + port_id = re.search(PORT_REG, each_port) + if port_id is None: + print "Error: Unknown Interface " + str(each_port) + " at top level" + return False + + total_attr = len(port_dict[INTF_KEY][each_port].keys()) + port_attr = port_dict[INTF_KEY][each_port] + + if total_attr != ATTR_LEN: + missing_attr = ', '.join(set(PORT_ATTRIBUTES).difference(list(port_attr))) + print "Error: " + missing_attr + " of " + each_port + " is/are missing" + return False + + #Validate port attributes for each port + if not check_port_attr(port_attr): + return False + + except IOError: + print "Error: Cannot open file " + platform_json_file + return False + except ValueError,e: + print "Error in parsing json file " + platform_json_file + " " + print str(e) + return False + + return True + + +def main(argv): + + if len(argv) > 0 and argv[0] == "-h": + usage() + + # Load target file + if len(argv) == 0: + files = glob.glob(PLATFORM_JSON) + else: + files = argv + + all_good = True + + for f in files: + good = check_file(f) + if good: + print "File " + f + " passed validity check" + else: + print "File " + f + " failed validity check" + + all_good = all_good and good + + if not all_good: + sys.exit(-1) + +if __name__ == "__main__": + main(sys.argv[1:]) From 21a5ab2e136175bdd0a7403c53edc15ca88b3101 Mon Sep 17 00:00:00 2001 From: Sangita Maity Date: Tue, 19 May 2020 01:06:55 +0000 Subject: [PATCH 2/3] Rename platform_json_checker function and fix identification issue Signed-off-by: Sangita Maity --- src/sonic-device-data/src/Makefile | 2 +- .../tests/{platformJson_checker => platform_json_checker} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/sonic-device-data/tests/{platformJson_checker => platform_json_checker} (98%) diff --git a/src/sonic-device-data/src/Makefile b/src/sonic-device-data/src/Makefile index b47dd383fb0c..10525fdeb27e 100644 --- a/src/sonic-device-data/src/Makefile +++ b/src/sonic-device-data/src/Makefile @@ -12,6 +12,6 @@ test: ./media_checker $$f done for f in $$(find ../../../device -name platform.json); do - ./platformJson_checker $$f + ./platform_json_checker $$f done popd diff --git a/src/sonic-device-data/tests/platformJson_checker b/src/sonic-device-data/tests/platform_json_checker similarity index 98% rename from src/sonic-device-data/tests/platformJson_checker rename to src/sonic-device-data/tests/platform_json_checker index b51c4d2d4cf5..535b40581d22 100755 --- a/src/sonic-device-data/tests/platformJson_checker +++ b/src/sonic-device-data/tests/platform_json_checker @@ -7,9 +7,9 @@ try: except ImportError as e: raise ImportError (str(e) + "- required module not found") try: - basestring + basestring except NameError: - basestring = str + basestring = str # Global variable PORT_ATTRIBUTES = ["index", "lanes", "alias_at_lanes", "breakout_modes"] From f77a485134f219a258221da99f06d950a02dd612 Mon Sep 17 00:00:00 2001 From: Sangita Maity Date: Wed, 3 Jun 2020 01:03:49 +0000 Subject: [PATCH 3/3] Addressing review comments Signed-off-by: Sangita Maity --- src/sonic-device-data/tests/platform_json_checker | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/sonic-device-data/tests/platform_json_checker b/src/sonic-device-data/tests/platform_json_checker index 535b40581d22..c0257a27e80c 100755 --- a/src/sonic-device-data/tests/platform_json_checker +++ b/src/sonic-device-data/tests/platform_json_checker @@ -6,6 +6,8 @@ try: import json except ImportError as e: raise ImportError (str(e) + "- required module not found") + +# TODO: need to remove basestring once migrate to Python 3 and just change to str try: basestring except NameError: @@ -22,7 +24,6 @@ def usage(): print "Usage: " + sys.argv[0] + " " sys.exit(1) - def check_port_attr(port_attr): for each_key in port_attr: if each_key not in PORT_ATTRIBUTES: @@ -31,6 +32,7 @@ def check_port_attr(port_attr): if not port_attr[each_key]: print "Error: "+ each_key + " has no value." return False + # TODO: need to remove basestring once migrate to Python 3 and just change to str if not isinstance(port_attr[each_key], basestring): print "Error:value type of "+ each_key + " must be string." return False @@ -43,7 +45,6 @@ def check_file(platform_json_file): port_dict = json.loads(platform_file_data) for each_port in port_dict[INTF_KEY]: - # Validate port at top level port_id = re.search(PORT_REG, each_port) if port_id is None: @@ -61,7 +62,6 @@ def check_file(platform_json_file): #Validate port attributes for each port if not check_port_attr(port_attr): return False - except IOError: print "Error: Cannot open file " + platform_json_file return False @@ -69,12 +69,9 @@ def check_file(platform_json_file): print "Error in parsing json file " + platform_json_file + " " print str(e) return False - return True - def main(argv): - if len(argv) > 0 and argv[0] == "-h": usage()