Skip to content

Commit 043271f

Browse files
authored
Implement redis_bulk_object_create_next_hop_group_members (sonic-net#237)
* Implement redis_bulk_create_* Signed-off-by: Qi Luo <[email protected]> * Add test case for bulk nhgm create Signed-off-by: Qi Luo <[email protected]>
1 parent 888e69c commit 043271f

File tree

5 files changed

+159
-5
lines changed

5 files changed

+159
-5
lines changed

lib/inc/sai_redis.h

+9
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,15 @@ sai_status_t redis_generic_create_route_entry(
140140
_In_ uint32_t attr_count,
141141
_In_ const sai_attribute_t *attr_list);
142142

143+
sai_status_t redis_bulk_generic_create(
144+
_In_ sai_object_type_t object_type,
145+
_In_ uint32_t object_count,
146+
_Out_ sai_object_id_t *object_id, /* array */
147+
_In_ sai_object_id_t switch_id,
148+
_In_ const uint32_t *attr_count, /* array */
149+
_In_ const sai_attribute_t *const *attr_list, /* array */
150+
_Inout_ sai_status_t *object_statuses) /* array */;
151+
143152
sai_status_t internal_redis_bulk_generic_create(
144153
_In_ sai_object_type_t object_type,
145154
_In_ const std::vector<std::string> &serialized_object_ids,

lib/inc/sairedis.h

+15
Original file line numberDiff line numberDiff line change
@@ -217,4 +217,19 @@ sai_status_t sai_bulk_get_route_entry_attribute(
217217
_In_ sai_bulk_op_type_t type,
218218
_Out_ sai_status_t *object_statuses);
219219

220+
sai_status_t redis_bulk_object_create_next_hop_group_members(
221+
_In_ sai_object_id_t switch_id,
222+
_In_ uint32_t object_count,
223+
_In_ const uint32_t *attr_count,
224+
_In_ const sai_attribute_t *const *attrs,
225+
_In_ sai_bulk_op_type_t type,
226+
_Out_ sai_object_id_t *object_id,
227+
_Out_ sai_status_t *object_statuses);
228+
229+
sai_status_t redis_bulk_object_remove_next_hop_group_members(
230+
_In_ uint32_t object_count,
231+
_In_ const sai_object_id_t *object_id,
232+
_In_ sai_bulk_op_type_t type,
233+
_Out_ sai_status_t *object_statuses);
234+
220235
#endif // __SAIREDIS__

lib/src/sai_redis_generic_create.cpp

+37
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,43 @@ sai_status_t redis_generic_create(
268268
attr_list);
269269
}
270270

271+
sai_status_t redis_bulk_generic_create(
272+
_In_ sai_object_type_t object_type,
273+
_In_ uint32_t object_count,
274+
_Out_ sai_object_id_t *object_id, /* array */
275+
_In_ sai_object_id_t switch_id,
276+
_In_ const uint32_t *attr_count, /* array */
277+
_In_ const sai_attribute_t *const *attr_list, /* array */
278+
_Inout_ sai_status_t *object_statuses) /* array */
279+
{
280+
SWSS_LOG_ENTER();
281+
282+
std::vector<std::string> serialized_object_ids;
283+
284+
// on create vid is put in db by syncd
285+
for (uint32_t idx = 0; idx < object_count; idx++)
286+
{
287+
object_id[idx] = redis_create_virtual_object_id(object_type, switch_id);
288+
if (object_id[idx] == SAI_NULL_OBJECT_ID)
289+
{
290+
SWSS_LOG_ERROR("failed to create %s, with switch id: %s",
291+
sai_serialize_object_type(object_type).c_str(),
292+
sai_serialize_object_id(switch_id).c_str());
293+
294+
return SAI_STATUS_INSUFFICIENT_RESOURCES;
295+
}
296+
std::string str_object_id = sai_serialize_object_id(object_id[idx]);
297+
serialized_object_ids.push_back(str_object_id);
298+
}
299+
300+
return internal_redis_bulk_generic_create(
301+
object_type,
302+
serialized_object_ids,
303+
attr_count,
304+
attr_list,
305+
object_statuses);
306+
}
307+
271308
sai_status_t internal_redis_bulk_generic_create(
272309
_In_ sai_object_type_t object_type,
273310
_In_ const std::vector<std::string> &serialized_object_ids,

lib/src/sai_redis_nexthopgroup.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ sai_status_t redis_bulk_object_create_next_hop_group_members(
44
_In_ sai_object_id_t switch_id,
55
_In_ uint32_t object_count,
66
_In_ const uint32_t *attr_count,
7-
_In_ const sai_attribute_t **attrs,
7+
_In_ const sai_attribute_t *const *attrs,
88
_In_ sai_bulk_op_type_t type,
99
_Out_ sai_object_id_t *object_id,
1010
_Out_ sai_status_t *object_statuses)
@@ -13,7 +13,8 @@ sai_status_t redis_bulk_object_create_next_hop_group_members(
1313

1414
SWSS_LOG_ENTER();
1515

16-
return SAI_STATUS_NOT_IMPLEMENTED;
16+
return redis_bulk_generic_create(SAI_OBJECT_TYPE_NEXT_HOP_GROUP_MEMBER, object_count, object_id
17+
, switch_id, attr_count, attrs, object_statuses);
1718
}
1819

1920
sai_status_t redis_bulk_object_remove_next_hop_group_members(
@@ -37,6 +38,7 @@ const sai_next_hop_group_api_t redis_next_hop_group_api = {
3738
REDIS_GENERIC_QUAD_API(next_hop_group)
3839
REDIS_GENERIC_QUAD_API(next_hop_group_member)
3940

40-
redis_bulk_object_create_next_hop_group_members,
41+
// TODO: upstream signiture fix to SAI repo
42+
(sai_bulk_object_create_fn)redis_bulk_object_create_next_hop_group_members,
4143
redis_bulk_object_remove_next_hop_group_members,
4244
};

lib/src/tests.cpp

+93-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ extern "C" {
66

77
#include "swss/logger.h"
88
#include "sairedis.h"
9+
#include "sai_redis.h"
910
#include "meta/saiserialize.h"
1011

1112
#include <map>
@@ -99,13 +100,97 @@ sai_object_id_t create_dummy_object_id(
99100
return (((sai_object_id_t)objecttype) << 48) | ++index;
100101
}
101102

103+
void test_bulk_next_hop_group_member_create()
104+
{
105+
SWSS_LOG_ENTER();
106+
107+
swss::Logger::getInstance().setMinPrio(swss::Logger::SWSS_NOTICE);
108+
109+
meta_init_db();
110+
redis_clear_switch_ids();
111+
112+
swss::Logger::getInstance().setMinPrio(swss::Logger::SWSS_DEBUG);
113+
114+
sai_status_t status;
115+
116+
sai_next_hop_group_api_t *sai_next_hop_group_api = NULL;
117+
sai_switch_api_t *sai_switch_api = NULL;
118+
119+
sai_api_query(SAI_API_NEXT_HOP_GROUP, (void**)&sai_next_hop_group_api);
120+
sai_api_query(SAI_API_SWITCH, (void**)&sai_switch_api);
121+
122+
uint32_t count = 3;
123+
124+
std::vector<sai_route_entry_t> routes;
125+
std::vector<sai_attribute_t> attrs;
126+
127+
sai_attribute_t swattr;
128+
129+
swattr.id = SAI_SWITCH_ATTR_INIT_SWITCH;
130+
swattr.value.booldata = true;
131+
132+
sai_object_id_t switch_id;
133+
status = sai_switch_api->create_switch(&switch_id, 1, &swattr);
134+
135+
ASSERT_SUCCESS("Failed to create switch");
136+
137+
std::vector<std::vector<sai_attribute_t>> nhgm_attrs;
138+
std::vector<sai_attribute_t *> nhgm_attrs_array;
139+
std::vector<uint32_t> nhgm_attrs_count;
140+
141+
// next hop group
142+
sai_object_id_t hopgroup = create_dummy_object_id(SAI_OBJECT_TYPE_NEXT_HOP_GROUP);
143+
object_reference_insert(hopgroup);
144+
sai_object_meta_key_t meta_key_hopgruop = { .objecttype = SAI_OBJECT_TYPE_NEXT_HOP_GROUP, .objectkey = { .key = { .object_id = hopgroup } } };
145+
std::string hopgroup_key = sai_serialize_object_meta_key(meta_key_hopgruop);
146+
ObjectAttrHash[hopgroup_key] = { };
147+
148+
for (uint32_t i = 0; i < count; ++i)
149+
{
150+
// next hop
151+
sai_object_id_t hop = create_dummy_object_id(SAI_OBJECT_TYPE_NEXT_HOP);
152+
object_reference_insert(hop);
153+
sai_object_meta_key_t meta_key_hop = { .objecttype = SAI_OBJECT_TYPE_NEXT_HOP, .objectkey = { .key = { .object_id = hop } } };
154+
std::string hop_key = sai_serialize_object_meta_key(meta_key_hop);
155+
ObjectAttrHash[hop_key] = { };
156+
157+
std::vector<sai_attribute_t> list(2);
158+
sai_attribute_t &attr1 = list[0];
159+
sai_attribute_t &attr2 = list[1];
160+
161+
attr1.id = SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_GROUP_ID;
162+
attr1.value.oid = hopgroup;
163+
attr2.id = SAI_NEXT_HOP_GROUP_MEMBER_ATTR_NEXT_HOP_ID;
164+
attr2.value.oid = hop;
165+
nhgm_attrs.push_back(list);
166+
nhgm_attrs_count.push_back(2);
167+
}
168+
169+
for (size_t j = 0; j < nhgm_attrs.size(); j++)
170+
{
171+
nhgm_attrs_array.push_back(nhgm_attrs[j].data());
172+
}
173+
174+
std::vector<sai_status_t> statuses(count);
175+
std::vector<sai_object_id_t> object_id(count);
176+
redis_bulk_object_create_next_hop_group_members(switch_id, count, nhgm_attrs_count.data(), nhgm_attrs_array.data()
177+
, SAI_BULK_OP_TYPE_INGORE_ERROR, object_id.data(), statuses.data());
178+
ASSERT_SUCCESS("Failed to create nhgm");
179+
for (size_t j = 0; j < statuses.size(); j++)
180+
{
181+
status = statuses[j];
182+
ASSERT_SUCCESS("Failed to create nhgm # %zu", j);
183+
}
184+
}
185+
102186
void test_bulk_route_set()
103187
{
104188
SWSS_LOG_ENTER();
105189

106190
swss::Logger::getInstance().setMinPrio(swss::Logger::SWSS_NOTICE);
107191

108192
meta_init_db();
193+
redis_clear_switch_ids();
109194

110195
swss::Logger::getInstance().setMinPrio(swss::Logger::SWSS_DEBUG);
111196

@@ -130,7 +215,6 @@ void test_bulk_route_set()
130215
swattr.value.booldata = true;
131216

132217
sai_object_id_t switch_id;
133-
134218
status = sai_switch_api->create_switch(&switch_id, 1, &swattr);
135219

136220
ASSERT_SUCCESS("Failed to create switch");
@@ -183,9 +267,14 @@ void test_bulk_route_set()
183267
}
184268

185269
std::vector<sai_status_t> statuses(count);
186-
sai_bulk_create_route_entry(count, routes.data(), route_attrs_count.data(), route_attrs_array.data()
270+
status = sai_bulk_create_route_entry(count, routes.data(), route_attrs_count.data(), route_attrs_array.data()
187271
, SAI_BULK_OP_TYPE_INGORE_ERROR, statuses.data());
188272
ASSERT_SUCCESS("Failed to create route");
273+
for (size_t j = 0; j < statuses.size(); j++)
274+
{
275+
status = statuses[j];
276+
ASSERT_SUCCESS("Failed to create route # %zu", j);
277+
}
189278

190279
for (uint32_t i = index; i < index + count; ++i)
191280
{
@@ -242,6 +331,8 @@ int main()
242331

243332
test_enable_recording();
244333

334+
test_bulk_next_hop_group_member_create();
335+
245336
test_bulk_route_set();
246337

247338
sai_api_uninitialize();

0 commit comments

Comments
 (0)