[yang] Fix yang validation failure when table contains empty value (#10431)

Why I did it
Fix #9746

How I did it
Split the check condition based on non-exist and zero length.

How to verify it
Run verification script when table contains empty value
This commit is contained in:
jingwenxie 2022-04-06 17:46:41 -07:00 committed by GitHub
parent 8cd346d80b
commit d83ae1e3dc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 13 deletions

View File

@ -591,18 +591,23 @@ class SonicYangExtMixin:
"""
def _xlateContainerInContainer(self, model, yang, configC, table):
ccontainer = model
#print(ccontainer['@name'])
yang[ccontainer['@name']] = dict()
if not configC.get(ccontainer['@name']):
ccName = ccontainer['@name']
yang[ccName] = dict()
if ccName not in configC:
# Inner container doesn't exist in config
return
self.sysLog(msg="xlateProcessListOfContainer: {}".format(ccontainer['@name']))
self._xlateContainer(ccontainer, yang[ccontainer['@name']], \
configC[ccontainer['@name']], table)
if len(configC[ccName]) == 0:
# Empty container, clean config and return
del configC[ccName]
return
self.sysLog(msg="xlateProcessListOfContainer: {}".format(ccName))
self._xlateContainer(ccontainer, yang[ccName], \
configC[ccName], table)
# clean empty container
if len(yang[ccontainer['@name']]) == 0:
del yang[ccontainer['@name']]
if len(yang[ccName]) == 0:
del yang[ccName]
# remove copy after processing
del configC[ccontainer['@name']]
del configC[ccName]
return

View File

@ -364,5 +364,20 @@ class Test_SonicYang(object):
return
def test_special_json_with_yang(self, sonic_yang_data):
# in this test, we validate unusual json config and check if
# loadData works successfully
test_file = sonic_yang_data['test_file']
syc = sonic_yang_data['syc']
# read config
jIn = self.readIjsonInput(test_file, 'SAMPLE_CONFIG_DB_SPECIAL_CASE')
jIn = json.loads(jIn)
# load config and create Data tree
syc.loadData(jIn)
return
def teardown_class(self):
pass

View File

@ -304,7 +304,7 @@
"switch_id": "2",
"switch_type": "voq",
"max_cores": "8",
"sub_role": "FrondEnd",
"sub_role": "FrontEnd",
"dhcp_server": "disabled"
}
},
@ -1694,5 +1694,11 @@
"UNKNOWN_TABLE": {
"Error": "This Table is for testing, This Table does not have YANG models."
}
},
"SAMPLE_CONFIG_DB_SPECIAL_CASE": {
"TACPLUS": {
"global": {
}
}
}
}

View File

@ -129,7 +129,7 @@ module sonic-device_metadata {
leaf sub_role {
type string;
description "sub_role indicates if ASIC is FrondEnd or BackEnd.";
description "sub_role indicates if ASIC is FrontEnd or BackEnd.";
}
leaf downstream_subrole {