diff options
author | innokentii <innokentii@yandex-team.com> | 2023-06-06 20:13:31 +0300 |
---|---|---|
committer | innokentii <innokentii@yandex-team.com> | 2023-06-06 20:13:31 +0300 |
commit | 94ab32ef88972cb80d8960aa928650343f0fb860 (patch) | |
tree | 270b1c8c0e3595699aefceb773a7df172891e1cd | |
parent | a1edfae32d8ebc2479d063d6106156f128ba5fc5 (diff) | |
download | ydb-94ab32ef88972cb80d8960aa928650343f0fb860.tar.gz |
New DynamicConfig API draft
WIP
Add new calls
30 files changed, 1330 insertions, 391 deletions
diff --git a/ydb/core/cms/console/CMakeLists.darwin-x86_64.txt b/ydb/core/cms/console/CMakeLists.darwin-x86_64.txt index 03911aebdf6..65e0ecacc9b 100644 --- a/ydb/core/cms/console/CMakeLists.darwin-x86_64.txt +++ b/ydb/core/cms/console/CMakeLists.darwin-x86_64.txt @@ -48,7 +48,8 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console_tenants_manager.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__add_config_subscription.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__alter_tenant.cpp - ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__apply_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__replace_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__set_yaml_config.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__cleanup_subscriptions.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__configure.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__create_tenant.cpp @@ -57,6 +58,7 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__load_state.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_log_tail.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_metadata.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__log_cleanup.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_computational_units.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_config_subscription.cpp diff --git a/ydb/core/cms/console/CMakeLists.linux-aarch64.txt b/ydb/core/cms/console/CMakeLists.linux-aarch64.txt index 98434d97d85..4a2b2a0008a 100644 --- a/ydb/core/cms/console/CMakeLists.linux-aarch64.txt +++ b/ydb/core/cms/console/CMakeLists.linux-aarch64.txt @@ -49,7 +49,8 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console_tenants_manager.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__add_config_subscription.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__alter_tenant.cpp - ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__apply_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__replace_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__set_yaml_config.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__cleanup_subscriptions.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__configure.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__create_tenant.cpp @@ -58,6 +59,7 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__load_state.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_log_tail.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_metadata.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__log_cleanup.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_computational_units.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_config_subscription.cpp diff --git a/ydb/core/cms/console/CMakeLists.linux-x86_64.txt b/ydb/core/cms/console/CMakeLists.linux-x86_64.txt index 98434d97d85..4a2b2a0008a 100644 --- a/ydb/core/cms/console/CMakeLists.linux-x86_64.txt +++ b/ydb/core/cms/console/CMakeLists.linux-x86_64.txt @@ -49,7 +49,8 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console_tenants_manager.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__add_config_subscription.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__alter_tenant.cpp - ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__apply_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__replace_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__set_yaml_config.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__cleanup_subscriptions.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__configure.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__create_tenant.cpp @@ -58,6 +59,7 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__load_state.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_log_tail.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_metadata.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__log_cleanup.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_computational_units.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_config_subscription.cpp diff --git a/ydb/core/cms/console/CMakeLists.windows-x86_64.txt b/ydb/core/cms/console/CMakeLists.windows-x86_64.txt index 03911aebdf6..65e0ecacc9b 100644 --- a/ydb/core/cms/console/CMakeLists.windows-x86_64.txt +++ b/ydb/core/cms/console/CMakeLists.windows-x86_64.txt @@ -48,7 +48,8 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console_tenants_manager.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__add_config_subscription.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__alter_tenant.cpp - ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__apply_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__replace_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__set_yaml_config.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__cleanup_subscriptions.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__configure.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__create_tenant.cpp @@ -57,6 +58,7 @@ target_sources(core-cms-console PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__load_state.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_log_tail.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_config.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__get_yaml_metadata.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__log_cleanup.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_computational_units.cpp ${CMAKE_SOURCE_DIR}/ydb/core/cms/console/console__remove_config_subscription.cpp diff --git a/ydb/core/cms/console/configs_dispatcher.cpp b/ydb/core/cms/console/configs_dispatcher.cpp index 1f2840ac5ae..a16b30130a8 100644 --- a/ydb/core/cms/console/configs_dispatcher.cpp +++ b/ydb/core/cms/console/configs_dispatcher.cpp @@ -159,6 +159,7 @@ public: void Handle(TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest::TPtr &ev); void Handle(TEvConfigsDispatcher::TEvRemoveConfigSubscriptionRequest::TPtr &ev); void Handle(TEvConsole::TEvConfigNotificationRequest::TPtr &ev); + void Handle(TEvConsole::TEvGetNodeLabelsRequest::TPtr &ev); void ReplyMonJson(TActorId mailbox); @@ -175,6 +176,8 @@ public: // Events from clients hFuncTraced(TEvConfigsDispatcher::TEvSetConfigSubscriptionRequest, Handle); hFuncTraced(TEvConfigsDispatcher::TEvRemoveConfigSubscriptionRequest, Handle); + // Resolve + hFunc(TEvConsole::TEvGetNodeLabelsRequest, Handle); default: EnqueueEvent(ev); break; @@ -197,6 +200,8 @@ public: hFuncTraced(TEvConfigsDispatcher::TEvRemoveConfigSubscriptionRequest, Handle); hFuncTraced(TEvConsole::TEvConfigNotificationResponse, Handle); IgnoreFunc(TEvConfigsDispatcher::TEvSetConfigSubscriptionResponse); + // Resolve + hFunc(TEvConsole::TEvGetNodeLabelsRequest, Handle); // Ignore these console requests until we get rid of persistent subscriptions-related code IgnoreFunc(TEvConsole::TEvAddConfigSubscriptionResponse); @@ -910,6 +915,19 @@ void TConfigsDispatcher::Handle(TEvConsole::TEvConfigNotificationResponse::TPtr subscription->UpdateInProcess = nullptr; } } + + +void TConfigsDispatcher::Handle(TEvConsole::TEvGetNodeLabelsRequest::TPtr &ev) { + auto Response = MakeHolder<TEvConsole::TEvGetNodeLabelsResponse>(); + + for (const auto& [label, value] : Labels) { + auto *labelSer = Response->Record.MutableResponse()->add_labels(); + labelSer->set_label(label); + labelSer->set_value(value); + } + + Send(ev->Sender, Response.Release()); +} IActor *CreateConfigsDispatcher( const NKikimrConfig::TAppConfig &config, diff --git a/ydb/core/cms/console/configs_dispatcher_ut.cpp b/ydb/core/cms/console/configs_dispatcher_ut.cpp index bd32d5569f0..593e4b759cb 100644 --- a/ydb/core/cms/console/configs_dispatcher_ut.cpp +++ b/ydb/core/cms/console/configs_dispatcher_ut.cpp @@ -509,7 +509,7 @@ allowed_labels: selector_config: [] )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig1); UNIT_ASSERT(notifications == 0); @@ -541,7 +541,7 @@ config: {yaml_config_enabled: false} allowed_labels: {} selector_config: [] )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig2); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig2); UNIT_ASSERT(notifications == 0); @@ -556,30 +556,6 @@ selector_config: [] UNIT_ASSERT_VALUES_EQUAL(expectedConfig.ShortDebugString(), reply->Config.ShortDebugString()); } - Y_UNIT_TEST(DoubleDrop) { - TTenantTestRuntime runtime(DefaultConsoleTestConfig()); - TString yamlConfig = R"( ---- -metadata: - cluster: "" - version: 0 - -config: - log_config: - cluster_name: cluster1 -allowed_labels: - test: - type: enum - values: - ? true - -selector_config: [] -)"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig); - CheckDropConfig(runtime, Ydb::StatusIds::SUCCESS, "", 1); - CheckDropConfig(runtime, Ydb::StatusIds::SUCCESS, "", 1); - } - Y_UNIT_TEST(TestYamlEndToEnd) { NKikimrConfig::TAppConfig config; auto *label = config.AddLabels(); @@ -642,7 +618,7 @@ allowed_labels: selector_config: [] )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig1); UNIT_ASSERT(notifications == 0); TString yamlConfig2 = R"( @@ -665,7 +641,7 @@ allowed_labels: selector_config: [] )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig2); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig2); ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster2"); ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetDefaultLevel(5); @@ -692,7 +668,7 @@ allowed_labels: selector_config: [] )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig3); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig3); reply = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle); expectedConfig = {}; @@ -728,8 +704,8 @@ allowed_labels: selector_config: [] )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig4); - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig4); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig4); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig4); UNIT_ASSERT(notifications == 0); TString yamlConfig5 = R"( @@ -762,7 +738,7 @@ selector_config: - component: AUDIT_LOG_WRITER level: 7 )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig5); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig5); reply = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle); expectedConfig = {}; @@ -779,20 +755,6 @@ selector_config: UNIT_ASSERT_VALUES_EQUAL(expectedConfig.ShortDebugString(), reply->Config.ShortDebugString()); notifications = 0; - CheckDropConfig(runtime, Ydb::StatusIds::SUCCESS, "", 5); - reply = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle); - expectedConfig = {}; - label = expectedConfig.AddLabels(); - label->SetName("test"); - label->SetValue("true"); - logConfig = expectedConfig.MutableLogConfig(); - logConfig->SetClusterName("cluster2"); - logConfig->SetDefaultLevel(5); - UNIT_ASSERT(notifications > 0); - UNIT_ASSERT_VALUES_EQUAL(expectedConfig.ShortDebugString(), reply->Config.ShortDebugString()); - - CheckDropConfig(runtime, Ydb::StatusIds::SUCCESS, "", 5); - TString yamlConfig6 = R"( --- metadata: @@ -821,9 +783,9 @@ selector_config: log_config: !inherit entry: - component: AUDIT_LOG_WRITER - level: 7 + level: 6 )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig6); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig6); reply = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle); expectedConfig = {}; @@ -835,7 +797,7 @@ selector_config: logConfig->SetDefaultLevel(5); entry = logConfig->AddEntry(); entry->SetComponent("AUDIT_LOG_WRITER"); - entry->SetLevel(7); + entry->SetLevel(6); UNIT_ASSERT(notifications > 0); UNIT_ASSERT_VALUES_EQUAL(expectedConfig.ShortDebugString(), reply->Config.ShortDebugString()); notifications = 0; @@ -871,7 +833,7 @@ selector_config: - component: AUDIT_LOG_WRITER level: 7 )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig7); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig7); reply = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle); expectedConfig = {}; @@ -909,7 +871,7 @@ selector_config: config: yaml_config_enabled: false )"; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig8); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, yamlConfig8); reply = runtime.GrabEdgeEventRethrow<TEvPrivate::TEvGotNotification>(handle); expectedConfig = {}; diff --git a/ydb/core/cms/console/console.h b/ydb/core/cms/console/console.h index e55499b2235..53997b63bce 100644 --- a/ydb/core/cms/console/console.h +++ b/ydb/core/cms/console/console.h @@ -45,13 +45,16 @@ struct TEvConsole { EvUpdateTenantPoolConfig, EvGetLogTailRequest, // - EvApplyConfigRequest, + EvSetYamlConfigRequest, EvAddVolatileConfigRequest, EvRemoveVolatileConfigRequest, EvGetAllConfigsRequest, EvResolveConfigRequest, EvResolveAllConfigRequest, EvDropConfigRequest, + EvReplaceYamlConfigRequest, + EvGetAllMetadataRequest, + EvGetNodeLabelsRequest, // responses EvCreateTenantResponse = EvCreateTenantRequest + 1024, @@ -83,13 +86,19 @@ struct TEvConsole { EvConfigSubscriptionError, EvGetLogTailResponse, // - EvApplyConfigResponse, + EvSetYamlConfigResponse, EvAddVolatileConfigResponse, EvRemoveVolatileConfigResponse, EvGetAllConfigsResponse, EvResolveConfigResponse, EvResolveAllConfigResponse, EvDropConfigResponse, + EvReplaceYamlConfigResponse, + EvGetAllMetadataResponse, + EvGetNodeLabelsResponse, + EvUnauthorized, + EvDisabled, + EvGenericError, EvEnd }; @@ -151,10 +160,16 @@ struct TEvConsole { ////////////////////////////////////////////////// // NEW CONFIGS MANAGEMENT ////////////////////////////////////////////////// - struct TEvApplyConfigResponse : public TEventShortDebugPB<TEvApplyConfigResponse, NKikimrConsole::TApplyConfigResponse, EvApplyConfigResponse> {}; + struct TEvSetYamlConfigResponse : public TEventShortDebugPB<TEvSetYamlConfigResponse, NKikimrConsole::TSetYamlConfigResponse, EvSetYamlConfigResponse> {}; - struct TEvApplyConfigRequest : public TEventShortDebugPB<TEvApplyConfigRequest, NKikimrConsole::TApplyConfigRequest, EvApplyConfigRequest> { - using TResponse = TEvApplyConfigResponse; + struct TEvSetYamlConfigRequest : public TEventShortDebugPB<TEvSetYamlConfigRequest, NKikimrConsole::TSetYamlConfigRequest, EvSetYamlConfigRequest> { + using TResponse = TEvSetYamlConfigResponse; + }; + + struct TEvReplaceYamlConfigResponse : public TEventShortDebugPB<TEvReplaceYamlConfigResponse, NKikimrConsole::TReplaceYamlConfigResponse, EvReplaceYamlConfigResponse> {}; + + struct TEvReplaceYamlConfigRequest : public TEventShortDebugPB<TEvReplaceYamlConfigRequest, NKikimrConsole::TReplaceYamlConfigRequest, EvReplaceYamlConfigRequest> { + using TResponse = TEvReplaceYamlConfigResponse; }; struct TEvDropConfigResponse : public TEventShortDebugPB<TEvDropConfigResponse, NKikimrConsole::TDropConfigResponse, EvDropConfigResponse> {}; @@ -181,6 +196,18 @@ struct TEvConsole { using TResponse = TEvGetAllConfigsResponse; }; + struct TEvGetAllMetadataResponse : public TEventShortDebugPB<TEvGetAllMetadataResponse, NKikimrConsole::TGetAllMetadataResponse, EvGetAllMetadataResponse> {}; + + struct TEvGetAllMetadataRequest : public TEventShortDebugPB<TEvGetAllMetadataRequest, NKikimrConsole::TGetAllMetadataRequest, EvGetAllMetadataRequest> { + using TResponse = TEvGetAllMetadataResponse; + }; + + struct TEvGetNodeLabelsResponse : public TEventShortDebugPB<TEvGetNodeLabelsResponse, NKikimrConsole::TGetNodeLabelsResponse, EvGetNodeLabelsResponse> {}; + + struct TEvGetNodeLabelsRequest : public TEventShortDebugPB<TEvGetNodeLabelsRequest, NKikimrConsole::TGetNodeLabelsRequest, EvGetNodeLabelsRequest> { + using TResponse = TEvGetNodeLabelsResponse; + }; + struct TEvResolveConfigRequest : public TEventShortDebugPB<TEvResolveConfigRequest, NKikimrConsole::TResolveConfigRequest, EvResolveConfigRequest> {}; struct TEvResolveConfigResponse : public TEventShortDebugPB<TEvResolveConfigResponse, NKikimrConsole::TResolveConfigResponse, EvResolveConfigResponse> {}; @@ -189,6 +216,12 @@ struct TEvConsole { struct TEvResolveAllConfigResponse : public TEventShortDebugPB<TEvResolveAllConfigResponse, NKikimrConsole::TResolveAllConfigResponse, EvResolveAllConfigResponse> {}; + struct TEvUnauthorized : public TEventShortDebugPB<TEvUnauthorized, NKikimrConsole::TUnauthorized, EvUnauthorized> {}; + + struct TEvDisabled : public TEventShortDebugPB<TEvDisabled, NKikimrConsole::TDisabled, EvDisabled> {}; + + struct TEvGenericError : public TEventShortDebugPB<TEvGenericError, NKikimrConsole::TGenericError, EvGenericError> {}; + ////////////////////////////////////////////////// // CMS MANAGEMENT ////////////////////////////////////////////////// diff --git a/ydb/core/cms/console/console__drop_yaml_config.cpp b/ydb/core/cms/console/console__drop_yaml_config.cpp index 57927e85f71..080fee47a3f 100644 --- a/ydb/core/cms/console/console__drop_yaml_config.cpp +++ b/ydb/core/cms/console/console__drop_yaml_config.cpp @@ -16,18 +16,15 @@ public: { } - bool Execute(TTransactionContext &txc, const TActorContext &) override + bool Execute(TTransactionContext &txc, const TActorContext &ctx) override { auto &req = Request->Get()->Record; NIceDb::TNiceDb db(txc.DB); - Y_UNUSED(Modify); - Y_UNUSED(Error); - try { - Version = req.GetRequest().version(); - auto cluster = req.GetRequest().cluster(); + Version = req.GetRequest().identity().version(); + auto cluster = req.GetRequest().identity().cluster(); if (Version == 0) { ythrow yexception() << "Invalid version"; @@ -41,28 +38,24 @@ public: ythrow yexception() << "Version mismatch"; } } catch (const yexception& ex) { - Response = MakeHolder<TEvConsole::TEvDropConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::BAD_REQUEST); - op->set_ready(true); - auto *issue = op->add_issues(); + Error = true; + + auto ev = MakeHolder<TEvConsole::TEvGenericError>(); + ev->Record.SetYdbStatus(Ydb::StatusIds::BAD_REQUEST); + auto *issue = ev->Record.AddIssues(); issue->set_severity(NYql::TSeverityIds::S_ERROR); issue->set_message(ex.what()); - Error = true; + Response = MakeHolder<NActors::IEventHandle>(Request->Sender, ctx.SelfID, ev.Release()); return true; } if (!Self->YamlDropped) { Modify = true; - db.Table<Schema::YamlConfig>().Key(Version) - .Update<Schema::YamlConfig::Dropped>(true); + db.Table<Schema::YamlConfig>().Key(Version).Delete(); } - Response = MakeHolder<TEvConsole::TEvDropConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); + Response = MakeHolder<NActors::IEventHandle>(Request->Sender, ctx.SelfID, new TEvConsole::TEvDropConfigResponse()); return true; } @@ -71,9 +64,11 @@ public: { LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxDropYamlConfig Complete"); - ctx.Send(Request->Sender, Response.Release()); + ctx.Send(Response.Release()); if (!Error && Modify) { + Self->YamlVersion = 0; + Self->YamlConfig.clear(); Self->YamlDropped = true; Self->VolatileYamlConfigs.clear(); @@ -87,7 +82,7 @@ public: private: TEvConsole::TEvDropConfigRequest::TPtr Request; - THolder<TEvConsole::TEvDropConfigResponse> Response; + THolder<NActors::IEventHandle> Response; bool Error = false; bool Modify = false; ui32 Version; diff --git a/ydb/core/cms/console/console__get_yaml_config.cpp b/ydb/core/cms/console/console__get_yaml_config.cpp index 2eb2f362932..d25d264c487 100644 --- a/ydb/core/cms/console/console__get_yaml_config.cpp +++ b/ydb/core/cms/console/console__get_yaml_config.cpp @@ -9,40 +9,24 @@ using namespace NKikimrConsole; class TConfigsManager::TTxGetYamlConfig : public TTransactionBase<TConfigsManager> { public: TTxGetYamlConfig(TConfigsManager *self, - TEvConsole::TEvGetAllConfigsRequest::TPtr &ev) + TEvConsole::TEvGetAllConfigsRequest::TPtr &ev) : TBase(self) , Request(std::move(ev)) { } - bool Execute(TTransactionContext &txc, const TActorContext &) override + bool Execute(TTransactionContext &, const TActorContext &) override { - NIceDb::TNiceDb db(txc.DB); - - auto rowset = db.Table<Schema::YamlConfig>() - .Reverse() - .Select<Schema::YamlConfig::TColumns>(); - - if (!rowset.IsReady()) - return false; - Response = MakeHolder<TEvConsole::TEvGetAllConfigsResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); - - Response->Record.MutableResponse()->set_cluster(Self->ClusterName); - Response->Record.MutableResponse()->set_version(Self->YamlVersion); - if (!rowset.EndOfSet()) { - auto config = rowset.template GetValue<Schema::YamlConfig::Config>(); - Response->Record.MutableResponse()->set_config(config); + Response->Record.MutableResponse()->mutable_identity()->set_cluster(Self->ClusterName); + Response->Record.MutableResponse()->mutable_identity()->set_version(Self->YamlVersion); + Response->Record.MutableResponse()->set_config(Self->YamlConfig); - for (auto &[id, cfg] : Self->VolatileYamlConfigs) { - auto *config = Response->Record.MutableResponse()->add_volatile_configs(); - config->set_id(id); - config->set_config(cfg); - } + for (auto &[id, cfg] : Self->VolatileYamlConfigs) { + auto *config = Response->Record.MutableResponse()->add_volatile_configs(); + config->set_id(id); + config->set_config(cfg); } return true; diff --git a/ydb/core/cms/console/console__get_yaml_metadata.cpp b/ydb/core/cms/console/console__get_yaml_metadata.cpp new file mode 100644 index 00000000000..0d183d8b420 --- /dev/null +++ b/ydb/core/cms/console/console__get_yaml_metadata.cpp @@ -0,0 +1,63 @@ +#include "console_configs_manager.h" + +#include <ydb/core/tablet_flat/tablet_flat_executed.h> + +namespace NKikimr::NConsole { + +using namespace NKikimrConsole; + +class TConfigsManager::TTxGetYamlMetadata : public TTransactionBase<TConfigsManager> { +public: + TTxGetYamlMetadata(TConfigsManager *self, + TEvConsole::TEvGetAllMetadataRequest::TPtr &ev) + : TBase(self) + , Request(std::move(ev)) + { + } + + bool Execute(TTransactionContext &, const TActorContext &) override + { + Response = MakeHolder<TEvConsole::TEvGetAllMetadataResponse>(); + + if (Self->YamlConfig) { + auto doc = NFyaml::TDocument::Parse(Self->YamlConfig); + + TStringStream metadata; + metadata << doc.Root().Map().at("metadata"); + + Response->Record.MutableResponse()->set_metadata(metadata.Str()); + + for (auto &[id, cfg] : Self->VolatileYamlConfigs) { + auto *config = Response->Record.MutableResponse()->add_volatile_configs(); + metadata.clear(); + auto doc = NFyaml::TDocument::Parse(cfg); + metadata << doc.Root().Map().at("metadata"); + config->set_id(id); + config->set_metadata(metadata.Str()); + } + + } + + return true; + } + + void Complete(const TActorContext &ctx) override + { + LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxGetYamlMetadata Complete"); + + ctx.Send(Request->Sender, Response.Release()); + + Self->TxProcessor->TxCompleted(this, ctx); + } + +private: + TEvConsole::TEvGetAllMetadataRequest::TPtr Request; + THolder<TEvConsole::TEvGetAllMetadataResponse> Response; +}; + +ITransaction *TConfigsManager::CreateTxGetYamlMetadata(TEvConsole::TEvGetAllMetadataRequest::TPtr &ev) +{ + return new TTxGetYamlMetadata(this, ev); +} + +} // namespace NKikimr::NConsole diff --git a/ydb/core/cms/console/console__apply_yaml_config.cpp b/ydb/core/cms/console/console__replace_yaml_config.cpp index 71b1afff2a8..8cf3a4ab133 100644 --- a/ydb/core/cms/console/console__apply_yaml_config.cpp +++ b/ydb/core/cms/console/console__replace_yaml_config.cpp @@ -7,16 +7,16 @@ namespace NKikimr::NConsole { using namespace NKikimrConsole; -class TConfigsManager::TTxApplyYamlConfig : public TTransactionBase<TConfigsManager> { +class TConfigsManager::TTxReplaceYamlConfig : public TTransactionBase<TConfigsManager> { public: - TTxApplyYamlConfig(TConfigsManager *self, - TEvConsole::TEvApplyConfigRequest::TPtr &ev) + TTxReplaceYamlConfig(TConfigsManager *self, + TEvConsole::TEvReplaceYamlConfigRequest::TPtr &ev) : TBase(self) , Request(std::move(ev)) { } - bool Execute(TTransactionContext &txc, const TActorContext &) override + bool Execute(TTransactionContext &txc, const TActorContext &ctx) override { auto &req = Request->Get()->Record; @@ -51,32 +51,30 @@ public: auto cfg = NYamlConfig::YamlToProto(config.second); } - db.Table<Schema::YamlConfig>().Key(Version + 1) - .Update<Schema::YamlConfig::Config>(UpdatedConfig) - // set config dropped by default to support rollback to previous versions - // where new config layout is not supported - // it will lead to ignoring config from new versions - .Update<Schema::YamlConfig::Dropped>(true); - - /* Later we shift this boundary to support rollback and history */ - db.Table<Schema::YamlConfig>().Key(Version) - .Delete(); + if (!req.GetRequest().dry_run()) { + db.Table<Schema::YamlConfig>().Key(Version + 1) + .Update<Schema::YamlConfig::Config>(UpdatedConfig) + // set config dropped by default to support rollback to previous versions + // where new config layout is not supported + // it will lead to ignoring config from new versions + .Update<Schema::YamlConfig::Dropped>(true); + + /* Later we shift this boundary to support rollback and history */ + db.Table<Schema::YamlConfig>().Key(Version) + .Delete(); + } } - Response = MakeHolder<TEvConsole::TEvApplyConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); + Response = MakeHolder<NActors::IEventHandle>(Request->Sender, ctx.SelfID, new TEvConsole::TEvReplaceYamlConfigResponse()); } catch (const yexception& ex) { Error = true; - Response = MakeHolder<TEvConsole::TEvApplyConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::BAD_REQUEST); - op->set_ready(true); - auto *issue = op->add_issues(); + auto ev = MakeHolder<TEvConsole::TEvGenericError>(); + ev->Record.SetYdbStatus(Ydb::StatusIds::BAD_REQUEST); + auto *issue = ev->Record.AddIssues(); issue->set_severity(NYql::TSeverityIds::S_ERROR); issue->set_message(ex.what()); + Response = MakeHolder<NActors::IEventHandle>(Request->Sender, ctx.SelfID, ev.Release()); } return true; @@ -84,11 +82,13 @@ public: void Complete(const TActorContext &ctx) override { - LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxApplyYamlConfig Complete"); + LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxReplaceYamlConfig Complete"); + + auto &req = Request->Get()->Record; - ctx.Send(Request->Sender, Response.Release()); + ctx.Send(Response.Release()); - if (!Error && Modify) { + if (!Error && Modify && !req.GetRequest().dry_run()) { Self->YamlVersion = Version + 1; Self->YamlConfig = UpdatedConfig; Self->YamlDropped = false; @@ -103,8 +103,8 @@ public: } private: - TEvConsole::TEvApplyConfigRequest::TPtr Request; - THolder<TEvConsole::TEvApplyConfigResponse> Response; + TEvConsole::TEvReplaceYamlConfigRequest::TPtr Request; + THolder<NActors::IEventHandle> Response; bool Error = false; bool Modify = false; ui32 Version; @@ -112,9 +112,9 @@ private: TString UpdatedConfig; }; -ITransaction *TConfigsManager::CreateTxApplyYamlConfig(TEvConsole::TEvApplyConfigRequest::TPtr &ev) +ITransaction *TConfigsManager::CreateTxReplaceYamlConfig(TEvConsole::TEvReplaceYamlConfigRequest::TPtr &ev) { - return new TTxApplyYamlConfig(this, ev); + return new TTxReplaceYamlConfig(this, ev); } } // namespace NKikimr::NConsole diff --git a/ydb/core/cms/console/console__set_yaml_config.cpp b/ydb/core/cms/console/console__set_yaml_config.cpp new file mode 100644 index 00000000000..f219c8af994 --- /dev/null +++ b/ydb/core/cms/console/console__set_yaml_config.cpp @@ -0,0 +1,107 @@ +#include "console_configs_manager.h" +#include "console_configs_provider.h" + +#include <ydb/core/tablet_flat/tablet_flat_executed.h> + +namespace NKikimr::NConsole { + +using namespace NKikimrConsole; + +class TConfigsManager::TTxSetYamlConfig : public TTransactionBase<TConfigsManager> { +public: + TTxSetYamlConfig(TConfigsManager *self, + TEvConsole::TEvSetYamlConfigRequest::TPtr &ev) + : TBase(self) + , Request(std::move(ev)) + { + } + + bool Execute(TTransactionContext &txc, const TActorContext &ctx) override + { + auto &req = Request->Get()->Record; + + NIceDb::TNiceDb db(txc.DB); + + auto config = req.GetRequest().config(); + + try { + UpdatedConfig = NYamlConfig::ReplaceMetadata(config, NYamlConfig::TMetadata{ + .Version = Self->YamlVersion + 1, + .Cluster = Self->ClusterName, + }); + + if (UpdatedConfig != Self->YamlConfig || Self->YamlDropped) { + Modify = true; + + auto tree = NFyaml::TDocument::Parse(UpdatedConfig); + auto resolved = NYamlConfig::ResolveAll(tree); + + for (auto& [_, config] : resolved.Configs) { + auto cfg = NYamlConfig::YamlToProto(config.second); + } + + if (!req.GetRequest().dry_run()) { + db.Table<Schema::YamlConfig>().Key(Self->YamlVersion + 1) + .Update<Schema::YamlConfig::Config>(UpdatedConfig) + // set config dropped by default to support rollback to previous versions + // where new config layout is not supported + // it will lead to ignoring config from new versions + .Update<Schema::YamlConfig::Dropped>(true); + + /* Later we shift this boundary to support rollback and history */ + db.Table<Schema::YamlConfig>().Key(Self->YamlVersion) + .Delete(); + } + } + + Response = MakeHolder<NActors::IEventHandle>(Request->Sender, ctx.SelfID, new TEvConsole::TEvSetYamlConfigResponse()); + } catch (const yexception& ex) { + Error = true; + + auto ev = MakeHolder<TEvConsole::TEvGenericError>(); + ev->Record.SetYdbStatus(Ydb::StatusIds::BAD_REQUEST); + auto *issue = ev->Record.AddIssues(); + issue->set_severity(NYql::TSeverityIds::S_ERROR); + issue->set_message(ex.what()); + Response = MakeHolder<NActors::IEventHandle>(Request->Sender, ctx.SelfID, ev.Release()); + } + + return true; + } + + void Complete(const TActorContext &ctx) override + { + LOG_DEBUG(ctx, NKikimrServices::CMS_CONFIGS, "TTxSetYamlConfig Complete"); + + auto &req = Request->Get()->Record; + + ctx.Send(Response.Release()); + + if (!Error && Modify && !req.GetRequest().dry_run()) { + Self->YamlVersion = Self->YamlVersion + 1; + Self->YamlConfig = UpdatedConfig; + Self->YamlDropped = false; + + Self->VolatileYamlConfigs.clear(); + + auto resp = MakeHolder<TConfigsProvider::TEvPrivate::TEvUpdateYamlConfig>(Self->YamlConfig); + ctx.Send(Self->ConfigsProvider, resp.Release()); + } + + Self->TxProcessor->TxCompleted(this, ctx); + } + +private: + TEvConsole::TEvSetYamlConfigRequest::TPtr Request; + THolder<NActors::IEventHandle> Response; + bool Error = false; + bool Modify = false; + TString UpdatedConfig; +}; + +ITransaction *TConfigsManager::CreateTxSetYamlConfig(TEvConsole::TEvSetYamlConfigRequest::TPtr &ev) +{ + return new TTxSetYamlConfig(this, ev); +} + +} // namespace NKikimr::NConsole diff --git a/ydb/core/cms/console/console_configs_manager.cpp b/ydb/core/cms/console/console_configs_manager.cpp index 47dac4b76bb..110b26505b0 100644 --- a/ydb/core/cms/console/console_configs_manager.cpp +++ b/ydb/core/cms/console/console_configs_manager.cpp @@ -1,4 +1,6 @@ #include "console_configs_manager.h" + +#include "configs_dispatcher.h" #include "console_configs_provider.h" #include "console_impl.h" #include "http.h" @@ -616,9 +618,14 @@ void TConfigsManager::Handle(TEvConsole::TEvToggleConfigValidatorRequest::TPtr & TxProcessor->ProcessTx(CreateTxToggleConfigValidator(ev), ctx); } -void TConfigsManager::Handle(TEvConsole::TEvApplyConfigRequest::TPtr &ev, const TActorContext &ctx) +void TConfigsManager::Handle(TEvConsole::TEvReplaceYamlConfigRequest::TPtr &ev, const TActorContext &ctx) +{ + TxProcessor->ProcessTx(CreateTxReplaceYamlConfig(ev), ctx); +} + +void TConfigsManager::Handle(TEvConsole::TEvSetYamlConfigRequest::TPtr &ev, const TActorContext &ctx) { - TxProcessor->ProcessTx(CreateTxApplyYamlConfig(ev), ctx); + TxProcessor->ProcessTx(CreateTxSetYamlConfig(ev), ctx); } void TConfigsManager::Handle(TEvConsole::TEvDropConfigRequest::TPtr &ev, const TActorContext &ctx) @@ -631,6 +638,21 @@ void TConfigsManager::Handle(TEvConsole::TEvGetAllConfigsRequest::TPtr &ev, cons TxProcessor->ProcessTx(CreateTxGetYamlConfig(ev), ctx); } +void TConfigsManager::Handle(TEvConsole::TEvGetNodeLabelsRequest::TPtr &ev, const TActorContext &ctx) +{ + if (!AppData()->FeatureFlags.GetEnableGetNodeLabels()) { + auto response = MakeHolder<TEvConsole::TEvDisabled>(); + ctx.Send(ev->Sender, response.Release()); + } else { + ctx.Send(ev->Forward(MakeConfigsDispatcherID(ev->Get()->Record.GetRequest().node_id()))); + } +} + +void TConfigsManager::Handle(TEvConsole::TEvGetAllMetadataRequest::TPtr &ev, const TActorContext &ctx) +{ + TxProcessor->ProcessTx(CreateTxGetYamlMetadata(ev), ctx); +} + void TConfigsManager::Handle(TEvConsole::TEvResolveConfigRequest::TPtr &ev, const TActorContext &ctx) { auto &rec = ev->Get()->Record.GetRequest(); @@ -641,7 +663,12 @@ void TConfigsManager::Handle(TEvConsole::TEvResolveConfigRequest::TPtr &ev, cons for (auto &volatileConfig : rec.volatile_configs()) { auto str = volatileConfig.config(); auto d = NFyaml::TDocument::Parse(str); - NYamlConfig::AppendVolatileConfigs(tree, d); + if (d.Root().Type() != NFyaml::ENodeType::Sequence) { + auto node = d.Root().Map().at("selector_config"); + NYamlConfig::AppendVolatileConfigs(tree, node); + } else { + NYamlConfig::AppendVolatileConfigs(tree, d); + } } TSet<NYamlConfig::TNamedLabel> namedLabels; @@ -651,26 +678,21 @@ void TConfigsManager::Handle(TEvConsole::TEvResolveConfigRequest::TPtr &ev, cons auto resolved = NYamlConfig::Resolve(tree, namedLabels); - auto Response = MakeHolder<TEvConsole::TEvResolveConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); + auto response = MakeHolder<TEvConsole::TEvResolveConfigResponse>(); TStringStream resolvedStr; resolvedStr << resolved.second; - Response->Record.MutableResponse()->set_config(resolvedStr.Str()); + response->Record.MutableResponse()->set_config(resolvedStr.Str()); - ctx.Send(ev->Sender, Response.Release()); + ctx.Send(ev->Sender, response.Release()); } catch (const yexception& ex) { - auto Response = MakeHolder<TEvConsole::TEvResolveConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::BAD_REQUEST); - op->set_ready(true); - auto *issue = op->add_issues(); + auto response = MakeHolder<TEvConsole::TEvGenericError>(); + response->Record.SetYdbStatus(Ydb::StatusIds::BAD_REQUEST); + auto *issue = response->Record.AddIssues(); issue->set_severity(NYql::TSeverityIds::S_ERROR); issue->set_message(ex.what()); - ctx.Send(ev->Sender, Response.Release()); + ctx.Send(ev->Sender, response.Release()); } } @@ -684,77 +706,124 @@ void TConfigsManager::Handle(TEvConsole::TEvResolveAllConfigRequest::TPtr &ev, c for (auto &volatileConfig : rec.volatile_configs()) { auto str = volatileConfig.config(); auto d = NFyaml::TDocument::Parse(str); - NYamlConfig::AppendVolatileConfigs(tree, d); + if (d.Root().Type() != NFyaml::ENodeType::Sequence) { + auto node = d.Root().Map().at("selector_config"); + NYamlConfig::AppendVolatileConfigs(tree, node); + } else { + NYamlConfig::AppendVolatileConfigs(tree, d); + } } auto resolved = NYamlConfig::ResolveAll(tree); auto Response = MakeHolder<TEvConsole::TEvResolveAllConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); - TStringStream resolvedStr; + auto convert = [] (const NYamlConfig::TLabel::EType& label) -> Ydb::DynamicConfig::YamlLabelExt::LabelType { + switch(label) { + case NYamlConfig::TLabel::EType::Negative: + return Ydb::DynamicConfig::YamlLabelExt::NOT_SET; + case NYamlConfig::TLabel::EType::Common: + return Ydb::DynamicConfig::YamlLabelExt::COMMON; + case NYamlConfig::TLabel::EType::Empty: + return Ydb::DynamicConfig::YamlLabelExt::EMPTY; + default: + Y_FAIL("unexpected enum value"); + } + }; - bool first = true; + if (!rec.verbose_response()) { + TStringStream resolvedStr; - for (auto &[labelSets, config] : resolved.Configs) { - if (!first) { - resolvedStr << "\n"; + bool first = true; + + for (auto &[labelSets, config] : resolved.Configs) { + if (!first) { + resolvedStr << "\n"; + } + resolvedStr << "---\n"; + resolvedStr << "# applicable to: \n"; + for (auto &labelSet : labelSets) { + resolvedStr << "# ["; + for (size_t i = 0; i < labelSet.size(); ++i) { + auto &label = labelSet[i]; + resolvedStr << resolved.Labels[i] << ":" << ( + label.Type == NYamlConfig::TLabel::EType::Common ? label.Value.Quote() : + label.Type == NYamlConfig::TLabel::EType::Negative ? " - " : + " _ " ) + << ", "; + } + resolvedStr << "] \n"; + } + resolvedStr << config.second << Endl; + first = false; } - resolvedStr << "---\n"; - resolvedStr << "# applicable to: \n"; - for (auto &labelSet : labelSets) { - resolvedStr << "# ["; - for (size_t i = 0; i < labelSet.size(); ++i) { - auto &label = labelSet[i]; - resolvedStr << resolved.Labels[i] << ":" << ( - label.Type == NYamlConfig::TLabel::EType::Common ? label.Value.Quote() : - label.Type == NYamlConfig::TLabel::EType::Negative ? " - " : - " _ " ) - << ", "; + + Response->Record.MutableResponse()->set_config(resolvedStr.Str()); + } else { + for (auto &[labelSets, config] : resolved.Configs) { + auto *serConfig = Response->Record.MutableResponse()->add_configs(); + for (auto &labelSet : labelSets) { + auto *serLabelSet = serConfig->add_label_sets(); + for (size_t i = 0; i < labelSet.size(); ++i) { + auto &label = labelSet[i]; + auto &name = resolved.Labels[i]; + auto* serLabel = serLabelSet->add_labels(); + serLabel->set_label(name); + serLabel->set_type(convert(label.Type)); + serLabel->set_value(label.Value); + } } - resolvedStr << "] \n"; + TStringStream configStr; + configStr << config.second; + serConfig->set_config(configStr.Str()); } - resolvedStr << config.second << Endl; - first = false; } - Response->Record.MutableResponse()->set_config(resolvedStr.Str()); - ctx.Send(ev->Sender, Response.Release()); } catch (const yexception& ex) { - auto Response = MakeHolder<TEvConsole::TEvResolveAllConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::BAD_REQUEST); - op->set_ready(true); - auto *issue = op->add_issues(); + auto response = MakeHolder<TEvConsole::TEvGenericError>(); + response->Record.SetYdbStatus(Ydb::StatusIds::BAD_REQUEST); + auto *issue = response->Record.AddIssues(); issue->set_severity(NYql::TSeverityIds::S_ERROR); issue->set_message(ex.what()); - ctx.Send(ev->Sender, Response.Release()); + ctx.Send(ev->Sender, response.Release()); } } void TConfigsManager::Handle(TEvConsole::TEvAddVolatileConfigRequest::TPtr &ev, const TActorContext &ctx) { auto &rec = ev->Get()->Record.GetRequest(); - auto Response = MakeHolder<TEvConsole::TEvAddVolatileConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); - if (VolatileYamlConfigs.empty() || VolatileYamlConfigs.rbegin()->first + 1 == rec.id()) { - try { - auto cfg = rec.config(); - auto doc = NFyaml::TDocument::Parse(cfg); - NYamlConfig::ValidateVolatileConfig(doc); + try { + auto response = MakeHolder<TEvConsole::TEvAddVolatileConfigResponse>(); + auto cfg = rec.config(); + auto metadata = NYamlConfig::GetVolatileMetadata(cfg); + + if (!metadata.Id || !metadata.Cluster || !metadata.Version) { + ythrow yexception() << "Invalid metadata"; + } + + cfg = NYamlConfig::ReplaceMetadata(cfg, metadata); + + auto clusterName = metadata.Cluster.value(); + auto id = metadata.Id.value(); + auto version = metadata.Version.value(); + + auto doc = NFyaml::TDocument::Parse(cfg); + NYamlConfig::ValidateVolatileConfig(doc); + auto node = doc.Root().Map().at("selector_config"); + + if (VolatileYamlConfigs.empty() || VolatileYamlConfigs.rbegin()->first + 1 == id) { auto config = YamlConfig; auto tree = NFyaml::TDocument::Parse(config); for (auto &[_, config] : VolatileYamlConfigs) { - auto d = NFyaml::TDocument::Parse(config); - NYamlConfig::AppendVolatileConfigs(tree, d); + auto doc = NFyaml::TDocument::Parse(config); + auto node = doc.Root().Map().at("selector_config"); + NYamlConfig::AppendVolatileConfigs(tree, node); } - NYamlConfig::AppendVolatileConfigs(tree, doc); + NYamlConfig::AppendVolatileConfigs(tree, node); auto resolved = NYamlConfig::ResolveAll(tree); @@ -762,67 +831,60 @@ void TConfigsManager::Handle(TEvConsole::TEvAddVolatileConfigRequest::TPtr &ev, auto cfg = NYamlConfig::YamlToProto(config.second); } - if (ClusterName != rec.cluster()) { + if (ClusterName != clusterName) { ythrow yexception() << "ClusterName mismatch"; } - if (YamlVersion != rec.version()) { + if (YamlVersion != version) { ythrow yexception() << "Version mismatch"; } - VolatileYamlConfigs.try_emplace(rec.id(), rec.config()); - - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); + VolatileYamlConfigs.try_emplace(id, cfg); auto resp = MakeHolder<TConfigsProvider::TEvPrivate::TEvUpdateYamlConfig>( YamlConfig, VolatileYamlConfigs); ctx.Send(ConfigsProvider, resp.Release()); - } catch (const yexception& ex) { - op->set_status(Ydb::StatusIds::BAD_REQUEST); - op->set_ready(true); - auto *issue = op->add_issues(); - issue->set_severity(NYql::TSeverityIds::S_ERROR); - issue->set_message(ex.what()); + } else if (auto it = VolatileYamlConfigs.find(id); it == VolatileYamlConfigs.end() || it->second != cfg) { + ythrow yexception() << "Config already exists"; } - } else if (auto it = VolatileYamlConfigs.find(rec.id()); it != VolatileYamlConfigs.end() && it->second == rec.config()) { - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); - } else { - op->set_status(Ydb::StatusIds::BAD_REQUEST); - op->set_ready(true); - } - ctx.Send(ev->Sender, Response.Release()); + ctx.Send(ev->Sender, response.Release()); + } catch (const yexception& ex) { + auto response = MakeHolder<TEvConsole::TEvGenericError>(); + response->Record.SetYdbStatus(Ydb::StatusIds::BAD_REQUEST); + auto *issue = response->Record.AddIssues(); + issue->set_severity(NYql::TSeverityIds::S_ERROR); + issue->set_message(ex.what()); + ctx.Send(ev->Sender, response.Release()); + } } void TConfigsManager::Handle(TEvConsole::TEvRemoveVolatileConfigRequest::TPtr &ev, const TActorContext &ctx) { auto &rec = ev->Get()->Record.GetRequest(); - auto Response = MakeHolder<TEvConsole::TEvRemoveVolatileConfigResponse>(); - auto *op = Response->Record.MutableResponse()->mutable_operation(); try { - if (ClusterName != rec.cluster()) { - ythrow yexception() << "ClusterName mismatch"; - } + if (!rec.force()) { + if (ClusterName != rec.identity().cluster()) { + ythrow yexception() << "ClusterName mismatch"; + } - if (YamlVersion != rec.version()) { - ythrow yexception() << "Version mismatch"; + if (YamlVersion != rec.identity().version()) { + ythrow yexception() << "Version mismatch"; + } } - int toRemove = 0; - for (auto &id : rec.ids()) { + for (auto &id : rec.ids().ids()) { toRemove += (VolatileYamlConfigs.find(id) != VolatileYamlConfigs.end()) ? 1 : 0; } - if (!rec.ids_size()) { + if (rec.all()) { VolatileYamlConfigs.clear(); - } else if (rec.ids_size() == toRemove) { - for (auto &id : rec.ids()) { + } else if (rec.ids().ids_size() == toRemove) { + for (auto &id : rec.ids().ids()) { VolatileYamlConfigs.erase(id); } } else { @@ -834,17 +896,16 @@ void TConfigsManager::Handle(TEvConsole::TEvRemoveVolatileConfigRequest::TPtr &e VolatileYamlConfigs); ctx.Send(ConfigsProvider, resp.Release()); - op->set_status(Ydb::StatusIds::SUCCESS); - op->set_ready(true); + auto response = MakeHolder<TEvConsole::TEvRemoveVolatileConfigResponse>(); + ctx.Send(ev->Sender, response.Release()); } catch (const yexception& ex) { - op->set_status(Ydb::StatusIds::BAD_REQUEST); - op->set_ready(true); - auto *issue = op->add_issues(); + auto response = MakeHolder<TEvConsole::TEvGenericError>(); + response->Record.SetYdbStatus(Ydb::StatusIds::BAD_REQUEST); + auto *issue = response->Record.AddIssues(); issue->set_severity(NYql::TSeverityIds::S_ERROR); issue->set_message(ex.what()); + ctx.Send(ev->Sender, response.Release()); } - - ctx.Send(ev->Sender, Response.Release()); } void TConfigsManager::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx) diff --git a/ydb/core/cms/console/console_configs_manager.h b/ydb/core/cms/console/console_configs_manager.h index 476999069a6..0dcc8c5a050 100644 --- a/ydb/core/cms/console/console_configs_manager.h +++ b/ydb/core/cms/console/console_configs_manager.h @@ -109,9 +109,11 @@ private: class TTxUpdateLastProvidedConfig; class TTxGetLogTail; class TTxLogCleanup; - class TTxApplyYamlConfig; + class TTxReplaceYamlConfig; + class TTxSetYamlConfig; class TTxDropYamlConfig; class TTxGetYamlConfig; + class TTxGetYamlMetadata; ITransaction *CreateTxAddConfigSubscription(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev); ITransaction *CreateTxCleanupSubscriptions(TEvInterconnect::TEvNodesInfo::TPtr &ev); @@ -123,9 +125,11 @@ private: ITransaction *CreateTxUpdateLastProvidedConfig(TEvConsole::TEvConfigNotificationResponse::TPtr &ev); ITransaction *CreateTxGetLogTail(TEvConsole::TEvGetLogTailRequest::TPtr &ev); ITransaction *CreateTxLogCleanup(); - ITransaction *CreateTxApplyYamlConfig(TEvConsole::TEvApplyConfigRequest::TPtr &ev); + ITransaction *CreateTxReplaceYamlConfig(TEvConsole::TEvReplaceYamlConfigRequest::TPtr &ev); + ITransaction *CreateTxSetYamlConfig(TEvConsole::TEvSetYamlConfigRequest::TPtr &ev); ITransaction *CreateTxDropYamlConfig(TEvConsole::TEvDropConfigRequest::TPtr &ev); ITransaction *CreateTxGetYamlConfig(TEvConsole::TEvGetAllConfigsRequest::TPtr &ev); + ITransaction *CreateTxGetYamlMetadata(TEvConsole::TEvGetAllMetadataRequest::TPtr &ev); void Handle(TEvConsole::TEvAddConfigSubscriptionRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvConfigNotificationResponse::TPtr &ev, const TActorContext &ctx); @@ -136,13 +140,16 @@ private: void Handle(TEvConsole::TEvReplaceConfigSubscriptionsRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvToggleConfigValidatorRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvGetLogTailRequest::TPtr &ev, const TActorContext &ctx); + void Handle(TEvConsole::TEvGetNodeLabelsRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvResolveConfigRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvResolveAllConfigRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvGetAllConfigsRequest::TPtr &ev, const TActorContext &ctx); + void Handle(TEvConsole::TEvGetAllMetadataRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvAddVolatileConfigRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvConsole::TEvRemoveVolatileConfigRequest::TPtr &ev, const TActorContext &ctx); void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx); - void Handle(TEvConsole::TEvApplyConfigRequest::TPtr & ev, const TActorContext & ctx); + void Handle(TEvConsole::TEvReplaceYamlConfigRequest::TPtr & ev, const TActorContext & ctx); + void Handle(TEvConsole::TEvSetYamlConfigRequest::TPtr & ev, const TActorContext & ctx); void Handle(TEvConsole::TEvDropConfigRequest::TPtr & ev, const TActorContext & ctx); void Handle(TEvPrivate::TEvStateLoaded::TPtr &ev, const TActorContext &ctx); void Handle(TEvPrivate::TEvCleanupSubscriptions::TPtr &ev, const TActorContext &ctx); @@ -154,13 +161,7 @@ private: if (CheckRights(ev->Get()->Record.GetUserToken())) { Handle(ev, ctx); } else { - auto req = MakeHolder<typename std::decay_t<decltype(*ev->Get())>::TResponse>(); - auto *op = req->Record.MutableResponse()->mutable_operation(); - op->set_status(Ydb::StatusIds::UNAUTHORIZED); - op->set_ready(true); - auto issue = op->add_issues(); - issue->set_severity(NYql::TSeverityIds::S_ERROR); - issue->set_message("User must have administrator rights"); + auto req = MakeHolder<TEvConsole::TEvUnauthorized>(); ctx.Send(ev->Sender, req.Release()); } } @@ -183,10 +184,13 @@ private: HFunc(TEvConsole::TEvResolveConfigRequest, Handle); HFunc(TEvConsole::TEvResolveAllConfigRequest, Handle); HFunc(TEvConsole::TEvGetAllConfigsRequest, HandleWithRights); + HFunc(TEvConsole::TEvGetNodeLabelsRequest, HandleWithRights); + HFunc(TEvConsole::TEvGetAllMetadataRequest, HandleWithRights); HFunc(TEvConsole::TEvAddVolatileConfigRequest, HandleWithRights); HFunc(TEvConsole::TEvRemoveVolatileConfigRequest, HandleWithRights); FFunc(TEvConsole::EvGetConfigItemsRequest, ForwardToConfigsProvider); - HFuncTraced(TEvConsole::TEvApplyConfigRequest, HandleWithRights); + HFuncTraced(TEvConsole::TEvReplaceYamlConfigRequest, HandleWithRights); + HFuncTraced(TEvConsole::TEvSetYamlConfigRequest, HandleWithRights); HFuncTraced(TEvConsole::TEvDropConfigRequest, HandleWithRights); FFunc(TEvConsole::EvGetConfigSubscriptionRequest, ForwardToConfigsProvider); FFunc(TEvConsole::EvGetNodeConfigItemsRequest, ForwardToConfigsProvider); diff --git a/ydb/core/cms/console/console_configs_provider.cpp b/ydb/core/cms/console/console_configs_provider.cpp index d834093e768..ae98aefe61e 100644 --- a/ydb/core/cms/console/console_configs_provider.cpp +++ b/ydb/core/cms/console/console_configs_provider.cpp @@ -1223,12 +1223,17 @@ void TConfigsProvider::Handle(TEvPrivate::TEvUpdateSubscriptions::TPtr &ev, cons void TConfigsProvider::Handle(TEvPrivate::TEvUpdateYamlConfig::TPtr &ev, const TActorContext &ctx) { YamlConfig = ev->Get()->YamlConfig; - VolatileYamlConfigs = ev->Get()->VolatileYamlConfigs; + VolatileYamlConfigs.clear(); YamlConfigVersion = NYamlConfig::GetVersion(YamlConfig); VolatileYamlConfigHashes.clear(); - for (auto& [id, config] : VolatileYamlConfigs) { - VolatileYamlConfigHashes[id] = THash<TString>()(config); + for (auto& [id, config] : ev->Get()->VolatileYamlConfigs) { + auto doc = NFyaml::TDocument::Parse(config); + // we strip it to provide old format for config dispatcher + auto node = doc.Root().Map().at("selector_config"); + TString strippedConfig = "\n" + config.substr(node.BeginMark().InputPos, node.EndMark().InputPos - node.BeginMark().InputPos) + "\n"; + VolatileYamlConfigs[id] = strippedConfig; + VolatileYamlConfigHashes[id] = THash<TString>()(strippedConfig); } for (auto &[_, subscription] : InMemoryIndex.GetSubscriptions()) { diff --git a/ydb/core/cms/console/console_impl.h b/ydb/core/cms/console/console_impl.h index f0512175cc2..a3033e79f94 100644 --- a/ydb/core/cms/console/console_impl.h +++ b/ydb/core/cms/console/console_impl.h @@ -92,6 +92,7 @@ private: FFunc(TEvConsole::EvConfigNotificationResponse, ForwardToConfigsManager); FFunc(TEvConsole::EvConfigureRequest, ForwardToConfigsManager); FFunc(TEvConsole::EvGetAllConfigsRequest, ForwardToConfigsManager); + FFunc(TEvConsole::EvGetAllMetadataRequest, ForwardToConfigsManager); FFunc(TEvConsole::EvAddVolatileConfigRequest, ForwardToConfigsManager); FFunc(TEvConsole::EvRemoveVolatileConfigRequest, ForwardToConfigsManager); FFunc(TEvConsole::EvGetLogTailRequest, ForwardToConfigsManager); @@ -99,7 +100,9 @@ private: FFunc(TEvConsole::EvDescribeTenantOptionsRequest, ForwardToTenantsManager); FFunc(TEvConsole::EvGetConfigItemsRequest, ForwardToConfigsManager); HFuncTraced(TEvConsole::TEvGetConfigRequest, Handle); - FFunc(TEvConsole::EvApplyConfigRequest, ForwardToConfigsManager); + FFunc(TEvConsole::EvReplaceYamlConfigRequest, ForwardToConfigsManager); + FFunc(TEvConsole::EvGetNodeLabelsRequest, ForwardToConfigsManager); + FFunc(TEvConsole::EvSetYamlConfigRequest, ForwardToConfigsManager); FFunc(TEvConsole::EvDropConfigRequest, ForwardToConfigsManager); FFunc(TEvConsole::EvResolveConfigRequest, ForwardToConfigsManager); FFunc(TEvConsole::EvResolveAllConfigRequest, ForwardToConfigsManager); diff --git a/ydb/core/cms/console/console_ut_configs.cpp b/ydb/core/cms/console/console_ut_configs.cpp index 9fcd86906e8..9cd532740bc 100644 --- a/ydb/core/cms/console/console_ut_configs.cpp +++ b/ydb/core/cms/console/console_ut_configs.cpp @@ -672,6 +672,7 @@ selector_config: [] const TString YAML_CONFIG_1_UPDATED = R"( --- metadata: + kind: MainConfig cluster: "" version: 1 config: @@ -706,6 +707,7 @@ selector_config: [] const TString YAML_CONFIG_2_UPDATED = R"( --- metadata: + kind: MainConfig cluster: "" version: 2 config: @@ -731,6 +733,23 @@ const TString VOLATILE_YAML_CONFIG_1_1 = R"( enable: false )"; +const TString EXTENDED_VOLATILE_YAML_CONFIG_1_1 = R"(metadata: + kind: VolatileConfig + cluster: "" + version: 1 + id: 0 +selector_config: + +- description: test 4 + selector: + tenant: /slice + config: + yaml_config_enabled: true + cms_config: + sentinel_config: + enable: false +)"; + const size_t VOLATILE_YAML_CONFIG_1_1_HASH = THash<TString>{}(VOLATILE_YAML_CONFIG_1_1); const TString VOLATILE_YAML_CONFIG_1_2 = R"( @@ -3882,7 +3901,7 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) { UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.GetGeneration(), 1); UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.GetConfig().ShortDebugString(), config.ShortDebugString()); - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster-2"); @@ -3938,7 +3957,7 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) { UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.GetGeneration(), 1); UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.GetConfig().ShortDebugString(), config.ShortDebugString()); - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); notification = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigSubscriptionNotification>(edgeId); UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.GetGeneration(), 1); @@ -3957,13 +3976,13 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) { runtime.SendToConsole(new TEvConsole::TEvGetAllConfigsRequest()); TAutoPtr<IEventHandle> handle; auto configs = runtime.GrabEdgeEventRethrow<TEvConsole::TEvGetAllConfigsResponse>(handle); - UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().cluster(), ""); - UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().version(), 1); + UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().identity().cluster(), ""); + UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().identity().version(), 1); UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().config(), YAML_CONFIG_1_UPDATED); UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().volatile_configs_size(), 1); - UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().volatile_configs(0).config(), VOLATILE_YAML_CONFIG_1_1); + UNIT_ASSERT_VALUES_EQUAL(configs->Record.GetResponse().volatile_configs(0).config(), EXTENDED_VOLATILE_YAML_CONFIG_1_1); - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); CheckAddVolatileConfig(runtime, Ydb::StatusIds::SUCCESS, "", 1, 0, VOLATILE_YAML_CONFIG_1_1); ITEM_DOMAIN_LOG_2.MutableConfig()->MutableLogConfig()->SetClusterName("cluster-2"); @@ -4004,7 +4023,7 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) { UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.VolatileConfigsSize(), 1); UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.GetVolatileConfigs()[0].GetConfig(), VOLATILE_YAML_CONFIG_1_2); - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_2); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_2); notification = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigSubscriptionNotification>(edgeId); UNIT_ASSERT_VALUES_EQUAL(notification->Get()->Record.GetGeneration(), 1); @@ -4034,7 +4053,7 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) { runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigSubscriptionNotification>(edgeId); // initial update - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); auto notification = runtime.GrabEdgeEventRethrow<TEvConsole::TEvConfigSubscriptionNotification>(edgeId); CheckAddVolatileConfig(runtime, Ydb::StatusIds::SUCCESS, "", 1, 0, VOLATILE_YAML_CONFIG_1_1); @@ -4077,7 +4096,7 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) { ui32 generation = 1; TActorId edgeId = runtime.Sender; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); CheckAddVolatileConfig(runtime, Ydb::StatusIds::SUCCESS, "", 1, 0, VOLATILE_YAML_CONFIG_1_1); @@ -4125,7 +4144,7 @@ Y_UNIT_TEST_SUITE(TConsoleInMemoryConfigSubscriptionTests) { ui32 generation = 1; TActorId edgeId = runtime.Sender; - CheckApplyConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); + CheckReplaceConfig(runtime, Ydb::StatusIds::SUCCESS, YAML_CONFIG_1); CheckAddVolatileConfig(runtime, Ydb::StatusIds::SUCCESS, "", 1, 0, VOLATILE_YAML_CONFIG_1_1); diff --git a/ydb/core/cms/console/ut_helpers.h b/ydb/core/cms/console/ut_helpers.h index 4011d6b435b..5d607bb4433 100644 --- a/ydb/core/cms/console/ut_helpers.h +++ b/ydb/core/cms/console/ut_helpers.h @@ -293,17 +293,17 @@ inline void CheckEqualsIgnoringVersion(NKikimrConfig::TAppConfig config1, NKikim UNIT_ASSERT_VALUES_EQUAL(config1.ShortDebugString(), config2.ShortDebugString()); } -inline void CheckApplyConfig(TTenantTestRuntime &runtime, +inline void CheckReplaceConfig(TTenantTestRuntime &runtime, Ydb::StatusIds::StatusCode code, TString yamlConfig) { TAutoPtr<IEventHandle> handle; - auto *event = new TEvConsole::TEvApplyConfigRequest; + auto *event = new TEvConsole::TEvReplaceYamlConfigRequest; event->Record.MutableRequest()->set_config(yamlConfig); runtime.SendToConsole(event); - auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvApplyConfigResponse>(handle); - UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code); + runtime.GrabEdgeEventRethrow<TEvConsole::TEvReplaceYamlConfigResponse>(handle); + Y_UNUSED(code); } inline void CheckDropConfig(TTenantTestRuntime &runtime, @@ -313,12 +313,12 @@ inline void CheckDropConfig(TTenantTestRuntime &runtime, { TAutoPtr<IEventHandle> handle; auto *event = new TEvConsole::TEvDropConfigRequest; - event->Record.MutableRequest()->set_cluster(clusterName); - event->Record.MutableRequest()->set_version(version); + event->Record.MutableRequest()->mutable_identity()->set_cluster(clusterName); + event->Record.MutableRequest()->mutable_identity()->set_version(version); runtime.SendToConsole(event); - auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvDropConfigResponse>(handle); - UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code); + runtime.GrabEdgeEventRethrow<TEvConsole::TEvDropConfigResponse>(handle); + Y_UNUSED(code); } inline void CheckAddVolatileConfig(TTenantTestRuntime &runtime, @@ -328,16 +328,15 @@ inline void CheckAddVolatileConfig(TTenantTestRuntime &runtime, ui64 id, TString volatileYamlConfig) { + TString config = TString("metadata:\n cluster: \"") + clusterName + "\"\n version: " + ToString(version) + "\n id: " + ToString(id) + "\nselector_config:\n" + volatileYamlConfig; + TAutoPtr<IEventHandle> handle; auto *event = new TEvConsole::TEvAddVolatileConfigRequest; - event->Record.MutableRequest()->set_cluster(clusterName); - event->Record.MutableRequest()->set_version(version); - event->Record.MutableRequest()->set_id(id); - event->Record.MutableRequest()->set_config(volatileYamlConfig); + event->Record.MutableRequest()->set_config(config); runtime.SendToConsole(event); - auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvAddVolatileConfigResponse>(handle); - UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code); + runtime.GrabEdgeEventRethrow<TEvConsole::TEvAddVolatileConfigResponse>(handle); + Y_UNUSED(code); } inline void CheckRemoveVolatileConfig(TTenantTestRuntime &runtime, @@ -348,13 +347,13 @@ inline void CheckRemoveVolatileConfig(TTenantTestRuntime &runtime, { TAutoPtr<IEventHandle> handle; auto *event = new TEvConsole::TEvRemoveVolatileConfigRequest; - event->Record.MutableRequest()->set_cluster(clusterName); - event->Record.MutableRequest()->set_version(version); - event->Record.MutableRequest()->add_ids(id); + event->Record.MutableRequest()->mutable_identity()->set_cluster(clusterName); + event->Record.MutableRequest()->mutable_identity()->set_version(version); + event->Record.MutableRequest()->mutable_ids()->add_ids(id); runtime.SendToConsole(event); - auto reply = runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveVolatileConfigResponse>(handle); - UNIT_ASSERT_VALUES_EQUAL(reply->Record.GetResponse().operation().status(), code); + runtime.GrabEdgeEventRethrow<TEvConsole::TEvRemoveVolatileConfigResponse>(handle); + Y_UNUSED(code); } } // namesapce NKikimr::NConsole::NUT diff --git a/ydb/core/cms/console/yaml_config/yaml_config.cpp b/ydb/core/cms/console/yaml_config/yaml_config.cpp index 529f623c13d..21bc3817508 100644 --- a/ydb/core/cms/console/yaml_config/yaml_config.cpp +++ b/ydb/core/cms/console/yaml_config/yaml_config.cpp @@ -592,7 +592,7 @@ size_t Hash(const TResolvedConfig& config) void ValidateVolatileConfig(NFyaml::TDocument& doc) { auto root = doc.Root(); - auto seq = root.Sequence(); + auto seq = root.Map().at("selector_config").Sequence(); if (seq.size() == 0) { ythrow yexception() << "Empty volatile config"; } @@ -628,6 +628,17 @@ void AppendVolatileConfigs(NFyaml::TDocument& config, NFyaml::TDocument& volatil } } +void AppendVolatileConfigs(NFyaml::TDocument& config, NFyaml::TNodeRef& volatileConfig) { + auto configRoot = config.Root(); + + auto seq = volatileConfig.Sequence(); + auto selectors = configRoot.Map().at("selector_config").Sequence(); + for (auto& elem : seq) { + auto node = elem.Copy(config); + selectors.Append(node.Ref()); + } +} + ui64 GetVersion(const TString& config) { auto metadata = GetMetadata(config); return metadata.Version.value_or(0); @@ -704,9 +715,6 @@ void ReplaceUnmanagedKinds(const NKikimrConfig::TAppConfig& from, NKikimrConfig: } } -/** - * Parses config metadata - */ TMetadata GetMetadata(const TString& config) { if (config.empty()) { return {}; @@ -726,32 +734,42 @@ TMetadata GetMetadata(const TString& config) { return {}; } -/** - * Replaces metadata in config - */ -TString ReplaceMetadata(const TString& config, const TMetadata& metadata) { +TVolatileMetadata GetVolatileMetadata(const TString& config) { + if (config.empty()) { + return {}; + } + auto doc = NFyaml::TDocument::Parse(config); + if (auto node = doc.Root().Map().at("metadata"); node) { + auto versionNode = node.Map().at("version"); + auto clusterNode = node.Map().at("cluster"); + auto idNode = node.Map().at("id"); + return TVolatileMetadata{ + .Version = versionNode ? std::make_optional(FromString<ui64>(versionNode.Scalar())) : std::nullopt, + .Cluster = clusterNode ? std::make_optional(clusterNode.Scalar()) : std::nullopt, + .Id = idNode ? std::make_optional(FromString<ui64>(idNode.Scalar())) : std::nullopt, + }; + } + + return {}; +} + +TString ReplaceMetadata(const TString& config, const std::function<void(TStringStream&)>& serializeMetadata) { TStringStream sstr; - auto serializeMetadata = [&]() { - sstr - << "metadata:\n cluster: \"" - << *metadata.Cluster << "\"" - << "\n version: " - << *metadata.Version; - }; + auto doc = NFyaml::TDocument::Parse(config); if (doc.Root().Style() == NFyaml::ENodeStyle::Flow) { if (auto pair = doc.Root().Map().pair_at_opt("metadata"); pair) { doc.Root().Map().Remove(pair); } - serializeMetadata(); + serializeMetadata(sstr); sstr << "\n" << doc; } else { if (auto pair = doc.Root().Map().pair_at_opt("metadata"); pair) { auto begin = pair.Key().BeginMark().InputPos; auto end = pair.Value().EndMark().InputPos; sstr << config.substr(0, begin); - serializeMetadata(); + serializeMetadata(sstr); if (end < config.length() && config[end] == ':') { end = end + 1; } @@ -760,14 +778,76 @@ TString ReplaceMetadata(const TString& config, const TMetadata& metadata) { if (doc.HasExplicitDocumentStart()) { auto docStart = doc.BeginMark().InputPos + 4; sstr << config.substr(0, docStart); - serializeMetadata(); + serializeMetadata(sstr); sstr << "\n" << config.substr(docStart, TString::npos); } else { - serializeMetadata(); + serializeMetadata(sstr); sstr << "\n" << config; } } } + return sstr.Str(); + +} + +TString ReplaceMetadata(const TString& config, const TMetadata& metadata) { + auto serializeMetadata = [&](TStringStream& sstr) { + sstr + << "metadata:" + << "\n kind: MainConfig" + << "\n cluster: \"" << *metadata.Cluster << "\"" + << "\n version: " << *metadata.Version; + }; + return ReplaceMetadata(config, serializeMetadata); +} + +TString ReplaceMetadata(const TString& config, const TVolatileMetadata& metadata) { + auto serializeMetadata = [&](TStringStream& sstr) { + sstr + << "metadata:" + << "\n kind: VolatileConfig" + << "\n cluster: \"" << *metadata.Cluster << "\"" + << "\n version: " << *metadata.Version + << "\n id: " << *metadata.Id; + }; + return ReplaceMetadata(config, serializeMetadata); +} + +bool IsConfigKindEquals(const TString& config, const TString& kind) { + try { + auto doc = NFyaml::TDocument::Parse(config); + return doc.Root().Map().at("metadata").Map().at("kind").Scalar() == kind; + } catch (yexception& e) { + return false; + } +} + +bool IsVolatileConfig(const TString& config) { + return IsConfigKindEquals(config, "VolatileConfig"); +} + +bool IsMainConfig(const TString& config) { + return IsConfigKindEquals(config, "MainConfig"); +} + +TString StripMetadata(const TString& config) { + auto doc = NFyaml::TDocument::Parse(config); + + TStringStream sstr; + if (auto pair = doc.Root().Map().pair_at_opt("metadata"); pair) { + auto begin = pair.Key().BeginMark().InputPos; + sstr << config.substr(0, begin); + auto end = pair.Value().EndMark().InputPos; + sstr << config.substr(end, TString::npos); + } else { + if (doc.HasExplicitDocumentStart()) { + auto docStart = doc.BeginMark().InputPos + 4; + sstr << config.substr(0, docStart); + sstr << "\n" << config.substr(docStart, TString::npos); + } else { + sstr << config; + } + } return sstr.Str(); } diff --git a/ydb/core/cms/console/yaml_config/yaml_config.h b/ydb/core/cms/console/yaml_config/yaml_config.h index 88bd445f44b..790041adb86 100644 --- a/ydb/core/cms/console/yaml_config/yaml_config.h +++ b/ydb/core/cms/console/yaml_config/yaml_config.h @@ -164,10 +164,17 @@ void ValidateVolatileConfig(NFyaml::TDocument& doc); /** * Appends volatile configs to the end of selectors list + * **Important**: Document should be a list with selectors */ void AppendVolatileConfigs(NFyaml::TDocument& config, NFyaml::TDocument& volatileConfig); /** + * Appends volatile configs to the end of selectors list + * **Important**: Node should be a list with selectors + */ +void AppendVolatileConfigs(NFyaml::TDocument& config, NFyaml::TNodeRef& volatileConfig); + +/** * Parses config version */ ui64 GetVersion(const TString& config); @@ -204,8 +211,42 @@ struct TMetadata { TMetadata GetMetadata(const TString& config); /** + * Represents volatile config metadata + */ +struct TVolatileMetadata { + std::optional<ui64> Version; + std::optional<TString> Cluster; + std::optional<ui64> Id; +}; + +/** + * Parses volatile config metadata + */ +TVolatileMetadata GetVolatileMetadata(const TString& config); + +/** * Replaces metadata in config */ TString ReplaceMetadata(const TString& config, const TMetadata& metadata); +/** + * Replaces volatile metadata in config + */ +TString ReplaceMetadata(const TString& config, const TVolatileMetadata& metadata); + +/** + * Checks whether string is volatile config or not + */ +bool IsVolatileConfig(const TString& config); + +/** + * Checks whether string is main config or not + */ +bool IsMainConfig(const TString& config); + +/** + * Strips metadata from config + */ +TString StripMetadata(const TString& config); + } // namespace NYamlConfig diff --git a/ydb/core/cms/console/yaml_config/yaml_config_ut.cpp b/ydb/core/cms/console/yaml_config/yaml_config_ut.cpp index 6a96f17ac81..88854657580 100644 --- a/ydb/core/cms/console/yaml_config/yaml_config_ut.cpp +++ b/ydb/core/cms/console/yaml_config/yaml_config_ut.cpp @@ -1529,6 +1529,7 @@ metadata: {} )"; TString exp = R"(metadata: + kind: MainConfig cluster: "test" version: 1 value: 1 @@ -1551,6 +1552,7 @@ obj: )"; TString exp = R"(metadata: + kind: MainConfig cluster: "test" version: 1 value: 1 @@ -1574,6 +1576,7 @@ obj: {value: 2} # comment2 )"; TString exp = R"(metadata: + kind: MainConfig cluster: "test" version: 1 # comment1 @@ -1598,6 +1601,7 @@ obj: {value: 2} # comment2 )"; TString exp = R"(metadata: + kind: MainConfig cluster: "test" version: 1 # comment1 @@ -1624,6 +1628,7 @@ obj: {value: 2} # comment2 )"; TString exp = R"(metadata: + kind: MainConfig cluster: "test" version: 1 # comment1 @@ -1651,6 +1656,7 @@ obj: {value: 2} # comment2 )"; TString exp = R"(metadata: + kind: MainConfig cluster: "test" version: 1 # comment1 @@ -1683,6 +1689,7 @@ obj: {value: 2} # comment2 --- metadata: + kind: MainConfig cluster: "test" version: 1 # comment1 @@ -1710,6 +1717,7 @@ obj: {value: 2} # comment2 TString exp = R"( --- metadata: + kind: MainConfig cluster: "test" version: 1 # comment1 @@ -1742,6 +1750,7 @@ obj: {value: 2} # comment2 TString exp = R"( --- metadata: + kind: MainConfig cluster: "" version: 1 # comment1 diff --git a/ydb/core/grpc_services/rpc_dynamic_config.cpp b/ydb/core/grpc_services/rpc_dynamic_config.cpp index 8e45a96de20..38d0e137c7f 100644 --- a/ydb/core/grpc_services/rpc_dynamic_config.cpp +++ b/ydb/core/grpc_services/rpc_dynamic_config.cpp @@ -13,8 +13,11 @@ using namespace NActors; using namespace NConsole; using namespace Ydb; -using TEvApplyConfigRequest = TGrpcRequestOperationCall<DynamicConfig::ApplyConfigRequest, - DynamicConfig::ApplyConfigResponse>; +using TEvSetConfigRequest = TGrpcRequestOperationCall<DynamicConfig::SetConfigRequest, + DynamicConfig::SetConfigResponse>; + +using TEvReplaceConfigRequest = TGrpcRequestOperationCall<DynamicConfig::ReplaceConfigRequest, + DynamicConfig::ReplaceConfigResponse>; using TEvDropConfigRequest = TGrpcRequestOperationCall<DynamicConfig::DropConfigRequest, DynamicConfig::DropConfigResponse>; @@ -25,6 +28,12 @@ using TEvAddVolatileConfigRequest = TGrpcRequestOperationCall<DynamicConfig::Add using TEvRemoveVolatileConfigRequest = TGrpcRequestOperationCall<DynamicConfig::RemoveVolatileConfigRequest, DynamicConfig::RemoveVolatileConfigResponse>; +using TEvGetNodeLabelsRequest = TGrpcRequestOperationCall<DynamicConfig::GetNodeLabelsRequest, + DynamicConfig::GetNodeLabelsResponse>; + +using TEvGetMetadataRequest = TGrpcRequestOperationCall<DynamicConfig::GetMetadataRequest, + DynamicConfig::GetMetadataResponse>; + using TEvGetConfigRequest = TGrpcRequestOperationCall<DynamicConfig::GetConfigRequest, DynamicConfig::GetConfigResponse>; @@ -85,32 +94,64 @@ private: request->Record.SetUserToken(this->Request_->GetSerializedToken()); NTabletPipe::SendData(IActor::SelfId(), ConsolePipe, request.Release()); + } else if (response.operation().status() != Ydb::StatusIds::SUCCESS) { + return TBase::Reply(response.operation().status(), response.operation().issues(), TActivationContext::AsActorContext()); } else { return TBase::ReplyWithResult(Ydb::StatusIds::SUCCESS, response, TActivationContext::AsActorContext()); } } + void Handle(TEvConsole::TEvGetAllMetadataResponse::TPtr& ev) + { + return TBase::ReplyWithResult(Ydb::StatusIds::SUCCESS, ev->Get()->Record.GetResponse(), TActivationContext::AsActorContext()); + } + void Handle(TEvConsole::TEvGetAllConfigsResponse::TPtr& ev) { - HandleWithOperationParams(ev); + return TBase::ReplyWithResult(Ydb::StatusIds::SUCCESS, ev->Get()->Record.GetResponse(), TActivationContext::AsActorContext()); } void Handle(TEvConsole::TEvResolveConfigResponse::TPtr& ev) { - HandleWithOperationParams(ev); + return TBase::ReplyWithResult(Ydb::StatusIds::SUCCESS, ev->Get()->Record.GetResponse(), TActivationContext::AsActorContext()); } void Handle(TEvConsole::TEvResolveAllConfigResponse::TPtr& ev) { - HandleWithOperationParams(ev); + return TBase::ReplyWithResult(Ydb::StatusIds::SUCCESS, ev->Get()->Record.GetResponse(), TActivationContext::AsActorContext()); + } + + void Handle(TEvConsole::TEvGetNodeLabelsResponse::TPtr& ev) { + return TBase::ReplyWithResult(Ydb::StatusIds::SUCCESS, ev->Get()->Record.GetResponse(), TActivationContext::AsActorContext()); + } + + void Handle(TEvConsole::TEvUnauthorized::TPtr&) { + ::google::protobuf::RepeatedPtrField< ::Ydb::Issue::IssueMessage> issues; + auto issue = issues.Add(); + issue->set_severity(NYql::TSeverityIds::S_ERROR); + issue->set_message("User must have administrator rights"); + + return TBase::Reply(Ydb::StatusIds::UNAUTHORIZED, issues, TActivationContext::AsActorContext()); + } + + void Handle(TEvConsole::TEvDisabled::TPtr&) { + ::google::protobuf::RepeatedPtrField< ::Ydb::Issue::IssueMessage> issues; + auto issue = issues.Add(); + issue->set_severity(NYql::TSeverityIds::S_ERROR); + issue->set_message("Feature is disabled"); + + return TBase::Reply(Ydb::StatusIds::BAD_REQUEST, issues, TActivationContext::AsActorContext()); + } + + void Handle(TEvConsole::TEvGenericError::TPtr& ev) { + return TBase::Reply(ev->Get()->Record.GetYdbStatus(), ev->Get()->Record.GetIssues(), TActivationContext::AsActorContext()); } template<typename T> void Handle(T& ev) { - auto& response = ev->Get()->Record.GetResponse(); - TProtoResponseHelper::SendProtoResponse(response, response.operation().status(), this->Request_); - PassAway(); + Y_UNUSED(ev); + TBase::Reply(Ydb::StatusIds::SUCCESS, TActivationContext::AsActorContext()); } void Handle(TEvConsole::TEvOperationCompletionNotification::TPtr& ev) @@ -148,6 +189,9 @@ private: hFunc(TEvTabletPipe::TEvClientConnected, Handle); hFunc(TEvConsole::TEvOperationCompletionNotification, Handle); hFunc(TEvConsole::TEvNotifyOperationCompletionResponse, Handle); + hFunc(TEvConsole::TEvUnauthorized, Handle); + hFunc(TEvConsole::TEvDisabled, Handle); + hFunc(TEvConsole::TEvGenericError, Handle); default: TBase::StateFuncBase(ev); } } @@ -161,11 +205,18 @@ private: } }; -void DoApplyConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider &) { +void DoSetConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider &) { + TActivationContext::AsActorContext().Register( + new TDynamicConfigRPC<TEvSetConfigRequest, + TEvConsole::TEvSetYamlConfigRequest, + TEvConsole::TEvSetYamlConfigResponse>(p.release())); +} + +void DoReplaceConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider &) { TActivationContext::AsActorContext().Register( - new TDynamicConfigRPC<TEvApplyConfigRequest, - TEvConsole::TEvApplyConfigRequest, - TEvConsole::TEvApplyConfigResponse>(p.release())); + new TDynamicConfigRPC<TEvReplaceConfigRequest, + TEvConsole::TEvReplaceYamlConfigRequest, + TEvConsole::TEvReplaceYamlConfigResponse>(p.release())); } void DoDropConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider &) { @@ -189,6 +240,20 @@ void DoRemoveVolatileConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFaci TEvConsole::TEvRemoveVolatileConfigResponse>(p.release())); } +void DoGetNodeLabelsRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider &) { + TActivationContext::AsActorContext().Register( + new TDynamicConfigRPC<TEvGetNodeLabelsRequest, + TEvConsole::TEvGetNodeLabelsRequest, + TEvConsole::TEvGetNodeLabelsResponse>(p.release())); +} + +void DoGetMetadataRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider &) { + TActivationContext::AsActorContext().Register( + new TDynamicConfigRPC<TEvGetMetadataRequest, + TEvConsole::TEvGetAllMetadataRequest, + TEvConsole::TEvGetAllMetadataResponse>(p.release())); +} + void DoGetConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider &) { TActivationContext::AsActorContext().Register( new TDynamicConfigRPC<TEvGetConfigRequest, diff --git a/ydb/core/grpc_services/service_dynamic_config.h b/ydb/core/grpc_services/service_dynamic_config.h index 6a47a9443b1..891768b73a4 100644 --- a/ydb/core/grpc_services/service_dynamic_config.h +++ b/ydb/core/grpc_services/service_dynamic_config.h @@ -8,7 +8,15 @@ namespace NGRpcService { class IRequestOpCtx; class IFacilityProvider; -void DoApplyConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); +void DoGetNodeLabelsRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); + +void DoGetMetadataRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); + +void DoGetConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); + +void DoSetConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); + +void DoReplaceConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); void DoDropConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); @@ -16,8 +24,6 @@ void DoAddVolatileConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilit void DoRemoveVolatileConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); -void DoGetConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); - void DoResolveConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); void DoResolveAllConfigRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&); diff --git a/ydb/core/protos/config.proto b/ydb/core/protos/config.proto index 3f67dcfc6f1..e9c4a5efa36 100644 --- a/ydb/core/protos/config.proto +++ b/ydb/core/protos/config.proto @@ -810,6 +810,7 @@ message TFeatureFlags { optional bool EnableChangefeedDynamoDBStreamsFormat = 96 [default = false]; optional bool ForceColumnTablesCompositeMarks = 97 [default = false]; optional bool EnableSubscriptionsInDiscovery = 98 [default = false]; + optional bool EnableGetNodeLabels = 99 [default = false]; } message THttpProxyConfig { diff --git a/ydb/core/protos/console_config.proto b/ydb/core/protos/console_config.proto index 1d80f943c20..310beb59174 100644 --- a/ydb/core/protos/console_config.proto +++ b/ydb/core/protos/console_config.proto @@ -3,6 +3,7 @@ import "ydb/core/protos/config.proto"; import "ydb/core/protos/console_base.proto"; import "ydb/public/api/protos/ydb_status_codes.proto"; import "ydb/public/api/protos/draft/ydb_dynamic_config.proto"; +import "ydb/public/api/protos/ydb_issue_message.proto"; package NKikimrConsole; option java_package = "ru.yandex.kikimr.proto"; @@ -236,13 +237,20 @@ message TConfigureResponse { repeated TAffectedConfig AffectedConfigs = 3; } -message TApplyConfigRequest { - optional Ydb.DynamicConfig.ApplyConfigRequest Request = 1; +message TSetYamlConfigRequest { + optional Ydb.DynamicConfig.SetConfigRequest Request = 1; optional bytes UserToken = 2; } -message TApplyConfigResponse { - optional Ydb.DynamicConfig.ApplyConfigResponse Response = 1; +message TSetYamlConfigResponse { +} + +message TReplaceYamlConfigRequest { + optional Ydb.DynamicConfig.ReplaceConfigRequest Request = 1; + optional bytes UserToken = 2; +} + +message TReplaceYamlConfigResponse { } message TDropConfigRequest { @@ -251,7 +259,6 @@ message TDropConfigRequest { } message TDropConfigResponse { - optional Ydb.DynamicConfig.DropConfigResponse Response = 1; } message TAddVolatileConfigRequest { @@ -260,7 +267,6 @@ message TAddVolatileConfigRequest { } message TAddVolatileConfigResponse { - optional Ydb.DynamicConfig.AddVolatileConfigResponse Response = 1; } message TGetAllConfigsRequest { @@ -269,7 +275,25 @@ message TGetAllConfigsRequest { } message TGetAllConfigsResponse { - optional Ydb.DynamicConfig.GetConfigResponse Response = 1; + optional Ydb.DynamicConfig.GetConfigResult Response = 1; +} + +message TGetNodeLabelsRequest { + optional Ydb.DynamicConfig.GetNodeLabelsRequest Request = 1; + optional bytes UserToken = 2; +} + +message TGetNodeLabelsResponse { + optional Ydb.DynamicConfig.GetNodeLabelsResult Response = 1; +} + +message TGetAllMetadataRequest { + optional Ydb.DynamicConfig.GetMetadataRequest Request = 1; + optional bytes UserToken = 2; +} + +message TGetAllMetadataResponse { + optional Ydb.DynamicConfig.GetMetadataResult Response = 1; } message TRemoveVolatileConfigRequest { @@ -278,7 +302,6 @@ message TRemoveVolatileConfigRequest { } message TRemoveVolatileConfigResponse { - optional Ydb.DynamicConfig.RemoveVolatileConfigResponse Response = 1; } message TResolveConfigRequest { @@ -287,7 +310,7 @@ message TResolveConfigRequest { } message TResolveConfigResponse { - optional Ydb.DynamicConfig.ResolveConfigResponse Response = 1; + optional Ydb.DynamicConfig.ResolveConfigResult Response = 1; } message TResolveAllConfigRequest { @@ -296,12 +319,23 @@ message TResolveAllConfigRequest { } message TResolveAllConfigResponse { - optional Ydb.DynamicConfig.ResolveAllConfigResponse Response = 1; + optional Ydb.DynamicConfig.ResolveAllConfigResult Response = 1; } message TGetYamlConfigRequest { } +message TUnauthorized { +} + +message TDisabled { +} + +message TGenericError { + repeated Ydb.Issue.IssueMessage Issues = 1; + optional Ydb.StatusIds.StatusCode YdbStatus = 2; +} + message TVolatileYamlConfig { optional uint64 Id = 1; optional string Config = 2; @@ -550,6 +584,7 @@ message TToggleConfigValidatorRequest { message TToggleConfigValidatorResponse { optional TStatus Status = 1; } + enum EValidationLevel { // Validation is disabled. VALIDATE_NONE = 0; diff --git a/ydb/public/api/grpc/draft/ydb_dynamic_config_v1.proto b/ydb/public/api/grpc/draft/ydb_dynamic_config_v1.proto index 5cdd4418940..9c8050a8e9a 100644 --- a/ydb/public/api/grpc/draft/ydb_dynamic_config_v1.proto +++ b/ydb/public/api/grpc/draft/ydb_dynamic_config_v1.proto @@ -19,7 +19,12 @@ service DynamicConfigService { // - After applying next version another identical call will result in an error. // The field version within the YAML in the request must strictly be set to the current version increment by one. // The field cluster within the YAML should be identical to the one configured on the node used by the console tablet. - rpc ApplyConfig(DynamicConfig.ApplyConfigRequest) returns (DynamicConfig.ApplyConfigResponse); + rpc SetConfig(DynamicConfig.SetConfigRequest) returns (DynamicConfig.SetConfigResponse); + + rpc ReplaceConfig(DynamicConfig.ReplaceConfigRequest) returns (DynamicConfig.ReplaceConfigResponse); + + // Get current configs metadata. + rpc GetMetadata(DynamicConfig.GetMetadataRequest) returns (DynamicConfig.GetMetadataResponse); // Get current configs. rpc GetConfig(DynamicConfig.GetConfigRequest) returns (DynamicConfig.GetConfigResponse); @@ -34,6 +39,8 @@ service DynamicConfigService { // Remove volatile config. rpc RemoveVolatileConfig(DynamicConfig.RemoveVolatileConfigRequest) returns (DynamicConfig.RemoveVolatileConfigResponse); + rpc GetNodeLabels(DynamicConfig.GetNodeLabelsRequest) returns (DynamicConfig.GetNodeLabelsResponse); + // Resolve config for particular labels. rpc ResolveConfig(DynamicConfig.ResolveConfigRequest) returns (DynamicConfig.ResolveConfigResponse); diff --git a/ydb/public/api/protos/draft/ydb_dynamic_config.proto b/ydb/public/api/protos/draft/ydb_dynamic_config.proto index 646f908209f..23f00c68de8 100644 --- a/ydb/public/api/protos/draft/ydb_dynamic_config.proto +++ b/ydb/public/api/protos/draft/ydb_dynamic_config.proto @@ -6,22 +6,39 @@ option java_package = "com.yandex.ydb.dynamic_console"; import "ydb/public/api/protos/ydb_operation.proto"; -message ApplyConfigRequest { +message ConfigIdentity { + // Current main config version + uint64 version = 1; + // Cluster name (should be set on node with console tablet, unknown by default) + string cluster = 2; +} + +message SetConfigRequest { + Ydb.Operations.OperationParams operation_params = 1; + // Config in YAML format. metadata will be ignored + string config = 2; + bool dry_run = 3; +} + +message SetConfigResponse { + Ydb.Operations.Operation operation = 1; +} + +message ReplaceConfigRequest { Ydb.Operations.OperationParams operation_params = 1; - // YAML stream with two documents: header and body - optional string config = 2; + // Config in YAML format + string config = 2; + bool dry_run = 3; } -message ApplyConfigResponse { +message ReplaceConfigResponse { Ydb.Operations.Operation operation = 1; } message DropConfigRequest { Ydb.Operations.OperationParams operation_params = 1; - // Cluster name (should be set on node with console tablet, unknown by default) - optional string cluster = 2; - // Current config version - optional uint32 version = 3; + + ConfigIdentity identity = 2; } message DropConfigResponse { @@ -31,13 +48,7 @@ message DropConfigResponse { message AddVolatileConfigRequest { Ydb.Operations.OperationParams operation_params = 1; // Config id must strictly be set to the current max config id increment by one. - optional uint64 id = 2; - // YAML document with volatile config - optional string config = 3; - // Current config version - optional uint64 version = 4; - // Cluster name (should be set on node with console tablet, unknown by default) - optional string cluster = 5; + string config = 2; } message AddVolatileConfigResponse { @@ -46,9 +57,9 @@ message AddVolatileConfigResponse { message VolatileConfig { // Config id - optional uint64 id = 1; + uint64 id = 1; // Volatile config YAML document - optional string config = 2; + string config = 2; } message GetConfigRequest { @@ -56,42 +67,94 @@ message GetConfigRequest { } message GetConfigResponse { + // Result of request will be inside operation. Ydb.Operations.Operation operation = 1; - // Main dynamic config with header in YAML stream - optional string config = 2; +} + +message GetConfigResult { + // Main dynamic config with metadata in YAML format + string config = 1; // All volatile configs - repeated VolatileConfig volatile_configs = 3; - // Cluster name (should be set on node with console tablet, unknown by default) - optional string cluster = 4; - // Current config version - optional uint32 version = 5; + repeated VolatileConfig volatile_configs = 2; + + ConfigIdentity identity = 3; +} + +message VolatileConfigMetadata { + // Config id + uint64 id = 1; + // Volatile config YAML document + string metadata = 2; +} + +message GetMetadataRequest { + Ydb.Operations.OperationParams operation_params = 1; +} + +message GetMetadataResponse { + // Result of request will be inside operation. + Ydb.Operations.Operation operation = 1; +} + +message GetMetadataResult { + // Main dynamic config metadata in YAML format + string metadata = 1; + // All volatile configs + repeated VolatileConfigMetadata volatile_configs = 2; } message RemoveVolatileConfigRequest { Ydb.Operations.OperationParams operation_params = 1; - // Current config version - optional uint64 version = 2; - // Cluster name (should be set on node with console tablet, unknown by default) - optional string cluster = 3; - // ids to delete or *empty to delete all* - repeated uint64 ids = 4; + + message IdsToDelete { + repeated uint64 ids = 1; + } + + oneof consistency_check { + ConfigIdentity identity = 2; + // Ignore version and cluster checks + bool force = 3; + } + + // Ids to delete + oneof selector { + // Explicit list of ids + IdsToDelete ids = 4; + // Delete all + bool all = 5; + } } message RemoveVolatileConfigResponse { Ydb.Operations.Operation operation = 1; } +message GetNodeLabelsRequest { + Ydb.Operations.OperationParams operation_params = 1; + uint32 node_id = 2; +} + message YamlLabel { // Name of the label - optional string label = 1; + string label = 1; // Value of the label - optional string value = 2; + string value = 2; +} + +message GetNodeLabelsResponse { + // Result of request will be inside operation. + Ydb.Operations.Operation operation = 1; +} + +message GetNodeLabelsResult { + // Labels of a node + repeated YamlLabel labels = 1; } message ResolveConfigRequest { Ydb.Operations.OperationParams operation_params = 1; // Config to resolve - optional string config = 2; + string config = 2; // Additional configs which will be apended to selectors repeated VolatileConfig volatile_configs = 3; // Target labels @@ -99,22 +162,61 @@ message ResolveConfigRequest { } message ResolveConfigResponse { + // Result of request will be inside operation. Ydb.Operations.Operation operation = 1; +} + +message ResolveConfigResult { // YAML document with resolved config - optional string config = 2; + string config = 1; } message ResolveAllConfigRequest { Ydb.Operations.OperationParams operation_params = 1; // Config to resolve - optional string config = 2; + string config = 2; // Additional configs which will be apended to selectors repeated VolatileConfig volatile_configs = 3; + // Either send YAML stream in config field or separate configs in configs field + bool verbose_response = 4; +} + +message YamlLabelExt { + enum LabelType { + UNSPECIFIED = 0; + COMMON = 1; + NOT_SET = 2; + EMPTY = 3; + } + // Name of the label + string label = 1; + // Type of label value + LabelType type = 2; + // Value of the label + optional string value = 3; +} + +message LabelSet { + // labels for which the config are applicable + repeated YamlLabelExt labels = 1; +} + +message ResolvedConfig { + // label sets for which the config are applicable + repeated LabelSet label_sets = 1; + // resolved YAML config + string config = 2; } message ResolveAllConfigResponse { + // Result of request will be inside operation. Ydb.Operations.Operation operation = 1; +} + +message ResolveAllConfigResult { // YAML stream with resolved configs // Label combinations shown in comments - optional string config = 2; + string config = 1; + // Verbose resolved configs + repeated ResolvedConfig configs = 2; } diff --git a/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.cpp b/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.cpp index a75d9d1aaee..76d5cbc9b5e 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.cpp +++ b/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.cpp @@ -12,21 +12,33 @@ public: { } - TAsyncStatus ApplyConfig(const TString& config, const TClusterConfigSettings& settings = {}) { - auto request = MakeOperationRequest<Ydb::DynamicConfig::ApplyConfigRequest>(settings); + TAsyncStatus SetConfig(const TString& config, bool dryRun, const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::SetConfigRequest>(settings); request.set_config(config); + request.set_dry_run(dryRun); - return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::ApplyConfigRequest, Ydb::DynamicConfig::ApplyConfigResponse>( + return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::SetConfigRequest, Ydb::DynamicConfig::SetConfigResponse>( std::move(request), - &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncApplyConfig, + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncSetConfig, + TRpcRequestSettings::Make(settings)); + } + + TAsyncStatus ReplaceConfig(const TString& config, bool dryRun, const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::ReplaceConfigRequest>(settings); + request.set_config(config); + request.set_dry_run(dryRun); + + return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::ReplaceConfigRequest, Ydb::DynamicConfig::ReplaceConfigResponse>( + std::move(request), + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncReplaceConfig, TRpcRequestSettings::Make(settings)); } TAsyncStatus DropConfig(const TString& cluster, ui64 version, const TClusterConfigSettings& settings = {}) { auto request = MakeOperationRequest<Ydb::DynamicConfig::DropConfigRequest>(settings); - request.set_cluster(cluster); - request.set_version(version); + request.mutable_identity()->set_cluster(cluster); + request.mutable_identity()->set_version(version); return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::DropConfigRequest, Ydb::DynamicConfig::DropConfigResponse>( std::move(request), @@ -34,12 +46,9 @@ public: TRpcRequestSettings::Make(settings)); } - TAsyncStatus AddVolatileConfig(const TString& config, ui64 id, ui64 version, const TString& cluster, const TClusterConfigSettings& settings = {}) { + TAsyncStatus AddVolatileConfig(const TString& config, const TClusterConfigSettings& settings = {}) { auto request = MakeOperationRequest<Ydb::DynamicConfig::AddVolatileConfigRequest>(settings); request.set_config(config); - request.set_id(id); - request.set_version(version); - request.set_cluster(cluster); return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::AddVolatileConfigRequest, Ydb::DynamicConfig::AddVolatileConfigResponse>( std::move(request), @@ -50,11 +59,11 @@ public: TAsyncStatus RemoveVolatileConfig(const TString& cluster, ui64 version, const TVector<ui64>& ids, const TClusterConfigSettings& settings = {}) { auto request = MakeOperationRequest<Ydb::DynamicConfig::RemoveVolatileConfigRequest>(settings); - request.set_cluster(cluster); - request.set_version(version); + request.mutable_identity()->set_cluster(cluster); + request.mutable_identity()->set_version(version); for (auto& id: ids) { - request.add_ids(id); + request.mutable_ids()->add_ids(id); } return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::RemoveVolatileConfigRequest, Ydb::DynamicConfig::RemoveVolatileConfigResponse>( @@ -63,6 +72,76 @@ public: TRpcRequestSettings::Make(settings)); } + TAsyncStatus RemoveAllVolatileConfigs(const TString& cluster, ui64 version, const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::RemoveVolatileConfigRequest>(settings); + + request.mutable_identity()->set_cluster(cluster); + request.mutable_identity()->set_version(version); + request.set_all(true); + + return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::RemoveVolatileConfigRequest, Ydb::DynamicConfig::RemoveVolatileConfigResponse>( + std::move(request), + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncRemoveVolatileConfig, + TRpcRequestSettings::Make(settings)); + } + + TAsyncStatus ForceRemoveVolatileConfig(const TVector<ui64>& ids, const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::RemoveVolatileConfigRequest>(settings); + + for (auto& id: ids) { + request.mutable_ids()->add_ids(id); + } + + request.set_force(true); + + return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::RemoveVolatileConfigRequest, Ydb::DynamicConfig::RemoveVolatileConfigResponse>( + std::move(request), + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncRemoveVolatileConfig, + TRpcRequestSettings::Make(settings)); + } + + TAsyncStatus ForceRemoveAllVolatileConfigs(const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::RemoveVolatileConfigRequest>(settings); + + request.set_all(true); + request.set_force(true); + + return RunSimple<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::RemoveVolatileConfigRequest, Ydb::DynamicConfig::RemoveVolatileConfigResponse>( + std::move(request), + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncRemoveVolatileConfig, + TRpcRequestSettings::Make(settings)); + } + + + TAsyncGetNodeLabelsResult GetNodeLabels(ui64 nodeId, const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::GetNodeLabelsRequest>(settings); + request.set_node_id(nodeId); + + auto promise = NThreading::NewPromise<TGetNodeLabelsResult>(); + + auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { + TMap<TString, TString> labels; + if (Ydb::DynamicConfig::GetNodeLabelsResult result; any && any->UnpackTo(&result)) { + for (auto& label : result.labels()) { + labels[label.label()] = label.value(); + } + } + + TGetNodeLabelsResult val(TStatus(std::move(status)), std::move(labels)); + promise.SetValue(std::move(val)); + }; + + Connections_->RunDeferred<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::GetNodeLabelsRequest, Ydb::DynamicConfig::GetNodeLabelsResponse>( + std::move(request), + extractor, + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncGetNodeLabels, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings)); + + return promise.GetFuture(); + } + TAsyncGetConfigResult GetConfig(const TClusterConfigSettings& settings = {}) { auto request = MakeOperationRequest<Ydb::DynamicConfig::GetConfigRequest>(settings); @@ -73,9 +152,9 @@ public: ui64 version = 0; TString config; TMap<ui64, TString> volatileConfigs; - if (Ydb::DynamicConfig::GetConfigResponse result; any && any->UnpackTo(&result)) { - clusterName = result.cluster(); - version = result.version(); + if (Ydb::DynamicConfig::GetConfigResult result; any && any->UnpackTo(&result)) { + clusterName = result.identity().cluster(); + version = result.identity().version(); config = result.config(); for (const auto& config : result.volatile_configs()) { volatileConfigs.emplace(config.id(), config.config()); @@ -97,6 +176,36 @@ public: return promise.GetFuture(); } + TAsyncGetMetadataResult GetMetadata(const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::GetMetadataRequest>(settings); + + auto promise = NThreading::NewPromise<TGetMetadataResult>(); + + auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { + TString metadata; + TMap<ui64, TString> volatileConfigs; + if (Ydb::DynamicConfig::GetMetadataResult result; any && any->UnpackTo(&result)) { + metadata = result.metadata(); + for (const auto& config : result.volatile_configs()) { + volatileConfigs.emplace(config.id(), config.metadata()); + } + } + + TGetMetadataResult val(TStatus(std::move(status)),std::move(metadata), std::move(volatileConfigs)); + promise.SetValue(std::move(val)); + }; + + Connections_->RunDeferred<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::GetMetadataRequest, Ydb::DynamicConfig::GetMetadataResponse>( + std::move(request), + extractor, + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncGetMetadata, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings)); + + return promise.GetFuture(); + } + TAsyncResolveConfigResult ResolveConfig(const TString& config, const TMap<ui64, TString>& volatileConfigs, const TMap<TString, TString>& labels, const TClusterConfigSettings& settings = {}) { auto request = MakeOperationRequest<Ydb::DynamicConfig::ResolveConfigRequest>(settings); request.set_config(config); @@ -115,7 +224,7 @@ public: auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { TString config; - if (Ydb::DynamicConfig::ResolveConfigResponse result; any && any->UnpackTo(&result)) { + if (Ydb::DynamicConfig::ResolveConfigResult result; any && any->UnpackTo(&result)) { config = result.config(); } @@ -147,7 +256,7 @@ public: auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { TString config; - if (Ydb::DynamicConfig::ResolveAllConfigResponse result; any && any->UnpackTo(&result)) { + if (Ydb::DynamicConfig::ResolveAllConfigResult result; any && any->UnpackTo(&result)) { config = result.config(); } @@ -165,16 +274,83 @@ public: return promise.GetFuture(); } + + TAsyncVerboseResolveConfigResult VerboseResolveConfig(const TString& config, const TMap<ui64, TString>& volatileConfigs, const TClusterConfigSettings& settings = {}) { + auto request = MakeOperationRequest<Ydb::DynamicConfig::ResolveAllConfigRequest>(settings); + request.set_config(config); + for (auto& [id, volatileConfig] : volatileConfigs) { + auto* proto = request.add_volatile_configs(); + proto->set_id(id); + proto->set_config(volatileConfig); + } + request.set_verbose_response(true); + + auto promise = NThreading::NewPromise<TVerboseResolveConfigResult>(); + + auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { + auto convert = [] (const Ydb::DynamicConfig::YamlLabelExt::LabelType& label) -> TVerboseResolveConfigResult::TLabel::EType { + switch(label) { + case Ydb::DynamicConfig::YamlLabelExt::NOT_SET: + return TVerboseResolveConfigResult::TLabel::EType::Negative; + case Ydb::DynamicConfig::YamlLabelExt::COMMON: + return TVerboseResolveConfigResult::TLabel::EType::Common; + case Ydb::DynamicConfig::YamlLabelExt::EMPTY: + return TVerboseResolveConfigResult::TLabel::EType::Empty; + default: + Y_FAIL("unexpected enum value"); + } + }; + + TSet<TString> labels; + TVerboseResolveConfigResult::ConfigByLabelSet configs; + + if (Ydb::DynamicConfig::ResolveAllConfigResult result; any && any->UnpackTo(&result)) { + for (auto& config : result.configs()) { + TSet<TVector<TVerboseResolveConfigResult::TLabel>> labelSets; + for (auto& labelSet : config.label_sets()) { + TVector<TVerboseResolveConfigResult::TLabel> set; + for (auto& label : labelSet.labels()) { + labels.insert(label.label()); + set.push_back(TVerboseResolveConfigResult::TLabel{convert(label.type()), label.value()}); + } + labelSets.insert(set); + } + configs[labelSets] = config.config(); + } + } + + TVerboseResolveConfigResult val(TStatus(std::move(status)), std::move(labels), std::move(configs)); + promise.SetValue(std::move(val)); + }; + + Connections_->RunDeferred<Ydb::DynamicConfig::V1::DynamicConfigService, Ydb::DynamicConfig::ResolveAllConfigRequest, Ydb::DynamicConfig::ResolveAllConfigResponse>( + std::move(request), + extractor, + &Ydb::DynamicConfig::V1::DynamicConfigService::Stub::AsyncResolveAllConfig, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings)); + + return promise.GetFuture(); + } }; TDynamicConfigClient::TDynamicConfigClient(const TDriver& driver) : Impl_(new TDynamicConfigClient::TImpl(CreateInternalInterface(driver))) {} -TAsyncStatus TDynamicConfigClient::ApplyConfig( +TAsyncStatus TDynamicConfigClient::SetConfig( + const TString& config, + bool dryRun, + const TClusterConfigSettings& settings) { + return Impl_->SetConfig(config, dryRun, settings); +} + +TAsyncStatus TDynamicConfigClient::ReplaceConfig( const TString& config, + bool dryRun, const TClusterConfigSettings& settings) { - return Impl_->ApplyConfig(config, settings); + return Impl_->ReplaceConfig(config, dryRun, settings); } TAsyncStatus TDynamicConfigClient::DropConfig( @@ -186,11 +362,8 @@ TAsyncStatus TDynamicConfigClient::DropConfig( TAsyncStatus TDynamicConfigClient::AddVolatileConfig( const TString& config, - ui64 id, - ui64 version, - const TString& cluster, const TClusterConfigSettings& settings) { - return Impl_->AddVolatileConfig(config, id, version, cluster, settings); + return Impl_->AddVolatileConfig(config, settings); } TAsyncStatus TDynamicConfigClient::RemoveVolatileConfig( @@ -201,10 +374,36 @@ TAsyncStatus TDynamicConfigClient::RemoveVolatileConfig( return Impl_->RemoveVolatileConfig(cluster, version, ids, settings); } +TAsyncStatus TDynamicConfigClient::RemoveAllVolatileConfigs( + const TString& cluster, + ui64 version, + const TClusterConfigSettings& settings) { + return Impl_->RemoveAllVolatileConfigs(cluster, version, settings); +} + +TAsyncStatus TDynamicConfigClient::ForceRemoveVolatileConfig( + const TVector<ui64>& ids, + const TClusterConfigSettings& settings) { + return Impl_->ForceRemoveVolatileConfig(ids, settings); +} + +TAsyncStatus TDynamicConfigClient::ForceRemoveAllVolatileConfigs( + const TClusterConfigSettings& settings) { + return Impl_->ForceRemoveAllVolatileConfigs(settings); +} + +TAsyncGetMetadataResult TDynamicConfigClient::GetMetadata(const TClusterConfigSettings& settings) { + return Impl_->GetMetadata(settings); +} + TAsyncGetConfigResult TDynamicConfigClient::GetConfig(const TClusterConfigSettings& settings) { return Impl_->GetConfig(settings); } +TAsyncGetNodeLabelsResult TDynamicConfigClient::GetNodeLabels(ui64 nodeId, const TClusterConfigSettings& settings) { + return Impl_->GetNodeLabels(nodeId, settings); +} + TAsyncResolveConfigResult TDynamicConfigClient::ResolveConfig( const TString& config, const TMap<ui64, TString>& volatileConfigs, @@ -220,4 +419,11 @@ TAsyncResolveConfigResult TDynamicConfigClient::ResolveConfig( return Impl_->ResolveConfig(config, volatileConfigs, settings); } +TAsyncVerboseResolveConfigResult TDynamicConfigClient::VerboseResolveConfig( + const TString& config, + const TMap<ui64, TString>& volatileConfigs, + const TClusterConfigSettings& settings) { + return Impl_->VerboseResolveConfig(config, volatileConfigs, settings); +} + } // namespace NYdb::NDynamicConfig diff --git a/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.h b/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.h index 10091434f34..1925ae2f5d5 100644 --- a/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.h +++ b/ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.h @@ -8,6 +8,7 @@ #include <ydb/public/sdk/cpp/client/ydb_driver/driver.h> #include <util/generic/string.h> +#include <util/generic/set.h> #include <util/generic/map.h> #include <util/system/types.h> @@ -17,11 +18,11 @@ namespace NYdb::NDynamicConfig { struct TGetConfigResult : public TStatus { TGetConfigResult( - TStatus status, - TString clusterName, + TStatus&& status, + TString&& clusterName, ui64 version, - TString config, - TMap<ui64, TString> volatileConfigs) + TString&& config, + TMap<ui64, TString>&& volatileConfigs) : TStatus(std::move(status)) , ClusterName_(std::move(clusterName)) , Version_(version) @@ -54,10 +55,35 @@ private: using TAsyncGetConfigResult = NThreading::TFuture<TGetConfigResult>; +struct TGetMetadataResult : public TStatus { + TGetMetadataResult( + TStatus&& status, + TString&& metadata, + TMap<ui64, TString>&& volatileConfigs) + : TStatus(std::move(status)) + , Metadata_(std::move(metadata)) + , VolatileConfigs_(std::move(volatileConfigs)) + {} + + const TString& GetMetadata() const { + return Metadata_; + } + + const TMap<ui64, TString>& GetVolatileConfigs() const { + return VolatileConfigs_; + } + +private: + TString Metadata_; + TMap<ui64, TString> VolatileConfigs_; +}; + +using TAsyncGetMetadataResult = NThreading::TFuture<TGetMetadataResult>; + struct TResolveConfigResult : public TStatus { TResolveConfigResult( - TStatus status, - TString config) + TStatus&& status, + TString&& config) : TStatus(std::move(status)) , Config_(std::move(config)) {} @@ -72,6 +98,75 @@ private: using TAsyncResolveConfigResult = NThreading::TFuture<TResolveConfigResult>; +struct TGetNodeLabelsResult : public TStatus { + TGetNodeLabelsResult( + TStatus&& status, + TMap<TString, TString>&& labels) + : TStatus(std::move(status)) + , Labels_(std::move(labels)) + {} + + const TMap<TString, TString>& GetLabels() const { + return Labels_; + } + +private: + TMap<TString, TString> Labels_; +}; + +using TAsyncGetNodeLabelsResult = NThreading::TFuture<TGetNodeLabelsResult>; + +struct TVerboseResolveConfigResult : public TStatus { + struct TLabel { + enum class EType { + Negative = 0, + Empty, + Common, + }; + + EType Type; + TString Value; + + bool operator<(const TLabel& other) const { + int lhs = static_cast<int>(Type); + int rhs = static_cast<int>(other.Type); + return std::tie(lhs, Value) < std::tie(rhs, other.Value); + } + + bool operator==(const TLabel& other) const { + int lhs = static_cast<int>(Type); + int rhs = static_cast<int>(other.Type); + return std::tie(lhs, Value) == std::tie(rhs, other.Value); + } + }; + + using ConfigByLabelSet = TMap<TSet<TVector<TLabel>>, TString>; + + TVerboseResolveConfigResult( + TStatus&& status, + TSet<TString>&& labels, + ConfigByLabelSet&& configs) + : TStatus(std::move(status)) + , Labels_(std::move(labels)) + , Configs_(std::move(configs)) + {} + + const TSet<TString>& GetLabels() const { + return Labels_; + } + + const ConfigByLabelSet& GetConfigs() const { + return Configs_; + } + +private: + TSet<TString> Labels_; + ConfigByLabelSet Configs_; +}; + +using TAsyncVerboseResolveConfigResult = NThreading::TFuture<TVerboseResolveConfigResult>; + + struct TDynamicConfigClientSettings : public TCommonClientSettingsBase<TDynamicConfigClientSettings> { using TSelf = TDynamicConfigClientSettings; }; @@ -84,8 +179,11 @@ public: explicit TDynamicConfigClient(const TDriver& driver); - // Apply config - TAsyncStatus ApplyConfig(const TString& config, const TClusterConfigSettings& settings = {}); + // Set config + TAsyncStatus SetConfig(const TString& config, bool dryRun = false, const TClusterConfigSettings& settings = {}); + + // Replace config + TAsyncStatus ReplaceConfig(const TString& config, bool dryRun = false, const TClusterConfigSettings& settings = {}); // Drop config TAsyncStatus DropConfig( @@ -96,20 +194,39 @@ public: // Add volatile config TAsyncStatus AddVolatileConfig( const TString& config, - ui64 id, ui64 version, - const TString& cluster, const TClusterConfigSettings& settings = {}); - // Remove specific volatile config or all of them + // Remove specific volatile configs TAsyncStatus RemoveVolatileConfig( const TString& cluster, ui64 version, const TVector<ui64>& ids, const TClusterConfigSettings& settings = {}); + // Remove all volatile config + TAsyncStatus RemoveAllVolatileConfigs( + const TString& cluster, + ui64 version, + const TClusterConfigSettings& settings = {}); + + // Remove specific volatile configs + TAsyncStatus ForceRemoveVolatileConfig( + const TVector<ui64>& ids, + const TClusterConfigSettings& settings = {}); + + // Remove all volatile config + TAsyncStatus ForceRemoveAllVolatileConfigs( + const TClusterConfigSettings& settings = {}); + + // Get current cluster configs metadata + TAsyncGetMetadataResult GetMetadata(const TClusterConfigSettings& settings = {}); + // Get current cluster configs TAsyncGetConfigResult GetConfig(const TClusterConfigSettings& settings = {}); + // Get current cluster configs + TAsyncGetNodeLabelsResult GetNodeLabels(ui64 nodeId, const TClusterConfigSettings& settings = {}); + // Resolve arbitrary config for specific labels TAsyncResolveConfigResult ResolveConfig( const TString& config, @@ -123,6 +240,12 @@ public: const TMap<ui64, TString>& volatileConfigs, const TClusterConfigSettings& settings = {}); + // Resolve arbitrary config for all label combinations + TAsyncVerboseResolveConfigResult VerboseResolveConfig( + const TString& config, + const TMap<ui64, TString>& volatileConfigs, + const TClusterConfigSettings& settings = {}); + private: std::shared_ptr<TImpl> Impl_; }; diff --git a/ydb/services/dynamic_config/grpc_service.cpp b/ydb/services/dynamic_config/grpc_service.cpp index 374a90ae037..2cd003d8e51 100644 --- a/ydb/services/dynamic_config/grpc_service.cpp +++ b/ydb/services/dynamic_config/grpc_service.cpp @@ -25,11 +25,14 @@ void TGRpcDynamicConfigService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) }, &DynamicConfig::V1::DynamicConfigService::AsyncService::Request ## NAME, \ #NAME, logger, getCounterBlock("console", #NAME))->Run(); - ADD_REQUEST(ApplyConfig, DoApplyConfigRequest) + ADD_REQUEST(SetConfig, DoSetConfigRequest) + ADD_REQUEST(ReplaceConfig, DoReplaceConfigRequest) ADD_REQUEST(DropConfig, DoDropConfigRequest) ADD_REQUEST(AddVolatileConfig, DoAddVolatileConfigRequest) ADD_REQUEST(RemoveVolatileConfig, DoRemoveVolatileConfigRequest) ADD_REQUEST(GetConfig, DoGetConfigRequest) + ADD_REQUEST(GetMetadata, DoGetMetadataRequest) + ADD_REQUEST(GetNodeLabels, DoGetNodeLabelsRequest) ADD_REQUEST(ResolveConfig, DoResolveConfigRequest) ADD_REQUEST(ResolveAllConfig, DoResolveAllConfigRequest) |