diff --git a/src/sonic-yang-mgmt/sonic_yang_ext.py b/src/sonic-yang-mgmt/sonic_yang_ext.py index 845588d70dbd..86987562f0b2 100644 --- a/src/sonic-yang-mgmt/sonic_yang_ext.py +++ b/src/sonic-yang-mgmt/sonic_yang_ext.py @@ -8,12 +8,14 @@ from xmltodict import parse from glob import glob -qos_maps_model = ['DSCP_TO_TC_MAP_LIST', - 'DOT1P_TO_TC_MAP_LIST', - 'TC_TO_PRIORITY_GROUP_MAP_LIST', - 'TC_TO_QUEUE_MAP_LIST', - 'MAP_PFC_PRIORITY_TO_QUEUE_LIST', - 'PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_LIST'] +Type_1_list_maps_model = ['DSCP_TO_TC_MAP_LIST', + 'DOT1P_TO_TC_MAP_LIST', + 'TC_TO_PRIORITY_GROUP_MAP_LIST', + 'TC_TO_QUEUE_MAP_LIST', + 'MAP_PFC_PRIORITY_TO_QUEUE_LIST', + 'PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_LIST', + 'DSCP_TO_FC_MAP_LIST', + 'EXP_TO_FC_MAP_LIST'] """ This is the Exception thrown out of all public function of this class. @@ -413,7 +415,7 @@ def _yangConvert(val): return vValue """ - Xlate a Qos Maps list + Xlate a Type 1 map list This function will xlate from a dict in config DB to a Yang JSON list using yang model. Output will be go in self.xlateJson @@ -421,7 +423,7 @@ def _yangConvert(val): are displayed only when an entry is not xlated properly from ConfigDB to sonic_yang.json. - QOS MAPS Yang has inner list, which is diffrent from config DB. + Type 1 Lists have inner list, which is diffrent from config DB. Each field value in config db should be converted to inner list with key and value. Example: @@ -465,7 +467,7 @@ def _yangConvert(val): } } """ - def _xlateQosMapList(self, model, yang, config, table, exceptionList): + def _xlateType1MapList(self, model, yang, config, table, exceptionList): #create a dict to map each key under primary key with a dict yang model. #This is done to improve performance of mapping from values of TABLEs in @@ -524,12 +526,12 @@ def _xlateQosMapList(self, model, yang, config, table, exceptionList): to sonic_yang.json. """ def _xlateList(self, model, yang, config, table, exceptionList): - - #Qos Map lists needs special handling because of inner yang list and - #config db format. - if model['@name'] in qos_maps_model: - self.sysLog(msg="_xlateQosMapList: {}".format(model['@name'])) - self._xlateQosMapList(model, yang,config, table, exceptionList) + + # Type 1 lists need special handling because of inner yang list and + # config db format. + if model['@name'] in Type_1_list_maps_model: + self.sysLog(msg="_xlateType1MapList: {}".format(model['@name'])) + self._xlateType1MapList(model, yang, config, table, exceptionList) return #create a dict to map each key under primary key with a dict yang model. @@ -744,7 +746,7 @@ def _revYangConvert(val): """ Rev xlate from _LIST to table in config DB - QOS MAP Yang has inner list, each inner list key:val should + Type 1 Lists have inner list, each inner list key:val should be mapped to field:value in Config DB. Example: @@ -788,14 +790,14 @@ def _revYangConvert(val): } """ - def _revQosMapXlateList(self, model, yang, config, table): + def _revXlateType1MapList(self, model, yang, config, table): # get keys from YANG model list itself listKeys = model['key']['@value'] # create a dict to map each key under primary key with a dict yang model. # This is done to improve performance of mapping from values of TABLEs in # config DB to leaf in YANG LIST. - # Gather inner list key and value from model + # Gather inner list key and value from model inner_clist = model.get('list') if inner_clist: inner_listKey = inner_clist['key']['@value'] @@ -824,10 +826,10 @@ def _revQosMapXlateList(self, model, yang, config, table): Rev xlate from
_LIST to table in config DB """ def _revXlateList(self, model, yang, config, table): - - # special processing for QOS Map table. - if model['@name'] in qos_maps_model: - self._revQosMapXlateList(model, yang, config, table) + + # special processing for Type 1 Map tables. + if model['@name'] in Type_1_list_maps_model: + self._revXlateType1MapList(model, yang, config, table) return # get keys from YANG model list itself diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 7ef362c008ba..e25e8d03f81e 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -79,6 +79,8 @@ './yang-models/sonic-scheduler.yang', './yang-models/sonic-wred-profile.yang', './yang-models/sonic-queue.yang', + './yang-models/sonic-dscp-fc-map.yang', + './yang-models/sonic-exp-fc-map.yang', './yang-models/sonic-dscp-tc-map.yang', './yang-models/sonic-dot1p-tc-map.yang', './yang-models/sonic-tc-priority-group-map.yang', diff --git a/src/sonic-yang-models/tests/files/sample_config_db.json b/src/sonic-yang-models/tests/files/sample_config_db.json index 35cb22074106..4b89e4486a9c 100644 --- a/src/sonic-yang-models/tests/files/sample_config_db.json +++ b/src/sonic-yang-models/tests/files/sample_config_db.json @@ -1188,7 +1188,29 @@ "scheduler": "TEST@1", "wred_profile": "Wred1" } - }, + }, + + "DSCP_TO_FC_MAP": { + "Dscp_to_fc_map1": { + "1": "1", + "2": "2" + }, + "Dscp_to_fc_map2": { + "3": "3", + "4": "4" + } + }, + + "EXP_TO_FC_MAP": { + "Exp_to_fc_map1": { + "1": "1", + "2": "2" + }, + "Exp_to_fc_map2": { + "3": "3", + "4": "4" + } + }, "DSCP_TO_TC_MAP": { "Dscp_to_tc_map1": { diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/cbfmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests/cbfmaps.json new file mode 100644 index 000000000000..0c76844dcf44 --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests/cbfmaps.json @@ -0,0 +1,24 @@ +{ + "DSCP_TO_FC_MAP_CREATE": { + "desc": "Configure a DSCP to Forwarding class map." + }, + "DSCP_TO_FC_MAP_CREATE_INVALID_DSCP": { + "desc": "Configure a DSCP to Forwarding class map with invalid key.", + "eStr": "Invalid DSCP" + }, + "DSCP_TO_FC_MAP_CREATE_INVALID_FC": { + "desc": "Configure a DSCP to Forwarding class map with invalid value.", + "eStr": "Invalid Forwarding Class" + }, + "EXP_TO_FC_MAP_CREATE": { + "desc": "Configure a EXP to Forwarding class map." + }, + "EXP_TO_FC_MAP_CREATE_INVALID_EXP": { + "desc": "Configure a EXP to Forwarding class map with invalid key.", + "eStr": "Invalid EXP" + }, + "EXP_TO_FC_MAP_CREATE_INVALID_FC": { + "desc": "Configure a EXP to Forwarding class map with invalid value.", + "eStr": "Invalid Forwarding Class" + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/cbfmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/cbfmaps.json new file mode 100644 index 000000000000..01829df92bae --- /dev/null +++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/cbfmaps.json @@ -0,0 +1,159 @@ +{ + "DSCP_TO_FC_MAP_CREATE": { + "sonic-dscp-fc-map:sonic-dscp-fc-map": { + "sonic-dscp-fc-map:DSCP_TO_FC_MAP": { + "DSCP_TO_FC_MAP_LIST": [ + { + "name": "map1", + "DSCP_TO_FC_MAP": [ + { + "dscp": "1", + "fc": "1" + }, + { + "dscp":"2", + "fc":"2" + } + ] + }, + { + "name": "map2", + "DSCP_TO_FC_MAP": [ + { + "dscp": "1", + "fc": "1" + }, + { + "dscp":"2", + "fc":"2" + } + ] + } + ] + } + } + }, + + "DSCP_TO_FC_MAP_CREATE_INVALID_DSCP": { + "sonic-dscp-fc-map:sonic-dscp-fc-map": { + "sonic-dscp-fc-map:DSCP_TO_FC_MAP": { + "DSCP_TO_FC_MAP_LIST": [ + { + "name": "map3", + "DSCP_TO_FC_MAP": [ + { + "dscp": "64", + "fc": "1" + }, + { + "dscp":"2", + "fc":"2" + } + ] + } + ] + } + } + }, + + "DSCP_TO_FC_MAP_CREATE_INVALID_FC": { + "sonic-dscp-fc-map:sonic-dscp-fc-map": { + "sonic-dscp-fc-map:DSCP_TO_FC_MAP": { + "DSCP_TO_FC_MAP_LIST": [ + { + "name": "map3", + "DSCP_TO_FC_MAP": [ + { + "dscp": "1", + "fc": "8" + }, + { + "dscp":"2", + "fc":"2" + } + ] + } + ] + } + } + }, + + "EXP_TO_FC_MAP_CREATE": { + "sonic-exp-fc-map:sonic-exp-fc-map": { + "sonic-exp-fc-map:EXP_TO_FC_MAP": { + "EXP_TO_FC_MAP_LIST": [ + { + "name": "map1", + "EXP_TO_FC_MAP": [ + { + "exp": "1", + "fc": "1" + }, + { + "exp":"2", + "fc":"2" + } + ] + }, + { + "name": "map2", + "EXP_TO_FC_MAP": [ + { + "exp": "1", + "fc": "1" + }, + { + "exp":"2", + "fc":"2" + } + ] + } + ] + } + } + }, + + "EXP_TO_FC_MAP_CREATE_INVALID_EXP": { + "sonic-exp-fc-map:sonic-exp-fc-map": { + "sonic-exp-fc-map:EXP_TO_FC_MAP": { + "EXP_TO_FC_MAP_LIST": [ + { + "name": "map3", + "EXP_TO_FC_MAP": [ + { + "exp": "8", + "fc": "1" + }, + { + "exp":"2", + "fc":"2" + } + ] + } + ] + } + } + }, + + "EXP_TO_FC_MAP_CREATE_INVALID_FC": { + "sonic-exp-fc-map:sonic-exp-fc-map": { + "sonic-exp-fc-map:EXP_TO_FC_MAP": { + "EXP_TO_FC_MAP_LIST": [ + { + "name": "map3", + "EXP_TO_FC_MAP": [ + { + "exp": "1", + "fc": "8" + }, + { + "exp":"2", + "fc":"2" + } + ] + } + ] + } + } + } +} \ No newline at end of file diff --git a/src/sonic-yang-models/yang-models/sonic-dscp-fc-map.yang b/src/sonic-yang-models/yang-models/sonic-dscp-fc-map.yang new file mode 100644 index 000000000000..0b489a57bd0a --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-dscp-fc-map.yang @@ -0,0 +1,68 @@ +module sonic-dscp-fc-map { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-dscp-fc-map"; + + prefix dtm; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "DSCP_TO_FC_MAP yang Module for SONiC OS"; + + revision 2021-10-29 { + description + "Initial revision."; + } + + container sonic-dscp-fc-map { + + container DSCP_TO_FC_MAP { + + description "DSCP_TO_FC_MAP part of config_db.json"; + + list DSCP_TO_FC_MAP_LIST { + + key "name"; + + leaf name { + type string { + pattern '[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{0,31})'; + length 1..32 { + error-message "Invalid length for map name."; + error-app-tag map-name-invalid-length; + } + } + } + + list DSCP_TO_FC_MAP { //this is list inside list for storing mapping between two fields + + key "dscp"; + + leaf dscp { + type string { + pattern "6[0-3]|[1-5][0-9]?|[0-9]?" { + error-message "Invalid DSCP"; + error-app-tag dscp-invalid; + } + } + } + + leaf fc { + type string { + pattern "[0-7]?" { + error-message "Invalid Forwarding Class"; + error-app-tag fc-invalid; + } + } + } + } + } + } + } +} diff --git a/src/sonic-yang-models/yang-models/sonic-exp-fc-map.yang b/src/sonic-yang-models/yang-models/sonic-exp-fc-map.yang new file mode 100644 index 000000000000..79f492bff4f8 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-exp-fc-map.yang @@ -0,0 +1,68 @@ +module sonic-exp-fc-map { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-exp-fc-map"; + + prefix dtm; + + organization + "SONiC"; + + contact + "SONiC"; + + description + "EXP_TO_FC_MAP yang Module for SONiC OS"; + + revision 2021-10-29 { + description + "Initial revision."; + } + + container sonic-exp-fc-map { + + container EXP_TO_FC_MAP { + + description "EXP_TO_FC_MAP part of config_db.json"; + + list EXP_TO_FC_MAP_LIST { + + key "name"; + + leaf name { + type string { + pattern '[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{0,31})'; + length 1..32 { + error-message "Invalid length for map name."; + error-app-tag map-name-invalid-length; + } + } + } + + list EXP_TO_FC_MAP { //this is list inside list for storing mapping between two fields + + key "exp"; + + leaf exp { + type string { + pattern "[0-7]?" { + error-message "Invalid EXP"; + error-app-tag exp-invalid; + } + } + } + + leaf fc { + type string { + pattern "[0-7]?" { + error-message "Invalid Forwarding Class"; + error-app-tag fc-invalid; + } + } + } + } + } + } + } +}