Skip to content

Commit b5ec4b9

Browse files
authored
Merge branch 'sonic-net:202505' into 202505
2 parents 5c8557c + 4df4325 commit b5ec4b9

File tree

161 files changed

+6355
-2691
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

161 files changed

+6355
-2691
lines changed

.github/CODEOWNERS

Lines changed: 50 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,74 @@
44
# rules are explained here
55
# https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners
66

7-
# These owners will be the default owners for everything in the repo.
8-
# Unless a later match takes precedence, # @Azure/sonic-fundamentals
9-
# will be requested for review when someone opens a pull request.
10-
# @Azure/sonic-fundamentals
7+
8+
# Azure pipelines
9+
.azure-pipelines/baseline_test @xwjiang-ms
10+
.azure-pipelines/common2 @opcoder0 @wangxin
11+
.azure-pipelines/dependency_check @yutongzhang-microsoft @wangxin
12+
.azure-pipelines/impacted_area_testing @yutongzhang-microsoft @wangxin
13+
.azure-pipelines/markers_check @yutongzhang-microsoft @wangxin
14+
.azure-pipelines/recover_testbed @yutongzhang-microsoft @wangxin
15+
.azure-pipelines/testcases_collection @yutongzhang-microsoft @wangxin
16+
.azure-pipelines/testscripts_analysis @yutongzhang-microsoft @wangxin
17+
.azure-pipelines/*.yml @wangxin @lerry-lee
18+
.azure-pipelines/*.yaml @wangxin @lerry-lee
19+
.azure-pipelines/*.py @wangxin @lerry-lee
20+
21+
# Github
22+
.github/codeql/* @liushilongbuaa
23+
.github/workflows/* @liushilongbuaa
24+
.github/CODEOWNER @sonic-net/sonic-mgmt-maintainer
25+
.github/* @sonic-net/sonic-mgmt-maintainer
26+
27+
# Hooks
28+
.hooks/pre_commit_hooks @xwjiang-ms @wangxin
1129

1230
# Ansible
31+
ansible @wangxin @yxieca @opcoder0
1332

1433
# Documents
1534
docs @wangxin @yxieca
1635

36+
# sdn_tests
37+
sdn_tests @ksravani-hcl @kishanps
38+
1739
# spytest
1840
spytest @ramakristipati @lolyu @yxieca
1941

2042
# test reporting
2143
test_reporting @wangxin
2244

2345
# tests
46+
tests/acl @bingwang-ms
47+
tests/acl/test_stress_acl.py @xwjiang-ms
48+
tests/arp
49+
tests/auditd @maipbui
50+
tests/autorestart @lerry-lee
51+
tests/bgp @StormLiangMS
52+
tests/cacl @ZhaohuiS
53+
tests/common/mellanox_data.py @keboliu @Junchao-Mellanox
54+
tests/common/* @wangxin @opcoder0
55+
tests/common2 @opcoder0 @wangxin
56+
tests/dualtor @lolyu @wsycqyz
57+
tests/dualtor_io @lolyu @wsycqyz
58+
tests/dualtor_mgmt @lolyu @wsycqyz
59+
tests/lldp @ZhaohuiS
60+
tests/pfcwd @lipxu
2461
tests/platform_tests @prgeor
2562
tests/platform_tests/mellanox @keboliu @Junchao-Mellanox
2663
tests/platform_tests/fwutil @prgeor @alexrallen
2764
tests/platform_tests/files @prgeor @Junchao-Mellanox
2865
tests/platform_tests/test_auto_negotiation.py @prgeor @Junchao-Mellanox
2966
tests/platform_tests/thermal_control_test_helper.py @prgeor @Junchao-Mellanox
30-
tests/system_health @prgeor @Junchao-Mellanox
31-
tests/show_techsupport @yxieca @noaOrMlnx
3267
tests/qos @XuChen-MSFT @wsycqyz
33-
tests/qos/test_buffer.py @neethajohn @stephenxs
34-
tests/qos/test_buffer_traditional.py @neethajohn @stephenxs
35-
tests/qos/files/dynamic_buffer_param.json @neethajohn @stephenxs
68+
tests/qos/test_buffer.py @stephenxs
69+
tests/qos/test_buffer_traditional.py @stephenxs
70+
tests/qos/files/dynamic_buffer_param.json @stephenxs
3671
tests/qos/files/mellanox @stephenxs @keboliu
37-
tests/qos/args @neethajohn @stephenxs
38-
tests/common/mellanox_data.py @keboliu @Junchao-Mellanox
39-
tests/dhcp_relay @jcaiMR
40-
tests/bgp @jcaiMR @StormLiangMS
41-
tests/route @jcaiMR
42-
tests/fib @jcaiMR
43-
tests/ip @jcaiMR
44-
tests/ipfwd @jcaiMR
45-
tests/radv @jcaiMR
46-
tests/fdb @jcaiMR
47-
tests/pfcwd @lipxu @neethajohn
48-
tests/lldp @ZhaohuiS
49-
tests/cacl @ZhaohuiS
50-
tests/dualtor @lolyu @wsycqyz
51-
tests/dualtor_io @lolyu @wsycqyz
52-
tests/dualtor_mgmt @lolyu @wsycqyz
72+
tests/qos/args @stephenxs
73+
tests/show_techsupport @yxieca @noaOrMlnx
74+
tests/system_health @prgeor @Junchao-Mellanox
75+
76+
tests/setup-container.sh @theasianpianist @wangxin
77+
tests/* @sonic-net/sonic-mgmt-maintainer @wangxin

ansible/config_sonic_basedon_testbed.yml

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@
624624
dest=/tmp/smartswitch.json
625625
become: true
626626
# t1-28-lag is smartswitch topo only
627-
when: topo in ["t1-smartswitch-ha","t1-28-lag","smartswitch-t1"]
627+
when: topo in ["t1-smartswitch-ha","t1-28-lag","smartswitch-t1", "t1-48-lag"]
628628

629629
- name: Create dns config
630630
template: src=templates/dns_config.j2
@@ -803,7 +803,7 @@
803803
dest=/tmp/dpu_extra.json
804804
become: true
805805
# t1-28-lag is smartswitch topo only
806-
when: topo in ["t1-smartswitch-ha","t1-28-lag","smartswitch-t1"]
806+
when: topo in ["t1-smartswitch-ha","t1-28-lag","smartswitch-t1", "t1-48-lag"]
807807

808808
- name: Load DPU config in smartswitch
809809
load_extra_dpu_config:
@@ -812,7 +812,7 @@
812812
host_passwords: "{{ sonic_default_passwords }}"
813813
become: true
814814
# t1-28-lag is smartswitch topo only
815-
when: topo in ["t1-smartswitch-ha","t1-28-lag","smartswitch-t1"]
815+
when: topo in ["t1-smartswitch-ha","t1-28-lag","smartswitch-t1", "t1-48-lag"]
816816

817817
- name: Configure TACACS
818818
become: true
@@ -950,4 +950,11 @@
950950
become: True
951951
shell: sed -i "s/^ClientAliveInterval [0-9].*/ClientAliveInterval 900/g" /etc/ssh/sshd_config && systemctl restart sshd
952952

953+
- name: enable IPv6 on device
954+
become: true
955+
ansible.builtin.sysctl:
956+
name: net.ipv6.conf.all.disable_ipv6
957+
value: 0
958+
sysctl_set: true
959+
953960
when: deploy is defined and deploy|bool == true

ansible/group_vars/snappi-sonic/snappi-sonic.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@ bgp_slb_passive_range: 10.255.0.0/25
4747
fanout_admin_user: "fanoutadminuser"
4848
fanout_admin_password: "fanoutadminpassword"
4949

50-
secret_group_vars: {snappi_api_server: {user: admin, password: admin, rest_port: 443, session_id: "None"}}
50+
snappi_api_server: {user: admin, password: admin, rest_port: 443, session_id: "None"}

ansible/group_vars/sonic/variables

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ broadcom_th5_hwskus: ['Arista-7060X6-64DE', 'Arista-7060X6-64DE-64x400G', 'Arist
1919
broadcom_j2c+_hwskus: ['Nokia-IXR7250E-36x100G', 'Nokia-IXR7250E-36x400G', 'Arista-7800R3A-36DM2-C36', 'Arista-7800R3A-36DM2-D36', 'Arista-7800R3AK-36DM2-C36', 'Arista-7800R3AK-36DM2-D36', 'Nokia-IXR7250-X3B']
2020
broadcom_jr2_hwskus: ['Arista-7800R3-48CQ2-C48', 'Arista-7800R3-48CQM2-C48']
2121

22-
mellanox_spc1_hwskus: [ 'ACS-MSN2700', 'ACS-MSN2740', 'ACS-MSN2100', 'ACS-MSN2410', 'ACS-MSN2010', 'Mellanox-SN2700', 'Mellanox-SN2700-A1', 'Mellanox-SN2700-D48C8','Mellanox-SN2700-D40C8S8', 'Mellanox-SN2700-A1-D48C8']
22+
mellanox_spc1_hwskus: [ 'ACS-MSN2700', 'ACS-MSN2740', 'ACS-MSN2100', 'ACS-MSN2410', 'ACS-MSN2010', 'Mellanox-SN2700', 'Mellanox-SN2700-A1', 'Mellanox-SN2700-D48C8','Mellanox-SN2700-D40C8S8', 'Mellanox-SN2700-A1-D48C8', 'Mellanox-SN2700-C28D8', 'Mellanox-SN2700-A1-C28D8']
2323
mellanox_spc2_hwskus: [ 'ACS-MSN3700', 'ACS-MSN3700C', 'ACS-MSN3800', 'Mellanox-SN3800-D112C8' , 'ACS-MSN3420']
2424
mellanox_spc3_hwskus: [ 'ACS-MSN4700', 'Mellanox-SN4700-O28', 'Mellanox-SN4700-O32', 'ACS-MSN4600', 'ACS-MSN4600C', 'ACS-MSN4410', 'Mellanox-SN4600C-D112C8', 'Mellanox-SN4600C-C64', 'Mellanox-SN4700-O8C48', 'Mellanox-SN4700-O8V48', 'ACS-SN4280', 'Mellanox-SN4280-O28', 'Mellanox-SN4700-V64', 'Mellanox-SN4700-O32']
2525
mellanox_spc4_hwskus: [ 'ACS-SN5600' , 'Mellanox-SN5600-V256', 'Mellanox-SN5600-C256S1', 'Mellanox-SN5600-C224O8',
@@ -71,3 +71,5 @@ orchagent_docker_volumes_dict:
7171
"/host/machine.conf:/host/machine.conf":
7272

7373
orchagent_docker_volumes: "{{ orchagent_docker_volumes_dict.keys() }}"
74+
75+
sonic_qos_profile: "BALANCED" # Possible values: DEFAULT, RDMA-CENTRIC, TCP-CENTRIC, BALANCED

ansible/library/announce_routes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1571,7 +1571,7 @@ def main():
15711571
dut_interfaces=dict(required=False, type='str', default=''),
15721572
adhoc=dict(required=False, type='bool', default=False),
15731573
peers_routes_to_change=dict(required=False, type='dict', default={}),
1574-
log_path=dict(required=False, type='str', default=''),
1574+
log_path=dict(required=False, type='str', default='/tmp'),
15751575
upstream_neighbor_groups=dict(required=False, type='int', default=0),
15761576
downstream_neighbor_groups=dict(required=False, type='int', default=0)
15771577
),

ansible/library/generate_golden_config_db.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,17 @@ def get_multiasic_feature_config(self):
166166
rc, out, err = self.module.run_command("show runningconfiguration all")
167167
if rc != 0:
168168
self.module.fail_json(msg="Failed to get config from runningconfiguration: {}".format(err))
169-
170-
return out
169+
config = json.loads(out)
170+
# From the running configure, only keep the key "FEATURE"
171+
for namespace, ns_data in config.items():
172+
config[namespace] = {k: ns_data[k] for k in ns_data if k == "FEATURE"}
173+
return config
171174

172175
def overwrite_feature_golden_config_db_multiasic(self, config, feature_key):
173176
full_config = json.loads(config)
174177
if config == "{}" or "FEATURE" not in config["localhost"]:
175178
# need dump running config FEATURE + selected feature
176-
gold_config_db = json.loads(self.get_multiasic_feature_config())
179+
gold_config_db = self.get_multiasic_feature_config()
177180
else:
178181
# need existing config + selected feature
179182
gold_config_db = full_config
@@ -402,7 +405,7 @@ def generate(self):
402405
config = self.generate_mgfx_golden_config_db()
403406
module_msg = module_msg + " for mgfx"
404407
self.module.run_command("sudo rm -f {}".format(TEMP_DHCP_SERVER_CONFIG_PATH))
405-
elif self.topo_name in ["t1-smartswitch-ha", "t1-28-lag", "smartswitch-t1"]:
408+
elif self.topo_name in ["t1-smartswitch-ha", "t1-28-lag", "smartswitch-t1", "t1-48-lag"]:
406409
config = self.generate_smartswitch_golden_config_db()
407410
module_msg = module_msg + " for smartswitch"
408411
self.module.run_command("sudo rm -f {}".format(TEMP_SMARTSWITCH_CONFIG_PATH))

ansible/library/shell_cmds.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,11 +95,13 @@ def run_cmd(module, cmd, timeout):
9595
err_msg = "[WARNING] timeout is not supported for command contains single quote, ran without time limit"
9696
timeout = 0
9797

98+
start = datetime.datetime.now()
9899
if int(timeout) == 0:
99100
rc, out, err = module.run_command(cmd, use_unsafe_shell=True)
100101
else:
101102
cmd_with_timeout = "echo '{}' | timeout --preserve-status {} bash".format(cmd, timeout)
102103
rc, out, err = module.run_command(cmd_with_timeout, use_unsafe_shell=True)
104+
end = datetime.datetime.now()
103105

104106
result = dict(
105107
cmd=cmd,
@@ -110,7 +112,9 @@ def run_cmd(module, cmd, timeout):
110112
stderr=err,
111113
stdout_lines=out.splitlines(),
112114
stderr_lines=err.splitlines(),
113-
timeout=timeout
115+
timeout=timeout,
116+
start=str(start),
117+
end=str(end)
114118
)
115119
return result
116120

ansible/module_utils/port_utils.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,28 @@ def get_port_alias_to_name_map(hwsku, asic_name=None):
178178
alias = "etp{}{}".format(i, split_alias)
179179
eth_name = "Ethernet{}".format((i - 1) * 8 + idx)
180180
port_alias_to_name_map[alias] = eth_name
181+
elif hwsku in ["Arista-7060X6-16PE-384C-O128S2", "Arista-7060X6-16PE-384C-B-O128S2",
182+
"Arista-7060X6-16PE-384C-B-O128S2-COPPER-LAB", "Arista-7060X6-16PE-384C-B-O128S2-LAB",
183+
"Arista-7060X6-16PE-384C-O128S2-COPPER-LAB", "Arista-7060X6-16PE-384C-O128S2-LAB"]:
184+
split_alias_list = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"]
185+
split_alias_list_1 = ["a", "b"]
186+
split_2_port_indexs = list(range(1, 17))
187+
cur_idx = 0
188+
for i in range(1, 25):
189+
if i in split_2_port_indexs:
190+
for idx, split_alias in enumerate(split_alias_list_1):
191+
alias = "etp{}{}".format(i, split_alias)
192+
eth_name = "Ethernet{}".format(cur_idx)
193+
port_alias_to_name_map[alias] = eth_name
194+
cur_idx += 4
195+
else:
196+
for idx, split_alias in enumerate(split_alias_list):
197+
alias = "etp{}{}".format(i, split_alias)
198+
eth_name = "Ethernet{}".format(cur_idx)
199+
port_alias_to_name_map[alias] = eth_name
200+
cur_idx += 4
201+
port_alias_to_name_map['etp25a'] = "Ethernet512"
202+
port_alias_to_name_map['etp25b'] = "Ethernet513"
181203
elif hwsku == "Arista-7050QX32S-Q32":
182204
for i in range(5, 29):
183205
port_alias_to_name_map["Ethernet%d/1" % i] = "Ethernet%d" % ((i - 5) * 4)
@@ -258,6 +280,19 @@ def get_port_alias_to_name_map(hwsku, asic_name=None):
258280
alias = "etp%d" % (i / 4 + 1) + ("a" if i % 4 == 0 else "b")
259281
# print alias, "Ethernet%d" % i
260282
port_alias_to_name_map[alias] = "Ethernet%d" % i
283+
elif hwsku in ["Mellanox-SN2700-C28D8", "Mellanox-SN2700-A1-C28D8"]:
284+
# 50G ports
285+
s50G_ports = [x for x in range(112, 127, 2)]
286+
287+
# 100G ports
288+
s100G_ports = [x for x in range(0, 109, 4)]
289+
290+
for i in s50G_ports:
291+
alias = "etp%d" % (i / 4 + 1) + ("a" if i % 4 == 0 else "b")
292+
port_alias_to_name_map[alias] = "Ethernet%d" % i
293+
for i in s100G_ports:
294+
alias = "etp%d" % (i / 4 + 1)
295+
port_alias_to_name_map[alias] = "Ethernet%d" % i
261296
elif hwsku in ["ACS-MSN3800", "ACS-MSN4600C", 'Mellanox-SN4700-V64']:
262297
for i in range(1, 65):
263298
port_alias_to_name_map["etp%d" % i] = "Ethernet%d" % ((i - 1) * 4)
@@ -493,6 +528,24 @@ def get_port_alias_to_name_map(hwsku, asic_name=None):
493528
for i in range(1, 33):
494529
port_alias_to_name_map["etp%d" % i] = "Ethernet%d" % idx
495530
idx += 8
531+
elif hwsku in ["Mellanox-SN4280-O8C40", "Mellanox-SN4280-O8V40", "Mellanox-SN4280-C48"]:
532+
idx = 0
533+
for i in range(1, 13):
534+
port_alias_to_name_map["etp%da" % i] = "Ethernet%d" % idx
535+
idx += 4
536+
port_alias_to_name_map["etp%db" % i] = "Ethernet%d" % idx
537+
idx += 4
538+
for i in range(13, 21):
539+
port_alias_to_name_map["etp%d" % i] = "Ethernet%d" % idx
540+
idx += 8
541+
for i in range(21, 29):
542+
port_alias_to_name_map["etp%da" % i] = "Ethernet%d" % idx
543+
idx += 4
544+
port_alias_to_name_map["etp%db" % i] = "Ethernet%d" % idx
545+
idx += 4
546+
for i in range(29, 33):
547+
port_alias_to_name_map["etp%d" % i] = "Ethernet%d" % idx
548+
idx += 8
496549
elif hwsku == "Mellanox-SN5600-V256":
497550
split_alias_list = ["a", "b", "c", "d"]
498551
for i in range(1, 65):

ansible/module_utils/smartswitch_utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,13 @@
1111
"base": 224,
1212
"step": 8,
1313
"dpu_key": "dpu{}"
14+
},
15+
"Mellanox-SN4280-O8C40": {
16+
"dpu_num": 4,
17+
"port_key": "Ethernet{}",
18+
"interface_key": "Ethernet{}|18.{}.202.0/31",
19+
"base": 224,
20+
"step": 8,
21+
"dpu_key": "dpu{}"
1422
}
1523
}

ansible/roles/eos/templates/t0-leaf.j2

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ router bgp {{ host['bgp']['asn'] }}
109109
{# set LT2/FT2 as reflector to advertise route to DUT #}
110110
{% if props.swrole is defined and props.swrole in ("lowerspine", "fabricspine") %}
111111
neighbor {{ remote_ip }} route-reflector-client
112+
neighbor {{ remote_ip }} additional-paths send any
112113
{% endif %}
113114
{% if remote_ip | ipv6 %}
114115
address-family ipv6

0 commit comments

Comments
 (0)