@@ -70,9 +70,80 @@ class SecGrpStatsManagerFixture : public PolicyStatsManagerFixture {
70
70
virtual ~SecGrpStatsManagerFixture () {
71
71
stop ();
72
72
}
73
+ #ifdef HAVE_PROMETHEUS_SUPPORT
74
+ virtual void verifyPromMetrics (shared_ptr<L24Classifier> classifier,
75
+ uint32_t pkts,
76
+ uint32_t bytes,
77
+ bool isTx=false ) override ;
78
+ #endif
73
79
SecGrpStatsManager secGrpStatsManager;
74
80
};
75
81
82
+ #ifdef HAVE_PROMETHEUS_SUPPORT
83
+ void SecGrpStatsManagerFixture::
84
+ verifyPromMetrics (shared_ptr<L24Classifier> classifier,
85
+ uint32_t pkts,
86
+ uint32_t bytes,
87
+ bool isTx)
88
+ {
89
+ std::string s_rx_bytes, s_rx_pkts, s_tx_bytes, s_tx_pkts;
90
+ if (classifier == classifier1) {
91
+ s_tx_bytes = " opflex_sg_tx_bytes{classifier=\" tenant:tenant0,policy:" \
92
+ " classifier1,[etype:2048,proto:6,dport:80]\" } " \
93
+ + boost::lexical_cast<std::string>(bytes) + " .000000" ;
94
+ s_rx_bytes = " opflex_sg_rx_bytes{classifier=\" tenant:tenant0,policy:" \
95
+ " classifier1,[etype:2048,proto:6,dport:80]\" } " \
96
+ + boost::lexical_cast<std::string>(bytes) + " .000000" ;
97
+ s_tx_pkts = " opflex_sg_tx_packets{classifier=\" tenant:tenant0,policy:" \
98
+ " classifier1,[etype:2048,proto:6,dport:80]\" } " \
99
+ + boost::lexical_cast<std::string>(pkts) + " .000000" ;
100
+ s_rx_pkts = " opflex_sg_rx_packets{classifier=\" tenant:tenant0,policy:" \
101
+ " classifier1,[etype:2048,proto:6,dport:80]\" } " \
102
+ + boost::lexical_cast<std::string>(pkts) + " .000000" ;
103
+ } else if (classifier == classifier2) {
104
+ s_tx_bytes = " opflex_sg_tx_bytes{classifier=\" tenant:tenant0,policy:" \
105
+ " classifier2,[etype:2054,]\" } " \
106
+ + boost::lexical_cast<std::string>(bytes) + " .000000" ;
107
+ s_rx_bytes = " opflex_sg_rx_bytes{classifier=\" tenant:tenant0,policy:" \
108
+ " classifier2,[etype:2054,]\" } " \
109
+ + boost::lexical_cast<std::string>(bytes) + " .000000" ;
110
+ s_tx_pkts = " opflex_sg_tx_packets{classifier=\" tenant:tenant0,policy:" \
111
+ " classifier2,[etype:2054,]\" } " \
112
+ + boost::lexical_cast<std::string>(pkts) + " .000000" ;
113
+ s_rx_pkts = " opflex_sg_rx_packets{classifier=\" tenant:tenant0,policy:" \
114
+ " classifier2,[etype:2054,]\" } " \
115
+ + boost::lexical_cast<std::string>(pkts) + " .000000" ;
116
+ } else {
117
+ s_tx_bytes = " opflex_sg_tx_bytes{classifier=\" tenant:tenant0,policy:" \
118
+ " classifier3,[etype:2048,proto:6,dport:80-85,]\" } " \
119
+ + boost::lexical_cast<std::string>(bytes) + " .000000" ;
120
+ s_rx_bytes = " opflex_sg_rx_bytes{classifier=\" tenant:tenant0,policy:" \
121
+ " classifier3,[etype:2048,proto:6,dport:80-85,]\" } " \
122
+ + boost::lexical_cast<std::string>(bytes) + " .000000" ;
123
+ s_tx_pkts = " opflex_sg_tx_packets{classifier=\" tenant:tenant0,policy:" \
124
+ " classifier3,[etype:2048,proto:6,dport:80-85,]\" } " \
125
+ + boost::lexical_cast<std::string>(pkts) + " .000000" ;
126
+ s_rx_pkts = " opflex_sg_rx_packets{classifier=\" tenant:tenant0,policy:" \
127
+ " classifier3,[etype:2048,proto:6,dport:80-85,]\" } " \
128
+ + boost::lexical_cast<std::string>(pkts) + " .000000" ;
129
+ }
130
+
131
+ const std::string& output = BaseFixture::getOutputFromCommand (cmd);
132
+ size_t pos = std::string::npos;
133
+ if (isTx) {
134
+ pos = output.find (s_tx_pkts);
135
+ BOOST_CHECK_NE (pos, std::string::npos);
136
+ pos = output.find (s_tx_bytes);
137
+ BOOST_CHECK_NE (pos, std::string::npos);
138
+ } else {
139
+ pos = output.find (s_rx_pkts);
140
+ BOOST_CHECK_NE (pos, std::string::npos);
141
+ pos = output.find (s_rx_bytes);
142
+ BOOST_CHECK_NE (pos, std::string::npos);
143
+ }
144
+ }
145
+ #endif
146
+
76
147
BOOST_AUTO_TEST_SUITE (SecGrpStatsManager_test)
77
148
78
149
BOOST_FIXTURE_TEST_CASE (testFlowMatchStats, SecGrpStatsManagerFixture) {
@@ -86,33 +157,34 @@ BOOST_FIXTURE_TEST_CASE(testFlowMatchStats, SecGrpStatsManagerFixture) {
86
157
LOG (DEBUG) << " ### SecGrpClassifierCounter flow stats in start" ;
87
158
// testing one flow only
88
159
testOneFlow (accPortConn,classifier1,
89
- AccessFlowManager::SEC_GROUP_IN_TABLE_ID,1 ,&secGrpStatsManager);
160
+ AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
161
+ 1 , false , &secGrpStatsManager);
90
162
// 2 entries in flow table now - testing second flow
91
163
testOneFlow (accPortConn,classifier2,
92
164
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
93
- 2 ,
165
+ 2 , false ,
94
166
&secGrpStatsManager);
95
167
// changing flow table entry
96
168
// Note: If the portNum is set as 2, then it clashes with classifier2
97
169
// entry. So first classifier1 entry will get deleted. No new counter
98
170
// objeects will get generated and verifyflowstats will fail.
99
171
testOneFlow (accPortConn,classifier1,
100
172
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
101
- 3 ,
173
+ 3 , true ,
102
174
&secGrpStatsManager);
103
175
LOG (DEBUG) << " ### SecGrpClassifierCounter flow stats out start" ;
104
176
// same 3 steps above for OUT table
105
177
testOneFlow (accPortConn,classifier1,
106
178
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
107
- 1 ,
179
+ 1 , false ,
108
180
&secGrpStatsManager);
109
181
testOneFlow (accPortConn,classifier2,
110
182
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
111
- 2 ,
183
+ 2 , false ,
112
184
&secGrpStatsManager);
113
185
testOneFlow (accPortConn,classifier1,
114
186
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
115
- 3 ,
187
+ 3 , true ,
116
188
&secGrpStatsManager);
117
189
LOG (DEBUG) << " ### SecGrpClassifierCounter flow stats stop" ;
118
190
secGrpStatsManager.stop ();
@@ -156,9 +228,15 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
156
228
157
229
secGrpStatsManager.Handle (&accPortConn,
158
230
OFPTYPE_FLOW_REMOVED, res_msg, &fentry);
231
+ ofpbuf_delete (res_msg);
232
+
233
+ // Collect counts related to Rx
159
234
secGrpStatsManager.on_timer (ec);
160
235
161
- ofpbuf_delete (res_msg);
236
+ // 2nd delete received from ovs for same flow, ideally this is a no-op.
237
+ // But since on-timer is called table state's flow would have created
238
+ // an entry in newCounterMap. So the flow removed message will lead
239
+ // to accumulation of stats to prom metric.
162
240
res_msg = makeFlowRemovedMessage_2 (&accPortConn,
163
241
LAST_PACKET_COUNT,
164
242
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
@@ -168,6 +246,7 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
168
246
secGrpStatsManager.Handle (&accPortConn,
169
247
OFPTYPE_FLOW_REMOVED, res_msg, &fentry);
170
248
ofpbuf_delete (res_msg);
249
+
171
250
res_msg =
172
251
makeFlowRemovedMessage_2 (&accPortConn,
173
252
LAST_PACKET_COUNT,
@@ -193,6 +272,7 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
193
272
// Call on_timer function to process the stats collected
194
273
// and generate Genie objects for stats
195
274
275
+ // Collect counts relateed to Tx
196
276
secGrpStatsManager.on_timer (ec);
197
277
198
278
// calculate expected packet count and byte count
@@ -201,11 +281,13 @@ BOOST_FIXTURE_TEST_CASE(testFlowRemoved, SecGrpStatsManagerFixture) {
201
281
verifyFlowStats (classifier3,
202
282
LAST_PACKET_COUNT,
203
283
LAST_PACKET_COUNT * PACKET_SIZE,
284
+ true ,
204
285
AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
205
286
&secGrpStatsManager);
206
287
verifyFlowStats (classifier3,
207
288
LAST_PACKET_COUNT,
208
289
LAST_PACKET_COUNT * PACKET_SIZE,
290
+ false ,
209
291
AccessFlowManager::SEC_GROUP_OUT_TABLE_ID,
210
292
&secGrpStatsManager);
211
293
LOG (DEBUG) << " ### SecGrpClassifierCounter flow removed stop" ;
@@ -239,7 +321,8 @@ BOOST_FIXTURE_TEST_CASE(testSecGrpDelete, SecGrpStatsManagerFixture) {
239
321
OFPTYPE_FLOW_STATS_REPLY, NULL );
240
322
// testing one flow only
241
323
testOneFlow (accPortConn,classifier1,
242
- AccessFlowManager::SEC_GROUP_IN_TABLE_ID,1 ,&secGrpStatsManager);
324
+ AccessFlowManager::SEC_GROUP_IN_TABLE_ID,
325
+ 1 , false , &secGrpStatsManager);
243
326
Mutator mutator (agent.getFramework (), " policyreg" );
244
327
245
328
// Note: In UTs, deleting the sg doesnt trigger classifier delete
0 commit comments