diff --git a/src/sonic-yang-mgmt/sonic_yang_ext.py b/src/sonic-yang-mgmt/sonic_yang_ext.py index 1f0a072be450..e85cdb42ff0f 100644 --- a/src/sonic-yang-mgmt/sonic_yang_ext.py +++ b/src/sonic-yang-mgmt/sonic_yang_ext.py @@ -377,7 +377,8 @@ def _xlateContainer(self, model, yang, config, table): ## Handle other leaves in container, leafDict = self._createLeafDict(model) - for vKey in configC.keys(): + vKeys = list(configC.keys()) + for vKey in vKeys: #vkey must be a leaf\leaf-list\choice in container if leafDict.get(vKey): self.sysLog(syslog.LOG_DEBUG, "xlateContainer vkey {}".format(vKey)) diff --git a/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py b/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py index 597d13da0874..b761cd994c1d 100644 --- a/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py +++ b/src/sonic-yang-mgmt/tests/libyang-python-tests/test_sonic_yang.py @@ -288,10 +288,13 @@ def test_xlate_rev_xlate(self, sonic_yang_data): syc = sonic_yang_data['syc'] jIn = self.readIjsonInput(test_file, 'SAMPLE_CONFIG_DB_JSON') + jIn = json.loads(jIn) + numTables = len(jIn) - syc.loadData(json.loads(jIn)) - - # TODO: Make sure no extra table is loaded + syc.loadData(jIn) + # check all tables are loaded and no tables is without Yang Models + assert len(syc.jIn) == numTables + assert len(syc.tablesWithOutYang) == 0 syc.getData() diff --git a/src/sonic-yang-models/setup.py b/src/sonic-yang-models/setup.py index 4ba9fd61c92a..e651bb0d377d 100644 --- a/src/sonic-yang-models/setup.py +++ b/src/sonic-yang-models/setup.py @@ -41,13 +41,19 @@ packages=find_packages(), version='1.0', data_files=[ - ('yang-models', ['./yang-models/sonic-types.yang', + ('yang-models', ['./yang-models/sonic-acl.yang', + './yang-models/sonic-breakout_cfg.yang', + './yang-models/sonic-crm.yang', + './yang-models/sonic-device_metadata.yang', + './yang-models/sonic-device_neighbor.yang', './yang-models/sonic-extension.yang', - './yang-models/sonic-acl.yang', + './yang-models/sonic-flex_counter.yang', './yang-models/sonic-interface.yang', './yang-models/sonic-loopback-interface.yang', './yang-models/sonic-port.yang', './yang-models/sonic-portchannel.yang', + './yang-models/sonic-types.yang', + './yang-models/sonic-versions.yang', './yang-models/sonic-vlan.yang', './yang-models/sonic_yang_tree']), ], diff --git a/src/sonic-yang-models/tests/yang_model_tests/test_yang_model.py b/src/sonic-yang-models/tests/yang_model_tests/test_yang_model.py index 966af237f272..3bc2886f38c7 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/test_yang_model.py +++ b/src/sonic-yang-models/tests/yang_model_tests/test_yang_model.py @@ -125,6 +125,10 @@ def initTest(self): 'desc': 'Loopback Ip-prefix port-name must condition failure.', 'eStr': self.defaultYANGFailure['Must'] }, + 'CRM_BRK_CFG_FLEX_TABLE': { + 'desc': 'CRM BREAKOUT CFG FLEX COUNTER TABLE.', + 'eStr': self.defaultYANGFailure['None'] + }, 'INCORRECT_VLAN_NAME': { 'desc': 'INCORRECT VLAN_NAME FIELD IN VLAN TABLE.', 'eStr': self.defaultYANGFailure['Pattern'] + ["Vlan"] @@ -168,6 +172,52 @@ def initTest(self): 'PORT_NEG_TEST': { 'desc': 'LOAD PORT TABLE FEC PATTERN FAILURE', 'eStr': self.defaultYANGFailure['Pattern'] + ['rc'] + }, + 'CRM_WITH_WRONG_PERCENTAGE': { + 'desc': 'CRM_WITH_WRONG_PERCENTAGE must condition failure.', + 'eStr': self.defaultYANGFailure['Must'] + }, + 'CRM_WITH_HIGH_THRESHOLD_ERR': { + 'desc': 'CRM_WITH_HIGH_THRESHOLD_ERR must condition failure \ + about high threshold being lower than low threshold.', + 'eStr': self.defaultYANGFailure['high_threshold should be more \ + than low_threshold'] + }, + 'CRM_WITH_CORRECT_USED_VALUE': { + 'desc': 'CRM_WITH_CORRECT_USED_VALUE no failure.', + 'eStr': self.defaultYANGFailure['None'] + }, + 'FLEX_COUNTER_TABLE_WITH_CORRECT_USED_VALUE': { + 'desc': 'FLEX_COUNTER_TABLE_WITH_CORRECT_USED_VALUE no failure.', + 'eStr': self.defaultYANGFailure['None'] + }, + 'VERSIONS_WITH_INCORRECT_PATTERN': { + 'desc': 'VERSIONS_WITH_INCORRECT_PATTERN pattern failure.', + 'eStr': self.defaultYANGFailure['Pattern'] + }, + 'VERSIONS_WITH_INCORRECT_PATTERN2': { + 'desc': 'VERSIONS_WITH_INCORRECT_PATTERN pattern failure.', + 'eStr': self.defaultYANGFailure['Pattern'] + }, + 'DEVICE_METADATA_DEFAULT_BGP_STATUS': { + 'desc': 'DEVICE_METADATA DEFAULT VALUE FOR BGP_STATUS FIELD.', + 'eStr': self.defaultYANGFailure['Verify'], + 'verify': {'xpath': '/sonic-device_metadata:sonic-device_metadata/DEVICE_METADATA/localhost/hostname', + 'key': 'sonic-device_metadata:default_bgp_status', + 'value': 'up' + } + }, + 'DEVICE_METADATA_DEFAULT_PFCWD_STATUS': { + 'desc': 'DEVICE_METADATA DEFAULT VALUE FOR PFCWD FIELD.', + 'eStr': self.defaultYANGFailure['Verify'], + 'verify': {'xpath': '/sonic-device_metadata:sonic-device_metadata/DEVICE_METADATA/localhost/hostname', + 'key': 'sonic-device_metadata:default_pfcwd_status', + 'value': 'disable' + } + }, + 'DEVICE_METADATA_TYPE_INCORRECT_PATTERN': { + 'desc': 'DEVICE_METADATA_TYPE_INCORRECT_PATTERN pattern failure.', + 'eStr': self.defaultYANGFailure['Pattern'] } } @@ -260,20 +310,20 @@ def loadConfigData(self, jInput, verify=None): # verify the data tree if asked if verify is not None: xpath = verify['xpath'] - log.debug("Verify xpath: {}".format(xpath)) + log.info("Verify xpath: {}".format(xpath)) set = node.find_path(xpath) for dnode in set.data(): if (xpath == dnode.path()): - log.debug("Verify dnode: {}".format(dnode.path())) + log.info("Verify dnode: {}".format(dnode.path())) data = dnode.print_mem(ly.LYD_JSON, ly.LYP_WITHSIBLINGS \ | ly.LYP_FORMAT | ly.LYP_WD_ALL) data = json.loads(data) - log.debug("Verify data: {}".format(data)) + log.info("Verify data: {}".format(data)) assert (data[verify['key']] == verify['value']) s = 'verified' except Exception as e: s = str(e) - log.debug(s) + log.info(s) return s """ @@ -294,7 +344,7 @@ def runExceptionTest(self, test): log.info(desc + " Passed\n") return PASS else: - raise Exception("Unknown Error") + raise Exception("Mismatch {} and {}".format(eStr, s)) except Exception as e: printExceptionDetails() log.info(desc + " Failed\n") @@ -336,10 +386,10 @@ def runVlanSpecialTest(self, test): Run all tests from list self.tests """ def test_run_tests(self): + ret = 0 try: self.initTest() self.loadYangModel(self.yangDir) - ret = 0 for test in self.tests: test = test.strip() if test in self.ExceptionTests: @@ -350,6 +400,7 @@ def test_run_tests(self): raise Exception("Unexpected Test") except Exception as e: printExceptionDetails() + assert ret == 0 return # End of Class diff --git a/src/sonic-yang-models/tests/yang_model_tests/yangTest.json b/src/sonic-yang-models/tests/yang_model_tests/yangTest.json index 72c7b4630c33..90d748309dca 100644 --- a/src/sonic-yang-models/tests/yang_model_tests/yangTest.json +++ b/src/sonic-yang-models/tests/yang_model_tests/yangTest.json @@ -727,6 +727,218 @@ } } }, + + "CRM_WITH_WRONG_PERCENTAGE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "acl_counter_high_threshold": 110, + "acl_counter_low_threshold": 85, + "acl_counter_threshold_type": "PERCENTAGE" + } + } + } + }, + + "CRM_WITH_HIGH_THRESHOLD_ERR": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "acl_counter_high_threshold": 80, + "acl_counter_low_threshold": 81, + "acl_counter_threshold_type": "PERCENTAGE" + } + } + } + }, + + "CRM_WITH_WRONG_THRESHOLD": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "acl_counter_high_threshold": 85, + "acl_counter_low_threshold": 90, + "acl_counter_threshold_type": "free" + } + } + } + }, + + "CRM_WITH_CORRECT_USED_VALUE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "acl_counter_high_threshold": 85, + "acl_counter_low_threshold": 25, + "acl_counter_threshold_type": "used" + } + } + } + }, + + "DEVICE_METADATA_DEFAULT_BGP_STATUS": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "docker_routing_config_mode": "separated", + "platform": "Stone-DX010", + "hostname": "DUT-ASW", + "bgp_asn": "65000" + } + } + } + }, + + "DEVICE_METADATA_DEFAULT_PFCWD_STATUS": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "platform": "DX010", + "hostname": "DUT-CSW", + "bgp_asn": "65001" + } + } + } + }, + + "DEVICE_METADATA_TYPE_INCORRECT_PATTERN": { + "sonic-device_metadata:sonic-device_metadata": { + "sonic-device_metadata:DEVICE_METADATA": { + "sonic-device_metadata:localhost": { + "bgp_asn": "65002", + "type": "ToRrouter" + } + } + } + }, + + "VERSIONS_WITH_INCORRECT_PATTERN": { + "sonic-versions:sonic-versions": { + "sonic-versions:VERSIONS": { + "DATABASE": { + "VERSION": "version_1_2" + } + } + } + }, + + "VERSIONS_WITH_INCORRECT_PATTERN2": { + "sonic-versions:sonic-versions": { + "sonic-versions:VERSIONS": { + "DATABASE": { + "VERSION": "version_0_2_77" + } + } + } + }, + + "FLEX_COUNTER_TABLE_WITH_CORRECT_USED_VALUE": { + "sonic-flex_counter:sonic-flex_counter": { + "sonic-flex_counter:FLEX_COUNTER_TABLE": { + "PFCWD": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PG_WATERMARK": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PORT": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PORT_RATES": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PORT_BUFFER_DROP": { + "FLEX_COUNTER_STATUS": "enable" + }, + "BUFFER_POOL_WATERMARK_KEY": { + "FLEX_COUNTER_STATUS": "enable" + }, + "QUEUE": { + "FLEX_COUNTER_STATUS": "enable" + }, + "QUEUE_WATERMARK": { + "FLEX_COUNTER_STATUS": "enable" + }, + "DEBUG_COUNTER": { + "FLEX_COUNTER_STATUS": "enable" + } + } + } + }, + "CRM_BRK_CFG_FLEX_TABLE": { + "sonic-crm:sonic-crm": { + "sonic-crm:CRM": { + "Config": { + "acl_counter_low_threshold": "70", + "acl_counter_high_threshold": "85", + "acl_counter_threshold_type": "percentage", + "ipv6_neighbor_high_threshold": "67", + "ipv6_neighbor_low_threshold": "56", + "ipv6_neighbor_threshold_type": "percentage", + "nexthop_group_high_threshold": "67", + "nexthop_group_low_threshold": "56", + "nexthop_group_threshold_type": "percentage", + "polling_interval": "0" + } + } + }, + "sonic-breakout_cfg:sonic-breakout_cfg": { + "sonic-breakout_cfg:BREAKOUT_CFG": { + "BREAKOUT_CFG_LIST": [ + { + "brkout_mode": "1x100G[40G]", + "port": "Ethernet0" + }, + { + "brkout_mode": "4x25G[10G]", + "port": "Ethernet8" + }, + { + "brkout_mode": "2x25G(2)+1x50G(2)", + "port": "Ethernet4" + }, + { + "brkout_mode": "1x400G", + "port": "Ethernet12" + }, + { + "brkout_mode": "2x200G", + "port": "Ethernet16" + }, + { + "brkout_mode": "4x100G", + "port": "Ethernet20" + }, + { + "brkout_mode": "8x50G", + "port": "Ethernet24" + } + ] + } + }, + "sonic-flex_counter:sonic-flex_counter": { + "sonic-flex_counter:FLEX_COUNTER_TABLE": { + "QUEUE": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PG_WATERMARK": { + "FLEX_COUNTER_STATUS": "enable" + }, + "QUEUE_WATERMARK": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PFCWD": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PORT": { + "FLEX_COUNTER_STATUS": "enable" + }, + "DEBUG_COUNTER": { + "FLEX_COUNTER_STATUS": "enable" + } + } + } + }, "ACL_RULE_WRONG_INNER_ETHER_TYPE": { "sonic-acl:sonic-acl": { "sonic-acl:ACL_RULE": { @@ -962,7 +1174,7 @@ }, "DEVICE_METADATA": { "localhost": { - "type": "ToR", + "type": "ToRRouter", "mac": "00:11:22:33:dd:5a", "hostname": "asw.dc", "bgp_asn": "64850", @@ -1450,7 +1662,7 @@ "brkout_mode": "1x100G[40G]" }, "Ethernet4": { - "brkout_mode": "4x25G" + "brkout_mode": "4x25G[10G]" }, "Ethernet8": { "brkout_mode": "1x100G[40G]" @@ -1471,11 +1683,23 @@ "PORT": { "FLEX_COUNTER_STATUS": "enable" }, + "PORT_RATES": { + "FLEX_COUNTER_STATUS": "enable" + }, + "PORT_BUFFER_DROP": { + "FLEX_COUNTER_STATUS": "enable" + }, + "BUFFER_POOL_WATERMARK_KEY": { + "FLEX_COUNTER_STATUS": "enable" + }, "QUEUE": { "FLEX_COUNTER_STATUS": "enable" }, "QUEUE_WATERMARK": { "FLEX_COUNTER_STATUS": "enable" + }, + "DEBUG_COUNTER": { + "FLEX_COUNTER_STATUS": "enable" } }, "CRM": { @@ -1483,6 +1707,12 @@ "acl_counter_high_threshold": "85", "acl_counter_low_threshold": "70", "acl_counter_threshold_type": "percentage", + "ipv6_neighbor_high_threshold": "67", + "ipv6_neighbor_low_threshold": "56", + "ipv6_neighbor_threshold_type": "percentage", + "nexthop_group_high_threshold": "67", + "nexthop_group_low_threshold": "56", + "nexthop_group_threshold_type": "percentage", "polling_interval": "0" } } diff --git a/src/sonic-yang-models/yang-models/sonic-acl.yang b/src/sonic-yang-models/yang-models/sonic-acl.yang index dcddd247e1c1..3ac0abe8074d 100644 --- a/src/sonic-yang-models/yang-models/sonic-acl.yang +++ b/src/sonic-yang-models/yang-models/sonic-acl.yang @@ -5,10 +5,6 @@ module sonic-acl { namespace "http://github.com/Azure/sonic-acl"; prefix acl; - import ietf-yang-types { - prefix yang; - } - import ietf-inet-types { prefix inet; } diff --git a/src/sonic-yang-models/yang-models/sonic-breakout_cfg.yang b/src/sonic-yang-models/yang-models/sonic-breakout_cfg.yang new file mode 100644 index 000000000000..7cc13f1731c7 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-breakout_cfg.yang @@ -0,0 +1,64 @@ +module sonic-breakout_cfg { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-breakout_cfg"; + prefix breakout_cfg; + + import sonic-extension { + prefix ext; + revision-date 2019-07-01; + } + + description "BREAKOUT_CFG YANG Module for SONiC OS"; + + revision 2020-04-10 { + description "First Revision"; + } + + container sonic-breakout_cfg { + + container BREAKOUT_CFG { + + description "BREAKOUT_CFG part of config_db.json"; + + list BREAKOUT_CFG_LIST { + + key "port"; + + ext:key-regex-configdb-to-yang "^([a-zA-Z0-9_-]+)$"; + + ext:key-regex-yang-to-configdb "<port>"; + + /* + * This is leaf instead of a leafref towards port, because this + * table will contains Parent ports and their current breakout-mode, + * irrespective of port is present in PORT table or not. Specially + * during Dynamic Port Breakout, Parent Port may not be present in + * PORT table. + */ + leaf port { + type string { + length 1..255; + } + } + + leaf brkout_mode { + type string { + length 1..64; + /* + * Below allowed patterns are based on most used Platforms, + * Add any other breakout-mode to allow Dynamic Port + * Breakout to that breakout-mode. + */ + pattern '1x100G\[40G\]|2x50G|4x25G\[10G\]|2x25G\(2\)\+1x50G\(2\)|1x50G\(2\)\+2x25G\(2\)|1x400G|2x200G|4x100G|8x50G'; + } + } + } + /* end of list BREAKOUT_CFG_LIST */ + } + /* end of container BREAKOUT_CFG */ + } + /* end of top level container */ +} +/* end of module sonic-breakout_cfg */ diff --git a/src/sonic-yang-models/yang-models/sonic-crm.yang b/src/sonic-yang-models/yang-models/sonic-crm.yang new file mode 100644 index 000000000000..cc53aa7f0d50 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-crm.yang @@ -0,0 +1,303 @@ +module sonic-crm { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-crm"; + prefix crm; + + import sonic-types { + prefix stypes; + revision-date 2019-07-01; + } + + description "CRM YANG Module for SONiC OS"; + + revision 2020-04-10 { + description "First Revision"; + } + + container sonic-crm { + + container CRM { + + description "CRM part of config_db.json"; + + container Config { + + /* typedef specific to CRM */ + typedef threshold { + type uint16; + } + + leaf acl_counter_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../acl_counter_high_threshold<100 and + ../acl_counter_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf acl_counter_high_threshold { + must "(current() > ../acl_counter_low_threshold)" + { + error-message "high_threshold should be more than low_threshold"; + } + type threshold; + } + + leaf acl_counter_low_threshold { + type threshold; + } + + leaf acl_group_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../acl_group_high_threshold<100 and + ../acl_group_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf acl_group_high_threshold { + must "(current() > ../acl_group_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf acl_group_low_threshold { + type threshold; + } + + leaf acl_entry_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../acl_entry_high_threshold<100 and + ../acl_entry_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf acl_entry_high_threshold { + must "(current() > ../acl_entry_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf acl_entry_low_threshold { + type threshold; + } + + leaf acl_table_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../acl_table_high_threshold<100 and + ../acl_table_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf acl_table_high_threshold { + must "(current() > ../acl_table_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf acl_table_low_threshold { + type threshold; + } + + leaf fdb_entry_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../fdb_entry_high_threshold<100 and + ../fdb_entry_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf fdb_entry_high_threshold { + must "(current() > ../fdb_entry_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf fdb_entry_low_threshold { + type threshold; + } + + leaf ipv4_neighbor_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../ipv4_neighbor_high_threshold<100 and + ../ipv4_neighbor_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf ipv4_neighbor_high_threshold { + must "(current() > ../ipv4_neighbor_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf ipv4_neighbor_low_threshold { + type threshold; + } + + leaf ipv4_nexthop_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../ipv4_nexthop_high_threshold<100 and + ../ipv4_nexthop_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf ipv4_nexthop_high_threshold { + must "(current() > ../ipv4_nexthop_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf ipv4_nexthop_low_threshold { + type threshold; + } + + leaf ipv4_route_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../ipv4_route_high_threshold<100 and + ../ipv4_route_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf ipv4_route_high_threshold { + must "(current() > ../ipv4_route_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf ipv4_route_low_threshold { + type threshold; + } + + leaf ipv6_neighbor_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../ipv6_neighbor_high_threshold<100 and + ../ipv6_neighbor_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf ipv6_neighbor_high_threshold { + must "(current() > ../ipv6_neighbor_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf ipv6_neighbor_low_threshold { + type threshold; + } + + leaf ipv6_nexthop_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../ipv6_nexthop_high_threshold<100 and + ../ipv6_nexthop_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf ipv6_nexthop_high_threshold { + must "(current() > ../ipv6_nexthop_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf ipv6_nexthop_low_threshold { + type threshold; + } + + leaf ipv6_route_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../ipv6_route_high_threshold<100 and + ../ipv6_route_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf ipv6_route_high_threshold { + must "(current() > ../ipv6_route_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf ipv6_route_low_threshold { + type threshold; + } + + leaf nexthop_group_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../nexthop_group_high_threshold<100 and + ../nexthop_group_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf nexthop_group_high_threshold { + must "(current() > ../nexthop_group_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf nexthop_group_low_threshold { + type threshold; + } + + leaf nexthop_group_member_threshold_type { + must "(((current()='PERCENTAGE' or current()='percentage') and + ../nexthop_group_member_high_threshold<100 and + ../nexthop_group_member_low_threshold<100) or + (current()!='PERCENTAGE' and current()!='percentage'))"; + type stypes:crm_threshold_type; + } + + leaf nexthop_group_member_high_threshold { + must "(current() > ../nexthop_group_member_low_threshold)" + { + error-message "high_threshold should be more that low_threshold"; + } + type threshold; + } + + leaf nexthop_group_member_low_threshold { + type threshold; + } + + leaf polling_interval { + type threshold; + } + + } + /* end of Config */ + } + /* end of container CRM */ + } + /* end of top level container */ +} +/* end of module sonic-crm */ diff --git a/src/sonic-yang-models/yang-models/sonic-device_metadata.yang b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang new file mode 100644 index 000000000000..054b436f2470 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-device_metadata.yang @@ -0,0 +1,99 @@ +module sonic-device_metadata { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-device_metadata"; + prefix device_metadata; + + import ietf-yang-types { + prefix yang; + } + + import ietf-inet-types { + prefix inet; + } + + import sonic-types { + prefix stypes; + revision-date 2019-07-01; + } + + description "DEVICE_METADATA YANG Module for SONiC OS"; + + revision 2020-04-10 { + description "First Revision"; + } + + container sonic-device_metadata { + + container DEVICE_METADATA { + + description "DEVICE_METADATA part of config_db.json"; + + container localhost{ + + leaf hwsku { + type stypes:hwsku; + } + + leaf default_bgp_status { + type enumeration { + enum up; + enum down; + } + default up; + } + + leaf docker_routing_config_mode { + type string { + pattern "unified|split|separated"; + } + default "unified"; + } + + leaf hostname { + type string { + length 1..255; + } + } + + leaf platform { + type string { + length 1..255; + } + } + + leaf mac { + type yang:mac-address; + } + + leaf default_pfcwd_status { + type enumeration { + enum disable; + enum enable; + } + default disable; + } + + leaf bgp_asn { + type inet:as-number; + } + + leaf deployment_id { + type uint32; + } + + leaf type { + type string { + length 1..255; + pattern "ToRRouter|LeafRouter|SpineChassisFrontendRouter|ChassisBackendRouter|ASIC"; + } + } + } + /* end of container localhost */ + } + /* end of container DEVICE_METADATA */ + } + /* end of top level container */ +} +/* end of module sonic-device_metadata */ diff --git a/src/sonic-yang-models/yang-models/sonic-device_neighbor.yang b/src/sonic-yang-models/yang-models/sonic-device_neighbor.yang new file mode 100644 index 000000000000..c764940fd138 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-device_neighbor.yang @@ -0,0 +1,82 @@ +module sonic-device_neighbor { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-device_neighbor"; + prefix device_neighbor; + + import ietf-inet-types { + prefix inet; + } + + import sonic-extension { + prefix ext; + revision-date 2019-07-01; + } + + import sonic-port { + prefix port; + revision-date 2019-07-01; + } + + description "DEVICE_NEIGHBOR YANG Module for SONiC OS"; + + revision 2020-04-10 { + description "First Revision"; + } + + container sonic-device_neighbor { + + container DEVICE_NEIGHBOR { + + description "DEVICE_NEIGHBOR part of config_db.json"; + + list DEVICE_NEIGHBOR_LIST { + + key "peer_name"; + + ext:key-regex-configdb-to-yang "^([a-zA-Z0-9_-]+)$"; + + ext:key-regex-yang-to-configdb "<peer_name>"; + + leaf peer_name { + type string { + length 1..255; + } + } + + leaf name { + type string { + length 1..255; + } + } + + leaf mgmt_addr { + type inet:ip-address; + } + + leaf local_port { + type leafref { + path /port:sonic-port/port:PORT/port:PORT_LIST/port:port_name; + } + } + + leaf port { + type string { + length 1..255; + } + } + + leaf type { + type string { + length 1..255; + } + } + } + /* end of list DEVICE_NEIGHBOR_LIST */ + } + /* end of container DEVICE_NEIGHBOR */ + } + /* end of top level container */ +} +/* end of module sonic-device_neighbor */ diff --git a/src/sonic-yang-models/yang-models/sonic-flex_counter.yang b/src/sonic-yang-models/yang-models/sonic-flex_counter.yang new file mode 100644 index 000000000000..83b0512aeb21 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-flex_counter.yang @@ -0,0 +1,112 @@ +module sonic-flex_counter { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-flex_counter"; + prefix flex_counter; + + description "FLEX COUNTER YANG Module for SONiC OS"; + + revision 2020-04-10 { + description "First Revision"; + } + + container sonic-flex_counter { + + container FLEX_COUNTER_TABLE { + + /* typedef specific to FLEX_COUNTER_TABLE */ + typedef flex_status { + type enumeration { + enum enable; + enum disable; + } + } + + description "FLEX_COUNTER_TABLE part of config_db.json"; + + /* below are in alphabetical order */ + + container BUFFER_POOL_WATERMARK_KEY { + /* BUFFER_POOL_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container DEBUG_COUNTER { + /* DEBUG_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container PFCWD { + /* PFC_WD_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container PG_WATERMARK { + /* PG_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container PORT { + /* PORT_STAT_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container PORT_RATES { + /* PORT_BUFFER_DROP_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container PORT_BUFFER_DROP { + /* PORT_BUFFER_DROP_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container QUEUE { + /* QUEUE_STAT_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container QUEUE_WATERMARK { + /* QUEUE_WATERMARK_STAT_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container RIF { + /* RIF_STAT_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + container RIF_RATES { + /* RIF_RATE_COUNTER_FLEX_COUNTER_GROUP */ + leaf FLEX_COUNTER_STATUS { + type flex_status; + } + } + + } + /* end of container FLEX_COUNTER_TABLE */ + } + /* end of top level container */ +} +/* end of module sonic-flex_counter */ diff --git a/src/sonic-yang-models/yang-models/sonic-interface.yang b/src/sonic-yang-models/yang-models/sonic-interface.yang index d47268be69f9..9585aabbb2c2 100644 --- a/src/sonic-yang-models/yang-models/sonic-interface.yang +++ b/src/sonic-yang-models/yang-models/sonic-interface.yang @@ -5,14 +5,6 @@ module sonic-interface { namespace "http://github.com/Azure/sonic-interface"; prefix intf; - import ietf-yang-types { - prefix yang; - } - - import ietf-inet-types { - prefix inet; - } - import sonic-types { prefix stypes; revision-date 2019-07-01; diff --git a/src/sonic-yang-models/yang-models/sonic-loopback-interface.yang b/src/sonic-yang-models/yang-models/sonic-loopback-interface.yang index 6b509a8df349..1ed165d26c3b 100644 --- a/src/sonic-yang-models/yang-models/sonic-loopback-interface.yang +++ b/src/sonic-yang-models/yang-models/sonic-loopback-interface.yang @@ -5,10 +5,6 @@ module sonic-loopback-interface { namespace "http://github.com/Azure/sonic-loopback-interface"; prefix lointf; - import ietf-inet-types { - prefix inet; - } - import sonic-types { prefix stypes; revision-date 2019-07-01; diff --git a/src/sonic-yang-models/yang-models/sonic-port.yang b/src/sonic-yang-models/yang-models/sonic-port.yang index 574780dcf064..8a41d13f1a49 100644 --- a/src/sonic-yang-models/yang-models/sonic-port.yang +++ b/src/sonic-yang-models/yang-models/sonic-port.yang @@ -5,14 +5,6 @@ module sonic-port{ namespace "http://github.com/Azure/sonic-port"; prefix port; - import ietf-yang-types { - prefix yang; - } - - import ietf-inet-types { - prefix inet; - } - import sonic-types { prefix stypes; revision-date 2019-07-01; diff --git a/src/sonic-yang-models/yang-models/sonic-portchannel.yang b/src/sonic-yang-models/yang-models/sonic-portchannel.yang index 8d27398c61e8..69c8fa6ac161 100644 --- a/src/sonic-yang-models/yang-models/sonic-portchannel.yang +++ b/src/sonic-yang-models/yang-models/sonic-portchannel.yang @@ -5,14 +5,6 @@ module sonic-portchannel { namespace "http://github.com/Azure/sonic-portchannel"; prefix lag; - import ietf-yang-types { - prefix yang; - } - - import ietf-inet-types { - prefix inet; - } - import sonic-types { prefix stypes; revision-date 2019-07-01; diff --git a/src/sonic-yang-models/yang-models/sonic-types.yang b/src/sonic-yang-models/yang-models/sonic-types.yang index fb651847582e..0bfcddc56103 100644 --- a/src/sonic-yang-models/yang-models/sonic-types.yang +++ b/src/sonic-yang-models/yang-models/sonic-types.yang @@ -6,6 +6,10 @@ module sonic-types { prefix sonic-types; description "SONiC type for yang Models of SONiC OS"; + /* + * Try to define only sonic specific types here. Rest can be written in + * respective YANG files. + */ revision 2019-07-01 { description "First Revision"; @@ -82,6 +86,13 @@ module sonic-types { } } + typedef hwsku { + type string { + length 1..255; + /* Should we list all hwsku here */ + } + } + typedef vlan_tagging_mode { type enumeration { enum tagged; @@ -89,4 +100,11 @@ module sonic-types { enum priority_tagged; } } + + typedef crm_threshold_type { + type string { + length 1..64; + pattern "percentage|used|free|PERCENTAGE|USED|FREE"; + } + } } diff --git a/src/sonic-yang-models/yang-models/sonic-versions.yang b/src/sonic-yang-models/yang-models/sonic-versions.yang new file mode 100644 index 000000000000..156102122706 --- /dev/null +++ b/src/sonic-yang-models/yang-models/sonic-versions.yang @@ -0,0 +1,36 @@ +module sonic-versions { + + yang-version 1.1; + + namespace "http://github.com/Azure/sonic-versions"; + prefix versions; + + + description "VERSIONS YANG Module for SONiC OS"; + + revision 2020-04-10 { + description "First Revision"; + } + + container sonic-versions { + + container VERSIONS { + + description "DATABASE SCHEMA VERSIONS part of config_db.json"; + + container DATABASE { + + leaf VERSION { + type string { + length 1..255; + pattern 'version_([1-9]|[1-9]{1}[0-9]{1})_([0-9]{1,2})_([0-9]{1,2})'; + } + } + } + /* end of container DATABASE */ + } + /* end of container VERSIONS */ + } + /* end of top level container */ +} +/* end of module sonic-versions */ diff --git a/src/sonic-yang-models/yang-models/sonic-vlan.yang b/src/sonic-yang-models/yang-models/sonic-vlan.yang index 6d2b9b154cbe..d00e68b39029 100644 --- a/src/sonic-yang-models/yang-models/sonic-vlan.yang +++ b/src/sonic-yang-models/yang-models/sonic-vlan.yang @@ -5,10 +5,6 @@ module sonic-vlan { namespace "http://github.com/Azure/sonic-vlan"; prefix vlan; - import ietf-yang-types { - prefix yang; - } - import ietf-inet-types { prefix inet; }