@@ -58,6 +58,7 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
58
58
59
59
const int GROUP_START_ID = 0x80000000 ;
60
60
const int VCARD_START_ID = 55 ;
61
+ const int PDISK_START_ID = 42 ;
61
62
const int DEFAULT_GROUP_GENERATION = 3 ;
62
63
63
64
const TPathId SUBDOMAIN_KEY = {7000000000 , 1 };
@@ -181,7 +182,8 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
181
182
}
182
183
183
184
void AddVSlotsToSysViewResponse (NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr* ev, size_t groupCount,
184
- const TVDisks& vslots, ui32 groupStartId = GROUP_START_ID) {
185
+ const TVDisks& vslots, ui32 groupStartId = GROUP_START_ID,
186
+ bool withPdisk = false ) {
185
187
auto & record = (*ev)->Get ()->Record ;
186
188
auto entrySample = record.entries (0 );
187
189
record.clear_entries ();
@@ -190,10 +192,14 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
190
192
const auto *descriptor = NKikimrBlobStorage::EVDiskStatus_descriptor ();
191
193
for (size_t i = 0 ; i < groupCount; ++i) {
192
194
auto vslotId = VCARD_START_ID;
195
+ auto pdiskId = PDISK_START_ID;
193
196
for (const auto & vslot : vslots) {
194
197
auto * entry = record.add_entries ();
195
198
entry->CopyFrom (entrySample);
196
199
entry->mutable_key ()->set_vslotid (vslotId);
200
+ if (withPdisk) {
201
+ entry->mutable_key ()->set_pdiskid (pdiskId);
202
+ }
197
203
entry->mutable_info ()->set_groupid (groupId);
198
204
entry->mutable_info ()->set_failrealm (vslotId);
199
205
if (vslot.Status ) {
@@ -202,6 +208,7 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
202
208
entry->mutable_info ()->set_groupgeneration (vslot.Generation );
203
209
entry->mutable_info ()->set_vdisk (vslotId);
204
210
++vslotId;
211
+ ++pdiskId;
205
212
}
206
213
++groupId;
207
214
}
@@ -215,6 +222,22 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
215
222
entry->mutable_info ()->set_name (STORAGE_POOL_NAME);
216
223
}
217
224
225
+ void AddPDisksToSysViewResponse (NSysView::TEvSysView::TEvGetPDisksResponse::TPtr* ev, size_t count, double occupancy) {
226
+ auto & record = (*ev)->Get ()->Record ;
227
+ auto entrySample = record.entries (0 );
228
+ record.clear_entries ();
229
+ auto pdiskId = PDISK_START_ID;
230
+ const size_t totalSize = 3'200'000'000'000ull ;
231
+ for (size_t i = 0 ; i < count; ++i) {
232
+ auto * entry = record.add_entries ();
233
+ entry->CopyFrom (entrySample);
234
+ entry->mutable_key ()->set_pdiskid (pdiskId);
235
+ entry->mutable_info ()->set_totalsize (totalSize);
236
+ entry->mutable_info ()->set_availablesize ((1 - occupancy) * totalSize);
237
+ ++pdiskId;
238
+ }
239
+ }
240
+
218
241
void AddGroupVSlotInControllerConfigResponseWithStaticGroup (TEvBlobStorage::TEvControllerConfigResponse::TPtr* ev,
219
242
const NKikimrBlobStorage::TGroupStatus::E groupStatus, const TVDisks& vslots)
220
243
{
@@ -415,7 +438,7 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
415
438
CheckHcResult (result, groupNumber, vdiscPerGroupNumber, isMergeRecords);
416
439
}
417
440
418
- Ydb::Monitoring::SelfCheckResult RequestHcWithVdisks (const NKikimrBlobStorage::TGroupStatus::E groupStatus, const TVDisks& vdisks, bool forStaticGroup = false ) {
441
+ Ydb::Monitoring::SelfCheckResult RequestHcWithVdisks (const NKikimrBlobStorage::TGroupStatus::E groupStatus, const TVDisks& vdisks, bool forStaticGroup = false , double occupancy = 0 ) {
419
442
TPortManager tp;
420
443
ui16 port = tp.GetPort (2134 );
421
444
ui16 grpcPort = tp.GetPort (2135 );
@@ -451,12 +474,17 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
451
474
case NSysView::TEvSysView::EvGetVSlotsResponse: {
452
475
auto * x = reinterpret_cast <NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr*>(&ev);
453
476
if (forStaticGroup) {
454
- AddVSlotsToSysViewResponse (x, 1 , vdisks, 0 );
477
+ AddVSlotsToSysViewResponse (x, 1 , vdisks, 0 , true );
455
478
} else {
456
- AddVSlotsToSysViewResponse (x, 1 , vdisks);
479
+ AddVSlotsToSysViewResponse (x, 1 , vdisks, GROUP_START_ID, true );
457
480
}
458
481
break ;
459
482
}
483
+ case NSysView::TEvSysView::EvGetPDisksResponse: {
484
+ auto * x = reinterpret_cast <NSysView::TEvSysView::TEvGetPDisksResponse::TPtr*>(&ev);
485
+ AddPDisksToSysViewResponse (x, vdisks.size (), occupancy);
486
+ break ;
487
+ }
460
488
case NSysView::TEvSysView::EvGetGroupsResponse: {
461
489
auto * x = reinterpret_cast <NSysView::TEvSysView::TEvGetGroupsResponse::TPtr*>(&ev);
462
490
AddGroupsToSysViewResponse (x);
@@ -669,6 +697,19 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
669
697
UNIT_ASSERT_VALUES_EQUAL (result.self_check_result (), Ydb::Monitoring::SelfCheck::GOOD);
670
698
}
671
699
700
+ Y_UNIT_TEST (YellowGroupIssueOnYellowSpace) {
701
+ auto result = RequestHcWithVdisks (NKikimrBlobStorage::TGroupStatus::PARTIAL, TVDisks{3 , NKikimrBlobStorage::READY}, false , 0.9 );
702
+ Cerr << result.ShortDebugString () << Endl;
703
+ CheckHcResultHasIssuesWithStatus (result, " STORAGE_GROUP" , Ydb::Monitoring::StatusFlag::YELLOW, 1 );
704
+ CheckHcResultHasIssuesWithStatus (result, " STORAGE_GROUP" , Ydb::Monitoring::StatusFlag::RED, 0 );
705
+ }
706
+
707
+ Y_UNIT_TEST (RedGroupIssueOnRedSpace) {
708
+ auto result = RequestHcWithVdisks (NKikimrBlobStorage::TGroupStatus::PARTIAL, TVDisks{3 , NKikimrBlobStorage::READY}, false , 0.95 );
709
+ Cerr << result.ShortDebugString () << Endl;
710
+ CheckHcResultHasIssuesWithStatus (result, " STORAGE_GROUP" , Ydb::Monitoring::StatusFlag::RED, 1 );
711
+ }
712
+
672
713
/* HC currently infers group status on its own, so it's never unknown
673
714
Y_UNIT_TEST(RedGroupIssueWhenUnknownGroupStatus) {
674
715
auto result = RequestHcWithVdisks(NKikimrBlobStorage::TGroupStatus::UNKNOWN, {});
0 commit comments