diff options
author | innokentii <[email protected]> | 2023-05-08 20:54:03 +0300 |
---|---|---|
committer | innokentii <[email protected]> | 2023-05-08 20:54:03 +0300 |
commit | 0e76812af073f4215087ba85c7a47149f6029f5b (patch) | |
tree | c7af41af3bd51eb8f2af9bcb63d2ad910cb03615 | |
parent | 5523ac2e2e80f6499ae2e8b20aeb11a75aa74ff8 (diff) |
Add utils for inplace version in dynamic config
add utils for inplace version in dynamic config
-rw-r--r-- | ydb/core/cms/console/yaml_config/yaml_config.cpp | 54 | ||||
-rw-r--r-- | ydb/core/cms/console/yaml_config/yaml_config.h | 18 | ||||
-rw-r--r-- | ydb/core/cms/console/yaml_config/yaml_config_ut.cpp | 238 |
3 files changed, 310 insertions, 0 deletions
diff --git a/ydb/core/cms/console/yaml_config/yaml_config.cpp b/ydb/core/cms/console/yaml_config/yaml_config.cpp index d700cd9738f..52ac016587f 100644 --- a/ydb/core/cms/console/yaml_config/yaml_config.cpp +++ b/ydb/core/cms/console/yaml_config/yaml_config.cpp @@ -710,6 +710,60 @@ void ReplaceUnmanagedKinds(const NKikimrConfig::TAppConfig& from, NKikimrConfig: } } +/** + * Parses config metadata + */ +TMetadata GetMetadata(const TString& config) { + auto doc = NFyaml::TDocument::Parse(config); + + if (auto node = doc.Root().Map()["metadata"]; node) { + auto versionNode = node.Map()["version"]; + auto clusterNode = node.Map()["cluster"]; + return TMetadata{ + .Version = versionNode ? std::optional{FromString<ui64>(versionNode.Scalar())} : std::nullopt, + .Cluster = clusterNode ? std::optional{clusterNode.Scalar()} : std::nullopt, + }; + } + + return {}; +} + +/** + * Replaces metadata in config + */ +TString ReplaceMetadata(const TString& config, const TMetadata& metadata) { + auto doc = NFyaml::TDocument::Parse(config); + + TStringStream sstr; + auto serializeMetadata = [&]() { + sstr << "metadata:\n version: " << *metadata.Version << "\n cluster: " << *metadata.Cluster; + }; + if (doc.Root().Style() == NFyaml::ENodeStyle::Flow) { + serializeMetadata(); + 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(); + sstr << config.substr(end, TString::npos); + } else { + if (doc.HasExplicitDocumentStart()) { + auto docStart = doc.BeginMark().InputPos + 4; + sstr << config.substr(0, docStart); + serializeMetadata(); + sstr << "\n" << config.substr(docStart, TString::npos); + } else { + serializeMetadata(); + sstr << "\n" << config; + } + } + } + + return sstr.Str(); +} + } // namespace NYamlConfig template <> diff --git a/ydb/core/cms/console/yaml_config/yaml_config.h b/ydb/core/cms/console/yaml_config/yaml_config.h index 97e1b71c032..88bd445f44b 100644 --- a/ydb/core/cms/console/yaml_config/yaml_config.h +++ b/ydb/core/cms/console/yaml_config/yaml_config.h @@ -190,4 +190,22 @@ void ResolveAndParseYamlConfig( */ void ReplaceUnmanagedKinds(const NKikimrConfig::TAppConfig& from, NKikimrConfig::TAppConfig& to); +/** + * Represents config metadata + */ +struct TMetadata { + std::optional<ui64> Version; + std::optional<TString> Cluster; +}; + +/** + * Parses config metadata + */ +TMetadata GetMetadata(const TString& config); + +/** + * Replaces metadata in config + */ +TString ReplaceMetadata(const TString& config, const TMetadata& metadata); + } // 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 933faaf3f74..3f389b4f216 100644 --- a/ydb/core/cms/console/yaml_config/yaml_config_ut.cpp +++ b/ydb/core/cms/console/yaml_config/yaml_config_ut.cpp @@ -1466,4 +1466,242 @@ Y_UNIT_TEST_SUITE(YamlConfig) { TStringStream stream; stream << cfg; } + + Y_UNIT_TEST(GetMetadata) { + { + TString str = R"( +metadata: + version: 10 + cluster: foo +)"; + auto metadata = NYamlConfig::GetMetadata(str); + UNIT_ASSERT_VALUES_EQUAL(*metadata.Version, 10); + UNIT_ASSERT_VALUES_EQUAL(*metadata.Cluster, "foo"); + } + + { + TString str = R"( +metadata: + version: 10 +)"; + auto metadata = NYamlConfig::GetMetadata(str); + UNIT_ASSERT_VALUES_EQUAL(*metadata.Version, 10); + UNIT_ASSERT(!metadata.Cluster); + } + + { + TString str = R"( +metadata: + cluster: foo +)"; + auto metadata = NYamlConfig::GetMetadata(str); + UNIT_ASSERT(!metadata.Version); + UNIT_ASSERT_VALUES_EQUAL(*metadata.Cluster, "foo"); + } + + { + TString str = R"( +metadata: {} +)"; + auto metadata = NYamlConfig::GetMetadata(str); + UNIT_ASSERT(!metadata.Version); + UNIT_ASSERT(!metadata.Cluster); + } + + { + TString str = "foo: bar"; + auto metadata = NYamlConfig::GetMetadata(str); + UNIT_ASSERT(!metadata.Version); + UNIT_ASSERT(!metadata.Cluster); + } + } + + Y_UNIT_TEST(ReplaceMetadata) { + NYamlConfig::TMetadata metadata; + metadata.Version = 1; + metadata.Cluster = "test"; + + { + TString str = R"( +# comment1 +{value: 1, array: [{test: "1"}], obj: {value: 2}} # comment2 +# comment3 +)"; + + TString exp = R"(metadata: + version: 1 + cluster: test +value: 1 +array: +- test: "1" +obj: + value: 2 +)"; + + TString res = NYamlConfig::ReplaceMetadata(str, metadata); + + UNIT_ASSERT_VALUES_EQUAL(res, exp); + } + + { + TString str = R"(# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString exp = R"(metadata: + version: 1 + cluster: test +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString res = NYamlConfig::ReplaceMetadata(str, metadata); + + UNIT_ASSERT_VALUES_EQUAL(res, exp); + } + + { + TString str = R"(metadata: {version: 0, cluster: tes} +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString exp = R"(metadata: + version: 1 + cluster: test +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString res = NYamlConfig::ReplaceMetadata(str, metadata); + + UNIT_ASSERT_VALUES_EQUAL(res, exp); + } + + { + TString str = R"(metadata: + version: 0 + cluster: tes +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString exp = R"(metadata: + version: 1 + cluster: test +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString res = NYamlConfig::ReplaceMetadata(str, metadata); + + UNIT_ASSERT_VALUES_EQUAL(res, exp); + } + + { + TString str = R"(metadata: + version: 0 + cool: {foo: bar} + cluster: tes +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString exp = R"(metadata: + version: 1 + cluster: test +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString res = NYamlConfig::ReplaceMetadata(str, metadata); + + UNIT_ASSERT_VALUES_EQUAL(res, exp); + } + + { + TString str = R"( + +--- +metadata: + version: 0 + cluster: tes +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString exp = R"( + +--- +metadata: + version: 1 + cluster: test +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString res = NYamlConfig::ReplaceMetadata(str, metadata); + + UNIT_ASSERT_VALUES_EQUAL(res, exp); + } + + { + TString str = R"( + +--- +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString exp = R"( + +--- +metadata: + version: 1 + cluster: test +# comment1 +value: 1 +array: [{test: "1"}] +obj: {value: 2} # comment2 +# comment3 +)"; + + TString res = NYamlConfig::ReplaceMetadata(str, metadata); + + UNIT_ASSERT_VALUES_EQUAL(res, exp); + } + } } |