Skip to content

Commit

Permalink
[config] add sanity check for hwsku
Browse files Browse the repository at this point in the history
  • Loading branch information
dmytroxshevchuk committed Jan 21, 2021
1 parent 0eed960 commit 427903e
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 0 deletions.
3 changes: 3 additions & 0 deletions src/sonic-device-data/src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@ test:
for f in $$(find ../../../device -name platform.json); do
./platform_json_checker $$f
done
for f in $$(find ../../../device -name hwsku.json); do
./hwsku_json_checker $$f
done
popd
91 changes: 91 additions & 0 deletions src/sonic-device-data/tests/hwsku_json_checker
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
#!/usr/bin/env python3

import glob
import json
import re
import sys

# Global variable
PORT_ATTRIBUTES = ["default_brkout_mode"]
OPTIONAL_PORT_ATTRIBUTES = ["fec", "autoneg"]
PORT_REG = "Ethernet(\d+)"
HWSKU_JSON = '*hwsku.json'
INTF_KEY = "interfaces"

def usage():
print("Usage: " + sys.argv[0] + " <hwsku_json_file>")
sys.exit(1)

def check_port_attr(port_attr):
for each_key in port_attr:
if each_key not in PORT_ATTRIBUTES and each_key not in OPTIONAL_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], str):
print("Error:value type of " + each_key + " must be string.")
return False
return True

def check_file(hwsku_json_file):
try:
hwsku_cap_file = open(hwsku_json_file,"r")
hwsku_data_data = hwsku_cap_file.read()
hwsku_dict = json.loads(hwsku_data_data)

for each_port in hwsku_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

port_attr = hwsku_dict[INTF_KEY][each_port]

# Check mandatory attributes
for each_key in PORT_ATTRIBUTES:
if each_key not in port_attr:
print("Error: " + each_key + " 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 " + hwsku_json_file)
return False
except ValueError as e:
print("Error in parsing json file " + hwsku_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(HWSKU_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:])

0 comments on commit 427903e

Please sign in to comment.