aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorauzhegov <auzhegov@yandex-team.com>2023-08-04 13:39:43 +0300
committerauzhegov <auzhegov@yandex-team.com>2023-08-04 15:13:09 +0300
commit8da1cb6e4dcd6950755002e4f9341f41fd6ffb8f (patch)
tree42ba73a7b4d5a7cfd80161292a5b38ce40ad4c38
parent5af67714dddb1b9aebdcfc23efe9a8c579bd6d27 (diff)
downloadydb-8da1cb6e4dcd6950755002e4f9341f41fd6ffb8f.tar.gz
Extra validations
-rw-r--r--ydb/core/fq/libs/control_plane_config/control_plane_config.cpp14
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/actors/control_plane_storage_requester_actor.cpp4
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/actors/request_actor.h (renamed from ydb/core/fq/libs/control_plane_proxy/actors/control_plane_proxy_request_actor.h)88
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/actors/utils.h30
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/actors/ydb_schema_query_actor.cpp2
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/config.cpp12
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/config.h7
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.cpp898
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.h2
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/events/events.h7
-rw-r--r--ydb/core/fq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp42
-rw-r--r--ydb/core/fq/libs/control_plane_storage/validators.cpp9
-rw-r--r--ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp29
-rw-r--r--ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp29
-rw-r--r--ydb/core/fq/libs/init/init.cpp2
-rw-r--r--ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/core/grpc_services/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/core/grpc_services/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/core/grpc_services/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/core/grpc_services/rpc_fq.cpp8
-rw-r--r--ydb/core/grpc_services/ya.make1
21 files changed, 563 insertions, 625 deletions
diff --git a/ydb/core/fq/libs/control_plane_config/control_plane_config.cpp b/ydb/core/fq/libs/control_plane_config/control_plane_config.cpp
index 549744794f..ce474bda42 100644
--- a/ydb/core/fq/libs/control_plane_config/control_plane_config.cpp
+++ b/ydb/core/fq/libs/control_plane_config/control_plane_config.cpp
@@ -1,36 +1,24 @@
#include "control_plane_config.h"
#include <ydb/core/fq/libs/actors/logging/log.h>
-#include <ydb/core/fq/libs/config/yq_issue.h>
-#include <ydb/core/fq/libs/common/cache.h>
-#include <ydb/core/fq/libs/common/entity_id.h>
#include <ydb/core/fq/libs/control_plane_storage/control_plane_storage.h>
#include <ydb/core/fq/libs/control_plane_storage/events/events.h>
#include <ydb/core/fq/libs/control_plane_storage/util.h>
#include <ydb/core/fq/libs/quota_manager/quota_manager.h>
#include <ydb/core/fq/libs/shared_resources/db_exec.h>
-#include <ydb/core/fq/libs/test_connection/events/events.h>
-#include <ydb/core/fq/libs/ydb/util.h>
#include <ydb/core/fq/libs/ydb/ydb.h>
#include <ydb/core/fq/libs/control_plane_storage/schema.h>
#include <ydb/core/fq/libs/db_schema/db_schema.h>
-#include <ydb/core/fq/libs/quota_manager/quota_manager.h>
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <library/cpp/actors/core/actor.h>
-#include <ydb/library/ydb_issue/issue_helpers.h>
#include <ydb/library/db_pool/db_pool.h>
#include <ydb/library/yql/public/issue/yql_issue_message.h>
-#include <ydb/library/security/util.h>
-#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h>
-#include <util/generic/maybe.h>
#include <util/generic/ptr.h>
#include <util/datetime/base.h>
#include <util/digest/multi.h>
-#include <util/generic/yexception.h>
-#include <util/string/join.h>
#include <util/system/hostname.h>
namespace NFq {
@@ -205,7 +193,7 @@ private:
"WriteStateTime", true
);
- if (oldInfo) {
+ if (oldInfo) {
executer.Process(SelfId(),
[this, oldInfo=oldInfo](TStateTimeExecuter&) {
this->ReflectTenantChanges(oldInfo);
diff --git a/ydb/core/fq/libs/control_plane_proxy/actors/control_plane_storage_requester_actor.cpp b/ydb/core/fq/libs/control_plane_proxy/actors/control_plane_storage_requester_actor.cpp
index d2e7e8bfa9..3ff65a525f 100644
--- a/ydb/core/fq/libs/control_plane_proxy/actors/control_plane_storage_requester_actor.cpp
+++ b/ydb/core/fq/libs/control_plane_proxy/actors/control_plane_storage_requester_actor.cpp
@@ -16,7 +16,7 @@ namespace NFq {
namespace NPrivate {
using namespace NActors;
-using namespace NFq::NConfig;
+using namespace ::NFq::NConfig;
using namespace NKikimr;
using namespace NThreading;
@@ -76,7 +76,7 @@ public:
void SendCPSRequest() {
CPP_LOG_I("TControlPlaneStorageRequesterActor Sending CPS request. Actor id: " << TBase::SelfId());
const auto& request = Request;
- auto event = new TCPSEventRequest("yandexcloud://" + request->Get()->FolderId,
+ auto event = new TCPSEventRequest(request->Get()->Scope,
CPSRequestFactory(request),
request->Get()->User,
request->Get()->Token,
diff --git a/ydb/core/fq/libs/control_plane_proxy/actors/control_plane_proxy_request_actor.h b/ydb/core/fq/libs/control_plane_proxy/actors/request_actor.h
index 0a94b23334..12084c0ce5 100644
--- a/ydb/core/fq/libs/control_plane_proxy/actors/control_plane_proxy_request_actor.h
+++ b/ydb/core/fq/libs/control_plane_proxy/actors/request_actor.h
@@ -1,6 +1,7 @@
#pragma once
#include "counters.h"
+#include "utils.h"
#include <contrib/libs/fmt/include/fmt/format.h>
#include <library/cpp/actors/core/event.h>
@@ -29,23 +30,11 @@ protected:
typename TRequestProxy::TPtr RequestProxy;
::NFq::TControlPlaneProxyConfig Config;
- TRequestProto RequestProto;
- TString Scope;
- TString FolderId;
- TString User;
- TString Token;
- TActorId Sender;
- ui32 Cookie;
TActorId ServiceId;
TRequestCounters Counters;
TInstant StartTime;
std::function<void(const TDuration&, bool /* isSuccess */, bool /* isTimeout */)> Probe;
TPermissions Permissions;
- TString CloudId;
- TString SubjectType;
- const TMaybe<TQuotaMap> Quotas;
- TTenantInfo::TPtr TenantInfo;
- TMaybe<FederatedQuery::Internal::ComputeDatabaseInternal> ComputeDatabase;
ui32 RetryCount = 0;
bool ReplyWithResponseOnSuccess = true;
@@ -54,41 +43,18 @@ public:
explicit TRequestActor(typename TRequestProxy::TPtr requestProxy,
const ::NFq::TControlPlaneProxyConfig& config,
- TActorId sender,
- ui32 cookie,
- const TString& scope,
- const TString& folderId,
- TRequestProto&& requestProto,
- TString&& user,
- TString&& token,
const TActorId& serviceId,
const TRequestCounters& counters,
const std::function<void(const TDuration&, bool, bool)>& probe,
- TPermissions permissions,
- const TString& cloudId,
- const TString& subjectType,
- TMaybe<TQuotaMap>&& quotas = Nothing(),
- TMaybe<FederatedQuery::Internal::ComputeDatabaseInternal>&&
- computeDatabase = Nothing(),
+ const TPermissions& availablePermissions,
bool replyWithResponseOnSuccess = true)
: RequestProxy(requestProxy)
, Config(config)
- , RequestProto(std::forward<TRequestProto>(requestProto))
- , Scope(scope)
- , FolderId(folderId)
- , User(std::move(user))
- , Token(std::move(token))
- , Sender(sender)
- , Cookie(cookie)
, ServiceId(serviceId)
, Counters(counters)
, StartTime(TInstant::Now())
, Probe(probe)
- , Permissions(permissions)
- , CloudId(cloudId)
- , SubjectType(subjectType)
- , Quotas(std::move(quotas))
- , ComputeDatabase(std::move(computeDatabase))
+ , Permissions(ExtractPermissions(RequestProxy, availablePermissions))
, ReplyWithResponseOnSuccess(replyWithResponseOnSuccess) {
Counters.IncInFly();
}
@@ -117,8 +83,8 @@ public:
}
void Handle(TEvControlPlaneConfig::TEvGetTenantInfoResponse::TPtr& ev) {
- TenantInfo = std::move(ev->Get()->TenantInfo);
- if (TenantInfo) {
+ RequestProxy->Get()->TenantInfo = std::move(ev->Get()->TenantInfo);
+ if (RequestProxy->Get()->TenantInfo) {
SendRequestIfCan();
} else {
RetryCount++;
@@ -128,7 +94,7 @@ public:
}
void HandleTimeout() {
- CPP_LOG_D("Request timeout. " << RequestProto.DebugString());
+ CPP_LOG_D("Request timeout. " << RequestProxy->Get()->Request.DebugString());
NYql::TIssues issues;
NYql::TIssue issue =
MakeErrorIssue(TIssuesIds::TIMEOUT,
@@ -166,7 +132,7 @@ public:
const TDuration delta = TInstant::Now() - StartTime;
Counters.IncError();
Probe(delta, false, isTimeout);
- Send(Sender, new TResponseProxy(issues, SubjectType), 0, Cookie);
+ Send(RequestProxy->Sender, new TResponseProxy(issues, RequestProxy->Get()->SubjectType), 0, RequestProxy->Cookie);
PassAway();
}
@@ -176,35 +142,35 @@ public:
Counters.IncOk();
Probe(delta, true, false);
if (ReplyWithResponseOnSuccess) {
- Send(Sender,
- new TResponseProxy(std::forward<TArgs>(args)..., SubjectType),
+ Send(RequestProxy->Sender,
+ new TResponseProxy(std::forward<TArgs>(args)..., RequestProxy->Get()->SubjectType),
0,
- Cookie);
+ RequestProxy->Cookie);
} else {
RequestProxy->Get()->Response =
- std::make_unique<TResponseProxy>(std::forward<TArgs>(args)..., SubjectType);
+ std::make_unique<TResponseProxy>(std::forward<TArgs>(args)..., RequestProxy->Get()->SubjectType);
RequestProxy->Get()->ControlPlaneYDBOperationWasPerformed = true;
Send(RequestProxy->Forward(ControlPlaneProxyActorId()));
}
PassAway();
}
- virtual bool CanSendRequest() const { return bool(TenantInfo); }
+ virtual bool CanSendRequest() const { return bool(RequestProxy->Get()->TenantInfo); }
void SendRequestIfCan() {
if (CanSendRequest()) {
Send(ServiceId,
- new TRequest(Scope,
- RequestProto,
- User,
- Token,
- CloudId,
+ new TRequest(RequestProxy->Get()->Scope,
+ RequestProxy->Get()->Request,
+ RequestProxy->Get()->User,
+ RequestProxy->Get()->Token,
+ RequestProxy->Get()->CloudId,
Permissions,
- Quotas,
- TenantInfo,
- ComputeDatabase.GetOrElse({})),
+ RequestProxy->Get()->Quotas,
+ RequestProxy->Get()->TenantInfo,
+ RequestProxy->Get()->ComputeDatabase.GetOrElse({})),
0,
- Cookie);
+ RequestProxy->Cookie);
}
}
@@ -240,7 +206,7 @@ public:
void OnBootstrap() override {
Become(&TCreateQueryRequestActor::StateFunc);
- if (Quotas) {
+ if (RequestProxy->Get()->Quotas) {
SendCreateRateLimiterResourceRequest();
} else {
SendRequestIfCan();
@@ -248,21 +214,21 @@ public:
}
void SendCreateRateLimiterResourceRequest() {
- if (auto quotaIt = Quotas->find(QUOTA_CPU_PERCENT_LIMIT); quotaIt != Quotas->end()) {
+ if (auto quotaIt = RequestProxy->Get()->Quotas->find(QUOTA_CPU_PERCENT_LIMIT); quotaIt != RequestProxy->Get()->Quotas->end()) {
const double cloudLimit = static_cast<double>(quotaIt->second.Limit.Value *
10); // percent -> milliseconds
CPP_LOG_T("Create rate limiter resource for cloud with limit " << cloudLimit
<< "ms");
Send(RateLimiterControlPlaneServiceId(),
- new TEvRateLimiter::TEvCreateResource(CloudId, cloudLimit));
+ new TEvRateLimiter::TEvCreateResource(RequestProxy->Get()->CloudId, cloudLimit));
} else {
NYql::TIssues issues;
NYql::TIssue issue =
MakeErrorIssue(TIssuesIds::INTERNAL_ERROR,
- TStringBuilder() << "CPU quota for cloud \"" << CloudId
+ TStringBuilder() << "CPU quota for cloud \"" << RequestProxy->Get()->CloudId
<< "\" was not found");
issues.AddIssue(issue);
- CPP_LOG_W("Failed to get cpu quota for cloud " << CloudId);
+ CPP_LOG_W("Failed to get cpu quota for cloud " << RequestProxy->Get()->CloudId);
ReplyWithError(issues);
}
}
@@ -285,7 +251,7 @@ public:
}
bool CanSendRequest() const override {
- return (QuoterResourceCreated || !Quotas) && TBaseRequestActor::CanSendRequest();
+ return (QuoterResourceCreated || !RequestProxy->Get()->Quotas) && TBaseRequestActor::CanSendRequest();
}
};
diff --git a/ydb/core/fq/libs/control_plane_proxy/actors/utils.h b/ydb/core/fq/libs/control_plane_proxy/actors/utils.h
index 42701c3311..96ebcf1227 100644
--- a/ydb/core/fq/libs/control_plane_proxy/actors/utils.h
+++ b/ydb/core/fq/libs/control_plane_proxy/actors/utils.h
@@ -10,11 +10,11 @@ namespace NFq {
template<typename T>
std::shared_ptr<NYdb::NTable::TTableClient> CreateNewTableClient(
const T& ev,
- const NFq::TComputeConfig& computeConfig,
+ const ::NFq::TComputeConfig& computeConfig,
const TYqSharedResources::TPtr& yqSharedResources,
const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory) {
- auto scope = "yandexcloud://" + ev->Get()->FolderId;
- NFq::NConfig::TYdbStorageConfig computeConnection = computeConfig.GetConnection(scope);
+ auto scope = ev->Get()->Scope;
+ ::NFq::NConfig::TYdbStorageConfig computeConnection = computeConfig.GetConnection(scope);
computeConnection.set_endpoint(ev->Get()->ComputeDatabase->connection().endpoint());
computeConnection.set_database(ev->Get()->ComputeDatabase->connection().database());
@@ -27,4 +27,28 @@ std::shared_ptr<NYdb::NTable::TTableClient> CreateNewTableClient(
tableSettings);
}
+inline static const TMap<TString, TPermissions::TPermission> PermissionsItems = {
+ {"yq.resources.viewPublic@as", TPermissions::VIEW_PUBLIC},
+ {"yq.resources.viewPrivate@as", TPermissions::VIEW_PRIVATE},
+ {"yq.queries.viewAst@as", TPermissions::VIEW_AST},
+ {"yq.resources.managePublic@as", TPermissions::MANAGE_PUBLIC},
+ {"yq.resources.managePrivate@as", TPermissions::MANAGE_PRIVATE},
+ {"yq.queries.invoke@as", TPermissions::QUERY_INVOKE},
+ {"yq.queries.viewQueryText@as", TPermissions::VIEW_QUERY_TEXT},
+};
+
+template<typename T>
+TPermissions ExtractPermissions(T& ev, const TPermissions& availablePermissions) {
+ TPermissions permissions;
+ for (const auto& permission : ev->Get()->Permissions) {
+ if (auto it = PermissionsItems.find(permission); it != PermissionsItems.end()) {
+ // cut off permissions that should not be used in other services
+ if (availablePermissions.Check(it->second)) {
+ permissions.Set(it->second);
+ }
+ }
+ }
+ return permissions;
+}
+
} // namespace NFq
diff --git a/ydb/core/fq/libs/control_plane_proxy/actors/ydb_schema_query_actor.cpp b/ydb/core/fq/libs/control_plane_proxy/actors/ydb_schema_query_actor.cpp
index fbfeba1bbe..b4e8d88559 100644
--- a/ydb/core/fq/libs/control_plane_proxy/actors/ydb_schema_query_actor.cpp
+++ b/ydb/core/fq/libs/control_plane_proxy/actors/ydb_schema_query_actor.cpp
@@ -13,7 +13,7 @@ namespace NFq {
namespace NPrivate {
using namespace NActors;
-using namespace NFq::NConfig;
+using namespace ::NFq::NConfig;
using namespace NKikimr;
using namespace NThreading;
using namespace NYdb;
diff --git a/ydb/core/fq/libs/control_plane_proxy/config.cpp b/ydb/core/fq/libs/control_plane_proxy/config.cpp
index 37ad16e836..20cb82e9df 100644
--- a/ydb/core/fq/libs/control_plane_proxy/config.cpp
+++ b/ydb/core/fq/libs/control_plane_proxy/config.cpp
@@ -4,13 +4,6 @@ namespace NFq {
namespace {
-TDuration GetDuration(const TString& value, const TDuration& defaultValue)
-{
- TDuration result = defaultValue;
- TDuration::TryParse(value, result);
- return result;
-}
-
NConfig::TControlPlaneProxyConfig FillDefaultParameters(NConfig::TControlPlaneProxyConfig config)
{
if (!config.GetRequestTimeout()) {
@@ -32,9 +25,12 @@ NConfig::TControlPlaneProxyConfig FillDefaultParameters(NConfig::TControlPlanePr
TControlPlaneProxyConfig::TControlPlaneProxyConfig(
const NConfig::TControlPlaneProxyConfig& config,
+ const NConfig::TControlPlaneStorageConfig& storageConfig,
const NConfig::TComputeConfig& computeConfig,
- const NConfig::TCommonConfig& commonConfig)
+ const NConfig::TCommonConfig& commonConfig,
+ const NYql::TS3GatewayConfig& s3Config)
: Proto(FillDefaultParameters(config))
+ , StorageConfig(TControlPlaneStorageConfig(storageConfig, s3Config, commonConfig))
, ComputeConfig(computeConfig)
, CommonConfig(commonConfig)
, RequestTimeout(GetDuration(Proto.GetRequestTimeout(), TDuration::Seconds(30)))
diff --git a/ydb/core/fq/libs/control_plane_proxy/config.h b/ydb/core/fq/libs/control_plane_proxy/config.h
index ae98bb989b..9a1932e1d2 100644
--- a/ydb/core/fq/libs/control_plane_proxy/config.h
+++ b/ydb/core/fq/libs/control_plane_proxy/config.h
@@ -4,13 +4,16 @@
#include <ydb/core/fq/libs/config/protos/common.pb.h>
#include <ydb/core/fq/libs/config/protos/compute.pb.h>
#include <ydb/core/fq/libs/config/protos/control_plane_proxy.pb.h>
+#include <ydb/core/fq/libs/control_plane_storage/config.h>
#include <util/datetime/base.h>
+#include <util/generic/set.h>
namespace NFq {
struct TControlPlaneProxyConfig {
NConfig::TControlPlaneProxyConfig Proto;
+ TControlPlaneStorageConfig StorageConfig;
TComputeConfig ComputeConfig;
NConfig::TCommonConfig CommonConfig;
TDuration RequestTimeout;
@@ -19,8 +22,10 @@ struct TControlPlaneProxyConfig {
TControlPlaneProxyConfig(
const NConfig::TControlPlaneProxyConfig& config,
+ const NConfig::TControlPlaneStorageConfig& storageConfig,
const NConfig::TComputeConfig& computeConfig,
- const NConfig::TCommonConfig& commonConfig);
+ const NConfig::TCommonConfig& commonConfig,
+ const NYql::TS3GatewayConfig& s3Config);
};
} // NFq
diff --git a/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.cpp b/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.cpp
index 3244cca00b..726ad83366 100644
--- a/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.cpp
+++ b/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.cpp
@@ -8,6 +8,7 @@
#include <ydb/core/fq/libs/compute/ydb/events/events.h>
#include <ydb/core/fq/libs/control_plane_config/control_plane_config.h>
#include <ydb/core/fq/libs/control_plane_storage/control_plane_storage.h>
+#include <ydb/core/fq/libs/control_plane_storage/request_validators.h>
#include <ydb/core/fq/libs/control_plane_storage/events/events.h>
#include <ydb/core/fq/libs/quota_manager/quota_manager.h>
#include <ydb/core/fq/libs/rate_limiter/events/control_plane_events.h>
@@ -17,11 +18,12 @@
#include <ydb/core/fq/libs/ydb/ydb.h>
#include <ydb/core/fq/libs/config/yq_issue.h>
-#include <ydb/core/fq/libs/control_plane_proxy/actors/control_plane_proxy_request_actor.h>
#include <ydb/core/fq/libs/control_plane_proxy/actors/control_plane_storage_requester_actor.h>
+#include <ydb/core/fq/libs/control_plane_proxy/actors/request_actor.h>
#include <ydb/core/fq/libs/control_plane_proxy/actors/utils.h>
#include <ydb/core/fq/libs/control_plane_proxy/actors/ydb_schema_query_actor.h>
#include <ydb/core/fq/libs/control_plane_proxy/events/events.h>
+#include <ydb/public/lib/fq/scope.h>
#include <library/cpp/actors/core/actor.h>
#include <library/cpp/actors/core/actor_bootstrapped.h>
@@ -54,12 +56,12 @@ namespace NFq {
namespace {
using namespace NActors;
-using namespace NFq::NConfig;
+using namespace ::NFq::NConfig;
using namespace NKikimr;
using namespace NThreading;
using namespace NYdb;
using namespace NYdb::NTable;
-using namespace NFq::NPrivate;
+using namespace ::NFq::NPrivate;
LWTRACE_USING(YQ_CONTROL_PLANE_PROXY_PROVIDER);
@@ -266,14 +268,14 @@ class TResolveFolderActor : public NActors::TActorBootstrapped<TResolveFolderAct
public:
TResolveFolderActor(const TRequestCommonCountersPtr& counters,
TActorId sender, const ::NFq::TControlPlaneProxyConfig& config,
- const TString& folderId, const TString& token,
+ const TString& scope, const TString& token,
const std::function<void(const TDuration&, bool, bool)>& probe,
TEventRequest event,
ui32 cookie, bool quotaManagerEnabled)
: Config(config)
, Sender(sender)
, Counters(counters)
- , FolderId(folderId)
+ , FolderId(NYdb::NFq::TScope(scope).ParseFolder())
, Token(token)
, Probe(probe)
, Event(event)
@@ -379,7 +381,6 @@ class TCreateComputeDatabaseActor : public NActors::TActorBootstrapped<TCreateCo
TActorId Sender;
TRequestCommonCountersPtr Counters;
TString CloudId;
- TString FolderId;
TString Scope;
TString Token;
std::function<void(const TDuration&, bool, bool)> Probe;
@@ -389,28 +390,29 @@ class TCreateComputeDatabaseActor : public NActors::TActorBootstrapped<TCreateCo
public:
TCreateComputeDatabaseActor(const TRequestCommonCountersPtr& counters,
- TActorId sender, const ::NFq::TControlPlaneProxyConfig& config,
- const ::NFq::TComputeConfig& computeConfig, const TString& cloudId,
- const TString& folderId, const TString& scope,
- const std::function<void(const TDuration&, bool, bool)>& probe,
- TEventRequest event, ui32 cookie)
+ TActorId sender,
+ const ::NFq::TControlPlaneProxyConfig& config,
+ const ::NFq::TComputeConfig& computeConfig,
+ const TString& cloudId,
+ const TString& scope,
+ const std::function<void(const TDuration&, bool, bool)>& probe,
+ TEventRequest event,
+ ui32 cookie)
: Config(config)
, ComputeConfig(computeConfig)
, Sender(sender)
, Counters(counters)
, CloudId(cloudId)
- , FolderId(folderId)
, Scope(scope)
, Probe(probe)
, Event(event)
, Cookie(cookie)
- , StartTime(TInstant::Now())
- {}
+ , StartTime(TInstant::Now()) { }
static constexpr char ActorName[] = "YQ_CONTROL_PLANE_PROXY_CREATE_DATABASE";
void Bootstrap() {
- CPP_LOG_T("Create database bootstrap. CloudId: " << CloudId << " FolderId: " << FolderId << " Scope: " << Scope << " Actor id: " << SelfId());
+ CPP_LOG_T("Create database bootstrap. CloudId: " << CloudId << " Scope: " << Scope << " Actor id: " << SelfId());
if (!ComputeConfig.YdbComputeControlPlaneEnabled()) {
Event->Get()->ComputeDatabase = FederatedQuery::Internal::ComputeDatabaseInternal{};
TActivationContext::Send(Event->Forward(ControlPlaneProxyActorId()));
@@ -419,7 +421,7 @@ public:
}
Become(&TCreateComputeDatabaseActor::StateFunc, Config.RequestTimeout, new NActors::TEvents::TEvWakeup());
Counters->InFly->Inc();
- Send(NFq::ComputeDatabaseControlPlaneServiceActorId(), CreateRequest().release(), 0, 0);
+ Send(::NFq::ComputeDatabaseControlPlaneServiceActorId(), CreateRequest().release(), 0, 0);
}
std::unique_ptr<TEvYdbCompute::TEvCreateDatabaseRequest> CreateRequest() {
@@ -432,7 +434,7 @@ public:
)
void HandleTimeout() {
- CPP_LOG_D("Create database timeout. CloudId: " << CloudId << " FolderId: " << FolderId << " Scope: " << Scope << " Actor id: " << SelfId());
+ CPP_LOG_D("Create database timeout. CloudId: " << CloudId << " Scope: " << Scope << " Actor id: " << SelfId());
NYql::TIssues issues;
NYql::TIssue issue = MakeErrorIssue(TIssuesIds::TIMEOUT, "Create database: request timeout. Try repeating the request later");
issues.AddIssue(issue);
@@ -474,20 +476,22 @@ private:
const bool QuotaManagerEnabled;
NConfig::TComputeConfig ComputeConfig;
TActorId AccessService;
- NFq::TSigner::TPtr Signer;
+ ::NFq::TSigner::TPtr Signer;
public:
TControlPlaneProxyActor(
const NConfig::TControlPlaneProxyConfig& config,
+ const NConfig::TControlPlaneStorageConfig& storageConfig,
const NConfig::TComputeConfig& computeConfig,
const NConfig::TCommonConfig& commonConfig,
+ const NYql::TS3GatewayConfig& s3Config,
const ::NFq::TSigner::TPtr& signer,
const TYqSharedResources::TPtr& yqSharedResources,
const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory,
const ::NMonitoring::TDynamicCounterPtr& counters,
bool quotaManagerEnabled)
: Counters(counters)
- , Config(config, computeConfig, commonConfig)
+ , Config(config, storageConfig, computeConfig, commonConfig, s3Config)
, YqSharedResources(yqSharedResources)
, CredentialsProviderFactory(credentialsProviderFactory)
, QuotaManagerEnabled(quotaManagerEnabled)
@@ -549,30 +553,6 @@ private:
hFunc(NMon::TEvHttpInfo, Handle);
)
- inline static const TMap<TString, TPermissions::TPermission> PermissionsItems = {
- {"yq.resources.viewPublic@as", TPermissions::VIEW_PUBLIC},
- {"yq.resources.viewPrivate@as", TPermissions::VIEW_PRIVATE},
- {"yq.queries.viewAst@as", TPermissions::VIEW_AST},
- {"yq.resources.managePublic@as", TPermissions::MANAGE_PUBLIC},
- {"yq.resources.managePrivate@as", TPermissions::MANAGE_PRIVATE},
- {"yq.queries.invoke@as", TPermissions::QUERY_INVOKE},
- {"yq.queries.viewQueryText@as", TPermissions::VIEW_QUERY_TEXT},
- };
-
- template<typename T>
- TPermissions ExtractPermissions(T& ev, const TPermissions& availablePermissions) {
- TPermissions permissions;
- for (const auto& permission : ev->Get()->Permissions) {
- if (auto it = PermissionsItems.find(permission); it != PermissionsItems.end()) {
- // cut off permissions that should not be used in other services
- if (availablePermissions.Check(it->second)) {
- permissions.Set(it->second);
- }
- }
- }
- return permissions;
- }
-
template<typename T>
NYql::TIssues ValidatePermissions(T& ev, const TVector<TString>& requiredPermissions) {
NYql::TIssues issues;
@@ -582,23 +562,20 @@ private:
for (const auto& requiredPermission : requiredPermissions) {
if (!IsIn(ev->Get()->Permissions, requiredPermission)) {
- issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "No permission " + requiredPermission + " in a given scope yandexcloud://" + ev->Get()->FolderId));
+ issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "No permission " + requiredPermission + " in a given scope " + ev->Get()->Scope));
}
}
return issues;
}
-
-
void Handle(TEvControlPlaneProxy::TEvCreateQueryRequest::TPtr& ev) {
TInstant startTime = TInstant::Now();
FederatedQuery::CreateQueryRequest request = ev->Get()->Request;
CPP_LOG_T("CreateQueryRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const int byteSize = request.ByteSize();
@@ -613,7 +590,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvCreateQueryRequest::TPtr,
TEvControlPlaneProxy::TEvCreateQueryResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -644,7 +621,7 @@ private:
TEvControlPlaneProxy::TEvCreateQueryResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
+ scope, probe, ev, cookie));
return;
}
@@ -653,26 +630,12 @@ private:
| TPermissions::TPermission::MANAGE_PUBLIC
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
- auto quotas = ev->Get()->Quotas;
- Register(new TCreateQueryRequestActor
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType,
- std::move(quotas),
- std::move(computeDatabase)));
- }
+ Register(new TCreateQueryRequestActor(ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvListQueriesRequest::TPtr& ev) {
@@ -680,9 +643,8 @@ private:
FederatedQuery::ListQueriesRequest request = ev->Get()->Request;
CPP_LOG_T("ListQueriesRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const int byteSize = request.ByteSize();
@@ -697,7 +659,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvListQueriesRequest::TPtr,
TEvControlPlaneProxy::TEvListQueriesResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -728,26 +690,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::ListQueriesRequest,
- TEvControlPlaneStorage::TEvListQueriesRequest,
- TEvControlPlaneStorage::TEvListQueriesResponse,
- TEvControlPlaneProxy::TEvListQueriesRequest,
- TEvControlPlaneProxy::TEvListQueriesResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::ListQueriesRequest,
+ TEvControlPlaneStorage::TEvListQueriesRequest,
+ TEvControlPlaneStorage::TEvListQueriesResponse,
+ TEvControlPlaneProxy::TEvListQueriesRequest,
+ TEvControlPlaneProxy::TEvListQueriesResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvDescribeQueryRequest::TPtr& ev) {
@@ -755,9 +708,8 @@ private:
FederatedQuery::DescribeQueryRequest request = ev->Get()->Request;
CPP_LOG_T("DescribeQueryRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString queryId = request.query_id();
@@ -773,7 +725,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvDescribeQueryRequest::TPtr,
TEvControlPlaneProxy::TEvDescribeQueryResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -806,26 +758,17 @@ private:
| TPermissions::VIEW_QUERY_TEXT
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::DescribeQueryRequest,
- TEvControlPlaneStorage::TEvDescribeQueryRequest,
- TEvControlPlaneStorage::TEvDescribeQueryResponse,
- TEvControlPlaneProxy::TEvDescribeQueryRequest,
- TEvControlPlaneProxy::TEvDescribeQueryResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::DescribeQueryRequest,
+ TEvControlPlaneStorage::TEvDescribeQueryRequest,
+ TEvControlPlaneStorage::TEvDescribeQueryResponse,
+ TEvControlPlaneProxy::TEvDescribeQueryRequest,
+ TEvControlPlaneProxy::TEvDescribeQueryResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvGetQueryStatusRequest::TPtr& ev) {
@@ -833,9 +776,8 @@ private:
FederatedQuery::GetQueryStatusRequest request = ev->Get()->Request;
CPP_LOG_T("GetStatusRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString queryId = request.query_id();
@@ -851,7 +793,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvGetQueryStatusRequest::TPtr,
TEvControlPlaneProxy::TEvGetQueryStatusResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -882,26 +824,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::GetQueryStatusRequest,
- TEvControlPlaneStorage::TEvGetQueryStatusRequest,
- TEvControlPlaneStorage::TEvGetQueryStatusResponse,
- TEvControlPlaneProxy::TEvGetQueryStatusRequest,
- TEvControlPlaneProxy::TEvGetQueryStatusResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::GetQueryStatusRequest,
+ TEvControlPlaneStorage::TEvGetQueryStatusRequest,
+ TEvControlPlaneStorage::TEvGetQueryStatusResponse,
+ TEvControlPlaneProxy::TEvGetQueryStatusRequest,
+ TEvControlPlaneProxy::TEvGetQueryStatusResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvModifyQueryRequest::TPtr& ev) {
@@ -909,9 +842,8 @@ private:
FederatedQuery::ModifyQueryRequest request = ev->Get()->Request;
CPP_LOG_T("ModifyQueryRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString queryId = request.query_id();
@@ -927,7 +859,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvModifyQueryRequest::TPtr,
TEvControlPlaneProxy::TEvModifyQueryResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -958,7 +890,7 @@ private:
TEvControlPlaneProxy::TEvModifyQueryResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
+ scope, probe, ev, cookie));
return;
}
@@ -968,29 +900,17 @@ private:
| TPermissions::TPermission::MANAGE_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
- Register(new TRequestActor<FederatedQuery::ModifyQueryRequest,
- TEvControlPlaneStorage::TEvModifyQueryRequest,
- TEvControlPlaneStorage::TEvModifyQueryResponse,
- TEvControlPlaneProxy::TEvModifyQueryRequest,
- TEvControlPlaneProxy::TEvModifyQueryResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType,
- {},
- std::move(computeDatabase)));
- }
+ Register(new TRequestActor<FederatedQuery::ModifyQueryRequest,
+ TEvControlPlaneStorage::TEvModifyQueryRequest,
+ TEvControlPlaneStorage::TEvModifyQueryResponse,
+ TEvControlPlaneProxy::TEvModifyQueryRequest,
+ TEvControlPlaneProxy::TEvModifyQueryResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvDeleteQueryRequest::TPtr& ev) {
@@ -998,9 +918,8 @@ private:
FederatedQuery::DeleteQueryRequest request = ev->Get()->Request;
CPP_LOG_T("DeleteQueryRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString queryId = request.query_id();
@@ -1016,7 +935,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvDeleteQueryRequest::TPtr,
TEvControlPlaneProxy::TEvDeleteQueryResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1047,26 +966,17 @@ private:
| TPermissions::TPermission::MANAGE_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::DeleteQueryRequest,
- TEvControlPlaneStorage::TEvDeleteQueryRequest,
- TEvControlPlaneStorage::TEvDeleteQueryResponse,
- TEvControlPlaneProxy::TEvDeleteQueryRequest,
- TEvControlPlaneProxy::TEvDeleteQueryResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::DeleteQueryRequest,
+ TEvControlPlaneStorage::TEvDeleteQueryRequest,
+ TEvControlPlaneStorage::TEvDeleteQueryResponse,
+ TEvControlPlaneProxy::TEvDeleteQueryRequest,
+ TEvControlPlaneProxy::TEvDeleteQueryResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvControlQueryRequest::TPtr& ev) {
@@ -1074,9 +984,8 @@ private:
FederatedQuery::ControlQueryRequest request = ev->Get()->Request;
CPP_LOG_T("ControlQueryRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString queryId = request.query_id();
@@ -1092,7 +1001,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvControlQueryRequest::TPtr,
TEvControlPlaneProxy::TEvControlQueryResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1123,26 +1032,17 @@ private:
| TPermissions::TPermission::MANAGE_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::ControlQueryRequest,
- TEvControlPlaneStorage::TEvControlQueryRequest,
- TEvControlPlaneStorage::TEvControlQueryResponse,
- TEvControlPlaneProxy::TEvControlQueryRequest,
- TEvControlPlaneProxy::TEvControlQueryResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::ControlQueryRequest,
+ TEvControlPlaneStorage::TEvControlQueryRequest,
+ TEvControlPlaneStorage::TEvControlQueryResponse,
+ TEvControlPlaneProxy::TEvControlQueryRequest,
+ TEvControlPlaneProxy::TEvControlQueryResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvGetResultDataRequest::TPtr& ev) {
@@ -1150,9 +1050,8 @@ private:
FederatedQuery::GetResultDataRequest request = ev->Get()->Request;
CPP_LOG_T("GetResultDataRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString queryId = request.query_id();
@@ -1171,7 +1070,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvGetResultDataRequest::TPtr,
TEvControlPlaneProxy::TEvGetResultDataResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1202,26 +1101,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::GetResultDataRequest,
- TEvControlPlaneStorage::TEvGetResultDataRequest,
- TEvControlPlaneStorage::TEvGetResultDataResponse,
- TEvControlPlaneProxy::TEvGetResultDataRequest,
- TEvControlPlaneProxy::TEvGetResultDataResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::GetResultDataRequest,
+ TEvControlPlaneStorage::TEvGetResultDataRequest,
+ TEvControlPlaneStorage::TEvGetResultDataResponse,
+ TEvControlPlaneProxy::TEvGetResultDataRequest,
+ TEvControlPlaneProxy::TEvGetResultDataResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvListJobsRequest::TPtr& ev) {
@@ -1229,9 +1119,8 @@ private:
FederatedQuery::ListJobsRequest request = ev->Get()->Request;
CPP_LOG_T("ListJobsRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString queryId = request.query_id();
@@ -1247,7 +1136,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvListJobsRequest::TPtr,
TEvControlPlaneProxy::TEvListJobsResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1278,26 +1167,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::ListJobsRequest,
- TEvControlPlaneStorage::TEvListJobsRequest,
- TEvControlPlaneStorage::TEvListJobsResponse,
- TEvControlPlaneProxy::TEvListJobsRequest,
- TEvControlPlaneProxy::TEvListJobsResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::ListJobsRequest,
+ TEvControlPlaneStorage::TEvListJobsRequest,
+ TEvControlPlaneStorage::TEvListJobsResponse,
+ TEvControlPlaneProxy::TEvListJobsRequest,
+ TEvControlPlaneProxy::TEvListJobsResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvDescribeJobRequest::TPtr& ev) {
@@ -1305,9 +1185,8 @@ private:
FederatedQuery::DescribeJobRequest request = ev->Get()->Request;
CPP_LOG_T("DescribeJobRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString jobId = request.job_id();
@@ -1323,7 +1202,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvDescribeJobRequest::TPtr,
TEvControlPlaneProxy::TEvDescribeJobResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1356,26 +1235,17 @@ private:
| TPermissions::VIEW_QUERY_TEXT
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::DescribeJobRequest,
- TEvControlPlaneStorage::TEvDescribeJobRequest,
- TEvControlPlaneStorage::TEvDescribeJobResponse,
- TEvControlPlaneProxy::TEvDescribeJobRequest,
- TEvControlPlaneProxy::TEvDescribeJobResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::DescribeJobRequest,
+ TEvControlPlaneStorage::TEvDescribeJobRequest,
+ TEvControlPlaneStorage::TEvDescribeJobResponse,
+ TEvControlPlaneProxy::TEvDescribeJobRequest,
+ TEvControlPlaneProxy::TEvDescribeJobResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvCreateConnectionRequest::TPtr& ev) {
@@ -1383,10 +1253,9 @@ private:
FederatedQuery::CreateConnectionRequest request = ev->Get()->Request;
CPP_LOG_T("CreateConnectionRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
const bool ydbOperationWasPerformed = ev->Get()->ComputeYDBOperationWasPerformed;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const int byteSize = request.ByteSize();
@@ -1401,7 +1270,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvCreateConnectionRequest::TPtr,
TEvControlPlaneProxy::TEvCreateConnectionResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1437,8 +1306,34 @@ private:
TEvControlPlaneProxy::TEvCreateConnectionResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
- return;
+ scope, probe, ev, cookie));
+ return;
+ }
+
+ if (Config.ComputeConfig.YdbComputeControlPlaneEnabled() && !ev->Get()->RequestValidationPassed) {
+ auto requestValidationIssues =
+ ::NFq::ValidateConnection(ev,
+ Config.StorageConfig.Proto.GetMaxRequestSize(),
+ Config.StorageConfig.AvailableConnections,
+ Config.StorageConfig.Proto.GetDisableCurrentIam(),
+ false);
+ if (requestValidationIssues) {
+ CPS_LOG_E("CreateConnectionRequest, validation failed: "
+ << scope << " " << user << " " << NKikimr::MaskTicket(token)
+ << " " << request.DebugString()
+ << " error: " << requestValidationIssues.ToString());
+ Send(ev->Sender,
+ new TEvControlPlaneProxy::TEvCreateConnectionResponse(
+ requestValidationIssues, subjectType),
+ 0,
+ ev->Cookie);
+ requestCounters.IncError();
+ TDuration delta = TInstant::Now() - startTime;
+ requestCounters.Common->LatencyMs->Collect(delta.MilliSeconds());
+ probe(delta, false, false);
+ return;
+ }
+ ev->Get()->RequestValidationPassed = true;
}
static const TPermissions availablePermissions {
@@ -1463,29 +1358,17 @@ private:
return;
}
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
- Register(new TRequestActor<FederatedQuery::CreateConnectionRequest,
- TEvControlPlaneStorage::TEvCreateConnectionRequest,
- TEvControlPlaneStorage::TEvCreateConnectionResponse,
- TEvControlPlaneProxy::TEvCreateConnectionRequest,
- TEvControlPlaneProxy::TEvCreateConnectionResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType,
- {},
- std::move(computeDatabase)));
- }
+ Register(new TRequestActor<FederatedQuery::CreateConnectionRequest,
+ TEvControlPlaneStorage::TEvCreateConnectionRequest,
+ TEvControlPlaneStorage::TEvCreateConnectionResponse,
+ TEvControlPlaneProxy::TEvCreateConnectionRequest,
+ TEvControlPlaneProxy::TEvCreateConnectionResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvListConnectionsRequest::TPtr& ev) {
@@ -1493,9 +1376,8 @@ private:
FederatedQuery::ListConnectionsRequest request = ev->Get()->Request;
CPP_LOG_T("ListConnectionsRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const int byteSize = request.ByteSize();
@@ -1510,7 +1392,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvListConnectionsRequest::TPtr,
TEvControlPlaneProxy::TEvListConnectionsResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1541,26 +1423,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::ListConnectionsRequest,
- TEvControlPlaneStorage::TEvListConnectionsRequest,
- TEvControlPlaneStorage::TEvListConnectionsResponse,
- TEvControlPlaneProxy::TEvListConnectionsRequest,
- TEvControlPlaneProxy::TEvListConnectionsResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::ListConnectionsRequest,
+ TEvControlPlaneStorage::TEvListConnectionsRequest,
+ TEvControlPlaneStorage::TEvListConnectionsResponse,
+ TEvControlPlaneProxy::TEvListConnectionsRequest,
+ TEvControlPlaneProxy::TEvListConnectionsResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvDescribeConnectionRequest::TPtr& ev) {
@@ -1568,9 +1441,8 @@ private:
FederatedQuery::DescribeConnectionRequest request = ev->Get()->Request;
CPP_LOG_T("DescribeConnectionRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString connectionId = request.connection_id();
@@ -1586,7 +1458,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvDescribeConnectionRequest::TPtr,
TEvControlPlaneProxy::TEvDescribeConnectionResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1617,26 +1489,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::DescribeConnectionRequest,
- TEvControlPlaneStorage::TEvDescribeConnectionRequest,
- TEvControlPlaneStorage::TEvDescribeConnectionResponse,
- TEvControlPlaneProxy::TEvDescribeConnectionRequest,
- TEvControlPlaneProxy::TEvDescribeConnectionResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::DescribeConnectionRequest,
+ TEvControlPlaneStorage::TEvDescribeConnectionRequest,
+ TEvControlPlaneStorage::TEvDescribeConnectionResponse,
+ TEvControlPlaneProxy::TEvDescribeConnectionRequest,
+ TEvControlPlaneProxy::TEvDescribeConnectionResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvModifyConnectionRequest::TPtr& ev) {
@@ -1644,9 +1507,8 @@ private:
FederatedQuery::ModifyConnectionRequest request = ev->Get()->Request;
CPP_LOG_T("ModifyConnectionRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString connectionId = request.connection_id();
@@ -1662,7 +1524,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvModifyConnectionRequest::TPtr,
TEvControlPlaneProxy::TEvModifyConnectionResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1698,10 +1560,37 @@ private:
TEvControlPlaneProxy::TEvModifyConnectionResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
+ scope, probe, ev, cookie));
return;
}
+ if (Config.ComputeConfig.YdbComputeControlPlaneEnabled() &&
+ !ev->Get()->RequestValidationPassed) {
+ auto requestValidationIssues =
+ ::NFq::ValidateConnection(ev,
+ Config.StorageConfig.Proto.GetMaxRequestSize(),
+ Config.StorageConfig.AvailableConnections,
+ Config.StorageConfig.Proto.GetDisableCurrentIam(),
+ false);
+ if (requestValidationIssues) {
+ CPS_LOG_E("ModifyConnectionRequest, validation failed: "
+ << scope << " " << user << " " << NKikimr::MaskTicket(token)
+ << " " << request.DebugString()
+ << " error: " << requestValidationIssues.ToString());
+ Send(ev->Sender,
+ new TEvControlPlaneProxy::TEvModifyConnectionResponse(
+ requestValidationIssues, subjectType),
+ 0,
+ ev->Cookie);
+ requestCounters.IncError();
+ TDuration delta = TInstant::Now() - startTime;
+ requestCounters.Common->LatencyMs->Collect(delta.MilliSeconds());
+ probe(delta, false, false);
+ return;
+ }
+ ev->Get()->RequestValidationPassed = true;
+ }
+
static const TPermissions availablePermissions {
TPermissions::TPermission::MANAGE_PUBLIC
| TPermissions::TPermission::MANAGE_PRIVATE
@@ -1729,28 +1618,18 @@ private:
}
const bool controlPlaneYDBOperationWasPerformed = ev->Get()->ControlPlaneYDBOperationWasPerformed;
if (!controlPlaneYDBOperationWasPerformed) {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
Register(new TRequestActor<FederatedQuery::ModifyConnectionRequest,
TEvControlPlaneStorage::TEvModifyConnectionRequest,
TEvControlPlaneStorage::TEvModifyConnectionResponse,
TEvControlPlaneProxy::TEvModifyConnectionRequest,
- TEvControlPlaneProxy::TEvModifyConnectionResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request),
- std::move(user),
- std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId,
- subjectType,
- {},
- std::move(computeDatabase),
- !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
+ TEvControlPlaneProxy::TEvModifyConnectionResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions,
+ !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
return;
}
@@ -1783,9 +1662,8 @@ private:
FederatedQuery::DeleteConnectionRequest request = ev->Get()->Request;
CPP_LOG_T("DeleteConnectionRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString connectionId = request.connection_id();
@@ -1801,7 +1679,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvDeleteConnectionRequest::TPtr,
TEvControlPlaneProxy::TEvDeleteConnectionResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1832,7 +1710,7 @@ private:
TEvControlPlaneProxy::TEvDeleteConnectionResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
+ scope, probe, ev, cookie));
return;
}
@@ -1852,22 +1730,18 @@ private:
const bool controlPlaneYDBOperationWasPerformed = ev->Get()->ControlPlaneYDBOperationWasPerformed;
if (!controlPlaneYDBOperationWasPerformed) {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
Register(new TRequestActor<FederatedQuery::DeleteConnectionRequest,
TEvControlPlaneStorage::TEvDeleteConnectionRequest,
TEvControlPlaneStorage::TEvDeleteConnectionResponse,
TEvControlPlaneProxy::TEvDeleteConnectionRequest,
- TEvControlPlaneProxy::TEvDeleteConnectionResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request), std::move(user), std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId, subjectType, {}, std::move(computeDatabase), !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
+ TEvControlPlaneProxy::TEvDeleteConnectionResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions,
+ !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
return;
}
@@ -1894,11 +1768,11 @@ private:
FederatedQuery::TestConnectionRequest request = ev->Get()->Request;
CPP_LOG_T("TestConnectionRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
+
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
- TString token = ev->Get()->Token;
+ TString token = ev->Get()->Token;
const int byteSize = request.ByteSize();
TActorId sender = ev->Sender;
ui64 cookie = ev->Cookie;
@@ -1911,7 +1785,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvTestConnectionRequest::TPtr,
TEvControlPlaneProxy::TEvTestConnectionResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -1942,21 +1816,12 @@ private:
return;
}
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, {});
- Register(new TRequestActor<FederatedQuery::TestConnectionRequest,
- TEvTestConnection::TEvTestConnectionRequest,
- TEvTestConnection::TEvTestConnectionResponse,
- TEvControlPlaneProxy::TEvTestConnectionRequest,
- TEvControlPlaneProxy::TEvTestConnectionResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request), std::move(user), std::move(token),
- TestConnectionActorId(),
- requestCounters,
- probe, permissions, cloudId, subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::TestConnectionRequest,
+ TEvTestConnection::TEvTestConnectionRequest,
+ TEvTestConnection::TEvTestConnectionResponse,
+ TEvControlPlaneProxy::TEvTestConnectionRequest,
+ TEvControlPlaneProxy::TEvTestConnectionResponse>(
+ ev, Config, TestConnectionActorId(), requestCounters, probe, {}));
}
void Handle(TEvControlPlaneProxy::TEvCreateBindingRequest::TPtr& ev) {
@@ -1964,10 +1829,9 @@ private:
FederatedQuery::CreateBindingRequest request = ev->Get()->Request;
CPP_LOG_T("CreateBindingRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
const bool ydbOperationWasPerformed = ev->Get()->ComputeYDBOperationWasPerformed;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const int byteSize = request.ByteSize();
@@ -1982,7 +1846,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvCreateBindingRequest::TPtr,
TEvControlPlaneProxy::TEvCreateBindingResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -2016,10 +1880,36 @@ private:
TEvControlPlaneProxy::TEvCreateBindingResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
+ scope, probe, ev, cookie));
return;
}
+ if (Config.ComputeConfig.YdbComputeControlPlaneEnabled() &&
+ !ev->Get()->RequestValidationPassed) {
+ auto requestValidationIssues =
+ ::NFq::ValidateBinding(ev,
+ Config.StorageConfig.Proto.GetMaxRequestSize(),
+ Config.StorageConfig.AvailableBindings,
+ Config.StorageConfig.GeneratorPathsLimit);
+ if (requestValidationIssues) {
+ CPS_LOG_E("CreateBindingRequest, validation failed: "
+ << scope << " " << user << " " << NKikimr::MaskTicket(token)
+ << " " << request.DebugString()
+ << " error: " << requestValidationIssues.ToString());
+ Send(ev->Sender,
+ new TEvControlPlaneProxy::TEvCreateBindingResponse(
+ requestValidationIssues, subjectType),
+ 0,
+ ev->Cookie);
+ requestCounters.IncError();
+ TDuration delta = TInstant::Now() - startTime;
+ requestCounters.Common->LatencyMs->Collect(delta.MilliSeconds());
+ probe(delta, false, false);
+ return;
+ }
+ ev->Get()->RequestValidationPassed = true;
+ }
+
static const TPermissions availablePermissions {
TPermissions::TPermission::VIEW_PUBLIC
| TPermissions::TPermission::MANAGE_PUBLIC
@@ -2046,23 +1936,17 @@ private:
return;
}
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
- Register(new TRequestActor<FederatedQuery::CreateBindingRequest,
- TEvControlPlaneStorage::TEvCreateBindingRequest,
- TEvControlPlaneStorage::TEvCreateBindingResponse,
- TEvControlPlaneProxy::TEvCreateBindingRequest,
- TEvControlPlaneProxy::TEvCreateBindingResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request), std::move(user), std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe, permissions,
- cloudId, subjectType, {}, std::move(computeDatabase)));
- }
+ Register(new TRequestActor<FederatedQuery::CreateBindingRequest,
+ TEvControlPlaneStorage::TEvCreateBindingRequest,
+ TEvControlPlaneStorage::TEvCreateBindingResponse,
+ TEvControlPlaneProxy::TEvCreateBindingRequest,
+ TEvControlPlaneProxy::TEvCreateBindingResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvListBindingsRequest::TPtr& ev) {
@@ -2070,9 +1954,8 @@ private:
FederatedQuery::ListBindingsRequest request = ev->Get()->Request;
CPP_LOG_T("ListBindingsRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const int byteSize = request.ByteSize();
@@ -2087,7 +1970,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvListBindingsRequest::TPtr,
TEvControlPlaneProxy::TEvListBindingsResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -2118,22 +2001,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::ListBindingsRequest,
- TEvControlPlaneStorage::TEvListBindingsRequest,
- TEvControlPlaneStorage::TEvListBindingsResponse,
- TEvControlPlaneProxy::TEvListBindingsRequest,
- TEvControlPlaneProxy::TEvListBindingsResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request), std::move(user), std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions, cloudId, subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::ListBindingsRequest,
+ TEvControlPlaneStorage::TEvListBindingsRequest,
+ TEvControlPlaneStorage::TEvListBindingsResponse,
+ TEvControlPlaneProxy::TEvListBindingsRequest,
+ TEvControlPlaneProxy::TEvListBindingsResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvDescribeBindingRequest::TPtr& ev) {
@@ -2141,9 +2019,8 @@ private:
FederatedQuery::DescribeBindingRequest request = ev->Get()->Request;
CPP_LOG_T("DescribeBindingRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString bindingId = request.binding_id();
@@ -2159,7 +2036,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvDescribeBindingRequest::TPtr,
TEvControlPlaneProxy::TEvDescribeBindingResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -2190,22 +2067,17 @@ private:
| TPermissions::TPermission::VIEW_PRIVATE
};
- {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- Register(new TRequestActor<FederatedQuery::DescribeBindingRequest,
- TEvControlPlaneStorage::TEvDescribeBindingRequest,
- TEvControlPlaneStorage::TEvDescribeBindingResponse,
- TEvControlPlaneProxy::TEvDescribeBindingRequest,
- TEvControlPlaneProxy::TEvDescribeBindingResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request), std::move(user), std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions, cloudId, subjectType));
- }
+ Register(new TRequestActor<FederatedQuery::DescribeBindingRequest,
+ TEvControlPlaneStorage::TEvDescribeBindingRequest,
+ TEvControlPlaneStorage::TEvDescribeBindingResponse,
+ TEvControlPlaneProxy::TEvDescribeBindingRequest,
+ TEvControlPlaneProxy::TEvDescribeBindingResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions));
}
void Handle(TEvControlPlaneProxy::TEvModifyBindingRequest::TPtr& ev) {
@@ -2213,9 +2085,8 @@ private:
FederatedQuery::ModifyBindingRequest request = ev->Get()->Request;
CPP_LOG_T("ModifyBindingRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString bindingId = request.binding_id();
@@ -2231,7 +2102,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvModifyBindingRequest::TPtr,
TEvControlPlaneProxy::TEvModifyBindingResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -2262,10 +2133,36 @@ private:
TEvControlPlaneProxy::TEvModifyBindingResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
+ scope, probe, ev, cookie));
return;
}
+ if (Config.ComputeConfig.YdbComputeControlPlaneEnabled() &&
+ !ev->Get()->RequestValidationPassed) {
+ auto requestValidationIssues =
+ ::NFq::ValidateBinding(ev,
+ Config.StorageConfig.Proto.GetMaxRequestSize(),
+ Config.StorageConfig.AvailableBindings,
+ Config.StorageConfig.GeneratorPathsLimit);
+ if (requestValidationIssues) {
+ CPS_LOG_E("ModifyBindingRequest, validation failed: "
+ << scope << " " << user << " " << NKikimr::MaskTicket(token)
+ << " " << request.DebugString()
+ << " error: " << requestValidationIssues.ToString());
+ Send(ev->Sender,
+ new TEvControlPlaneProxy::TEvModifyBindingResponse(
+ requestValidationIssues, subjectType),
+ 0,
+ ev->Cookie);
+ requestCounters.IncError();
+ TDuration delta = TInstant::Now() - startTime;
+ requestCounters.Common->LatencyMs->Collect(delta.MilliSeconds());
+ probe(delta, false, false);
+ return;
+ }
+ ev->Get()->RequestValidationPassed = true;
+ }
+
static const TPermissions availablePermissions {
TPermissions::TPermission::MANAGE_PUBLIC
| TPermissions::TPermission::MANAGE_PRIVATE
@@ -2290,22 +2187,18 @@ private:
const bool controlPlaneYDBOperationWasPerformed = ev->Get()->ControlPlaneYDBOperationWasPerformed;
if (!controlPlaneYDBOperationWasPerformed) {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
Register(new TRequestActor<FederatedQuery::ModifyBindingRequest,
TEvControlPlaneStorage::TEvModifyBindingRequest,
TEvControlPlaneStorage::TEvModifyBindingResponse,
TEvControlPlaneProxy::TEvModifyBindingRequest,
- TEvControlPlaneProxy::TEvModifyBindingResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request), std::move(user), std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId, subjectType, {}, std::move(computeDatabase), !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
+ TEvControlPlaneProxy::TEvModifyBindingResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions,
+ !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
return;
}
@@ -2335,9 +2228,8 @@ private:
FederatedQuery::DeleteBindingRequest request = ev->Get()->Request;
CPP_LOG_T("DeleteBindingRequest: " << request.DebugString());
const TString cloudId = ev->Get()->CloudId;
- const TString folderId = ev->Get()->FolderId;
const TString subjectType = ev->Get()->SubjectType;
- const TString scope = "yandexcloud://" + folderId;
+ const TString scope = ev->Get()->Scope;
TString user = ev->Get()->User;
TString token = ev->Get()->Token;
const TString bindingId = request.binding_id();
@@ -2353,7 +2245,7 @@ private:
Register(new TResolveFolderActor<TEvControlPlaneProxy::TEvDeleteBindingRequest::TPtr,
TEvControlPlaneProxy::TEvDeleteBindingResponse>
(Counters.GetCommonCounters(RTC_RESOLVE_FOLDER), sender,
- Config, folderId, token,
+ Config, scope, token,
probe, ev, cookie, QuotaManagerEnabled));
return;
}
@@ -2384,7 +2276,7 @@ private:
TEvControlPlaneProxy::TEvDeleteBindingResponse>
(Counters.GetCommonCounters(RTC_CREATE_COMPUTE_DATABASE),
sender, Config, Config.ComputeConfig, cloudId,
- folderId, scope, probe, ev, cookie));
+ scope, probe, ev, cookie));
return;
}
@@ -2405,22 +2297,18 @@ private:
const bool controlPlaneYDBOperationWasPerformed = ev->Get()->ControlPlaneYDBOperationWasPerformed;
if (!controlPlaneYDBOperationWasPerformed) {
- auto sender = ev->Sender;
- auto cookie = ev->Cookie;
- auto permissions = ExtractPermissions(ev, availablePermissions);
- auto computeDatabase = ev->Get()->ComputeDatabase;
Register(new TRequestActor<FederatedQuery::DeleteBindingRequest,
TEvControlPlaneStorage::TEvDeleteBindingRequest,
TEvControlPlaneStorage::TEvDeleteBindingResponse,
TEvControlPlaneProxy::TEvDeleteBindingRequest,
- TEvControlPlaneProxy::TEvDeleteBindingResponse>
- (ev, Config, sender, cookie, scope, folderId,
- std::move(request), std::move(user), std::move(token),
- ControlPlaneStorageServiceActorId(),
- requestCounters,
- probe,
- permissions,
- cloudId, subjectType, {}, std::move(computeDatabase), !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
+ TEvControlPlaneProxy::TEvDeleteBindingResponse>(
+ ev,
+ Config,
+ ControlPlaneStorageServiceActorId(),
+ requestCounters,
+ probe,
+ availablePermissions,
+ !Config.ComputeConfig.YdbComputeControlPlaneEnabled()));
return;
}
@@ -2464,8 +2352,10 @@ TActorId ControlPlaneProxyActorId() {
IActor* CreateControlPlaneProxyActor(
const NConfig::TControlPlaneProxyConfig& config,
+ const NConfig::TControlPlaneStorageConfig& storageConfig,
const NConfig::TComputeConfig& computeConfig,
const NConfig::TCommonConfig& commonConfig,
+ const NYql::TS3GatewayConfig& s3Config,
const ::NFq::TSigner::TPtr& signer,
const TYqSharedResources::TPtr& yqSharedResources,
const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory,
@@ -2473,8 +2363,10 @@ IActor* CreateControlPlaneProxyActor(
bool quotaManagerEnabled) {
return new TControlPlaneProxyActor(
config,
+ storageConfig,
computeConfig,
commonConfig,
+ s3Config,
signer,
yqSharedResources,
credentialsProviderFactory,
diff --git a/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.h b/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.h
index 2ed2fa24a7..70c4c2149e 100644
--- a/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.h
+++ b/ydb/core/fq/libs/control_plane_proxy/control_plane_proxy.h
@@ -29,8 +29,10 @@ NActors::TActorId ControlPlaneProxyActorId();
NActors::IActor* CreateControlPlaneProxyActor(
const NConfig::TControlPlaneProxyConfig& config,
+ const NConfig::TControlPlaneStorageConfig& storageConfig,
const NConfig::TComputeConfig& computeConfig,
const NConfig::TCommonConfig& commonConfig,
+ const NYql::TS3GatewayConfig& s3Config,
const ::NFq::TSigner::TPtr& signer,
const TYqSharedResources::TPtr& yqSharedResources,
const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory,
diff --git a/ydb/core/fq/libs/control_plane_proxy/events/events.h b/ydb/core/fq/libs/control_plane_proxy/events/events.h
index 7db87b0d15..28d61bf2ba 100644
--- a/ydb/core/fq/libs/control_plane_proxy/events/events.h
+++ b/ydb/core/fq/libs/control_plane_proxy/events/events.h
@@ -75,14 +75,14 @@ struct TEvControlPlaneProxy {
struct TBaseControlPlaneRequest : NActors::TEventLocal<TDerived, EventType> {
using TProxyResponse = typename TResponseSelector<TDerived>::type;
- TBaseControlPlaneRequest(const TString& folderId,
+ TBaseControlPlaneRequest(const TString& scope,
const ProtoMessage& request,
const TString& user,
const TString& token,
const TVector<TString>& permissions,
TMaybe<TQuotaMap> quotas = Nothing(),
TTenantInfo::TPtr tenantInfo = nullptr)
- : FolderId(folderId)
+ : Scope(scope)
, Request(request)
, User(user)
, Token(token)
@@ -92,7 +92,7 @@ struct TEvControlPlaneProxy {
, ComputeYDBOperationWasPerformed(false)
, ControlPlaneYDBOperationWasPerformed(false) { }
- TString FolderId;
+ TString Scope;
TString CloudId;
ProtoMessage Request;
TString User;
@@ -106,6 +106,7 @@ struct TEvControlPlaneProxy {
std::unique_ptr<TProxyResponse> Response;
std::shared_ptr<NYdb::NTable::TTableClient> YDBClient;
TMaybe<FederatedQuery::Internal::ComputeDatabaseInternal> ComputeDatabase;
+ bool RequestValidationPassed = false;
};
template<typename ProtoMessage, ui32 EventType>
diff --git a/ydb/core/fq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp b/ydb/core/fq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp
index 6c36450e35..04c5fd1495 100644
--- a/ydb/core/fq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp
+++ b/ydb/core/fq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp
@@ -89,8 +89,10 @@ public:
struct TTestBootstrap {
const TDuration RequestTimeout = TDuration::Seconds(10);
NConfig::TControlPlaneProxyConfig Config;
+ NConfig::TControlPlaneStorageConfig StorageConfig;
NConfig::TComputeConfig ComputeConfig;
NConfig::TCommonConfig CommonConfig;
+ NYql::TS3GatewayConfig S3Config;
TRuntimePtr Runtime;
TGrabActor* MetaStorageGrab;
@@ -147,7 +149,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::ListQueriesRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvListQueriesRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvListQueriesRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -157,7 +159,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::DescribeQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeQueryRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeQueryRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -167,7 +169,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::GetQueryStatusRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvGetQueryStatusRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvGetQueryStatusRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -177,7 +179,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::ModifyQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyQueryRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyQueryRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -187,7 +189,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::DeleteQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteQueryRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteQueryRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -197,7 +199,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::ControlQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvControlQueryRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvControlQueryRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -207,7 +209,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::GetResultDataRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvGetResultDataRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvGetResultDataRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -228,7 +230,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::DescribeJobRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeJobRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeJobRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -246,7 +248,7 @@ struct TTestBootstrap {
->set_id(serviceAccountId);
}
- auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateConnectionRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateConnectionRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -256,7 +258,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::ListConnectionsRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvListConnectionsRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvListConnectionsRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -266,7 +268,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::DescribeConnectionRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeConnectionRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeConnectionRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -284,7 +286,7 @@ struct TTestBootstrap {
->set_id(serviceAccountId);
}
- auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyConnectionRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyConnectionRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -294,7 +296,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::DeleteConnectionRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteConnectionRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteConnectionRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -311,7 +313,7 @@ struct TTestBootstrap {
->set_id(serviceAccountId);
}
- auto request = std::make_unique<TEvControlPlaneProxy::TEvTestConnectionRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvTestConnectionRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -321,7 +323,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::CreateBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateBindingRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateBindingRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -331,7 +333,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::ListBindingsRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvListBindingsRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvListBindingsRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -341,7 +343,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::DescribeBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeBindingRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeBindingRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -351,7 +353,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::ModifyBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyBindingRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyBindingRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -361,7 +363,7 @@ struct TTestBootstrap {
TActorId sender = Runtime->AllocateEdgeActor();
FederatedQuery::DeleteBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteBindingRequest>("my_folder", proto, user, "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteBindingRequest>("yandexcloud://my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -382,8 +384,10 @@ private:
runtime->SetLogPriority(NKikimrServices::STREAMS_CONTROL_PLANE_SERVICE, NLog::PRI_DEBUG);
auto controlPlaneProxy = CreateControlPlaneProxyActor(
Config,
+ StorageConfig,
ComputeConfig,
CommonConfig,
+ S3Config,
nullptr,
NFq::TYqSharedResources::TPtr{},
NKikimr::TYdbCredentialsProviderFactory(nullptr),
diff --git a/ydb/core/fq/libs/control_plane_storage/validators.cpp b/ydb/core/fq/libs/control_plane_storage/validators.cpp
index 9a05d8953d..c1296ba8e0 100644
--- a/ydb/core/fq/libs/control_plane_storage/validators.cpp
+++ b/ydb/core/fq/libs/control_plane_storage/validators.cpp
@@ -90,8 +90,13 @@ TValidationQuery CreateModifyUniqueNameValidator(const TString& tableName,
ythrow TCodeLineException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support";
}
- FederatedQuery::Acl::Visibility oldVisibility = static_cast<FederatedQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(FederatedQuery::Acl::VISIBILITY_UNSPECIFIED));
- TString oldName = parser.ColumnParser(NAME_COLUMN_NAME).GetOptionalString().GetOrElse("");
+ FederatedQuery::Acl::Visibility oldVisibility =
+ static_cast<FederatedQuery::Acl::Visibility>(
+ parser.ColumnParser(VISIBILITY_COLUMN_NAME)
+ .GetOptionalInt64()
+ .GetOrElse(FederatedQuery::Acl::VISIBILITY_UNSPECIFIED));
+ TString oldName =
+ parser.ColumnParser(NAME_COLUMN_NAME).GetOptionalString().GetOrElse("");
if (oldVisibility == visibility && oldName == name) {
return false;
diff --git a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp
index bba5464128..3e134579bd 100644
--- a/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp
+++ b/ydb/core/fq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp
@@ -82,7 +82,16 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateBindi
" ($scope, $binding_id, $connection_id, $user, $visibility, $name, $binding, $revision, $internal);"
);
- auto validatorName = CreateUniqueNameValidator(
+ auto connectionNameUniqueValidator = CreateUniqueNameValidator(
+ CONNECTIONS_TABLE_NAME,
+ content.acl().visibility(),
+ scope,
+ content.name(),
+ user,
+ "Connection with the same name already exists. Please choose another name",
+ YdbConnection->TablePathPrefix);
+
+ auto bindingNameUniqueValidator = CreateUniqueNameValidator(
BINDINGS_TABLE_NAME,
content.acl().visibility(),
scope,
@@ -119,7 +128,8 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateBindi
validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix));
}
- validators.push_back(validatorName);
+ validators.push_back(connectionNameUniqueValidator);
+ validators.push_back(bindingNameUniqueValidator);
validators.push_back(validatorCountBindings);
validators.push_back(validatorConnectionExists);
validators.push_back(connectionValidator);
@@ -540,7 +550,18 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyBindi
}
{
- auto modifyUniqueNameValidator = CreateModifyUniqueNameValidator(
+ auto connectionNameUniqueValidator = CreateUniqueNameValidator(
+ CONNECTIONS_TABLE_NAME,
+ request.content().acl().visibility(),
+ scope,
+ request.content().name(),
+ user,
+ "Connection with the same name already exists. Please choose another name",
+ YdbConnection->TablePathPrefix);
+ validators.push_back(connectionNameUniqueValidator);
+ }
+ {
+ auto bindingNameUniqueValidator = CreateModifyUniqueNameValidator(
BINDINGS_TABLE_NAME,
BINDING_ID_COLUMN_NAME,
request.content().acl().visibility(),
@@ -550,7 +571,7 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyBindi
bindingId,
"Binding with the same name already exists. Please choose another name",
YdbConnection->TablePathPrefix);
- validators.push_back(modifyUniqueNameValidator);
+ validators.push_back(bindingNameUniqueValidator);
}
const auto readQuery = readQueryBuilder.Build();
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 24f487b086..8edb3dc701 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
@@ -84,7 +84,7 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateConne
" ($scope, $connection_id, $user, $visibility, $name, $connection_type, $connection, $revision, $internal);"
);
- auto validatorName = CreateUniqueNameValidator(
+ auto connectionNameUniqueValidator = CreateUniqueNameValidator(
CONNECTIONS_TABLE_NAME,
content.acl().visibility(),
scope,
@@ -93,6 +93,15 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateConne
"Connection with the same name already exists. Please choose another name",
YdbConnection->TablePathPrefix);
+ auto bindingNameUniqueValidator = CreateUniqueNameValidator(
+ BINDINGS_TABLE_NAME,
+ content.acl().visibility(),
+ scope,
+ content.name(),
+ user,
+ "Binding with the same name already exists. Please choose another name",
+ YdbConnection->TablePathPrefix);
+
auto validatorCountConnections = CreateCountEntitiesValidator(
scope,
CONNECTIONS_TABLE_NAME,
@@ -104,7 +113,8 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateConne
if (idempotencyKey) {
validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix));
}
- validators.push_back(validatorName);
+ validators.push_back(connectionNameUniqueValidator);
+ validators.push_back(bindingNameUniqueValidator);
validators.push_back(validatorCountConnections);
if (content.acl().visibility() == FederatedQuery::Acl::PRIVATE) {
@@ -526,7 +536,7 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyConne
}
{
- auto modifyUniqueNameValidator = CreateModifyUniqueNameValidator(
+ auto connectionNameUniqueValidator = CreateModifyUniqueNameValidator(
CONNECTIONS_TABLE_NAME,
CONNECTION_ID_COLUMN_NAME,
request.content().acl().visibility(),
@@ -536,7 +546,18 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyConne
connectionId,
"Connection with the same name already exists. Please choose another name",
YdbConnection->TablePathPrefix);
- validators.push_back(modifyUniqueNameValidator);
+ validators.push_back(connectionNameUniqueValidator);
+ }
+ {
+ auto bindingNameUniqueValidator = CreateUniqueNameValidator(
+ BINDINGS_TABLE_NAME,
+ request.content().acl().visibility(),
+ scope,
+ request.content().name(),
+ user,
+ "Binding with the same name already exists. Please choose another name",
+ YdbConnection->TablePathPrefix);
+ validators.push_back(bindingNameUniqueValidator);
}
const auto readQuery = readQueryBuilder.Build();
diff --git a/ydb/core/fq/libs/init/init.cpp b/ydb/core/fq/libs/init/init.cpp
index 26a56ead46..f1ba3cee7a 100644
--- a/ydb/core/fq/libs/init/init.cpp
+++ b/ydb/core/fq/libs/init/init.cpp
@@ -104,8 +104,10 @@ void Init(
if (protoConfig.GetControlPlaneProxy().GetEnabled()) {
auto controlPlaneProxy = NFq::CreateControlPlaneProxyActor(
protoConfig.GetControlPlaneProxy(),
+ protoConfig.GetControlPlaneStorage(),
protoConfig.GetCompute(),
protoConfig.GetCommon(),
+ protoConfig.GetGateways().GetS3(),
signer,
yqSharedResources,
NKikimr::CreateYdbCredentialsProviderFactory,
diff --git a/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt b/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt
index ba88f6914a..e49349eb64 100644
--- a/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt
+++ b/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt
@@ -60,6 +60,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
ydb-library-services
api-grpc-draft
api-protos
+ public-lib-fq
public-lib-operation_id
cpp-client-resources
services-ext_index-common
diff --git a/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt b/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt
index 44ae197938..29e90416a0 100644
--- a/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt
+++ b/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt
@@ -61,6 +61,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
ydb-library-services
api-grpc-draft
api-protos
+ public-lib-fq
public-lib-operation_id
cpp-client-resources
services-ext_index-common
diff --git a/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt b/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt
index 44ae197938..29e90416a0 100644
--- a/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt
+++ b/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt
@@ -61,6 +61,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
ydb-library-services
api-grpc-draft
api-protos
+ public-lib-fq
public-lib-operation_id
cpp-client-resources
services-ext_index-common
diff --git a/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt b/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt
index ba88f6914a..e49349eb64 100644
--- a/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt
+++ b/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt
@@ -60,6 +60,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
ydb-library-services
api-grpc-draft
api-protos
+ public-lib-fq
public-lib-operation_id
cpp-client-resources
services-ext_index-common
diff --git a/ydb/core/grpc_services/rpc_fq.cpp b/ydb/core/grpc_services/rpc_fq.cpp
index bf4e70a67c..a089a9037f 100644
--- a/ydb/core/grpc_services/rpc_fq.cpp
+++ b/ydb/core/grpc_services/rpc_fq.cpp
@@ -8,6 +8,7 @@
#include <ydb/core/fq/libs/control_plane_proxy/events/events.h>
#include <ydb/core/fq/libs/control_plane_proxy/utils.h>
#include <ydb/public/api/protos/draft/fq.pb.h>
+#include <ydb/public/lib/fq/scope.h>
#include <ydb/library/aclib/aclib.h>
@@ -113,7 +114,12 @@ public:
}
const auto* req = GetProtoRequest();
- auto ev = MakeHolder<EvRequestType>(FolderId, *req, User, Token, permissions);
+ auto ev = MakeHolder<EvRequestType>(
+ NYdb::NFq::TScope{NYdb::NFq::TScope::YandexCloudScopeSchema + "://" + FolderId}.ToString(),
+ *req,
+ User,
+ Token,
+ permissions);
Send(NFq::ControlPlaneProxyActorId(), ev.Release());
Become(&TFederatedQueryRequestRPC<RpcRequestType, EvRequestType, EvResponseType>::StateFunc);
}
diff --git a/ydb/core/grpc_services/ya.make b/ydb/core/grpc_services/ya.make
index 18e4b06f83..4d70532df8 100644
--- a/ydb/core/grpc_services/ya.make
+++ b/ydb/core/grpc_services/ya.make
@@ -123,6 +123,7 @@ PEERDIR(
ydb/library/services
ydb/public/api/grpc/draft
ydb/public/api/protos
+ ydb/public/lib/fq
ydb/public/lib/operation_id
ydb/public/sdk/cpp/client/resources
ydb/services/ext_index/common