Skip to content

Commit 6d4a423

Browse files
authored
24-1: backport ydb#2397 add allow/deny lists to configs dispatcher (#2790)
1 parent c1ad21b commit 6d4a423

File tree

6 files changed

+128
-66
lines changed

6 files changed

+128
-66
lines changed

ydb/core/cms/cms_ut_common.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,13 @@ static void SetupServices(TTestActorRuntime &runtime, const TTestEnvOpts &option
486486
NKikimrConfig::TAppConfig appConfig;
487487
appConfig.MutableBootstrapConfig()->CopyFrom(TFakeNodeWhiteboardService::BootstrapConfig);
488488
runtime.AddLocalService(MakeConfigsDispatcherID(runtime.GetNodeId(0)),
489-
TActorSetupCmd(CreateConfigsDispatcher(appConfig, {}), TMailboxType::Simple, 0), 0);
489+
TActorSetupCmd(CreateConfigsDispatcher(
490+
NKikimr::NConsole::TConfigsDispatcherInitInfo {
491+
.InitialConfig = appConfig,
492+
}),
493+
TMailboxType::Simple,
494+
0),
495+
0);
490496

491497
runtime.Initialize(app.Unwrap());
492498
auto dnsConfig = new TDynamicNameserviceConfig();

ydb/core/cms/console/configs_dispatcher.cpp

Lines changed: 75 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,7 @@ class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
133133
return NKikimrServices::TActivity::CONFIGS_DISPATCHER_ACTOR;
134134
}
135135

136-
TConfigsDispatcher(
137-
const NKikimrConfig::TAppConfig &config,
138-
const TMap<TString, TString> &labels,
139-
const NKikimrConfig::TAppConfig &initialCmsConfig,
140-
const NKikimrConfig::TAppConfig &initialCmsYamlConfig,
141-
const THashMap<ui32, TConfigItemInfo> &configInitInfo);
136+
TConfigsDispatcher(const TConfigsDispatcherInitInfo& initInfo);
142137

143138
void Bootstrap();
144139

@@ -163,6 +158,8 @@ class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
163158

164159
NKikimrConfig::TAppConfig ParseYamlProtoConfig();
165160

161+
TDynBitMap FilterKinds(const TDynBitMap& in);
162+
166163
void Handle(NMon::TEvHttpInfo::TPtr &ev);
167164
void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev);
168165
void Handle(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev);
@@ -230,12 +227,11 @@ class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
230227

231228

232229
private:
233-
TMap<TString, TString> Labels;
234-
const NKikimrConfig::TAppConfig InitialConfig;
230+
const TMap<TString, TString> Labels;
231+
const std::variant<std::monostate, TDenyList, TAllowList> ItemsServeRules;
232+
const NKikimrConfig::TAppConfig BaseConfig;
235233
NKikimrConfig::TAppConfig CurrentConfig;
236-
const NKikimrConfig::TAppConfig InitialCmsConfig;
237-
const NKikimrConfig::TAppConfig InitialCmsYamlConfig;
238-
const THashMap<ui32, TConfigItemInfo> ConfigInitInfo;
234+
const std::optional<TDebugInfo> DebugInfo;
239235
ui64 NextRequestCookie;
240236
TVector<TActorId> HttpRequests;
241237
TActorId CommonSubscriptionClient;
@@ -255,21 +251,14 @@ class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
255251

256252
};
257253

258-
TConfigsDispatcher::TConfigsDispatcher(
259-
const NKikimrConfig::TAppConfig &config,
260-
const TMap<TString, TString> &labels,
261-
const NKikimrConfig::TAppConfig &initialCmsConfig,
262-
const NKikimrConfig::TAppConfig &initialCmsYamlConfig,
263-
const THashMap<ui32, TConfigItemInfo> &configInitInfo)
264-
: Labels(labels)
265-
, InitialConfig(config)
266-
, CurrentConfig(config)
267-
, InitialCmsConfig(initialCmsConfig)
268-
, InitialCmsYamlConfig(initialCmsYamlConfig)
269-
, ConfigInitInfo(configInitInfo)
254+
TConfigsDispatcher::TConfigsDispatcher(const TConfigsDispatcherInitInfo& initInfo)
255+
: Labels(initInfo.Labels)
256+
, ItemsServeRules(initInfo.ItemsServeRules)
257+
, BaseConfig(initInfo.InitialConfig)
258+
, CurrentConfig(initInfo.InitialConfig)
259+
, DebugInfo(initInfo.DebugInfo)
270260
, NextRequestCookie(Now().GetValue())
271-
{
272-
}
261+
{}
273262

274263
void TConfigsDispatcher::Bootstrap()
275264
{
@@ -400,9 +389,12 @@ void TConfigsDispatcher::ReplyMonJson(TActorId mailbox) {
400389
response.InsertValue("yaml_config", YamlConfig);
401390
response.InsertValue("resolved_json_config", NJson::ReadJsonFastTree(ResolvedJsonConfig, true));
402391
response.InsertValue("current_json_config", NJson::ReadJsonFastTree(NProtobufJson::Proto2Json(CurrentConfig, NYamlConfig::GetProto2JsonConfig()), true));
403-
response.InsertValue("initial_json_config", NJson::ReadJsonFastTree(NProtobufJson::Proto2Json(InitialConfig, NYamlConfig::GetProto2JsonConfig()), true));
404-
response.InsertValue("initial_cms_json_config", NJson::ReadJsonFastTree(NProtobufJson::Proto2Json(InitialCmsConfig, NYamlConfig::GetProto2JsonConfig()), true));
405-
response.InsertValue("initial_cms_yaml_json_config", NJson::ReadJsonFastTree(NProtobufJson::Proto2Json(InitialCmsYamlConfig, NYamlConfig::GetProto2JsonConfig()), true));
392+
393+
if (DebugInfo) {
394+
response.InsertValue("initial_json_config", NJson::ReadJsonFastTree(NProtobufJson::Proto2Json(DebugInfo->StaticConfig, NYamlConfig::GetProto2JsonConfig()), true));
395+
response.InsertValue("initial_cms_json_config", NJson::ReadJsonFastTree(NProtobufJson::Proto2Json(DebugInfo->OldDynConfig, NYamlConfig::GetProto2JsonConfig()), true));
396+
response.InsertValue("initial_cms_yaml_json_config", NJson::ReadJsonFastTree(NProtobufJson::Proto2Json(DebugInfo->NewDynConfig, NYamlConfig::GetProto2JsonConfig()), true));
397+
}
406398

407399
NJson::WriteJson(&str, &response, {});
408400

@@ -419,6 +411,29 @@ void TConfigsDispatcher::Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &
419411
Send(ev->Sender, resp.Release(), 0, ev->Cookie);
420412
}
421413

414+
415+
TDynBitMap TConfigsDispatcher::FilterKinds(const TDynBitMap& in) {
416+
TDynBitMap out;
417+
418+
if (const auto* denyList = std::get_if<TDenyList>(&ItemsServeRules)) {
419+
Y_FOR_EACH_BIT(kind, in) {
420+
if (!denyList->Items.contains(kind)) {
421+
out.Set(kind);
422+
}
423+
}
424+
} else if (const auto* allowList = std::get_if<TAllowList>(&ItemsServeRules)) {
425+
Y_FOR_EACH_BIT(kind, in) {
426+
if (allowList->Items.contains(kind)) {
427+
out.Set(kind);
428+
}
429+
}
430+
} else {
431+
out = in;
432+
}
433+
434+
return out;
435+
}
436+
422437
void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev)
423438
{
424439
Y_UNUSED(ev);
@@ -494,14 +509,14 @@ void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev)
494509
str << "Coloring: \"<font color=\"red\">config not set</font>\","
495510
<< " \"<font color=\"green\">config set in dynamic config</font>\", \"<font color=\"#007bff\">config set in static config</font>\"" << Endl;
496511
str << "</div>" << Endl;
497-
NHttp::OutputRichConfigHTML(str, InitialConfig, YamlProtoConfig, CurrentConfig, DYNAMIC_KINDS, NON_YAML_KINDS, YamlConfigEnabled);
512+
NHttp::OutputRichConfigHTML(str, BaseConfig, YamlProtoConfig, CurrentConfig, DYNAMIC_KINDS, NON_YAML_KINDS, YamlConfigEnabled);
498513
}
499514
str << "<br />" << Endl;
500515
COLLAPSED_REF_CONTENT("effective-startup-config", "Effective startup config") {
501516
str << "<div class=\"alert alert-primary tab-left\" role=\"alert\">" << Endl;
502517
str << "Some of these configs may be overwritten by dynamic ones." << Endl;
503518
str << "</div>" << Endl;
504-
NHttp::OutputConfigHTML(str, InitialConfig);
519+
NHttp::OutputConfigHTML(str, BaseConfig);
505520
}
506521
str << "<br />" << Endl;
507522
COLLAPSED_REF_CONTENT("effective-dynamic-config", "Effective dynamic config") {
@@ -510,18 +525,26 @@ void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev)
510525
str << "</div>" << Endl;
511526
NKikimrConfig::TAppConfig trunc;
512527
if (YamlConfigEnabled) {
513-
ReplaceConfigItems(YamlProtoConfig, trunc, KindsToBitMap(DYNAMIC_KINDS), InitialConfig);
514-
ReplaceConfigItems(CurrentConfig, trunc, KindsToBitMap(NON_YAML_KINDS), trunc, false);
528+
ReplaceConfigItems(YamlProtoConfig, trunc, FilterKinds(KindsToBitMap(DYNAMIC_KINDS)), BaseConfig);
529+
ReplaceConfigItems(CurrentConfig, trunc, FilterKinds(KindsToBitMap(NON_YAML_KINDS)), trunc, false);
515530
} else {
516-
ReplaceConfigItems(CurrentConfig, trunc, KindsToBitMap(DYNAMIC_KINDS), InitialConfig);
531+
ReplaceConfigItems(CurrentConfig, trunc, FilterKinds(KindsToBitMap(DYNAMIC_KINDS)), BaseConfig);
517532
}
518533
NHttp::OutputConfigHTML(str, trunc);
519534
}
520535
str << "<br />" << Endl;
521536
COLLAPSED_REF_CONTENT("debug-info", "Debug info") {
522537
DIV_CLASS("tab-left") {
523538
COLLAPSED_REF_CONTENT("effective-config-debug-info", "Effective config debug info") {
524-
NHttp::OutputConfigDebugInfoHTML(str, InitialConfig, YamlProtoConfig, CurrentConfig, ConfigInitInfo, DYNAMIC_KINDS, NON_YAML_KINDS, YamlConfigEnabled);
539+
NHttp::OutputConfigDebugInfoHTML(
540+
str,
541+
BaseConfig,
542+
YamlProtoConfig,
543+
CurrentConfig,
544+
{DebugInfo ? DebugInfo->InitInfo : THashMap<ui32, TConfigItemInfo>{}},
545+
DYNAMIC_KINDS,
546+
NON_YAML_KINDS,
547+
YamlConfigEnabled);
525548
}
526549
str << "<br />" << Endl;
527550
COLLAPSED_REF_CONTENT("state", "State") {
@@ -651,15 +674,17 @@ void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev)
651674
}
652675
str << "<br />" << Endl;
653676
COLLAPSED_REF_CONTENT("initial-config", "Initial config") {
654-
NHttp::OutputConfigHTML(str, InitialConfig);
677+
NHttp::OutputConfigHTML(str, BaseConfig);
655678
}
656-
str << "<br />" << Endl;
657-
COLLAPSED_REF_CONTENT("initial-cms-config", "Initial CMS config") {
658-
NHttp::OutputConfigHTML(str, InitialCmsConfig);
659-
}
660-
str << "<br />" << Endl;
661-
COLLAPSED_REF_CONTENT("initial-cms-yaml-config", "Initial CMS YAML config") {
662-
NHttp::OutputConfigHTML(str, InitialCmsYamlConfig);
679+
if (DebugInfo) {
680+
str << "<br />" << Endl;
681+
COLLAPSED_REF_CONTENT("initial-cms-config", "Initial CMS config") {
682+
NHttp::OutputConfigHTML(str, DebugInfo->OldDynConfig);
683+
}
684+
str << "<br />" << Endl;
685+
COLLAPSED_REF_CONTENT("initial-cms-yaml-config", "Initial CMS YAML config") {
686+
NHttp::OutputConfigHTML(str, DebugInfo->NewDynConfig);
687+
}
663688
}
664689
}
665690
}
@@ -742,7 +767,7 @@ void TConfigsDispatcher::Handle(TEvConsole::TEvConfigSubscriptionNotification::T
742767
bool hasAffectedKinds = false;
743768

744769
if (subscription->Yaml && YamlConfigEnabled) {
745-
ReplaceConfigItems(YamlProtoConfig, trunc, subscription->Kinds, InitialConfig);
770+
ReplaceConfigItems(YamlProtoConfig, trunc, FilterKinds(subscription->Kinds), BaseConfig);
746771
} else {
747772
Y_FOR_EACH_BIT(kind, kinds) {
748773
if (affectedKinds.contains(kind)) {
@@ -755,7 +780,7 @@ void TConfigsDispatcher::Handle(TEvConsole::TEvConfigSubscriptionNotification::T
755780
continue;
756781
}
757782

758-
ReplaceConfigItems(ev->Get()->Record.GetConfig(), trunc, kinds, InitialConfig);
783+
ReplaceConfigItems(ev->Get()->Record.GetConfig(), trunc, FilterKinds(kinds), BaseConfig);
759784
}
760785

761786
if (hasAffectedKinds || !CompareConfigs(subscription->CurrentConfig.Config, trunc) || CurrentStateFunc() == &TThis::StateInit) {
@@ -820,9 +845,9 @@ void TConfigsDispatcher::Handle(TEvConfigsDispatcher::TEvGetConfigRequest::TPtr
820845
auto trunc = std::make_shared<NKikimrConfig::TAppConfig>();
821846
auto kinds = KindsToBitMap(ev->Get()->ConfigItemKinds);
822847
if (YamlConfigEnabled && yamlKinds) {
823-
ReplaceConfigItems(YamlProtoConfig, *trunc, kinds, InitialConfig);
848+
ReplaceConfigItems(YamlProtoConfig, *trunc, FilterKinds(kinds), BaseConfig);
824849
} else {
825-
ReplaceConfigItems(CurrentConfig, *trunc, kinds, InitialConfig);
850+
ReplaceConfigItems(CurrentConfig, *trunc, FilterKinds(kinds), BaseConfig);
826851
}
827852
resp->Config = trunc;
828853

@@ -893,9 +918,9 @@ void TConfigsDispatcher::Handle(TEvConfigsDispatcher::TEvSetConfigSubscriptionRe
893918
subscription->UpdateInProcess = MakeHolder<TEvConsole::TEvConfigNotificationRequest>();
894919
NKikimrConfig::TAppConfig trunc;
895920
if (YamlConfigEnabled) {
896-
ReplaceConfigItems(YamlProtoConfig, trunc, kinds, InitialConfig);
921+
ReplaceConfigItems(YamlProtoConfig, trunc, FilterKinds(kinds), BaseConfig);
897922
} else {
898-
ReplaceConfigItems(CurrentConfig, trunc, kinds, InitialConfig);
923+
ReplaceConfigItems(CurrentConfig, trunc, FilterKinds(kinds), BaseConfig);
899924
}
900925
subscription->UpdateInProcess->Record.MutableConfig()->CopyFrom(trunc);
901926
Y_FOR_EACH_BIT(kind, kinds) {
@@ -997,14 +1022,8 @@ void TConfigsDispatcher::Handle(TEvConsole::TEvGetNodeLabelsRequest::TPtr &ev) {
9971022
Send(ev->Sender, Response.Release());
9981023
}
9991024

1000-
IActor *CreateConfigsDispatcher(
1001-
const NKikimrConfig::TAppConfig &config,
1002-
const TMap<TString, TString> &labels,
1003-
const NKikimrConfig::TAppConfig &initialCmsConfig,
1004-
const NKikimrConfig::TAppConfig &initialCmsYamlConfig,
1005-
const THashMap<ui32, TConfigItemInfo> &configInitInfo)
1006-
{
1007-
return new TConfigsDispatcher(config, labels, initialCmsConfig, initialCmsYamlConfig, configInitInfo);
1025+
IActor *CreateConfigsDispatcher(const TConfigsDispatcherInitInfo& initInfo) {
1026+
return new TConfigsDispatcher(initInfo);
10081027
}
10091028

10101029
} // namespace NKikimr::NConsole

ydb/core/cms/console/configs_dispatcher.h

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <ydb/core/cms/console/config_item_info.h>
66

77
#include <util/generic/vector.h>
8+
#include <util/generic/map.h>
89

910
namespace NKikimr::NConsole {
1011

@@ -107,17 +108,34 @@ struct TEvConfigsDispatcher {
107108
};
108109
};
109110

111+
struct TDenyList {
112+
std::set<ui32> Items;
113+
};
114+
115+
struct TAllowList {
116+
std::set<ui32> Items;
117+
};
118+
119+
struct TDebugInfo {
120+
NKikimrConfig::TAppConfig StaticConfig;
121+
NKikimrConfig::TAppConfig OldDynConfig;
122+
NKikimrConfig::TAppConfig NewDynConfig;
123+
THashMap<ui32, TConfigItemInfo> InitInfo;
124+
};
125+
126+
struct TConfigsDispatcherInitInfo {
127+
NKikimrConfig::TAppConfig InitialConfig;
128+
TMap<TString, TString> Labels;
129+
std::variant<std::monostate, TDenyList, TAllowList> ItemsServeRules;
130+
std::optional<TDebugInfo> DebugInfo;
131+
};
132+
110133
/**
111134
* Initial config is used to initilize Configs Dispatcher. All received configs
112135
* are compared to the current one and notifications are not sent to local
113136
* subscribers if there is no config modification detected.
114137
*/
115-
IActor *CreateConfigsDispatcher(
116-
const NKikimrConfig::TAppConfig &config,
117-
const TMap<TString, TString> &labels,
118-
const NKikimrConfig::TAppConfig &initialCmsConfig = {},
119-
const NKikimrConfig::TAppConfig &initialCmsYamlConfig = {},
120-
const THashMap<ui32, TConfigItemInfo> &configInitInfo = {});
138+
IActor *CreateConfigsDispatcher(const TConfigsDispatcherInitInfo& initInfo);
121139

122140
inline TActorId MakeConfigsDispatcherID(ui32 node = 0) {
123141
char x[12] = { 'c', 'o', 'n', 'f', 'i', 'g', 's', 'd', 'i', 's', 'p' };

ydb/core/driver_lib/run/kikimr_services_initializers.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2381,7 +2381,18 @@ TConfigsDispatcherInitializer::TConfigsDispatcherInitializer(const TKikimrRunCon
23812381
}
23822382

23832383
void TConfigsDispatcherInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) {
2384-
IActor* actor = NConsole::CreateConfigsDispatcher(Config, Labels, InitialCmsConfig, InitialCmsYamlConfig, ConfigInitInfo);
2384+
NKikimr::NConsole::TConfigsDispatcherInitInfo initInfo {
2385+
.InitialConfig = Config,
2386+
.Labels = Labels,
2387+
.ItemsServeRules = std::monostate{},
2388+
.DebugInfo = NKikimr::NConsole::TDebugInfo {
2389+
.StaticConfig = Config,
2390+
.OldDynConfig = InitialCmsConfig,
2391+
.NewDynConfig = InitialCmsYamlConfig,
2392+
.InitInfo = ConfigInitInfo,
2393+
},
2394+
};
2395+
IActor* actor = NConsole::CreateConfigsDispatcher(initInfo);
23852396
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(
23862397
NConsole::MakeConfigsDispatcherID(NodeId),
23872398
TActorSetupCmd(actor, TMailboxType::HTSwap, appData->UserPoolId)));

ydb/core/testlib/tenant_runtime.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,12 @@ void TTenantTestRuntime::Setup(bool createTenantPools)
10341034
labels[label.GetName()] = label.GetValue();
10351035
}
10361036
labels.emplace("node_id", ToString(i));
1037-
auto aid = Register(CreateConfigsDispatcher(Extension, labels));
1037+
auto aid = Register(CreateConfigsDispatcher(
1038+
NKikimr::NConsole::TConfigsDispatcherInitInfo {
1039+
.InitialConfig = Extension,
1040+
.Labels = labels,
1041+
}
1042+
));
10381043
EnableScheduleForActor(aid, true);
10391044
RegisterService(MakeConfigsDispatcherID(GetNodeId(0)), aid, 0);
10401045
}

ydb/core/testlib/test_client.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,10 @@ namespace Tests {
739739
if (!initial.HasImmediateControlsConfig()) {
740740
initial.MutableImmediateControlsConfig()->CopyFrom(Settings->Controls);
741741
}
742-
auto *dispatcher = NConsole::CreateConfigsDispatcher(initial, {});
742+
auto *dispatcher = NConsole::CreateConfigsDispatcher(
743+
NKikimr::NConsole::TConfigsDispatcherInitInfo {
744+
.InitialConfig = initial,
745+
});
743746
auto aid = Runtime->Register(dispatcher, nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0);
744747
Runtime->RegisterService(NConsole::MakeConfigsDispatcherID(Runtime->GetNodeId(nodeIdx)), aid, nodeIdx);
745748
}

0 commit comments

Comments
 (0)