From 459d3d1f559e41f5fe9643eb7ef59bc4e6b4c2f0 Mon Sep 17 00:00:00 2001
From: ohu1 <55407253+ohu1@users.noreply.github.com>
Date: Tue, 19 Oct 2021 12:50:07 -0700
Subject: [PATCH] SONiC QoS MAPs and PORT_QOS_MAP Yang (#7375)
Why I did it
Created SONiC Yang model for the following QOS MAPs and PORT QOS MAP:
DSCP_TO_TC_MAP
DOT1P_TO_TC_MAP
TC_TO_QUEUE_MAP
TC_TO_PRIORITY_GROUP_MAP
MAP_PFC_PRIORITY_TO_QUEUE
PORT_QOS_MAP
How I did it
Defined Yang models for QOS MAPs based on Guideline doc:
https://github.com/Azure/SONiC/blob/master/doc/mgmt/SONiC_YANG_Model_Guidelines.md
and
https://github.com/Azure/sonic-utilities/blob/master/doc/Command-Reference.md
How to verify it
sonic_yang_models package build
The infra code was modified to handle the nested list definition in YANG and translate it to a flat list in DB.
---
src/sonic-yang-mgmt/sonic_yang_ext.py | 204 ++++-
src/sonic-yang-models/setup.py | 7 +
.../tests/files/sample_config_db.json | 87 +++
.../tests/yang_model_tests/tests/qosmaps.json | 104 +++
.../tests_config/qosmaps.json | 724 ++++++++++++++++++
.../yang-models/sonic-dot1p-tc-map.yang | 68 ++
.../yang-models/sonic-dscp-tc-map.yang | 68 ++
...sonic-pfc-priority-priority-group-map.yang | 68 ++
.../sonic-pfc-priority-queue-map.yang | 68 ++
.../yang-models/sonic-port-qos-map.yang | 110 +++
.../sonic-tc-priority-group-map.yang | 68 ++
.../yang-models/sonic-tc-queue-map.yang | 68 ++
12 files changed, 1640 insertions(+), 4 deletions(-)
create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json
create mode 100644 src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json
create mode 100644 src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang
create mode 100644 src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang
create mode 100644 src/sonic-yang-models/yang-models/sonic-pfc-priority-priority-group-map.yang
create mode 100644 src/sonic-yang-models/yang-models/sonic-pfc-priority-queue-map.yang
create mode 100644 src/sonic-yang-models/yang-models/sonic-port-qos-map.yang
create mode 100644 src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang
create mode 100644 src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang
diff --git a/src/sonic-yang-mgmt/sonic_yang_ext.py b/src/sonic-yang-mgmt/sonic_yang_ext.py
index 5438c81fb745..845588d70dbd 100644
--- a/src/sonic-yang-mgmt/sonic_yang_ext.py
+++ b/src/sonic-yang-mgmt/sonic_yang_ext.py
@@ -4,11 +4,17 @@
from __future__ import print_function
import yang as ly
import syslog
-
from json import dump, dumps, loads
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']
+
"""
This is the Exception thrown out of all public function of this class.
"""
@@ -406,6 +412,108 @@ def _yangConvert(val):
return vValue
+ """
+ Xlate a Qos Maps 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
+
+ Note: Exceptions from this function are collected in exceptionList and
+ 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.
+ Each field value in config db should be converted to inner list with
+ key and value.
+ Example:
+
+ Config DB:
+ "DSCP_TO_TC_MAP": {
+ "Dscp_to_tc_map1": {
+ "1": "1",
+ "2": "2"
+ }
+ }
+
+ YANG Model:
+ module: sonic-dscp-tc-map
+ +--rw sonic-dscp-tc-map
+ +--rw DSCP_TO_TC_MAP
+ +--rw DSCP_TO_TC_MAP_LIST* [name]
+ +--rw name string
+ +--rw DSCP_TO_TC_MAP* [dscp]
+ +--rw dscp string
+ +--rw tc? string
+
+ YANG JSON:
+ "sonic-dscp-tc-map:sonic-dscp-tc-map": {
+ "sonic-dscp-tc-map:DSCP_TO_TC_MAP": {
+ "DSCP_TO_TC_MAP_LIST": [
+ {
+ "name": "map3",
+ "DSCP_TO_TC_MAP": [
+ {
+ "dscp": "64",
+ "tc": "1"
+ },
+ {
+ "dscp":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ """
+ def _xlateQosMapList(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
+ #config DB to leaf in YANG LIST.
+ inner_clist = model.get('list')
+ if inner_clist:
+ inner_listKey = inner_clist['key']['@value']
+ inner_leafDict = self._createLeafDict(inner_clist, table)
+ for lkey in inner_leafDict:
+ if inner_listKey != lkey:
+ inner_listVal = lkey
+
+ # get keys from YANG model list itself
+ listKeys = model['key']['@value']
+ self.sysLog(msg="xlateList keyList:{}".format(listKeys))
+ primaryKeys = list(config.keys())
+ for pkey in primaryKeys:
+ try:
+ vKey = None
+ self.sysLog(syslog.LOG_DEBUG, "xlateList Extract pkey:{}".\
+ format(pkey))
+ # Find and extracts key from each dict in config
+ keyDict = self._extractKey(pkey, listKeys)
+
+ if inner_clist:
+ inner_yang_list = list()
+ for vKey in config[pkey]:
+ inner_keyDict = dict()
+ self.sysLog(syslog.LOG_DEBUG, "xlateList Key {} vkey {} Val {} vval {}".\
+ format(inner_listKey, str(vKey), inner_listVal, str(config[pkey][vKey])))
+ inner_keyDict[inner_listKey] = str(vKey)
+ inner_keyDict[inner_listVal] = str(config[pkey][vKey])
+ inner_yang_list.append(inner_keyDict)
+
+ keyDict[inner_clist['@name']] = inner_yang_list
+ yang.append(keyDict)
+ # delete pkey from config, done to match one key with one list
+ del config[pkey]
+
+ except Exception as e:
+ # log debug, because this exception may occur with multilists
+ self.sysLog(msg="xlateList Exception:{}".format(str(e)), \
+ debug=syslog.LOG_DEBUG, doPrint=True)
+ exceptionList.append(str(e))
+ # with multilist, we continue matching other keys.
+ continue
+ return
+
"""
Xlate a list
This function will xlate from a dict in config DB to a Yang JSON list
@@ -416,16 +524,22 @@ def _yangConvert(val):
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)
+ return
#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.
- leafDict = self._createLeafDict(model, table)
+ leafDict = self._createLeafDict(model, table)
# get keys from YANG model list itself
listKeys = model['key']['@value']
self.sysLog(msg="xlateList keyList:{}".format(listKeys))
-
primaryKeys = list(config.keys())
for pkey in primaryKeys:
try:
@@ -459,7 +573,6 @@ def _xlateList(self, model, yang, config, table, exceptionList):
"""
def _xlateListInContainer(self, model, yang, configC, table, exceptionList):
clist = model
- #print(clist['@name'])
yang[clist['@name']] = list()
self.sysLog(msg="xlateProcessListOfContainer: {}".format(clist['@name']))
self._xlateList(clist, yang[clist['@name']], configC, table, exceptionList)
@@ -629,10 +742,93 @@ def _revYangConvert(val):
return vValue
+ """
+ Rev xlate from
_LIST to table in config DB
+ QOS MAP Yang has inner list, each inner list key:val should
+ be mapped to field:value in Config DB.
+ Example:
+
+ YANG:
+ module: sonic-dscp-tc-map
+ +--rw sonic-dscp-tc-map
+ +--rw DSCP_TO_TC_MAP
+ +--rw DSCP_TO_TC_MAP_LIST* [name]
+ +--rw name string
+ +--rw DSCP_TO_TC_MAP* [dscp]
+ +--rw dscp string
+ +--rw tc? string
+
+ YANG JSON:
+ "sonic-dscp-tc-map:sonic-dscp-tc-map": {
+ "sonic-dscp-tc-map:DSCP_TO_TC_MAP": {
+ "DSCP_TO_TC_MAP_LIST": [
+ {
+ "name": "map3",
+ "DSCP_TO_TC_MAP": [
+ {
+ "dscp": "64",
+ "tc": "1"
+ },
+ {
+ "dscp":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+
+ Config DB:
+ "DSCP_TO_TC_MAP": {
+ "Dscp_to_tc_map1": {
+ "1": "1",
+ "2": "2"
+ }
+ }
+ """
+
+ def _revQosMapXlateList(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
+ inner_clist = model.get('list')
+ if inner_clist:
+ inner_listKey = inner_clist['key']['@value']
+ inner_leafDict = self._createLeafDict(inner_clist, table)
+ for lkey in inner_leafDict:
+ if inner_listKey != lkey:
+ inner_listVal = lkey
+
+ # list with name _LIST should be removed,
+ if "_LIST" in model['@name']:
+ for entry in yang:
+ # create key of config DB table
+ pkey, pkeydict = self._createKey(entry, listKeys)
+ self.sysLog(syslog.LOG_DEBUG, "revXlateList pkey:{}".format(pkey))
+ config[pkey]= dict()
+ # fill rest of the entries
+ inner_list = entry[inner_clist['@name']]
+ for index in range(len(inner_list)):
+ self.sysLog(syslog.LOG_DEBUG, "revXlateList fkey:{} fval {}".\
+ format(str(inner_list[index][inner_listKey]),\
+ str(inner_list[index][inner_listVal])))
+ config[pkey][str(inner_list[index][inner_listKey])] = str(inner_list[index][inner_listVal])
+ return
+
"""
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)
+ return
# get keys from YANG model list itself
listKeys = model['key']['@value']
diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py
index 0ffc2dfd3ab8..a5a74f1b4cba 100644
--- a/src/sonic-yang-models/setup.py
+++ b/src/sonic-yang-models/setup.py
@@ -79,6 +79,13 @@
'./yang-models/sonic-scheduler.yang',
'./yang-models/sonic-wred-profile.yang',
'./yang-models/sonic-queue.yang',
+ './yang-models/sonic-dscp-tc-map.yang',
+ './yang-models/sonic-dot1p-tc-map.yang',
+ './yang-models/sonic-tc-priority-group-map.yang',
+ './yang-models/sonic-tc-queue-map.yang',
+ './yang-models/sonic-pfc-priority-queue-map.yang',
+ './yang-models/sonic-pfc-priority-priority-group-map.yang',
+ './yang-models/sonic-port-qos-map.yang',
'./yang-models/sonic_yang_tree']),
],
zip_safe=False,
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 a53c58eae7e9..35cb22074106 100644
--- a/src/sonic-yang-models/tests/files/sample_config_db.json
+++ b/src/sonic-yang-models/tests/files/sample_config_db.json
@@ -1188,6 +1188,93 @@
"scheduler": "TEST@1",
"wred_profile": "Wred1"
}
+ },
+
+ "DSCP_TO_TC_MAP": {
+ "Dscp_to_tc_map1": {
+ "1": "1",
+ "2": "2"
+ },
+ "Dscp_to_tc_map2": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+
+ "DOT1P_TO_TC_MAP": {
+ "Dot1p_to_tc_map1": {
+ "1": "1",
+ "2": "2"
+ },
+ "Dot1p_to_tc_map2": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+
+ "TC_TO_PRIORITY_GROUP_MAP": {
+ "tc_to_pg_map1": {
+ "1": "1",
+ "2": "2"
+ },
+ "tc_to_pg_map2": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+
+ "TC_TO_QUEUE_MAP": {
+ "tc_to_q_map1": {
+ "1": "1",
+ "2": "2"
+ },
+ "tc_to_q_map2": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+
+ "MAP_PFC_PRIORITY_TO_QUEUE": {
+ "pfc_prio_to_q_map1": {
+ "1": "1",
+ "2": "2"
+ },
+ "pfc_prio_to_q_map2": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": {
+ "pfc_prio_to_pg_map1": {
+ "1": "1",
+ "2": "2"
+ },
+ "pfc_prio_to_pg_map2": {
+ "3": "3",
+ "4": "4"
+ }
+ },
+
+ "PORT_QOS_MAP": {
+ "Ethernet0": {
+ "dot1p_to_tc_map" : "Dot1p_to_tc_map1",
+ "dscp_to_tc_map": "Dscp_to_tc_map1",
+ "tc_to_queue_map": "tc_to_q_map1",
+ "tc_to_pg_map": "tc_to_pg_map1",
+ "pfc_to_queue_map": "pfc_prio_to_q_map1",
+ "pfc_to_pg_map" : "pfc_prio_to_pg_map1",
+ "pfc_enable" : "3,4"
+ },
+ "Ethernet4": {
+ "dot1p_to_tc_map" : "Dot1p_to_tc_map2",
+ "dscp_to_tc_map": "Dscp_to_tc_map2",
+ "tc_to_queue_map": "tc_to_q_map2",
+ "tc_to_pg_map": "tc_to_pg_map2",
+ "pfc_to_queue_map": "pfc_prio_to_q_map2",
+ "pfc_to_pg_map" : "pfc_prio_to_pg_map2",
+ "pfc_enable" : "3,4"
+ }
}
},
diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json
new file mode 100644
index 000000000000..90344d8f119d
--- /dev/null
+++ b/src/sonic-yang-models/tests/yang_model_tests/tests/qosmaps.json
@@ -0,0 +1,104 @@
+{
+ "DSCP_TO_TC_MAP_CRETAE": {
+ "desc": "Configure a DSCP to Traffic class map."
+ },
+
+ "DSCP_TO_TC_MAP_CREATE_INVALID_DSCP": {
+ "desc": "Configure a DSCP to Traffic class map with invalid key.",
+ "eStr": "Invalid DSCP"
+ },
+
+ "DSCP_TO_TC_MAP_CREATE_INVALID_TC": {
+ "desc": "Configure a DSCP to Traffic class map with invalid value.",
+ "eStr": "Invalid Traffic Class"
+ },
+
+ "DOT1P_TO_TC_MAP_CRETAE": {
+ "desc": "Configure a DOT1P to Traffic class map."
+ },
+
+ "DOT1P_TO_TC_MAP_CREATE_INVALID_DOT1P": {
+ "desc": "Configure a DOT1P to Traffic class map with invalid key.",
+ "eStr": "Invalid DOT1P"
+ },
+
+ "DOT1P_TO_TC_MAP_CREATE_INVALID_TC": {
+ "desc": "Configure a DOT1P to Traffic class map with invalid value.",
+ "eStr": "Invalid Traffic Class"
+ },
+
+ "TC_TO_QUEUE_MAP_CRETAE": {
+ "desc": "Configure a Traffic Class to Queue map."
+ },
+
+ "TC_TO_QUEUE_MAP_CREATE_INVALID_TC": {
+ "desc": "Configure a Traffic class to Queue map with invalid key.",
+ "eStr": "Invalid Traffic Class"
+ },
+
+ "TC_TO_QUEUE_MAP_CREATE_INVALID_QUEUE": {
+ "desc": "Configure a Traffic class to Queue map with invalid value.",
+ "eStr": "Invalid queue index"
+ },
+
+ "TC_TO_PRIORITY_GROUP_MAP_CRETAE": {
+ "desc": "Configure a Traffic Class to Priority Group map."
+ },
+
+ "TC_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_TC": {
+ "desc": "Configure a Traffic class to Priority Group map with invalid key.",
+ "eStr": "Invalid Traffic Class"
+ },
+
+ "TC_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_PRIORITY_GROUP": {
+ "desc": "Configure a Traffic class to Priority Group map with invalid value.",
+ "eStr": "Invalid Priority Group"
+ },
+
+ "PFC_PRIORITY_TO_QUEUE_MAP_CRETAE": {
+ "desc": "Configure a PFC priority to Queue map."
+ },
+
+ "PFC_PRIORITY_TO_QUEUE_MAP_CREATE_INVALID_PFC_PRIORITY": {
+ "desc": "Configure a PFC priority to Queue map with invalid key.",
+ "eStr": "Invalid pfc priority"
+ },
+
+ "PFC_PRIORITY_TO_QUEUE_MAP_CREATE_INVALID_QUEUE": {
+ "desc": "Configure a PFC priority to Queue map with invalid value.",
+ "eStr": "Invalid queue index"
+ },
+
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_CRETAE": {
+ "desc": "Configure a PFC priority to Priority Group map."
+ },
+
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_PFC_PRIORITY": {
+ "desc": "Configure a PFC priority to Priority Group map with invalid key.",
+ "eStr": "Invalid pfc priority"
+ },
+
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_PRIORITY_GROUP": {
+ "desc": "Configure a PFC priority to Priority Group map with invalid value.",
+ "eStr": "Invalid Priority Group"
+ },
+
+ "PORT_QOS_MAP_APPLY_MAPS": {
+ "desc": "Configure qos maps on port."
+ },
+
+ "PORT_QOS_MAP_APPLY_NON_EXISTS_MAPS": {
+ "desc": "Configure non exists qos maps on port.",
+ "eStrKey": "LeafRef"
+ },
+
+ "PORT_QOS_MAP_APPLY_NON_EXISTS_PORT": {
+ "desc": "Configure port qos map entry on non exists port.",
+ "eStrKey": "LeafRef"
+ },
+
+ "PORT_QOS_MAP_APPLY_INVALID_PFC": {
+ "desc": "Configure port pfc enable with invalid pfc priority.",
+ "eStrKey": "Pattern"
+ }
+}
diff --git a/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json
new file mode 100644
index 000000000000..fe085ee3c7f9
--- /dev/null
+++ b/src/sonic-yang-models/tests/yang_model_tests/tests_config/qosmaps.json
@@ -0,0 +1,724 @@
+{
+ "DSCP_TO_TC_MAP_CRETAE": {
+ "sonic-dscp-tc-map:sonic-dscp-tc-map": {
+ "sonic-dscp-tc-map:DSCP_TO_TC_MAP": {
+ "DSCP_TO_TC_MAP_LIST": [
+ {
+ "name": "map1",
+ "DSCP_TO_TC_MAP": [
+ {
+ "dscp": "1",
+ "tc": "1"
+ },
+ {
+ "dscp":"2",
+ "tc":"2"
+ }
+ ]
+ },
+ {
+ "name": "map2",
+ "DSCP_TO_TC_MAP": [
+ {
+ "dscp": "1",
+ "tc": "1"
+ },
+ {
+ "dscp":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "DSCP_TO_TC_MAP_CREATE_INVALID_DSCP": {
+ "sonic-dscp-tc-map:sonic-dscp-tc-map": {
+ "sonic-dscp-tc-map:DSCP_TO_TC_MAP": {
+ "DSCP_TO_TC_MAP_LIST": [
+ {
+ "name": "map3",
+ "DSCP_TO_TC_MAP": [
+ {
+ "dscp": "64",
+ "tc": "1"
+ },
+ {
+ "dscp":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "DSCP_TO_TC_MAP_CREATE_INVALID_TC": {
+ "sonic-dscp-tc-map:sonic-dscp-tc-map": {
+ "sonic-dscp-tc-map:DSCP_TO_TC_MAP": {
+ "DSCP_TO_TC_MAP_LIST": [
+ {
+ "name": "map3",
+ "DSCP_TO_TC_MAP": [
+ {
+ "dscp": "1",
+ "tc": "8"
+ },
+ {
+ "dscp":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "DOT1P_TO_TC_MAP_CRETAE": {
+ "sonic-dot1p-tc-map:sonic-dot1p-tc-map": {
+ "sonic-dot1p-tc-map:DOT1P_TO_TC_MAP": {
+ "DOT1P_TO_TC_MAP_LIST": [
+ {
+ "name": "map1",
+ "DOT1P_TO_TC_MAP": [
+ {
+ "dot1p": "1",
+ "tc": "1"
+ },
+ {
+ "dot1p":"2",
+ "tc":"2"
+ }
+ ]
+ },
+ {
+ "name": "map2",
+ "DOT1P_TO_TC_MAP": [
+ {
+ "dot1p": "1",
+ "tc": "1"
+ },
+ {
+ "dot1p":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "DOT1P_TO_TC_MAP_CREATE_INVALID_DOT1P": {
+ "sonic-dot1p-tc-map:sonic-dot1p-tc-map": {
+ "sonic-dot1p-tc-map:DOT1P_TO_TC_MAP": {
+ "DOT1P_TO_TC_MAP_LIST": [
+ {
+ "name": "map3",
+ "DOT1P_TO_TC_MAP": [
+ {
+ "dot1p": "64",
+ "tc": "1"
+ },
+ {
+ "dot1p":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "DOT1P_TO_TC_MAP_CREATE_INVALID_TC": {
+ "sonic-dot1p-tc-map:sonic-dot1p-tc-map": {
+ "sonic-dot1p-tc-map:DOT1P_TO_TC_MAP": {
+ "DOT1P_TO_TC_MAP_LIST": [
+ {
+ "name": "map3",
+ "DOT1P_TO_TC_MAP": [
+ {
+ "dot1p": "1",
+ "tc": "8"
+ },
+ {
+ "dot1p":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "TC_TO_QUEUE_MAP_CRETAE": {
+ "sonic-tc-queue-map:sonic-tc-queue-map": {
+ "sonic-tc-queue-map:TC_TO_QUEUE_MAP": {
+ "TC_TO_QUEUE_MAP_LIST": [
+ {
+ "name": "map1",
+ "TC_TO_QUEUE_MAP": [
+ {
+ "tc": "1",
+ "qindex": "1"
+ },
+ {
+ "tc":"2",
+ "qindex":"2"
+ }
+ ]
+ },
+ {
+ "name": "map2",
+ "TC_TO_QUEUE_MAP": [
+ {
+ "tc": "1",
+ "qindex": "1"
+ },
+ {
+ "tc":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "TC_TO_QUEUE_MAP_CREATE_INVALID_TC": {
+ "sonic-tc-queue-map:sonic-tc-queue-map": {
+ "sonic-tc-queue-map:TC_TO_QUEUE_MAP": {
+ "TC_TO_QUEUE_MAP_LIST": [
+ {
+ "name": "map3",
+ "TC_TO_QUEUE_MAP": [
+ {
+ "tc": "64",
+ "qindex": "1"
+ },
+ {
+ "tc":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "TC_TO_QUEUE_MAP_CREATE_INVALID_QUEUE": {
+ "sonic-tc-queue-map:sonic-tc-queue-map": {
+ "sonic-tc-queue-map:TC_TO_QUEUE_MAP": {
+ "TC_TO_QUEUE_MAP_LIST": [
+ {
+ "name": "map3",
+ "TC_TO_QUEUE_MAP": [
+ {
+ "tc": "1",
+ "qindex": "8"
+ },
+ {
+ "tc":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "TC_TO_PRIORITY_GROUP_MAP_CRETAE": {
+ "sonic-tc-priority-group-map:sonic-tc-priority-group-map": {
+ "sonic-tc-priority-group-map:TC_TO_PRIORITY_GROUP_MAP": {
+ "TC_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map1",
+ "TC_TO_PRIORITY_GROUP_MAP": [
+ {
+ "tc": "1",
+ "pg": "1"
+ },
+ {
+ "tc":"2",
+ "pg":"2"
+ }
+ ]
+ },
+ {
+ "name": "map2",
+ "TC_TO_PRIORITY_GROUP_MAP": [
+ {
+ "tc": "1",
+ "pg": "1"
+ },
+ {
+ "tc":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "TC_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_TC": {
+ "sonic-tc-priority-group-map:sonic-tc-priority-group-map": {
+ "sonic-tc-priority-group-map:TC_TO_PRIORITY_GROUP_MAP": {
+ "TC_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map3",
+ "TC_TO_PRIORITY_GROUP_MAP": [
+ {
+ "tc": "64",
+ "pg": "1"
+ },
+ {
+ "tc":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "TC_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_PRIORITY_GROUP": {
+ "sonic-tc-priority-group-map:sonic-tc-priority-group-map": {
+ "sonic-tc-priority-group-map:TC_TO_PRIORITY_GROUP_MAP": {
+ "TC_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map3",
+ "TC_TO_PRIORITY_GROUP_MAP": [
+ {
+ "tc": "1",
+ "pg": "8"
+ },
+ {
+ "tc":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "PFC_PRIORITY_TO_QUEUE_MAP_CRETAE": {
+ "sonic-pfc-priority-queue-map:sonic-pfc-priority-queue-map": {
+ "sonic-pfc-priority-queue-map:MAP_PFC_PRIORITY_TO_QUEUE": {
+ "MAP_PFC_PRIORITY_TO_QUEUE_LIST": [
+ {
+ "name": "map1",
+ "MAP_PFC_PRIORITY_TO_QUEUE": [
+ {
+ "pfc_priority": "1",
+ "qindex": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "qindex":"2"
+ }
+ ]
+ },
+ {
+ "name": "map2",
+ "MAP_PFC_PRIORITY_TO_QUEUE": [
+ {
+ "pfc_priority": "1",
+ "qindex": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "PFC_PRIORITY_TO_QUEUE_MAP_CREATE_INVALID_PFC_PRIORITY": {
+ "sonic-pfc-priority-queue-map:sonic-pfc-priority-queue-map": {
+ "sonic-pfc-priority-queue-map:MAP_PFC_PRIORITY_TO_QUEUE": {
+ "MAP_PFC_PRIORITY_TO_QUEUE_LIST": [
+ {
+ "name": "map3",
+ "MAP_PFC_PRIORITY_TO_QUEUE": [
+ {
+ "pfc_priority": "64",
+ "qindex": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "PFC_PRIORITY_TO_QUEUE_MAP_CREATE_INVALID_QUEUE": {
+ "sonic-pfc-priority-queue-map:sonic-pfc-priority-queue-map": {
+ "sonic-pfc-priority-queue-map:MAP_PFC_PRIORITY_TO_QUEUE": {
+ "MAP_PFC_PRIORITY_TO_QUEUE_LIST": [
+ {
+ "name": "map3",
+ "MAP_PFC_PRIORITY_TO_QUEUE": [
+ {
+ "pfc_priority": "1",
+ "qindex": "8"
+ },
+ {
+ "pfc_priority":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_CRETAE": {
+ "sonic-pfc-priority-priority-group-map:sonic-pfc-priority-priority-group-map": {
+ "sonic-pfc-priority-priority-group-map:PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": {
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map1",
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": [
+ {
+ "pfc_priority": "1",
+ "pg": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "pg":"2"
+ }
+ ]
+ },
+ {
+ "name": "map2",
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": [
+ {
+ "pfc_priority": "1",
+ "pg": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_PFC_PRIORITY": {
+ "sonic-pfc-priority-priority-group-map:sonic-pfc-priority-priority-group-map": {
+ "sonic-pfc-priority-priority-group-map:PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": {
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map3",
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": [
+ {
+ "pfc_priority": "64",
+ "pg": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_CREATE_INVALID_PRIORITY_GROUP": {
+ "sonic-pfc-priority-priority-group-map:sonic-pfc-priority-priority-group-map": {
+ "sonic-pfc-priority-priority-group-map:PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": {
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map3",
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": [
+ {
+ "pfc_priority": "1",
+ "pg": "8"
+ },
+ {
+ "pfc_priority":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ },
+
+ "PORT_QOS_MAP_APPLY_MAPS": {
+ "sonic-dscp-tc-map:sonic-dscp-tc-map": {
+ "sonic-dscp-tc-map:DSCP_TO_TC_MAP": {
+ "DSCP_TO_TC_MAP_LIST": [
+ {
+ "name": "map1",
+ "DSCP_TO_TC_MAP": [
+ {
+ "dscp": "1",
+ "tc": "1"
+ },
+ {
+ "dscp":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ },
+
+ "sonic-dot1p-tc-map:sonic-dot1p-tc-map": {
+ "sonic-dot1p-tc-map:DOT1P_TO_TC_MAP": {
+ "DOT1P_TO_TC_MAP_LIST": [
+ {
+ "name": "map1",
+ "DOT1P_TO_TC_MAP": [
+ {
+ "dot1p": "1",
+ "tc": "1"
+ },
+ {
+ "dot1p":"2",
+ "tc":"2"
+ }
+ ]
+ }
+ ]
+ }
+ },
+
+ "sonic-tc-queue-map:sonic-tc-queue-map": {
+ "sonic-tc-queue-map:TC_TO_QUEUE_MAP": {
+ "TC_TO_QUEUE_MAP_LIST": [
+ {
+ "name": "map1",
+ "TC_TO_QUEUE_MAP": [
+ {
+ "tc": "1",
+ "qindex": "1"
+ },
+ {
+ "tc":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ },
+ "sonic-tc-priority-group-map:sonic-tc-priority-group-map": {
+ "sonic-tc-priority-group-map:TC_TO_PRIORITY_GROUP_MAP": {
+ "TC_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map1",
+ "TC_TO_PRIORITY_GROUP_MAP": [
+ {
+ "tc": "1",
+ "pg": "1"
+ },
+ {
+ "tc":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ },
+
+ "sonic-pfc-priority-queue-map:sonic-pfc-priority-queue-map": {
+ "sonic-pfc-priority-queue-map:MAP_PFC_PRIORITY_TO_QUEUE": {
+ "MAP_PFC_PRIORITY_TO_QUEUE_LIST": [
+ {
+ "name": "map1",
+ "MAP_PFC_PRIORITY_TO_QUEUE": [
+ {
+ "pfc_priority": "1",
+ "qindex": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "qindex":"2"
+ }
+ ]
+ }
+ ]
+ }
+ },
+
+ "sonic-pfc-priority-priority-group-map:sonic-pfc-priority-priority-group-map": {
+ "sonic-pfc-priority-priority-group-map:PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": {
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_LIST": [
+ {
+ "name": "map1",
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": [
+ {
+ "pfc_priority": "1",
+ "pg": "1"
+ },
+ {
+ "pfc_priority":"2",
+ "pg":"2"
+ }
+ ]
+ }
+ ]
+ }
+ },
+
+ "sonic-port:sonic-port": {
+ "sonic-port:PORT": {
+ "PORT_LIST": [
+ {
+ "admin_status": "up",
+ "alias": "eth0",
+ "description": "Ethernet0",
+ "lanes": "65",
+ "mtu": "9000",
+ "name": "Ethernet0",
+ "tpid": "0x8100",
+ "speed": "25000"
+ }
+ ]
+ }
+ },
+ "sonic-port-qos-map:sonic-port-qos-map": {
+ "sonic-port-qos-map:PORT_QOS_MAP": {
+ "PORT_QOS_MAP_LIST": [
+ {
+ "ifname": "Ethernet0",
+ "dscp_to_tc_map": "map1",
+ "tc_to_pg_map": "map1",
+ "tc_to_queue_map": "map1",
+ "pfc_to_queue_map": "map1",
+ "pfc_to_pg_map": "map1",
+ "dscp_to_tc_map": "map1",
+ "dot1p_to_tc_map": "map1",
+ "pfc_enable": "3,4"
+ }
+ ]
+ }
+ }
+ },
+
+ "PORT_QOS_MAP_APPLY_NON_EXISTS_MAPS": {
+ "sonic-port:sonic-port": {
+ "sonic-port:PORT": {
+ "PORT_LIST": [
+ {
+ "admin_status": "up",
+ "alias": "eth0",
+ "description": "Ethernet0",
+ "lanes": "65",
+ "mtu": "9000",
+ "name": "Ethernet0",
+ "tpid": "0x8100",
+ "speed": "25000"
+ }
+ ]
+ }
+ },
+ "sonic-port-qos-map:sonic-port-qos-map": {
+ "sonic-port-qos-map:PORT_QOS_MAP": {
+ "PORT_QOS_MAP_LIST": [
+ {
+ "ifname": "Ethernet0",
+ "dscp_to_tc_map": "map2",
+ "tc_to_pg_map": "map2",
+ "tc_to_queue_map": "map2",
+ "pfc_to_queue_map": "map2",
+ "pfc_to_pg_map": "map2",
+ "dscp_to_tc_map": "map2",
+ "dot1p_to_tc_map": "map2",
+ "pfc_enable": "3,4"
+ }
+ ]
+ }
+ }
+ },
+
+ "PORT_QOS_MAP_APPLY_NON_EXISTS_PORT": {
+ "sonic-port:sonic-port": {
+ "sonic-port:PORT": {
+ "PORT_LIST": [
+ {
+ "admin_status": "up",
+ "alias": "eth0",
+ "description": "Ethernet4",
+ "lanes": "65",
+ "mtu": "9000",
+ "name": "Ethernet4",
+ "tpid": "0x8100",
+ "speed": "25000"
+ }
+ ]
+ }
+ },
+ "sonic-port-qos-map:sonic-port-qos-map": {
+ "sonic-port-qos-map:PORT_QOS_MAP": {
+ "PORT_QOS_MAP_LIST": [
+ {
+ "ifname": "Ethernet0"
+ }
+ ]
+ }
+ }
+ },
+
+ "PORT_QOS_MAP_APPLY_INVALID_PFC": {
+ "sonic-port:sonic-port": {
+ "sonic-port:PORT": {
+ "PORT_LIST": [
+ {
+ "admin_status": "up",
+ "alias": "eth0",
+ "description": "Ethernet4",
+ "lanes": "65",
+ "mtu": "9000",
+ "name": "Ethernet4",
+ "tpid": "0x8100",
+ "speed": "25000"
+ }
+ ]
+ }
+ },
+ "sonic-port-qos-map:sonic-port-qos-map": {
+ "sonic-port-qos-map:PORT_QOS_MAP": {
+ "PORT_QOS_MAP_LIST": [
+ {
+ "ifname": "Ethernet4",
+ "pfc_enable": "8"
+ }
+ ]
+ }
+ }
+ }
+
+}
diff --git a/src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang b/src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang
new file mode 100644
index 000000000000..0a756298c97e
--- /dev/null
+++ b/src/sonic-yang-models/yang-models/sonic-dot1p-tc-map.yang
@@ -0,0 +1,68 @@
+module sonic-dot1p-tc-map {
+
+ yang-version 1.1;
+
+ namespace "http://github.com/Azure/sonic-dot1p-tc-map";
+
+ prefix dot1ptm;
+
+ organization
+ "SONiC";
+
+ contact
+ "SONiC";
+
+ description
+ "DOT1P_TO_TC_MAP yang Module for SONiC OS";
+
+ revision 2021-04-15 {
+ description
+ "Initial revision.";
+ }
+
+ container sonic-dot1p-tc-map {
+
+ container DOT1P_TO_TC_MAP {
+
+ description "DOT1P_TO_TC_MAP part of config_db.json";
+
+ list DOT1P_TO_TC_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 DOT1P_TO_TC_MAP { //this is list inside list for storing mapping between two fields
+
+ key "dot1p";
+
+ leaf dot1p {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid DOT1P";
+ error-app-tag dot1p-invalid;
+ }
+ }
+ }
+
+ leaf tc {
+ type string {
+ pattern "[0-7]?"{
+ error-message "Invalid Traffic Class";
+ error-app-tag tc-invalid;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang b/src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang
new file mode 100644
index 000000000000..71d9fcd4884d
--- /dev/null
+++ b/src/sonic-yang-models/yang-models/sonic-dscp-tc-map.yang
@@ -0,0 +1,68 @@
+module sonic-dscp-tc-map {
+
+ yang-version 1.1;
+
+ namespace "http://github.com/Azure/sonic-dscp-tc-map";
+
+ prefix dtm;
+
+ organization
+ "SONiC";
+
+ contact
+ "SONiC";
+
+ description
+ "DSCP_TO_TC_MAP yang Module for SONiC OS";
+
+ revision 2021-04-15 {
+ description
+ "Initial revision.";
+ }
+
+ container sonic-dscp-tc-map {
+
+ container DSCP_TO_TC_MAP {
+
+ description "DSCP_TO_TC_MAP part of config_db.json";
+
+ list DSCP_TO_TC_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_TC_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 tc {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid Traffic Class";
+ error-app-tag tc-invalid;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/sonic-yang-models/yang-models/sonic-pfc-priority-priority-group-map.yang b/src/sonic-yang-models/yang-models/sonic-pfc-priority-priority-group-map.yang
new file mode 100644
index 000000000000..ccc86c064efb
--- /dev/null
+++ b/src/sonic-yang-models/yang-models/sonic-pfc-priority-priority-group-map.yang
@@ -0,0 +1,68 @@
+module sonic-pfc-priority-priority-group-map {
+
+ yang-version 1.1;
+
+ namespace "http://github.com/Azure/sonic-pfc-priority-priority-group-map";
+
+ prefix pppgm;
+
+ organization
+ "SONiC";
+
+ contact
+ "SONiC";
+
+ description
+ "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP yang Module for SONiC OS";
+
+ revision 2021-04-15 {
+ description
+ "Initial revision.";
+ }
+
+ container sonic-pfc-priority-priority-group-map {
+
+ container PFC_PRIORITY_TO_PRIORITY_GROUP_MAP {
+
+ description "PFC_PRIORITY_TO_PRIORITY_GROUP_MAP part of config_db.json";
+
+ list PFC_PRIORITY_TO_PRIORITY_GROUP_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 PFC_PRIORITY_TO_PRIORITY_GROUP_MAP { //this is list inside list for storing mapping between two fields
+
+ key "pfc_priority";
+
+ leaf pfc_priority {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid pfc priority";
+ error-app-tag pfc-priority-invalid;
+ }
+ }
+ }
+
+ leaf pg {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid Priority Group";
+ error-app-tag pg-invalid;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/sonic-yang-models/yang-models/sonic-pfc-priority-queue-map.yang b/src/sonic-yang-models/yang-models/sonic-pfc-priority-queue-map.yang
new file mode 100644
index 000000000000..fb659d89bb4b
--- /dev/null
+++ b/src/sonic-yang-models/yang-models/sonic-pfc-priority-queue-map.yang
@@ -0,0 +1,68 @@
+module sonic-pfc-priority-queue-map {
+
+ yang-version 1.1;
+
+ namespace "http://github.com/Azure/sonic-pfc-priority-queue-map";
+
+ prefix ppqm;
+
+ organization
+ "SONiC";
+
+ contact
+ "SONiC";
+
+ description
+ "PFC_PRIORITY_TO_QUEUE_MAP yang Module for SONiC OS";
+
+ revision 2021-04-15 {
+ description
+ "Initial revision.";
+ }
+
+ container sonic-pfc-priority-queue-map {
+
+ container MAP_PFC_PRIORITY_TO_QUEUE {
+
+ description "MAP_PFC_PRIORITY_TO_QUEUE part of config_db.json";
+
+ list MAP_PFC_PRIORITY_TO_QUEUE_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 MAP_PFC_PRIORITY_TO_QUEUE { //this is list inside list for storing mapping between two fields
+
+ key "pfc_priority";
+
+ leaf pfc_priority {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid pfc priority";
+ error-app-tag pfc-priority-invalid;
+ }
+ }
+ }
+
+ leaf qindex {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid queue index";
+ error-app-tag queue-index-invalid;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang
new file mode 100644
index 000000000000..b29e2f547087
--- /dev/null
+++ b/src/sonic-yang-models/yang-models/sonic-port-qos-map.yang
@@ -0,0 +1,110 @@
+module sonic-port-qos-map {
+
+ yang-version 1.1;
+
+ namespace "http://github.com/Azure/sonic-port-qos-map";
+
+ prefix pqm;
+
+ import sonic-port {
+ prefix prt;
+ }
+
+ import sonic-tc-priority-group-map {
+ prefix tpgm;
+ }
+
+ import sonic-tc-queue-map {
+ prefix tqm;
+ }
+
+ import sonic-pfc-priority-queue-map {
+ prefix ppqm;
+ }
+
+ import sonic-pfc-priority-priority-group-map {
+ prefix pppgm;
+ }
+
+ import sonic-dscp-tc-map {
+ prefix dtm;
+ }
+
+ import sonic-dot1p-tc-map {
+ prefix dot1ptm;
+ }
+
+ organization
+ "SONiC";
+
+ contact
+ "SONiC";
+
+ description
+ "SONIC PORT_QOS_MAP";
+
+ revision 2019-05-15 {
+ description
+ "Initial revision.";
+ }
+
+ container sonic-port-qos-map {
+
+ container PORT_QOS_MAP {
+ list PORT_QOS_MAP_LIST {
+
+ key "ifname";
+
+ leaf ifname {
+ type leafref {
+ path "/prt:sonic-port/prt:PORT/prt:PORT_LIST/prt:name";
+ }
+ description
+ "Reference of port on which QOS MAPS to be configured.";
+ }
+
+ leaf tc_to_pg_map {
+ type leafref {
+ path "/tpgm:sonic-tc-priority-group-map/tpgm:TC_TO_PRIORITY_GROUP_MAP/tpgm:TC_TO_PRIORITY_GROUP_MAP_LIST/tpgm:name";
+ }
+ }
+
+ leaf tc_to_queue_map {
+ type leafref {
+ path "/tqm:sonic-tc-queue-map/tqm:TC_TO_QUEUE_MAP/tqm:TC_TO_QUEUE_MAP_LIST/tqm:name";
+ }
+ }
+
+ leaf pfc_enable {
+ type string {
+ pattern "[0-7](,[0-7])?";
+ }
+ }
+
+ leaf pfc_to_queue_map {
+ type leafref {
+ path "/ppqm:sonic-pfc-priority-queue-map/ppqm:MAP_PFC_PRIORITY_TO_QUEUE/ppqm:MAP_PFC_PRIORITY_TO_QUEUE_LIST/ppqm:name";
+ }
+ }
+
+ leaf pfc_to_pg_map {
+ type leafref {
+ path "/pppgm:sonic-pfc-priority-priority-group-map/pppgm:PFC_PRIORITY_TO_PRIORITY_GROUP_MAP/pppgm:PFC_PRIORITY_TO_PRIORITY_GROUP_MAP_LIST/pppgm:name";
+ }
+ }
+
+ leaf dscp_to_tc_map {
+ type leafref {
+ path "/dtm:sonic-dscp-tc-map/dtm:DSCP_TO_TC_MAP/dtm:DSCP_TO_TC_MAP_LIST/dtm:name";
+ }
+ }
+
+ leaf dot1p_to_tc_map {
+ type leafref {
+ path "/dot1ptm:sonic-dot1p-tc-map/dot1ptm:DOT1P_TO_TC_MAP/dot1ptm:DOT1P_TO_TC_MAP_LIST/dot1ptm:name";
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang b/src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang
new file mode 100644
index 000000000000..4290b79c3ee7
--- /dev/null
+++ b/src/sonic-yang-models/yang-models/sonic-tc-priority-group-map.yang
@@ -0,0 +1,68 @@
+module sonic-tc-priority-group-map {
+
+ yang-version 1.1;
+
+ namespace "http://github.com/Azure/sonic-tc-priority-group-map";
+
+ prefix tpgm;
+
+ organization
+ "SONiC";
+
+ contact
+ "SONiC";
+
+ description
+ "TC_TO_PRIORITY_GROUP_MAP yang Module for SONiC OS";
+
+ revision 2021-04-15 {
+ description
+ "Initial revision.";
+ }
+
+ container sonic-tc-priority-group-map {
+
+ container TC_TO_PRIORITY_GROUP_MAP {
+
+ description "TC_TO_PRIORITY_GROUP_MAP part of config_db.json";
+
+ list TC_TO_PRIORITY_GROUP_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 TC_TO_PRIORITY_GROUP_MAP { //this is list inside list for storing mapping between two fields
+
+ key "tc";
+
+ leaf tc {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid Traffic Class";
+ error-app-tag tc-invalid;
+ }
+ }
+ }
+
+ leaf pg {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid Priority Group";
+ error-app-tag pg-invalid;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang b/src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang
new file mode 100644
index 000000000000..fa22a8331294
--- /dev/null
+++ b/src/sonic-yang-models/yang-models/sonic-tc-queue-map.yang
@@ -0,0 +1,68 @@
+module sonic-tc-queue-map {
+
+ yang-version 1.1;
+
+ namespace "http://github.com/Azure/sonic-tc-queue-map";
+
+ prefix tqm;
+
+ organization
+ "SONiC";
+
+ contact
+ "SONiC";
+
+ description
+ "TC_TO_QUEUE_MAP yang Module for SONiC OS";
+
+ revision 2021-04-15 {
+ description
+ "Initial revision.";
+ }
+
+ container sonic-tc-queue-map {
+
+ container TC_TO_QUEUE_MAP {
+
+ description "TC_TO_QUEUE_MAP part of config_db.json";
+
+ list TC_TO_QUEUE_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 TC_TO_QUEUE_MAP { //this is list inside list for storing mapping between two fields
+
+ key "tc";
+
+ leaf tc {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid Traffic Class";
+ error-app-tag tc-invalid;
+ }
+ }
+ }
+
+ leaf qindex {
+ type string {
+ pattern "[0-7]?" {
+ error-message "Invalid queue index";
+ error-app-tag queue-index-invalid;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}