Skip to content

Commit

Permalink
[Fixbug]: Fix vnet attribute miss if route action is vnet_direct and …
Browse files Browse the repository at this point in the history
…vnet test cases (#2873) (#2877)

What I did

- For outbound routing, I fix a bug that vnet name will lose in vnet_direct case.
- The fvs from asic db is the dict type in test cases of dash vnet, for a dict will just for its keys.

Why I did it

The vnet name in vnet and vnet_direct cases are defined in a different field.
https://github.com/sonic-net/sonic-dash-api/blob/3f728d1bbf65d2e8c41bdc023d5c07702a7f848b/proto/route.proto#L30-L32
message VnetDirect {
    // destination vnet name if action_type is {vnet, vnet_direct}, a vnet other than eni's vnet means vnet peering
    string vnet = 1;
...
}

message Route {
    route_type.RoutingType action_type = 1;
    oneof Action {
        // destination vnet name if action_type is vnet,, a vnet other than eni's vnet means vnet peering
        string vnet = 2;
        // destination vnet name if action_type is vnet_direct,, a vnet other than eni's vnet means vnet peering
        route_lpm.VnetDirect vnet_direct = 3;
...
    }
  }
Add the items after fvs to fetch each items of fvs
How I verified it
Add a new test case and check tests.

$ sudo pytest --dvsname=vs --num-ports=32 test_dash_vnet.py  --pdb
====================================== test session starts ======================================
platform linux -- Python 3.8.10, pytest-7.2.2, pluggy-1.0.0
rootdir: /home/zegan/workspace/sonic-swss/tests
plugins: flaky-3.7.0
collected 8 items

test_dash_vnet.py ........                                                                [100%]

======================================= warnings summary ========================================

Signed-off-by: Ze Gan <[email protected]>
  • Loading branch information
Pterosaur authored Aug 22, 2023
1 parent 873455b commit 7102220
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 16 deletions.
21 changes: 18 additions & 3 deletions orchagent/dash/dashrouteorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,24 +84,39 @@ bool DashRouteOrch::addOutboundRouting(const string& key, OutboundRoutingBulkCon
outbound_routing_attr.value.u32 = sOutboundAction[ctxt.metadata.action_type()];
outbound_routing_attrs.push_back(outbound_routing_attr);

if (ctxt.metadata.has_vnet())
if (ctxt.metadata.action_type() == dash::route_type::RoutingType::ROUTING_TYPE_DIRECT)
{
// Intentional empty line, To direct action type, don't need set extra attributes
}
else if (ctxt.metadata.action_type() == dash::route_type::RoutingType::ROUTING_TYPE_VNET
&& ctxt.metadata.has_vnet()
&& !ctxt.metadata.vnet().empty())
{
outbound_routing_attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID;
outbound_routing_attr.value.oid = gVnetNameToId[ctxt.metadata.vnet()];
outbound_routing_attrs.push_back(outbound_routing_attr);
}

if (ctxt.metadata.action_type() == dash::route_type::RoutingType::ROUTING_TYPE_VNET_DIRECT
else if (ctxt.metadata.action_type() == dash::route_type::RoutingType::ROUTING_TYPE_VNET_DIRECT
&& ctxt.metadata.has_vnet_direct()
&& !ctxt.metadata.vnet_direct().vnet().empty()
&& (ctxt.metadata.vnet_direct().overlay_ip().has_ipv4() || ctxt.metadata.vnet_direct().overlay_ip().has_ipv6()))
{
outbound_routing_attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID;
outbound_routing_attr.value.oid = gVnetNameToId[ctxt.metadata.vnet_direct().vnet()];
outbound_routing_attrs.push_back(outbound_routing_attr);

outbound_routing_attr.id = SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP;
if (!to_sai(ctxt.metadata.vnet_direct().overlay_ip(), outbound_routing_attr.value.ipaddr))
{
return false;
}
outbound_routing_attrs.push_back(outbound_routing_attr);
}
else
{
SWSS_LOG_WARN("Attribute action for outbound routing entry %s", key.c_str());
return false;
}

object_statuses.emplace_back();
outbound_routing_bulker_.create_entry(&object_statuses.back(), &outbound_routing_entry,
Expand Down
28 changes: 15 additions & 13 deletions tests/test_dash_vnet.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import uuid
import ipaddress
import sys
import socket


DVS_ENV = ["HWSKU=DPU-2P"]
Expand Down Expand Up @@ -144,21 +145,21 @@ def test_appliance(self, dvs):
self.sip = "10.0.0.1"
self.vm_vni = "4321"
pb = Appliance()
pb.sip.ipv4 = int(ipaddress.ip_address(self.sip))
pb.sip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.sip)))
pb.vm_vni = int(self.vm_vni)
dashobj.create_appliance(self.appliance_id, {"pb": pb.SerializeToString()})
time.sleep(3)

direction_entries = dashobj.asic_direction_lookup_table.get_keys()
assert direction_entries
fvs = dashobj.asic_direction_lookup_table[direction_entries[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION":
assert fv[1] == "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION"
vip_entries = dashobj.asic_vip_table.get_keys()
assert vip_entries
fvs = dashobj.asic_vip_table[vip_entries[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_VIP_ENTRY_ATTR_ACTION":
assert fv[1] == "SAI_VIP_ENTRY_ACTION_ACCEPT"
return dashobj
Expand Down Expand Up @@ -191,7 +192,7 @@ def test_eni(self, dvs):
pb = Eni()
pb.eni_id = self.eni_id
pb.mac_address = bytes.fromhex(self.mac_address.replace(":", ""))
pb.underlay_ip.ipv4 = int(ipaddress.ip_address(self.underlay_ip))
pb.underlay_ip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.underlay_ip)))
pb.admin_state = State.STATE_ENABLED
pb.vnet = self.vnet
dashobj.create_eni(self.mac_string, {"pb": pb.SerializeToString()})
Expand All @@ -203,7 +204,7 @@ def test_eni(self, dvs):
assert enis
self.eni_oid = enis[0];
fvs = dashobj.asic_eni_table[enis[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_ENI_ATTR_VNET_ID":
assert fv[1] == str(self.vnet_oid)
if fv[0] == "SAI_ENI_ATTR_PPS":
Expand All @@ -219,7 +220,7 @@ def test_eni(self, dvs):
eni_addr_maps = dashobj.asic_eni_ether_addr_map_table.get_keys()
assert eni_addr_maps
fvs = dashobj.asic_eni_ether_addr_map_table[eni_addr_maps[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID":
assert fv[1] == str(self.eni_oid)
return dashobj
Expand All @@ -235,7 +236,7 @@ def test_vnet_map(self, dvs):
pb = VnetMapping()
pb.mac_address = bytes.fromhex(self.mac_address.replace(":", ""))
pb.action_type = RoutingType.ROUTING_TYPE_VNET_ENCAP
pb.underlay_ip.ipv4 = int(ipaddress.ip_address(self.underlay_ip))
pb.underlay_ip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.underlay_ip)))

dashobj.create_vnet_map(self.vnet, self.ip1, {"pb": pb.SerializeToString()})
dashobj.create_vnet_map(self.vnet, self.ip2, {"pb": pb.SerializeToString()})
Expand All @@ -244,16 +245,16 @@ def test_vnet_map(self, dvs):
vnet_ca_to_pa_maps = dashobj.asic_dash_outbound_ca_to_pa_table.get_keys()
assert len(vnet_ca_to_pa_maps) >= 2
fvs = dashobj.asic_dash_outbound_ca_to_pa_table[vnet_ca_to_pa_maps[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP":
assert fv[1] == "101.1.2.3"
if fv[0] == "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC":
assert fv[1] == "F9:22:83:99:22:A2"
assert fv[1] == "F4:93:9F:EF:C4:7E"

vnet_pa_validation_maps = dashobj.asic_pa_validation_table.get_keys()
assert vnet_pa_validation_maps
fvs = dashobj.asic_pa_validation_table[vnet_pa_validation_maps[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_PA_VALIDATION_ENTRY_ATTR_ACTION":
assert fv[1] == "SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT"
return dashobj
Expand All @@ -268,18 +269,19 @@ def test_outbound_routing(self, dvs):
pb = Route()
pb.action_type = RoutingType.ROUTING_TYPE_VNET_DIRECT
pb.vnet_direct.vnet = self.vnet
pb.vnet_direct.overlay_ip.ipv4 = int(ipaddress.ip_address(self.overlay_ip))
pb.vnet_direct.overlay_ip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.overlay_ip)))
dashobj.create_outbound_routing(self.mac_string, self.ip, {"pb": pb.SerializeToString()})
time.sleep(3)

outbound_routing_entries = dashobj.asic_outbound_routing_table.get_keys()
assert outbound_routing_entries
fvs = dashobj.asic_outbound_routing_table[outbound_routing_entries[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION":
assert fv[1] == "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT"
if fv[0] == "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP":
assert fv[1] == "10.0.0.6"
assert "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID" in fvs
return dashobj

def test_inbound_routing(self, dvs):
Expand All @@ -305,7 +307,7 @@ def test_inbound_routing(self, dvs):
inbound_routing_entries = dashobj.asic_inbound_routing_rule_table.get_keys()
assert inbound_routing_entries
fvs = dashobj.asic_inbound_routing_rule_table[inbound_routing_entries[0]]
for fv in fvs:
for fv in fvs.items():
if fv[0] == "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION":
assert fv[1] == "SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE"
return dashobj
Expand Down

0 comments on commit 7102220

Please sign in to comment.