Skip to content

Commit 523465f

Browse files
authored
Make config validation enforcement configurable (#16693)
1 parent 5118813 commit 523465f

File tree

5 files changed

+80
-7
lines changed

5 files changed

+80
-7
lines changed

ydb/core/cms/console/console_configs_manager.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -174,15 +174,20 @@ void TConfigsManager::ValidateDatabaseConfig(TUpdateDatabaseConfigOpContext& opC
174174
auto resolved = NYamlConfig::ResolveAll(tree);
175175

176176
errors.clear();
177+
178+
auto* csk = AppData()->ConfigSwissKnife;
179+
177180
for (auto& [_, config] : resolved.Configs) {
178181
auto cfg = NYamlConfig::YamlToProto(
179182
config.second,
180183
true,
181184
true,
182185
unknownFieldsCollector);
183-
NKikimr::NConfig::EValidationResult result = NKikimr::NConfig::ValidateConfig(cfg, errors);
184-
if (result == NKikimr::NConfig::EValidationResult::Error) {
185-
ythrow yexception() << errors.front();
186+
if (csk) {
187+
auto result = csk->ValidateConfig(cfg, errors);
188+
if (result == NYamlConfig::EValidationResult::Error) {
189+
ythrow yexception() << errors.front();
190+
}
186191
}
187192
}
188193

ydb/core/config/init/init_impl.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,15 +1158,14 @@ class TInitialConfiguratorImpl
11581158

11591159
TenantName = FillTenantPoolConfig(CommonAppOptions);
11601160

1161+
FillData(CommonAppOptions);
1162+
11611163
std::vector<TString> errors;
1162-
EValidationResult result = ValidateConfig(AppConfig, errors);
1163-
if (result == EValidationResult::Error) {
1164+
if (csk && csk->ValidateConfig(AppConfig, errors) == NYamlConfig::EValidationResult::Error) {
11641165
ythrow yexception() << errors.front();
11651166
}
11661167

11671168
Logger.Out() << "configured" << Endl;
1168-
1169-
FillData(CommonAppOptions);
11701169
}
11711170

11721171
void FillData(const NConfig::TCommonAppOptions& cf) {

ydb/library/yaml_config/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ PEERDIR(
1818
library/cpp/protobuf/json
1919
ydb/core/base
2020
ydb/core/cms/console/util
21+
ydb/core/config/validation
2122
ydb/core/erasure
2223
ydb/core/protos
2324
ydb/core/protos/out

ydb/library/yaml_config/yaml_config.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <library/cpp/protobuf/json/json2proto.h>
88

99
#include <ydb/core/protos/netclassifier.pb.h>
10+
#include <ydb/core/config/validation/validators.h>
1011

1112
namespace NKikimr::NYamlConfig {
1213

@@ -97,8 +98,32 @@ void ReplaceUnmanagedKinds(const NKikimrConfig::TAppConfig& from, NKikimrConfig:
9798
}
9899
}
99100

101+
class TLegacyValidators
102+
: public IConfigValidator
103+
{
104+
public:
105+
EValidationResult ValidateConfig(
106+
const NKikimrConfig::TAppConfig& config,
107+
std::vector<TString>& msg) const override
108+
{
109+
auto res = NKikimr::NConfig::ValidateConfig(config, msg);
110+
switch (res) {
111+
case NKikimr::NConfig::EValidationResult::Ok:
112+
return EValidationResult::Ok;
113+
case NKikimr::NConfig::EValidationResult::Warn:
114+
return EValidationResult::Warn;
115+
case NKikimr::NConfig::EValidationResult::Error:
116+
return EValidationResult::Error;
117+
}
118+
}
119+
};
120+
100121
class TDefaultConfigSwissKnife : public IConfigSwissKnife {
101122
public:
123+
TDefaultConfigSwissKnife() {
124+
Validators["LegacyValidators"] = MakeSimpleShared<TLegacyValidators>();
125+
}
126+
102127
bool VerifyReplaceRequest(const Ydb::Config::ReplaceConfigRequest&, Ydb::StatusIds::StatusCode&, NYql::TIssues&) const override {
103128
return true;
104129
}
@@ -117,5 +142,22 @@ std::unique_ptr<IConfigSwissKnife> CreateDefaultConfigSwissKnife() {
117142
return std::make_unique<TDefaultConfigSwissKnife>();
118143
}
119144

145+
EValidationResult IConfigSwissKnife::ValidateConfig(
146+
const NKikimrConfig::TAppConfig& config,
147+
std::vector<TString>& msg) const
148+
{
149+
for (const auto& [name, validator] : GetValidators()) {
150+
EValidationResult result = validator->ValidateConfig(config, msg);
151+
if (result == EValidationResult::Error) {
152+
return EValidationResult::Error;
153+
}
154+
}
155+
156+
if (msg.size() > 0) {
157+
return EValidationResult::Warn;
158+
}
159+
160+
return EValidationResult::Ok;
161+
}
120162

121163
} // namespace NKikimr::NYamlConfig

ydb/library/yaml_config/yaml_config.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,44 @@ void ResolveAndParseYamlConfig(
8484
TString* resolvedYamlConfig = nullptr,
8585
TString* resolvedJsonConfig = nullptr);
8686

87+
enum class EValidationResult {
88+
Ok,
89+
Warn,
90+
Error,
91+
};
92+
93+
class IConfigValidator {
94+
public:
95+
virtual ~IConfigValidator() = default;
96+
97+
virtual EValidationResult ValidateConfig(
98+
const NKikimrConfig::TAppConfig& config,
99+
std::vector<TString>& msg) const = 0;
100+
};
101+
87102
/**
88103
* Replaces kinds not managed by yaml config (e.g. NetClassifierConfig) from config 'from' in config 'to'
89104
* if corresponding configs are presenet in 'from'
90105
*/
91106
void ReplaceUnmanagedKinds(const NKikimrConfig::TAppConfig& from, NKikimrConfig::TAppConfig& to);
92107

108+
using TValidatorsMap = TMap<TString, TSimpleSharedPtr<IConfigValidator>>;
109+
93110
class IConfigSwissKnife {
94111
public:
95112
virtual ~IConfigSwissKnife() = default;
96113
virtual bool VerifyReplaceRequest(const Ydb::Config::ReplaceConfigRequest& request, Ydb::StatusIds::StatusCode& status, NYql::TIssues& issues) const = 0;
97114
virtual bool VerifyMainConfig(const TString& config) const = 0;
98115
virtual bool VerifyStorageConfig(const TString& config) const = 0;
116+
virtual EValidationResult ValidateConfig(
117+
const NKikimrConfig::TAppConfig& config,
118+
std::vector<TString>& msg) const;
119+
120+
const TMap<TString, TSimpleSharedPtr<IConfigValidator>>& GetValidators() const {
121+
return Validators;
122+
}
123+
protected:
124+
TMap<TString, TSimpleSharedPtr<IConfigValidator>> Validators;
99125
};
100126

101127

0 commit comments

Comments
 (0)