@@ -163,12 +163,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
163163 }
164164
165165 void AddVSlotsToSysViewResponse (NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr* ev, size_t groupCount,
166- const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses) {
166+ const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses, ui32 groupStartId = GROUP_START_ID ) {
167167 auto & record = (*ev)->Get ()->Record ;
168168 auto entrySample = record.entries (0 );
169169 record.clear_entries ();
170170
171- auto groupId = GROUP_START_ID ;
171+ auto groupId = groupStartId ;
172172 const auto *descriptor = NKikimrBlobStorage::EVDiskStatus_descriptor ();
173173 for (size_t i = 0 ; i < groupCount; ++i) {
174174 auto vslotId = VCARD_START_ID;
@@ -252,13 +252,13 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
252252 sPool ->set_name (STORAGE_POOL_NAME);
253253 };
254254
255- void AddVSlotInVDiskStateResponse (TEvWhiteboard::TEvVDiskStateResponse::TPtr* ev, int groupCount, int vslotCount) {
255+ void AddVSlotInVDiskStateResponse (TEvWhiteboard::TEvVDiskStateResponse::TPtr* ev, int groupCount, int vslotCount, ui32 groupStartId = GROUP_START_ID ) {
256256 auto & pbRecord = (*ev)->Get ()->Record ;
257257
258258 auto sample = pbRecord.vdiskstateinfo (0 );
259259 pbRecord.clear_vdiskstateinfo ();
260260
261- auto groupId = GROUP_START_ID ;
261+ auto groupId = groupStartId ;
262262 for (int i = 0 ; i < groupCount; i++) {
263263 auto slotId = VCARD_START_ID;
264264 for (int j = 0 ; j < vslotCount; j++) {
@@ -273,6 +273,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
273273 }
274274 }
275275
276+ void ChangeGroupStateResponse (NNodeWhiteboard::TEvWhiteboard::TEvBSGroupStateResponse::TPtr* ev) {
277+ for (auto & groupInfo : *(*ev)->Get ()->Record .mutable_bsgroupstateinfo ()) {
278+ groupInfo.set_erasurespecies (NHealthCheck::TSelfCheckRequest::BLOCK_4_2);
279+ }
280+ }
281+
276282 void SetLongHostValue (TEvInterconnect::TEvNodesInfo::TPtr* ev) {
277283 TString host (1000000 , ' a' );
278284 auto & pbRecord = (*ev)->Get ()->Nodes ;
@@ -383,7 +389,7 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
383389 CheckHcResult (result, groupNumber, vdiscPerGroupNumber, isMergeRecords);
384390 }
385391
386- Ydb::Monitoring::SelfCheckResult RequestHcWithVdisks (const NKikimrBlobStorage::TGroupStatus::E groupStatus, const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses) {
392+ Ydb::Monitoring::SelfCheckResult RequestHcWithVdisks (const NKikimrBlobStorage::TGroupStatus::E groupStatus, const TVector<NKikimrBlobStorage::EVDiskStatus>& vdiskStatuses, bool forStaticGroup = false ) {
387393 TPortManager tp;
388394 ui16 port = tp.GetPort (2134 );
389395 ui16 grpcPort = tp.GetPort (2135 );
@@ -418,7 +424,11 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
418424 }
419425 case NSysView::TEvSysView::EvGetVSlotsResponse: {
420426 auto * x = reinterpret_cast <NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr*>(&ev);
421- AddVSlotsToSysViewResponse (x, 1 , vdiskStatuses);
427+ if (forStaticGroup) {
428+ AddVSlotsToSysViewResponse (x, 1 , vdiskStatuses, 0 );
429+ } else {
430+ AddVSlotsToSysViewResponse (x, 1 , vdiskStatuses);
431+ }
422432 break ;
423433 }
424434 case NSysView::TEvSysView::EvGetGroupsResponse: {
@@ -431,6 +441,19 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
431441 AddStoragePoolsToSysViewResponse (x);
432442 break ;
433443 }
444+ case NNodeWhiteboard::TEvWhiteboard::EvVDiskStateResponse: {
445+ auto *x = reinterpret_cast <NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse::TPtr*>(&ev);
446+ if (forStaticGroup) {
447+ AddVSlotInVDiskStateResponse (x, 1 , vdiskStatuses.size (), 0 );
448+ } else {
449+ AddVSlotInVDiskStateResponse (x, 1 , vdiskStatuses.size ());
450+ }
451+ break ;
452+ }
453+ case NNodeWhiteboard::TEvWhiteboard::EvBSGroupStateResponse: {
454+ auto * x = reinterpret_cast <NNodeWhiteboard::TEvWhiteboard::TEvBSGroupStateResponse::TPtr*>(&ev);
455+ ChangeGroupStateResponse (x);
456+ }
434457 }
435458
436459 return TTestActorRuntime::EEventAction::PROCESS;
@@ -444,10 +467,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
444467 return runtime.GrabEdgeEvent <NHealthCheck::TEvSelfCheckResult>(handle)->Result ;
445468 }
446469
447- void CheckHcResultHasIssuesWithStatus (Ydb::Monitoring::SelfCheckResult& result, const TString& type, const Ydb::Monitoring::StatusFlag::Status expectingStatus, ui32 total) {
470+ void CheckHcResultHasIssuesWithStatus (Ydb::Monitoring::SelfCheckResult& result, const TString& type,
471+ const Ydb::Monitoring::StatusFlag::Status expectingStatus, ui32 total,
472+ std::string_view pool = " /Root:test" ) {
448473 int issuesCount = 0 ;
449474 for (const auto & issue_log : result.Getissue_log ()) {
450- if (issue_log.type () == type && issue_log.location ().storage ().pool ().name () == " /Root:test " && issue_log.status () == expectingStatus) {
475+ if (issue_log.type () == type && issue_log.location ().storage ().pool ().name () == pool && issue_log.status () == expectingStatus) {
451476 issuesCount++;
452477 }
453478 }
@@ -589,6 +614,12 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) {
589614 CheckHcResultHasIssuesWithStatus (result, " STORAGE_GROUP" , Ydb::Monitoring::StatusFlag::RED, 1 );
590615 }
591616
617+ Y_UNIT_TEST (StaticGroupIssue) {
618+ auto result = RequestHcWithVdisks (NKikimrBlobStorage::TGroupStatus::PARTIAL, {NKikimrBlobStorage::ERROR}, /* forStatic*/ true );
619+ Cerr << result.ShortDebugString () << Endl;
620+ CheckHcResultHasIssuesWithStatus (result, " STORAGE_GROUP" , Ydb::Monitoring::StatusFlag::YELLOW, 1 , " static" );
621+ }
622+
592623 /* HC currently infers group status on its own, so it's never unknown
593624 Y_UNIT_TEST(RedGroupIssueWhenUnknownGroupStatus) {
594625 auto result = RequestHcWithVdisks(NKikimrBlobStorage::TGroupStatus::UNKNOWN, {});
0 commit comments