[Yang model] SONiC QOS Scheduler, WRED, Queue Yangs (#7281)

This commit is contained in:
Ashok Daparthi-Dell 2021-10-18 10:01:08 -07:00 committed by GitHub
parent 5356244e53
commit a99d78dedb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 1028 additions and 1 deletions

View File

@ -76,6 +76,9 @@ setup(
'./yang-models/sonic-vrf.yang',
'./yang-models/sonic-warm-restart.yang',
'./yang-models/sonic-lldp.yang',
'./yang-models/sonic-scheduler.yang',
'./yang-models/sonic-wred-profile.yang',
'./yang-models/sonic-queue.yang',
'./yang-models/sonic_yang_tree']),
],
zip_safe=False,

View File

@ -1138,6 +1138,56 @@
"high_mem_alert": "disabled",
"state": "enabled"
}
},
"SCHEDULER": {
"TEST@0": {
"cbs": "256",
"cir": "1250000",
"meter_type": "bytes",
"pbs": "1024",
"pir": "25000000",
"type": "DWRR",
"weight": "20"
},
"TEST@1": {
"cbs": "1024",
"cir": "1280000",
"meter_type": "bytes",
"pbs": "2048",
"pir": "2560000",
"type": "STRICT"
}
},
"WRED_PROFILE": {
"Wred1": {
"ecn": "ecn_all",
"green_drop_probability": "50",
"green_max_threshold": "2048000",
"green_min_threshold": "1024000",
"wred_green_enable": "true",
"yellow_drop_probability": "50",
"yellow_max_threshold": "2048000",
"yellow_min_threshold": "1024000",
"wred_yellow_enable": "true",
"red_drop_probability": "50",
"red_max_threshold": "2048000",
"red_min_threshold": "1024000",
"wred_red_enable": "true"
}
},
"QUEUE": {
"Ethernet0|0": {
"scheduler": "TEST@0",
"wred_profile": "Wred1"
},
"Ethernet0|1": {
"scheduler": "TEST@1",
"wred_profile": "Wred1"
}
}
},
@ -1146,5 +1196,4 @@
"Error": "This Table is for testing, This Table does not have YANG models."
}
}
}

View File

@ -0,0 +1,85 @@
{
"SCHEDULER_VALID": {
"desc": "Configure SCHEDULER table."
},
"SCHEDULER_UNDEFINED_TYPE": {
"desc": "Configure undefined type in SCHEDULER table.",
"eStrKey" : "InvalidValue",
"eStr": ["type"]
},
"SCHEDULER_INVALID_WEIGHT": {
"desc": "Configure outof range weight in SCHEDULER table.",
"eStrKey" : "Pattern"
},
"SCHEDULER_INVALID_METER_TYPE": {
"desc": "Configure unsuported meter type in SCHEDULER table.",
"eStrKey": "InvalidValue",
"eStr": ["meter_type"]
},
"SCHEDULER_CBS_NO_CIR": {
"desc": "Configure CBS without CIR.",
"eStr": ["cbs can't be configured without cir"]
},
"SCHEDULER_PIR_NO_CIR": {
"desc": "Configure PIR without CIR.",
"eStr": ["pir can't be configured without cir"]
},
"SCHEDULER_PIR_VS_CIR": {
"desc": "Configure PIR vs CIR.",
"eStr": ["pir must be greater than or equal to cir"]
},
"WRED_PROFILE_EMPTY": {
"desc": "Configure Empty WRED profile."
},
"WRED_PROFILE_VALID": {
"desc": "Configure WRED profile."
},
"WRED_PROFILE_INVALID_DROP_PROBABILITY": {
"desc": "Configure invalid drop probability in WRED profile.",
"eStrKey" : "Pattern"
},
"WRED_PROFILE_INVALID_GREEN_THRESHOLD": {
"desc": "Configure green maximum threshold less than min threshold in WRED profile.",
"eStr": ["Green max threshold must be greater than or equal to min threshold"]
},
"WRED_PROFILE_INVALID_YELLOW_THRESHOLD": {
"desc": "Configure yellow maximum threshold less than min threshold in WRED profile.",
"eStr": ["Yellow max threshold must be greater than or equal to min threshold"]
},
"WRED_PROFILE_INVALID_RED_THRESHOLD": {
"desc": "Configure red maximum threshold less than min threshold in WRED profile.",
"eStr": ["Red max threshold must be greater than or equal to min threshold"]
},
"QUEUE_VALID": {
"desc": "Attach scheduler and wred profiles to QUEUE."
},
"QUEUE_PORT_NOT_EXIST": {
"desc": "Referring non-existing PORT table.",
"eStrKey": "InvalidValue"
},
"QUEUE_SCHEDULER_NOT_EXIST": {
"desc": "Referring non-existing SCHEDULER table.",
"eStrKey" : "LeafRef"
},
"QUEUE_WRED_NOT_EXIST": {
"desc": "Referring non-existing WRED table.",
"eStrKey" : "LeafRef"
}
}

View File

@ -0,0 +1,477 @@
{
"SCHEDULER_VALID": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"cbs": 256,
"cir": 1250000,
"meter_type": "bytes",
"pbs": 1024,
"pir": 25000000,
"type": "DWRR",
"weight": 10
},
{
"name":"Test@1",
"cbs": 1024,
"cir": 1280000,
"meter_type": "bytes",
"pbs": 2048,
"pir": 2560000,
"type": "STRICT",
"priority": 0
},
{
"name":"Test@2",
"cbs": 256,
"cir": 1250000,
"meter_type": "bytes",
"pbs": 1024,
"pir": 25000000,
"type": "WRR",
"weight": 20
}
]
}
}
},
"SCHEDULER_UNDEFINED_TYPE": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"type": "invalid"
}
]
}
}
},
"SCHEDULER_INVALID_WEIGHT": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"weight": 120
}
]
}
}
},
"SCHEDULER_INVALID_METER_TYPE": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"meter_type": "invalid"
}
]
}
}
},
"SCHEDULER_CBS_NO_CIR": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"cbs": 1024
}
]
}
}
},
"SCHEDULER_PIR_NO_CIR": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"pir": 1024
}
]
}
}
},
"SCHEDULER_PIR_VS_CIR": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"cir": 2048,
"pir": 1024
}
]
}
}
},
"WRED_PROFILE_EMPTY": {
"sonic-wred-profile:sonic-wred-profile":{
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred1"
}
]
}
}
},
"WRED_PROFILE_VALID": {
"sonic-wred-profile:sonic-wred-profile":{
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred2",
"yellow_min_threshold": 2048,
"green_min_threshold": 4096,
"red_min_threshold": 1024,
"yellow_max_threshold": 4096,
"green_max_threshold": 8192,
"red_max_threshold": 2048,
"ecn": "ecn_none",
"wred_green_enable": true,
"wred_yellow_enable": true,
"wred_red_enable": true,
"yellow_drop_probability": 50,
"green_drop_probability": 25,
"red_drop_probability": 100
},
{
"name":"Wred3",
"yellow_min_threshold": 2048,
"green_min_threshold": 4096,
"red_min_threshold": 1024,
"yellow_max_threshold": 4096,
"green_max_threshold": 8192,
"red_max_threshold": 2048,
"ecn": "ecn_all",
"wred_green_enable": true,
"wred_yellow_enable": true,
"wred_red_enable": true,
"yellow_drop_probability": 50,
"green_drop_probability": 25,
"red_drop_probability": 100
},
{
"name":"Wred4",
"green_min_threshold": 4096,
"green_max_threshold": 8192,
"ecn": "ecn_all",
"wred_green_enable": true
}
]
}
}
},
"WRED_PROFILE_INVALID_DROP_PROBABILITY": {
"sonic-wred-profile:sonic-wred-profile": {
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred4",
"red_min_threshold": 1024,
"red_max_threshold": 2048,
"wred_red_enable": true,
"red_drop_probability": 125,
"green_drop_probability": 25,
"yellow_drop_probability": 25,
"ecn": "ecn_all"
}
]
}
}
},
"WRED_PROFILE_INVALID_GREEN_THRESHOLD": {
"sonic-wred-profile:sonic-wred-profile": {
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred4",
"green_min_threshold": 4096,
"green_max_threshold": 2048,
"wred_green_enable": true,
"green_drop_probability": 25,
"ecn": "ecn_all"
}
]
}
}
},
"WRED_PROFILE_INVALID_YELLOW_THRESHOLD": {
"sonic-wred-profile:sonic-wred-profile": {
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred4",
"yellow_min_threshold": 4096,
"yellow_max_threshold": 2048,
"wred_yellow_enable": true,
"yellow_drop_probability": 25,
"ecn": "ecn_all"
}
]
}
}
},
"WRED_PROFILE_INVALID_RED_THRESHOLD": {
"sonic-wred-profile:sonic-wred-profile": {
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred4",
"red_min_threshold": 4096,
"red_max_threshold": 2048,
"wred_red_enable": true,
"red_drop_probability": 25,
"ecn": "ecn_all"
}
]
}
}
},
"QUEUE_VALID": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"cbs": 256,
"cir": 1250000,
"meter_type": "bytes",
"pbs": 1024,
"pir": 25000000,
"type": "DWRR",
"weight": 10
}
]
}
},
"sonic-wred-profile:sonic-wred-profile":{
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred1",
"yellow_min_threshold": 2048,
"green_min_threshold": 4096,
"red_min_threshold": 1024,
"yellow_max_threshold": 4096,
"green_max_threshold": 8192,
"red_max_threshold": 2048,
"ecn": "ecn_none",
"wred_green_enable": true,
"wred_yellow_enable": true,
"wred_red_enable": true,
"yellow_drop_probability": 50,
"green_drop_probability": 25,
"red_drop_probability": 100
}
]
}
},
"sonic-port:sonic-port": {
"sonic-port:PORT": {
"PORT_LIST": [
{
"admin_status": "up",
"alias": "eth8",
"description": "Ethernet0",
"lanes": "65",
"mtu": 9000,
"name": "Ethernet0",
"speed": 25000
}
]
}
},
"sonic-queue:sonic-queue": {
"sonic-queue:QUEUE": {
"QUEUE_LIST": [
{
"ifname": "Ethernet0",
"qindex": "0",
"scheduler": "Test@0",
"wred_profile": "Wred1"
}
]
}
}
},
"QUEUE_PORT_NOT_EXIST": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"cbs": 256,
"cir": 1250000,
"meter_type": "bytes",
"pbs": 1024,
"pir": 25000000,
"type": "DWRR",
"weight": 10
}
]
}
},
"sonic-wred-profile:sonic-wred-profile":{
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred1",
"yellow_min_threshold": 2048,
"green_min_threshold": 4096,
"red_min_threshold": 1024,
"yellow_max_threshold": 4096,
"green_max_threshold": 8192,
"red_max_threshold": 2048,
"ecn": "ecn_none",
"wred_green_enable": true,
"wred_yellow_enable": true,
"wred_red_enable": true,
"yellow_drop_probability": 50,
"green_drop_probability": 25,
"red_drop_probability": 100
}
]
}
},
"sonic-queue:sonic-queue": {
"sonic-queue:QUEUE": {
"QUEUE_LIST": [
{
"ifname": "Ethernet0",
"qindex": "0",
"scheduler": "Test@0",
"wred_profile": "Wred1"
}
]
}
}
},
"QUEUE_SCHEDULER_NOT_EXIST": {
"sonic-wred-profile:sonic-wred-profile":{
"sonic-wred-profile:WRED_PROFILE": {
"WRED_PROFILE_LIST": [
{
"name":"Wred1",
"yellow_min_threshold": 2048,
"green_min_threshold": 4096,
"red_min_threshold": 1024,
"yellow_max_threshold": 4096,
"green_max_threshold": 8192,
"red_max_threshold": 2048,
"ecn": "ecn_none",
"wred_green_enable": true,
"wred_yellow_enable": true,
"wred_red_enable": true,
"yellow_drop_probability": 50,
"green_drop_probability": 25,
"red_drop_probability": 100
}
]
}
},
"sonic-port:sonic-port": {
"sonic-port:PORT": {
"PORT_LIST": [
{
"admin_status": "up",
"alias": "eth8",
"description": "Ethernet4",
"lanes": "65",
"mtu": 9000,
"name": "Ethernet4",
"speed": 25000
}
]
}
},
"sonic-queue:sonic-queue": {
"sonic-queue:QUEUE": {
"QUEUE_LIST": [
{
"ifname": "Ethernet4",
"qindex": "0",
"scheduler": "Test@0",
"wred_profile": "Wred1"
}
]
}
}
},
"QUEUE_WRED_NOT_EXIST": {
"sonic-scheduler:sonic-scheduler":{
"sonic-scheduler:SCHEDULER": {
"SCHEDULER_LIST": [
{
"name":"Test@0",
"cbs": 256,
"cir": 1250000,
"meter_type": "bytes",
"pbs": 1024,
"pir": 25000000,
"type": "DWRR",
"weight": 10
}
]
}
},
"sonic-port:sonic-port": {
"sonic-port:PORT": {
"PORT_LIST": [
{
"admin_status": "up",
"alias": "eth8",
"description": "Ethernet8",
"lanes": "65",
"mtu": 9000,
"name": "Ethernet8",
"speed": 25000
}
]
}
},
"sonic-queue:sonic-queue": {
"sonic-queue:QUEUE": {
"QUEUE_LIST": [
{
"ifname": "Ethernet8",
"qindex": "0",
"scheduler": "Test@0",
"wred_profile": "Wred1"
}
]
}
}
}
}

View File

@ -0,0 +1,88 @@
module sonic-queue {
yang-version 1.1;
namespace "http://github.com/Azure/sonic-queue";
prefix squeue;
import sonic-extension {
prefix sonic-ext;
}
import sonic-port {
prefix port;
}
import sonic-scheduler {
prefix sch;
}
import sonic-wred-profile {
prefix wrd;
}
organization
"SONiC";
contact
"SONiC";
description
"QUEUE yang Module for SONiC OS";
revision 2021-04-01 {
description
"Initial revision";
}
container sonic-queue {
container QUEUE {
description "QUEUE part of config_db.json";
list QUEUE_LIST {
key "ifname qindex";
// sonic-ext:key-pattern "QUEUE|{ifname}|{qindex}"; //special pattern used for extracting keys from redis-key and populate the yang instance
// Total list instances = number(key1) * number(key2) * number(key3)
leaf ifname {
type union {
type leafref {
path "/port:sonic-port/port:PORT/port:PORT_LIST/port:name";
}
type string {
pattern "CPU";
}
}
description "Interface name.";
}
// qindex format is (X) | (X-Y). X is start and Y is end index.
// X and Y value depends on platform, example for physical ports 0-7 and
// for CPU port 0-48. Example qindex is 3-4
leaf qindex {
// sonic-ext:custom-validation ValidateQindexPattern;
type string;
description "Queue index on the interface.";
}
leaf scheduler {
type leafref {
path "/sch:sonic-scheduler/sch:SCHEDULER/sch:SCHEDULER_LIST/sch:name"; //Reference to SCHEDULER table
}
description "Scheduler for queue.";
}
leaf wred_profile {
type leafref {
path "/wrd:sonic-wred-profile/wrd:WRED_PROFILE/wrd:WRED_PROFILE_LIST/wrd:name"; // Reference to WRED_PROFILE table
}
description "Wred profile for queue.";
}
}
}
}
}

View File

@ -0,0 +1,148 @@
module sonic-scheduler {
yang-version 1.1;
namespace "http://github.com/Azure/sonic-scheduler";
prefix sch;
organization
"SONiC";
contact
"SONiC";
description
"SCHEDULER yang Module for SONiC OS";
revision 2021-04-01 {
description
"Initial revision";
}
container sonic-scheduler {
container SCHEDULER {
description "SCHEDULER part of config_db.json";
list SCHEDULER_LIST {
key "name";
leaf name {
type string {
pattern "[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{0,31})|[a-zA-Z0-9]{1}([-a-zA-Z0-9_]{0,31})([@]{1})([0-9]{1,3})";
length 1..36 {
error-message "Invalid length for scheduler name.";
error-app-tag scheduler-name-invalid-length;
}
}
description "Scheduler name";
}
leaf type {
type enumeration {
enum DWRR {
description "Deficit Weighted Round-Robin Scheduling";
}
enum WRR {
description "Weighted Round-Robin Scheduling";
}
enum STRICT {
description "Strict Scheduling";
}
}
default WRR;
description "Scheduling algorithm type";
}
leaf weight {
type uint8 {
range "1..100";
}
default 1;
description "Scheduling algorithm weight";
}
leaf priority {
type uint8 {
range "0..9";
}
description "Scheduler priority";
}
leaf meter_type {
type enumeration {
enum packets {
description "Metering is based on packets";
}
enum bytes {
description "Metering is based on bytes";
}
}
default bytes;
description "meter type";
}
leaf cir {
type uint64;
description
"Committed information rate for the dual-rate token
bucket policer.This value represents the rate at which
tokens are added to the primary bucket.nt Units is
Bps(Bytes per second) for meter type is bytes else
Pps(packets per second) for meter type is packets";
}
leaf pir {
must "((current()/../cir) and (current()/../cir > 0))" {
error-message "pir can't be configured without cir.";
}
must "(current() >= current()/../cir)" {
error-message "pir must be greater than or equal to cir";
}
type uint64;
description
"Peak information rate for the dual-rate token bucket
policer.This value represents the rate at which tokens
are added to the secondary bucket.Unit is Bps(Bytes
per second) for meter type bytes else Pps(packets per
second) for meter type is packets";
}
leaf cbs {
must "((current()/../cir) and (current()/../cir > 0))" {
error-message "cbs can't be configured without cir.";
}
type uint32;
description
"Committed burst size for the dual-rate token bucket
policer.This value represents the depth of the token
bucket.Unit is bytes for meter type bytes else packets
for meter type is packets";
}
leaf pbs {
must "((current()/../pir) and (current()/../pir > 0))" {
error-message "pbs can't be configured without pir.";
}
must "((not(current()/../cbs)) or (current() >= current()/../cbs))" {
error-message "pbs must be greater than or equal to cbs";
}
type uint32;
description
"Excess burst size for the dual-rate token bucket policer.
This value represents the depth of the secondary bucket.
Unit is bytes for meter type bytes else packets for meter type
is packets";
}
}
}
}
}

View File

@ -0,0 +1,177 @@
module sonic-wred-profile {
yang-version 1.1;
namespace "http://github.com/Azure/sonic-wred-profile";
prefix wrd;
organization
"SONiC";
contact
"SONiC";
description
"WRED_PROFILE yang Module for SONiC OS";
revision 2021-04-01 {
description
"Initial revision.";
}
container sonic-wred-profile {
container WRED_PROFILE {
description "WRED_PROFILE part of config_db.json";
list WRED_PROFILE_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 wred profile name.";
error-app-tag wred-profile-name-invalid-length;
}
}
description "WRED profile name";
}
leaf yellow_min_threshold {
type uint64;
units bytes;
description "Yellow minimum threshold bytes";
}
leaf green_min_threshold {
type uint64;
units bytes;
description "Green minimum threshold bytes";
}
leaf red_min_threshold {
type uint64;
units bytes;
description "Red minimum threshold bytes";
}
leaf yellow_max_threshold {
type uint64;
units bytes;
must "(current() >= current()/../yellow_min_threshold)" {
error-message "Yellow max threshold must be greater than or equal to min threshold";
}
description "Yellow maximum threshold bytes";
}
leaf green_max_threshold {
type uint64;
units bytes;
must "(current() >= current()/../green_min_threshold)" {
error-message "Green max threshold must be greater than or equal to min threshold";
}
description "Green maximum threshold bytes";
}
leaf red_max_threshold {
type uint64;
units bytes;
must "(current() >= current()/../red_min_threshold)" {
error-message "Red max threshold must be greater than or equal to min threshold";
}
description "Red maximum threshold bytes";
}
leaf ecn {
type enumeration {
enum ecn_none {
description "Disable ECN marking for all colors.";
}
enum ecn_green {
description "Enable ECN marking for green color. Yellow and red are disabled.";
}
enum ecn_yellow {
description "Enable ECN marking for yellow color. Green and red are disabled.";
}
enum ecn_red {
description "Enable ECN marking for red color. Green and red are disabled.";
}
enum ecn_green_yellow {
description "Enable ECN marking for green and yellow colors. Red is disabled.";
}
enum ecn_green_red {
description "Enable ECN marking for green and red colors. Yellow is disabled.";
}
enum ecn_yellow_red {
description "Enable ECN marking for yellow and red colors. Green is disabled.";
}
enum ecn_all {
description "Enable ECN marking for all colors.";
}
}
default ecn_none;
description "ECN mode";
}
leaf wred_green_enable {
type boolean;
default false;
description "Green enable";
}
leaf wred_yellow_enable {
type boolean;
default false;
description "Yellow enable";
}
leaf wred_red_enable {
type boolean;
default false;
description "Red enable";
}
leaf yellow_drop_probability {
type uint64 {
range "0..100";
}
units percent;
default 100;
description "Yellow drop probability";
}
leaf green_drop_probability {
type uint64 {
range "0..100";
}
units percent;
default 100;
description "Green drop probability";
}
leaf red_drop_probability {
type uint64 {
range "0..100";
}
units percent;
default 100;
description "Red drop probability";
}
}
}
}
}