Skip to content

Commit 199e6bb

Browse files
add VS test for PL
Signed-off-by: Lawrence Lee <[email protected]>
1 parent 1a7685d commit 199e6bb

File tree

3 files changed

+174
-48
lines changed

3 files changed

+174
-48
lines changed

tests/dash_utils.py

+122
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from swsscommon import swsscommon
2+
import typing
3+
import pytest
4+
5+
@pytest.fixture(scope='module')
6+
def dash_db(dvs):
7+
return DashDB(dvs)
8+
9+
def to_string(value):
10+
if isinstance(value, bool):
11+
return "true" if value else "false"
12+
elif isinstance(value, bytes):
13+
return value
14+
return str(value)
15+
16+
class ProducerStateTable(swsscommon.ProducerStateTable):
17+
def __setitem__(self, key: str, pairs: typing.Union[dict, list, tuple]):
18+
pairs_str = []
19+
if isinstance(pairs, dict):
20+
pairs = pairs.items()
21+
for k, v in pairs:
22+
pairs_str.append((to_string(k), to_string(v)))
23+
self.set(key, pairs_str)
24+
25+
def __delitem__(self, key: str):
26+
self.delete(str(key))
27+
28+
29+
class Table(swsscommon.Table):
30+
def __getitem__(self, key: str):
31+
exists, result = self.get(str(key))
32+
if not exists:
33+
return None
34+
else:
35+
return dict(result)
36+
37+
def get_keys(self):
38+
return self.getKeys()
39+
40+
def get_newly_created_oid(self, old_oids):
41+
new_oids = self.asic_db.wait_for_n_keys(self, len(old_oids) + 1)
42+
oid = [ids for ids in new_oids if ids not in old_oids]
43+
return oid[0]
44+
45+
46+
class DashDB(object):
47+
def __init__(self, dvs):
48+
self.dvs = dvs
49+
self.app_dash_routing_type_table = ProducerStateTable(
50+
self.dvs.get_app_db().db_connection, "DASH_ROUTING_TYPE_TABLE")
51+
self.app_dash_appliance_table = ProducerStateTable(
52+
self.dvs.get_app_db().db_connection, "DASH_APPLIANCE_TABLE")
53+
self.asic_direction_lookup_table = Table(
54+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_DIRECTION_LOOKUP_ENTRY")
55+
self.asic_vip_table = Table(
56+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_VIP_ENTRY")
57+
self.app_dash_vnet_table = ProducerStateTable(
58+
self.dvs.get_app_db().db_connection, "DASH_VNET_TABLE")
59+
self.asic_dash_vnet_table = Table(
60+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_VNET")
61+
self.app_dash_eni_table = ProducerStateTable(
62+
self.dvs.get_app_db().db_connection, "DASH_ENI_TABLE")
63+
self.asic_eni_table = Table(
64+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_ENI")
65+
self.asic_eni_ether_addr_map_table = Table(
66+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_ENI_ETHER_ADDRESS_MAP_ENTRY")
67+
self.app_dash_vnet_map_table = ProducerStateTable(
68+
self.dvs.get_app_db().db_connection, "DASH_VNET_MAPPING_TABLE")
69+
self.asic_dash_outbound_ca_to_pa_table = Table(
70+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_OUTBOUND_CA_TO_PA_ENTRY")
71+
self.asic_pa_validation_table = Table(
72+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_PA_VALIDATION_ENTRY")
73+
self.app_dash_route_table = ProducerStateTable(
74+
self.dvs.get_app_db().db_connection, "DASH_ROUTE_TABLE")
75+
self.app_dash_route_rule_table = ProducerStateTable(
76+
self.dvs.get_app_db().db_connection, "DASH_ROUTE_RULE_TABLE")
77+
self.asic_outbound_routing_table = Table(
78+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_OUTBOUND_ROUTING_ENTRY")
79+
self.asic_inbound_routing_rule_table = Table(
80+
self.dvs.get_asic_db().db_connection, "ASIC_STATE:SAI_OBJECT_TYPE_INBOUND_ROUTING_ENTRY")
81+
82+
def create_appliance(self, appliance_id, attr_maps: dict):
83+
self.app_dash_appliance_table[str(appliance_id)] = attr_maps
84+
85+
def remove_appliance(self, appliance_id):
86+
del self.app_dash_appliance_table[str(appliance_id)]
87+
88+
def create_vnet(self, vnet, attr_maps: dict):
89+
self.app_dash_vnet_table[str(vnet)] = attr_maps
90+
91+
def remove_vnet(self, vnet):
92+
del self.app_dash_vnet_table[str(vnet)]
93+
94+
def create_eni(self, eni, attr_maps: dict):
95+
self.app_dash_eni_table[str(eni)] = attr_maps
96+
97+
def remove_eni(self, eni):
98+
del self.app_dash_eni_table[str(eni)]
99+
100+
def create_vnet_map(self, vnet, ip, attr_maps: dict):
101+
self.app_dash_vnet_map_table[str(vnet) + ":" + str(ip)] = attr_maps
102+
103+
def remove_vnet_map(self, vnet, ip):
104+
del self.app_dash_vnet_map_table[str(vnet) + ":" + str(ip)]
105+
106+
def create_outbound_routing(self, mac_string, ip, attr_maps: dict):
107+
self.app_dash_route_table[str(mac_string) + ":" + str(ip)] = attr_maps
108+
109+
def remove_outbound_routing(self, mac_string, ip):
110+
del self.app_dash_route_table[str(mac_string) + ":" + str(ip)]
111+
112+
def create_inbound_routing(self, mac_string, vni, ip, attr_maps: dict):
113+
self.app_dash_route_rule_table[str(mac_string) + ":" + str(vni) + ":" + str(ip)] = attr_maps
114+
115+
def remove_inbound_routing(self, mac_string, vni, ip):
116+
del self.app_dash_route_rule_table[str(mac_string) + ":" + str(vni) + ":" + str(ip)]
117+
118+
def create_routing_type(self, routing_type, attr_maps: dict):
119+
self.app_dash_routing_type_table[str(routing_type)] = attr_maps
120+
121+
def remove_routing_type(self, routing_type):
122+
del self.app_dash_routing_type_table[str(routing_type)]

tests/sai_attrs.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
SAI_ENI_ATTR_PL_SIP = 'SAI_ENI_ATTR_PL_SIP'
2+
SAI_ENI_ATTR_PL_SIP_MASK = 'SAI_ENI_ATTR_PL_SIP_MASK'
3+
SAI_ENI_ATTR_PL_UNDERLAY_SIP = 'SAI_ENI_ATTR_PL_UNDERLAY_SIP'
4+
SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_TUNNEL_MAPPING = 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_TUNNEL_MAPPING'
5+
SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_PRIVATE_LINK_MAPPING = 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ACTION_SET_PRIVATE_LINK_MAPPING'
6+
SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_ACTION = 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_ACTION'
7+
SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_SIP = 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_SIP'
8+
SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DIP = 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DIP'
9+
SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_DASH_ENCAPSULATION = 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_DASH_ENCAPSULATION'
10+
SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_TUNNEL_KEY = 'SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_TUNNEL_KEY'
11+
SAI_DASH_ENCAPSULATION_NVGRE = 'SAI_DASH_ENCAPSULATION_NVGRE'

tests/test_dash_vnet.py

+41-48
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from dash_api.route_type_pb2 import *
88
from dash_api.types_pb2 import *
99

10-
from dash_utils import DashDB
10+
from dash_utils import dash_db
1111

1212
import time
1313
import uuid
@@ -18,48 +18,45 @@
1818
NUM_PORTS = 2
1919

2020
class TestDash(object):
21-
def test_appliance(self, dvs):
22-
dashobj = DashDB(dvs)
21+
def test_appliance(self, dash_db):
2322
self.appliance_id = "100"
2423
self.sip = "10.0.0.1"
2524
self.vm_vni = "4321"
2625
pb = Appliance()
2726
pb.sip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.sip)))
2827
pb.vm_vni = int(self.vm_vni)
29-
dashobj.create_appliance(self.appliance_id, {"pb": pb.SerializeToString()})
28+
dash_db.create_appliance(self.appliance_id, {"pb": pb.SerializeToString()})
3029
time.sleep(3)
3130

32-
direction_entries = dashobj.asic_direction_lookup_table.get_keys()
31+
direction_entries = dash_db.asic_direction_lookup_table.get_keys()
3332
assert direction_entries
34-
fvs = dashobj.asic_direction_lookup_table[direction_entries[0]]
33+
fvs = dash_db.asic_direction_lookup_table[direction_entries[0]]
3534
for fv in fvs.items():
3635
if fv[0] == "SAI_DIRECTION_LOOKUP_ENTRY_ATTR_ACTION":
3736
assert fv[1] == "SAI_DIRECTION_LOOKUP_ENTRY_ACTION_SET_OUTBOUND_DIRECTION"
38-
vip_entries = dashobj.asic_vip_table.get_keys()
37+
vip_entries = dash_db.asic_vip_table.get_keys()
3938
assert vip_entries
40-
fvs = dashobj.asic_vip_table[vip_entries[0]]
39+
fvs = dash_db.asic_vip_table[vip_entries[0]]
4140
for fv in fvs.items():
4241
if fv[0] == "SAI_VIP_ENTRY_ATTR_ACTION":
4342
assert fv[1] == "SAI_VIP_ENTRY_ACTION_ACCEPT"
4443

45-
def test_vnet(self, dvs):
46-
dashobj = DashDB(dvs)
44+
def test_vnet(self, dash_db):
4745
self.vnet = "Vnet1"
4846
self.vni = "45654"
4947
self.guid = "559c6ce8-26ab-4193-b946-ccc6e8f930b2"
5048
pb = Vnet()
5149
pb.vni = int(self.vni)
5250
pb.guid.value = bytes.fromhex(uuid.UUID(self.guid).hex)
53-
dashobj.create_vnet(self.vnet, {"pb": pb.SerializeToString()})
51+
dash_db.create_vnet(self.vnet, {"pb": pb.SerializeToString()})
5452
time.sleep(3)
55-
vnets = dashobj.asic_dash_vnet_table.get_keys()
53+
vnets = dash_db.asic_dash_vnet_table.get_keys()
5654
assert vnets
5755
self.vnet_oid = vnets[0]
58-
vnet_attr = dashobj.asic_dash_vnet_table[self.vnet_oid]
56+
vnet_attr = dash_db.asic_dash_vnet_table[self.vnet_oid]
5957
assert vnet_attr["SAI_VNET_ATTR_VNI"] == "45654"
6058

61-
def test_eni(self, dvs):
62-
dashobj = DashDB(dvs)
59+
def test_eni(self, dash_db):
6360
self.vnet = "Vnet1"
6461
self.mac_string = "F4939FEFC47E"
6562
self.mac_address = "F4:93:9F:EF:C4:7E"
@@ -72,15 +69,15 @@ def test_eni(self, dvs):
7269
pb.underlay_ip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.underlay_ip)))
7370
pb.admin_state = State.STATE_ENABLED
7471
pb.vnet = self.vnet
75-
dashobj.create_eni(self.mac_string, {"pb": pb.SerializeToString()})
72+
dash_db.create_eni(self.mac_string, {"pb": pb.SerializeToString()})
7673
time.sleep(3)
77-
vnets = dashobj.asic_dash_vnet_table.get_keys()
74+
vnets = dash_db.asic_dash_vnet_table.get_keys()
7875
assert vnets
7976
self.vnet_oid = vnets[0]
80-
enis = dashobj.asic_eni_table.get_keys()
77+
enis = dash_db.asic_eni_table.get_keys()
8178
assert enis
8279
self.eni_oid = enis[0];
83-
fvs = dashobj.asic_eni_table[enis[0]]
80+
fvs = dash_db.asic_eni_table[enis[0]]
8481
for fv in fvs.items():
8582
if fv[0] == "SAI_ENI_ATTR_VNET_ID":
8683
assert fv[1] == str(self.vnet_oid)
@@ -94,15 +91,14 @@ def test_eni(self, dvs):
9491
assert fv[1] == "true"
9592

9693
time.sleep(3)
97-
eni_addr_maps = dashobj.asic_eni_ether_addr_map_table.get_keys()
94+
eni_addr_maps = dash_db.asic_eni_ether_addr_map_table.get_keys()
9895
assert eni_addr_maps
99-
fvs = dashobj.asic_eni_ether_addr_map_table[eni_addr_maps[0]]
96+
fvs = dash_db.asic_eni_ether_addr_map_table[eni_addr_maps[0]]
10097
for fv in fvs.items():
10198
if fv[0] == "SAI_ENI_ETHER_ADDRESS_MAP_ENTRY_ATTR_ENI_ID":
10299
assert fv[1] == str(self.eni_oid)
103100

104-
def test_vnet_map(self, dvs):
105-
dashobj = DashDB(dvs)
101+
def test_vnet_map(self, dash_db):
106102
self.vnet = "Vnet1"
107103
self.ip1 = "10.1.1.1"
108104
self.ip2 = "10.1.1.2"
@@ -114,34 +110,33 @@ def test_vnet_map(self, dvs):
114110
route_action.action_name = "action1"
115111
route_action.action_type = ACTION_TYPE_MAPROUTING
116112
route_type_msg.items.append(route_action)
117-
dashobj.create_routing_type(self.routing_type, {"pb": route_type_msg.SerializeToString()})
113+
dash_db.create_routing_type(self.routing_type, {"pb": route_type_msg.SerializeToString()})
118114
pb = VnetMapping()
119115
pb.mac_address = bytes.fromhex(self.mac_address.replace(":", ""))
120116
pb.action_type = RoutingType.ROUTING_TYPE_VNET_ENCAP
121117
pb.underlay_ip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.underlay_ip)))
122118

123-
dashobj.create_vnet_map(self.vnet, self.ip1, {"pb": pb.SerializeToString()})
124-
dashobj.create_vnet_map(self.vnet, self.ip2, {"pb": pb.SerializeToString()})
119+
dash_db.create_vnet_map(self.vnet, self.ip1, {"pb": pb.SerializeToString()})
120+
dash_db.create_vnet_map(self.vnet, self.ip2, {"pb": pb.SerializeToString()})
125121
time.sleep(3)
126122

127-
vnet_ca_to_pa_maps = dashobj.asic_dash_outbound_ca_to_pa_table.get_keys()
123+
vnet_ca_to_pa_maps = dash_db.asic_dash_outbound_ca_to_pa_table.get_keys()
128124
assert len(vnet_ca_to_pa_maps) >= 2
129-
fvs = dashobj.asic_dash_outbound_ca_to_pa_table[vnet_ca_to_pa_maps[0]]
125+
fvs = dash_db.asic_dash_outbound_ca_to_pa_table[vnet_ca_to_pa_maps[0]]
130126
for fv in fvs.items():
131127
if fv[0] == "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_UNDERLAY_DIP":
132128
assert fv[1] == "101.1.2.3"
133129
if fv[0] == "SAI_OUTBOUND_CA_TO_PA_ENTRY_ATTR_OVERLAY_DMAC":
134130
assert fv[1] == "F4:93:9F:EF:C4:7E"
135131

136-
vnet_pa_validation_maps = dashobj.asic_pa_validation_table.get_keys()
132+
vnet_pa_validation_maps = dash_db.asic_pa_validation_table.get_keys()
137133
assert vnet_pa_validation_maps
138-
fvs = dashobj.asic_pa_validation_table[vnet_pa_validation_maps[0]]
134+
fvs = dash_db.asic_pa_validation_table[vnet_pa_validation_maps[0]]
139135
for fv in fvs.items():
140136
if fv[0] == "SAI_PA_VALIDATION_ENTRY_ATTR_ACTION":
141137
assert fv[1] == "SAI_PA_VALIDATION_ENTRY_ACTION_PERMIT"
142138

143-
def test_outbound_routing(self, dvs):
144-
dashobj = DashDB(dvs)
139+
def test_outbound_routing(self, dash_db):
145140
self.vnet = "Vnet1"
146141
self.mac_string = "F4939FEFC47E"
147142
self.ip = "10.1.0.0/24"
@@ -151,21 +146,20 @@ def test_outbound_routing(self, dvs):
151146
pb.action_type = RoutingType.ROUTING_TYPE_VNET_DIRECT
152147
pb.vnet_direct.vnet = self.vnet
153148
pb.vnet_direct.overlay_ip.ipv4 = socket.htonl(int(ipaddress.ip_address(self.overlay_ip)))
154-
dashobj.create_outbound_routing(self.mac_string, self.ip, {"pb": pb.SerializeToString()})
149+
dash_db.create_outbound_routing(self.mac_string, self.ip, {"pb": pb.SerializeToString()})
155150
time.sleep(3)
156151

157-
outbound_routing_entries = dashobj.asic_outbound_routing_table.get_keys()
152+
outbound_routing_entries = dash_db.asic_outbound_routing_table.get_keys()
158153
assert outbound_routing_entries
159-
fvs = dashobj.asic_outbound_routing_table[outbound_routing_entries[0]]
154+
fvs = dash_db.asic_outbound_routing_table[outbound_routing_entries[0]]
160155
for fv in fvs.items():
161156
if fv[0] == "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_ACTION":
162157
assert fv[1] == "SAI_OUTBOUND_ROUTING_ENTRY_ACTION_ROUTE_VNET_DIRECT"
163158
if fv[0] == "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_OVERLAY_IP":
164159
assert fv[1] == "10.0.0.6"
165160
assert "SAI_OUTBOUND_ROUTING_ENTRY_ATTR_DST_VNET_ID" in fvs
166161

167-
def test_inbound_routing(self, dvs):
168-
dashobj = DashDB(dvs)
162+
def test_inbound_routing(self, dash_db):
169163
self.mac_string = "F4939FEFC47E"
170164
self.vnet = "Vnet1"
171165
self.vni = "3251"
@@ -180,30 +174,29 @@ def test_inbound_routing(self, dvs):
180174
pb.protocol = int(self.protocol)
181175
pb.vnet = self.vnet
182176

183-
dashobj.create_inbound_routing(self.mac_string, self.vni, self.ip, {"pb": pb.SerializeToString()})
177+
dash_db.create_inbound_routing(self.mac_string, self.vni, self.ip, {"pb": pb.SerializeToString()})
184178
time.sleep(3)
185179

186-
inbound_routing_entries = dashobj.asic_inbound_routing_rule_table.get_keys()
180+
inbound_routing_entries = dash_db.asic_inbound_routing_rule_table.get_keys()
187181
assert inbound_routing_entries
188-
fvs = dashobj.asic_inbound_routing_rule_table[inbound_routing_entries[0]]
182+
fvs = dash_db.asic_inbound_routing_rule_table[inbound_routing_entries[0]]
189183
for fv in fvs.items():
190184
if fv[0] == "SAI_INBOUND_ROUTING_ENTRY_ATTR_ACTION":
191185
assert fv[1] == "SAI_INBOUND_ROUTING_ENTRY_ACTION_VXLAN_DECAP_PA_VALIDATE"
192186

193-
def test_cleanup(self, dvs):
194-
dashobj = DashDB(dvs)
187+
def test_cleanup(self, dash_db):
195188
self.vnet = "Vnet1"
196189
self.mac_string = "F4939FEFC47E"
197190
self.vni = "3251"
198191
self.sip = "10.1.1.1"
199192
self.dip = "10.1.0.0/24"
200193
self.appliance_id = "100"
201-
dashobj.remove_inbound_routing(self.mac_string, self.vni, self.sip)
202-
dashobj.remove_outbound_routing(self.mac_string, self.dip)
203-
dashobj.remove_eni(self.mac_string)
204-
dashobj.remove_vnet_map(self.vnet, self.sip)
205-
dashobj.remove_vnet(self.vnet)
206-
dashobj.remove_appliance(self.appliance_id)
194+
dash_db.remove_inbound_routing(self.mac_string, self.vni, self.sip)
195+
dash_db.remove_outbound_routing(self.mac_string, self.dip)
196+
dash_db.remove_eni(self.mac_string)
197+
dash_db.remove_vnet_map(self.vnet, self.sip)
198+
dash_db.remove_vnet(self.vnet)
199+
dash_db.remove_appliance(self.appliance_id)
207200

208201
# Add Dummy always-pass test at end as workaroud
209202
# for issue when Flaky fail on final test it invokes module tear-down

0 commit comments

Comments
 (0)