Skip to content

Commit e7c7137

Browse files
authored
Add config verification interface (#15029)
1 parent f5e2b02 commit e7c7137

File tree

13 files changed

+83
-12
lines changed

13 files changed

+83
-12
lines changed

ydb/apps/ydbd/main.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include <ydb/library/folder_service/folder_service.h>
88
#include <ydb/library/pdisk_io/aio.h>
99
#include <yql/essentials/parser/pg_wrapper/interface/comp_factory.h>
10-
10+
#include <ydb/library/yaml_config/yaml_config.h>
1111

1212
int main(int argc, char **argv) {
1313
SetupTerminateHandler();
@@ -22,6 +22,7 @@ int main(int argc, char **argv) {
2222
factories->SqsAuthFactory = std::make_shared<NKikimr::NSQS::TMultiAuthFactory>();
2323
factories->SqsEventsWriterFactory = std::make_shared<TSqsEventsWriterFactory>();
2424
factories->SchemeOperationFactory.reset(NKikimr::NSchemeShard::DefaultOperationFactory());
25+
factories->ConfigSwissKnife = NKikimr::NYamlConfig::CreateDefaultConfigSwissKnife();
2526

2627
return ParameterizedMain(argc, argv, std::move(factories));
2728
}

ydb/core/base/appdata_fwd.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ namespace NSchemeShard {
154154

155155
class TFormatFactory;
156156

157+
namespace NYamlConfig {
158+
class IConfigSwissKnife;
159+
}
160+
157161
struct TAppData {
158162
static const ui32 MagicTag = 0x2991AAF8;
159163
const ui32 Magic;
@@ -173,6 +177,7 @@ struct TAppData {
173177
const TFormatFactory* FormatFactory = nullptr;
174178
const NSQS::IEventsWriterFactory* SqsEventsWriterFactory = nullptr;
175179
const NSchemeShard::IOperationFactory *SchemeOperationFactory = nullptr;
180+
const NYamlConfig::IConfigSwissKnife *ConfigSwissKnife = nullptr;
176181

177182
NSQS::IAuthFactory* SqsAuthFactory = nullptr;
178183

ydb/core/cms/console/configs_dispatcher.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,7 +862,7 @@ try {
862862
NLastGetopt::TOptsParseResultException parseResult(&opts, argv.size(), argv.data());
863863

864864
initCfg.ValidateOptions(opts, parseResult);
865-
initCfg.Parse(parseResult.GetFreeArgs());
865+
initCfg.Parse(parseResult.GetFreeArgs(), nullptr);
866866

867867
NKikimrConfig::TAppConfig appConfig;
868868
ui32 nodeId;

ydb/core/config/init/init.cpp

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,15 @@ void LoadBootstrapConfig(IProtoConfigFileProvider& protoConfigFileProvider, IErr
582582
}
583583
}
584584

585-
void LoadMainYamlConfig(TConfigRefs refs, const TString& mainYamlConfigFile, const TString& storageYamlConfigFile,
586-
bool loadedFromStore, NKikimrConfig::TAppConfig& appConfig, const NCompat::TSourceLocation location) {
585+
void LoadMainYamlConfig(
586+
TConfigRefs refs,
587+
const TString& mainYamlConfigFile,
588+
const TString& storageYamlConfigFile,
589+
bool loadedFromStore,
590+
NKikimrConfig::TAppConfig& appConfig,
591+
NYamlConfig::IConfigSwissKnife* csk,
592+
const NCompat::TSourceLocation location)
593+
{
587594
if (!mainYamlConfigFile) {
588595
return;
589596
}
@@ -595,9 +602,18 @@ void LoadMainYamlConfig(TConfigRefs refs, const TString& mainYamlConfigFile, con
595602
std::optional<TString> storageYamlConfigString;
596603
if (storageYamlConfigFile) {
597604
storageYamlConfigString.emplace(protoConfigFileProvider.GetProtoFromFile(storageYamlConfigFile, errorCollector));
605+
606+
if (csk) {
607+
csk->VerifyStorageConfig(*storageYamlConfigString);
608+
}
598609
}
599610

600611
const TString mainYamlConfigString = protoConfigFileProvider.GetProtoFromFile(mainYamlConfigFile, errorCollector);
612+
613+
if (csk) {
614+
csk->VerifyMainConfig(mainYamlConfigString);
615+
}
616+
601617
appConfig.SetStartupConfigYaml(mainYamlConfigString);
602618
if (storageYamlConfigString) {
603619
appConfig.SetStartupStorageYaml(*storageYamlConfigString);

ydb/core/config/init/init.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <ydb/core/util/source_location.h>
66
#include <ydb/core/protos/config.pb.h>
77
#include <ydb/library/actors/core/interconnect.h>
8+
#include <ydb/library/yaml_config/yaml_config.h>
89

910
#include <library/cpp/getopt/small/last_getopt_opts.h>
1011

@@ -241,7 +242,7 @@ class IInitialConfigurator {
241242
virtual ~IInitialConfigurator() {};
242243
virtual void RegisterCliOptions(NLastGetopt::TOpts& opts) = 0;
243244
virtual void ValidateOptions(const NLastGetopt::TOpts& opts, const NLastGetopt::TOptsParseResult& parseResult) = 0;
244-
virtual void Parse(const TVector<TString>& freeArgs) = 0;
245+
virtual void Parse(const TVector<TString>& freeArgs, NYamlConfig::IConfigSwissKnife* csk) = 0;
245246
virtual void Apply(
246247
NKikimrConfig::TAppConfig& appConfig,
247248
ui32& nodeId,
@@ -295,8 +296,8 @@ class TInitialConfigurator {
295296
Impl->ValidateOptions(opts, parseResult);
296297
}
297298

298-
void Parse(const TVector<TString>& freeArgs) {
299-
Impl->Parse(freeArgs);
299+
void Parse(const TVector<TString>& freeArgs, NYamlConfig::IConfigSwissKnife* csk) {
300+
Impl->Parse(freeArgs, csk);
300301
}
301302

302303
void Apply(

ydb/core/config/init/init_impl.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ void AddProtoConfigOptions(IProtoConfigFileProvider& out);
178178
void LoadBootstrapConfig(IProtoConfigFileProvider& protoConfigFileProvider, IErrorCollector& errorCollector, TVector<TString> configFiles, NKikimrConfig::TAppConfig& out);
179179
void LoadMainYamlConfig(TConfigRefs refs, const TString& mainYamlConfigFile, const TString& storageYamlConfigFile,
180180
bool loadedFromStore, NKikimrConfig::TAppConfig& appConfig,
181+
NYamlConfig::IConfigSwissKnife* csk,
181182
const NCompat::TSourceLocation location = NCompat::TSourceLocation::current());
182183
void CopyNodeLocation(NActorsInterconnect::TNodeLocation* dst, const NYdb::NDiscovery::TNodeLocation& src);
183184
void CopyNodeLocation(NYdb::NDiscovery::TNodeLocation* dst, const NActorsInterconnect::TNodeLocation& src);
@@ -1056,7 +1057,7 @@ class TInitialConfiguratorImpl
10561057
MbusAppOptions.ValidateCliOptions(opts, parseResult);
10571058
}
10581059

1059-
void Parse(const TVector<TString>& freeArgs) override {
1060+
void Parse(const TVector<TString>& freeArgs, NYamlConfig::IConfigSwissKnife* csk) override {
10601061
using TCfg = NKikimrConfig::TAppConfig;
10611062

10621063
NConfig::TConfigRefs refs{ConfigUpdateTracer, ErrorCollector, ProtoConfigFileProvider};
@@ -1085,7 +1086,7 @@ class TInitialConfiguratorImpl
10851086
}
10861087
}
10871088

1088-
LoadMainYamlConfig(refs, yamlConfigFile, storageYamlConfigFile, loadedFromStore, AppConfig);
1089+
LoadMainYamlConfig(refs, yamlConfigFile, storageYamlConfigFile, loadedFromStore, AppConfig, csk);
10891090
OptionMerge("auth-token-file", TCfg::TAuthConfigFieldTag{});
10901091

10911092
// start memorylog as soon as possible
@@ -1107,7 +1108,7 @@ class TInitialConfiguratorImpl
11071108
InitDynamicNode();
11081109
}
11091110

1110-
LoadMainYamlConfig(refs, yamlConfigFile, storageYamlConfigFile, loadedFromStore, AppConfig);
1111+
LoadMainYamlConfig(refs, yamlConfigFile, storageYamlConfigFile, loadedFromStore, AppConfig, csk);
11111112

11121113
Option("sys-file", TCfg::TActorSystemConfigFieldTag{});
11131114

ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void TClientCommandServer::Config(TConfig& config) {
6565
void TClientCommandServer::Parse(TConfig& config) {
6666
TClientCommand::Parse(config);
6767
InitCfg.ValidateOptions(*config.Opts, *config.ParseResult);
68-
InitCfg.Parse(config.ParseResult->GetFreeArgs());
68+
InitCfg.Parse(config.ParseResult->GetFreeArgs(), Factories->ConfigSwissKnife.get());
6969
}
7070

7171
void AddClientCommandServer(TClientCommandTree& parent, std::shared_ptr<TModuleFactories> factories) {

ydb/core/driver_lib/cli_utils/cli_cmds_validate_config.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ NKikimrConfig::TAppConfig TransformConfig(const std::vector<TString>& args) {
4141
NLastGetopt::TOptsParseResult parseResult(&opts, argv.size(), argv.data());
4242

4343
initCfg->ValidateOptions(opts, parseResult);
44-
initCfg->Parse(parseResult.GetFreeArgs());
44+
initCfg->Parse(parseResult.GetFreeArgs(), nullptr);
4545

4646
NKikimrConfig::TAppConfig appConfig;
4747
ui32 nodeId;

ydb/core/driver_lib/run/factories.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include <yql/essentials/minikql/computation/mkql_computation_node.h>
2020
#include <ydb/library/yql/providers/pq/cm_client/client.h>
2121

22+
#include <ydb/library/yaml_config/yaml_config.h>
23+
2224
#include <ydb/library/actors/core/actorsystem.h>
2325
#include <ydb/library/actors/wilson/wilson_uploader.h>
2426

@@ -62,6 +64,8 @@ struct TModuleFactories {
6264

6365
std::unique_ptr<NWilson::IGrpcSigner>(*WilsonGrpcSignerFactory)(const NKikimrConfig::TTracingConfig::TBackendConfig::TAuthConfig&);
6466

67+
std::unique_ptr<NYamlConfig::IConfigSwissKnife> ConfigSwissKnife;
68+
6569
~TModuleFactories();
6670
};
6771

ydb/core/driver_lib/run/run.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,6 +1086,7 @@ void TKikimrRunner::InitializeAppData(const TKikimrRunConfig& runConfig)
10861086
AppData->PersQueueGetReadSessionsInfoWorkerFactory = ModuleFactories ? ModuleFactories->PQReadSessionsInfoWorkerFactory.get() : nullptr;
10871087
AppData->IoContextFactory = ModuleFactories ? ModuleFactories->IoContextFactory.get() : nullptr;
10881088
AppData->SchemeOperationFactory = ModuleFactories ? ModuleFactories->SchemeOperationFactory.get() : nullptr;
1089+
AppData->ConfigSwissKnife = ModuleFactories ? ModuleFactories->ConfigSwissKnife.get() : nullptr;
10891090

10901091
AppData->SqsAuthFactory = ModuleFactories
10911092
? ModuleFactories->SqsAuthFactory.get()

ydb/core/grpc_services/rpc_config.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,13 @@ class TReplaceStorageConfigRequest : public TBSConfigRequestGrpc<TReplaceStorage
146146
issues.AddIssue("DryRun is not supported yet.");
147147
return false;
148148
}
149+
150+
auto* csk = AppData()->ConfigSwissKnife;
151+
152+
if (csk && !csk->VerifyReplaceRequest(request, status, issues)) {
153+
return false;
154+
}
155+
149156
return true;
150157
}
151158

ydb/library/yaml_config/yaml_config.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,25 @@ void ReplaceUnmanagedKinds(const NKikimrConfig::TAppConfig& from, NKikimrConfig:
9797
}
9898
}
9999

100+
class TDefaultConfigSwissKnife : public IConfigSwissKnife {
101+
public:
102+
bool VerifyReplaceRequest(const Ydb::Config::ReplaceConfigRequest&, Ydb::StatusIds::StatusCode&, NYql::TIssues&) const override {
103+
return true;
104+
}
105+
106+
bool VerifyMainConfig(const TString&) const override {
107+
return true;
108+
};
109+
110+
bool VerifyStorageConfig(const TString&) const override {
111+
return true;
112+
}
113+
};
114+
115+
116+
std::unique_ptr<IConfigSwissKnife> CreateDefaultConfigSwissKnife() {
117+
return std::make_unique<TDefaultConfigSwissKnife>();
118+
}
119+
120+
100121
} // namespace NKikimr::NYamlConfig

ydb/library/yaml_config/yaml_config.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
#include <ydb/core/protos/config.pb.h>
88
#include <ydb/core/protos/console_config.pb.h>
99
#include <ydb/library/yaml_config/public/yaml_config.h>
10+
#include <ydb/public/api/protos/ydb_status_codes.pb.h>
11+
#include <yql/essentials/public/issue/yql_issue.h>
12+
#include <ydb/public/api/protos/ydb_config.pb.h>
1013

1114
#include <openssl/sha.h>
1215

@@ -87,4 +90,15 @@ void ResolveAndParseYamlConfig(
8790
*/
8891
void ReplaceUnmanagedKinds(const NKikimrConfig::TAppConfig& from, NKikimrConfig::TAppConfig& to);
8992

93+
class IConfigSwissKnife {
94+
public:
95+
virtual ~IConfigSwissKnife() = default;
96+
virtual bool VerifyReplaceRequest(const Ydb::Config::ReplaceConfigRequest& request, Ydb::StatusIds::StatusCode& status, NYql::TIssues& issues) const = 0;
97+
virtual bool VerifyMainConfig(const TString& config) const = 0;
98+
virtual bool VerifyStorageConfig(const TString& config) const = 0;
99+
};
100+
101+
102+
std::unique_ptr<IConfigSwissKnife> CreateDefaultConfigSwissKnife();
103+
90104
} // namespace NKikimr::NYamlConfig

0 commit comments

Comments
 (0)