Repository: sonic-net/sonic-mgmt
Pull request #17324: changes to privatelink test for smartswitch
Author: login: aronovic
Created: 2025-03-04T15:23:31Z | Merged: 2025-04-24T20:05:37Z


### Description of PR
Changes are needed to pass the private link dash tests on smartswitch 

Summary:
Fixes # (issue)

### Type of change

- [ ] Bug fix
- [ ] Testbed and Framework(new/improvement)
- [ ] New Test case
    - [ ] Skipped for non-supported platforms
- [x] Test case improvement


### Back port request
- [ ] 202012
- [ ] 202205
- [ ] 202305
- [ ] 202311
- [ ] 202405
- [ ] 202411

### Approach
#### What is the motivation for this PR?
The dash private link tests were failing on smartswitch

#### How did you do it?
Debug packets and config on smartswitch and adjusted parameters for the tests to pass.

#### How did you verify/test it?
Executed the DASH private link tests on smartswitch


#### Any platform specific information?
MtFuji platform

#### Supported testbed topology if it's a new test case?
t1-28-lag

### Documentation
<!--
(If it's a new feature, new test case)
Did you update documentation/Wiki relevant to your implementation?
Link to the wiki page?
-->



Diff:
diff --git a/tests/dash/configs/privatelink_config.py b/tests/dash/configs/privatelink_config.py
index d35dbba10cf..cfa05ac542b 100644
--- a/tests/dash/configs/privatelink_config.py
+++ b/tests/dash/configs/privatelink_config.py
@@ -14,7 +14,7 @@
 PE_PA = "101.1.2.3"  # private endpoint physical address
 PE_CA = "10.2.0.100"  # private endpoint customer address
 PE_CA_SUBNET = "10.2.0.0/16"
-PL_ENCODING_IP = "::56b2:0:ff71:0:0"
+PL_ENCODING_IP = "::d107:64:ff71:0:0"
 PL_ENCODING_MASK = "::ffff:ffff:ffff:0:0"
 PL_OVERLAY_SIP = "fd41:108:20:abc:abc::0"
 PL_OVERLAY_SIP_MASK = "ffff:ffff:ffff:ffff:ffff:ffff::"
@@ -22,10 +22,11 @@
 PL_OVERLAY_DIP_MASK = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
 
 APPLIANCE_ID = "100"
+LOCAL_REGION_ID = "100"
 VM_VNI = "4321"
 ENCAP_VNI = 100
 VNET1 = "Vnet1"
-VNET1_VNI = "45654"
+VNET1_VNI = "2001"
 VNET1_GUID = "559c6ce8-26ab-4193-b946-ccc6e8f930b2"
 ENI_MAC = "F4:93:9F:EF:C4:7E"
 ENI_MAC_STRING = ENI_MAC.replace(":", "")
@@ -45,6 +46,7 @@
     f"DASH_APPLIANCE_TABLE:{APPLIANCE_ID}": {
         "sip": APPLIANCE_VIP,
         "vm_vni": VM_VNI,
+        "local_region_id": LOCAL_REGION_ID,
         "outbound_direction_lookup": OUTBOUND_DIR_LOOKUP
     }
 }
diff --git a/tests/dash/conftest.py b/tests/dash/conftest.py
index 23dcfda8103..602a8050c62 100644
--- a/tests/dash/conftest.py
+++ b/tests/dash/conftest.py
@@ -25,7 +25,8 @@ def get_dpu_dataplane_port(duthost, dpu_index):
     try:
         interface = list(platform_json["DPUS"][f"dpu{dpu_index}"]["interface"].keys())[0]
     except KeyError:
-        interface = f"Ethernet-BP{dpu_index}"
+        if_dpu_index = 224 + dpu_index*8
+        interface = f"Ethernet{if_dpu_index}"
 
     logger.info(f"DPU dataplane interface: {interface}")
     return interface
@@ -175,7 +176,7 @@ def dash_pl_config(duthost, config_facts, minigraph_facts):
                 dash_info[LOCAL_PTF_INTF] = minigraph_facts["minigraph_ptf_indices"][intf]
                 dash_info[LOCAL_DUT_INTF] = intf
                 dash_info[LOCAL_PTF_MAC] = neigh_table["v4"][neigh_ip]["macaddress"]
-            if REMOTE_PTF_INTF not in dash_info and config["name"].endswith("T2"):
+            if REMOTE_PTF_SEND_INTF not in dash_info and config["name"].endswith("T2"):
                 intf, _ = get_intf_from_ip(config['local_addr'], config_facts)
                 intfs = list(config_facts["PORTCHANNEL_MEMBER"][intf].keys())
                 dash_info[REMOTE_PTF_SEND_INTF] = minigraph_facts["minigraph_ptf_indices"][intfs[0]]
diff --git a/tests/dash/packets.py b/tests/dash/packets.py
index cfc5ba4f946..0be06d26cc3 100644
--- a/tests/dash/packets.py
+++ b/tests/dash/packets.py
@@ -71,7 +71,7 @@ def get_pl_overlay_dip(orig_dip, ol_dip, ol_mask):
     return str(ip_address(overlay_dip))
 
 
-def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
+def inbound_pl_packets(config, use_pkt_alt_attrs=False, inner_packet_type='udp', vxlan_udp_dport=4789):
     inner_sip = get_pl_overlay_dip(  # not a typo, inner DIP/SIP are reversed for inbound direction
         pl.PE_CA,
         pl.PL_OVERLAY_DIP,
@@ -103,13 +103,13 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
         ip_src=pl.PE_PA,
         ip_dst=pl.APPLIANCE_VIP,
         gre_key_present=True,
-        gre_key=int(pl.VNET1_VNI) << 8,
+        gre_key=int(pl.ENCAP_VNI) << 8 if use_pkt_alt_attrs else int(pl.VNET1_VNI) << 8,
         inner_frame=inner_packet,
     )
 
     exp_inner_packet = generate_inner_packet(inner_packet_type)(
-        eth_src=pl.ENI_MAC,
-        eth_dst=pl.REMOTE_MAC,
+        eth_src=pl.REMOTE_MAC if use_pkt_alt_attrs else pl.ENI_MAC,
+        eth_dst=pl.ENI_MAC if use_pkt_alt_attrs else pl.REMOTE_MAC,
         ip_src=pl.PE_CA,
         ip_dst=pl.VM1_CA,
         ip_id=0,
@@ -124,10 +124,10 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
         eth_dst=config[LOCAL_PTF_MAC],
         ip_src=pl.APPLIANCE_VIP,
         ip_dst=pl.VM1_PA,
-        ip_ttl=254,
+        ip_ttl=63 if use_pkt_alt_attrs else 254,
         ip_id=0,
         udp_dport=vxlan_udp_dport,
-        vxlan_vni=int(pl.VM_VNI),
+        vxlan_vni=int(pl.VNET1_VNI) if use_pkt_alt_attrs else int(pl.VM_VNI),
         inner_frame=exp_inner_packet
     )
 
@@ -140,10 +140,11 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
     return gre_packet, masked_exp_packet
 
 
-def outbound_pl_packets(config, outer_encap, inner_packet_type='udp', vxlan_udp_dport=4789, vxlan_udp_sport=1234):
+def outbound_pl_packets(config, outer_encap, use_pkt_alt_attrs=False,
+                        inner_packet_type='udp', vxlan_udp_dport=4789, vxlan_udp_sport=1234):
     inner_packet = generate_inner_packet(inner_packet_type)(
-        eth_src=pl.REMOTE_MAC,
-        eth_dst=pl.ENI_MAC,
+        eth_src=pl.ENI_MAC if use_pkt_alt_attrs else pl.REMOTE_MAC,
+        eth_dst=pl.REMOTE_MAC if use_pkt_alt_attrs else pl.ENI_MAC,
         ip_src=pl.VM1_CA,
         ip_dst=pl.PE_CA,
     )
@@ -157,7 +158,7 @@ def outbound_pl_packets(config, outer_encap, inner_packet_type='udp', vxlan_udp_
             udp_dport=vxlan_udp_dport,
             udp_sport=vxlan_udp_sport,
             with_udp_chksum=False,
-            vxlan_vni=int(pl.VM_VNI),
+            vxlan_vni=int(pl.VNET1_VNI) if use_pkt_alt_attrs else int(pl.VM_VNI),
             inner_frame=inner_packet
         )
     elif outer_encap == 'gre':
@@ -167,7 +168,7 @@ def outbound_pl_packets(config, outer_encap, inner_packet_type='udp', vxlan_udp_
             ip_src=pl.VM1_PA,
             ip_dst=pl.APPLIANCE_VIP,
             gre_key_present=True,
-            gre_key=int(pl.VM_VNI) << 8,
+            gre_key=int(pl.ENCAP_VNI) << 8 if use_pkt_alt_attrs else int(pl.VM_VNI) << 8,
             inner_frame=inner_packet
         )
     else:
@@ -207,7 +208,7 @@ def outbound_pl_packets(config, outer_encap, inner_packet_type='udp', vxlan_udp_
         gre_key=pl.ENCAP_VNI << 8,
         inner_frame=exp_inner_packet,
         ip_id=0,
-        ip_ttl=254,
+        ip_ttl=63 if use_pkt_alt_attrs else 254,
     )
 
     masked_exp_packet = Mask(exp_encap_packet)
diff --git a/tests/dash/test_dash_privatelink.py b/tests/dash/test_dash_privatelink.py
index 8368ecd5bdf..448da83d7b0 100644
--- a/tests/dash/test_dash_privatelink.py
+++ b/tests/dash/test_dash_privatelink.py
@@ -24,6 +24,15 @@
 """
 
 
+@pytest.fixture(scope="module")
+def use_pkt_alt_attrs(duthost):
+    hwsku = duthost.sonichost._facts["hwsku"]
+    if hwsku == "Cisco-8102-28FH-DPU-O-T1":
+        return True
+    else:
+        return False
+
+
 @pytest.fixture(scope="module", autouse=True)
 def add_npu_static_routes(duthost, dpu_ip, dash_pl_config, skip_config, skip_cleanup):
     if not skip_config:
@@ -86,7 +95,6 @@ def common_setup_teardown(localhost, duthost, ptfhost, dpu_index, skip_config):
     apply_messages(localhost, duthost, ptfhost, pl.ENI_ROUTE_GROUP1_CONFIG, dpu_index)
 
     yield
-
     apply_messages(localhost, duthost, ptfhost, pl.ENI_ROUTE_GROUP1_CONFIG, dpu_index, False)
     apply_messages(localhost, duthost, ptfhost, pl.ENI_CONFIG, dpu_index, False)
     apply_messages(localhost, duthost, ptfhost, meter_rule_messages, dpu_index, False)
@@ -100,8 +108,8 @@ def test_privatelink_basic_transform(
     dash_pl_config,
     encap_proto
 ):
-    vm_to_dpu_pkt, exp_dpu_to_pe_pkt = outbound_pl_packets(dash_pl_config, outer_encap=encap_proto)
-    pe_to_dpu_pkt, exp_dpu_to_vm_pkt = inbound_pl_packets(dash_pl_config)
+    vm_to_dpu_pkt, exp_dpu_to_pe_pkt = outbound_pl_packets(dash_pl_config, encap_proto, use_pkt_alt_attrs)
+    pe_to_dpu_pkt, exp_dpu_to_vm_pkt = inbound_pl_packets(dash_pl_config, use_pkt_alt_attrs)
 
     ptfadapter.dataplane.flush()
     testutils.send(ptfadapter, dash_pl_config[LOCAL_PTF_INTF], vm_to_dpu_pkt, 1)


Reviews:
user: login: theasianpianist
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-06T19:17:27Z
user: login: theasianpianist
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-27T21:44:32Z
user: login: theasianpianist
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-27T21:48:32Z
user: login: prsunny
body: Changes looks fine. @theasianpianist and @prabhataravind to review/signoff
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T17:37:05Z
user: login: prabhataravind
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T17:43:37Z
user: login: prabhataravind
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T17:45:21Z
user: login: prabhataravind
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T17:51:23Z
user: login: prabhataravind
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T17:52:16Z
user: login: aronovic
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T20:12:10Z
user: login: aronovic
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T20:14:51Z
user: login: theasianpianist
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T23:17:24Z
user: login: theasianpianist
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T23:18:42Z
user: login: theasianpianist
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-01T23:19:06Z
user: login: seveerap79
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-02T17:19:08Z
user: login: aronovic
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-07T14:31:43Z
user: login: theasianpianist
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-18T05:25:31Z
user: login: prsunny
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T20:04:11Z

Review comments:
diff_hunk: @@ -103,13 +103,13 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
         ip_src=pl.PE_PA,
         ip_dst=pl.APPLIANCE_VIP,
         gre_key_present=True,
-        gre_key=int(pl.VNET1_VNI) << 8,
+        gre_key=int(pl.ENCAP_VNI) << 8,
path: tests/dash/packets.py
user: login: theasianpianist
body: For all the changes in this file, can you set the values at runtime based on the testbed platform being used? The current hard-coded values are required for this test to pass on other platforms, runtime determination would allow more flexibility
created_at: 2025-03-06T19:17:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -103,13 +103,13 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
         ip_src=pl.PE_PA,
         ip_dst=pl.APPLIANCE_VIP,
         gre_key_present=True,
-        gre_key=int(pl.VNET1_VNI) << 8,
+        gre_key=int(pl.ENCAP_VNI) << 8 if hwsku == "Cisco-8102-28FH-DPU-O-T1" else int(pl.VNET1_VNI) << 8,
path: tests/dash/packets.py
user: login: theasianpianist
body: can we check the HWSKU outside of this function, maybe in the test function itself, and just have a parameter to decide which VNI to use? IMO packet generation should be ignorant of HWSKU concerns, and we may need to update the affected SKUs later anyways 
created_at: 2025-03-27T21:44:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -78,6 +79,8 @@ def common_setup_teardown(localhost, duthost, ptfhost, dpu_index, skip_config):
     if skip_config:
         return
 
+    global hwsku
path: tests/dash/test_dash_privatelink.py
user: login: theasianpianist
body: would prefer to avoid global vars when possible. suggest calling the `config_facts` fixture directly from the test function and reading HWSKU from there or pulling out HWSKU detection/checking into a new fixture entirely.
created_at: 2025-03-27T21:48:32Z
author_association: CONTRIBUTOR
diff_hunk: @@ -50,6 +49,14 @@ def dpu_ip(duthost, dpu_index):
     npu_interface_ip = get_interface_ip(duthost, dpu_port)
     return npu_interface_ip.ip + 1
 
+@pytest.fixture(scope="module")
+def is_smartswitch(duthost):
path: tests/dash/test_dash_privatelink.py
user: login: prabhataravind
body: Suggest making the function name is_cisco_smartswitch instead.
created_at: 2025-04-01T17:43:37Z
author_association: CONTRIBUTOR
diff_hunk: @@ -207,7 +207,7 @@ def outbound_pl_packets(config, outer_encap, inner_packet_type='udp', vxlan_udp_
         gre_key=pl.ENCAP_VNI << 8,
         inner_frame=exp_inner_packet,
         ip_id=0,
-        ip_ttl=254,
+        ip_ttl=63 if is_smartswitch else 254,
path: tests/dash/packets.py
user: login: prabhataravind
body: why change ttl?
created_at: 2025-04-01T17:45:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -103,13 +103,13 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
         ip_src=pl.PE_PA,
         ip_dst=pl.APPLIANCE_VIP,
         gre_key_present=True,
-        gre_key=int(pl.VNET1_VNI) << 8,
+        gre_key=int(pl.ENCAP_VNI) << 8 if is_smartswitch else int(pl.VNET1_VNI) << 8,
         inner_frame=inner_packet,
     )
 
     exp_inner_packet = generate_inner_packet(inner_packet_type)(
-        eth_src=pl.ENI_MAC,
-        eth_dst=pl.REMOTE_MAC,
+        eth_src=pl.REMOTE_MAC if is_smartswitch else pl.ENI_MAC,
+        eth_dst=pl.ENI_MAC if is_smartswitch else pl.REMOTE_MAC,
path: tests/dash/packets.py
user: login: prabhataravind
body: For inbound, expected inner eth_src should be ENI_MAC and eth_dst should be REMOTE_MAC I believe. Why is this reversed?
created_at: 2025-04-01T17:51:23Z
author_association: CONTRIBUTOR
diff_hunk: @@ -24,6 +24,39 @@
 """
 
 
+def get_dpu_dataplane_port(duthost, dpu_index):
+    platform = duthost.facts["platform"]
+    platform_json = json.loads(duthost.shell(f"cat /usr/share/sonic/device/{platform}/platform.json")["stdout"])
+    try:
+        interface = list(platform_json["DPUS"][f"dpu{dpu_index}"]["interface"].keys())[0]
+    except KeyError:
+        interface = f"Ethernet-BP{dpu_index}"
path: tests/dash/test_dash_privatelink.py
user: login: prabhataravind
body: In the latest cisco platform code, Ethernet-BP naming convention is no longer used. 
created_at: 2025-04-01T17:52:16Z
author_association: CONTRIBUTOR
diff_hunk: @@ -207,7 +207,7 @@ def outbound_pl_packets(config, outer_encap, inner_packet_type='udp', vxlan_udp_
         gre_key=pl.ENCAP_VNI << 8,
         inner_frame=exp_inner_packet,
         ip_id=0,
-        ip_ttl=254,
+        ip_ttl=63 if is_smartswitch else 254,
path: tests/dash/packets.py
user: login: aronovic
body: On the smartswitch testing, the received packet has the ttls set to 63 and not 254. This is is why I changed the value because otherwise the test would fail
created_at: 2025-04-01T20:12:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -50,6 +49,14 @@ def dpu_ip(duthost, dpu_index):
     npu_interface_ip = get_interface_ip(duthost, dpu_port)
     return npu_interface_ip.ip + 1
 
+@pytest.fixture(scope="module")
+def is_smartswitch(duthost):
path: tests/dash/test_dash_privatelink.py
user: login: aronovic
body: This function could be use for other platforms by changing the implementation. Having a more generic name might be better here instead of changing it to say cisco, especially since this is also passed to the packet generation functions.

created_at: 2025-04-01T20:14:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -50,6 +49,14 @@ def dpu_ip(duthost, dpu_index):
     npu_interface_ip = get_interface_ip(duthost, dpu_port)
     return npu_interface_ip.ip + 1
 
+@pytest.fixture(scope="module")
+def is_smartswitch(duthost):
path: tests/dash/test_dash_privatelink.py
user: login: theasianpianist
body: Agree that the name here is misleading, since this fixture would return `False` when running on other swartswitch platforms which is misleading. Suggesting changing the name to better reflect how it's used, maybe `use_pkt_alt_attrs` instead?
created_at: 2025-04-01T23:17:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -71,7 +71,7 @@ def get_pl_overlay_dip(orig_dip, ol_dip, ol_mask):
     return str(ip_address(overlay_dip))
 
 
-def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
+def inbound_pl_packets(config, is_smartswitch=False, inner_packet_type='udp', vxlan_udp_dport=4789):
path: tests/dash/packets.py
user: login: theasianpianist
body: Suggest renaming `is_smartswitch` to `use_pkt_alt_attrs` or similar to match here: https://github.com/sonic-net/sonic-mgmt/pull/17324/files#r2023793417
created_at: 2025-04-01T23:18:41Z
author_association: CONTRIBUTOR
diff_hunk: @@ -140,10 +140,10 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
     return gre_packet, masked_exp_packet
 
 
-def outbound_pl_packets(config, outer_encap, inner_packet_type='udp', vxlan_udp_dport=4789, vxlan_udp_sport=1234):
+def outbound_pl_packets(config, outer_encap, is_smartswitch=False, inner_packet_type='udp', vxlan_udp_dport=4789, vxlan_udp_sport=1234):
path: tests/dash/packets.py
user: login: theasianpianist
body: Suggest renaming `is_smartswitch` similar to above.
created_at: 2025-04-01T23:19:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -103,13 +103,13 @@ def inbound_pl_packets(config, inner_packet_type='udp', vxlan_udp_dport=4789):
         ip_src=pl.PE_PA,
         ip_dst=pl.APPLIANCE_VIP,
         gre_key_present=True,
-        gre_key=int(pl.VNET1_VNI) << 8,
+        gre_key=int(pl.ENCAP_VNI) << 8 if is_smartswitch else int(pl.VNET1_VNI) << 8,
         inner_frame=inner_packet,
     )
 
     exp_inner_packet = generate_inner_packet(inner_packet_type)(
-        eth_src=pl.ENI_MAC,
-        eth_dst=pl.REMOTE_MAC,
+        eth_src=pl.REMOTE_MAC if is_smartswitch else pl.ENI_MAC,
+        eth_dst=pl.ENI_MAC if is_smartswitch else pl.REMOTE_MAC,
path: tests/dash/packets.py
user: login: seveerap79
body:  This is expected inner packet after post IPv6 -> IPv4 transformation for the inbound PL pkt, so inner Ether destmac will be ENI MAC address right.
created_at: 2025-04-02T17:19:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -24,6 +24,39 @@
 """
 
 
+def get_dpu_dataplane_port(duthost, dpu_index):
+    platform = duthost.facts["platform"]
+    platform_json = json.loads(duthost.shell(f"cat /usr/share/sonic/device/{platform}/platform.json")["stdout"])
+    try:
+        interface = list(platform_json["DPUS"][f"dpu{dpu_index}"]["interface"].keys())[0]
+    except KeyError:
+        interface = f"Ethernet-BP{dpu_index}"
path: tests/dash/test_dash_privatelink.py
user: login: aronovic
body: PR 17716 Generate new npu-dpu ports Ethernet224 To Ethernet280 for cisco smartswicth "Cisco-8102-28FH-DPU-O-T1" has not been merged yet. I will update this code after the PR gets merged.
created_at: 2025-04-07T14:31:43Z
author_association: CONTRIBUTOR

PR comments:
user: login: mssonicbld
created_at: 2025-03-04T15:23:33Z
body: /azp run
author_association: COLLABORATOR
user: login: azure-pipelines[bot]
created_at: 2025-03-04T15:23:46Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: mssonicbld
created_at: 2025-03-20T19:56:29Z
body: /azp run
author_association: COLLABORATOR
user: login: azure-pipelines[bot]
created_at: 2025-03-20T19:56:41Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: mssonicbld
created_at: 2025-03-31T18:16:29Z
body: /azp run
author_association: COLLABORATOR
user: login: azure-pipelines[bot]
created_at: 2025-03-31T18:16:36Z
body: <samp>
Azure Pipelines will not run the associated pipelines, because the pull request was updated after the run command was issued. Review the pull request again and issue a new run command.<br>

</samp>
author_association: NONE
user: login: mssonicbld
created_at: 2025-03-31T18:19:37Z
body: /azp run
author_association: COLLABORATOR
user: login: azure-pipelines[bot]
created_at: 2025-03-31T18:19:50Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: mssonicbld
created_at: 2025-04-14T18:31:27Z
body: /azp run
author_association: COLLABORATOR
user: login: azure-pipelines[bot]
created_at: 2025-04-14T18:31:34Z
body: <samp>
Azure Pipelines will not run the associated pipelines, because the pull request was updated after the run command was issued. Review the pull request again and issue a new run command.<br>

</samp>
author_association: NONE
user: login: theasianpianist
created_at: 2025-04-18T05:25:10Z
body: changes lgtm, please resolve merge conflicts
author_association: CONTRIBUTOR
user: login: mssonicbld
created_at: 2025-04-24T12:27:15Z
body: /azp run
author_association: COLLABORATOR
user: login: azure-pipelines[bot]
created_at: 2025-04-24T12:27:27Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: prsunny
created_at: 2025-04-24T16:12:43Z
body: /azp run
author_association: CONTRIBUTOR
user: login: azure-pipelines[bot]
created_at: 2025-04-24T16:12:54Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: prsunny
created_at: 2025-04-24T16:17:20Z
body: @aronovic , can you check the build failure?
author_association: CONTRIBUTOR
user: login: aronovic
created_at: 2025-04-24T16:25:52Z
body: > @aronovic , can you check the build failure?

Sure, let me do it now.
author_association: CONTRIBUTOR
user: login: mssonicbld
created_at: 2025-04-24T16:31:57Z
body: /azp run
author_association: COLLABORATOR
user: login: azure-pipelines[bot]
created_at: 2025-04-24T16:32:09Z
body: <samp>
Azure Pipelines successfully started running 1 pipeline(s).<br>

</samp>
author_association: NONE
user: login: prsunny
created_at: 2025-04-24T20:05:53Z
body: @oleksandrivantsiv PR merged for your viz
author_association: CONTRIBUTOR