diff options
author | vitalyisaev <vitalyisaev@yandex-team.com> | 2023-07-13 16:10:32 +0300 |
---|---|---|
committer | vitalyisaev <vitalyisaev@yandex-team.com> | 2023-07-13 16:10:32 +0300 |
commit | 3466d4a0b4bce07d32a57bbf155ede5c670eccdf (patch) | |
tree | 96da2705194ac202f5e299fe4971567cfa16e133 | |
parent | bf723bc6fa78d9d97e362cf73457b28ad04b4956 (diff) | |
download | ydb-3466d4a0b4bce07d32a57bbf155ede5c670eccdf.tar.gz |
YQ Connector: YQ's Managed PostgreSQL connections
14 files changed, 168 insertions, 51 deletions
diff --git a/ydb/core/fq/libs/actors/clusters_from_connections.cpp b/ydb/core/fq/libs/actors/clusters_from_connections.cpp index 43021c9601..8b734d81aa 100644 --- a/ydb/core/fq/libs/actors/clusters_from_connections.cpp +++ b/ydb/core/fq/libs/actors/clusters_from_connections.cpp @@ -87,6 +87,23 @@ void FillSolomonClusterConfig(NYql::TSolomonClusterConfig& clusterConfig, FillClusterAuth(clusterConfig, monitoring.auth(), authToken, accountIdSignatures); } +template <typename TConnection> +void FillGenericClusterConfig( + NYql::TGenericClusterConfig& clusterCfg, + const TConnection& connection, + const TString& connectionName, + NConnector::NApi::EDataSourceKind dataSourceKind, + const TString& authToken, + const THashMap<TString, TString>& accountIdSignatures +){ + clusterCfg.SetKind(dataSourceKind); + clusterCfg.SetName(connectionName); + clusterCfg.SetDatabaseId(connection.database_id()); + clusterCfg.mutable_credentials()->mutable_basic()->set_username(connection.login()); + clusterCfg.mutable_credentials()->mutable_basic()->set_password(connection.password()); + FillClusterAuth(clusterCfg, connection.auth(), authToken, accountIdSignatures); +} + } //namespace NYql::TPqClusterConfig CreatePqClusterConfig(const TString& name, @@ -152,14 +169,13 @@ void AddClustersFromConnections( break; } case FederatedQuery::ConnectionSetting::kClickhouseCluster: { - const auto& ch = conn.content().setting().clickhouse_cluster(); - auto* clusterCfg = gatewaysConfig.MutableGeneric()->AddClusterMapping(); - clusterCfg->SetKind(NYql::NConnector::NApi::EDataSourceKind::CLICKHOUSE); - clusterCfg->SetName(connectionName); - clusterCfg->SetDatabaseId(ch.database_id()); - clusterCfg->mutable_credentials()->mutable_basic()->set_username(ch.login()); - clusterCfg->mutable_credentials()->mutable_basic()->set_password(ch.password()); - FillClusterAuth(*clusterCfg, ch.auth(), authToken, accountIdSignatures); + FillGenericClusterConfig( + *gatewaysConfig.MutableGeneric()->AddClusterMapping(), + conn.content().setting().clickhouse_cluster(), + connectionName, + NYql::NConnector::NApi::EDataSourceKind::CLICKHOUSE, + authToken, + accountIdSignatures); clusters.emplace(connectionName, GenericProviderName); break; } @@ -184,6 +200,17 @@ void AddClustersFromConnections( clusters.emplace(connectionName, SolomonProviderName); break; } + case FederatedQuery::ConnectionSetting::kPostgresqlCluster: { + FillGenericClusterConfig( + *gatewaysConfig.MutableGeneric()->AddClusterMapping(), + conn.content().setting().postgresql_cluster(), + connectionName, + NYql::NConnector::NApi::EDataSourceKind::POSTGRESQL, + authToken, + accountIdSignatures); + clusters.emplace(connectionName, GenericProviderName); + break; + } // Do not replace with default. Adding a new connection should cause a compilation error case FederatedQuery::ConnectionSetting::CONNECTION_NOT_SET: diff --git a/ydb/core/fq/libs/actors/pending_fetcher.cpp b/ydb/core/fq/libs/actors/pending_fetcher.cpp index 0183e09ed3..8bc773d11c 100644 --- a/ydb/core/fq/libs/actors/pending_fetcher.cpp +++ b/ydb/core/fq/libs/actors/pending_fetcher.cpp @@ -25,7 +25,6 @@ #include <ydb/library/yql/providers/generic/connector/libcpp/client.h> #include <ydb/library/yql/dq/integration/transform/yql_dq_task_transform.h> #include <ydb/library/yql/providers/ydb/provider/yql_ydb_provider.h> -#include <ydb/library/yql/providers/clickhouse/provider/yql_clickhouse_provider.h> #include <ydb/library/yql/sql/settings/translation_settings.h> #include <library/cpp/yson/node/node_io.h> #include <ydb/library/yql/minikql/mkql_alloc.h> diff --git a/ydb/core/fq/libs/actors/run_actor.cpp b/ydb/core/fq/libs/actors/run_actor.cpp index 531da5cbc9..f2977c626e 100644 --- a/ydb/core/fq/libs/actors/run_actor.cpp +++ b/ydb/core/fq/libs/actors/run_actor.cpp @@ -2041,6 +2041,9 @@ private: case FederatedQuery::ConnectionSetting::kMonitoring: html << "MONITORING"; break; + case FederatedQuery::ConnectionSetting::kPostgresqlCluster: + html << "POSTGRESQL"; + break; default: html << "UNDEFINED"; break; diff --git a/ydb/core/fq/libs/cloud_audit/yq_cloud_audit_service.cpp b/ydb/core/fq/libs/cloud_audit/yq_cloud_audit_service.cpp index 5b34cfd43b..1c7620b303 100644 --- a/ydb/core/fq/libs/cloud_audit/yq_cloud_audit_service.cpp +++ b/ydb/core/fq/libs/cloud_audit/yq_cloud_audit_service.cpp @@ -63,6 +63,8 @@ std::string MapConnectionType(const FederatedQuery::ConnectionSetting::Connectio return "ObjectStorage"; case FederatedQuery::ConnectionSetting::ConnectionCase::kMonitoring: return "Monitoring"; + case FederatedQuery::ConnectionSetting::ConnectionCase::kPostgresqlCluster: + return "PostgreSQLCluster"; default: Y_ENSURE(false, "Invalid connection case " << i32(connectionCase)); } diff --git a/ydb/core/fq/libs/control_plane_proxy/utils.h b/ydb/core/fq/libs/control_plane_proxy/utils.h index 074d459645..51c5abdf84 100644 --- a/ydb/core/fq/libs/control_plane_proxy/utils.h +++ b/ydb/core/fq/libs/control_plane_proxy/utils.h @@ -11,7 +11,7 @@ inline TString GetServiceAccountId(const FederatedQuery::IamAuth& auth) { } template<typename T> -TString ExtractServiceAccountIdImpl2(const T& setting) { +TString ExtractServiceAccountIdWithConnection(const T& setting) { switch (setting.connection_case()) { case FederatedQuery::ConnectionSetting::kYdbDatabase: { return GetServiceAccountId(setting.ydb_database().auth()); @@ -28,6 +28,9 @@ TString ExtractServiceAccountIdImpl2(const T& setting) { case FederatedQuery::ConnectionSetting::kClickhouseCluster: { return GetServiceAccountId(setting.clickhouse_cluster().auth()); } + case FederatedQuery::ConnectionSetting::kPostgresqlCluster: { + return GetServiceAccountId(setting.postgresql_cluster().auth()); + } // Do not replace with default. Adding a new connection should cause a compilation error case FederatedQuery::ConnectionSetting::CONNECTION_NOT_SET: break; @@ -36,15 +39,15 @@ TString ExtractServiceAccountIdImpl2(const T& setting) { } inline TString ExtractServiceAccountId(const FederatedQuery::TestConnectionRequest& c) { - return ExtractServiceAccountIdImpl2(c.setting()); + return ExtractServiceAccountIdWithConnection(c.setting()); } inline TString ExtractServiceAccountId(const FederatedQuery::CreateConnectionRequest& c) { - return ExtractServiceAccountIdImpl2(c.content().setting()); + return ExtractServiceAccountIdWithConnection(c.content().setting()); } inline TString ExtractServiceAccountId(const FederatedQuery::ModifyConnectionRequest& c) { - return ExtractServiceAccountIdImpl2(c.content().setting()); + return ExtractServiceAccountIdWithConnection(c.content().setting()); } template<typename T> diff --git a/ydb/core/fq/libs/control_plane_storage/internal/task_get.cpp b/ydb/core/fq/libs/control_plane_storage/internal/task_get.cpp index cda14c2a5c..b32f8e1b55 100644 --- a/ydb/core/fq/libs/control_plane_storage/internal/task_get.cpp +++ b/ydb/core/fq/libs/control_plane_storage/internal/task_get.cpp @@ -52,6 +52,9 @@ struct TTaskInternal { case FederatedQuery::ConnectionSetting::kClickhouseCluster: { return GetServiceAccountId(c.content().setting().clickhouse_cluster().auth()); } + case FederatedQuery::ConnectionSetting::kPostgresqlCluster: { + return GetServiceAccountId(c.content().setting().postgresql_cluster().auth()); + } // Do not replace with default. Adding a new connection should cause a compilation error case FederatedQuery::ConnectionSetting::CONNECTION_NOT_SET: break; diff --git a/ydb/core/fq/libs/control_plane_storage/message_builders.h b/ydb/core/fq/libs/control_plane_storage/message_builders.h index 5770cddce2..ed5c3975c5 100644 --- a/ydb/core/fq/libs/control_plane_storage/message_builders.h +++ b/ydb/core/fq/libs/control_plane_storage/message_builders.h @@ -449,21 +449,39 @@ public: return *this; } - TCreateConnectionBuilder& CreateClickHouse(const TString& databaseId, const TString& login, const TString& password, const TString& serviceAccount) - { - auto& ch = *Request.mutable_content()->mutable_setting()->mutable_clickhouse_cluster(); + template <typename TConnection> + TCreateConnectionBuilder& CreateGeneric( + TConnection& conn, + const TString& databaseId, + const TString& login, + const TString& password, + const TString& serviceAccount) + { + // auto& ch = *Request.mutable_content()->mutable_setting()->mutable_clickhouse_cluster(); if (serviceAccount) { - ch.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + conn.mutable_auth()->mutable_service_account()->set_id(serviceAccount); } else { - ch.mutable_auth()->mutable_current_iam(); + conn.mutable_auth()->mutable_current_iam(); } - ch.set_database_id(databaseId); - ch.set_login(login); - ch.set_password(password); + conn.set_database_id(databaseId); + conn.set_login(login); + conn.set_password(password); return *this; } + TCreateConnectionBuilder& CreateClickHouse(const TString& databaseId, const TString& login, const TString& password, const TString& serviceAccount) + { + auto& conn = *Request.mutable_content()->mutable_setting()->mutable_clickhouse_cluster(); + return CreateGeneric(conn, databaseId, login, password, serviceAccount); + } + + TCreateConnectionBuilder& CreatePostgreSQL(const TString& databaseId, const TString& login, const TString& password, const TString& serviceAccount) + { + auto& conn = *Request.mutable_content()->mutable_setting()->mutable_postgresql_cluster(); + return CreateGeneric(conn, databaseId, login, password, serviceAccount); + } + TCreateConnectionBuilder& CreateObjectStorage(const TString& bucket, const TString& serviceAccount) { auto& os = *Request.mutable_content()->mutable_setting()->mutable_object_storage(); diff --git a/ydb/core/fq/libs/control_plane_storage/request_validators.cpp b/ydb/core/fq/libs/control_plane_storage/request_validators.cpp index 82768fc6fb..ca21f6f086 100644 --- a/ydb/core/fq/libs/control_plane_storage/request_validators.cpp +++ b/ydb/core/fq/libs/control_plane_storage/request_validators.cpp @@ -109,7 +109,44 @@ TMap<TString, NYql::NUdf::EDataSlot> GetDataSlotColumns(const FederatedQuery::Sc } -NYql::TIssues ValidateConnectionSetting(const FederatedQuery::ConnectionSetting& setting, const TSet<FederatedQuery::ConnectionSetting::ConnectionCase>& availableConnections, bool disableCurrentIam, bool clickHousePasswordRequire) { +template <typename TConnection> +void ValidateGenericConnectionSetting( + const TConnection& connection, + const TString& dataSourceKind, + bool disableCurrentIam, + bool passwordRequired, + NYql::TIssues& issues +) { + if (!connection.has_auth() || connection.auth().identity_case() == FederatedQuery::IamAuth::IDENTITY_NOT_SET) { + auto msg = TStringBuilder() << "content.setting." << dataSourceKind << "_cluster.auth is not specified"; + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, msg)); + } + + if (connection.auth().identity_case() == FederatedQuery::IamAuth::kCurrentIam && disableCurrentIam) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); + } + + if (!connection.database_id() && !(connection.host() && connection.port())) { + auto msg = TStringBuilder() << "content.setting.clickhouse_cluster.{database_id or host,port} field is not specified"; + issues.AddIssue( MakeErrorIssue(TIssuesIds::BAD_REQUEST,msg)); + } + + if (!connection.login()) { + auto msg = TStringBuilder() << "content.setting." << dataSourceKind << "_cluster.login is not specified"; + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, msg)); + } + + if (!connection.password() && passwordRequired) { + auto msg = TStringBuilder() << "content.setting." << dataSourceKind << "_cluster.password is not specified"; + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, msg)); + } +} + +NYql::TIssues ValidateConnectionSetting( + const FederatedQuery::ConnectionSetting &setting, + const TSet<FederatedQuery::ConnectionSetting::ConnectionCase> &availableConnections, + bool disableCurrentIam, + bool passwordRequired) { NYql::TIssues issues; if (!availableConnections.contains(setting.connection_case())) { issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "connection of the specified type is disabled")); @@ -132,26 +169,11 @@ NYql::TIssues ValidateConnectionSetting(const FederatedQuery::ConnectionSetting& break; } case FederatedQuery::ConnectionSetting::kClickhouseCluster: { - const FederatedQuery::ClickHouseCluster ch = setting.clickhouse_cluster(); - if (!ch.has_auth() || ch.auth().identity_case() == FederatedQuery::IamAuth::IDENTITY_NOT_SET) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.auth field is not specified")); - } - - if (ch.auth().identity_case() == FederatedQuery::IamAuth::kCurrentIam && disableCurrentIam) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); - } - - if (!ch.database_id() && !(ch.host() && ch.port())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.{database_id or host,port} field is not specified")); - } - - if (!ch.login()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.login field is not specified")); - } - - if (!ch.password() && clickHousePasswordRequire) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.password field is not specified")); - } + ValidateGenericConnectionSetting(setting.clickhouse_cluster(), "clickhouse", disableCurrentIam, passwordRequired, issues); + break; + } + case FederatedQuery::ConnectionSetting::kPostgresqlCluster: { + ValidateGenericConnectionSetting(setting.postgresql_cluster(), "postgresql", disableCurrentIam, passwordRequired, issues); break; } case FederatedQuery::ConnectionSetting::kObjectStorage: { diff --git a/ydb/core/fq/libs/control_plane_storage/request_validators.h b/ydb/core/fq/libs/control_plane_storage/request_validators.h index 132a8a91b2..c770cb1454 100644 --- a/ydb/core/fq/libs/control_plane_storage/request_validators.h +++ b/ydb/core/fq/libs/control_plane_storage/request_validators.h @@ -153,10 +153,19 @@ NYql::TIssues ValidateBinding(const T& ev, size_t maxSize, const TSet<FederatedQ return issues; } -NYql::TIssues ValidateConnectionSetting(const FederatedQuery::ConnectionSetting& setting, const TSet<FederatedQuery::ConnectionSetting::ConnectionCase>& availableConnections, bool disableCurrentIam, bool clickHousePasswordRequire = true); +NYql::TIssues ValidateConnectionSetting( + const FederatedQuery::ConnectionSetting& setting, + const TSet<FederatedQuery::ConnectionSetting::ConnectionCase>& availableConnections, + bool disableCurrentIam, + bool passwordRequired = true); template<typename T> -NYql::TIssues ValidateConnection(const T& ev, size_t maxSize, const TSet<FederatedQuery::ConnectionSetting::ConnectionCase>& availableConnections, bool disableCurrentIam, bool clickHousePasswordRequire = true) +NYql::TIssues ValidateConnection( + const T& ev, + size_t maxSize, + const TSet<FederatedQuery::ConnectionSetting::ConnectionCase>& availableConnections, + bool disableCurrentIam, + bool passwordRequired = true) { const auto& request = ev->Get()->Request; NYql::TIssues issues = ValidateEvent(ev, maxSize); @@ -179,7 +188,7 @@ NYql::TIssues ValidateConnection(const T& ev, size_t maxSize, const TSet<Federat } const FederatedQuery::ConnectionSetting& setting = content.setting(); - issues.AddIssues(ValidateConnectionSetting(setting, availableConnections, disableCurrentIam, clickHousePasswordRequire)); + issues.AddIssues(ValidateConnectionSetting(setting, availableConnections, disableCurrentIam, passwordRequired)); return issues; } diff --git a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp index 6c8f1a1c40..24f487b086 100644 --- a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp +++ b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp @@ -246,6 +246,10 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListConnect auto& ch = *setting.mutable_clickhouse_cluster(); ch.set_password(""); } + if (setting.has_postgresql_cluster()) { + auto& pg = *setting.mutable_postgresql_cluster(); + pg.set_password(""); + } } if (result.connection_size() == limit + 1) { @@ -348,6 +352,10 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeCon auto& ch = *setting.mutable_clickhouse_cluster(); ch.set_password(""); } + if (setting.has_postgresql_cluster()) { + auto& pg = *setting.mutable_postgresql_cluster(); + pg.set_password(""); + } return result; }; @@ -449,14 +457,21 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyConne ythrow TCodeLineException(TIssuesIds::BAD_REQUEST) << "Changing visibility from SCOPE to PRIVATE is forbidden. Please create a new connection with visibility PRIVATE"; } - TString clickHousePassword; + // FIXME: this code needs better generalization if (request.content().setting().has_clickhouse_cluster()) { - clickHousePassword = request.content().setting().clickhouse_cluster().password(); + auto clickHousePassword = request.content().setting().clickhouse_cluster().password(); if (!clickHousePassword) { clickHousePassword = content.setting().clickhouse_cluster().password(); } content = request.content(); content.mutable_setting()->mutable_clickhouse_cluster()->set_password(clickHousePassword); + } else if (request.content().setting().has_postgresql_cluster()) { + auto postgreSQLPassword = request.content().setting().postgresql_cluster().password(); + if (!postgreSQLPassword) { + postgreSQLPassword = content.setting().postgresql_cluster().password(); + } + content = request.content(); + content.mutable_setting()->mutable_postgresql_cluster()->set_password(postgreSQLPassword); } else { content = request.content(); } diff --git a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_impl.h b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_impl.h index 408413ee90..7aed14283f 100644 --- a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_impl.h +++ b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_impl.h @@ -300,11 +300,11 @@ protected: bool IsSuperUser(const TString& user); template<typename T> - NYql::TIssues ValidateConnection(T& ev, bool clickHousePasswordRequire = true) + NYql::TIssues ValidateConnection(T& ev, bool passwordRequired = true) { return ::NFq::ValidateConnection<T>(ev, Config->Proto.GetMaxRequestSize(), Config->AvailableConnections, Config->Proto.GetDisableCurrentIam(), - clickHousePasswordRequire); + passwordRequired); } template<typename T> diff --git a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp index 9c8764e5df..10912e012e 100644 --- a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp +++ b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp @@ -37,6 +37,8 @@ FederatedQuery::IamAuth::IdentityCase GetIamAuth(const FederatedQuery::Connectio return setting.data_streams().auth().identity_case(); case FederatedQuery::ConnectionSetting::kMonitoring: return setting.monitoring().auth().identity_case(); + case FederatedQuery::ConnectionSetting::kPostgresqlCluster: + return setting.postgresql_cluster().auth().identity_case(); case FederatedQuery::ConnectionSetting::CONNECTION_NOT_SET: return FederatedQuery::IamAuth::IDENTITY_NOT_SET; } diff --git a/ydb/core/fq/libs/test_connection/request_validators.h b/ydb/core/fq/libs/test_connection/request_validators.h index 66d6538e4c..714bd211cc 100644 --- a/ydb/core/fq/libs/test_connection/request_validators.h +++ b/ydb/core/fq/libs/test_connection/request_validators.h @@ -5,7 +5,7 @@ namespace NFq { template<typename T> -NYql::TIssues ValidateTestConnection(T& ev, size_t maxSize, const TSet<FederatedQuery::ConnectionSetting::ConnectionCase>& availableConnections, bool disableCurrentIam, bool clickHousePasswordRequire = true) +NYql::TIssues ValidateTestConnection(T& ev, size_t maxSize, const TSet<FederatedQuery::ConnectionSetting::ConnectionCase>& availableConnections, bool disableCurrentIam, bool passwordRequired = true) { const auto& request = ev->Get()->Request; NYql::TIssues issues = ValidateEvent(ev, maxSize); @@ -15,7 +15,7 @@ NYql::TIssues ValidateTestConnection(T& ev, size_t maxSize, const TSet<Federated } const FederatedQuery::ConnectionSetting& setting = request.setting(); - issues.AddIssues(ValidateConnectionSetting(setting, availableConnections, disableCurrentIam, clickHousePasswordRequire)); + issues.AddIssues(ValidateConnectionSetting(setting, availableConnections, disableCurrentIam, passwordRequired)); return issues; } diff --git a/ydb/public/api/protos/draft/fq.proto b/ydb/public/api/protos/draft/fq.proto index 2d7cba7888..1a069d6635 100644 --- a/ydb/public/api/protos/draft/fq.proto +++ b/ydb/public/api/protos/draft/fq.proto @@ -474,6 +474,18 @@ message ObjectStorageConnection { IamAuth auth = 2; } +message PostgreSQLCluster { + string database_id = 1 [(Ydb.length).le = 1024]; + string login = 2 [(Ydb.length).le = 1024, (Ydb.sensitive) = true]; + string password = 3 [(Ydb.length).le = 1024, (Ydb.sensitive) = true]; + IamAuth auth = 4; + + // Just for the sake of simmetry with existing ClickHouse code + string host = 5 [(Ydb.length).le = 1024]; + int32 port = 6 [(Ydb.value) = "[0; 65536]"]; + bool secure = 7; +} + message ConnectionSetting { enum ConnectionType { CONNECTION_TYPE_UNSPECIFIED = 0; @@ -482,6 +494,7 @@ message ConnectionSetting { DATA_STREAMS = 3; OBJECT_STORAGE = 4; MONITORING = 5; + POSTGRESQL_CLUSTER = 6; } oneof connection { @@ -490,6 +503,7 @@ message ConnectionSetting { DataStreams data_streams = 3; ObjectStorageConnection object_storage = 4; Monitoring monitoring = 5; + PostgreSQLCluster postgresql_cluster = 6; } } |