Skip to content

Commit 252e12c

Browse files
authored
Add scope attribute to VNET table. (#954)
* Add a global scope to VNet to consider default VRF * Add VS test to validate default scope changes
1 parent 2902ba0 commit 252e12c

3 files changed

Lines changed: 61 additions & 8 deletions

File tree

orchagent/vnetorch.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ extern sai_neighbor_api_t* sai_neighbor_api;
2929
extern sai_next_hop_api_t* sai_next_hop_api;
3030
extern sai_bmtor_api_t* sai_bmtor_api;
3131
extern sai_object_id_t gSwitchId;
32+
extern sai_object_id_t gVirtualRouterId;
3233
extern Directory<Orch*> gDirectory;
3334
extern PortsOrch *gPortsOrch;
3435
extern IntfsOrch *gIntfsOrch;
@@ -101,9 +102,13 @@ bool VNetVrfObject::createObj(vector<sai_attribute_t>& attrs)
101102

102103
for (auto vr_type : vr_cntxt)
103104
{
104-
sai_object_id_t router_id;
105-
if (vr_type != VR_TYPE::VR_INVALID && l_fn(router_id))
105+
sai_object_id_t router_id = gVirtualRouterId;
106+
if (vr_type != VR_TYPE::VR_INVALID)
106107
{
108+
if (getScope() != "default")
109+
{
110+
l_fn(router_id);
111+
}
107112
SWSS_LOG_DEBUG("VNET vr_type %d router id %" PRIx64 " ", static_cast<int>(vr_type), router_id);
108113
vr_ids_.insert(std::pair<VR_TYPE, sai_object_id_t>(vr_type, router_id));
109114
}
@@ -1394,6 +1399,7 @@ bool VNetOrch::addOperation(const Request& request)
13941399
bool peer = false, create = false;
13951400
uint32_t vni=0;
13961401
string tunnel;
1402+
string scope;
13971403

13981404
for (const auto& name: request.getAttrFieldNames())
13991405
{
@@ -1417,6 +1423,10 @@ bool VNetOrch::addOperation(const Request& request)
14171423
{
14181424
tunnel = request.getAttrString("vxlan_tunnel");
14191425
}
1426+
else if (name == "scope")
1427+
{
1428+
scope = request.getAttrString("scope");
1429+
}
14201430
else
14211431
{
14221432
SWSS_LOG_INFO("Unknown attribute: %s", name.c_str());
@@ -1443,7 +1453,7 @@ bool VNetOrch::addOperation(const Request& request)
14431453

14441454
if (it == std::end(vnet_table_))
14451455
{
1446-
VNetInfo vnet_info = { tunnel, vni, peer_list };
1456+
VNetInfo vnet_info = { tunnel, vni, peer_list, scope };
14471457
obj = createObject<VNetVrfObject>(vnet_name, vnet_info, attrs);
14481458
create = true;
14491459
}
@@ -1470,7 +1480,7 @@ bool VNetOrch::addOperation(const Request& request)
14701480

14711481
if (it == std::end(vnet_table_))
14721482
{
1473-
VNetInfo vnet_info = { tunnel, vni, peer_list };
1483+
VNetInfo vnet_info = { tunnel, vni, peer_list, scope };
14741484
obj = createObject<VNetBitmapObject>(vnet_name, vnet_info, attrs);
14751485
create = true;
14761486
}

orchagent/vnetorch.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const request_description_t vnet_request_description = {
2626
{ "vni", REQ_T_UINT },
2727
{ "peer_list", REQ_T_SET },
2828
{ "guid", REQ_T_STRING },
29+
{ "scope", REQ_T_STRING },
2930
},
3031
{ "vxlan_tunnel", "vni" } // mandatory attributes
3132
};
@@ -49,6 +50,7 @@ struct VNetInfo
4950
string tunnel;
5051
uint32_t vni;
5152
set<string> peers;
53+
string scope;
5254
};
5355

5456
typedef map<VR_TYPE, sai_object_id_t> vrid_list_t;
@@ -73,7 +75,8 @@ class VNetObject
7375
VNetObject(const VNetInfo& vnetInfo) :
7476
tunnel_(vnetInfo.tunnel),
7577
peer_list_(vnetInfo.peers),
76-
vni_(vnetInfo.vni)
78+
vni_(vnetInfo.vni),
79+
scope_(vnetInfo.scope)
7780
{ }
7881

7982
virtual bool updateObj(vector<sai_attribute_t>&) = 0;
@@ -98,12 +101,18 @@ class VNetObject
98101
return vni_;
99102
}
100103

104+
string getScope() const
105+
{
106+
return scope_;
107+
}
108+
101109
virtual ~VNetObject() noexcept(false) {};
102110

103111
private:
104112
set<string> peer_list_ = {};
105113
string tunnel_;
106114
uint32_t vni_;
115+
string scope_;
107116
};
108117

109118
struct nextHop

tests/test_vnet.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def delete_phy_interface(dvs, ifname, ipaddr):
291291
time.sleep(2)
292292

293293

294-
def create_vnet_entry(dvs, name, tunnel, vni, peer_list):
294+
def create_vnet_entry(dvs, name, tunnel, vni, peer_list, scope=""):
295295
conf_db = swsscommon.DBConnector(swsscommon.CONFIG_DB, dvs.redis_sock, 0)
296296
asic_db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0)
297297

@@ -301,6 +301,9 @@ def create_vnet_entry(dvs, name, tunnel, vni, peer_list):
301301
("peer_list", peer_list),
302302
]
303303

304+
if scope:
305+
attrs.append(('scope', scope))
306+
304307
# create the VXLAN tunnel Term entry in Config DB
305308
create_entry_tbl(
306309
conf_db,
@@ -520,6 +523,14 @@ def check_vnet_entry(self, dvs, name, peer_list=[]):
520523
self.vnet_vr_ids.update(new_vr_ids)
521524
self.vr_map[name] = { 'ing':new_vr_ids[0], 'egr':new_vr_ids[1], 'peer':peer_list }
522525

526+
def check_default_vnet_entry(self, dvs, name):
527+
asic_db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0)
528+
#Check virtual router objects
529+
assert how_many_entries_exist(asic_db, self.ASIC_VRF_TABLE) == (len(self.vnet_vr_ids)),\
530+
"Some VR objects are created"
531+
#Mappers for default VNET is created with default VR objects.
532+
self.vr_map[name] = { 'ing':list(self.vnet_vr_ids)[0], 'egr':list(self.vnet_vr_ids)[0], 'peer':[] }
533+
523534
def check_del_vnet_entry(self, dvs, name):
524535
# TODO: Implement for VRF VNET
525536
return True
@@ -567,8 +578,12 @@ def check_router_interface(self, dvs, name, vlan_oid=0):
567578
self.routes.update(new_route)
568579

569580
def check_del_router_interface(self, dvs, name):
570-
# TODO: Implement for VRF VNET
571-
return True
581+
asic_db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0)
582+
583+
old_rif = get_deleted_entries(asic_db, self.ASIC_RIF_TABLE, self.rifs, 1)
584+
check_deleted_object(asic_db, self.ASIC_RIF_TABLE, old_rif[0])
585+
586+
self.rifs.remove(old_rif[0])
572587

573588
def check_vnet_local_routes(self, dvs, name):
574589
asic_db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0)
@@ -800,6 +815,9 @@ def check_vnet_entry(self, dvs, name, peer_list=[]):
800815
self.rifs = get_exist_entries(dvs, self.ASIC_RIF_TABLE)
801816
self.vnet_map.update({name:{}})
802817

818+
def check_default_vnet_entry(self, dvs, name):
819+
return self.check_vnet_entry(dvs, name)
820+
803821
def check_del_vnet_entry(self, dvs, name):
804822
asic_db = swsscommon.DBConnector(swsscommon.ASIC_DB, dvs.redis_sock, 0)
805823

@@ -1284,3 +1302,19 @@ def test_vnet_orch_4(self, dvs, testlog):
12841302

12851303
delete_vnet_entry(dvs, 'Vnet3001')
12861304
vnet_obj.check_del_vnet_entry(dvs, 'Vnet3001')
1305+
1306+
'''
1307+
Test 5 - Default VNet test
1308+
'''
1309+
def test_vnet_orch_5(self, dvs, testlog):
1310+
vnet_obj = self.get_vnet_obj()
1311+
1312+
tunnel_name = 'tunnel_5'
1313+
1314+
vnet_obj.fetch_exist_entries(dvs)
1315+
1316+
create_vxlan_tunnel(dvs, tunnel_name, '8.8.8.8')
1317+
create_vnet_entry(dvs, 'Vnet_5', tunnel_name, '4789', "", 'default')
1318+
1319+
vnet_obj.check_default_vnet_entry(dvs, 'Vnet_5')
1320+
vnet_obj.check_vxlan_tunnel_entry(dvs, tunnel_name, 'Vnet_5', '4789')

0 commit comments

Comments
 (0)