@@ -70,6 +70,8 @@ def loadYangModel(self):
70
70
self ._loadJsonYangModel ()
71
71
# create a map from config DB table to yang container
72
72
self ._createDBTableToModuleMap ()
73
+ # compile uses clause (embed into schema)
74
+ self ._compileUsesClause ()
73
75
except Exception as e :
74
76
self .sysLog (msg = "Yang Models Load failed:{}" .format (str (e )), \
75
77
debug = syslog .LOG_ERR , doPrint = True )
@@ -128,8 +130,9 @@ def _preProcessYangGrouping(self, moduleName, module):
128
130
129
131
for grouping in groupings :
130
132
gName = grouping ["@name" ]
131
- gLeaf = grouping ["leaf" ]
132
- self .preProcessedYang ['grouping' ][moduleName ][gName ] = gLeaf
133
+ self .preProcessedYang ['grouping' ][moduleName ][gName ] = dict ()
134
+ self .preProcessedYang ['grouping' ][moduleName ][gName ]["leaf" ] = grouping .get ('leaf' )
135
+ self .preProcessedYang ['grouping' ][moduleName ][gName ]["leaf-list" ] = grouping .get ('leaf-list' )
133
136
134
137
except Exception as e :
135
138
self .sysLog (msg = "_preProcessYangGrouping failed:{}" .format (str (e )), \
@@ -160,6 +163,78 @@ def _preProcessYang(self, moduleName, module):
160
163
raise e
161
164
return
162
165
166
+ def _compileUsesClauseList (self , model , group , name ):
167
+ # If group doesn't have this entry, nothing to do.
168
+ if not group .get (name ):
169
+ return
170
+
171
+ # model doesn't have this entry type, create it as a list
172
+ if not model .get (name ):
173
+ model [name ] = []
174
+
175
+ # model has this entry type, but its not a list, convert
176
+ if not isinstance (model .get (name ), list ):
177
+ model [name ] = [ model [name ] ]
178
+
179
+ if isinstance (group .get (name ), list ):
180
+ model [name ].extend (group .get (name ))
181
+ else :
182
+ model [name ].append (group .get (name ))
183
+
184
+ # Recursively process the yang schema looking for the "uses" clause under
185
+ # "container" and "list" nodes. Merge in the "uses" dictionaries for leaf
186
+ # and leaf-list so callers don't need to try to do their own "uses"
187
+ # processing. Remove the "uses" member when processed so anyone expecting
188
+ # it won't try to re-process. It will just look like a yang model that
189
+ # doesn't use "uses" so shouldn't cause compatibility issues.
190
+ def _compileUsesClauseModel (self , module , model ):
191
+ if isinstance (model , list ):
192
+ for item in model :
193
+ self ._compileUsesClauseModel (module , item )
194
+ return
195
+
196
+ node = model .get ("container" )
197
+ if node :
198
+ self ._compileUsesClauseModel (module , node )
199
+
200
+ node = model .get ("list" )
201
+ if node :
202
+ self ._compileUsesClauseModel (module , node )
203
+
204
+ uses_s = model .get ("uses" )
205
+ if not uses_s :
206
+ return
207
+
208
+ # Always make as a list
209
+ if isinstance (uses_s , dict ):
210
+ uses_s = [uses_s ]
211
+
212
+ # uses Example: "@name": "bgpcmn:sonic-bgp-cmn"
213
+ for uses in uses_s :
214
+ # Assume ':' means reference to another module
215
+ if ':' in uses ['@name' ]:
216
+ prefix = uses ['@name' ].split (':' )[0 ].strip ()
217
+ uses_module_name = self ._findYangModuleFromPrefix (prefix , module )
218
+ else :
219
+ uses_module_name = module ['@name' ]
220
+ grouping = uses ['@name' ].split (':' )[- 1 ].strip ()
221
+ groupdata = self .preProcessedYang ['grouping' ][uses_module_name ][grouping ]
222
+
223
+ # Merge leaf from uses
224
+ self ._compileUsesClauseList (model , groupdata , 'leaf' )
225
+ self ._compileUsesClauseList (model , groupdata , 'leaf-list' )
226
+
227
+ # Delete the uses node so callers don't use it.
228
+ del model ["uses" ]
229
+
230
+ def _compileUsesClause (self ):
231
+ try :
232
+ for module in self .yJson :
233
+ self ._compileUsesClauseModel (module ["module" ], module ["module" ])
234
+ except Exception as e :
235
+ traceback .print_exc ()
236
+ raise e
237
+
163
238
"""
164
239
Create a map from config DB tables to container in yang model
165
240
This module name and topLevelContainer are fetched considering YANG models are
@@ -320,44 +395,6 @@ def _findYangModuleFromPrefix(self, prefix, module):
320
395
raise e
321
396
return None
322
397
323
- def _fillLeafDictUses (self , uses_s , table , leafDict ):
324
- '''
325
- Find the leaf(s) in a grouping which maps to given uses statement,
326
- then fill leafDict with leaf(s) information.
327
-
328
- Parameters:
329
- uses_s (str): uses statement in yang module.
330
- table (str): config DB table, this table is being translated.
331
- leafDict (dict): dict with leaf(s) information for List\Container
332
- corresponding to config DB table.
333
-
334
- Returns:
335
- (void)
336
- '''
337
- try :
338
- # make a list
339
- if isinstance (uses_s , dict ):
340
- uses_s = [uses_s ]
341
- # find yang module for current table
342
- table_module = self .confDbYangMap [table ]['yangModule' ]
343
- # uses Example: "@name": "bgpcmn:sonic-bgp-cmn"
344
- for uses in uses_s :
345
- # Assume ':' means reference to another module
346
- if ':' in uses ['@name' ]:
347
- prefix = uses ['@name' ].split (':' )[0 ].strip ()
348
- uses_module_name = self ._findYangModuleFromPrefix (prefix , table_module )
349
- else :
350
- uses_module_name = table_module ['@name' ]
351
- grouping = uses ['@name' ].split (':' )[- 1 ].strip ()
352
- leafs = self .preProcessedYang ['grouping' ][uses_module_name ][grouping ]
353
- self ._fillLeafDict (leafs , leafDict )
354
- except Exception as e :
355
- self .sysLog (msg = "_fillLeafDictUses failed:{}" .format (str (e )), \
356
- debug = syslog .LOG_ERR , doPrint = True )
357
- raise e
358
-
359
- return
360
-
361
398
def _createLeafDict (self , model , table ):
362
399
'''
363
400
create a dict to map each key under primary key with a leaf in yang model.
@@ -394,10 +431,6 @@ def _createLeafDict(self, model, table):
394
431
# leaf-lists
395
432
self ._fillLeafDict (model .get ('leaf-list' ), leafDict , True )
396
433
397
- # uses should map to grouping,
398
- if model .get ('uses' ) is not None :
399
- self ._fillLeafDictUses (model .get ('uses' ), table , leafDict )
400
-
401
434
return leafDict
402
435
403
436
"""
0 commit comments