summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinnokentii <[email protected]>2023-05-08 20:54:03 +0300
committerinnokentii <[email protected]>2023-05-08 20:54:03 +0300
commit0e76812af073f4215087ba85c7a47149f6029f5b (patch)
treec7af41af3bd51eb8f2af9bcb63d2ad910cb03615
parent5523ac2e2e80f6499ae2e8b20aeb11a75aa74ff8 (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.cpp54
-rw-r--r--ydb/core/cms/console/yaml_config/yaml_config.h18
-rw-r--r--ydb/core/cms/console/yaml_config/yaml_config_ut.cpp238
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);
+ }
+ }
}