aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitalyisaev <vitalyisaev@yandex-team.com>2023-07-13 16:10:32 +0300
committervitalyisaev <vitalyisaev@yandex-team.com>2023-07-13 16:10:32 +0300
commit3466d4a0b4bce07d32a57bbf155ede5c670eccdf (patch)
tree96da2705194ac202f5e299fe4971567cfa16e133
parentbf723bc6fa78d9d97e362cf73457b28ad04b4956 (diff)
downloadydb-3466d4a0b4bce07d32a57bbf155ede5c670eccdf.tar.gz
YQ Connector: YQ's Managed PostgreSQL connections
-rw-r--r--ydb/core/fq/libs/actors/clusters_from_connections.cpp43
-rw-r--r--ydb/core/fq/libs/actors/pending_fetcher.cpp1
-rw-r--r--ydb/core/fq/libs/actors/run_actor.cpp3
-rw-r--r--ydb/core/fq/libs/cloud_audit/yq_cloud_audit_service.cpp2
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/utils.h11
-rw-r--r--ydb/core/fq/libs/control_plane_storage/internal/task_get.cpp3
-rw-r--r--ydb/core/fq/libs/control_plane_storage/message_builders.h34
-rw-r--r--ydb/core/fq/libs/control_plane_storage/request_validators.cpp64
-rw-r--r--ydb/core/fq/libs/control_plane_storage/request_validators.h15
-rw-r--r--ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp19
-rw-r--r--ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_impl.h4
-rw-r--r--ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp2
-rw-r--r--ydb/core/fq/libs/test_connection/request_validators.h4
-rw-r--r--ydb/public/api/protos/draft/fq.proto14
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;
}
}