6b48346ff5
#### Why I did it To enable qos config for a certain backend deployment mode, for resource-type "Compute-AI". This deployment has the following requirement: - Config below enabled if DEVICE_TYPE as one of backend_device_types - Config below enabled if ResourceType is 'Compute-AI' - 2 lossless TCs' (2, 3) - 2 lossy TCs' (0,1) - DSCP to TC map uses 4 DSCP code points and maps to the TCs' as follows: "DSCP_TO_TC_MAP": { "AZURE": { "48" : "0", "46" : "1", "3" : "3", "4" : "4" } } - WRED profile has green {min/max/mark%} as {2M/10M/5%} This required template change <as in the PR> in addition to the vendor qos.json.j2 file (not included here). ### How I did it #### How to verify it - with the above change and the vendor config change, generated the qos.json file and verified that the objective stated in "Why I did it" was met - verified no error ### Description for the changelog Update qos_config.j2 for Comptue-AI deployment on one of backend device type roles
494 lines
15 KiB
Django/Jinja
494 lines
15 KiB
Django/Jinja
{%- set PORT_ALL = [] %}
|
|
{%- set PORT_BP = [] %}
|
|
{%- set SYSTEM_PORT_ALL = [] %}
|
|
|
|
{%- set voq_chassis = false %}
|
|
{%- if DEVICE_METADATA is defined and DEVICE_METADATA['localhost']['switch_type'] is defined and DEVICE_METADATA['localhost']['switch_type'] == 'voq' %}
|
|
{%- set voq_chassis = true %}
|
|
{%- endif -%}
|
|
|
|
{%- if voq_chassis %}
|
|
{%- for system_port in SYSTEM_PORT %}
|
|
{% if '|' not in system_port %}
|
|
{%- set system_port_name = system_port|join("|") %}
|
|
{% else %}
|
|
{%- set system_port_name = system_port %}
|
|
{% endif %}
|
|
{%- if 'cpu' not in system_port_name.lower() and 'IB' not in system_port_name and 'Rec' not in system_port_name %}
|
|
{%- if SYSTEM_PORT_ALL.append(system_port_name) %}{%- endif %}
|
|
{%- endif %}
|
|
{%- endfor %}
|
|
{%- endif %}
|
|
{%- for port in PORT %}
|
|
{%- if not port.startswith('Ethernet-Rec') and not port.startswith('Ethernet-IB') %}
|
|
{%- if PORT_ALL.append(port) %}{% endif %}
|
|
{%- endif %}
|
|
{%- endfor %}
|
|
{%- if generate_bp_port_list is defined %}
|
|
{%- if generate_bp_port_list(PORT,PORT_BP) %} {% endif %}
|
|
{%- endif %}
|
|
|
|
{%- if PORT_ALL | sort_by_port_index %}{% endif %}
|
|
|
|
{%- set port_names_list_all = [] %}
|
|
{%- for port in PORT_ALL %}
|
|
{%- if port_names_list_all.append(port) %}{% endif %}
|
|
{%- endfor %}
|
|
{%- set port_names_all = port_names_list_all | join(',') -%}
|
|
|
|
|
|
{%- set PORT_ACTIVE = [] %}
|
|
{%- if DEVICE_NEIGHBOR is not defined %}
|
|
{%- set PORT_ACTIVE = PORT_ALL %}
|
|
{%- else %}
|
|
{%- for port in DEVICE_NEIGHBOR.keys() %}
|
|
{%- if PORT_ACTIVE.append(port) %}{%- endif %}
|
|
{%- endfor %}
|
|
{%- for port in PORT_BP %}
|
|
{%- if PORT_ACTIVE.append(port) %}{%- endif %}
|
|
{%- endfor %}
|
|
{%- endif %}
|
|
{%- if PORT_ACTIVE | sort_by_port_index %}{% endif %}
|
|
|
|
{%- set port_names_list_active = [] %}
|
|
{%- for port in PORT_ACTIVE %}
|
|
{%- if port_names_list_active.append(port) %}{%- endif %}
|
|
{%- endfor %}
|
|
{%- set port_names_active = port_names_list_active | join(',') -%}
|
|
|
|
{%- set tunnel_qos_remap_enable = false %}
|
|
{%- if ((SYSTEM_DEFAULTS is defined) and ('tunnel_qos_remap' in SYSTEM_DEFAULTS) and (SYSTEM_DEFAULTS['tunnel_qos_remap']['status'] == 'enabled')) %}
|
|
{%- set tunnel_qos_remap_enable = true %}
|
|
{%- endif %}
|
|
|
|
{%- set port_names_list_extra_queues = [] %}
|
|
{%- for port in PORT_ACTIVE %}
|
|
{% if ((generate_dscp_to_tc_map is defined) and tunnel_qos_remap_enable) and
|
|
(('type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] == 'LeafRouter' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'ToRRouter') or
|
|
('subtype' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['subtype'] == 'DualToR' and DEVICE_NEIGHBOR_METADATA is defined and DEVICE_NEIGHBOR[port].name in DEVICE_NEIGHBOR_METADATA and DEVICE_NEIGHBOR_METADATA[DEVICE_NEIGHBOR[port].name].type == 'LeafRouter')) %}
|
|
{%- if port_names_list_extra_queues.append(port) %}{%- endif %}
|
|
{% endif %}
|
|
{%- endfor %}
|
|
|
|
{%- set pfc_to_pg_map_supported_asics = ['mellanox', 'barefoot', 'marvell'] -%}
|
|
{%- set backend_device_types = ['BackEndToRRouter', 'BackEndLeafRouter'] -%}
|
|
{%- set apollo_resource_types = ['DL-NPU-Apollo'] -%}
|
|
|
|
{%- set require_global_dscp_to_tc_map = true -%}
|
|
|
|
{
|
|
{% if (generate_tc_to_pg_map is defined) and tunnel_qos_remap_enable %}
|
|
{{- generate_tc_to_pg_map() }}
|
|
{% elif (generate_tc_to_pg_map is defined) and
|
|
('type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['type'] in backend_device_types) and
|
|
('resource_type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['resource_type'] == 'Compute-AI') %}
|
|
{{- generate_tc_to_pg_map() }}
|
|
{% else %}
|
|
"TC_TO_PRIORITY_GROUP_MAP": {
|
|
"AZURE": {
|
|
"0": "0",
|
|
"1": "0",
|
|
"2": "0",
|
|
"3": "3",
|
|
"4": "4",
|
|
"5": "0",
|
|
"6": "0",
|
|
"7": "7"
|
|
}
|
|
},
|
|
{% endif %}
|
|
"MAP_PFC_PRIORITY_TO_QUEUE": {
|
|
"AZURE": {
|
|
"0": "0",
|
|
"1": "1",
|
|
"2": "2",
|
|
"3": "3",
|
|
"4": "4",
|
|
"5": "5",
|
|
"6": "6",
|
|
"7": "7"
|
|
}
|
|
},
|
|
{% if (generate_tc_to_queue_map is defined) and tunnel_qos_remap_enable %}
|
|
{{- generate_tc_to_queue_map() }}
|
|
{% else %}
|
|
"TC_TO_QUEUE_MAP": {
|
|
"AZURE": {
|
|
"0": "0",
|
|
"1": "1",
|
|
"2": "2",
|
|
"3": "3",
|
|
"4": "4",
|
|
"5": "5",
|
|
"6": "6",
|
|
"7": "7"
|
|
}
|
|
},
|
|
{% endif %}
|
|
{% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] in backend_device_types and 'storage_device' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['storage_device'] == 'true' %}
|
|
{%- set require_global_dscp_to_tc_map = false %}
|
|
"DOT1P_TO_TC_MAP": {
|
|
"AZURE": {
|
|
"0": "1",
|
|
"1": "0",
|
|
"2": "2",
|
|
"3": "3",
|
|
"4": "4",
|
|
"5": "5",
|
|
"6": "6",
|
|
"7": "7"
|
|
}
|
|
},
|
|
{% elif (generate_dscp_to_tc_map is defined) and tunnel_qos_remap_enable %}
|
|
{{- generate_dscp_to_tc_map() }}
|
|
{% elif (generate_dscp_to_tc_map is defined) and
|
|
('type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['type'] in backend_device_types) and
|
|
('resource_type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['resource_type'] == 'Compute-AI') %}
|
|
{{- generate_dscp_to_tc_map() }}
|
|
{% else %}
|
|
"DSCP_TO_TC_MAP": {
|
|
"AZURE": {
|
|
"0" : "1",
|
|
"1" : "1",
|
|
"2" : "1",
|
|
"3" : "3",
|
|
"4" : "4",
|
|
"5" : "2",
|
|
"6" : "1",
|
|
"7" : "1",
|
|
"8" : "0",
|
|
"9" : "1",
|
|
"10": "1",
|
|
"11": "1",
|
|
"12": "1",
|
|
"13": "1",
|
|
"14": "1",
|
|
"15": "1",
|
|
"16": "1",
|
|
"17": "1",
|
|
"18": "1",
|
|
"19": "1",
|
|
"20": "1",
|
|
"21": "1",
|
|
"22": "1",
|
|
"23": "1",
|
|
"24": "1",
|
|
"25": "1",
|
|
"26": "1",
|
|
"27": "1",
|
|
"28": "1",
|
|
"29": "1",
|
|
"30": "1",
|
|
"31": "1",
|
|
"32": "1",
|
|
"33": "1",
|
|
"34": "1",
|
|
"35": "1",
|
|
"36": "1",
|
|
"37": "1",
|
|
"38": "1",
|
|
"39": "1",
|
|
"40": "1",
|
|
"41": "1",
|
|
"42": "1",
|
|
"43": "1",
|
|
"44": "1",
|
|
"45": "1",
|
|
"46": "5",
|
|
"47": "1",
|
|
"48": "6",
|
|
"49": "1",
|
|
"50": "1",
|
|
"51": "1",
|
|
"52": "1",
|
|
"53": "1",
|
|
"54": "1",
|
|
"55": "1",
|
|
"56": "1",
|
|
"57": "1",
|
|
"58": "1",
|
|
"59": "1",
|
|
"60": "1",
|
|
"61": "1",
|
|
"62": "1",
|
|
"63": "1"
|
|
}
|
|
},
|
|
{% endif %}
|
|
{% if (generate_tc_to_dscp_map is defined) and tunnel_qos_remap_enable %}
|
|
{{- generate_tc_to_dscp_map() }}
|
|
{% endif %}
|
|
{% if 'resource_type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['resource_type'] in apollo_resource_types %}
|
|
"SCHEDULER": {
|
|
"scheduler.0": {
|
|
"type" : "DWRR",
|
|
"weight": "1"
|
|
},
|
|
"scheduler.1": {
|
|
"type" : "DWRR",
|
|
"weight": "1"
|
|
},
|
|
"scheduler.2": {
|
|
"type" : "DWRR",
|
|
"weight": "100"
|
|
}
|
|
},
|
|
{% elif (generate_tc_to_pg_map is defined) and
|
|
('type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['type'] in backend_device_types) and
|
|
('resource_type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['resource_type'] == 'Compute-AI') %}
|
|
"SCHEDULER": {
|
|
"scheduler.0": {
|
|
"type" : "DWRR",
|
|
"weight": "40"
|
|
},
|
|
"scheduler.1": {
|
|
"type" : "DWRR",
|
|
"weight": "30"
|
|
},
|
|
"scheduler.2": {
|
|
"type" : "DWRR",
|
|
"weight": "25"
|
|
},
|
|
"scheduler.3": {
|
|
"type" : "DWRR",
|
|
"weight": "5"
|
|
}
|
|
},
|
|
{% else %}
|
|
"SCHEDULER": {
|
|
"scheduler.0": {
|
|
"type" : "DWRR",
|
|
"weight": "14"
|
|
},
|
|
"scheduler.1": {
|
|
"type" : "DWRR",
|
|
"weight": "15"
|
|
}
|
|
},
|
|
{% endif %}
|
|
{% if asic_type in pfc_to_pg_map_supported_asics %}
|
|
"PFC_PRIORITY_TO_PRIORITY_GROUP_MAP": {
|
|
{% if port_names_list_extra_queues|length > 0 %}
|
|
"AZURE_DUALTOR": {
|
|
"2": "2",
|
|
"3": "3",
|
|
"4": "4",
|
|
"6": "6"
|
|
},
|
|
{% endif %}
|
|
"AZURE": {
|
|
"3": "3",
|
|
"4": "4"
|
|
}
|
|
},
|
|
{% endif %}
|
|
"PORT_QOS_MAP": {
|
|
{% if generate_global_dscp_to_tc_map is defined %}
|
|
{{- generate_global_dscp_to_tc_map() }}
|
|
{% elif require_global_dscp_to_tc_map %}
|
|
"global": {
|
|
"dscp_to_tc_map" : "AZURE"
|
|
}{% if PORT_ACTIVE %},{% endif %}
|
|
|
|
{% endif %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}": {
|
|
{% if 'type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['type'] in backend_device_types and 'storage_device' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['storage_device'] == 'true' %}
|
|
"dot1p_to_tc_map" : "AZURE",
|
|
{% else %}
|
|
{# Apply separated DSCP_TO_TC_MAP to uplink ports on ToR and Leaf #}
|
|
{% if different_dscp_to_tc_map and tunnel_qos_remap_enable %}
|
|
{% if ('type' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['type'] == 'LeafRouter') and (port not in port_names_list_extra_queues) %}
|
|
"dscp_to_tc_map" : "AZURE_UPLINK",
|
|
{% elif ('subtype' in DEVICE_METADATA['localhost']) and (DEVICE_METADATA['localhost']['subtype'] == 'DualToR') and (port in port_names_list_extra_queues) %}
|
|
"dscp_to_tc_map" : "AZURE_UPLINK",
|
|
{% else %}
|
|
"dscp_to_tc_map" : "AZURE",
|
|
{% endif %}
|
|
{% else %}
|
|
"dscp_to_tc_map" : "AZURE",
|
|
{% endif %}
|
|
{% endif %}
|
|
{# Apply separated TC_TO_QUEUE_MAP to uplink ports on ToR #}
|
|
{% if different_tc_to_queue_map and tunnel_qos_remap_enable and port in port_names_list_extra_queues %}
|
|
"tc_to_queue_map" : "AZURE_UPLINK",
|
|
{% else %}
|
|
"tc_to_queue_map" : "AZURE",
|
|
{% endif %}
|
|
"tc_to_pg_map" : "AZURE",
|
|
"pfc_to_queue_map": "AZURE",
|
|
{% if asic_type in pfc_to_pg_map_supported_asics %}
|
|
{% if port in port_names_list_extra_queues %}
|
|
"pfc_to_pg_map" : "AZURE_DUALTOR",
|
|
{% else %}
|
|
"pfc_to_pg_map" : "AZURE",
|
|
{% endif %}
|
|
{% endif %}
|
|
{% if port in port_names_list_extra_queues %}
|
|
"pfc_enable" : "2,3,4,6",
|
|
{% else %}
|
|
"pfc_enable" : "3,4",
|
|
{% endif %}
|
|
"pfcwd_sw_enable" : "3,4"
|
|
}{% if not loop.last %},{% endif %}
|
|
|
|
{% endfor %}
|
|
},
|
|
{% if generate_wred_profiles is defined %}
|
|
{{- generate_wred_profiles() }}
|
|
{% else %}
|
|
"WRED_PROFILE": {
|
|
"AZURE_LOSSLESS" : {
|
|
"wred_green_enable" : "true",
|
|
"wred_yellow_enable" : "true",
|
|
"wred_red_enable" : "true",
|
|
"ecn" : "ecn_all",
|
|
"green_max_threshold" : "2097152",
|
|
"green_min_threshold" : "1048576",
|
|
"yellow_max_threshold" : "2097152",
|
|
"yellow_min_threshold" : "1048576",
|
|
"red_max_threshold" : "2097152",
|
|
"red_min_threshold" : "1048576",
|
|
"green_drop_probability" : "5",
|
|
"yellow_drop_probability": "5",
|
|
"red_drop_probability" : "5"
|
|
}
|
|
},
|
|
{% endif %}
|
|
{% if voq_chassis %}
|
|
"QUEUE": {
|
|
{% for system_port in SYSTEM_PORT_ALL %}
|
|
"{{ system_port }}|3": {
|
|
"scheduler" : "scheduler.1",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
},
|
|
{% endfor %}
|
|
{% for system_port in SYSTEM_PORT_ALL %}
|
|
"{{ system_port }}|4": {
|
|
"scheduler" : "scheduler.1",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
},
|
|
{% endfor %}
|
|
{% for system_port in SYSTEM_PORT_ALL %}
|
|
"{{ system_port }}|0": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{% endfor %}
|
|
{% for system_port in SYSTEM_PORT_ALL %}
|
|
"{{ system_port }}|1": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{% endfor %}
|
|
{% for system_port in SYSTEM_PORT_ALL %}
|
|
"{{ system_port }}|2": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{% endfor %}
|
|
{% for system_port in SYSTEM_PORT_ALL %}
|
|
"{{ system_port }}|5": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{% endfor %}
|
|
{% for system_port in SYSTEM_PORT_ALL %}
|
|
"{{ system_port }}|6": {
|
|
"scheduler": "scheduler.0"
|
|
}{% if not loop.last %},{% endif %}
|
|
{% endfor %}
|
|
}
|
|
{% else %}
|
|
"QUEUE": {
|
|
{% if 'type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['type'] in backend_device_types and
|
|
'resource_type' in DEVICE_METADATA['localhost'] and
|
|
DEVICE_METADATA['localhost']['resource_type'] == 'Compute-AI' %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|0": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
"{{ port }}|1": {
|
|
"scheduler": "scheduler.1"
|
|
},
|
|
"{{ port }}|3": {
|
|
"scheduler" : "scheduler.2",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
},
|
|
"{{ port }}|4": {
|
|
"scheduler" : "scheduler.3",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
}{% if not loop.last %},{% endif %}
|
|
{% endfor %}
|
|
{% else %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|3": {
|
|
"scheduler" : "scheduler.1",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
},
|
|
{% endfor %}
|
|
{% if 'resource_type' in DEVICE_METADATA['localhost'] and DEVICE_METADATA['localhost']['resource_type'] in apollo_resource_types %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|4": {
|
|
"scheduler" : "scheduler.2",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
},
|
|
{% endfor %}
|
|
{% else %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|4": {
|
|
"scheduler" : "scheduler.1",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
},
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|0": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{% endfor %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|1": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{% endfor %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|2": {
|
|
{% if port in port_names_list_extra_queues %}
|
|
"scheduler" : "scheduler.1",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
{% else %}
|
|
"scheduler": "scheduler.0"
|
|
{% endif %}
|
|
},
|
|
{% endfor %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|5": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{# DSCP 48 is mapped to QUEUE 7 in macro generate_dscp_to_tc_map #}
|
|
{% if (generate_dscp_to_tc_map is defined) and tunnel_qos_remap_enable %}
|
|
"{{ port }}|7": {
|
|
"scheduler": "scheduler.0"
|
|
},
|
|
{% endif %}
|
|
{% endfor %}
|
|
{% for port in PORT_ACTIVE %}
|
|
"{{ port }}|6": {
|
|
{% if port in port_names_list_extra_queues %}
|
|
"scheduler" : "scheduler.1",
|
|
"wred_profile": "AZURE_LOSSLESS"
|
|
{% else %}
|
|
"scheduler": "scheduler.0"
|
|
{% endif %}
|
|
}{% if not loop.last %},{% endif %}
|
|
|
|
{% endfor %}
|
|
{% endif %}
|
|
}
|
|
{% endif %}
|
|
}
|