[test] Adding platform.json configuration file unit test (#3911)

- What I did
In order to allow the SONiC community to check in platform capability file i.e. platform.json
file directly under device folder. We need to add this test to make sure the contents of the this file is compliant with platform capability design specified in DPB HLD doc

- How I did it
Added platformJson_checker.py file in Test folder.

Signed-off-by: Sangita Maity <sangitamaity0211@gmail.com>
This commit is contained in:
Sangita Maity 2020-06-04 16:11:15 -07:00 committed by GitHub
parent 4ea2e5e6dc
commit 65fa874ec5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 103 additions and 1 deletions

View File

@ -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
./platform_json_checker $$f
done
popd

View File

@ -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

View File

@ -0,0 +1,99 @@
#!/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")
# TODO: need to remove basestring once migrate to Python 3 and just change to str
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] + " <platform_json_file>"
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
# 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
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:])