aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2023-06-06 20:13:31 +0300
committerinnokentii <innokentii@yandex-team.com>2023-06-06 20:13:31 +0300
commit94ab32ef88972cb80d8960aa928650343f0fb860 (patch)
tree270b1c8c0e3595699aefceb773a7df172891e1cd
parenta1edfae32d8ebc2479d063d6106156f128ba5fc5 (diff)
downloadydb-94ab32ef88972cb80d8960aa928650343f0fb860.tar.gz
New DynamicConfig API draft
WIP Add new calls
-rw-r--r--ydb/core/cms/console/CMakeLists.darwin-x86_64.txt4
-rw-r--r--ydb/core/cms/console/CMakeLists.linux-aarch64.txt4
-rw-r--r--ydb/core/cms/console/CMakeLists.linux-x86_64.txt4
-rw-r--r--ydb/core/cms/console/CMakeLists.windows-x86_64.txt4
-rw-r--r--ydb/core/cms/console/configs_dispatcher.cpp18
-rw-r--r--ydb/core/cms/console/configs_dispatcher_ut.cpp64
-rw-r--r--ydb/core/cms/console/console.h43
-rw-r--r--ydb/core/cms/console/console__drop_yaml_config.cpp35
-rw-r--r--ydb/core/cms/console/console__get_yaml_config.cpp34
-rw-r--r--ydb/core/cms/console/console__get_yaml_metadata.cpp63
-rw-r--r--ydb/core/cms/console/console__replace_yaml_config.cpp (renamed from ydb/core/cms/console/console__apply_yaml_config.cpp)60
-rw-r--r--ydb/core/cms/console/console__set_yaml_config.cpp107
-rw-r--r--ydb/core/cms/console/console_configs_manager.cpp251
-rw-r--r--ydb/core/cms/console/console_configs_manager.h26
-rw-r--r--ydb/core/cms/console/console_configs_provider.cpp11
-rw-r--r--ydb/core/cms/console/console_impl.h5
-rw-r--r--ydb/core/cms/console/console_ut_configs.cpp39
-rw-r--r--ydb/core/cms/console/ut_helpers.h37
-rw-r--r--ydb/core/cms/console/yaml_config/yaml_config.cpp118
-rw-r--r--ydb/core/cms/console/yaml_config/yaml_config.h41
-rw-r--r--ydb/core/cms/console/yaml_config/yaml_config_ut.cpp9
-rw-r--r--ydb/core/grpc_services/rpc_dynamic_config.cpp89
-rw-r--r--ydb/core/grpc_services/service_dynamic_config.h12
-rw-r--r--ydb/core/protos/config.proto1
-rw-r--r--ydb/core/protos/console_config.proto55
-rw-r--r--ydb/public/api/grpc/draft/ydb_dynamic_config_v1.proto9
-rw-r--r--ydb/public/api/protos/draft/ydb_dynamic_config.proto174
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.cpp254
-rw-r--r--ydb/public/sdk/cpp/client/draft/ydb_dynamic_config.h145
-rw-r--r--ydb/services/dynamic_config/grpc_service.cpp5
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)