diff options
author | hcpp <hcpp@yandex-team.ru> | 2022-02-10 16:50:01 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:50:01 +0300 |
commit | cd53b77f6fe67a131e376d74d4e6ffa25e35d412 (patch) | |
tree | e61539274ba7a458eab77a08b2765a07f94398e7 | |
parent | 8cb7383a794381ba734eebe2a6737c40e0223f2f (diff) | |
download | ydb-cd53b77f6fe67a131e376d74d4e6ffa25e35d412.tar.gz |
Restoring authorship annotation for <hcpp@yandex-team.ru>. Commit 1 of 2.
185 files changed, 14856 insertions, 14856 deletions
diff --git a/build/rules/kikimr.policy b/build/rules/kikimr.policy index 5bb6426e30..df9702f638 100644 --- a/build/rules/kikimr.policy +++ b/build/rules/kikimr.policy @@ -14,7 +14,7 @@ ALLOW quality/deprecated/mapreducelib -> kikimr/library/sched/dev/supp/pages/lib ALLOW solomon/ -> kikimr/core/protos ALLOW solomon/ -> kikimr/public/lib/deprecated/kicli ALLOW solomon/ -> kikimr/library/mkql_proto/protos -ALLOW solomon/ -> kikimr/yq/libs/config/protos +ALLOW solomon/ -> kikimr/yq/libs/config/protos ALLOW solomon/ -> kikimr/library/folder_service/proto ALLOW solomon/ -> kikimr/library/login/protos # temporary (FIXME: gvit) @@ -138,7 +138,7 @@ ALLOW logbroker/tools -> kikimr/tools/monitoring ALLOW solomon/ -> kikimr/core/protos ALLOW solomon/ -> kikimr/public/lib/deprecated/kicli ALLOW solomon/ -> kikimr/library/mkql_proto/protos -ALLOW solomon/ -> kikimr/yq/libs/config/protos +ALLOW solomon/ -> kikimr/yq/libs/config/protos ALLOW solomon/ -> kikimr/library/login/protos ALLOW ydb/library/yql/providers/dq/actors -> kikimr/core/base diff --git a/build/ya.conf.json b/build/ya.conf.json index 5f7cc875d6..8c98fb30e5 100644 --- a/build/ya.conf.json +++ b/build/ya.conf.json @@ -3553,12 +3553,12 @@ "os": "LINUX" }, "default": true - }, - { - "host": { - "os": "DARWIN" - }, - "default": true + }, + { + "host": { + "os": "DARWIN" + }, + "default": true } ] }, @@ -6817,8 +6817,8 @@ "rtmr-deploy": { "formula": { "sandbox_id": [ - 1210829227, - 1210811623 + 1210829227, + 1210811623 ], "match": "rtmr-deploy" }, diff --git a/library/cpp/actors/http/http_proxy_incoming.cpp b/library/cpp/actors/http/http_proxy_incoming.cpp index 80fe2af53d..a6bb8e663b 100644 --- a/library/cpp/actors/http/http_proxy_incoming.cpp +++ b/library/cpp/actors/http/http_proxy_incoming.cpp @@ -20,7 +20,7 @@ public: TDeque<THttpIncomingRequestPtr> RecycledRequests; THPTimer InactivityTimer; - static constexpr TDuration InactivityTimeout = TDuration::Minutes(2); + static constexpr TDuration InactivityTimeout = TDuration::Minutes(2); TEvPollerReady* InactivityEvent = nullptr; TPollerToken::TPtr PollerToken; diff --git a/library/cpp/grpc/server/grpc_request.h b/library/cpp/grpc/server/grpc_request.h index 5bd8d3902b..acde4cd846 100644 --- a/library/cpp/grpc/server/grpc_request.h +++ b/library/cpp/grpc/server/grpc_request.h @@ -37,13 +37,13 @@ public: IStreamAdaptor::TPtr CreateStreamAdaptor(); /////////////////////////////////////////////////////////////////////////////// -template<typename TIn, typename TOut, typename TService, typename TInProtoPrinter, typename TOutProtoPrinter> +template<typename TIn, typename TOut, typename TService, typename TInProtoPrinter, typename TOutProtoPrinter> class TGRpcRequestImpl : public TBaseAsyncContext<TService> , public IQueueEvent , public IRequestContextBase { - using TThis = TGRpcRequestImpl<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter>; + using TThis = TGRpcRequestImpl<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter>; public: using TOnRequest = std::function<void (IRequestContextBase* ctx)>; @@ -244,7 +244,7 @@ private: void WriteDataOk(NProtoBuf::Message* resp) { auto makeResponseString = [&] { TString x; - TOutProtoPrinter printer; + TOutProtoPrinter printer; printer.SetSingleLineMode(true); printer.PrintToString(*resp, &x); return x; @@ -334,7 +334,7 @@ private: auto makeRequestString = [&] { TString resp; if (ok) { - TInProtoPrinter printer; + TInProtoPrinter printer; printer.SetSingleLineMode(true); printer.PrintToString(*Request_, &resp); } else { @@ -510,9 +510,9 @@ private: IStreamAdaptor::TPtr StreamAdaptor_; }; -template<typename TIn, typename TOut, typename TService, typename TInProtoPrinter=google::protobuf::TextFormat::Printer, typename TOutProtoPrinter=google::protobuf::TextFormat::Printer> -class TGRpcRequest: public TGRpcRequestImpl<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter> { - using TBase = TGRpcRequestImpl<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter>; +template<typename TIn, typename TOut, typename TService, typename TInProtoPrinter=google::protobuf::TextFormat::Printer, typename TOutProtoPrinter=google::protobuf::TextFormat::Printer> +class TGRpcRequest: public TGRpcRequestImpl<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter> { + using TBase = TGRpcRequestImpl<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter>; public: TGRpcRequest(TService* server, typename TService::TCurrentGRpcService::AsyncService* service, diff --git a/library/cpp/ya.make b/library/cpp/ya.make index 8c1193b007..ae478c8456 100644 --- a/library/cpp/ya.make +++ b/library/cpp/ya.make @@ -205,7 +205,7 @@ RECURSE( lfalloc/dbg lfalloc/dbg_info lfalloc/yt - libgit2_wrapper + libgit2_wrapper linear_regression linear_regression/benchmark linear_regression/ut diff --git a/ydb/core/base/ticket_parser.h b/ydb/core/base/ticket_parser.h index 62004b3a89..5bab31006b 100644 --- a/ydb/core/base/ticket_parser.h +++ b/ydb/core/base/ticket_parser.h @@ -25,17 +25,17 @@ namespace NKikimr { static_assert(EvEnd < EventSpaceEnd(TKikimrEvents::ES_TICKET_PARSER), "expect EvEnd < EventSpaceEnd(TKikimrEvents::ES_TICKET_PARSER)"); struct TEvAuthorizeTicket : TEventLocal<TEvAuthorizeTicket, EvAuthorizeTicket> { - struct TEntry { - TStackVec<TString> Permissions; - TStackVec<std::pair<TString, TString>> Attributes; - }; - + struct TEntry { + TStackVec<TString> Permissions; + TStackVec<std::pair<TString, TString>> Attributes; + }; + const TString Database; const TString Ticket; const TString PeerName; - + // if two identical permissions with different attributies are specified, - // only one of them will be processed. Which one is not guaranteed + // only one of them will be processed. Which one is not guaranteed const std::vector<TEntry> Entries; struct TInitializationFields { @@ -64,25 +64,25 @@ namespace NKikimr { TEvAuthorizeTicket(const TString& ticket, const TVector<std::pair<TString, TString>>& attributes, const TVector<TString>& permissions) : Ticket(ticket) - , Entries({{permissions, attributes}}) + , Entries({{permissions, attributes}}) {} TEvAuthorizeTicket(const TString& ticket, const TString& peerName, const TVector<std::pair<TString, TString>>& attributes, const TVector<TString>& permissions) : Ticket(ticket) , PeerName(peerName) - , Entries({{permissions, attributes}}) - {} - - TEvAuthorizeTicket(const TString& ticket, const TVector<TEntry>& entries) - : Ticket(ticket) - , Entries(entries) - {} - - TEvAuthorizeTicket(const TString& ticket, const TString& peerName, const TVector<TEntry>& entries) - : Ticket(ticket) - , PeerName(peerName) - , Entries(entries) + , Entries({{permissions, attributes}}) {} + + TEvAuthorizeTicket(const TString& ticket, const TVector<TEntry>& entries) + : Ticket(ticket) + , Entries(entries) + {} + + TEvAuthorizeTicket(const TString& ticket, const TString& peerName, const TVector<TEntry>& entries) + : Ticket(ticket) + , PeerName(peerName) + , Entries(entries) + {} }; struct TError { diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp index 6766dd3171..885995a181 100644 --- a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp +++ b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp @@ -221,7 +221,7 @@ protected: config.Opts->AddLongOption("cms-file", "CMS config file").OptionalArgument("PATH"); config.Opts->AddLongOption("alloc-file", "Allocator config file").OptionalArgument("PATH"); config.Opts->AddLongOption("yql-file", "Yql Analytics config file").OptionalArgument("PATH"); - config.Opts->AddLongOption("yq-file", "Yandex Query config file").OptionalArgument("PATH"); + config.Opts->AddLongOption("yq-file", "Yandex Query config file").OptionalArgument("PATH"); config.Opts->AddLongOption("feature-flags-file", "File with feature flags to turn new features on/off").OptionalArgument("PATH"); config.Opts->AddLongOption("rb-file", "File with resource broker customizations").OptionalArgument("PATH"); config.Opts->AddLongOption("metering-file", "File with metering config").OptionalArgument("PATH"); @@ -435,7 +435,7 @@ protected: OPTION("kqp-file", KQPConfig); OPTION("incrhuge-file", IncrHugeConfig); OPTION("alloc-file", AllocatorConfig); - OPTION("yq-file", YandexQueryConfig); + OPTION("yq-file", YandexQueryConfig); if (!AppConfig.HasAllocatorConfig()) { AppConfig.MutableAllocatorConfig()->CopyFrom(*DummyAllocatorConfig()); diff --git a/ydb/core/driver_lib/run/config.h b/ydb/core/driver_lib/run/config.h index faf1797413..edea3e3ad9 100644 --- a/ydb/core/driver_lib/run/config.h +++ b/ydb/core/driver_lib/run/config.h @@ -62,7 +62,7 @@ union TBasicKikimrServicesMask { bool EnableConfigsCache:1; bool EnableLongTxService:1; bool EnableHealthCheckService:1; - bool EnableYandexQuery:1; + bool EnableYandexQuery:1; bool EnableSequenceProxyService:1; }; diff --git a/ydb/core/driver_lib/run/config_parser.cpp b/ydb/core/driver_lib/run/config_parser.cpp index bb68656291..5aadcb4508 100644 --- a/ydb/core/driver_lib/run/config_parser.cpp +++ b/ydb/core/driver_lib/run/config_parser.cpp @@ -74,7 +74,7 @@ void TRunCommandConfigParser::SetupLastGetOptForConfigFiles(NLastGetopt::TOpts& opts.AddLongOption("sqs-file", "SQS config file").OptionalArgument("PATH"); opts.AddLongOption("alloc-file", "Allocator config file").OptionalArgument("PATH"); opts.AddLongOption("yql-file", "Yql Analytics config file").OptionalArgument("PATH"); - opts.AddLongOption("yq-file", "Yandex Query config file").OptionalArgument("PATH"); + opts.AddLongOption("yq-file", "Yandex Query config file").OptionalArgument("PATH"); } void TRunCommandConfigParser::ParseConfigFiles(const NLastGetopt::TOptsParseResult& res) { @@ -203,9 +203,9 @@ void TRunCommandConfigParser::ParseConfigFiles(const NLastGetopt::TOptsParseResu Config.AppConfig.MutableAllocatorConfig()->CopyFrom(*allocConfig); } - if (res.Has("yq-file")) { - Y_VERIFY(ParsePBFromFile(res.Get("yq-file"), Config.AppConfig.MutableYandexQueryConfig())); - } + if (res.Has("yq-file")) { + Y_VERIFY(ParsePBFromFile(res.Get("yq-file"), Config.AppConfig.MutableYandexQueryConfig())); + } } void TRunCommandConfigParser::SetupGlobalOpts(NLastGetopt::TOpts& opts) { diff --git a/ydb/core/driver_lib/run/factories.h b/ydb/core/driver_lib/run/factories.h index 41a45b44e0..9f4f150e0a 100644 --- a/ydb/core/driver_lib/run/factories.h +++ b/ydb/core/driver_lib/run/factories.h @@ -45,7 +45,7 @@ struct TModuleFactories { IActor*(*CreateTicketParser)(const NKikimrProto::TAuthConfig&); IActor*(*FolderServiceFactory)(const NKikimrProto::NFolderService::TFolderServiceConfig&); - std::function<IActor*(const NYq::NConfig::TAuditConfig& auditConfig)> YqAuditServiceFactory; + std::function<IActor*(const NYq::NConfig::TAuditConfig& auditConfig)> YqAuditServiceFactory; NKikimr::TYdbCredentialsProviderFactory YdbCredentialProviderFactory; // Factory for grpc services TGrpcServiceFactory GrpcServiceFactory; diff --git a/ydb/core/driver_lib/run/kikimr_services_initializers.cpp b/ydb/core/driver_lib/run/kikimr_services_initializers.cpp index 819c1478d1..f49e47dd62 100644 --- a/ydb/core/driver_lib/run/kikimr_services_initializers.cpp +++ b/ydb/core/driver_lib/run/kikimr_services_initializers.cpp @@ -2251,51 +2251,51 @@ void THealthCheckInitializer::InitializeServices(TActorSystemSetup* setup, const } TYandexQueryInitializer::TYandexQueryInitializer(const TKikimrRunConfig& runConfig, std::shared_ptr<TModuleFactories> factories, NYq::IYqSharedResources::TPtr yqSharedResources) - : IKikimrServicesInitializer(runConfig) + : IKikimrServicesInitializer(runConfig) , Factories(std::move(factories)) , YqSharedResources(std::move(yqSharedResources)) -{ -} - +{ +} + void TYandexQueryInitializer::SetIcPort(ui32 icPort) { IcPort = icPort; } -void TYandexQueryInitializer::InitializeServices(TActorSystemSetup* setup, const TAppData* appData) { - const auto& protoConfig = Config.GetYandexQueryConfig(); - if (!protoConfig.GetEnabled()) { - return; - } - - TString tenant = "default_yq_tenant_name"; - for (const auto& slot : Config.GetTenantPoolConfig().GetSlots()) { - if (slot.GetTenantName()) { - tenant = slot.GetTenantName(); - break; - } - } - - auto actorRegistrator = [&](NActors::TActorId serviceActorId, NActors::IActor* actor) { - setup->LocalServices.push_back( - std::pair<TActorId, TActorSetupCmd>( - serviceActorId, - TActorSetupCmd(actor, TMailboxType::HTSwap, appData->UserPoolId))); - }; - - NYq::Init( - protoConfig, - NodeId, - actorRegistrator, - appData, - tenant, - Factories->PqCmConnections, - YqSharedResources, - Factories->FolderServiceFactory, - Factories->YqAuditServiceFactory, +void TYandexQueryInitializer::InitializeServices(TActorSystemSetup* setup, const TAppData* appData) { + const auto& protoConfig = Config.GetYandexQueryConfig(); + if (!protoConfig.GetEnabled()) { + return; + } + + TString tenant = "default_yq_tenant_name"; + for (const auto& slot : Config.GetTenantPoolConfig().GetSlots()) { + if (slot.GetTenantName()) { + tenant = slot.GetTenantName(); + break; + } + } + + auto actorRegistrator = [&](NActors::TActorId serviceActorId, NActors::IActor* actor) { + setup->LocalServices.push_back( + std::pair<TActorId, TActorSetupCmd>( + serviceActorId, + TActorSetupCmd(actor, TMailboxType::HTSwap, appData->UserPoolId))); + }; + + NYq::Init( + protoConfig, + NodeId, + actorRegistrator, + appData, + tenant, + Factories->PqCmConnections, + YqSharedResources, + Factories->FolderServiceFactory, + Factories->YqAuditServiceFactory, Factories->YdbCredentialProviderFactory, IcPort - ); -} - + ); +} + } // namespace NKikimrServicesInitializers } // namespace NKikimr diff --git a/ydb/core/driver_lib/run/kikimr_services_initializers.h b/ydb/core/driver_lib/run/kikimr_services_initializers.h index 407ce1bb7b..e11eebe325 100644 --- a/ydb/core/driver_lib/run/kikimr_services_initializers.h +++ b/ydb/core/driver_lib/run/kikimr_services_initializers.h @@ -486,18 +486,18 @@ public: void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override; }; -class TYandexQueryInitializer : public IKikimrServicesInitializer { -public: +class TYandexQueryInitializer : public IKikimrServicesInitializer { +public: TYandexQueryInitializer(const TKikimrRunConfig& runConfig, std::shared_ptr<TModuleFactories> factories, NYq::IYqSharedResources::TPtr yqSharedResources); - - void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override; + + void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override; static void SetIcPort(ui32 icPort); private: std::shared_ptr<TModuleFactories> Factories; NYq::IYqSharedResources::TPtr YqSharedResources; static ui32 IcPort; -}; - +}; + } // namespace NKikimrServicesInitializers } // namespace NKikimr diff --git a/ydb/core/driver_lib/run/run.cpp b/ydb/core/driver_lib/run/run.cpp index a4f74aa4e0..a787de8945 100644 --- a/ydb/core/driver_lib/run/run.cpp +++ b/ydb/core/driver_lib/run/run.cpp @@ -533,7 +533,7 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) { names["analytics"] = &hasAnalytics; bool hasDataStreams = false; names["datastreams"] = &hasDataStreams; - bool hasYandexQuery = false; + bool hasYandexQuery = false; names["yq"] = &hasYandexQuery; bool hasLogStore = false; names["logstore"] = &hasLogStore; @@ -712,11 +712,11 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) { if (hasDataStreams) { server.AddService(new NGRpcService::TGRpcDataStreamsService(ActorSystem.Get(), Counters, grpcRequestProxyId)); } - - if (hasYandexQuery) { - server.AddService(new NGRpcService::TGRpcYandexQueryService(ActorSystem.Get(), Counters, grpcRequestProxyId)); + + if (hasYandexQuery) { + server.AddService(new NGRpcService::TGRpcYandexQueryService(ActorSystem.Get(), Counters, grpcRequestProxyId)); server.AddService(new NGRpcService::TGRpcYqPrivateTaskService(ActorSystem.Get(), Counters, grpcRequestProxyId)); - } + } if (hasLogStore) { server.AddService(new NGRpcService::TGRpcYdbLogStoreService(ActorSystem.Get(), Counters, grpcRequestProxyId)); @@ -1311,16 +1311,16 @@ TIntrusivePtr<TServiceInitializersList> TKikimrRunner::CreateServiceInitializers sil->AddServiceInitializer(new TLongTxServiceInitializer(runConfig)); } - if (serviceMask.EnableKqp || serviceMask.EnableYandexQuery) { + if (serviceMask.EnableKqp || serviceMask.EnableYandexQuery) { sil->AddServiceInitializer(new TYqlLogsInitializer(runConfig)); } - if (serviceMask.EnableYandexQuery && runConfig.AppConfig.GetYandexQueryConfig().GetEnabled()) { + if (serviceMask.EnableYandexQuery && runConfig.AppConfig.GetYandexQueryConfig().GetEnabled()) { YqSharedResources = NYq::CreateYqSharedResources(runConfig.AppConfig.GetYandexQueryConfig(), ModuleFactories->YdbCredentialProviderFactory, Counters->GetSubgroup("counters", "yq")); sil->AddServiceInitializer(new TYandexQueryInitializer(runConfig, ModuleFactories, YqSharedResources)); - } - + } + if (serviceMask.EnableSequenceProxyService) { sil->AddServiceInitializer(new TSequenceProxyServiceInitializer(runConfig)); } diff --git a/ydb/core/grpc_services/base/base.h b/ydb/core/grpc_services/base/base.h index 44b25c4a5f..5da8a3c34c 100644 --- a/ydb/core/grpc_services/base/base.h +++ b/ydb/core/grpc_services/base/base.h @@ -168,27 +168,27 @@ struct TRpcServices { EvDataStreamsSplitShard, EvDataStreamsStartStreamEncryption, EvDataStreamsStopStreamEncryption, - EvStreamExecuteYqlScript, - EvYandexQueryCreateQuery, - EvYandexQueryListQueries, - EvYandexQueryDescribeQuery, + EvStreamExecuteYqlScript, + EvYandexQueryCreateQuery, + EvYandexQueryListQueries, + EvYandexQueryDescribeQuery, EvYandexQueryGetQueryStatus, - EvYandexQueryModifyQuery, - EvYandexQueryDeleteQuery, - EvYandexQueryControlQuery, - EvYandexQueryGetResultData, - EvYandexQueryListJobs, + EvYandexQueryModifyQuery, + EvYandexQueryDeleteQuery, + EvYandexQueryControlQuery, + EvYandexQueryGetResultData, + EvYandexQueryListJobs, EvYandexQueryDescribeJob, - EvYandexQueryCreateConnection, - EvYandexQueryListConnections, - EvYandexQueryDescribeConnection, - EvYandexQueryModifyConnection, - EvYandexQueryDeleteConnection, - EvYandexQueryTestConnection, - EvYandexQueryCreateBinding, - EvYandexQueryListBindings, - EvYandexQueryDescribeBinding, - EvYandexQueryModifyBinding, + EvYandexQueryCreateConnection, + EvYandexQueryListConnections, + EvYandexQueryDescribeConnection, + EvYandexQueryModifyConnection, + EvYandexQueryDeleteConnection, + EvYandexQueryTestConnection, + EvYandexQueryCreateBinding, + EvYandexQueryListBindings, + EvYandexQueryDescribeBinding, + EvYandexQueryModifyBinding, EvYandexQueryDeleteBinding, EvCreateLogStore, EvDescribeLogStore, @@ -251,8 +251,8 @@ public: virtual TString GetPeerName() const = 0; // Return deadile of request execution, calculated from client timeout by grpc virtual TInstant GetDeadline() const = 0; - // Meta value from request - virtual const TMaybe<TString> GetPeerMetaValues(const TString&) const = 0; + // Meta value from request + virtual const TMaybe<TString> GetPeerMetaValues(const TString&) const = 0; // Returns path and resource for rate limiter virtual TMaybe<NRpcService::TRlPath> GetRlPath() const = 0; // Raise issue on the context @@ -452,11 +452,11 @@ public: return Nothing(); } - const TMaybe<TString> GetPeerMetaValues(const TString&) const override { - Y_FAIL("Unimplemented"); - return TMaybe<TString>{}; - } - + const TMaybe<TString> GetPeerMetaValues(const TString&) const override { + Y_FAIL("Unimplemented"); + return TMaybe<TString>{}; + } + void ReplyWithRpcStatus(grpc::StatusCode, const TString&) override { Y_FAIL("Unimplemented"); } @@ -651,15 +651,15 @@ public: } TMaybe<TString> GetTraceId() const override { - return GetPeerMetaValues(NYdb::YDB_TRACE_ID_HEADER); + return GetPeerMetaValues(NYdb::YDB_TRACE_ID_HEADER); } const TMaybe<TString> GetSdkBuildInfo() const { - return GetPeerMetaValues(NYdb::YDB_SDK_BUILD_INFO_HEADER); + return GetPeerMetaValues(NYdb::YDB_SDK_BUILD_INFO_HEADER); } const TMaybe<TString> GetRequestType() const { - return GetPeerMetaValues(NYdb::YDB_REQUEST_TYPE_HEADER); + return GetPeerMetaValues(NYdb::YDB_REQUEST_TYPE_HEADER); } TInstant GetDeadline() const override { @@ -667,13 +667,13 @@ public: } const TMaybe<TString> GetGrpcUserAgent() const { - return GetPeerMetaValues(NGrpc::GRPC_USER_AGENT_HEADER); + return GetPeerMetaValues(NGrpc::GRPC_USER_AGENT_HEADER); } const TMaybe<TString> GetPeerMetaValues(const TString& key) const override { - return ToMaybe(Ctx_->GetPeerMetaValues(key)); - } - + return ToMaybe(Ctx_->GetPeerMetaValues(key)); + } + void RefreshToken(const TString& token, const TActorContext& ctx, TActorId id) { NGRpcService::RefreshToken(token, GetDatabaseName().GetOrElse(""), ctx, id); } @@ -855,10 +855,10 @@ public: return InternalToken_; } - const TMaybe<TString> GetPeerMetaValues(const TString& key) const override { - return ToMaybe(Ctx_->GetPeerMetaValues(key)); - } - + const TMaybe<TString> GetPeerMetaValues(const TString& key) const override { + return ToMaybe(Ctx_->GetPeerMetaValues(key)); + } + bool Validate(TString&) override { return true; } @@ -899,11 +899,11 @@ public: } TMaybe<TString> GetTraceId() const override { - return GetPeerMetaValues(NYdb::YDB_TRACE_ID_HEADER); + return GetPeerMetaValues(NYdb::YDB_TRACE_ID_HEADER); } const TMaybe<TString> GetSdkBuildInfo() const { - return GetPeerMetaValues(NYdb::YDB_SDK_BUILD_INFO_HEADER); + return GetPeerMetaValues(NYdb::YDB_SDK_BUILD_INFO_HEADER); } TInstant GetDeadline() const override { @@ -911,7 +911,7 @@ public: } const TMaybe<TString> GetRequestType() const override { - return GetPeerMetaValues(NYdb::YDB_REQUEST_TYPE_HEADER); + return GetPeerMetaValues(NYdb::YDB_REQUEST_TYPE_HEADER); } void SendSerializedResult(TString&& in, Ydb::StatusIds::StatusCode status) { diff --git a/ydb/core/grpc_services/grpc_helper.h b/ydb/core/grpc_services/grpc_helper.h index 9a2a673c7b..17c0232d48 100644 --- a/ydb/core/grpc_services/grpc_helper.h +++ b/ydb/core/grpc_services/grpc_helper.h @@ -40,8 +40,8 @@ inline TCreateLimiterCB CreateLimiterCb(TIntrusivePtr<TInFlightLimiterRegistry> return TCreateLimiterCB(limiterRegistry); } -template <typename TIn, typename TOut, typename TService, typename TInProtoPrinter=google::protobuf::TextFormat::Printer, typename TOutProtoPrinter=google::protobuf::TextFormat::Printer> -using TGRpcRequest = NGrpc::TGRpcRequest<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter>; +template <typename TIn, typename TOut, typename TService, typename TInProtoPrinter=google::protobuf::TextFormat::Printer, typename TOutProtoPrinter=google::protobuf::TextFormat::Printer> +using TGRpcRequest = NGrpc::TGRpcRequest<TIn, TOut, TService, TInProtoPrinter, TOutProtoPrinter>; } // namespace NGRpcService } // namespace NKikimr diff --git a/ydb/core/grpc_services/grpc_request_check_actor.h b/ydb/core/grpc_services/grpc_request_check_actor.h index 04c72abe6d..cc4f4e16bb 100644 --- a/ydb/core/grpc_services/grpc_request_check_actor.h +++ b/ydb/core/grpc_services/grpc_request_check_actor.h @@ -13,8 +13,8 @@ #include <ydb/core/security/secure_request.h> #include <ydb/core/tx/scheme_cache/scheme_cache.h> -#include <util/string/split.h> - +#include <util/string/split.h> + namespace NKikimr { namespace NGRpcService { @@ -422,14 +422,14 @@ const TVector<TString>& TGrpcRequestCheckActor<TEvent>::GetPermissions() { // yds behavior template <> -inline const TVector<TString>& TGrpcRequestCheckActor<TEvDataStreamsPutRecordRequest>::GetPermissions() { +inline const TVector<TString>& TGrpcRequestCheckActor<TEvDataStreamsPutRecordRequest>::GetPermissions() { //full list of permissions for compatility. remove old permissions later. static const TVector<TString> permissions = {"yds.streams.write", "ydb.databases.list", "ydb.databases.create", "ydb.databases.connect"}; return permissions; } // yds behavior template <> -inline const TVector<TString>& TGrpcRequestCheckActor<TEvDataStreamsPutRecordsRequest>::GetPermissions() { +inline const TVector<TString>& TGrpcRequestCheckActor<TEvDataStreamsPutRecordsRequest>::GetPermissions() { //full list of permissions for compatility. remove old permissions later. static const TVector<TString> permissions = {"yds.streams.write", "ydb.databases.list", "ydb.databases.create", "ydb.databases.connect"}; return permissions; diff --git a/ydb/core/grpc_services/local_rpc/local_rpc.h b/ydb/core/grpc_services/local_rpc/local_rpc.h index 23c3b6c803..d19a6bae11 100644 --- a/ydb/core/grpc_services/local_rpc/local_rpc.h +++ b/ydb/core/grpc_services/local_rpc/local_rpc.h @@ -47,11 +47,11 @@ public: return InternalToken; } - const TMaybe<TString> GetPeerMetaValues(const TString&) const override { - Y_FAIL("Unimplemented"); - return TMaybe<TString>{}; - } - + const TMaybe<TString> GetPeerMetaValues(const TString&) const override { + Y_FAIL("Unimplemented"); + return TMaybe<TString>{}; + } + void ReplyWithYdbStatus(Ydb::StatusIds::StatusCode status) override { TResp resp; NGRpcService::TCommonResponseFiller<TResp, true>::Fill(resp, IssueManager.GetIssues(), CostInfo.get(), status); diff --git a/ydb/core/grpc_services/rpc_yq.cpp b/ydb/core/grpc_services/rpc_yq.cpp index 6fe5f868d6..bb3bafb54f 100644 --- a/ydb/core/grpc_services/rpc_yq.cpp +++ b/ydb/core/grpc_services/rpc_yq.cpp @@ -1,25 +1,25 @@ -#include "rpc_common.h" -#include "rpc_deferrable.h" - +#include "rpc_common.h" +#include "rpc_deferrable.h" + #include <ydb/core/grpc_services/service_yq.h> #include <ydb/core/yq/libs/audit/events/events.h> #include <ydb/core/yq/libs/audit/yq_audit_service.h> #include <ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.h> #include <ydb/core/yq/libs/control_plane_proxy/events/events.h> #include <ydb/core/yq/libs/control_plane_proxy/utils.h> - + #include <ydb/library/aclib/aclib.h> - -#include <library/cpp/actors/core/hfunc.h> - -#include <util/generic/guid.h> -#include <util/string/split.h> - -namespace NKikimr { -namespace NGRpcService { - -using namespace Ydb; - + +#include <library/cpp/actors/core/hfunc.h> + +#include <util/generic/guid.h> +#include <util/string/split.h> + +namespace NKikimr { +namespace NGRpcService { + +using namespace Ydb; + template <typename RpcRequestType, typename EvRequestType, typename EvResponseType> class TYandexQueryRequestRPC : public TRpcOperationRequestActor< TYandexQueryRequestRPC<RpcRequestType,EvRequestType,EvResponseType>, RpcRequestType> { @@ -42,13 +42,13 @@ protected: TString UserAgent; TString RequestId; -public: +public: TYandexQueryRequestRPC(IRequestOpCtx* request) : TBase(request) {} - - void Bootstrap() { + + void Bootstrap() { auto requestCtx = Request_.get(); - + auto request = dynamic_cast<RpcRequestType*>(requestCtx); Y_VERIFY(request); @@ -60,58 +60,58 @@ public: RequestId = Request_->GetPeerMetaValues("x-request-id").GetOrElse(CreateGuidAsString()); TMaybe<TString> authToken = proxyCtx->GetYdbToken(); - if (!authToken) { + if (!authToken) { ReplyWithStatus("Token is empty", StatusIds::BAD_REQUEST); - return; - } - Token = *authToken; - + return; + } + Token = *authToken; + const TString scope = Request_->GetPeerMetaValues("x-yq-scope").GetOrElse(""); - if (!scope.StartsWith("yandexcloud://")) { + if (!scope.StartsWith("yandexcloud://")) { ReplyWithStatus("x-yq-scope should start with yandexcloud:// but got " + scope, StatusIds::BAD_REQUEST); - return; - } - - const TVector<TString> path = StringSplitter(scope).Split('/').SkipEmpty(); + return; + } + + const TVector<TString> path = StringSplitter(scope).Split('/').SkipEmpty(); if (path.size() != 2) { ReplyWithStatus("x-yq-scope format is invalid. Must be yandexcloud://folder_id, but got " + scope, StatusIds::BAD_REQUEST); - return; - } - + return; + } + FolderId = path.back(); if (!FolderId) { ReplyWithStatus("Folder id is empty", StatusIds::BAD_REQUEST); return; - } - + } + if (FolderId.length() > 1024) { ReplyWithStatus("Folder id length greater than 1024 characters: " + FolderId, StatusIds::BAD_REQUEST); return; - } - + } + const TString& internalToken = proxyCtx->GetInternalToken(); - TVector<TString> permissions; - if (internalToken) { - NACLib::TUserToken userToken(internalToken); + TVector<TString> permissions; + if (internalToken) { + NACLib::TUserToken userToken(internalToken); User = userToken.GetUserSID(); for (const auto& sid: request->Sids) { - if (userToken.IsExist(sid)) { - permissions.push_back(sid); - } - } - } - + if (userToken.IsExist(sid)) { + permissions.push_back(sid); + } + } + } + if (!User) { ReplyWithStatus("Authorization error. Permission denied", StatusIds::UNAUTHORIZED); - return; - } - + return; + } + const auto* req = GetProtoRequest(); auto ev = MakeHolder<EvRequestType>(FolderId, *req, User, Token, permissions); Send(NYq::ControlPlaneProxyActorId(), ev.Release()); Become(&TYandexQueryRequestRPC<RpcRequestType, EvRequestType, EvResponseType>::StateFunc); - } - + } + protected: void ReplyWithStatus(const TString& issueMessage, StatusIds::StatusCode status) { Request_->RaiseIssue(NYql::TIssue(issueMessage)); @@ -119,29 +119,29 @@ protected: PassAway(); } - STRICT_STFUNC(StateFunc, + STRICT_STFUNC(StateFunc, hFunc(EvResponseType, Handle); - ) - + ) + template <typename TResponse, typename TReq> void SendResponse(const TResponse& response, TReq& req) { - if (response.Issues) { + if (response.Issues) { req.RaiseIssues(response.Issues); req.ReplyWithYdbStatus(StatusIds::BAD_REQUEST); - } else { + } else { req.SendResult(response.Result, StatusIds::SUCCESS); } - } - + } + template <typename TResponse, typename TReq> requires requires (TResponse r) { r.AuditDetails; } void SendResponse(const TResponse& response, TReq& req) { - if (response.Issues) { + if (response.Issues) { req.RaiseIssues(response.Issues); req.ReplyWithYdbStatus(StatusIds::BAD_REQUEST); - } else { + } else { req.SendResult(response.Result, StatusIds::SUCCESS); } - + NYq::TEvAuditService::TExtraInfo extraInfo{ .Token = Token, .FolderId = FolderId, @@ -156,28 +156,28 @@ protected: *GetProtoRequest(), response.Issues, response.AuditDetails)); - } - + } + void Handle(typename EvResponseType::TPtr& ev) { SendResponse(*ev->Get(), *Request_); - PassAway(); - } -}; - + PassAway(); + } +}; + using TYandexQueryCreateQueryRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::CreateQueryRequest, YandexQuery::CreateQueryResponse>, NYq::TEvControlPlaneProxy::TEvCreateQueryRequest, NYq::TEvControlPlaneProxy::TEvCreateQueryResponse>; - + void DoYandexQueryCreateQueryRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryCreateQueryRPC(p.release())); -} - +} + using TYandexQueryListQueriesRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ListQueriesRequest, YandexQuery::ListQueriesResponse>, NYq::TEvControlPlaneProxy::TEvListQueriesRequest, NYq::TEvControlPlaneProxy::TEvListQueriesResponse>; - + void DoYandexQueryListQueriesRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryListQueriesRPC(p.release())); } @@ -186,25 +186,25 @@ using TYandexQueryDescribeQueryRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::DescribeQueryRequest, YandexQuery::DescribeQueryResponse>, NYq::TEvControlPlaneProxy::TEvDescribeQueryRequest, NYq::TEvControlPlaneProxy::TEvDescribeQueryResponse>; - + void DoYandexQueryDescribeQueryRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryDescribeQueryRPC(p.release())); -} - +} + using TYandexQueryGetQueryStatusRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::GetQueryStatusRequest, YandexQuery::GetQueryStatusResponse>, NYq::TEvControlPlaneProxy::TEvGetQueryStatusRequest, NYq::TEvControlPlaneProxy::TEvGetQueryStatusResponse>; - + void DoYandexQueryGetQueryStatusRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryGetQueryStatusRPC(p.release())); -} - +} + using TYandexQueryModifyQueryRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ModifyQueryRequest, YandexQuery::ModifyQueryResponse>, NYq::TEvControlPlaneProxy::TEvModifyQueryRequest, NYq::TEvControlPlaneProxy::TEvModifyQueryResponse>; - + void DoYandexQueryModifyQueryRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryModifyQueryRPC(p.release())); } @@ -213,97 +213,97 @@ using TYandexQueryDeleteQueryRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::DeleteQueryRequest, YandexQuery::DeleteQueryResponse>, NYq::TEvControlPlaneProxy::TEvDeleteQueryRequest, NYq::TEvControlPlaneProxy::TEvDeleteQueryResponse>; - + void DoYandexQueryDeleteQueryRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryDeleteQueryRPC(p.release())); -} - +} + using TYandexQueryControlQueryRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ControlQueryRequest, YandexQuery::ControlQueryResponse>, NYq::TEvControlPlaneProxy::TEvControlQueryRequest, NYq::TEvControlPlaneProxy::TEvControlQueryResponse>; - + void DoYandexQueryControlQueryRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryControlQueryRPC(p.release())); -} - +} + using TYandexQueryGetResultDataRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::GetResultDataRequest, YandexQuery::GetResultDataResponse>, NYq::TEvControlPlaneProxy::TEvGetResultDataRequest, NYq::TEvControlPlaneProxy::TEvGetResultDataResponse>; - + void DoGetResultDataRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryGetResultDataRPC(p.release())); -} - +} + using TYandexQueryListJobsRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ListJobsRequest, YandexQuery::ListJobsResponse>, NYq::TEvControlPlaneProxy::TEvListJobsRequest, NYq::TEvControlPlaneProxy::TEvListJobsResponse>; - + void DoListJobsRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryListJobsRPC(p.release())); -} - +} + using TYandexQueryDescribeJobRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::DescribeJobRequest, YandexQuery::DescribeJobResponse>, NYq::TEvControlPlaneProxy::TEvDescribeJobRequest, NYq::TEvControlPlaneProxy::TEvDescribeJobResponse>; - + void DoDescribeJobRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryDescribeJobRPC(p.release())); -} - +} + using TYandexQueryCreateConnectionRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::CreateConnectionRequest, YandexQuery::CreateConnectionResponse>, NYq::TEvControlPlaneProxy::TEvCreateConnectionRequest, NYq::TEvControlPlaneProxy::TEvCreateConnectionResponse>; - + void DoCreateConnectionRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryCreateConnectionRPC(p.release())); -} - +} + using TYandexQueryListConnectionsRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ListConnectionsRequest, YandexQuery::ListConnectionsResponse>, NYq::TEvControlPlaneProxy::TEvListConnectionsRequest, NYq::TEvControlPlaneProxy::TEvListConnectionsResponse>; - + void DoListConnectionsRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryListConnectionsRPC(p.release())); -} - +} + using TYandexQueryDescribeConnectionRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::DescribeConnectionRequest, YandexQuery::DescribeConnectionResponse>, NYq::TEvControlPlaneProxy::TEvDescribeConnectionRequest, NYq::TEvControlPlaneProxy::TEvDescribeConnectionResponse>; - + void DoDescribeConnectionRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryDescribeConnectionRPC(p.release())); -} - +} + using TYandexQueryModifyConnectionRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ModifyConnectionRequest, YandexQuery::ModifyConnectionResponse>, NYq::TEvControlPlaneProxy::TEvModifyConnectionRequest, NYq::TEvControlPlaneProxy::TEvModifyConnectionResponse>; - + void DoModifyConnectionRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryModifyConnectionRPC(p.release())); -} - +} + using TYandexQueryDeleteConnectionRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::DeleteConnectionRequest, YandexQuery::DeleteConnectionResponse>, NYq::TEvControlPlaneProxy::TEvDeleteConnectionRequest, NYq::TEvControlPlaneProxy::TEvDeleteConnectionResponse>; - + void DoDeleteConnectionRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryDeleteConnectionRPC(p.release())); -} - +} + using TYandexQueryTestConnectionRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::TestConnectionRequest, YandexQuery::TestConnectionResponse>, NYq::TEvControlPlaneProxy::TEvTestConnectionRequest, NYq::TEvControlPlaneProxy::TEvTestConnectionResponse>; - + void DoTestConnectionRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryTestConnectionRPC(p.release())); } @@ -312,46 +312,46 @@ using TYandexQueryCreateBindingRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::CreateBindingRequest, YandexQuery::CreateBindingResponse>, NYq::TEvControlPlaneProxy::TEvCreateBindingRequest, NYq::TEvControlPlaneProxy::TEvCreateBindingResponse>; - + void DoCreateBindingRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& ) { TActivationContext::AsActorContext().Register(new TYandexQueryCreateBindingRPC(p.release())); -} - +} + using TYandexQueryListBindingsRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ListBindingsRequest, YandexQuery::ListBindingsResponse>, NYq::TEvControlPlaneProxy::TEvListBindingsRequest, NYq::TEvControlPlaneProxy::TEvListBindingsResponse>; - + void DoListBindingsRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryListBindingsRPC(p.release())); -} - +} + using TYandexQueryDescribeBindingRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::DescribeBindingRequest, YandexQuery::DescribeBindingResponse>, NYq::TEvControlPlaneProxy::TEvDescribeBindingRequest, NYq::TEvControlPlaneProxy::TEvDescribeBindingResponse>; - + void DoDescribeBindingRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryDescribeBindingRPC(p.release())); -} - +} + using TYandexQueryModifyBindingRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::ModifyBindingRequest, YandexQuery::ModifyBindingResponse>, NYq::TEvControlPlaneProxy::TEvModifyBindingRequest, NYq::TEvControlPlaneProxy::TEvModifyBindingResponse>; - + void DoModifyBindingRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryModifyBindingRPC(p.release())); -} - +} + using TYandexQueryDeleteBindingRPC = TYandexQueryRequestRPC< TGrpcYqRequestOperationCall<YandexQuery::DeleteBindingRequest, YandexQuery::DeleteBindingResponse>, NYq::TEvControlPlaneProxy::TEvDeleteBindingRequest, NYq::TEvControlPlaneProxy::TEvDeleteBindingResponse>; - + void DoDeleteBindingRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider&) { TActivationContext::AsActorContext().Register(new TYandexQueryDeleteBindingRPC(p.release())); -} - -} // namespace NGRpcService -} // namespace NKikimr +} + +} // namespace NGRpcService +} // namespace NKikimr diff --git a/ydb/core/grpc_services/ya.make b/ydb/core/grpc_services/ya.make index 05b156bf04..b1f6f85271 100644 --- a/ydb/core/grpc_services/ya.make +++ b/ydb/core/grpc_services/ya.make @@ -69,14 +69,14 @@ SRCS( rpc_stream_execute_scan_query.cpp rpc_stream_execute_yql_script.cpp rpc_whoami.cpp - rpc_yq.cpp + rpc_yq.cpp table_profiles.cpp table_settings.cpp rpc_analytics_internal.cpp ) PEERDIR( - contrib/libs/xxhash + contrib/libs/xxhash library/cpp/cgiparam library/cpp/digest/old_crc ydb/core/actorlib_impl diff --git a/ydb/core/kesus/tablet/quoter_resource_tree.cpp b/ydb/core/kesus/tablet/quoter_resource_tree.cpp index 3f9d6e5653..867edd134f 100644 --- a/ydb/core/kesus/tablet/quoter_resource_tree.cpp +++ b/ydb/core/kesus/tablet/quoter_resource_tree.cpp @@ -48,7 +48,7 @@ static const TString ELAPSED_MICROSEC_WHEN_RESOURCE_ACTIVE_COUNTER_NAME = "Elaps bool ValidResourcePathSymbols[256] = {}; bool MakeValidResourcePathSymbols() { - char symbols[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-/:#"; + char symbols[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-/:#"; for (size_t i = 0; i < Y_ARRAY_SIZE(symbols) - 1; ++i) { ValidResourcePathSymbols[static_cast<unsigned char>(symbols[i])] = true; } diff --git a/ydb/core/kesus/tablet/tablet_ut.cpp b/ydb/core/kesus/tablet/tablet_ut.cpp index 1cf1a80ca8..360daabe6c 100644 --- a/ydb/core/kesus/tablet/tablet_ut.cpp +++ b/ydb/core/kesus/tablet/tablet_ut.cpp @@ -1550,7 +1550,7 @@ Y_UNIT_TEST_SUITE(TKesusTest) { ctx.RebootTablet(); testAfterModification(); - req.SetResourcePath("?Invalid/Path?"); + req.SetResourcePath("?Invalid/Path?"); ctx.UpdateQuoterResource(req, Ydb::StatusIds::BAD_REQUEST); // invalid path testAfterModification(); ctx.RebootTablet(); @@ -1596,7 +1596,7 @@ Y_UNIT_TEST_SUITE(TKesusTest) { ctx.DeleteQuoterResource(req, Ydb::StatusIds::BAD_REQUEST); // no resource UNIT_ASSERT_VALUES_EQUAL(ctx.DescribeQuoterResources({}, {}, true).ResourcesSize(), 4); - req.SetResourcePath("?Invalid/Path?"); + req.SetResourcePath("?Invalid/Path?"); ctx.DeleteQuoterResource(req, Ydb::StatusIds::BAD_REQUEST); // invalid path UNIT_ASSERT_VALUES_EQUAL(ctx.DescribeQuoterResources({}, {}, true).ResourcesSize(), 4); diff --git a/ydb/core/mind/labels_maintainer.cpp b/ydb/core/mind/labels_maintainer.cpp index 19138c7d23..aae072eb3e 100644 --- a/ydb/core/mind/labels_maintainer.cpp +++ b/ydb/core/mind/labels_maintainer.cpp @@ -303,7 +303,7 @@ private: auto &dbLabels = config.GetDatabaseLabels(); DatabaseLabelsEnabled = dbLabels.GetEnabled(); - GroupAllMetrics = dbLabels.GetGroupAllMetrics(); + GroupAllMetrics = dbLabels.GetGroupAllMetrics(); DatabaseSensorServices.clear(); for (auto &service : dbLabels.GetServices()) DatabaseSensorServices.insert(service); @@ -369,7 +369,7 @@ private: private: bool DatabaseLabelsEnabled; - bool GroupAllMetrics; + bool GroupAllMetrics; bool DatabaseAttributeLabelsEnabled; bool ForceDatabaseLabels; bool InitializedLocalOptions; diff --git a/ydb/core/protos/config.proto b/ydb/core/protos/config.proto index d64169d4fc..d6bdb2c6e2 100644 --- a/ydb/core/protos/config.proto +++ b/ydb/core/protos/config.proto @@ -450,7 +450,7 @@ message TMonitoringConfig { optional string StaticSlotLabelValue = 7 [default = "static"]; optional string DynamicSlotLabelValue = 8 [default = "dynamic"]; optional string MultipleSlotLabelValue = 9 [default = "<multiple>"]; - optional bool GroupAllMetrics = 10; + optional bool GroupAllMetrics = 10; }; message TDatabaseAttributeLabels { @@ -1377,7 +1377,7 @@ message TAppConfig { optional TMeteringConfig MeteringConfig = 45; optional THiveConfig HiveConfig = 46; optional TDataShardConfig DataShardConfig = 49; - optional NYq.NConfig.TConfig YandexQueryConfig = 50; + optional NYq.NConfig.TConfig YandexQueryConfig = 50; optional TCompactionConfig CompactionConfig = 52; repeated TNamedConfig NamedConfigs = 100; diff --git a/ydb/core/protos/services.proto b/ydb/core/protos/services.proto index c17c8a7dc3..e4986d91a1 100644 --- a/ydb/core/protos/services.proto +++ b/ydb/core/protos/services.proto @@ -286,16 +286,16 @@ enum EServiceKikimr { STREAMS_SCHEDULER_SERVICE = 1014; STREAMS_RESOURCE_SERVICE = 1015; STREAMS_CHECKPOINT_COORDINATOR = 1016; - STREAMS_CONTROL_PLANE_SERVICE = 1017; + STREAMS_CONTROL_PLANE_SERVICE = 1017; STREAMS_GRAND_LEADER_SERVICE = 1018; - STREAMS_META_STORAGE_SERVICE = 1019; + STREAMS_META_STORAGE_SERVICE = 1019; STREAMS_GRAPH_LEADER = 1020; - // YandexQuery - YQ_CONTROL_PLANE_STORAGE = 1021; - YQ_CONTROL_PLANE_PROXY= 1022; - YQ_TEST_CONNECTION = 1023; - + // YandexQuery + YQ_CONTROL_PLANE_STORAGE = 1021; + YQ_CONTROL_PLANE_PROXY= 1022; + YQ_TEST_CONNECTION = 1023; + // Change exchange (async indexes & CDC) CHANGE_EXCHANGE = 1100; @@ -836,8 +836,8 @@ message TActivity { BS_SCRUB_ACTOR = 531; BS_BLOB_RECOVERY_ACTOR = 532; BS_RESTORE_CORRUPTED_BLOB_ACTOR = 533; - YQ_CONTROL_PLANE_STORAGE_ACTOR = 534; - YQ_CONTROL_PLANE_PROXY_ACTOR = 535; + YQ_CONTROL_PLANE_STORAGE_ACTOR = 534; + YQ_CONTROL_PLANE_PROXY_ACTOR = 535; DB_WATCHER_ACTOR = 495; YQL_PENDING_FETCHER_ACTOR = 536; YQL_PINGER_ACTOR = 537; diff --git a/ydb/core/security/secure_request.h b/ydb/core/security/secure_request.h index 04e276a897..aad5b9b64b 100644 --- a/ydb/core/security/secure_request.h +++ b/ydb/core/security/secure_request.h @@ -14,7 +14,7 @@ private: THolder<TEvTicketParser::TEvAuthorizeTicketResult> AuthorizeTicketResult; bool RequireAdminAccess = false; bool UserAdmin = false; - TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry> Entries; + TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry> Entries; static bool GetEnforceUserTokenRequirement() { return AppData()->EnforceUserTokenRequirement; @@ -86,12 +86,12 @@ public: RequireAdminAccess = requireAdminAccess; } - void SetEntries(const TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry>& entries) { - Entries = entries; + void SetEntries(const TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry>& entries) { + Entries = entries; } - const TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry>& GetEntries() const { - return Entries; + const TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry>& GetEntries() const { + return Entries; } const TEvTicketParser::TEvAuthorizeTicketResult* GetAuthorizeTicketResult() const { diff --git a/ydb/core/security/ticket_parser.cpp b/ydb/core/security/ticket_parser.cpp index c7d024d03d..a5f9769860 100644 --- a/ydb/core/security/ticket_parser.cpp +++ b/ydb/core/security/ticket_parser.cpp @@ -125,18 +125,18 @@ class TTicketParser : public TActorBootstrapped<TTicketParser> { key << ':'; } for (const auto& entry : request->Entries) { - for (auto it = entry.Attributes.begin(); it != entry.Attributes.end(); ++it) { - if (it != entry.Attributes.begin()) { - key << '-'; - } - key << it->second; + for (auto it = entry.Attributes.begin(); it != entry.Attributes.end(); ++it) { + if (it != entry.Attributes.begin()) { + key << '-'; + } + key << it->second; } - key << ':'; - for (auto it = entry.Permissions.begin(); it != entry.Permissions.end(); ++it) { - if (it != entry.Permissions.begin()) { - key << '-'; - } - key << *it; + key << ':'; + for (auto it = entry.Permissions.begin(); it != entry.Permissions.end(); ++it) { + if (it != entry.Permissions.begin()) { + key << '-'; + } + key << *it; } } return key.Str(); diff --git a/ydb/core/testlib/test_client.cpp b/ydb/core/testlib/test_client.cpp index d4907c26f1..3319216ae5 100644 --- a/ydb/core/testlib/test_client.cpp +++ b/ydb/core/testlib/test_client.cpp @@ -101,8 +101,8 @@ namespace NKikimr { namespace Tests { - - + + TServerSettings& TServerSettings::SetDomainName(const TString& value) { StoragePoolTypes.erase("test"); DomainName = value; @@ -317,10 +317,10 @@ namespace Tests { GRpcServer->AddService(new NQuoter::TRateLimiterGRpcService(system, counters, grpcRequestProxyId)); GRpcServer->AddService(new NGRpcService::TGRpcYdbLongTxService(system, counters, grpcRequestProxyId)); GRpcServer->AddService(new NGRpcService::TGRpcDataStreamsService(system, counters, grpcRequestProxyId)); - if (Settings->EnableYq) { - GRpcServer->AddService(new NGRpcService::TGRpcYandexQueryService(system, counters, grpcRequestProxyId)); + if (Settings->EnableYq) { + GRpcServer->AddService(new NGRpcService::TGRpcYandexQueryService(system, counters, grpcRequestProxyId)); GRpcServer->AddService(new NGRpcService::TGRpcYqPrivateTaskService(system, counters, grpcRequestProxyId)); - } + } if (const auto& factory = Settings->GrpcServiceFactory) { // All services enabled by default for ut static const std::unordered_set<TString> dummy; @@ -705,119 +705,119 @@ namespace Tests { Runtime->RegisterService(NNetClassifier::MakeNetClassifierID(), netClassifierId, nodeIdx); } - if (Settings->EnableYq) { - NYq::NConfig::TConfig protoConfig; - protoConfig.SetEnabled(true); - + if (Settings->EnableYq) { + NYq::NConfig::TConfig protoConfig; + protoConfig.SetEnabled(true); + protoConfig.MutableCommon()->SetIdsPrefix("id"); - TString endpoint = TStringBuilder() << "localhost:" << Settings->GrpcPort; - TString prefix = "Root/yq"; - auto port = Runtime->GetPortManager().GetPort(); - TString ydbMvpEndpoint = TStringBuilder() - << "http://localhost:" - << port - << "/yql-mock/abc"; - - { - auto& controlPlaneProxyConfig = *protoConfig.MutableControlPlaneProxy(); - controlPlaneProxyConfig.SetEnabled(true); - } - - { - auto& testConnectionConfig = *protoConfig.MutableTestConnection(); - testConnectionConfig.SetEnabled(true); - } - - { - auto& controlPlaneStorageConfig = *protoConfig.MutableControlPlaneStorage(); - controlPlaneStorageConfig.SetEnabled(true); - controlPlaneStorageConfig.SetUseInMemory(Settings->AppConfig.GetYandexQueryConfig().GetControlPlaneStorage().GetUseInMemory()); - auto& storage = *controlPlaneStorageConfig.MutableStorage(); - storage.SetEndpoint(endpoint); - storage.SetTablePrefix(prefix); - - controlPlaneStorageConfig.AddAvailableBinding("DATA_STREAMS"); - controlPlaneStorageConfig.AddAvailableBinding("OBJECT_STORAGE"); - - controlPlaneStorageConfig.AddAvailableConnection("YDB_DATABASE"); - controlPlaneStorageConfig.AddAvailableConnection("CLICKHOUSE_CLUSTER"); - controlPlaneStorageConfig.AddAvailableConnection("DATA_STREAMS"); - controlPlaneStorageConfig.AddAvailableConnection("OBJECT_STORAGE"); - controlPlaneStorageConfig.AddAvailableConnection("MONITORING"); - } - - { - auto& commonConfig = *protoConfig.MutableCommon(); - commonConfig.SetYdbMvpCloudEndpoint(ydbMvpEndpoint); - commonConfig.SetIdsPrefix("ut"); - } - - { - auto& privateApiConfig = *protoConfig.MutablePrivateApi(); - privateApiConfig.SetEnabled(true); - privateApiConfig.SetTaskServiceEndpoint(endpoint); - privateApiConfig.SetTaskServiceDatabase("Root"); - } - - { - auto& tokenAccessorConfig = *protoConfig.MutableTokenAccessor(); - tokenAccessorConfig.SetEnabled(true); - } - - { - auto& dbPoolConfig = *protoConfig.MutableDbPool(); - dbPoolConfig.SetEnabled(true); - auto& storage = *dbPoolConfig.MutableStorage(); - storage.SetEndpoint(endpoint); - storage.SetTablePrefix(prefix); - } - - { - auto& resourceManagerConfig = *protoConfig.MutableResourceManager(); - resourceManagerConfig.SetEnabled(true); - } - - { - auto& privateProxyConfig = *protoConfig.MutablePrivateProxy(); - privateProxyConfig.SetEnabled(true); - } - - { - auto& nodesManagerConfig = *protoConfig.MutableNodesManager(); - nodesManagerConfig.SetEnabled(true); - } - - { - auto& pendingFetcherConfig = *protoConfig.MutablePendingFetcher(); - pendingFetcherConfig.SetEnabled(true); - } - - auto& appData = Runtime->GetAppData(); - - auto actorRegistrator = [&](NActors::TActorId serviceActorId, NActors::IActor* actor) { - auto actorId = Runtime->Register(actor, nodeIdx); - Runtime->RegisterService(serviceActorId, actorId, nodeIdx); - }; - + TString endpoint = TStringBuilder() << "localhost:" << Settings->GrpcPort; + TString prefix = "Root/yq"; + auto port = Runtime->GetPortManager().GetPort(); + TString ydbMvpEndpoint = TStringBuilder() + << "http://localhost:" + << port + << "/yql-mock/abc"; + + { + auto& controlPlaneProxyConfig = *protoConfig.MutableControlPlaneProxy(); + controlPlaneProxyConfig.SetEnabled(true); + } + + { + auto& testConnectionConfig = *protoConfig.MutableTestConnection(); + testConnectionConfig.SetEnabled(true); + } + + { + auto& controlPlaneStorageConfig = *protoConfig.MutableControlPlaneStorage(); + controlPlaneStorageConfig.SetEnabled(true); + controlPlaneStorageConfig.SetUseInMemory(Settings->AppConfig.GetYandexQueryConfig().GetControlPlaneStorage().GetUseInMemory()); + auto& storage = *controlPlaneStorageConfig.MutableStorage(); + storage.SetEndpoint(endpoint); + storage.SetTablePrefix(prefix); + + controlPlaneStorageConfig.AddAvailableBinding("DATA_STREAMS"); + controlPlaneStorageConfig.AddAvailableBinding("OBJECT_STORAGE"); + + controlPlaneStorageConfig.AddAvailableConnection("YDB_DATABASE"); + controlPlaneStorageConfig.AddAvailableConnection("CLICKHOUSE_CLUSTER"); + controlPlaneStorageConfig.AddAvailableConnection("DATA_STREAMS"); + controlPlaneStorageConfig.AddAvailableConnection("OBJECT_STORAGE"); + controlPlaneStorageConfig.AddAvailableConnection("MONITORING"); + } + + { + auto& commonConfig = *protoConfig.MutableCommon(); + commonConfig.SetYdbMvpCloudEndpoint(ydbMvpEndpoint); + commonConfig.SetIdsPrefix("ut"); + } + + { + auto& privateApiConfig = *protoConfig.MutablePrivateApi(); + privateApiConfig.SetEnabled(true); + privateApiConfig.SetTaskServiceEndpoint(endpoint); + privateApiConfig.SetTaskServiceDatabase("Root"); + } + + { + auto& tokenAccessorConfig = *protoConfig.MutableTokenAccessor(); + tokenAccessorConfig.SetEnabled(true); + } + + { + auto& dbPoolConfig = *protoConfig.MutableDbPool(); + dbPoolConfig.SetEnabled(true); + auto& storage = *dbPoolConfig.MutableStorage(); + storage.SetEndpoint(endpoint); + storage.SetTablePrefix(prefix); + } + + { + auto& resourceManagerConfig = *protoConfig.MutableResourceManager(); + resourceManagerConfig.SetEnabled(true); + } + + { + auto& privateProxyConfig = *protoConfig.MutablePrivateProxy(); + privateProxyConfig.SetEnabled(true); + } + + { + auto& nodesManagerConfig = *protoConfig.MutableNodesManager(); + nodesManagerConfig.SetEnabled(true); + } + + { + auto& pendingFetcherConfig = *protoConfig.MutablePendingFetcher(); + pendingFetcherConfig.SetEnabled(true); + } + + auto& appData = Runtime->GetAppData(); + + auto actorRegistrator = [&](NActors::TActorId serviceActorId, NActors::IActor* actor) { + auto actorId = Runtime->Register(actor, nodeIdx); + Runtime->RegisterService(serviceActorId, actorId, nodeIdx); + }; + const auto ydbCredFactory = NKikimr::CreateYdbCredentialsProviderFactory; auto counters = MakeIntrusive<NMonitoring::TDynamicCounters>(); auto yqSharedResources = NYq::CreateYqSharedResources(protoConfig, ydbCredFactory, counters); NYq::Init( - protoConfig, - Runtime->GetNodeId(nodeIdx), - actorRegistrator, + protoConfig, + Runtime->GetNodeId(nodeIdx), + actorRegistrator, &appData, - "TestTenant", + "TestTenant", nullptr, // MakeIntrusive<NPq::NConfigurationManager::TConnections>(), yqSharedResources, NKikimr::NFolderService::CreateMockFolderServiceActor, NYq::CreateMockYqAuditServiceActor, ydbCredFactory, /*IcPort = */0 - ); + ); NYq::InitTest(Runtime.Get(), port, Settings->GrpcPort, yqSharedResources); - } + } } void TServer::SetupLogging() { diff --git a/ydb/core/testlib/test_client.h b/ydb/core/testlib/test_client.h index 2064752ab4..ca74bd58a7 100644 --- a/ydb/core/testlib/test_client.h +++ b/ydb/core/testlib/test_client.h @@ -112,7 +112,7 @@ namespace Tests { bool EnableConfigsDispatcher = true; bool UseRealThreads = true; bool EnableKqpSpilling = false; - bool EnableYq = false; + bool EnableYq = false; TDuration KeepSnapshotTimeout = TDuration::Zero(); ui64 ChangesQueueItemsLimit = 0; ui64 ChangesQueueBytesLimit = 0; @@ -154,7 +154,7 @@ namespace Tests { TServerSettings& SetFeatureFlags(const NKikimrConfig::TFeatureFlags& value) { FeatureFlags = value; return *this; } TServerSettings& SetCompactionConfig(const NKikimrConfig::TCompactionConfig& value) { CompactionConfig = value; return *this; } TServerSettings& SetEnableDbCounters(bool value) { FeatureFlags.SetEnableDbCounters(value); return *this; } - TServerSettings& SetEnableYq(bool value) { EnableYq = value; return *this; } + TServerSettings& SetEnableYq(bool value) { EnableYq = value; return *this; } TServerSettings& SetKeepSnapshotTimeout(TDuration value) { KeepSnapshotTimeout = value; return *this; } TServerSettings& SetChangesQueueItemsLimit(ui64 value) { ChangesQueueItemsLimit = value; return *this; } TServerSettings& SetChangesQueueBytesLimit(ui64 value) { ChangesQueueBytesLimit = value; return *this; } diff --git a/ydb/core/ymq/base/ut/secure_protobuf_printer_ut.cpp b/ydb/core/ymq/base/ut/secure_protobuf_printer_ut.cpp index 3ef6b6a956..7595aeddaf 100644 --- a/ydb/core/ymq/base/ut/secure_protobuf_printer_ut.cpp +++ b/ydb/core/ymq/base/ut/secure_protobuf_printer_ut.cpp @@ -9,13 +9,13 @@ Y_UNIT_TEST_SUITE(SecureProtobufPrinterTest) { { NKikimrClient::TSqsRequest msg; msg.MutableSendMessage()->SetMessageBody("trololo"); - UNIT_ASSERT_STRINGS_EQUAL(SecureShortUtf8DebugString(msg), "SendMessage { MessageBody: \"***\" }"); + UNIT_ASSERT_STRINGS_EQUAL(SecureShortUtf8DebugString(msg), "SendMessage { MessageBody: \"***\" }"); } { NKikimrClient::TSqsResponse msg; msg.MutableReceiveMessage()->AddMessages()->SetData("trololo"); - UNIT_ASSERT_STRINGS_EQUAL(SecureShortUtf8DebugString(msg), "ReceiveMessage { Messages { Data: \"***\" } }"); + UNIT_ASSERT_STRINGS_EQUAL(SecureShortUtf8DebugString(msg), "ReceiveMessage { Messages { Data: \"***\" } }"); } } diff --git a/ydb/core/yq/libs/actors/logging/log.h b/ydb/core/yq/libs/actors/logging/log.h index a5a938f014..7e8ff1a9c9 100644 --- a/ydb/core/yq/libs/actors/logging/log.h +++ b/ydb/core/yq/libs/actors/logging/log.h @@ -76,18 +76,18 @@ #define LOG_STREAMS_CHECKPOINT_COORDINATOR_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, STREAMS_CHECKPOINT_COORDINATOR, logRecordStream) #define LOG_STREAMS_CHECKPOINT_COORDINATOR_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, STREAMS_CHECKPOINT_COORDINATOR, logRecordStream) #define LOG_STREAMS_CHECKPOINT_COORDINATOR_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, STREAMS_CHECKPOINT_COORDINATOR, logRecordStream) - -// Component: STREAMS_CONTROL_PLANE_SERVICE. -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) -#define LOG_STREAMS_CONTROL_PLANE_SERVICE_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) - + +// Component: STREAMS_CONTROL_PLANE_SERVICE. +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) +#define LOG_STREAMS_CONTROL_PLANE_SERVICE_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, STREAMS_CONTROL_PLANE_SERVICE, logRecordStream) + // Component: STREAMS_GRAND_LEADER_SERVICE. #define LOG_STREAMS_GRAND_LEADER_SERVICE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, STREAMS_GRAND_LEADER_SERVICE, logRecordStream) #define LOG_STREAMS_GRAND_LEADER_SERVICE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, STREAMS_GRAND_LEADER_SERVICE, logRecordStream) @@ -98,17 +98,17 @@ #define LOG_STREAMS_GRAND_LEADER_SERVICE_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, STREAMS_GRAND_LEADER_SERVICE, logRecordStream) #define LOG_STREAMS_GRAND_LEADER_SERVICE_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, STREAMS_GRAND_LEADER_SERVICE, logRecordStream) #define LOG_STREAMS_GRAND_LEADER_SERVICE_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, STREAMS_GRAND_LEADER_SERVICE, logRecordStream) - -// Component: STREAMS_META_STORAGE_SERVICE. -#define LOG_STREAMS_META_STORAGE_SERVICE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, STREAMS_META_STORAGE_SERVICE, logRecordStream) -#define LOG_STREAMS_META_STORAGE_SERVICE_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, STREAMS_META_STORAGE_SERVICE, logRecordStream) + +// Component: STREAMS_META_STORAGE_SERVICE. +#define LOG_STREAMS_META_STORAGE_SERVICE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, STREAMS_META_STORAGE_SERVICE, logRecordStream) +#define LOG_STREAMS_META_STORAGE_SERVICE_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, STREAMS_META_STORAGE_SERVICE, logRecordStream) // Component: STREAMS_GRAPH_LEADER. #define LOG_STREAMS_GRAPH_LEADER_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, STREAMS_GRAPH_LEADER, logRecordStream) @@ -120,47 +120,47 @@ #define LOG_STREAMS_GRAPH_LEADER_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, STREAMS_GRAPH_LEADER, logRecordStream) #define LOG_STREAMS_GRAPH_LEADER_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, STREAMS_GRAPH_LEADER, logRecordStream) #define LOG_STREAMS_GRAPH_LEADER_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, STREAMS_GRAPH_LEADER, logRecordStream) - -// Component: YQ_CONTROL_PLANE_STORAGE. -#define LOG_YQ_CONTROL_PLANE_STORAGE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) - - -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_EMERG(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, EMERG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_ALERT(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, ALERT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_CRIT(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, CRIT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_ERROR(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, ERROR, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_WARN(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, WARN, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_NOTICE(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, NOTICE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_INFO(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, INFO, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_DEBUG(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, DEBUG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_TRACE(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, TRACE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) - -// Component: YQ_CONTROL_PLANE_PROXY. -#define LOG_YQ_CONTROL_PLANE_PROXY_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, YQ_CONTROL_PLANE_PROXY, logRecordStream) -#define LOG_YQ_CONTROL_PLANE_PROXY_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, YQ_CONTROL_PLANE_PROXY, logRecordStream) - -// Component: YQ_TEST_CONNECTION. -#define LOG_YQ_TEST_CONNECTION_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, YQ_TEST_CONNECTION, logRecordStream) -#define LOG_YQ_TEST_CONNECTION_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, YQ_TEST_CONNECTION, logRecordStream) + +// Component: YQ_CONTROL_PLANE_STORAGE. +#define LOG_YQ_CONTROL_PLANE_STORAGE_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) + + +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_EMERG(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, EMERG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_ALERT(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, ALERT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_CRIT(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, CRIT, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_ERROR(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, ERROR, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_WARN(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, WARN, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_NOTICE(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, NOTICE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_INFO(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, INFO, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_DEBUG(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, DEBUG, YQ_CONTROL_PLANE_STORAGE, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_STORAGE_AS_TRACE(actorSystem, logRecordStream) LOG_STREAMS_IMPL_AS(actorSystem, TRACE, YQ_CONTROL_PLANE_STORAGE, logRecordStream) + +// Component: YQ_CONTROL_PLANE_PROXY. +#define LOG_YQ_CONTROL_PLANE_PROXY_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, YQ_CONTROL_PLANE_PROXY, logRecordStream) +#define LOG_YQ_CONTROL_PLANE_PROXY_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, YQ_CONTROL_PLANE_PROXY, logRecordStream) + +// Component: YQ_TEST_CONNECTION. +#define LOG_YQ_TEST_CONNECTION_EMERG(logRecordStream) LOG_STREAMS_IMPL(EMERG, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_ALERT(logRecordStream) LOG_STREAMS_IMPL(ALERT, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_CRIT(logRecordStream) LOG_STREAMS_IMPL(CRIT, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_ERROR(logRecordStream) LOG_STREAMS_IMPL(ERROR, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_WARN(logRecordStream) LOG_STREAMS_IMPL(WARN, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_NOTICE(logRecordStream) LOG_STREAMS_IMPL(NOTICE, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_INFO(logRecordStream) LOG_STREAMS_IMPL(INFO, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_DEBUG(logRecordStream) LOG_STREAMS_IMPL(DEBUG, YQ_TEST_CONNECTION, logRecordStream) +#define LOG_YQ_TEST_CONNECTION_TRACE(logRecordStream) LOG_STREAMS_IMPL(TRACE, YQ_TEST_CONNECTION, logRecordStream) diff --git a/ydb/core/yq/libs/actors/nodes_health_check.cpp b/ydb/core/yq/libs/actors/nodes_health_check.cpp index 96e7c1c1cd..194415ddec 100644 --- a/ydb/core/yq/libs/actors/nodes_health_check.cpp +++ b/ydb/core/yq/libs/actors/nodes_health_check.cpp @@ -33,7 +33,7 @@ public: TIntrusivePtr<ITimeProvider> timeProvider, TAutoPtr<TEvents::TEvNodesHealthCheckRequest> ev, TDynamicCounterPtr counters) - : Sender(sender) + : Sender(sender) , TimeProvider(timeProvider) , Ev(std::move(ev)) , Counters(std::move(counters)) diff --git a/ydb/core/yq/libs/actors/nodes_manager.cpp b/ydb/core/yq/libs/actors/nodes_manager.cpp index 62d92aec0f..aa04782be6 100644 --- a/ydb/core/yq/libs/actors/nodes_manager.cpp +++ b/ydb/core/yq/libs/actors/nodes_manager.cpp @@ -58,7 +58,7 @@ public: TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, const ::NYq::NCommon::TServiceCounters& serviceCounters, - const NConfig::TPrivateApiConfig& privateApiConfig, + const NConfig::TPrivateApiConfig& privateApiConfig, const ui32& icPort, const TString& address, const TString& tenant, @@ -68,7 +68,7 @@ public: , TimeProvider(timeProvider) , RandomProvider(randomProvider) , ServiceCounters(serviceCounters, "node_manager") - , PrivateApiConfig(privateApiConfig) + , PrivateApiConfig(privateApiConfig) , Tenant(tenant) , MkqlInitialMemoryLimit(mkqlInitialMemoryLimit) , YqSharedResources(yqSharedResources) @@ -77,7 +77,7 @@ public: , Client( YqSharedResources->YdbDriver, NYdb::TCommonClientSettings() - .DiscoveryEndpoint(PrivateApiConfig.GetTaskServiceEndpoint()) + .DiscoveryEndpoint(PrivateApiConfig.GetTaskServiceEndpoint()) .Database(PrivateApiConfig.GetTaskServiceDatabase() ? PrivateApiConfig.GetTaskServiceDatabase() : TMaybe<TString>()), clientCounters) @@ -92,7 +92,7 @@ public: NActors::IActor::PassAway(); } - void Bootstrap(const TActorContext&) { + void Bootstrap(const TActorContext&) { Become(&TYqlNodesManagerActor::StateFunc); ServiceCounters.Counters->GetCounter("EvBootstrap", true)->Inc(); LOG_I("Bootstrap STARTED"); @@ -257,7 +257,7 @@ private: TIntrusivePtr<ITimeProvider> TimeProvider; TIntrusivePtr<IRandomProvider> RandomProvider; ::NYq::NCommon::TServiceCounters ServiceCounters; - NConfig::TPrivateApiConfig PrivateApiConfig; + NConfig::TPrivateApiConfig PrivateApiConfig; TString Tenant; ui64 MkqlInitialMemoryLimit; @@ -296,7 +296,7 @@ IActor* CreateYqlNodesManager( TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, const ::NYq::NCommon::TServiceCounters& serviceCounters, - const NConfig::TPrivateApiConfig& privateApiConfig, + const NConfig::TPrivateApiConfig& privateApiConfig, const NYq::TYqSharedResources::TPtr& yqSharedResources, const ui32& icPort, const TString& address, diff --git a/ydb/core/yq/libs/actors/nodes_manager.h b/ydb/core/yq/libs/actors/nodes_manager.h index 7301219b58..751a146580 100644 --- a/ydb/core/yq/libs/actors/nodes_manager.h +++ b/ydb/core/yq/libs/actors/nodes_manager.h @@ -26,7 +26,7 @@ IActor* CreateYqlNodesManager( TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, const ::NYq::NCommon::TServiceCounters& serviceCounters, - const NConfig::TPrivateApiConfig& privateApiConfig, + const NConfig::TPrivateApiConfig& privateApiConfig, const NYq::TYqSharedResources::TPtr& yqSharedResources, const ui32& icPort, const TString& address, diff --git a/ydb/core/yq/libs/actors/pending_fetcher.cpp b/ydb/core/yq/libs/actors/pending_fetcher.cpp index 0095963c8f..97224caa7c 100644 --- a/ydb/core/yq/libs/actors/pending_fetcher.cpp +++ b/ydb/core/yq/libs/actors/pending_fetcher.cpp @@ -48,11 +48,11 @@ #include <ydb/core/yq/libs/control_plane_storage/control_plane_storage.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> #include <ydb/core/yq/libs/private_client/private_client.h> - + #include <library/cpp/actors/core/log.h> #include <ydb/library/security/util.h> - + #include <util/generic/deque.h> #include <util/generic/guid.h> #include <util/system/hostname.h> @@ -96,11 +96,11 @@ class TYqlPendingFetcher : public NActors::TActorBootstrapped<TYqlPendingFetcher public: TYqlPendingFetcher( const NYq::TYqSharedResources::TPtr& yqSharedResources, - const ::NYq::NConfig::TCommonConfig& commonConfig, - const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, - const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, - const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, - const ::NYq::NConfig::TPingerConfig& pingerConfig, + const ::NYq::NConfig::TCommonConfig& commonConfig, + const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, + const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, + const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, + const ::NYq::NConfig::TPingerConfig& pingerConfig, const NKikimr::NMiniKQL::IFunctionRegistry* functionRegistry, TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, @@ -112,11 +112,11 @@ public: const NMonitoring::TDynamicCounterPtr& clientCounters ) : YqSharedResources(yqSharedResources) - , CommonConfig(commonConfig) - , CheckpointCoordinatorConfig(checkpointCoordinatorConfig) - , PrivateApiConfig(privateApiConfig) - , GatewaysConfig(gatewaysConfig) - , PingerConfig(pingerConfig) + , CommonConfig(commonConfig) + , CheckpointCoordinatorConfig(checkpointCoordinatorConfig) + , PrivateApiConfig(privateApiConfig) + , GatewaysConfig(gatewaysConfig) + , PingerConfig(pingerConfig) , FunctionRegistry(functionRegistry) , TimeProvider(timeProvider) , RandomProvider(randomProvider) @@ -130,7 +130,7 @@ public: , Client( YqSharedResources->YdbDriver, NYdb::TCommonClientSettings() - .DiscoveryEndpoint(PrivateApiConfig.GetTaskServiceEndpoint()) + .DiscoveryEndpoint(PrivateApiConfig.GetTaskServiceEndpoint()) .Database(PrivateApiConfig.GetTaskServiceDatabase() ? PrivateApiConfig.GetTaskServiceDatabase() : TMaybe<TString>()), ClientCounters) { @@ -206,14 +206,14 @@ private: actorSystem->Send(selfId, new TEvGetTaskInternalResponse( wrappedResult.IsSuccess(), wrappedResult.GetIssues(), wrappedResult.GetResult()) ); - } else { - actorSystem->Send(selfId, new TEvGetTaskInternalResponse( + } else { + actorSystem->Send(selfId, new TEvGetTaskInternalResponse( false, TIssues{{TIssue{"grpc private api result is not set for get task call"}}}, Yq::Private::GetTaskResult{}) - ); - } + ); + } }); - } - + } + void ProcessTask(const Yq::Private::GetTaskResult& result) { for (const auto& task : result.tasks()) { RunTask(task); @@ -238,8 +238,8 @@ private: FunctionRegistry, RandomProvider, ModuleResolver, ModuleResolver->GetNextUniqueId(), DqCompFactory, PqCmConnections, - CommonConfig, CheckpointCoordinatorConfig, - PrivateApiConfig, GatewaysConfig, PingerConfig, + CommonConfig, CheckpointCoordinatorConfig, + PrivateApiConfig, GatewaysConfig, PingerConfig, task.text(), task.scope(), task.user_token(), DatabaseResolver, task.query_id().value(), task.user_id(), Guid, task.generation(), @@ -249,7 +249,7 @@ private: serviceAccounts, task.query_type(), task.execute_mode(), - GetEntityIdAsString(CommonConfig.GetIdsPrefix(), EEntityType::RESULT), + GetEntityIdAsString(CommonConfig.GetIdsPrefix(), EEntityType::RESULT), task.state_load_mode(), task.disposition(), task.status(), @@ -276,11 +276,11 @@ private: ); NYq::TYqSharedResources::TPtr YqSharedResources; - NYq::NConfig::TCommonConfig CommonConfig; - NYq::NConfig::TCheckpointCoordinatorConfig CheckpointCoordinatorConfig; - NYq::NConfig::TPrivateApiConfig PrivateApiConfig; - NYq::NConfig::TGatewaysConfig GatewaysConfig; - NYq::NConfig::TPingerConfig PingerConfig; + NYq::NConfig::TCommonConfig CommonConfig; + NYq::NConfig::TCheckpointCoordinatorConfig CheckpointCoordinatorConfig; + NYq::NConfig::TPrivateApiConfig PrivateApiConfig; + NYq::NConfig::TGatewaysConfig GatewaysConfig; + NYq::NConfig::TPingerConfig PingerConfig; const NKikimr::NMiniKQL::IFunctionRegistry* FunctionRegistry; TIntrusivePtr<ITimeProvider> TimeProvider; @@ -310,11 +310,11 @@ private: NActors::IActor* CreatePendingFetcher( const NYq::TYqSharedResources::TPtr& yqSharedResources, - const ::NYq::NConfig::TCommonConfig& commonConfig, - const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, - const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, - const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, - const ::NYq::NConfig::TPingerConfig& pingerConfig, + const ::NYq::NConfig::TCommonConfig& commonConfig, + const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, + const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, + const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, + const ::NYq::NConfig::TPingerConfig& pingerConfig, const NKikimr::NMiniKQL::IFunctionRegistry* functionRegistry, TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, @@ -327,11 +327,11 @@ NActors::IActor* CreatePendingFetcher( { return new TYqlPendingFetcher( yqSharedResources, - commonConfig, - checkpointCoordinatorConfig, - privateApiConfig, - gatewaysConfig, - pingerConfig, + commonConfig, + checkpointCoordinatorConfig, + privateApiConfig, + gatewaysConfig, + pingerConfig, functionRegistry, timeProvider, randomProvider, diff --git a/ydb/core/yq/libs/actors/pinger.cpp b/ydb/core/yq/libs/actors/pinger.cpp index 55fc80d6a0..8b8e4f7585 100644 --- a/ydb/core/yq/libs/actors/pinger.cpp +++ b/ydb/core/yq/libs/actors/pinger.cpp @@ -127,36 +127,36 @@ class TPingerActor : public NActors::TActorBootstrapped<TPingerActor> { TRetryState RetryState; }; - struct TConfig { - NConfig::TPingerConfig Proto; - TDuration PingPeriod = TDuration::Seconds(15); - - TConfig(const NConfig::TPingerConfig& config) - : Proto(config) - { + struct TConfig { + NConfig::TPingerConfig Proto; + TDuration PingPeriod = TDuration::Seconds(15); + + TConfig(const NConfig::TPingerConfig& config) + : Proto(config) + { if (Proto.GetPingPeriod()) { Y_VERIFY(TDuration::TryParse(Proto.GetPingPeriod(), PingPeriod)); } - } - }; - + } + }; + public: TPingerActor( const TScope& scope, const TString& userId, const TString& id, const TString& ownerId, - const TPrivateClient& client, - const TActorId parent, + const TPrivateClient& client, + const TActorId parent, const NConfig::TPingerConfig& config, const TInstant& deadline) - : Config(config) - , Scope(scope) + : Config(config) + , Scope(scope) , UserId(userId) , Id(id) , OwnerId(ownerId) , Client(client) - , Parent(parent) + , Parent(parent) , Deadline(deadline) { } @@ -177,7 +177,7 @@ private: hFunc(NActors::TEvents::TEvWakeup, Wakeup) hFunc(TEvPingResponse, Handle) hFunc(TEvents::TEvForwardPingRequest, Handle) - ) + ) void PassAway() override { LOG_D("Stop Pinger"); @@ -313,11 +313,11 @@ private: if (success) { LOG_D("Ping response success: " << ev->Get()->Result.GetResult()); StartLeaseTime = now; - auto action = ev->Get()->Action; + auto action = ev->Get()->Action; if (action != YandexQuery::QUERY_ACTION_UNSPECIFIED && !Finishing) { LOG_D("Query action: " << YandexQuery::QueryAction_Name(action)); SendQueryAction(action); - } + } if (continueLeaseRequest) { ScheduleNextPing(); @@ -357,7 +357,7 @@ private: reqInfo.Requested = true; Y_VERIFY(!retry || reqInfo.RetryState); if (!retry && !reqInfo.RetryState) { - reqInfo.RetryState.Init(TActivationContext::Now(), StartLeaseTime, Config.PingPeriod); + reqInfo.RetryState.Init(TActivationContext::Now(), StartLeaseTime, Config.PingPeriod); } LOG_D((retry ? "Retry forward" : "Forward") << " request Private::PingTask"); @@ -372,7 +372,7 @@ private: Requested = true; if (!retry) { - RetryState.Init(TActivationContext::Now(), StartLeaseTime, Config.PingPeriod); + RetryState.Init(TActivationContext::Now(), StartLeaseTime, Config.PingPeriod); } Ping(Yq::Private::PingTaskRequest(), ContinueLeaseRequestCookie); } @@ -412,8 +412,8 @@ private: RetryForwardPingRequestWakeupTag, }; - TConfig Config; - + TConfig Config; + const TScope Scope; const TString UserId; const TString Id; @@ -423,7 +423,7 @@ private: bool Requested = false; TInstant StartLeaseTime; TRetryState RetryState; - const TActorId Parent; + const TActorId Parent; const TInstant Deadline; std::deque<TForwardPingReqInfo> ForwardRequests; @@ -438,8 +438,8 @@ IActor* CreatePingerActor( const TString& userId, const TString& id, const TString& ownerId, - const TPrivateClient& client, - const TActorId parent, + const TPrivateClient& client, + const TActorId parent, const NConfig::TPingerConfig& config, const TInstant& deadline) { @@ -448,8 +448,8 @@ IActor* CreatePingerActor( userId, id, ownerId, - client, - parent, + client, + parent, config, deadline); } diff --git a/ydb/core/yq/libs/actors/proxy.h b/ydb/core/yq/libs/actors/proxy.h index 442d29ac44..64235c96c0 100644 --- a/ydb/core/yq/libs/actors/proxy.h +++ b/ydb/core/yq/libs/actors/proxy.h @@ -35,11 +35,11 @@ NActors::TActorId MakeYqlAnalyticsFetcherId(ui32 nodeId); NActors::IActor* CreatePendingFetcher( const NYq::TYqSharedResources::TPtr& yqSharedResources, - const ::NYq::NConfig::TCommonConfig& commonConfig, - const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, - const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, - const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, - const ::NYq::NConfig::TPingerConfig& pingerConfig, + const ::NYq::NConfig::TCommonConfig& commonConfig, + const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, + const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, + const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, + const ::NYq::NConfig::TPingerConfig& pingerConfig, const NKikimr::NMiniKQL::IFunctionRegistry* functionRegistry, TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, @@ -61,14 +61,14 @@ struct TResultId { int SetId; TString HistoryId; TString Owner; - TString CloudId; + TString CloudId; }; NActors::IActor* CreateResultWriter( const NYdb::TDriver& driver, const NActors::TActorId& executerId, const TString& resultType, - const NConfig::TPrivateApiConfig& privateApiConfig, + const NConfig::TPrivateApiConfig& privateApiConfig, const TResultId& resultId, const TVector<TString>& columns, const TString& traceId, @@ -82,7 +82,7 @@ NActors::IActor* CreatePingerActor( const TString& id, const TString& owner, const NYq::TPrivateClient& client, - const NActors::TActorId parent, + const NActors::TActorId parent, const NConfig::TPingerConfig& config, const TInstant& deadline); diff --git a/ydb/core/yq/libs/actors/proxy_private.cpp b/ydb/core/yq/libs/actors/proxy_private.cpp index f852894578..59b4b3c154 100644 --- a/ydb/core/yq/libs/actors/proxy_private.cpp +++ b/ydb/core/yq/libs/actors/proxy_private.cpp @@ -33,9 +33,9 @@ public: TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, NMonitoring::TDynamicCounterPtr counters, - const NConfig::TTokenAccessorConfig& tokenAccessorConfig) - : TokenAccessorConfig(tokenAccessorConfig) - , TimeProvider(timeProvider) + const NConfig::TTokenAccessorConfig& tokenAccessorConfig) + : TokenAccessorConfig(tokenAccessorConfig) + , TimeProvider(timeProvider) , RandomProvider(randomProvider) , Counters(counters->GetSubgroup("subsystem", "private_api")) { } @@ -56,14 +56,14 @@ private: Counters->GetCounter("EvPingTaskRequest", true)->Inc(); Register( - CreatePingTaskRequestActor(ev->Sender, TimeProvider, ev->Release(), Counters), + CreatePingTaskRequestActor(ev->Sender, TimeProvider, ev->Release(), Counters), NActors::TMailboxType::HTSwap, ctx.SelfID.PoolID()); } void Handle(TEvents::TEvGetTaskRequest::TPtr& ev, const TActorContext& ctx) { Counters->GetCounter("EvGetTaskRequest", true)->Inc(); Register( - CreateGetTaskRequestActor(ev->Sender, TokenAccessorConfig, TimeProvider, ev->Release(), Counters), + CreateGetTaskRequestActor(ev->Sender, TokenAccessorConfig, TimeProvider, ev->Release(), Counters), NActors::TMailboxType::HTSwap, ctx.SelfID.PoolID()); } @@ -71,7 +71,7 @@ private: Counters->GetCounter("EvWriteTaskResultRequest", true)->Inc(); Register( - CreateWriteTaskResultRequestActor(ev->Sender, TimeProvider, ev->Release(), Counters), + CreateWriteTaskResultRequestActor(ev->Sender, TimeProvider, ev->Release(), Counters), NActors::TMailboxType::HTSwap, ctx.SelfID.PoolID()); } @@ -79,7 +79,7 @@ private: Counters->GetCounter("EvNodesHealthCheckRequest", true)->Inc(); Register( - CreateNodesHealthCheckActor(ev->Sender, TimeProvider, ev->Release(), Counters), + CreateNodesHealthCheckActor(ev->Sender, TimeProvider, ev->Release(), Counters), NActors::TMailboxType::HTSwap, ctx.SelfID.PoolID()); } @@ -98,7 +98,7 @@ private: } private: - const NConfig::TTokenAccessorConfig TokenAccessorConfig; + const NConfig::TTokenAccessorConfig TokenAccessorConfig; TIntrusivePtr<ITimeProvider> TimeProvider; TIntrusivePtr<IRandomProvider> RandomProvider; NMonitoring::TDynamicCounterPtr Counters; @@ -113,8 +113,8 @@ IActor* CreateYqlAnalyticsPrivateProxy( TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, NMonitoring::TDynamicCounterPtr counters, - const NConfig::TTokenAccessorConfig& tokenAccessorConfig) { - return new TYqlAnalyticsPrivateProxy(timeProvider, randomProvider, counters, tokenAccessorConfig); + const NConfig::TTokenAccessorConfig& tokenAccessorConfig) { + return new TYqlAnalyticsPrivateProxy(timeProvider, randomProvider, counters, tokenAccessorConfig); } } // namespace NYq diff --git a/ydb/core/yq/libs/actors/proxy_private.h b/ydb/core/yq/libs/actors/proxy_private.h index f5378ebab8..9457597707 100644 --- a/ydb/core/yq/libs/actors/proxy_private.h +++ b/ydb/core/yq/libs/actors/proxy_private.h @@ -26,7 +26,7 @@ NActors::IActor* CreateYqlAnalyticsPrivateProxy( TIntrusivePtr<ITimeProvider> timeProvider, TIntrusivePtr<IRandomProvider> randomProvider, NMonitoring::TDynamicCounterPtr counters, - const NConfig::TTokenAccessorConfig& tockenAccessorConfig + const NConfig::TTokenAccessorConfig& tockenAccessorConfig ); NActors::IActor* CreatePingTaskRequestActor( @@ -38,7 +38,7 @@ NActors::IActor* CreatePingTaskRequestActor( NActors::IActor* CreateGetTaskRequestActor( const NActors::TActorId& sender, - const NConfig::TTokenAccessorConfig& tockenAccessorConfig, + const NConfig::TTokenAccessorConfig& tockenAccessorConfig, TIntrusivePtr<ITimeProvider> timeProvider, TAutoPtr<TEvents::TEvGetTaskRequest> ev, NMonitoring::TDynamicCounterPtr counters diff --git a/ydb/core/yq/libs/actors/result_writer.cpp b/ydb/core/yq/libs/actors/result_writer.cpp index d51b8aae9f..9df3843598 100644 --- a/ydb/core/yq/libs/actors/result_writer.cpp +++ b/ydb/core/yq/libs/actors/result_writer.cpp @@ -19,7 +19,7 @@ #include <ydb/core/yq/libs/control_plane_storage/control_plane_storage.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> #include <ydb/core/yq/libs/private_client/private_client.h> - + #define LOG_E(stream) \ LOG_ERROR_S(*TlsActivationContext, NKikimrServices::YQL_PROXY, "Writer: " << TraceId << ": " << stream) #define LOG_I(stream) \ @@ -39,7 +39,7 @@ public: const NYdb::TDriver& driver, const NActors::TActorId& executerId, const TString& resultType, - const NConfig::TPrivateApiConfig& privateApiConfig, + const NConfig::TPrivateApiConfig& privateApiConfig, const TResultId& resultId, const TVector<TString>& columns, const TString& traceId, @@ -53,7 +53,7 @@ public: , Client( driver, NYdb::TCommonClientSettings() - .DiscoveryEndpoint(privateApiConfig.GetTaskServiceEndpoint()) + .DiscoveryEndpoint(privateApiConfig.GetTaskServiceEndpoint()) .Database(privateApiConfig.GetTaskServiceDatabase() ? privateApiConfig.GetTaskServiceDatabase(): TMaybe<TString>()), clientCounters) { } @@ -73,8 +73,8 @@ private: HFunc(NDq::TEvDqCompute::TEvChannelData, OnChannelData) HFunc(TEvReadyState, OnReadyState); HFunc(TEvQueryResponse, OnQueryResult); - - hFunc(NYq::TEvControlPlaneStorage::TEvWriteResultDataResponse, HandleResponse); + + hFunc(NYq::TEvControlPlaneStorage::TEvWriteResultDataResponse, HandleResponse); ) void PassAway() { @@ -120,29 +120,29 @@ private: void OnReadyState(TEvReadyState::TPtr&, const TActorContext&) { } - void HandleResponse(NYq::TEvControlPlaneStorage::TEvWriteResultDataResponse::TPtr& ev) { - const auto& issues = ev->Get()->Issues; + void HandleResponse(NYq::TEvControlPlaneStorage::TEvWriteResultDataResponse::TPtr& ev) { + const auto& issues = ev->Get()->Issues; auto it = Requests.find(ev->Get()->RequestId); if (issues) { SendIssuesAndSetErrorFlag(issues); return; } - if (it == Requests.end()) { - HasError = true; + if (it == Requests.end()) { + HasError = true; auto req = MakeHolder<TEvDqFailure>(TIssue("Unknown RequestId").SetCode(NYql::DEFAULT_ERROR, TSeverityIds::S_ERROR), /*retriable=*/ false, /*needFallback=*/false); Send(ExecuterId, req.Release()); - return; - } - auto& request = it->second; + return; + } + auto& request = it->second; if (request.MessagesNum > 0) --request.MessagesNum; - + --InflightCounter; if (request.MessagesNum == 0) { FreeSpace += request.Size; - + if (FreeSpace > 0) { auto res = MakeHolder<NDq::TEvDqCompute::TEvChannelDataAck>(); res->Record.SetChannelId(request.ChannelId); @@ -166,8 +166,8 @@ private: MaybeFinish(); } SendResult(); // Send remaining rows - } - + } + void StopChannel(NDq::TEvDqCompute::TEvChannelData::TPtr& ev) { auto res = MakeHolder<NDq::TEvDqCompute::TEvChannelDataAck>(); res->Record.SetChannelId(ev->Get()->Record.GetChannelData().GetChannelId()); @@ -251,9 +251,9 @@ private: return; } - ui64 startRowIndex = RowIndex; + ui64 startRowIndex = RowIndex; RowIndex += resultSet.rows().size(); - + auto& request = Requests[Cookie]; request.Sender = ev->Sender; request.ChannelId = ev->Get()->Record.GetChannelData().GetChannelId(); @@ -358,7 +358,7 @@ NActors::IActor* CreateResultWriter( const NYdb::TDriver& driver, const NActors::TActorId& executerId, const TString& resultType, - const NConfig::TPrivateApiConfig& privateApiConfig, + const NConfig::TPrivateApiConfig& privateApiConfig, const TResultId& resultId, const TVector<TString>& columns, const TString& traceId, diff --git a/ydb/core/yq/libs/actors/run_actor.cpp b/ydb/core/yq/libs/actors/run_actor.cpp index 5549f8f254..a414104621 100644 --- a/ydb/core/yq/libs/actors/run_actor.cpp +++ b/ydb/core/yq/libs/actors/run_actor.cpp @@ -63,7 +63,7 @@ #include <ydb/core/yq/libs/control_plane_storage/control_plane_storage.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> #include <google/protobuf/util/time_util.h> - + #include <util/string/split.h> #include <ydb/core/yq/libs/checkpointing/checkpoint_coordinator.h> #include <ydb/core/yq/libs/checkpointing_common/defs.h> @@ -128,10 +128,10 @@ public: const ::NYq::NCommon::TServiceCounters& serviceCounters , TRunActorParams&& params) : Params(std::move(params)) - , CreatedAt(TInstant::Now()) + , CreatedAt(TInstant::Now()) , ServiceCounters(serviceCounters) , QueryCounters(serviceCounters) - , EnableCheckpointCoordinator(Params.QueryType == YandexQuery::QueryContent::STREAMING && Params.CheckpointCoordinatorConfig.GetEnabled()) + , EnableCheckpointCoordinator(Params.QueryType == YandexQuery::QueryContent::STREAMING && Params.CheckpointCoordinatorConfig.GetEnabled()) , MaxTasksPerOperation(Params.CommonConfig.GetMaxTasksPerOperation() ? Params.CommonConfig.GetMaxTasksPerOperation() : 40) { } @@ -150,12 +150,12 @@ public: TPrivateClient( Params.Driver, NYdb::TCommonClientSettings() - .DiscoveryEndpoint(Params.PrivateApiConfig.GetTaskServiceEndpoint()) - .EnableSsl(Params.PrivateApiConfig.GetSecureTaskService()) + .DiscoveryEndpoint(Params.PrivateApiConfig.GetTaskServiceEndpoint()) + .EnableSsl(Params.PrivateApiConfig.GetSecureTaskService()) .AuthToken(Params.AuthToken) .Database(Params.PrivateApiConfig.GetTaskServiceDatabase() ? Params.PrivateApiConfig.GetTaskServiceDatabase() : TMaybe<TString>()), Params.ClientCounters), - SelfId(), + SelfId(), Params.PingerConfig, Params.Deadline )); @@ -344,9 +344,9 @@ private: default: Abort(TStringBuilder() << "Unknown query action: " << YandexQuery::QueryAction_Name(Action), YandexQuery::QueryMeta::FAILED); break; - } - } - + } + } + void CheckForConsumers() { struct TTopicIndependentConsumers { struct TTopicIndependentConsumer { @@ -583,7 +583,7 @@ private: i64 Min; i64 Max; i64 Sum; - void Write(NYson::TYsonWriter& writer) { + void Write(NYson::TYsonWriter& writer) { writer.OnBeginMap(); if (Children.empty()) { writer.OnKeyedItem("sum"); @@ -599,7 +599,7 @@ private: } else { for (auto& [name, child]: Children) { writer.OnKeyedItem(name); - child.Write(writer); + child.Write(writer); } } writer.OnEndMap(); @@ -640,7 +640,7 @@ private: } NYson::TYsonWriter writer(&out); - statistics.Write(writer); + statistics.Write(writer); return out.Str(); } @@ -831,16 +831,16 @@ private: } void PrepareQueryCounters() { - const TVector<TString> path = StringSplitter(Params.Scope.ToString()).Split('/').SkipEmpty(); // yandexcloud://{folder_id} - const TString folderId = path.size() == 2 && path.front().StartsWith(NYdb::NYq::TScope::YandexCloudScopeSchema) - ? path.back() : TString{}; - + const TVector<TString> path = StringSplitter(Params.Scope.ToString()).Split('/').SkipEmpty(); // yandexcloud://{folder_id} + const TString folderId = path.size() == 2 && path.front().StartsWith(NYdb::NYq::TScope::YandexCloudScopeSchema) + ? path.back() : TString{}; + QueryCounters = ServiceCounters; - PublicCountersParent = ServiceCounters.PublicCounters; + PublicCountersParent = ServiceCounters.PublicCounters; - if (Params.CloudId && folderId) { - PublicCountersParent = PublicCountersParent->GetSubgroup("cloud_id", Params.CloudId)->GetSubgroup("folder_id", folderId); + if (Params.CloudId && folderId) { + PublicCountersParent = PublicCountersParent->GetSubgroup("cloud_id", Params.CloudId)->GetSubgroup("folder_id", folderId); } QueryCounters.PublicCounters = PublicCountersParent->GetSubgroup("query_id", Params.Automatic ? (Params.QueryName ? Params.QueryName : "automatic") : Params.QueryId); @@ -858,9 +858,9 @@ private: dqConfiguration->FreezeDefaults(); dqConfiguration->FallbackPolicy = "never"; - ExecuterId = NActors::TActivationContext::Register(NYql::NDq::MakeDqExecuter(MakeYqlNodesManagerId(), SelfId(), Params.QueryId, "", dqConfiguration, ServiceCounters.Counters, TInstant::Now(), EnableCheckpointCoordinator)); + ExecuterId = NActors::TActivationContext::Register(NYql::NDq::MakeDqExecuter(MakeYqlNodesManagerId(), SelfId(), Params.QueryId, "", dqConfiguration, ServiceCounters.Counters, TInstant::Now(), EnableCheckpointCoordinator)); - NActors::TActorId resultId; + NActors::TActorId resultId; if (dqGraphParams.GetResultType()) { TResultId writerResultId; { @@ -883,7 +883,7 @@ private: } ControlId = NActors::TActivationContext::Register(NYql::MakeTaskController(SessionId, ExecuterId, resultId, dqConfiguration, QueryCounters, TDuration::Seconds(3)).Release()); - if (EnableCheckpointCoordinator) { + if (EnableCheckpointCoordinator) { CheckpointCoordinatorId = NActors::TActivationContext::Register(MakeCheckpointCoordinator( ::NYq::TCoordinatorId(Params.QueryId + "-" + ToString(DqGraphIndex), Params.PreviousQueryRevision), ControlId, @@ -928,7 +928,7 @@ private: attr = dqSettings.Add(); attr->SetName("_TableTimeout"); attr->SetValue("0"); - + attr = dqSettings.Add(); attr->SetName("_LiteralTimeout"); attr->SetValue("0"); @@ -946,39 +946,39 @@ private: } void AddClustersFromConfig(NYql::TGatewaysConfig& gatewaysConfig, THashMap<TString, TString>& clusters) const { - for (const auto& pq : Params.GatewaysConfig.GetPq().GetClusterMapping()) { - auto& clusterCfg = *gatewaysConfig.MutablePq()->AddClusterMapping(); - clusterCfg = pq; - clusters.emplace(clusterCfg.GetName(), PqProviderName); - } - - for (const auto& solomon : Params.GatewaysConfig.GetSolomon().GetClusterMapping()) { - auto& clusterCfg = *gatewaysConfig.MutableSolomon()->AddClusterMapping(); - clusterCfg = solomon; - clusters.emplace(clusterCfg.GetName(), SolomonProviderName); - } + for (const auto& pq : Params.GatewaysConfig.GetPq().GetClusterMapping()) { + auto& clusterCfg = *gatewaysConfig.MutablePq()->AddClusterMapping(); + clusterCfg = pq; + clusters.emplace(clusterCfg.GetName(), PqProviderName); + } + + for (const auto& solomon : Params.GatewaysConfig.GetSolomon().GetClusterMapping()) { + auto& clusterCfg = *gatewaysConfig.MutableSolomon()->AddClusterMapping(); + clusterCfg = solomon; + clusters.emplace(clusterCfg.GetName(), SolomonProviderName); + } } YandexQuery::QueryMeta::ComputeStatus GetFinishStatus(bool isOk) const { - if (isOk) { - return YandexQuery::QueryMeta::COMPLETED; - } - - switch (Action) { - case YandexQuery::PAUSE: - case YandexQuery::PAUSE_GRACEFULLY: - case YandexQuery::ABORT: - case YandexQuery::ABORT_GRACEFULLY: - return YandexQuery::QueryMeta::ABORTED_BY_USER; - case YandexQuery::RESUME: - return YandexQuery::QueryMeta::ABORTED_BY_SYSTEM; - case YandexQuery::QUERY_ACTION_UNSPECIFIED: - case YandexQuery::QueryAction_INT_MIN_SENTINEL_DO_NOT_USE_: - case YandexQuery::QueryAction_INT_MAX_SENTINEL_DO_NOT_USE_: - return YandexQuery::QueryMeta::FAILED; - } + if (isOk) { + return YandexQuery::QueryMeta::COMPLETED; + } + + switch (Action) { + case YandexQuery::PAUSE: + case YandexQuery::PAUSE_GRACEFULLY: + case YandexQuery::ABORT: + case YandexQuery::ABORT_GRACEFULLY: + return YandexQuery::QueryMeta::ABORTED_BY_USER; + case YandexQuery::RESUME: + return YandexQuery::QueryMeta::ABORTED_BY_SYSTEM; + case YandexQuery::QUERY_ACTION_UNSPECIFIED: + case YandexQuery::QueryAction_INT_MIN_SENTINEL_DO_NOT_USE_: + case YandexQuery::QueryAction_INT_MAX_SENTINEL_DO_NOT_USE_: + return YandexQuery::QueryMeta::FAILED; + } } - + YandexQuery::QueryMeta::ComputeStatus GetFinalizingStatus() { // Status before final. "*ING" one. switch (FinalQueryStatus) { case YandexQuery::QueryMeta_ComputeStatus_QueryMeta_ComputeStatus_INT_MIN_SENTINEL_DO_NOT_USE_: @@ -1120,8 +1120,8 @@ private: AddClustersFromConfig(gatewaysConfig, clusters); AddSystemClusters(gatewaysConfig, clusters, Params.AuthToken); AddClustersFromConnections(YqConnections, - Params.CommonConfig.GetUseBearerForYdb(), - Params.CommonConfig.GetObjectStorageEndpoint(), + Params.CommonConfig.GetUseBearerForYdb(), + Params.CommonConfig.GetObjectStorageEndpoint(), Params.AuthToken, Params.AccountIdSignatures, // out params: @@ -1130,7 +1130,7 @@ private: TVector<TDataProviderInitializer> dataProvidersInit; const auto dbResolver = std::make_shared<TDatabaseAsyncResolverWithMeta>(TDatabaseAsyncResolverWithMeta(NActors::TActivationContext::ActorSystem(), Params.DatabaseResolver, - Params.CommonConfig.GetYdbMvpCloudEndpoint(), Params.CommonConfig.GetMdbGateway(), Params.CommonConfig.GetMdbTransformHost(), Params.QueryId, Params.AuthToken, Params.AccountIdSignatures, Connections)); + Params.CommonConfig.GetYdbMvpCloudEndpoint(), Params.CommonConfig.GetMdbGateway(), Params.CommonConfig.GetMdbTransformHost(), Params.QueryId, Params.AuthToken, Params.AccountIdSignatures, Connections)); { // TBD: move init to better place QueryStateUpdateRequest.set_scope(Params.Scope.ToString()); @@ -1178,8 +1178,8 @@ private: << Params.QueryId << '#' << Params.ResultId << '#' << Params.Scope.ToString() << '#' - << Params.Owner << '#' - << Params.CloudId; + << Params.Owner << '#' + << Params.CloudId; Program = progFactory.Create("-stdin-", Params.Sql, SessionId); Program->EnableResultPosition(); @@ -1317,7 +1317,7 @@ private: private: TRunActorParams Params; - THashMap<TString, YandexQuery::Connection> YqConnections; + THashMap<TString, YandexQuery::Connection> YqConnections; TProgramPtr Program; TIssues Issues; @@ -1325,8 +1325,8 @@ private: TQueryResult QueryResult; TInstant Deadline; TActorId Pinger; - TInstant CreatedAt; - YandexQuery::QueryAction Action = YandexQuery::QueryAction::QUERY_ACTION_UNSPECIFIED; + TInstant CreatedAt; + YandexQuery::QueryAction Action = YandexQuery::QueryAction::QUERY_ACTION_UNSPECIFIED; std::vector<NYq::NProto::TGraphParams> DqGraphParams; std::vector<i32> DqGrapResultIndices; i32 DqGraphIndex = 0; @@ -1338,7 +1338,7 @@ private: TString SessionId; ::NYq::NCommon::TServiceCounters ServiceCounters; ::NYq::NCommon::TServiceCounters QueryCounters; - bool EnableCheckpointCoordinator = false; + bool EnableCheckpointCoordinator = false; bool RetryNeeded = false; Yq::Private::PingTaskRequest QueryStateUpdateRequest; THashMap<TString, YandexQuery::Connection> Connections; // Necessary for DbAsyncResolver diff --git a/ydb/core/yq/libs/actors/run_actor_params.cpp b/ydb/core/yq/libs/actors/run_actor_params.cpp index 1446cae1bb..dc53982131 100644 --- a/ydb/core/yq/libs/actors/run_actor_params.cpp +++ b/ydb/core/yq/libs/actors/run_actor_params.cpp @@ -13,29 +13,29 @@ TRunActorParams::TRunActorParams( ui64 nextUniqueId, NKikimr::NMiniKQL::TComputationNodeFactory dqCompFactory, ::NPq::NConfigurationManager::IConnections::TPtr pqCmConnections, - const ::NYq::NConfig::TCommonConfig& commonConfig, + const ::NYq::NConfig::TCommonConfig& commonConfig, const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, - const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, - const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, - const ::NYq::NConfig::TPingerConfig& pingerConfig, + const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, + const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, + const ::NYq::NConfig::TPingerConfig& pingerConfig, const TString& sql, const TScope& scope, const TString& authToken, const TActorId& databaseResolver, const TString& queryId, const TString& userId, - const TString& owner, - const int64_t previousQueryRevision, + const TString& owner, + const int64_t previousQueryRevision, TVector<YandexQuery::Connection> connections, TVector<YandexQuery::Binding> bindings, NYql::ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory, THashMap<TString, TString> accountIdSignatures, YandexQuery::QueryContent::QueryType queryType, YandexQuery::ExecuteMode executeMode, - const TString& resultId, + const TString& resultId, const YandexQuery::StateLoadMode stateLoadMode, const YandexQuery::StreamingDisposition& streamingDisposition, - YandexQuery::QueryMeta::ComputeStatus status, + YandexQuery::QueryMeta::ComputeStatus status, const TString& cloudId, TVector<YandexQuery::ResultSetMeta> resultSetMetas, TVector<TString> dqGraphs, @@ -54,11 +54,11 @@ TRunActorParams::TRunActorParams( , NextUniqueId(nextUniqueId) , DqCompFactory(dqCompFactory) , PqCmConnections(std::move(pqCmConnections)) - , CommonConfig(commonConfig) + , CommonConfig(commonConfig) , CheckpointCoordinatorConfig(checkpointCoordinatorConfig) - , PrivateApiConfig(privateApiConfig) - , GatewaysConfig(gatewaysConfig) - , PingerConfig(pingerConfig) + , PrivateApiConfig(privateApiConfig) + , GatewaysConfig(gatewaysConfig) + , PingerConfig(pingerConfig) , Sql(sql) , Scope(scope) , AuthToken(authToken) @@ -66,7 +66,7 @@ TRunActorParams::TRunActorParams( , QueryId(queryId) , UserId(userId) , Owner(owner) - , PreviousQueryRevision(previousQueryRevision) + , PreviousQueryRevision(previousQueryRevision) , Connections(std::move(connections)) , Bindings(std::move(bindings)) , CredentialsFactory(std::move(credentialsFactory)) @@ -74,10 +74,10 @@ TRunActorParams::TRunActorParams( , QueryType(queryType) , ExecuteMode(executeMode) , ResultId(resultId) - , StateLoadMode(stateLoadMode) + , StateLoadMode(stateLoadMode) , StreamingDisposition(streamingDisposition) , Status(status) - , CloudId(cloudId) + , CloudId(cloudId) , ResultSetMetas(std::move(resultSetMetas)) , DqGraphs(std::move(dqGraphs)) , DqGraphIndex(dqGraphIndex) diff --git a/ydb/core/yq/libs/actors/run_actor_params.h b/ydb/core/yq/libs/actors/run_actor_params.h index bad5c3c32b..55897164ac 100644 --- a/ydb/core/yq/libs/actors/run_actor_params.h +++ b/ydb/core/yq/libs/actors/run_actor_params.h @@ -27,29 +27,29 @@ struct TRunActorParams { // TODO2 : Change name ui64 nextUniqueId, NKikimr::NMiniKQL::TComputationNodeFactory dqCompFactory, ::NPq::NConfigurationManager::IConnections::TPtr pqCmConnections, - const ::NYq::NConfig::TCommonConfig& commonConfig, + const ::NYq::NConfig::TCommonConfig& commonConfig, const ::NYq::NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, - const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, - const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, - const ::NYq::NConfig::TPingerConfig& pingerConfig, + const ::NYq::NConfig::TPrivateApiConfig& privateApiConfig, + const ::NYq::NConfig::TGatewaysConfig& gatewaysConfig, + const ::NYq::NConfig::TPingerConfig& pingerConfig, const TString& sql, const TScope& scope, const TString& authToken, const NActors::TActorId& databaseResolver, const TString& queryId, const TString& userId, - const TString& owner, - const int64_t previousQueryRevision, + const TString& owner, + const int64_t previousQueryRevision, TVector<YandexQuery::Connection> connections, TVector<YandexQuery::Binding> bindings, NYql::ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory, THashMap<TString, TString> accountIdSignatures, YandexQuery::QueryContent::QueryType queryType, YandexQuery::ExecuteMode executeMode, - const TString& resultId, + const TString& resultId, const YandexQuery::StateLoadMode stateLoadMode, const YandexQuery::StreamingDisposition& streamingDisposition, - YandexQuery::QueryMeta::ComputeStatus status, + YandexQuery::QueryMeta::ComputeStatus status, const TString& cloudId, TVector<YandexQuery::ResultSetMeta> resultSetMetas, TVector<TString> dqGraphs, @@ -71,13 +71,13 @@ struct TRunActorParams { // TODO2 : Change name NYql::IModuleResolver::TPtr ModuleResolver; ui64 NextUniqueId; NKikimr::NMiniKQL::TComputationNodeFactory DqCompFactory; - + ::NPq::NConfigurationManager::IConnections::TPtr PqCmConnections; - const ::NYq::NConfig::TCommonConfig CommonConfig; + const ::NYq::NConfig::TCommonConfig CommonConfig; const ::NYq::NConfig::TCheckpointCoordinatorConfig CheckpointCoordinatorConfig; - const ::NYq::NConfig::TPrivateApiConfig PrivateApiConfig; - const ::NYq::NConfig::TGatewaysConfig GatewaysConfig; - const ::NYq::NConfig::TPingerConfig PingerConfig; + const ::NYq::NConfig::TPrivateApiConfig PrivateApiConfig; + const ::NYq::NConfig::TGatewaysConfig GatewaysConfig; + const ::NYq::NConfig::TPingerConfig PingerConfig; const TString Sql; const TScope Scope; const TString AuthToken; @@ -85,18 +85,18 @@ struct TRunActorParams { // TODO2 : Change name const TString QueryId; const TString UserId; const TString Owner; - const int64_t PreviousQueryRevision; - const TVector<YandexQuery::Connection> Connections; + const int64_t PreviousQueryRevision; + const TVector<YandexQuery::Connection> Connections; const TVector<YandexQuery::Binding> Bindings; const NYql::ISecuredServiceAccountCredentialsFactory::TPtr CredentialsFactory; const THashMap<TString, TString> AccountIdSignatures; const YandexQuery::QueryContent::QueryType QueryType; const YandexQuery::ExecuteMode ExecuteMode; const TString ResultId; - const YandexQuery::StateLoadMode StateLoadMode; + const YandexQuery::StateLoadMode StateLoadMode; const YandexQuery::StreamingDisposition StreamingDisposition; YandexQuery::QueryMeta::ComputeStatus Status; - const TString CloudId; + const TString CloudId; const TVector<YandexQuery::ResultSetMeta> ResultSetMetas; const TVector<TString> DqGraphs; const int32_t DqGraphIndex; diff --git a/ydb/core/yq/libs/actors/task_get.cpp b/ydb/core/yq/libs/actors/task_get.cpp index d31517aa9f..8deb162252 100644 --- a/ydb/core/yq/libs/actors/task_get.cpp +++ b/ydb/core/yq/libs/actors/task_get.cpp @@ -34,11 +34,11 @@ class TGetTaskRequestActor public: TGetTaskRequestActor( const NActors::TActorId& sender, - const NConfig::TTokenAccessorConfig& tokenAccessorConfig, + const NConfig::TTokenAccessorConfig& tokenAccessorConfig, TIntrusivePtr<ITimeProvider> timeProvider, TAutoPtr<TEvents::TEvGetTaskRequest> ev, TDynamicCounterPtr counters) - : TokenAccessorConfig(tokenAccessorConfig) + : TokenAccessorConfig(tokenAccessorConfig) , Sender(sender) , TimeProvider(timeProvider) , Ev(std::move(ev)) @@ -47,8 +47,8 @@ public: , RequestedMBytes(Counters->GetHistogram("RequestedMB", ExponentialHistogram(6, 2, 3))) , StartTime(TInstant::Now()) { - if (TokenAccessorConfig.GetHmacSecretFile()) { - Signer = ::NYq::CreateSignerFromFile(TokenAccessorConfig.GetHmacSecretFile()); + if (TokenAccessorConfig.GetHmacSecretFile()) { + Signer = ::NYq::CreateSignerFromFile(TokenAccessorConfig.GetHmacSecretFile()); } } @@ -92,32 +92,32 @@ public: new NYq::TEvControlPlaneStorage::TEvGetTaskRequest(OwnerId, Host)); } - static TString GetServiceAccountId(const YandexQuery::IamAuth& auth) { - return auth.has_service_account() - ? auth.service_account().id() - : TString{}; - } - + static TString GetServiceAccountId(const YandexQuery::IamAuth& auth) { + return auth.has_service_account() + ? auth.service_account().id() + : TString{}; + } + static TString ExtractServiceAccountId(const YandexQuery::Connection& c) { switch (c.content().setting().connection_case()) { case YandexQuery::ConnectionSetting::kYdbDatabase: { - return GetServiceAccountId(c.content().setting().ydb_database().auth()); + return GetServiceAccountId(c.content().setting().ydb_database().auth()); } case YandexQuery::ConnectionSetting::kDataStreams: { - return GetServiceAccountId(c.content().setting().data_streams().auth()); + return GetServiceAccountId(c.content().setting().data_streams().auth()); } case YandexQuery::ConnectionSetting::kObjectStorage: { - return GetServiceAccountId(c.content().setting().object_storage().auth()); + return GetServiceAccountId(c.content().setting().object_storage().auth()); } case YandexQuery::ConnectionSetting::kMonitoring: { - return GetServiceAccountId(c.content().setting().monitoring().auth()); + return GetServiceAccountId(c.content().setting().monitoring().auth()); } case YandexQuery::ConnectionSetting::kClickhouseCluster: { return GetServiceAccountId(c.content().setting().clickhouse_cluster().auth()); } - // Do not replace with default. Adding a new connection should cause a compilation error - case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: - break; + // Do not replace with default. Adding a new connection should cause a compilation error + case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: + break; } return {}; } @@ -203,7 +203,7 @@ private: HFunc(NYq::TEvControlPlaneStorage::TEvGetTaskResponse, HandleResponse) ) - const NConfig::TTokenAccessorConfig TokenAccessorConfig; + const NConfig::TTokenAccessorConfig TokenAccessorConfig; const TActorId Sender; TIntrusivePtr<ITimeProvider> TimeProvider; TAutoPtr<TEvents::TEvGetTaskRequest> Ev; @@ -223,13 +223,13 @@ private: IActor* CreateGetTaskRequestActor( const NActors::TActorId& sender, - const NConfig::TTokenAccessorConfig& tokenAccessorConfig, + const NConfig::TTokenAccessorConfig& tokenAccessorConfig, TIntrusivePtr<ITimeProvider> timeProvider, TAutoPtr<TEvents::TEvGetTaskRequest> ev, TDynamicCounterPtr counters) { return new TGetTaskRequestActor( sender, - tokenAccessorConfig, + tokenAccessorConfig, timeProvider, std::move(ev), counters); diff --git a/ydb/core/yq/libs/actors/task_ping.cpp b/ydb/core/yq/libs/actors/task_ping.cpp index 29410dccd1..245376ae77 100644 --- a/ydb/core/yq/libs/actors/task_ping.cpp +++ b/ydb/core/yq/libs/actors/task_ping.cpp @@ -34,7 +34,7 @@ public: TIntrusivePtr<ITimeProvider> timeProvider, TAutoPtr<TEvents::TEvPingTaskRequest> ev, TDynamicCounterPtr counters) - : Sender(sender) + : Sender(sender) , TimeProvider(timeProvider) , Ev(std::move(ev)) , Counters(std::move(counters->GetSubgroup("subsystem", "private_api")->GetSubgroup("subcomponent", "PingTask"))) @@ -147,10 +147,10 @@ private: event->ResultSetMetas = {req.result_set_meta().begin(), req.result_set_meta().end()}; } if (req.has_started_at()) { - event->StartedAt = TInstant::FromValue(google::protobuf::util::TimeUtil::TimestampToMicroseconds(req.started_at())); + event->StartedAt = TInstant::FromValue(google::protobuf::util::TimeUtil::TimestampToMicroseconds(req.started_at())); } if (req.has_finished_at()) { - event->FinishedAt = TInstant::FromValue(google::protobuf::util::TimeUtil::TimestampToMicroseconds(req.finished_at())); + event->FinishedAt = TInstant::FromValue(google::protobuf::util::TimeUtil::TimestampToMicroseconds(req.finished_at())); } event->ResignQuery = req.resign_query(); @@ -207,8 +207,8 @@ private: auto res = MakeHolder<TEvents::TEvPingTaskResponse>(); res->Status = Ydb::StatusIds::SUCCESS; Yq::Private::PingTaskResult result; - result.set_action(ev->Get()->Action); - res->Record.ConstructInPlace(result); + result.set_action(ev->Get()->Action); + res->Record.ConstructInPlace(result); ctx.Send(Sender, res.Release()); Die(ctx); } diff --git a/ydb/core/yq/libs/actors/task_result_write.cpp b/ydb/core/yq/libs/actors/task_result_write.cpp index 5919ddbaab..eda8c47e4b 100644 --- a/ydb/core/yq/libs/actors/task_result_write.cpp +++ b/ydb/core/yq/libs/actors/task_result_write.cpp @@ -34,7 +34,7 @@ public: TIntrusivePtr<ITimeProvider> timeProvider, TAutoPtr<TEvents::TEvWriteTaskResultRequest> ev, TDynamicCounterPtr counters) - : Sender(sender) + : Sender(sender) , TimeProvider(timeProvider) , Ev(std::move(ev)) , Counters(std::move(counters->GetSubgroup("subsystem", "private_api")->GetSubgroup("subcomponent", "WriteTaskResult"))) diff --git a/ydb/core/yq/libs/actors/ya.make b/ydb/core/yq/libs/actors/ya.make index 3638593814..5b8900f3a5 100644 --- a/ydb/core/yq/libs/actors/ya.make +++ b/ydb/core/yq/libs/actors/ya.make @@ -25,12 +25,12 @@ SRCS( PEERDIR( library/cpp/actors/core library/cpp/actors/interconnect - library/cpp/json/yson - library/cpp/monlib/dynamic_counters - library/cpp/random_provider - library/cpp/time_provider - library/cpp/yson - library/cpp/yson/node + library/cpp/json/yson + library/cpp/monlib/dynamic_counters + library/cpp/random_provider + library/cpp/time_provider + library/cpp/yson + library/cpp/yson/node ydb/core/base ydb/core/protos ydb/core/yq/libs/actors/logging diff --git a/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.cpp b/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.cpp index 74f994e0df..15d5d6ad31 100644 --- a/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.cpp +++ b/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.cpp @@ -67,7 +67,7 @@ private: } }; -NActors::IActor* CreateMockYqAuditServiceActor(const NConfig::TAuditConfig& config) { +NActors::IActor* CreateMockYqAuditServiceActor(const NConfig::TAuditConfig& config) { Y_UNUSED(config); return new TYqMockAuditServiceActor(); } diff --git a/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.h b/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.h index f00bf08959..b273710ba9 100644 --- a/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.h +++ b/ydb/core/yq/libs/audit/mock/yq_mock_audit_service.h @@ -9,6 +9,6 @@ namespace NYq { -NActors::IActor* CreateMockYqAuditServiceActor(const NConfig::TAuditConfig& config); +NActors::IActor* CreateMockYqAuditServiceActor(const NConfig::TAuditConfig& config); } // namespace NYq diff --git a/ydb/core/yq/libs/checkpoint_storage/storage_proxy.cpp b/ydb/core/yq/libs/checkpoint_storage/storage_proxy.cpp index 07c8d5101a..0c1050c9a0 100644 --- a/ydb/core/yq/libs/checkpoint_storage/storage_proxy.cpp +++ b/ydb/core/yq/libs/checkpoint_storage/storage_proxy.cpp @@ -17,10 +17,10 @@ #include <library/cpp/actors/core/actor_bootstrapped.h> #include <library/cpp/actors/core/hfunc.h> -#include <util/stream/file.h> +#include <util/stream/file.h> #include <util/string/join.h> -#include <util/string/strip.h> - +#include <util/string/strip.h> + #define LOG_STORAGE_ASYNC_DEBUG(actorContext, stream) LOG_LOG_S(actorContext, ::NActors::NLog::PRI_DEBUG, ::NKikimrServices::STREAMS_STORAGE_SERVICE, stream); #define LOG_STORAGE_ASYNC_INFO(actorContext, stream) LOG_LOG_S(actorContext, ::NActors::NLog::PRI_INFO, ::NKikimrServices::STREAMS_STORAGE_SERVICE, stream); #define LOG_STORAGE_ASYNC_WARN(actorContext, stream) LOG_LOG_S(actorContext, ::NActors::NLog::PRI_WARN, ::NKikimrServices::STREAMS_STORAGE_SERVICE, stream); @@ -34,9 +34,9 @@ namespace { //////////////////////////////////////////////////////////////////////////////// class TStorageProxy : public TActorBootstrapped<TStorageProxy> { - NConfig::TCheckpointCoordinatorConfig Config; + NConfig::TCheckpointCoordinatorConfig Config; NConfig::TCommonConfig CommonConfig; - NConfig::TYdbStorageConfig StorageConfig; + NConfig::TYdbStorageConfig StorageConfig; TCheckpointStoragePtr CheckpointStorage; TStateStoragePtr StateStorage; TActorId ActorGC; @@ -44,7 +44,7 @@ class TStorageProxy : public TActorBootstrapped<TStorageProxy> { public: explicit TStorageProxy( - const NConfig::TCheckpointCoordinatorConfig& config, + const NConfig::TCheckpointCoordinatorConfig& config, const NConfig::TCommonConfig& commonConfig, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory); @@ -78,34 +78,34 @@ private: void Handle(NYql::NDq::TEvDqCompute::TEvGetTaskState::TPtr& ev); }; -static void FillDefaultParameters(NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, NConfig::TYdbStorageConfig& ydbStorageConfig) { - auto& limits = *checkpointCoordinatorConfig.MutableStateStorageLimits(); - if (!limits.GetMaxGraphCheckpointsSizeBytes()) { - limits.SetMaxGraphCheckpointsSizeBytes(1099511627776); - } - - if (!limits.GetMaxTaskStateSizeBytes()) { - limits.SetMaxTaskStateSizeBytes(1099511627776); - } - - if (!checkpointCoordinatorConfig.GetStorage().GetToken() && checkpointCoordinatorConfig.GetStorage().GetOAuthFile()) { - checkpointCoordinatorConfig.MutableStorage()->SetToken(StripString(TFileInput(checkpointCoordinatorConfig.GetStorage().GetOAuthFile()).ReadAll())); - } - - if (!ydbStorageConfig.GetToken() && ydbStorageConfig.GetOAuthFile()) { - ydbStorageConfig.SetToken(StripString(TFileInput(ydbStorageConfig.GetOAuthFile()).ReadAll())); - } -} - +static void FillDefaultParameters(NConfig::TCheckpointCoordinatorConfig& checkpointCoordinatorConfig, NConfig::TYdbStorageConfig& ydbStorageConfig) { + auto& limits = *checkpointCoordinatorConfig.MutableStateStorageLimits(); + if (!limits.GetMaxGraphCheckpointsSizeBytes()) { + limits.SetMaxGraphCheckpointsSizeBytes(1099511627776); + } + + if (!limits.GetMaxTaskStateSizeBytes()) { + limits.SetMaxTaskStateSizeBytes(1099511627776); + } + + if (!checkpointCoordinatorConfig.GetStorage().GetToken() && checkpointCoordinatorConfig.GetStorage().GetOAuthFile()) { + checkpointCoordinatorConfig.MutableStorage()->SetToken(StripString(TFileInput(checkpointCoordinatorConfig.GetStorage().GetOAuthFile()).ReadAll())); + } + + if (!ydbStorageConfig.GetToken() && ydbStorageConfig.GetOAuthFile()) { + ydbStorageConfig.SetToken(StripString(TFileInput(ydbStorageConfig.GetOAuthFile()).ReadAll())); + } +} + TStorageProxy::TStorageProxy( - const NConfig::TCheckpointCoordinatorConfig& config, + const NConfig::TCheckpointCoordinatorConfig& config, const NConfig::TCommonConfig& commonConfig, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory) : Config(config) , CommonConfig(commonConfig) - , StorageConfig(Config.GetStorage()) - , CredentialsProviderFactory(credentialsProviderFactory) { - FillDefaultParameters(Config, StorageConfig); + , StorageConfig(Config.GetStorage()) + , CredentialsProviderFactory(credentialsProviderFactory) { + FillDefaultParameters(Config, StorageConfig); } void TStorageProxy::Bootstrap() { @@ -115,22 +115,22 @@ void TStorageProxy::Bootstrap() { LOG_STREAMS_STORAGE_SERVICE_ERROR("Failed to init checkpoint storage: " << issues.ToOneLineString()); } - StateStorage = NewYdbStateStorage(StorageConfig, CredentialsProviderFactory); + StateStorage = NewYdbStateStorage(StorageConfig, CredentialsProviderFactory); issues = StateStorage->Init().GetValueSync(); if (!issues.Empty()) { LOG_STREAMS_STORAGE_SERVICE_ERROR("Failed to init checkpoint state storage: " << issues.ToOneLineString()); } - if (Config.GetCheckpointGarbageConfig().GetEnabled()) { - const auto& gcConfig = Config.GetCheckpointGarbageConfig(); + if (Config.GetCheckpointGarbageConfig().GetEnabled()) { + const auto& gcConfig = Config.GetCheckpointGarbageConfig(); ActorGC = Register(NewGC(gcConfig, CheckpointStorage, StateStorage).release()); } Become(&TStorageProxy::StateFunc); LOG_STREAMS_STORAGE_SERVICE_INFO("Successfully bootstrapped TStorageProxy " << SelfId() << " with connection to " - << StorageConfig.GetEndpoint().data() - << ":" << StorageConfig.GetDatabase().data()) + << StorageConfig.GetEndpoint().data() + << ":" << StorageConfig.GetDatabase().data()) } void TStorageProxy::Handle(TEvCheckpointStorage::TEvRegisterCoordinatorRequest::TPtr& ev) { @@ -163,7 +163,7 @@ void TStorageProxy::Handle(TEvCheckpointStorage::TEvCreateCheckpointRequest::TPt coordinatorId = event->CoordinatorId, cookie = ev->Cookie, sender = ev->Sender, - totalGraphCheckpointsSizeLimit = Config.GetStateStorageLimits().GetMaxGraphCheckpointsSizeBytes(), + totalGraphCheckpointsSizeLimit = Config.GetStateStorageLimits().GetMaxGraphCheckpointsSizeBytes(), context = TActivationContext::AsActorContext()] (const NThreading::TFuture<ICheckpointStorage::TGetTotalCheckpointsStateSizeResult>& resultFuture) { auto result = resultFuture.GetValue(); @@ -257,7 +257,7 @@ void TStorageProxy::Handle(TEvCheckpointStorage::TEvCompleteCheckpointRequest::T coordinatorId = event->CoordinatorId, cookie = ev->Cookie, sender = ev->Sender, - gcEnabled = Config.GetCheckpointGarbageConfig().GetEnabled(), + gcEnabled = Config.GetCheckpointGarbageConfig().GetEnabled(), actorGC = ActorGC, context = TActivationContext::AsActorContext()] (const NThreading::TFuture<NYql::TIssues>& issuesFuture) { @@ -323,9 +323,9 @@ void TStorageProxy::Handle(NYql::NDq::TEvDqCompute::TEvSaveTaskState::TPtr& ev) LOG_STREAMS_STORAGE_SERVICE_DEBUG("[" << checkpointId << "] Got TEvSaveTaskState: task " << event->TaskId); const size_t stateSize = event->State.ByteSizeLong(); - if (stateSize > Config.GetStateStorageLimits().GetMaxTaskStateSizeBytes()) { + if (stateSize > Config.GetStateStorageLimits().GetMaxTaskStateSizeBytes()) { LOG_STREAMS_STORAGE_SERVICE_WARN("[" << checkpointId << "] Won't save task state because it's too big: task: " << event->TaskId - << ", state size: " << stateSize << "/" << Config.GetStateStorageLimits().GetMaxTaskStateSizeBytes()); + << ", state size: " << stateSize << "/" << Config.GetStateStorageLimits().GetMaxTaskStateSizeBytes()); auto response = std::make_unique<NYql::NDq::TEvDqCompute::TEvSaveTaskStateResult>(); response->Record.MutableCheckpoint()->SetGeneration(checkpointId.CoordinatorGeneration); response->Record.MutableCheckpoint()->SetId(checkpointId.SeqNo); @@ -391,7 +391,7 @@ void TStorageProxy::Handle(NYql::NDq::TEvDqCompute::TEvGetTaskState::TPtr& ev) { //////////////////////////////////////////////////////////////////////////////// std::unique_ptr<NActors::IActor> NewStorageProxy( - const NConfig::TCheckpointCoordinatorConfig& config, + const NConfig::TCheckpointCoordinatorConfig& config, const NConfig::TCommonConfig& commonConfig, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory) { diff --git a/ydb/core/yq/libs/checkpoint_storage/storage_proxy.h b/ydb/core/yq/libs/checkpoint_storage/storage_proxy.h index c67d928a15..e9074192dc 100644 --- a/ydb/core/yq/libs/checkpoint_storage/storage_proxy.h +++ b/ydb/core/yq/libs/checkpoint_storage/storage_proxy.h @@ -12,7 +12,7 @@ namespace NYq { std::unique_ptr<NActors::IActor> NewStorageProxy( - const NConfig::TCheckpointCoordinatorConfig& config, + const NConfig::TCheckpointCoordinatorConfig& config, const NConfig::TCommonConfig& commonConfig, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory); diff --git a/ydb/core/yq/libs/checkpoint_storage/storage_service.cpp b/ydb/core/yq/libs/checkpoint_storage/storage_service.cpp index 421c19d7fd..3abdc33f0b 100644 --- a/ydb/core/yq/libs/checkpoint_storage/storage_service.cpp +++ b/ydb/core/yq/libs/checkpoint_storage/storage_service.cpp @@ -9,7 +9,7 @@ using namespace NActors; //////////////////////////////////////////////////////////////////////////////// std::unique_ptr<NActors::IActor> NewCheckpointStorageService( - const NConfig::TCheckpointCoordinatorConfig& config, + const NConfig::TCheckpointCoordinatorConfig& config, const NConfig::TCommonConfig& commonConfig, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory) { diff --git a/ydb/core/yq/libs/checkpoint_storage/storage_service.h b/ydb/core/yq/libs/checkpoint_storage/storage_service.h index 5eab844545..35437098dd 100644 --- a/ydb/core/yq/libs/checkpoint_storage/storage_service.h +++ b/ydb/core/yq/libs/checkpoint_storage/storage_service.h @@ -12,7 +12,7 @@ namespace NYq { std::unique_ptr<NActors::IActor> NewCheckpointStorageService( - const NConfig::TCheckpointCoordinatorConfig& config, + const NConfig::TCheckpointCoordinatorConfig& config, const NConfig::TCommonConfig& commonConfig, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory); diff --git a/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.cpp b/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.cpp index d9d354c2e5..22a14fd63d 100644 --- a/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.cpp +++ b/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.cpp @@ -30,7 +30,7 @@ TCheckpointCoordinator::TCheckpointCoordinator(TCoordinatorId coordinatorId, const TActorId& taskControllerId, const TActorId& storageProxy, const TActorId& runActorId, - const TCheckpointCoordinatorConfig& settings, + const TCheckpointCoordinatorConfig& settings, const NMonitoring::TDynamicCounterPtr& counters, const NProto::TGraphParams& graphParams, const YandexQuery::StateLoadMode& stateLoadMode, diff --git a/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.h b/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.h index 0bb76685e1..c6ac5b034b 100644 --- a/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.h +++ b/ydb/core/yq/libs/checkpointing/checkpoint_coordinator.h @@ -27,7 +27,7 @@ public: const TActorId& taskControllerId, const TActorId& storageProxy, const TActorId& runActorId, - const TCheckpointCoordinatorConfig& settings, + const TCheckpointCoordinatorConfig& settings, const NMonitoring::TDynamicCounterPtr& counters, const NProto::TGraphParams& graphParams, const YandexQuery::StateLoadMode& stateLoadMode, diff --git a/ydb/core/yq/libs/checkpointing/ut/checkpoint_coordinator_ut.cpp b/ydb/core/yq/libs/checkpointing/ut/checkpoint_coordinator_ut.cpp index ceb0a9faf5..0997a1303b 100644 --- a/ydb/core/yq/libs/checkpointing/ut/checkpoint_coordinator_ut.cpp +++ b/ydb/core/yq/libs/checkpointing/ut/checkpoint_coordinator_ut.cpp @@ -85,7 +85,7 @@ struct TTestBootstrap : public TTestActorRuntime { ActorToTask[EgressActor] = GraphState.GetTask()[2].GetId(); Settings = NConfig::TCheckpointCoordinatorConfig(); - Settings.SetEnabled(true); + Settings.SetEnabled(true); Settings.SetCheckpointingPeriodMillis(TDuration::Hours(1).MilliSeconds()); Settings.SetMaxInflight(1); diff --git a/ydb/core/yq/libs/checkpointing/ya.make b/ydb/core/yq/libs/checkpointing/ya.make index 8a397f67ef..67d2b74642 100644 --- a/ydb/core/yq/libs/checkpointing/ya.make +++ b/ydb/core/yq/libs/checkpointing/ya.make @@ -16,7 +16,7 @@ SRCS( ) PEERDIR( - library/cpp/actors/core + library/cpp/actors/core ydb/core/yq/libs/actors/logging ydb/core/yq/libs/checkpointing_common ydb/core/yq/libs/checkpoint_storage/events diff --git a/ydb/core/yq/libs/common/database_token_builder.h b/ydb/core/yq/libs/common/database_token_builder.h index a3e00efab5..6fbabb22c1 100644 --- a/ydb/core/yq/libs/common/database_token_builder.h +++ b/ydb/core/yq/libs/common/database_token_builder.h @@ -21,4 +21,4 @@ using namespace NYql; const THashMap<TString, TString>& accountIdSignatures, THashMap<std::pair<TString, DatabaseType>, TEvents::TDatabaseAuth>& databaseIds); -} // NYq +} // NYq diff --git a/ydb/core/yq/libs/common/entity_id.cpp b/ydb/core/yq/libs/common/entity_id.cpp index dab1d1abca..0d84959ce7 100644 --- a/ydb/core/yq/libs/common/entity_id.cpp +++ b/ydb/core/yq/libs/common/entity_id.cpp @@ -11,58 +11,58 @@ namespace NYq { // used ascii order: IntToChar[i] < IntToChar[i+1] constexpr char IntToChar[] = { - '0', '1', '2', '3', '4', '5', '6', '7', // 8 - '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', // 16 - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 24 - 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 32 + '0', '1', '2', '3', '4', '5', '6', '7', // 8 + '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', // 16 + 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', // 24 + 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', // 32 }; -static bool IsValidSymbol(char symbol) { - return '0' <= symbol && symbol <= '9' || 'a' <= symbol && symbol <= 'v'; -} - -// 30 bits = 6 symbols -TString Conv(ui32 n) { - char buf[7] = {0}; - for (int i = 0; i < 6; i++) { - buf[5 - i] = IntToChar[n & 0x1f]; - n >>= 5; - } - return buf; -} - -// 55 bits = 11 symbols -TString ConvTime(ui64 time) { +static bool IsValidSymbol(char symbol) { + return '0' <= symbol && symbol <= '9' || 'a' <= symbol && symbol <= 'v'; +} + +// 30 bits = 6 symbols +TString Conv(ui32 n) { + char buf[7] = {0}; + for (int i = 0; i < 6; i++) { + buf[5 - i] = IntToChar[n & 0x1f]; + n >>= 5; + } + return buf; +} + +// 55 bits = 11 symbols +TString ConvTime(ui64 time) { char buf[12] = {0}; for (int i = 0; i < 11; i++) { - buf[10 - i] = IntToChar[time & 0x1f]; - time >>= 5; + buf[10 - i] = IntToChar[time & 0x1f]; + time >>= 5; } return buf; } -/* -- prefix [2 symbols (10 bit)] - service identifier -- type [1 symbol (5 bit)] - resource type (query, job, connection, binding, result, ...) -- reversed time [11 symbols (55 bit)] - for provides sorting properties by creation time -- random number [6 symbols (30 bit)] - a random number to ensure the uniqueness of the keys within a microsecond -*/ -TString GetEntityIdAsString(const TString& prefix, EEntityType type) { - Y_VERIFY(prefix.size() == 2, "prefix must contain exactly two characters"); - Y_VERIFY(IsValidSymbol(static_cast<char>(type)), "not valid character for type"); - Y_VERIFY(IsValidSymbol(prefix[0]), "not valid character for prefix[0]"); - Y_VERIFY(IsValidSymbol(prefix[1]), "not valid character for prefix[1]"); - return GetEntityIdAsString(prefix, type, TInstant::Now(), RandomNumber<ui32>()); -} +/* +- prefix [2 symbols (10 bit)] - service identifier +- type [1 symbol (5 bit)] - resource type (query, job, connection, binding, result, ...) +- reversed time [11 symbols (55 bit)] - for provides sorting properties by creation time +- random number [6 symbols (30 bit)] - a random number to ensure the uniqueness of the keys within a microsecond +*/ +TString GetEntityIdAsString(const TString& prefix, EEntityType type) { + Y_VERIFY(prefix.size() == 2, "prefix must contain exactly two characters"); + Y_VERIFY(IsValidSymbol(static_cast<char>(type)), "not valid character for type"); + Y_VERIFY(IsValidSymbol(prefix[0]), "not valid character for prefix[0]"); + Y_VERIFY(IsValidSymbol(prefix[1]), "not valid character for prefix[1]"); + return GetEntityIdAsString(prefix, type, TInstant::Now(), RandomNumber<ui32>()); +} -TString GetEntityIdAsString(const TString& prefix, EEntityType type, TInstant now, ui32 rnd) { - // The maximum time that fits in 55 bits. Necessary for the correct inversion of time - static constexpr TInstant MaxSeconds = TInstant::FromValue(0x7FFFFFFFFFFFFFULL); - Y_VERIFY(MaxSeconds >= now, "lifetime of the id interval has gone beyond the boundaries"); - ui64 reversedTime = (MaxSeconds - now).GetValue(); - TStringStream stream; - stream << prefix << static_cast<char>(type) << ConvTime(reversedTime) << Conv(rnd); - return stream.Str(); +TString GetEntityIdAsString(const TString& prefix, EEntityType type, TInstant now, ui32 rnd) { + // The maximum time that fits in 55 bits. Necessary for the correct inversion of time + static constexpr TInstant MaxSeconds = TInstant::FromValue(0x7FFFFFFFFFFFFFULL); + Y_VERIFY(MaxSeconds >= now, "lifetime of the id interval has gone beyond the boundaries"); + ui64 reversedTime = (MaxSeconds - now).GetValue(); + TStringStream stream; + stream << prefix << static_cast<char>(type) << ConvTime(reversedTime) << Conv(rnd); + return stream.Str(); } struct TEntityIdGenerator : public IEntityIdGenerator { diff --git a/ydb/core/yq/libs/common/entity_id.h b/ydb/core/yq/libs/common/entity_id.h index d34dee0f55..d8810facfd 100644 --- a/ydb/core/yq/libs/common/entity_id.h +++ b/ydb/core/yq/libs/common/entity_id.h @@ -1,23 +1,23 @@ #pragma once #include <util/generic/string.h> -#include <util/datetime/base.h> +#include <util/datetime/base.h> namespace NYq { -enum class EEntityType : char { - UNDEFINED = 'u', - QUERY = 'q', - JOB = 'j', - RESULT = 'r', - CONNECTION = 'c', +enum class EEntityType : char { + UNDEFINED = 'u', + QUERY = 'q', + JOB = 'j', + RESULT = 'r', + CONNECTION = 'c', BINDING = 'b', CHECKPOINT_GRAPH_DESCRIPTION = 'g', -}; - -TString GetEntityIdAsString(const TString& prefix, EEntityType type); -TString GetEntityIdAsString(const TString& prefix, EEntityType type, TInstant now, ui32 rnd); +}; +TString GetEntityIdAsString(const TString& prefix, EEntityType type); +TString GetEntityIdAsString(const TString& prefix, EEntityType type, TInstant now, ui32 rnd); + struct IEntityIdGenerator : public TThrRefBase { using TPtr = TIntrusivePtr<IEntityIdGenerator>; diff --git a/ydb/core/yq/libs/common/entity_id_ut.cpp b/ydb/core/yq/libs/common/entity_id_ut.cpp index 8533bdcca0..b2666c2ab9 100644 --- a/ydb/core/yq/libs/common/entity_id_ut.cpp +++ b/ydb/core/yq/libs/common/entity_id_ut.cpp @@ -1,7 +1,7 @@ #include "entity_id.h" #include <ydb/services/ydb/ydb_common_ut.h> -#include <limits> +#include <limits> using namespace NYq; @@ -12,7 +12,7 @@ Y_UNIT_TEST_SUITE(EntityId) { THashSet<TString> uniq; values.reserve(count); for (int i = 0; i < count; i++) { - values.push_back(GetEntityIdAsString("de", EEntityType::UNDEFINED)); + values.push_back(GetEntityIdAsString("de", EEntityType::UNDEFINED)); uniq.insert(values.back()); } @@ -24,7 +24,7 @@ Y_UNIT_TEST_SUITE(EntityId) { TVector<TString> values, copy; values.reserve(count); for (int i = 0; i < count; i++) { - values.push_back(GetEntityIdAsString("de", EEntityType::UNDEFINED)); + values.push_back(GetEntityIdAsString("de", EEntityType::UNDEFINED)); Sleep(TDuration::MilliSeconds(1)); // timer resolution } copy = values; @@ -36,16 +36,16 @@ Y_UNIT_TEST_SUITE(EntityId) { UNIT_ASSERT_VALUES_EQUAL(values[i], copy[i]); } } - - Y_UNIT_TEST(MinId) { - UNIT_ASSERT_VALUES_EQUAL(GetEntityIdAsString("00", EEntityType::UNDEFINED, TInstant::FromValue(0x7FFFFFFFFFFFFFULL), 0), "00u00000000000000000"); - } - - Y_UNIT_TEST(MaxId) { - UNIT_ASSERT_VALUES_EQUAL(GetEntityIdAsString("vv", EEntityType::UNDEFINED, TInstant::Zero(), std::numeric_limits<ui32>::max()), "vvuvvvvvvvvvvvvvvvvv"); - } - - Y_UNIT_TEST(CheckId) { - UNIT_ASSERT_VALUES_EQUAL(GetEntityIdAsString("ut", EEntityType::QUERY, TInstant::ParseIso8601("2021-12-04"), 666666), "utquhdn55pa7vv00kb1a"); - } + + Y_UNIT_TEST(MinId) { + UNIT_ASSERT_VALUES_EQUAL(GetEntityIdAsString("00", EEntityType::UNDEFINED, TInstant::FromValue(0x7FFFFFFFFFFFFFULL), 0), "00u00000000000000000"); + } + + Y_UNIT_TEST(MaxId) { + UNIT_ASSERT_VALUES_EQUAL(GetEntityIdAsString("vv", EEntityType::UNDEFINED, TInstant::Zero(), std::numeric_limits<ui32>::max()), "vvuvvvvvvvvvvvvvvvvv"); + } + + Y_UNIT_TEST(CheckId) { + UNIT_ASSERT_VALUES_EQUAL(GetEntityIdAsString("ut", EEntityType::QUERY, TInstant::ParseIso8601("2021-12-04"), 666666), "utquhdn55pa7vv00kb1a"); + } } diff --git a/ydb/core/yq/libs/config/protos/audit.proto b/ydb/core/yq/libs/config/protos/audit.proto index 2c8311318c..9a6630766c 100644 --- a/ydb/core/yq/libs/config/protos/audit.proto +++ b/ydb/core/yq/libs/config/protos/audit.proto @@ -1,17 +1,17 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TAuditConfig { - message TUAConfig { - string Uri = 1; - string SharedSecretKey = 2; - } - - bool Enabled = 1; - TUAConfig UAConfig = 2; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TAuditConfig { + message TUAConfig { + string Uri = 1; + string SharedSecretKey = 2; + } + + bool Enabled = 1; + TUAConfig UAConfig = 2; +} diff --git a/ydb/core/yq/libs/config/protos/checkpoint_coordinator.proto b/ydb/core/yq/libs/config/protos/checkpoint_coordinator.proto index 954fb2a388..0964793ecf 100644 --- a/ydb/core/yq/libs/config/protos/checkpoint_coordinator.proto +++ b/ydb/core/yq/libs/config/protos/checkpoint_coordinator.proto @@ -1,27 +1,27 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + import "ydb/core/yq/libs/config/protos/storage.proto"; - -//////////////////////////////////////////////////////////// - -message TStateStorageLimitsConfig { - uint64 MaxGraphCheckpointsSizeBytes = 1; - uint64 MaxTaskStateSizeBytes = 2; -} - -message TCheckpointGcConfig { - bool Enabled = 1; -} - -message TCheckpointCoordinatorConfig { - bool Enabled = 1; - TYdbStorageConfig Storage = 2; - TCheckpointGcConfig CheckpointGarbageConfig = 3; - TStateStorageLimitsConfig StateStorageLimits = 4; - uint64 CheckpointingPeriodMillis = 5; - uint64 MaxInflight = 6; -} + +//////////////////////////////////////////////////////////// + +message TStateStorageLimitsConfig { + uint64 MaxGraphCheckpointsSizeBytes = 1; + uint64 MaxTaskStateSizeBytes = 2; +} + +message TCheckpointGcConfig { + bool Enabled = 1; +} + +message TCheckpointCoordinatorConfig { + bool Enabled = 1; + TYdbStorageConfig Storage = 2; + TCheckpointGcConfig CheckpointGarbageConfig = 3; + TStateStorageLimitsConfig StateStorageLimits = 4; + uint64 CheckpointingPeriodMillis = 5; + uint64 MaxInflight = 6; +} diff --git a/ydb/core/yq/libs/config/protos/common.proto b/ydb/core/yq/libs/config/protos/common.proto index e86548cf3c..75190b6612 100644 --- a/ydb/core/yq/libs/config/protos/common.proto +++ b/ydb/core/yq/libs/config/protos/common.proto @@ -1,24 +1,24 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TYdbDriverConfig { - uint64 NetworkThreadsNum = 1; // default: 2 - uint64 ClientThreadsNum = 2; // default: 0 that means adaptive thread pool - uint64 GrpcMemoryQuota = 3; // default: 0 (unlimited) -} - -message TCommonConfig { - TYdbDriverConfig YdbDriverConfig = 1; - string YdbMvpCloudEndpoint = 2; - string MdbGateway = 3; - bool UseBearerForYdb = 4; - bool MdbTransformHost = 5; - string ObjectStorageEndpoint = 6; - string IdsPrefix = 7; +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TYdbDriverConfig { + uint64 NetworkThreadsNum = 1; // default: 2 + uint64 ClientThreadsNum = 2; // default: 0 that means adaptive thread pool + uint64 GrpcMemoryQuota = 3; // default: 0 (unlimited) +} + +message TCommonConfig { + TYdbDriverConfig YdbDriverConfig = 1; + string YdbMvpCloudEndpoint = 2; + string MdbGateway = 3; + bool UseBearerForYdb = 4; + bool MdbTransformHost = 5; + string ObjectStorageEndpoint = 6; + string IdsPrefix = 7; uint64 MaxTasksPerOperation = 8; -} +} diff --git a/ydb/core/yq/libs/config/protos/control_plane_proxy.proto b/ydb/core/yq/libs/config/protos/control_plane_proxy.proto index 51f5d1f9f8..d4f904d45e 100644 --- a/ydb/core/yq/libs/config/protos/control_plane_proxy.proto +++ b/ydb/core/yq/libs/config/protos/control_plane_proxy.proto @@ -1,13 +1,13 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TControlPlaneProxyConfig { - bool Enabled = 1; - string RequestTimeout = 2; - bool EnablePermissions = 3; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TControlPlaneProxyConfig { + bool Enabled = 1; + string RequestTimeout = 2; + bool EnablePermissions = 3; +} diff --git a/ydb/core/yq/libs/config/protos/control_plane_storage.proto b/ydb/core/yq/libs/config/protos/control_plane_storage.proto index ebced909c5..e36a6af20e 100644 --- a/ydb/core/yq/libs/config/protos/control_plane_storage.proto +++ b/ydb/core/yq/libs/config/protos/control_plane_storage.proto @@ -1,36 +1,36 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + import "ydb/core/yq/libs/config/protos/storage.proto"; - -//////////////////////////////////////////////////////////// - -message TControlPlaneStorageConfig { - bool Enabled = 1; - NYq.NConfig.TYdbStorageConfig Storage = 2; // TODO: remove - string IdempotencyKeysTtl = 3; - uint64 MaxRequestSize = 4; - uint64 MaxCountQueries = 5; - uint64 MaxCountConnections = 6; - uint64 MaxCountBindings = 7; - uint64 MaxCountJobs = 8; - repeated string SuperUsers = 9; - bool EnableDebugMode = 10; - bool EnablePermissions = 11; - bool DisableCurrentIam = 12; - bool UseInMemory = 13; - uint64 TasksBatchSize = 14; - uint64 NumTasksProportion = 15; - uint64 AnalyticsRetryCounterLimit = 16; - uint64 StreamingRetryCounterLimit = 17; - string AnalyticsRetryCounterUpdateTime = 18; - string StreamingRetryCounterUpdateTime = 19; - string AutomaticQueriesTtl = 20; - string TaskLeaseTtl = 21; - repeated string AvailableConnection = 22; - repeated string AvailableBinding = 23; + +//////////////////////////////////////////////////////////// + +message TControlPlaneStorageConfig { + bool Enabled = 1; + NYq.NConfig.TYdbStorageConfig Storage = 2; // TODO: remove + string IdempotencyKeysTtl = 3; + uint64 MaxRequestSize = 4; + uint64 MaxCountQueries = 5; + uint64 MaxCountConnections = 6; + uint64 MaxCountBindings = 7; + uint64 MaxCountJobs = 8; + repeated string SuperUsers = 9; + bool EnableDebugMode = 10; + bool EnablePermissions = 11; + bool DisableCurrentIam = 12; + bool UseInMemory = 13; + uint64 TasksBatchSize = 14; + uint64 NumTasksProportion = 15; + uint64 AnalyticsRetryCounterLimit = 16; + uint64 StreamingRetryCounterLimit = 17; + string AnalyticsRetryCounterUpdateTime = 18; + string StreamingRetryCounterUpdateTime = 19; + string AutomaticQueriesTtl = 20; + string TaskLeaseTtl = 21; + repeated string AvailableConnection = 22; + repeated string AvailableBinding = 23; string ResultSetsTtl = 24; -} +} diff --git a/ydb/core/yq/libs/config/protos/db_pool.proto b/ydb/core/yq/libs/config/protos/db_pool.proto index eebae1cc8e..3a446f1fb5 100644 --- a/ydb/core/yq/libs/config/protos/db_pool.proto +++ b/ydb/core/yq/libs/config/protos/db_pool.proto @@ -1,15 +1,15 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + import "ydb/core/yq/libs/config/protos/storage.proto"; - -//////////////////////////////////////////////////////////// - -message TDbPoolConfig { - bool Enabled = 1; - TYdbStorageConfig Storage = 2; - uint32 MaxSessionCount = 3; -} + +//////////////////////////////////////////////////////////// + +message TDbPoolConfig { + bool Enabled = 1; + TYdbStorageConfig Storage = 2; + uint32 MaxSessionCount = 3; +} diff --git a/ydb/core/yq/libs/config/protos/gateways.proto b/ydb/core/yq/libs/config/protos/gateways.proto index b953143764..970bed919b 100644 --- a/ydb/core/yq/libs/config/protos/gateways.proto +++ b/ydb/core/yq/libs/config/protos/gateways.proto @@ -1,19 +1,19 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + import "ydb/library/yql/providers/common/proto/gateways_config.proto"; - -//////////////////////////////////////////////////////////// - -message TGatewaysConfig { - bool Enabled = 1; - NYql.TDqGatewayConfig Dq = 2; - NYql.TPqGatewayConfig Pq = 3; - NYql.TYdbGatewayConfig Ydb = 4; - NYql.TS3GatewayConfig S3 = 5; - NYql.TSolomonGatewayConfig Solomon = 6; + +//////////////////////////////////////////////////////////// + +message TGatewaysConfig { + bool Enabled = 1; + NYql.TDqGatewayConfig Dq = 2; + NYql.TPqGatewayConfig Pq = 3; + NYql.TYdbGatewayConfig Ydb = 4; + NYql.TS3GatewayConfig S3 = 5; + NYql.TSolomonGatewayConfig Solomon = 6; NYql.THttpGatewayConfig HttpGateway = 7; -} +} diff --git a/ydb/core/yq/libs/config/protos/issue_id.proto b/ydb/core/yq/libs/config/protos/issue_id.proto index e4090be506..7939613b5d 100644 --- a/ydb/core/yq/libs/config/protos/issue_id.proto +++ b/ydb/core/yq/libs/config/protos/issue_id.proto @@ -1,20 +1,20 @@ -syntax = "proto3"; - -package NYq; - -message TIssuesIds { - enum EIssueCode { - DEFAULT_ERROR = 0; - UNEXPECTED = 1; - INFO = 2; - WARNING = 3; - SUCCESS = 4; - - ACCESS_DENIED = 1000; - INTERNAL_ERROR = 1001; - TIMEOUT = 1002; - BAD_REQUEST = 1003; +syntax = "proto3"; + +package NYq; + +message TIssuesIds { + enum EIssueCode { + DEFAULT_ERROR = 0; + UNEXPECTED = 1; + INFO = 2; + WARNING = 3; + SUCCESS = 4; + + ACCESS_DENIED = 1000; + INTERNAL_ERROR = 1001; + TIMEOUT = 1002; + BAD_REQUEST = 1003; EXPIRED = 1004; UNSUPPORTED = 1005; - } + } } diff --git a/ydb/core/yq/libs/config/protos/nodes_manager.proto b/ydb/core/yq/libs/config/protos/nodes_manager.proto index 8daaff6bb4..c877899b17 100644 --- a/ydb/core/yq/libs/config/protos/nodes_manager.proto +++ b/ydb/core/yq/libs/config/protos/nodes_manager.proto @@ -1,11 +1,11 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TNodesManagerConfig { - bool Enabled = 1; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TNodesManagerConfig { + bool Enabled = 1; +} diff --git a/ydb/core/yq/libs/config/protos/pending_fetcher.proto b/ydb/core/yq/libs/config/protos/pending_fetcher.proto index 965c7a039f..637d68b427 100644 --- a/ydb/core/yq/libs/config/protos/pending_fetcher.proto +++ b/ydb/core/yq/libs/config/protos/pending_fetcher.proto @@ -1,11 +1,11 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TPendingFetcherConfig { - bool Enabled = 1; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TPendingFetcherConfig { + bool Enabled = 1; +} diff --git a/ydb/core/yq/libs/config/protos/pinger.proto b/ydb/core/yq/libs/config/protos/pinger.proto index f27cbfb991..f03951bc64 100644 --- a/ydb/core/yq/libs/config/protos/pinger.proto +++ b/ydb/core/yq/libs/config/protos/pinger.proto @@ -1,11 +1,11 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TPingerConfig { - string PingPeriod = 1; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TPingerConfig { + string PingPeriod = 1; +} diff --git a/ydb/core/yq/libs/config/protos/private_api.proto b/ydb/core/yq/libs/config/protos/private_api.proto index b40663d9a3..cf675e4af3 100644 --- a/ydb/core/yq/libs/config/protos/private_api.proto +++ b/ydb/core/yq/libs/config/protos/private_api.proto @@ -1,14 +1,14 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TPrivateApiConfig { - bool Enabled = 1; - string TaskServiceEndpoint = 2; - string TaskServiceDatabase = 3; - bool SecureTaskService = 4; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TPrivateApiConfig { + bool Enabled = 1; + string TaskServiceEndpoint = 2; + string TaskServiceDatabase = 3; + bool SecureTaskService = 4; +} diff --git a/ydb/core/yq/libs/config/protos/private_proxy.proto b/ydb/core/yq/libs/config/protos/private_proxy.proto index f26f937d12..407e3d6b39 100644 --- a/ydb/core/yq/libs/config/protos/private_proxy.proto +++ b/ydb/core/yq/libs/config/protos/private_proxy.proto @@ -1,11 +1,11 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TPrivateProxyConfig { - bool Enabled = 1; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TPrivateProxyConfig { + bool Enabled = 1; +} diff --git a/ydb/core/yq/libs/config/protos/resource_manager.proto b/ydb/core/yq/libs/config/protos/resource_manager.proto index b25ef580bd..4e5e8f7e68 100644 --- a/ydb/core/yq/libs/config/protos/resource_manager.proto +++ b/ydb/core/yq/libs/config/protos/resource_manager.proto @@ -1,14 +1,14 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TResourceManagerConfig { - bool Enabled = 1; - uint64 MkqlInitialMemoryLimit = 2; // per task, default: 8_GB - uint64 MkqlTotalMemoryLimit = 3; // per node, default: 0, means no limit management - uint64 MkqlAllocSize = 4; // min alloc/free, default 30_MB -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TResourceManagerConfig { + bool Enabled = 1; + uint64 MkqlInitialMemoryLimit = 2; // per task, default: 8_GB + uint64 MkqlTotalMemoryLimit = 3; // per node, default: 0, means no limit management + uint64 MkqlAllocSize = 4; // min alloc/free, default 30_MB +} diff --git a/ydb/core/yq/libs/config/protos/storage.proto b/ydb/core/yq/libs/config/protos/storage.proto index dd1f3fb8c5..e1a3c1b6a6 100644 --- a/ydb/core/yq/libs/config/protos/storage.proto +++ b/ydb/core/yq/libs/config/protos/storage.proto @@ -1,25 +1,25 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TYdbStorageConfig { - string Endpoint = 1; - string Database = 2; - string OAuthFile = 3; - string TablePrefix = 4; - string CertificateFile = 6; - string IamEndpoint = 7; - string SaKeyFile = 8; - bool UseLocalMetadataService = 9; - uint32 ClientTimeoutSec = 10; - uint32 OperationTimeoutSec = 11; - uint32 CancelAfterSec = 12; - bool UseSsl = 13; - - // alternative to OAuthFile to simplify tests - string Token = 5; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TYdbStorageConfig { + string Endpoint = 1; + string Database = 2; + string OAuthFile = 3; + string TablePrefix = 4; + string CertificateFile = 6; + string IamEndpoint = 7; + string SaKeyFile = 8; + bool UseLocalMetadataService = 9; + uint32 ClientTimeoutSec = 10; + uint32 OperationTimeoutSec = 11; + uint32 CancelAfterSec = 12; + bool UseSsl = 13; + + // alternative to OAuthFile to simplify tests + string Token = 5; +} diff --git a/ydb/core/yq/libs/config/protos/test_connection.proto b/ydb/core/yq/libs/config/protos/test_connection.proto index f13d131abf..feb9f81eb2 100644 --- a/ydb/core/yq/libs/config/protos/test_connection.proto +++ b/ydb/core/yq/libs/config/protos/test_connection.proto @@ -1,11 +1,11 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TTestConnectionConfig { - bool Enabled = 1; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TTestConnectionConfig { + bool Enabled = 1; +} diff --git a/ydb/core/yq/libs/config/protos/token_accessor.proto b/ydb/core/yq/libs/config/protos/token_accessor.proto index 6885b3381c..37bc8a1aae 100644 --- a/ydb/core/yq/libs/config/protos/token_accessor.proto +++ b/ydb/core/yq/libs/config/protos/token_accessor.proto @@ -1,14 +1,14 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - -//////////////////////////////////////////////////////////// - -message TTokenAccessorConfig { - bool Enabled = 1; - string Endpoint = 2; // GRPC endpoint of token accessor daemon - bool UseSsl = 3; // Whether to use SSL - string HmacSecretFile = 4; -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + +//////////////////////////////////////////////////////////// + +message TTokenAccessorConfig { + bool Enabled = 1; + string Endpoint = 2; // GRPC endpoint of token accessor daemon + bool UseSsl = 3; // Whether to use SSL + string HmacSecretFile = 4; +} diff --git a/ydb/core/yq/libs/config/protos/ya.make b/ydb/core/yq/libs/config/protos/ya.make index 72000d86fa..b0283ed225 100644 --- a/ydb/core/yq/libs/config/protos/ya.make +++ b/ydb/core/yq/libs/config/protos/ya.make @@ -1,35 +1,35 @@ OWNER(g:yq) - -PROTO_LIBRARY() - -SRCS( - audit.proto - checkpoint_coordinator.proto - common.proto - control_plane_proxy.proto - control_plane_storage.proto - db_pool.proto - gateways.proto - issue_id.proto - nodes_manager.proto - pending_fetcher.proto - pinger.proto - private_api.proto - private_proxy.proto + +PROTO_LIBRARY() + +SRCS( + audit.proto + checkpoint_coordinator.proto + common.proto + control_plane_proxy.proto + control_plane_storage.proto + db_pool.proto + gateways.proto + issue_id.proto + nodes_manager.proto + pending_fetcher.proto + pinger.proto + private_api.proto + private_proxy.proto read_actors_factory.proto - resource_manager.proto - storage.proto - test_connection.proto - token_accessor.proto - yq_config.proto -) - -PEERDIR( + resource_manager.proto + storage.proto + test_connection.proto + token_accessor.proto + yq_config.proto +) + +PEERDIR( ydb/library/folder_service/proto ydb/library/yql/providers/common/proto ydb/library/yql/providers/s3/proto -) - -EXCLUDE_TAGS(GO_PROTO) - -END() +) + +EXCLUDE_TAGS(GO_PROTO) + +END() diff --git a/ydb/core/yq/libs/config/protos/yq_config.proto b/ydb/core/yq/libs/config/protos/yq_config.proto index 841b816821..6993cccb32 100644 --- a/ydb/core/yq/libs/config/protos/yq_config.proto +++ b/ydb/core/yq/libs/config/protos/yq_config.proto @@ -1,9 +1,9 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package NYq.NConfig; -option java_package = "ru.yandex.kikimr.proto"; - +syntax = "proto3"; +option cc_enable_arenas = true; + +package NYq.NConfig; +option java_package = "ru.yandex.kikimr.proto"; + import "ydb/core/yq/libs/config/protos/audit.proto"; import "ydb/core/yq/libs/config/protos/checkpoint_coordinator.proto"; import "ydb/core/yq/libs/config/protos/common.proto"; @@ -18,30 +18,30 @@ import "ydb/core/yq/libs/config/protos/private_api.proto"; import "ydb/core/yq/libs/config/protos/private_proxy.proto"; import "ydb/core/yq/libs/config/protos/read_actors_factory.proto"; import "ydb/core/yq/libs/config/protos/resource_manager.proto"; -import "ydb/core/yq/libs/config/protos/test_connection.proto"; +import "ydb/core/yq/libs/config/protos/test_connection.proto"; import "ydb/core/yq/libs/config/protos/token_accessor.proto"; -import "ydb/library/folder_service/proto/config.proto"; - -//////////////////////////////////////////////////////////// - -message TConfig { - bool Enabled = 1; - TCommonConfig Common = 2; - TControlPlaneStorageConfig ControlPlaneStorage = 3; - TControlPlaneProxyConfig ControlPlaneProxy = 4; +import "ydb/library/folder_service/proto/config.proto"; + +//////////////////////////////////////////////////////////// + +message TConfig { + bool Enabled = 1; + TCommonConfig Common = 2; + TControlPlaneStorageConfig ControlPlaneStorage = 3; + TControlPlaneProxyConfig ControlPlaneProxy = 4; NKikimrProto.NFolderService.TFolderServiceConfig FolderService = 5; - TPrivateApiConfig PrivateApi = 6; - TTokenAccessorConfig TokenAccessor = 7; - TDbPoolConfig DbPool = 8; - TGatewaysConfig Gateways = 9; - TCheckpointCoordinatorConfig CheckpointCoordinator = 10; - TAuditConfig Audit = 11; - TResourceManagerConfig ResourceManager = 12; - TPrivateProxyConfig PrivateProxy = 13; - TNodesManagerConfig NodesManager = 14; - TPendingFetcherConfig PendingFetcher = 15; - TPingerConfig Pinger = 16; + TPrivateApiConfig PrivateApi = 6; + TTokenAccessorConfig TokenAccessor = 7; + TDbPoolConfig DbPool = 8; + TGatewaysConfig Gateways = 9; + TCheckpointCoordinatorConfig CheckpointCoordinator = 10; + TAuditConfig Audit = 11; + TResourceManagerConfig ResourceManager = 12; + TPrivateProxyConfig PrivateProxy = 13; + TNodesManagerConfig NodesManager = 14; + TPendingFetcherConfig PendingFetcher = 15; + TPingerConfig Pinger = 16; bool EnableDynamicNameservice = 17; - TTestConnectionConfig TestConnection = 18; + TTestConnectionConfig TestConnection = 18; TReadActorsFactoryConfig ReadActorsFactoryConfig = 19; -} +} diff --git a/ydb/core/yq/libs/config/ya.make b/ydb/core/yq/libs/config/ya.make index 09d253c134..5bd8fd32b8 100644 --- a/ydb/core/yq/libs/config/ya.make +++ b/ydb/core/yq/libs/config/ya.make @@ -1,18 +1,18 @@ OWNER(g:yq) - -LIBRARY() - -SRCS( - yq_issue.cpp -) - -PEERDIR( + +LIBRARY() + +SRCS( + yq_issue.cpp +) + +PEERDIR( ydb/core/yq/libs/config/protos ydb/library/yql/public/issue/protos -) - -END() - -RECURSE( - protos +) + +END() + +RECURSE( + protos ) diff --git a/ydb/core/yq/libs/config/yq_issue.cpp b/ydb/core/yq/libs/config/yq_issue.cpp index f66ab2eb0c..0232389b42 100644 --- a/ydb/core/yq/libs/config/yq_issue.cpp +++ b/ydb/core/yq/libs/config/yq_issue.cpp @@ -1,36 +1,36 @@ -#include "yq_issue.h" +#include "yq_issue.h" #include <ydb/library/yql/public/issue/protos/issue_severity.pb.h> #include <ydb/library/yql/public/issue/yql_issue_id.h> #include <ydb/library/yql/public/issue/yql_issue_message.h> - -namespace NYq { - -NYql::TIssue MakeFatalIssue(TIssuesIds::EIssueCode id, const TString& message) { - NYql::TIssue issue; - issue.SetCode(id, NYql::TSeverityIds::S_FATAL); - issue.Message = message; - return issue; -} - -NYql::TIssue MakeErrorIssue(TIssuesIds::EIssueCode id, const TString& message) { - NYql::TIssue issue; - issue.SetCode(id, NYql::TSeverityIds::S_ERROR); - issue.Message = message; - return issue; -} - -NYql::TIssue MakeWarningIssue(TIssuesIds::EIssueCode id, const TString& message) { - NYql::TIssue issue; - issue.SetCode(id, NYql::TSeverityIds::S_WARNING); - issue.Message = message; - return issue; -} - -NYql::TIssue MakeInfoIssue(TIssuesIds::EIssueCode id, const TString& message) { - NYql::TIssue issue; - issue.SetCode(id, NYql::TSeverityIds::S_INFO); - issue.Message = message; - return issue; -} - -} + +namespace NYq { + +NYql::TIssue MakeFatalIssue(TIssuesIds::EIssueCode id, const TString& message) { + NYql::TIssue issue; + issue.SetCode(id, NYql::TSeverityIds::S_FATAL); + issue.Message = message; + return issue; +} + +NYql::TIssue MakeErrorIssue(TIssuesIds::EIssueCode id, const TString& message) { + NYql::TIssue issue; + issue.SetCode(id, NYql::TSeverityIds::S_ERROR); + issue.Message = message; + return issue; +} + +NYql::TIssue MakeWarningIssue(TIssuesIds::EIssueCode id, const TString& message) { + NYql::TIssue issue; + issue.SetCode(id, NYql::TSeverityIds::S_WARNING); + issue.Message = message; + return issue; +} + +NYql::TIssue MakeInfoIssue(TIssuesIds::EIssueCode id, const TString& message) { + NYql::TIssue issue; + issue.SetCode(id, NYql::TSeverityIds::S_INFO); + issue.Message = message; + return issue; +} + +} diff --git a/ydb/core/yq/libs/config/yq_issue.h b/ydb/core/yq/libs/config/yq_issue.h index 68d4600ed7..87450cff14 100644 --- a/ydb/core/yq/libs/config/yq_issue.h +++ b/ydb/core/yq/libs/config/yq_issue.h @@ -1,17 +1,17 @@ -#pragma once - +#pragma once + #include <ydb/core/yq/libs/config/protos/issue_id.pb.h> - + #include <ydb/library/yql/public/issue/yql_issue.h> - -namespace NYq { - -NYql::TIssue MakeFatalIssue(TIssuesIds::EIssueCode id, const TString& message); - -NYql::TIssue MakeErrorIssue(TIssuesIds::EIssueCode id, const TString& message); - -NYql::TIssue MakeWarningIssue(TIssuesIds::EIssueCode id, const TString& message); - -NYql::TIssue MakeInfoIssue(TIssuesIds::EIssueCode id, const TString& message); - -} + +namespace NYq { + +NYql::TIssue MakeFatalIssue(TIssuesIds::EIssueCode id, const TString& message); + +NYql::TIssue MakeErrorIssue(TIssuesIds::EIssueCode id, const TString& message); + +NYql::TIssue MakeWarningIssue(TIssuesIds::EIssueCode id, const TString& message); + +NYql::TIssue MakeInfoIssue(TIssuesIds::EIssueCode id, const TString& message); + +} diff --git a/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.cpp b/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.cpp index 53838351b4..f81712897b 100644 --- a/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.cpp +++ b/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.cpp @@ -1,532 +1,532 @@ -#include "control_plane_proxy.h" -#include "probes.h" -#include "utils.h" - +#include "control_plane_proxy.h" +#include "probes.h" +#include "utils.h" + #include <ydb/core/yq/libs/actors/logging/log.h> #include <ydb/core/yq/libs/control_plane_storage/control_plane_storage.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> #include <ydb/core/yq/libs/control_plane_storage/util.h> -#include <ydb/core/yq/libs/test_connection/test_connection.h> -#include <ydb/core/yq/libs/test_connection/events/events.h> +#include <ydb/core/yq/libs/test_connection/test_connection.h> +#include <ydb/core/yq/libs/test_connection/events/events.h> #include <ydb/core/yq/libs/ydb/util.h> #include <ydb/core/yq/libs/ydb/ydb.h> - + #include <ydb/core/yq/libs/config/yq_issue.h> #include <ydb/core/yq/libs/control_plane_proxy/events/events.h> - -#include <library/cpp/actors/core/actor_bootstrapped.h> -#include <library/cpp/actors/core/actor.h> - + +#include <library/cpp/actors/core/actor_bootstrapped.h> +#include <library/cpp/actors/core/actor.h> + #include <ydb/core/base/kikimr_issue.h> #include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h> - + #include <ydb/library/yql/public/issue/yql_issue_message.h> - -#include <util/generic/maybe.h> -#include <util/generic/ptr.h> - + +#include <util/generic/maybe.h> +#include <util/generic/ptr.h> + #include <library/cpp/lwtrace/mon/mon_lwtrace.h> #include <ydb/library/security/util.h> - + #include <ydb/core/base/appdata.h> #include <ydb/core/mon/mon.h> -#include <library/cpp/monlib/service/pages/templates.h> - +#include <library/cpp/monlib/service/pages/templates.h> + #include <ydb/library/folder_service/folder_service.h> #include <ydb/library/folder_service/events.h> - - -namespace NYq { + + +namespace NYq { namespace { - -using namespace NActors; + +using namespace NActors; using namespace NYq::NConfig; -using namespace NKikimr; -using namespace NThreading; -using namespace NYdb; -using namespace NYdb::NTable; - -LWTRACE_USING(YQ_CONTROL_PLANE_PROXY_PROVIDER); - +using namespace NKikimr; +using namespace NThreading; +using namespace NYdb; +using namespace NYdb::NTable; + +LWTRACE_USING(YQ_CONTROL_PLANE_PROXY_PROVIDER); + struct TRequestCounters: public virtual TThrRefBase { - const TString Name; - - NMonitoring::TDynamicCounters::TCounterPtr InFly; - NMonitoring::TDynamicCounters::TCounterPtr Ok; - NMonitoring::TDynamicCounters::TCounterPtr Error; - NMonitoring::TDynamicCounters::TCounterPtr Timeout; - NMonitoring::THistogramPtr LatencyMs; - - explicit TRequestCounters(const TString& name) - : Name(name) - { } - - void Register(const NMonitoring::TDynamicCounterPtr& counters) { - NMonitoring::TDynamicCounterPtr subgroup = counters->GetSubgroup("request", Name); - InFly = subgroup->GetCounter("InFly", false); - Ok = subgroup->GetCounter("Ok", true); - Error = subgroup->GetCounter("Error", true); - Timeout = subgroup->GetCounter("Timeout", true); - LatencyMs = subgroup->GetHistogram("LatencyMs", GetLatencyHistogramBuckets()); - } - -private: - static NMonitoring::IHistogramCollectorPtr GetLatencyHistogramBuckets() { - return NMonitoring::ExplicitHistogram({0, 1, 2, 5, 10, 20, 50, 100, 500, 1000, 2000, 5000, 10000, 30000, 50000, 500000}); - } -}; - -using TRequestCountersPtr = TIntrusivePtr<TRequestCounters>; - -template<class TRequestProto, class TRequest, class TResponse, class TResponseProxy, bool ResolveFolder = false> -class TRequestActor : public NActors::TActorBootstrapped<TRequestActor<TRequestProto, TRequest, TResponse, TResponseProxy, ResolveFolder>> { - using TBase = NActors::TActorBootstrapped<TRequestActor<TRequestProto, TRequest, TResponse, TResponseProxy, ResolveFolder>>; - using TBase::SelfId; - using TBase::Send; - using TBase::PassAway; - using TBase::Become; - - NConfig::TControlPlaneProxyConfig Config; - TRequestProto RequestProto; - TString Scope; - TString FolderId; - TString User; - TString Token; - TActorId Sender; - ui32 Cookie; - TActorId ServiceId; - TRequestCountersPtr Counters; - TInstant StartTime; - std::function<void(const TDuration&, bool, bool)> Probe; - TPermissions Permissions; - TRequestCountersPtr ResolveFolderCounters; - TString CloudId; - -public: + const TString Name; + + NMonitoring::TDynamicCounters::TCounterPtr InFly; + NMonitoring::TDynamicCounters::TCounterPtr Ok; + NMonitoring::TDynamicCounters::TCounterPtr Error; + NMonitoring::TDynamicCounters::TCounterPtr Timeout; + NMonitoring::THistogramPtr LatencyMs; + + explicit TRequestCounters(const TString& name) + : Name(name) + { } + + void Register(const NMonitoring::TDynamicCounterPtr& counters) { + NMonitoring::TDynamicCounterPtr subgroup = counters->GetSubgroup("request", Name); + InFly = subgroup->GetCounter("InFly", false); + Ok = subgroup->GetCounter("Ok", true); + Error = subgroup->GetCounter("Error", true); + Timeout = subgroup->GetCounter("Timeout", true); + LatencyMs = subgroup->GetHistogram("LatencyMs", GetLatencyHistogramBuckets()); + } + +private: + static NMonitoring::IHistogramCollectorPtr GetLatencyHistogramBuckets() { + return NMonitoring::ExplicitHistogram({0, 1, 2, 5, 10, 20, 50, 100, 500, 1000, 2000, 5000, 10000, 30000, 50000, 500000}); + } +}; + +using TRequestCountersPtr = TIntrusivePtr<TRequestCounters>; + +template<class TRequestProto, class TRequest, class TResponse, class TResponseProxy, bool ResolveFolder = false> +class TRequestActor : public NActors::TActorBootstrapped<TRequestActor<TRequestProto, TRequest, TResponse, TResponseProxy, ResolveFolder>> { + using TBase = NActors::TActorBootstrapped<TRequestActor<TRequestProto, TRequest, TResponse, TResponseProxy, ResolveFolder>>; + using TBase::SelfId; + using TBase::Send; + using TBase::PassAway; + using TBase::Become; + + NConfig::TControlPlaneProxyConfig Config; + TRequestProto RequestProto; + TString Scope; + TString FolderId; + TString User; + TString Token; + TActorId Sender; + ui32 Cookie; + TActorId ServiceId; + TRequestCountersPtr Counters; + TInstant StartTime; + std::function<void(const TDuration&, bool, bool)> Probe; + TPermissions Permissions; + TRequestCountersPtr ResolveFolderCounters; + TString CloudId; + +public: static constexpr char ActorName[] = "YQ_CONTROL_PLANE_PROXY_REQUEST_ACTOR"; - explicit TRequestActor(const NConfig::TControlPlaneProxyConfig& config, - TActorId sender, ui32 cookie, - const TString& scope, const TString& folderId, TRequestProto&& requestProto, - TString&& user, TString&& token, const TActorId& serviceId, - const TRequestCountersPtr& counters, - const std::function<void(const TDuration&, bool, bool)>& probe, - TPermissions permissions, - const TRequestCountersPtr& resolveFolderCounters = nullptr) - : 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) - , ResolveFolderCounters(resolveFolderCounters) - { - Counters->InFly->Inc(); - FillDefaultParameters(Config); - } - -public: - - void Bootstrap() { - CPP_LOG_T("Request actor. Actor id: " << SelfId()); - Become(&TRequestActor::StateFunc, GetDuration(Config.GetRequestTimeout(), TDuration::Seconds(30)), new NActors::TEvents::TEvWakeup()); - if constexpr (ResolveFolder) { + explicit TRequestActor(const NConfig::TControlPlaneProxyConfig& config, + TActorId sender, ui32 cookie, + const TString& scope, const TString& folderId, TRequestProto&& requestProto, + TString&& user, TString&& token, const TActorId& serviceId, + const TRequestCountersPtr& counters, + const std::function<void(const TDuration&, bool, bool)>& probe, + TPermissions permissions, + const TRequestCountersPtr& resolveFolderCounters = nullptr) + : 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) + , ResolveFolderCounters(resolveFolderCounters) + { + Counters->InFly->Inc(); + FillDefaultParameters(Config); + } + +public: + + void Bootstrap() { + CPP_LOG_T("Request actor. Actor id: " << SelfId()); + Become(&TRequestActor::StateFunc, GetDuration(Config.GetRequestTimeout(), TDuration::Seconds(30)), new NActors::TEvents::TEvWakeup()); + if constexpr (ResolveFolder) { auto request = std::make_unique<NKikimr::NFolderService::TEvFolderService::TEvGetFolderRequest>(); request->Request.set_folder_id(FolderId); request->Token = Token; - ResolveFolderCounters->InFly->Inc(); + ResolveFolderCounters->InFly->Inc(); Send(NKikimr::NFolderService::FolderServiceActorId(), request.release(), 0, 0); - } else { - Send(ServiceId, new TRequest(Scope, RequestProto, User, Token, Permissions), 0, Cookie); - } - } - - STRICT_STFUNC(StateFunc, - cFunc(NActors::TEvents::TSystem::Wakeup, HandleTimeout); - hFunc(TResponse, Handle); + } else { + Send(ServiceId, new TRequest(Scope, RequestProto, User, Token, Permissions), 0, Cookie); + } + } + + STRICT_STFUNC(StateFunc, + cFunc(NActors::TEvents::TSystem::Wakeup, HandleTimeout); + hFunc(TResponse, Handle); hFunc(NKikimr::NFolderService::TEvFolderService::TEvGetFolderResponse, Handle); - ) - - void HandleTimeout() { - CPP_LOG_D("Request timeout. " << RequestProto.DebugString()); - NYql::TIssues issues; - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::TIMEOUT, "Request timeout. Try repeating the request later"); - issues.AddIssue(issue); - if (ResolveFolder && !CloudId) { - ResolveFolderCounters->Error->Inc(); - ResolveFolderCounters->Timeout->Inc(); - } - Counters->Error->Inc(); - Counters->Timeout->Inc(); - const TDuration delta = TInstant::Now() - StartTime; - Probe(delta, false, true); - Send(Sender, new TResponseProxy(issues), 0, Cookie); - PassAway(); - } - + ) + + void HandleTimeout() { + CPP_LOG_D("Request timeout. " << RequestProto.DebugString()); + NYql::TIssues issues; + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::TIMEOUT, "Request timeout. Try repeating the request later"); + issues.AddIssue(issue); + if (ResolveFolder && !CloudId) { + ResolveFolderCounters->Error->Inc(); + ResolveFolderCounters->Timeout->Inc(); + } + Counters->Error->Inc(); + Counters->Timeout->Inc(); + const TDuration delta = TInstant::Now() - StartTime; + Probe(delta, false, true); + Send(Sender, new TResponseProxy(issues), 0, Cookie); + PassAway(); + } + void Handle(NKikimr::NFolderService::TEvFolderService::TEvGetFolderResponse::TPtr& ev) { - ResolveFolderCounters->InFly->Dec(); - ResolveFolderCounters->LatencyMs->Collect((TInstant::Now() - StartTime).MilliSeconds()); - + ResolveFolderCounters->InFly->Dec(); + ResolveFolderCounters->LatencyMs->Collect((TInstant::Now() - StartTime).MilliSeconds()); + const auto& response = ev->Get()->Response; TString errorMessage; - + const auto& status = ev->Get()->Status; if (!status.Ok() || !ev->Get()->Response.has_folder()) { - ResolveFolderCounters->Error->Inc(); + ResolveFolderCounters->Error->Inc(); errorMessage = "Msg: " + status.Msg + " Details: " + status.Details + " Code: " + ToString(status.GRpcStatusCode) + " InternalError: " + ToString(status.InternalError); CPP_LOG_E(errorMessage); - NYql::TIssues issues; + NYql::TIssues issues; NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, "Resolve folder error"); - issues.AddIssue(issue); - Counters->Error->Inc(); - Counters->Timeout->Inc(); - const TDuration delta = TInstant::Now() - StartTime; - Probe(delta, false, false); - Send(Sender, new TResponseProxy(issues), 0, Cookie); - PassAway(); - return; - } - - ResolveFolderCounters->Ok->Inc(); + issues.AddIssue(issue); + Counters->Error->Inc(); + Counters->Timeout->Inc(); + const TDuration delta = TInstant::Now() - StartTime; + Probe(delta, false, false); + Send(Sender, new TResponseProxy(issues), 0, Cookie); + PassAway(); + return; + } + + ResolveFolderCounters->Ok->Inc(); CloudId = response.folder().cloud_id(); - CPP_LOG_T("Cloud id: " << CloudId << " Folder id: " << FolderId); - if constexpr (ResolveFolder) { - Send(ServiceId, new TRequest(Scope, RequestProto, User, Token, CloudId, Permissions), 0, Cookie); - } - } - - void Handle(typename TResponse::TPtr& ev) { - const TDuration delta = TInstant::Now() - StartTime; - auto& response = *ev->Get(); - ProcessResponse(delta, response); - } - - template<typename T> - void ProcessResponse(const TDuration& delta, const T& response) { - if (response.Issues) { - Counters->Error->Inc(); - Probe(delta, false, false); - Send(Sender, new TResponseProxy(response.Issues), 0, Cookie); - } else { - Counters->Ok->Inc(); - Probe(delta, true, false); - Send(Sender, new TResponseProxy(response.Result), 0, Cookie); - } - PassAway(); - } - - template<typename T> requires requires (T t) { t.AuditDetails; } - void ProcessResponse(const TDuration& delta, const T& response) { - if (response.Issues) { - Counters->Error->Inc(); - Probe(delta, false, false); - Send(Sender, new TResponseProxy(response.Issues), 0, Cookie); - } else { - Counters->Ok->Inc(); - Probe(delta, true, false); - Send(Sender, new TResponseProxy(response.Result, response.AuditDetails), 0, Cookie); - } - PassAway(); - } - - virtual ~TRequestActor() { - Counters->InFly->Dec(); - Counters->LatencyMs->Collect((TInstant::Now() - StartTime).MilliSeconds()); - } - - TDuration GetDuration(const TString& value, const TDuration& defaultValue) - { - TDuration result = defaultValue; - TDuration::TryParse(value, result); - return result; - } - - void FillDefaultParameters(NConfig::TControlPlaneProxyConfig& config) - { - if (!config.GetRequestTimeout()) { - config.SetRequestTimeout("30s"); - } - } -}; - -class TControlPlaneProxyActor : public NActors::TActorBootstrapped<TControlPlaneProxyActor> { - enum ERequestType { - RT_CREATE_QUERY, - RT_LIST_QUERIES, - RT_DESCRIBE_QUERY, + CPP_LOG_T("Cloud id: " << CloudId << " Folder id: " << FolderId); + if constexpr (ResolveFolder) { + Send(ServiceId, new TRequest(Scope, RequestProto, User, Token, CloudId, Permissions), 0, Cookie); + } + } + + void Handle(typename TResponse::TPtr& ev) { + const TDuration delta = TInstant::Now() - StartTime; + auto& response = *ev->Get(); + ProcessResponse(delta, response); + } + + template<typename T> + void ProcessResponse(const TDuration& delta, const T& response) { + if (response.Issues) { + Counters->Error->Inc(); + Probe(delta, false, false); + Send(Sender, new TResponseProxy(response.Issues), 0, Cookie); + } else { + Counters->Ok->Inc(); + Probe(delta, true, false); + Send(Sender, new TResponseProxy(response.Result), 0, Cookie); + } + PassAway(); + } + + template<typename T> requires requires (T t) { t.AuditDetails; } + void ProcessResponse(const TDuration& delta, const T& response) { + if (response.Issues) { + Counters->Error->Inc(); + Probe(delta, false, false); + Send(Sender, new TResponseProxy(response.Issues), 0, Cookie); + } else { + Counters->Ok->Inc(); + Probe(delta, true, false); + Send(Sender, new TResponseProxy(response.Result, response.AuditDetails), 0, Cookie); + } + PassAway(); + } + + virtual ~TRequestActor() { + Counters->InFly->Dec(); + Counters->LatencyMs->Collect((TInstant::Now() - StartTime).MilliSeconds()); + } + + TDuration GetDuration(const TString& value, const TDuration& defaultValue) + { + TDuration result = defaultValue; + TDuration::TryParse(value, result); + return result; + } + + void FillDefaultParameters(NConfig::TControlPlaneProxyConfig& config) + { + if (!config.GetRequestTimeout()) { + config.SetRequestTimeout("30s"); + } + } +}; + +class TControlPlaneProxyActor : public NActors::TActorBootstrapped<TControlPlaneProxyActor> { + enum ERequestType { + RT_CREATE_QUERY, + RT_LIST_QUERIES, + RT_DESCRIBE_QUERY, RT_GET_QUERY_STATUS, - RT_MODIFY_QUERY, - RT_DELETE_QUERY, - RT_CONTROL_QUERY, - RT_GET_RESULT_DATA, - RT_LIST_JOBS, + RT_MODIFY_QUERY, + RT_DELETE_QUERY, + RT_CONTROL_QUERY, + RT_GET_RESULT_DATA, + RT_LIST_JOBS, RT_DESCRIBE_JOB, - RT_CREATE_CONNECTION, - RT_LIST_CONNECTIONS, - RT_DESCRIBE_CONNECTION, - RT_MODIFY_CONNECTION, - RT_DELETE_CONNECTION, - RT_TEST_CONNECTION, - RT_CREATE_BINDING, - RT_LIST_BINDINGS, - RT_DESCRIBE_BINDING, - RT_MODIFY_BINDING, - RT_DELETE_BINDING, - RT_RESOLVE_FOLDER, - RT_MAX, - }; - - struct TCounters: public virtual TThrRefBase { - std::array<TRequestCountersPtr, RT_MAX> Requests = CreateArray<RT_MAX, TRequestCountersPtr>({ - { MakeIntrusive<TRequestCounters>("CreateQuery") }, - { MakeIntrusive<TRequestCounters>("ListQueries") }, - { MakeIntrusive<TRequestCounters>("DescribeQuery") }, + RT_CREATE_CONNECTION, + RT_LIST_CONNECTIONS, + RT_DESCRIBE_CONNECTION, + RT_MODIFY_CONNECTION, + RT_DELETE_CONNECTION, + RT_TEST_CONNECTION, + RT_CREATE_BINDING, + RT_LIST_BINDINGS, + RT_DESCRIBE_BINDING, + RT_MODIFY_BINDING, + RT_DELETE_BINDING, + RT_RESOLVE_FOLDER, + RT_MAX, + }; + + struct TCounters: public virtual TThrRefBase { + std::array<TRequestCountersPtr, RT_MAX> Requests = CreateArray<RT_MAX, TRequestCountersPtr>({ + { MakeIntrusive<TRequestCounters>("CreateQuery") }, + { MakeIntrusive<TRequestCounters>("ListQueries") }, + { MakeIntrusive<TRequestCounters>("DescribeQuery") }, { MakeIntrusive<TRequestCounters>("GetQueryStatus") }, - { MakeIntrusive<TRequestCounters>("ModifyQuery") }, - { MakeIntrusive<TRequestCounters>("DeleteQuery") }, - { MakeIntrusive<TRequestCounters>("ControlQuery") }, - { MakeIntrusive<TRequestCounters>("GetResultData") }, - { MakeIntrusive<TRequestCounters>("ListJobs") }, + { MakeIntrusive<TRequestCounters>("ModifyQuery") }, + { MakeIntrusive<TRequestCounters>("DeleteQuery") }, + { MakeIntrusive<TRequestCounters>("ControlQuery") }, + { MakeIntrusive<TRequestCounters>("GetResultData") }, + { MakeIntrusive<TRequestCounters>("ListJobs") }, { MakeIntrusive<TRequestCounters>("DescribeJob") }, - { MakeIntrusive<TRequestCounters>("CreateConnection") }, - { MakeIntrusive<TRequestCounters>("ListConnections") }, - { MakeIntrusive<TRequestCounters>("DescribeConnection") }, - { MakeIntrusive<TRequestCounters>("ModifyConnection") }, - { MakeIntrusive<TRequestCounters>("DeleteConnection") }, - { MakeIntrusive<TRequestCounters>("TestConnection") }, - { MakeIntrusive<TRequestCounters>("CreateBinding") }, - { MakeIntrusive<TRequestCounters>("ListBindings") }, - { MakeIntrusive<TRequestCounters>("DescribeBinding") }, - { MakeIntrusive<TRequestCounters>("ModifyBinding") }, - { MakeIntrusive<TRequestCounters>("DeleteBinding") }, - { MakeIntrusive<TRequestCounters>("ResolveFolder") }, - }); - - NMonitoring::TDynamicCounterPtr Counters; - - explicit TCounters(const NMonitoring::TDynamicCounterPtr& counters) - : Counters(counters) - { - for (auto& request: Requests) { - request->Register(Counters); + { MakeIntrusive<TRequestCounters>("CreateConnection") }, + { MakeIntrusive<TRequestCounters>("ListConnections") }, + { MakeIntrusive<TRequestCounters>("DescribeConnection") }, + { MakeIntrusive<TRequestCounters>("ModifyConnection") }, + { MakeIntrusive<TRequestCounters>("DeleteConnection") }, + { MakeIntrusive<TRequestCounters>("TestConnection") }, + { MakeIntrusive<TRequestCounters>("CreateBinding") }, + { MakeIntrusive<TRequestCounters>("ListBindings") }, + { MakeIntrusive<TRequestCounters>("DescribeBinding") }, + { MakeIntrusive<TRequestCounters>("ModifyBinding") }, + { MakeIntrusive<TRequestCounters>("DeleteBinding") }, + { MakeIntrusive<TRequestCounters>("ResolveFolder") }, + }); + + NMonitoring::TDynamicCounterPtr Counters; + + explicit TCounters(const NMonitoring::TDynamicCounterPtr& counters) + : Counters(counters) + { + for (auto& request: Requests) { + request->Register(Counters); } - } - }; - - TCounters Counters; - NConfig::TControlPlaneProxyConfig Config; - -public: - TControlPlaneProxyActor(const NConfig::TControlPlaneProxyConfig& config, const NMonitoring::TDynamicCounterPtr& counters) - : Counters(counters) - , Config(config) - { - } - + } + }; + + TCounters Counters; + NConfig::TControlPlaneProxyConfig Config; + +public: + TControlPlaneProxyActor(const NConfig::TControlPlaneProxyConfig& config, const NMonitoring::TDynamicCounterPtr& counters) + : Counters(counters) + , Config(config) + { + } + static constexpr char ActorName[] = "YQ_CONTROL_PLANE_PROXY"; - - void Bootstrap() { - CPP_LOG_D("Starting yandex query control plane proxy. Actor id: " << SelfId()); - - NLwTraceMonPage::ProbeRegistry().AddProbesList(LWTRACE_GET_PROBES(YQ_CONTROL_PLANE_PROXY_PROVIDER)); - - NActors::TMon* mon = AppData()->Mon; - if (mon) { - NMonitoring::TIndexMonPage* actorsMonPage = mon->RegisterIndexPage("actors", "Actors"); - mon->RegisterActorPage(actorsMonPage, "yq_control_plane_proxy", "YQ Control Plane Proxy", false, - TlsActivationContext->ExecutorThread.ActorSystem, SelfId()); - } - - Become(&TControlPlaneProxyActor::StateFunc); - } - -private: - STRICT_STFUNC(StateFunc, - hFunc(TEvControlPlaneProxy::TEvCreateQueryRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvListQueriesRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvDescribeQueryRequest, Handle); + + void Bootstrap() { + CPP_LOG_D("Starting yandex query control plane proxy. Actor id: " << SelfId()); + + NLwTraceMonPage::ProbeRegistry().AddProbesList(LWTRACE_GET_PROBES(YQ_CONTROL_PLANE_PROXY_PROVIDER)); + + NActors::TMon* mon = AppData()->Mon; + if (mon) { + NMonitoring::TIndexMonPage* actorsMonPage = mon->RegisterIndexPage("actors", "Actors"); + mon->RegisterActorPage(actorsMonPage, "yq_control_plane_proxy", "YQ Control Plane Proxy", false, + TlsActivationContext->ExecutorThread.ActorSystem, SelfId()); + } + + Become(&TControlPlaneProxyActor::StateFunc); + } + +private: + STRICT_STFUNC(StateFunc, + hFunc(TEvControlPlaneProxy::TEvCreateQueryRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvListQueriesRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvDescribeQueryRequest, Handle); hFunc(TEvControlPlaneProxy::TEvGetQueryStatusRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvModifyQueryRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvDeleteQueryRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvControlQueryRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvGetResultDataRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvListJobsRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvModifyQueryRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvDeleteQueryRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvControlQueryRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvGetResultDataRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvListJobsRequest, Handle); hFunc(TEvControlPlaneProxy::TEvDescribeJobRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvCreateConnectionRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvListConnectionsRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvDescribeConnectionRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvModifyConnectionRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvDeleteConnectionRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvTestConnectionRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvCreateBindingRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvListBindingsRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvDescribeBindingRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvModifyBindingRequest, Handle); - hFunc(TEvControlPlaneProxy::TEvDeleteBindingRequest, Handle); - 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.connections.use@as", TPermissions::CONNECTIONS_USE}, - {"yq.bindings.use@as", TPermissions::BINDINGS_USE}, - {"yq.queries.invoke@as", TPermissions::QUERY_INVOKE}, - }; - - template<typename T> - TPermissions ExtractPermissions(T& ev) { - TPermissions permissions; - for (const auto& permission: ev->Get()->Permissions) { - if (auto it = PermissionsItems.find(permission); it != PermissionsItems.end()) { - permissions.Set(it->second); - } - } - return permissions; - } - - template<typename T> - NYql::TIssues ValidatePermissions(T& ev, const TVector<TString>& requiredPermissions) { - NYql::TIssues issues; - if (!Config.GetEnablePermissions()) { - return issues; - } - - 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)); - } - } - - return issues; - } - - void Handle(TEvControlPlaneProxy::TEvCreateQueryRequest::TPtr& ev) { + hFunc(TEvControlPlaneProxy::TEvCreateConnectionRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvListConnectionsRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvDescribeConnectionRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvModifyConnectionRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvDeleteConnectionRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvTestConnectionRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvCreateBindingRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvListBindingsRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvDescribeBindingRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvModifyBindingRequest, Handle); + hFunc(TEvControlPlaneProxy::TEvDeleteBindingRequest, Handle); + 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.connections.use@as", TPermissions::CONNECTIONS_USE}, + {"yq.bindings.use@as", TPermissions::BINDINGS_USE}, + {"yq.queries.invoke@as", TPermissions::QUERY_INVOKE}, + }; + + template<typename T> + TPermissions ExtractPermissions(T& ev) { + TPermissions permissions; + for (const auto& permission: ev->Get()->Permissions) { + if (auto it = PermissionsItems.find(permission); it != PermissionsItems.end()) { + permissions.Set(it->second); + } + } + return permissions; + } + + template<typename T> + NYql::TIssues ValidatePermissions(T& ev, const TVector<TString>& requiredPermissions) { + NYql::TIssues issues; + if (!Config.GetEnablePermissions()) { + return issues; + } + + 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)); + } + } + + return issues; + } + + void Handle(TEvControlPlaneProxy::TEvCreateQueryRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::CreateQueryRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("CreateQueryRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_QUERY]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(CreateQueryRequest, scope, user, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.create@as"}); - if (issues) { - CPS_LOG_E("CreateQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvCreateQueryResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::CreateQueryRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("CreateQueryRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_QUERY]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(CreateQueryRequest, scope, user, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.create@as"}); + if (issues) { + CPS_LOG_E("CreateQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvCreateQueryResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::CreateQueryRequest, - TEvControlPlaneStorage::TEvCreateQueryRequest, - TEvControlPlaneStorage::TEvCreateQueryResponse, - TEvControlPlaneProxy::TEvCreateQueryResponse, - true>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER])); - } - - void Handle(TEvControlPlaneProxy::TEvListQueriesRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::CreateQueryRequest, + TEvControlPlaneStorage::TEvCreateQueryRequest, + TEvControlPlaneStorage::TEvCreateQueryResponse, + TEvControlPlaneProxy::TEvCreateQueryResponse, + true>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER])); + } + + void Handle(TEvControlPlaneProxy::TEvListQueriesRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ListQueriesRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ListQueriesRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_QUERIES]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ListQueriesRequest, scope, user, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.get@as"}); - if (issues) { - CPS_LOG_E("ListQueriesRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvListQueriesResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ListQueriesRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ListQueriesRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_QUERIES]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ListQueriesRequest, scope, user, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.get@as"}); + if (issues) { + CPS_LOG_E("ListQueriesRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvListQueriesResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ListQueriesRequest, - TEvControlPlaneStorage::TEvListQueriesRequest, - TEvControlPlaneStorage::TEvListQueriesResponse, - TEvControlPlaneProxy::TEvListQueriesResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvDescribeQueryRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ListQueriesRequest, + TEvControlPlaneStorage::TEvListQueriesRequest, + TEvControlPlaneStorage::TEvListQueriesResponse, + TEvControlPlaneProxy::TEvListQueriesResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvDescribeQueryRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::DescribeQueryRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("DescribeQueryRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_QUERY]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString queryId = request.query_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(DescribeQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.get@as"}); - if (issues) { - CPS_LOG_E("DescribeQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvDescribeQueryResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::DescribeQueryRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("DescribeQueryRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_QUERY]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString queryId = request.query_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(DescribeQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.get@as"}); + if (issues) { + CPS_LOG_E("DescribeQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvDescribeQueryResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::DescribeQueryRequest, - TEvControlPlaneStorage::TEvDescribeQueryRequest, - TEvControlPlaneStorage::TEvDescribeQueryResponse, - TEvControlPlaneProxy::TEvDescribeQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::DescribeQueryRequest, + TEvControlPlaneStorage::TEvDescribeQueryRequest, + TEvControlPlaneStorage::TEvDescribeQueryResponse, + TEvControlPlaneProxy::TEvDescribeQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + void Handle(TEvControlPlaneProxy::TEvGetQueryStatusRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); YandexQuery::GetQueryStatusRequest request = std::move(ev->Get()->Request); @@ -566,208 +566,208 @@ private: ExtractPermissions(ev))); } - void Handle(TEvControlPlaneProxy::TEvModifyQueryRequest::TPtr& ev) { + void Handle(TEvControlPlaneProxy::TEvModifyQueryRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ModifyQueryRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ModifyQueryRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_QUERY]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString queryId = request.query_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ModifyQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.update@as"}); - if (issues) { - CPS_LOG_E("ModifyQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvModifyQueryResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ModifyQueryRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ModifyQueryRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_QUERY]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString queryId = request.query_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ModifyQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.update@as"}); + if (issues) { + CPS_LOG_E("ModifyQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvModifyQueryResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ModifyQueryRequest, - TEvControlPlaneStorage::TEvModifyQueryRequest, - TEvControlPlaneStorage::TEvModifyQueryResponse, - TEvControlPlaneProxy::TEvModifyQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvDeleteQueryRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ModifyQueryRequest, + TEvControlPlaneStorage::TEvModifyQueryRequest, + TEvControlPlaneStorage::TEvModifyQueryResponse, + TEvControlPlaneProxy::TEvModifyQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvDeleteQueryRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::DeleteQueryRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("DeleteQueryRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_QUERY]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString queryId = request.query_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(DeleteQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.delete@as"}); - if (issues) { - CPS_LOG_E("DeleteQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvDeleteQueryResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::DeleteQueryRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("DeleteQueryRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_QUERY]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString queryId = request.query_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(DeleteQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.delete@as"}); + if (issues) { + CPS_LOG_E("DeleteQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvDeleteQueryResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::DeleteQueryRequest, - TEvControlPlaneStorage::TEvDeleteQueryRequest, - TEvControlPlaneStorage::TEvDeleteQueryResponse, - TEvControlPlaneProxy::TEvDeleteQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvControlQueryRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::DeleteQueryRequest, + TEvControlPlaneStorage::TEvDeleteQueryRequest, + TEvControlPlaneStorage::TEvDeleteQueryResponse, + TEvControlPlaneProxy::TEvDeleteQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvControlQueryRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ControlQueryRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ControlQueryRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CONTROL_QUERY]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString queryId = request.query_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ControlQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.control@as"}); - if (issues) { - CPS_LOG_E("ControlQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvControlQueryResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ControlQueryRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ControlQueryRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CONTROL_QUERY]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString queryId = request.query_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ControlQueryRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.control@as"}); + if (issues) { + CPS_LOG_E("ControlQueryRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvControlQueryResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ControlQueryRequest, - TEvControlPlaneStorage::TEvControlQueryRequest, - TEvControlPlaneStorage::TEvControlQueryResponse, - TEvControlPlaneProxy::TEvControlQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvGetResultDataRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ControlQueryRequest, + TEvControlPlaneStorage::TEvControlQueryRequest, + TEvControlPlaneStorage::TEvControlQueryResponse, + TEvControlPlaneProxy::TEvControlQueryResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvGetResultDataRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::GetResultDataRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("GetResultDataRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_GET_RESULT_DATA]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString queryId = request.query_id(); - const int32_t resultSetIndex = request.result_set_index(); - const int64_t limit = request.limit(); - const int64_t offset = request.offset(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(GetResultDataRequest, scope, user, queryId, resultSetIndex, offset, limit, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.getData@as"}); - if (issues) { - CPS_LOG_E("GetResultDataRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvGetResultDataResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::GetResultDataRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("GetResultDataRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_GET_RESULT_DATA]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString queryId = request.query_id(); + const int32_t resultSetIndex = request.result_set_index(); + const int64_t limit = request.limit(); + const int64_t offset = request.offset(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(GetResultDataRequest, scope, user, queryId, resultSetIndex, offset, limit, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.queries.getData@as"}); + if (issues) { + CPS_LOG_E("GetResultDataRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvGetResultDataResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::GetResultDataRequest, - TEvControlPlaneStorage::TEvGetResultDataRequest, - TEvControlPlaneStorage::TEvGetResultDataResponse, - TEvControlPlaneProxy::TEvGetResultDataResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvListJobsRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::GetResultDataRequest, + TEvControlPlaneStorage::TEvGetResultDataRequest, + TEvControlPlaneStorage::TEvGetResultDataResponse, + TEvControlPlaneProxy::TEvGetResultDataResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvListJobsRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ListJobsRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ListJobsRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_JOBS]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString queryId = request.query_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ListJobsRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.jobs.get@as"}); - if (issues) { - CPS_LOG_E("ListJobsRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvListJobsResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ListJobsRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ListJobsRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_JOBS]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString queryId = request.query_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ListJobsRequest, scope, user, queryId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.jobs.get@as"}); + if (issues) { + CPS_LOG_E("ListJobsRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvListJobsResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ListJobsRequest, - TEvControlPlaneStorage::TEvListJobsRequest, - TEvControlPlaneStorage::TEvListJobsResponse, - TEvControlPlaneProxy::TEvListJobsResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ListJobsRequest, + TEvControlPlaneStorage::TEvListJobsRequest, + TEvControlPlaneStorage::TEvListJobsResponse, + TEvControlPlaneProxy::TEvListJobsResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + void Handle(TEvControlPlaneProxy::TEvDescribeJobRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); YandexQuery::DescribeJobRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("DescribeJobRequest: " << request.DebugString()); + CPP_LOG_T("DescribeJobRequest: " << request.DebugString()); TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_JOB]; const TString folderId = ev->Get()->FolderId; @@ -781,7 +781,7 @@ private: LWPROBE(DescribeJobRequest, scope, user, jobId, delta, byteSize, isSuccess, isTimeout); }; - NYql::TIssues issues = ValidatePermissions(ev, {"yq.jobs.get@as"}); + NYql::TIssues issues = ValidatePermissions(ev, {"yq.jobs.get@as"}); if (issues) { CPS_LOG_E("DescribeJobRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); Send(ev->Sender, new TEvControlPlaneProxy::TEvDescribeJobResponse(issues), 0, ev->Cookie); @@ -799,471 +799,471 @@ private: std::move(request), std::move(user), std::move(token), ControlPlaneStorageServiceActorId(), requestCounters, - probe, - ExtractPermissions(ev))); + probe, + ExtractPermissions(ev))); } - void Handle(TEvControlPlaneProxy::TEvCreateConnectionRequest::TPtr& ev) { + void Handle(TEvControlPlaneProxy::TEvCreateConnectionRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::CreateConnectionRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("CreateConnectionRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_CONNECTION]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(CreateConnectionRequest, scope, user, delta, byteSize, isSuccess, isTimeout); - }; - - TVector<TString> requiredPermissions = {"yq.connections.create@as"}; - if (ExtractServiceAccountId(request)) { - requiredPermissions.push_back("iam.serviceAccounts.use@as"); - } - - NYql::TIssues issues = ValidatePermissions(ev, requiredPermissions); - if (issues) { - CPS_LOG_E("CreateConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvCreateConnectionResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::CreateConnectionRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("CreateConnectionRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_CONNECTION]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(CreateConnectionRequest, scope, user, delta, byteSize, isSuccess, isTimeout); + }; + + TVector<TString> requiredPermissions = {"yq.connections.create@as"}; + if (ExtractServiceAccountId(request)) { + requiredPermissions.push_back("iam.serviceAccounts.use@as"); + } + + NYql::TIssues issues = ValidatePermissions(ev, requiredPermissions); + if (issues) { + CPS_LOG_E("CreateConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvCreateConnectionResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::CreateConnectionRequest, - TEvControlPlaneStorage::TEvCreateConnectionRequest, - TEvControlPlaneStorage::TEvCreateConnectionResponse, - TEvControlPlaneProxy::TEvCreateConnectionResponse, - true>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER])); - } - - void Handle(TEvControlPlaneProxy::TEvListConnectionsRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::CreateConnectionRequest, + TEvControlPlaneStorage::TEvCreateConnectionRequest, + TEvControlPlaneStorage::TEvCreateConnectionResponse, + TEvControlPlaneProxy::TEvCreateConnectionResponse, + true>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER])); + } + + void Handle(TEvControlPlaneProxy::TEvListConnectionsRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ListConnectionsRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ListConnectionsRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_CONNECTIONS]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ListConnectionsRequest, scope, user, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.connections.get@as"}); - if (issues) { - CPS_LOG_E("ListConnectionsRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvListConnectionsResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ListConnectionsRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ListConnectionsRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_CONNECTIONS]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ListConnectionsRequest, scope, user, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.connections.get@as"}); + if (issues) { + CPS_LOG_E("ListConnectionsRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvListConnectionsResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ListConnectionsRequest, - TEvControlPlaneStorage::TEvListConnectionsRequest, - TEvControlPlaneStorage::TEvListConnectionsResponse, - TEvControlPlaneProxy::TEvListConnectionsResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvDescribeConnectionRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ListConnectionsRequest, + TEvControlPlaneStorage::TEvListConnectionsRequest, + TEvControlPlaneStorage::TEvListConnectionsResponse, + TEvControlPlaneProxy::TEvListConnectionsResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvDescribeConnectionRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::DescribeConnectionRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("DescribeConnectionRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_CONNECTION]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString connectionId = request.connection_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(DescribeConnectionRequest, scope, user, connectionId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.connections.get@as"}); - if (issues) { - CPS_LOG_E("DescribeConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvDescribeConnectionResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::DescribeConnectionRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("DescribeConnectionRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_CONNECTION]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString connectionId = request.connection_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(DescribeConnectionRequest, scope, user, connectionId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.connections.get@as"}); + if (issues) { + CPS_LOG_E("DescribeConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvDescribeConnectionResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::DescribeConnectionRequest, - TEvControlPlaneStorage::TEvDescribeConnectionRequest, - TEvControlPlaneStorage::TEvDescribeConnectionResponse, - TEvControlPlaneProxy::TEvDescribeConnectionResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvModifyConnectionRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::DescribeConnectionRequest, + TEvControlPlaneStorage::TEvDescribeConnectionRequest, + TEvControlPlaneStorage::TEvDescribeConnectionResponse, + TEvControlPlaneProxy::TEvDescribeConnectionResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvModifyConnectionRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ModifyConnectionRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ModifyConnectionRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_CONNECTION]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString connectionId = request.connection_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ModifyConnectionRequest, scope, user, connectionId, delta, byteSize, isSuccess, isTimeout); - }; - - TVector<TString> requiredPermissions = {"yq.connections.update@as"}; - if (ExtractServiceAccountId(request)) { - requiredPermissions.push_back("iam.serviceAccounts.use@as"); - } - - NYql::TIssues issues = ValidatePermissions(ev, requiredPermissions); - if (issues) { - CPS_LOG_E("ModifyConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvModifyConnectionResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ModifyConnectionRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ModifyConnectionRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_CONNECTION]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString connectionId = request.connection_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ModifyConnectionRequest, scope, user, connectionId, delta, byteSize, isSuccess, isTimeout); + }; + + TVector<TString> requiredPermissions = {"yq.connections.update@as"}; + if (ExtractServiceAccountId(request)) { + requiredPermissions.push_back("iam.serviceAccounts.use@as"); + } + + NYql::TIssues issues = ValidatePermissions(ev, requiredPermissions); + if (issues) { + CPS_LOG_E("ModifyConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvModifyConnectionResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ModifyConnectionRequest, - TEvControlPlaneStorage::TEvModifyConnectionRequest, - TEvControlPlaneStorage::TEvModifyConnectionResponse, - TEvControlPlaneProxy::TEvModifyConnectionResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvDeleteConnectionRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ModifyConnectionRequest, + TEvControlPlaneStorage::TEvModifyConnectionRequest, + TEvControlPlaneStorage::TEvModifyConnectionResponse, + TEvControlPlaneProxy::TEvModifyConnectionResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvDeleteConnectionRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::DeleteConnectionRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("DeleteConnectionRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_CONNECTION]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString connectionId = request.connection_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(DeleteConnectionRequest, scope, user, connectionId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.connections.delete@as"}); - if (issues) { - CPS_LOG_E("DeleteConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvDeleteConnectionResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::DeleteConnectionRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("DeleteConnectionRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_CONNECTION]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString connectionId = request.connection_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(DeleteConnectionRequest, scope, user, connectionId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.connections.delete@as"}); + if (issues) { + CPS_LOG_E("DeleteConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvDeleteConnectionResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::DeleteConnectionRequest, - TEvControlPlaneStorage::TEvDeleteConnectionRequest, - TEvControlPlaneStorage::TEvDeleteConnectionResponse, - TEvControlPlaneProxy::TEvDeleteConnectionResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvTestConnectionRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::DeleteConnectionRequest, + TEvControlPlaneStorage::TEvDeleteConnectionRequest, + TEvControlPlaneStorage::TEvDeleteConnectionResponse, + TEvControlPlaneProxy::TEvDeleteConnectionResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvTestConnectionRequest::TPtr& ev) { + TInstant startTime = TInstant::Now(); + YandexQuery::TestConnectionRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("TestConnectionRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_TEST_CONNECTION]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(TestConnectionRequest, scope, user, delta, byteSize, isSuccess, isTimeout); + }; + + TVector<TString> requiredPermissions = {"yq.connections.create@as"}; + if (ExtractServiceAccountId(request)) { + requiredPermissions.push_back("iam.serviceAccounts.use@as"); + } + + NYql::TIssues issues = ValidatePermissions(ev, requiredPermissions); + if (issues) { + CPS_LOG_E("TestConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvTestConnectionResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); + TDuration delta = TInstant::Now() - startTime; + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::TestConnectionRequest, + TEvTestConnection::TEvTestConnectionRequest, + TEvTestConnection::TEvTestConnectionResponse, + TEvControlPlaneProxy::TEvTestConnectionResponse> + (Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + TestConnectionActorId(), + requestCounters, + probe, ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvCreateBindingRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::TestConnectionRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("TestConnectionRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_TEST_CONNECTION]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(TestConnectionRequest, scope, user, delta, byteSize, isSuccess, isTimeout); - }; - - TVector<TString> requiredPermissions = {"yq.connections.create@as"}; - if (ExtractServiceAccountId(request)) { - requiredPermissions.push_back("iam.serviceAccounts.use@as"); - } - - NYql::TIssues issues = ValidatePermissions(ev, requiredPermissions); - if (issues) { - CPS_LOG_E("TestConnectionRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvTestConnectionResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); - TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::TestConnectionRequest, - TEvTestConnection::TEvTestConnectionRequest, - TEvTestConnection::TEvTestConnectionResponse, - TEvControlPlaneProxy::TEvTestConnectionResponse> - (Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - TestConnectionActorId(), - requestCounters, - probe, ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvCreateBindingRequest::TPtr& ev) { - TInstant startTime = TInstant::Now(); - YandexQuery::CreateBindingRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("CreateBindingRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_BINDING]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(CreateBindingRequest, scope, user, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.create@as"}); - if (issues) { - CPS_LOG_E("CreateBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvCreateBindingResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::CreateBindingRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("CreateBindingRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_BINDING]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(CreateBindingRequest, scope, user, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.create@as"}); + if (issues) { + CPS_LOG_E("CreateBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvCreateBindingResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::CreateBindingRequest, - TEvControlPlaneStorage::TEvCreateBindingRequest, - TEvControlPlaneStorage::TEvCreateBindingResponse, - TEvControlPlaneProxy::TEvCreateBindingResponse, - true>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER])); - } - - void Handle(TEvControlPlaneProxy::TEvListBindingsRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::CreateBindingRequest, + TEvControlPlaneStorage::TEvCreateBindingRequest, + TEvControlPlaneStorage::TEvCreateBindingResponse, + TEvControlPlaneProxy::TEvCreateBindingResponse, + true>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER])); + } + + void Handle(TEvControlPlaneProxy::TEvListBindingsRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ListBindingsRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ListBindingsRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_BINDINGS]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ListBindingsRequest, scope, user, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.get@as"}); - if (issues) { - CPS_LOG_E("ListBindingsRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvListBindingsResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ListBindingsRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ListBindingsRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_BINDINGS]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ListBindingsRequest, scope, user, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.get@as"}); + if (issues) { + CPS_LOG_E("ListBindingsRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvListBindingsResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ListBindingsRequest, - TEvControlPlaneStorage::TEvListBindingsRequest, - TEvControlPlaneStorage::TEvListBindingsResponse, - TEvControlPlaneProxy::TEvListBindingsResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvDescribeBindingRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ListBindingsRequest, + TEvControlPlaneStorage::TEvListBindingsRequest, + TEvControlPlaneStorage::TEvListBindingsResponse, + TEvControlPlaneProxy::TEvListBindingsResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvDescribeBindingRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::DescribeBindingRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("DescribeBindingRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_BINDING]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString bindingId = request.binding_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(DescribeBindingRequest, scope, user, bindingId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.get@as"}); - if (issues) { - CPS_LOG_E("DescribeBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvDescribeBindingResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::DescribeBindingRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("DescribeBindingRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_BINDING]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString bindingId = request.binding_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(DescribeBindingRequest, scope, user, bindingId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.get@as"}); + if (issues) { + CPS_LOG_E("DescribeBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvDescribeBindingResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::DescribeBindingRequest, - TEvControlPlaneStorage::TEvDescribeBindingRequest, - TEvControlPlaneStorage::TEvDescribeBindingResponse, - TEvControlPlaneProxy::TEvDescribeBindingResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvModifyBindingRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::DescribeBindingRequest, + TEvControlPlaneStorage::TEvDescribeBindingRequest, + TEvControlPlaneStorage::TEvDescribeBindingResponse, + TEvControlPlaneProxy::TEvDescribeBindingResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvModifyBindingRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::ModifyBindingRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("ModifyBindingRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_BINDING]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString bindingId = request.binding_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(ModifyBindingRequest, scope, user, bindingId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.update@as"}); - if (issues) { - CPS_LOG_E("ModifyBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvModifyBindingResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::ModifyBindingRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("ModifyBindingRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_BINDING]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString bindingId = request.binding_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(ModifyBindingRequest, scope, user, bindingId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.update@as"}); + if (issues) { + CPS_LOG_E("ModifyBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvModifyBindingResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::ModifyBindingRequest, - TEvControlPlaneStorage::TEvModifyBindingRequest, - TEvControlPlaneStorage::TEvModifyBindingResponse, - TEvControlPlaneProxy::TEvModifyBindingResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(TEvControlPlaneProxy::TEvDeleteBindingRequest::TPtr& ev) { + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::ModifyBindingRequest, + TEvControlPlaneStorage::TEvModifyBindingRequest, + TEvControlPlaneStorage::TEvModifyBindingResponse, + TEvControlPlaneProxy::TEvModifyBindingResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(TEvControlPlaneProxy::TEvDeleteBindingRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); - YandexQuery::DeleteBindingRequest request = std::move(ev->Get()->Request); - CPP_LOG_T("DeleteBindingRequest: " << request.DebugString()); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_BINDING]; - - const TString folderId = ev->Get()->FolderId; - const TString scope = "yandexcloud://" + folderId; - TString user = std::move(ev->Get()->User); - TString token = std::move(ev->Get()->Token); - const TString bindingId = request.binding_id(); - const int byteSize = request.ByteSize(); - - auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { - LWPROBE(DeleteBindingRequest, scope, user, bindingId, delta, byteSize, isSuccess, isTimeout); - }; - - NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.delete@as"}); - if (issues) { - CPS_LOG_E("DeleteBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneProxy::TEvDeleteBindingResponse(issues), 0, ev->Cookie); - requestCounters->Error->Inc(); + YandexQuery::DeleteBindingRequest request = std::move(ev->Get()->Request); + CPP_LOG_T("DeleteBindingRequest: " << request.DebugString()); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_BINDING]; + + const TString folderId = ev->Get()->FolderId; + const TString scope = "yandexcloud://" + folderId; + TString user = std::move(ev->Get()->User); + TString token = std::move(ev->Get()->Token); + const TString bindingId = request.binding_id(); + const int byteSize = request.ByteSize(); + + auto probe = [=](const TDuration& delta, bool isSuccess, bool isTimeout) { + LWPROBE(DeleteBindingRequest, scope, user, bindingId, delta, byteSize, isSuccess, isTimeout); + }; + + NYql::TIssues issues = ValidatePermissions(ev, {"yq.bindings.delete@as"}); + if (issues) { + CPS_LOG_E("DeleteBindingRequest, validation failed: " << scope << " " << user << " " << NKikimr::MaskTicket(token) << " " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneProxy::TEvDeleteBindingResponse(issues), 0, ev->Cookie); + requestCounters->Error->Inc(); TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - probe(delta, false, false); - return; - } - - Register(new TRequestActor<YandexQuery::DeleteBindingRequest, - TEvControlPlaneStorage::TEvDeleteBindingRequest, - TEvControlPlaneStorage::TEvDeleteBindingResponse, - TEvControlPlaneProxy::TEvDeleteBindingResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, - std::move(request), std::move(user), std::move(token), - ControlPlaneStorageServiceActorId(), - requestCounters, - probe, - ExtractPermissions(ev))); - } - - void Handle(NMon::TEvHttpInfo::TPtr& ev) { - TStringStream str; - HTML(str) { - PRE() { - str << "Current config:" << Endl; - str << Config.DebugString() << Endl; - str << Endl; - } - } - Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str())); - } -}; - + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + probe(delta, false, false); + return; + } + + Register(new TRequestActor<YandexQuery::DeleteBindingRequest, + TEvControlPlaneStorage::TEvDeleteBindingRequest, + TEvControlPlaneStorage::TEvDeleteBindingResponse, + TEvControlPlaneProxy::TEvDeleteBindingResponse>(Config, ev->Sender, ev->Cookie, scope, folderId, + std::move(request), std::move(user), std::move(token), + ControlPlaneStorageServiceActorId(), + requestCounters, + probe, + ExtractPermissions(ev))); + } + + void Handle(NMon::TEvHttpInfo::TPtr& ev) { + TStringStream str; + HTML(str) { + PRE() { + str << "Current config:" << Endl; + str << Config.DebugString() << Endl; + str << Endl; + } + } + Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str())); + } +}; + } // namespace -TActorId ControlPlaneProxyActorId() { - constexpr TStringBuf name = "YQCTLPRX"; - return NActors::TActorId(0, name); -} - -IActor* CreateControlPlaneProxyActor(const NConfig::TControlPlaneProxyConfig& config, const NMonitoring::TDynamicCounterPtr& counters) { - return new TControlPlaneProxyActor(config, counters); -} - -} // namespace NYq +TActorId ControlPlaneProxyActorId() { + constexpr TStringBuf name = "YQCTLPRX"; + return NActors::TActorId(0, name); +} + +IActor* CreateControlPlaneProxyActor(const NConfig::TControlPlaneProxyConfig& config, const NMonitoring::TDynamicCounterPtr& counters) { + return new TControlPlaneProxyActor(config, counters); +} + +} // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.h b/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.h index 12e495ba1c..ac30905bed 100644 --- a/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.h +++ b/ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.h @@ -1,27 +1,27 @@ -#pragma once - +#pragma once + #include <ydb/core/yq/libs/actors/logging/log.h> #include <ydb/core/yq/libs/config/protos/control_plane_proxy.pb.h> - -#include <library/cpp/actors/core/actor.h> -#include <library/cpp/monlib/dynamic_counters/counters.h> - - -#define CPP_LOG_D(s) \ - LOG_YQ_CONTROL_PLANE_PROXY_DEBUG(s) -#define CPP_LOG_I(s) \ - LOG_YQ_CONTROL_PLANE_PROXY_INFO(s) -#define CPP_LOG_W(s) \ - LOG_YQ_CONTROL_PLANE_PROXY_WARN(s) -#define CPP_LOG_E(s) \ - LOG_YQ_CONTROL_PLANE_PROXY_ERROR(s) -#define CPP_LOG_T(s) \ - LOG_YQ_CONTROL_PLANE_PROXY_TRACE(s) - -namespace NYq { - -NActors::TActorId ControlPlaneProxyActorId(); - -NActors::IActor* CreateControlPlaneProxyActor(const NConfig::TControlPlaneProxyConfig& config, const NMonitoring::TDynamicCounterPtr& counters); - + +#include <library/cpp/actors/core/actor.h> +#include <library/cpp/monlib/dynamic_counters/counters.h> + + +#define CPP_LOG_D(s) \ + LOG_YQ_CONTROL_PLANE_PROXY_DEBUG(s) +#define CPP_LOG_I(s) \ + LOG_YQ_CONTROL_PLANE_PROXY_INFO(s) +#define CPP_LOG_W(s) \ + LOG_YQ_CONTROL_PLANE_PROXY_WARN(s) +#define CPP_LOG_E(s) \ + LOG_YQ_CONTROL_PLANE_PROXY_ERROR(s) +#define CPP_LOG_T(s) \ + LOG_YQ_CONTROL_PLANE_PROXY_TRACE(s) + +namespace NYq { + +NActors::TActorId ControlPlaneProxyActorId(); + +NActors::IActor* CreateControlPlaneProxyActor(const NConfig::TControlPlaneProxyConfig& config, const NMonitoring::TDynamicCounterPtr& counters); + } // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_proxy/events/events.cpp b/ydb/core/yq/libs/control_plane_proxy/events/events.cpp index 6c3d2603e7..a4930159cf 100644 --- a/ydb/core/yq/libs/control_plane_proxy/events/events.cpp +++ b/ydb/core/yq/libs/control_plane_proxy/events/events.cpp @@ -1 +1 @@ -#include "events.h" +#include "events.h" diff --git a/ydb/core/yq/libs/control_plane_proxy/events/events.h b/ydb/core/yq/libs/control_plane_proxy/events/events.h index aeb922e784..aee2221776 100644 --- a/ydb/core/yq/libs/control_plane_proxy/events/events.h +++ b/ydb/core/yq/libs/control_plane_proxy/events/events.h @@ -1,178 +1,178 @@ -#pragma once - +#pragma once + #include <ydb/core/yq/libs/control_plane_storage/events/events.h> - + #include <ydb/public/api/protos/yq.pb.h> - -#include <library/cpp/actors/core/event_pb.h> -#include <library/cpp/actors/core/events.h> -#include <library/cpp/actors/interconnect/events_local.h> - + +#include <library/cpp/actors/core/event_pb.h> +#include <library/cpp/actors/core/events.h> +#include <library/cpp/actors/interconnect/events_local.h> + #include <ydb/library/yql/public/issue/yql_issue.h> - -namespace NYq { - -struct TEvControlPlaneProxy { - // Event ids. - enum EEv : ui32 { + +namespace NYq { + +struct TEvControlPlaneProxy { + // Event ids. + enum EEv : ui32 { EvCreateQueryRequest = YqEventSubspaceBegin(NYq::TYqEventSubspace::ControlPlaneProxy), - EvCreateQueryResponse, - EvListQueriesRequest, - EvListQueriesResponse, - EvDescribeQueryRequest, - EvDescribeQueryResponse, + EvCreateQueryResponse, + EvListQueriesRequest, + EvListQueriesResponse, + EvDescribeQueryRequest, + EvDescribeQueryResponse, EvGetQueryStatusRequest, EvGetQueryStatusResponse, - EvModifyQueryRequest, - EvModifyQueryResponse, - EvDeleteQueryRequest, - EvDeleteQueryResponse, - EvControlQueryRequest, - EvControlQueryResponse, - EvGetResultDataRequest, - EvGetResultDataResponse, - EvListJobsRequest, - EvListJobsResponse, + EvModifyQueryRequest, + EvModifyQueryResponse, + EvDeleteQueryRequest, + EvDeleteQueryResponse, + EvControlQueryRequest, + EvControlQueryResponse, + EvGetResultDataRequest, + EvGetResultDataResponse, + EvListJobsRequest, + EvListJobsResponse, EvDescribeJobRequest, EvDescribeJobResponse, - EvCreateConnectionRequest, - EvCreateConnectionResponse, - EvListConnectionsRequest, - EvListConnectionsResponse, - EvDescribeConnectionRequest, - EvDescribeConnectionResponse, - EvModifyConnectionRequest, - EvModifyConnectionResponse, - EvDeleteConnectionRequest, - EvDeleteConnectionResponse, - EvTestConnectionRequest, - EvTestConnectionResponse, - EvCreateBindingRequest, - EvCreateBindingResponse, - EvListBindingsRequest, - EvListBindingsResponse, - EvDescribeBindingRequest, - EvDescribeBindingResponse, - EvModifyBindingRequest, - EvModifyBindingResponse, - EvDeleteBindingRequest, - EvDeleteBindingResponse, - EvEnd, - }; - + EvCreateConnectionRequest, + EvCreateConnectionResponse, + EvListConnectionsRequest, + EvListConnectionsResponse, + EvDescribeConnectionRequest, + EvDescribeConnectionResponse, + EvModifyConnectionRequest, + EvModifyConnectionResponse, + EvDeleteConnectionRequest, + EvDeleteConnectionResponse, + EvTestConnectionRequest, + EvTestConnectionResponse, + EvCreateBindingRequest, + EvCreateBindingResponse, + EvListBindingsRequest, + EvListBindingsResponse, + EvDescribeBindingRequest, + EvDescribeBindingResponse, + EvModifyBindingRequest, + EvModifyBindingResponse, + EvDeleteBindingRequest, + EvDeleteBindingResponse, + EvEnd, + }; + static_assert(EvEnd <= YqEventSubspaceEnd(NYq::TYqEventSubspace::ControlPlaneProxy), "All events must be in their subspace"); - - struct TEvCreateQueryRequest : NActors::TEventLocal<TEvCreateQueryRequest, EvCreateQueryRequest> { - explicit TEvCreateQueryRequest(const TString& folderId, - const YandexQuery::CreateQueryRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::CreateQueryRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvCreateQueryResponse : NActors::TEventLocal<TEvCreateQueryResponse, EvCreateQueryResponse> { - explicit TEvCreateQueryResponse(const YandexQuery::CreateQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvCreateQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::CreateQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvListQueriesRequest : NActors::TEventLocal<TEvListQueriesRequest, EvListQueriesRequest> { - explicit TEvListQueriesRequest(const TString& folderId, - const YandexQuery::ListQueriesRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ListQueriesRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvListQueriesResponse : NActors::TEventLocal<TEvListQueriesResponse, EvListQueriesResponse> { - explicit TEvListQueriesResponse(const YandexQuery::ListQueriesResult& result) - : Result(result) - { - } - - explicit TEvListQueriesResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListQueriesResult Result; - NYql::TIssues Issues; - }; - - struct TEvDescribeQueryRequest : NActors::TEventLocal<TEvDescribeQueryRequest, EvDescribeQueryRequest> { - explicit TEvDescribeQueryRequest(const TString& folderId, - const YandexQuery::DescribeQueryRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::DescribeQueryRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvDescribeQueryResponse : NActors::TEventLocal<TEvDescribeQueryResponse, EvDescribeQueryResponse> { - explicit TEvDescribeQueryResponse(const YandexQuery::DescribeQueryResult& result) - : Result(result) - { - } - - explicit TEvDescribeQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DescribeQueryResult Result; - NYql::TIssues Issues; - }; - + + struct TEvCreateQueryRequest : NActors::TEventLocal<TEvCreateQueryRequest, EvCreateQueryRequest> { + explicit TEvCreateQueryRequest(const TString& folderId, + const YandexQuery::CreateQueryRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::CreateQueryRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvCreateQueryResponse : NActors::TEventLocal<TEvCreateQueryResponse, EvCreateQueryResponse> { + explicit TEvCreateQueryResponse(const YandexQuery::CreateQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvCreateQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::CreateQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvListQueriesRequest : NActors::TEventLocal<TEvListQueriesRequest, EvListQueriesRequest> { + explicit TEvListQueriesRequest(const TString& folderId, + const YandexQuery::ListQueriesRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ListQueriesRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvListQueriesResponse : NActors::TEventLocal<TEvListQueriesResponse, EvListQueriesResponse> { + explicit TEvListQueriesResponse(const YandexQuery::ListQueriesResult& result) + : Result(result) + { + } + + explicit TEvListQueriesResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListQueriesResult Result; + NYql::TIssues Issues; + }; + + struct TEvDescribeQueryRequest : NActors::TEventLocal<TEvDescribeQueryRequest, EvDescribeQueryRequest> { + explicit TEvDescribeQueryRequest(const TString& folderId, + const YandexQuery::DescribeQueryRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::DescribeQueryRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvDescribeQueryResponse : NActors::TEventLocal<TEvDescribeQueryResponse, EvDescribeQueryResponse> { + explicit TEvDescribeQueryResponse(const YandexQuery::DescribeQueryResult& result) + : Result(result) + { + } + + explicit TEvDescribeQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DescribeQueryResult Result; + NYql::TIssues Issues; + }; + struct TEvGetQueryStatusRequest : NActors::TEventLocal<TEvGetQueryStatusRequest, EvGetQueryStatusRequest> { explicit TEvGetQueryStatusRequest(const TString& folderId, const YandexQuery::GetQueryStatusRequest& request, @@ -209,195 +209,195 @@ struct TEvControlPlaneProxy { NYql::TIssues Issues; }; - struct TEvModifyQueryRequest : NActors::TEventLocal<TEvModifyQueryRequest, EvModifyQueryRequest> { - explicit TEvModifyQueryRequest(const TString& folderId, - const YandexQuery::ModifyQueryRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ModifyQueryRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvModifyQueryResponse : NActors::TEventLocal<TEvModifyQueryResponse, EvModifyQueryResponse> { - explicit TEvModifyQueryResponse(const YandexQuery::ModifyQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvModifyQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ModifyQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvDeleteQueryRequest : NActors::TEventLocal<TEvDeleteQueryRequest, EvDeleteQueryRequest> { - explicit TEvDeleteQueryRequest(const TString& folderId, - const YandexQuery::DeleteQueryRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::DeleteQueryRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvDeleteQueryResponse : NActors::TEventLocal<TEvDeleteQueryResponse, EvDeleteQueryResponse> { - explicit TEvDeleteQueryResponse(const YandexQuery::DeleteQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvDeleteQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DeleteQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvControlQueryRequest : NActors::TEventLocal<TEvControlQueryRequest, EvControlQueryRequest> { - explicit TEvControlQueryRequest(const TString& folderId, - const YandexQuery::ControlQueryRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ControlQueryRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvControlQueryResponse : NActors::TEventLocal<TEvControlQueryResponse, EvControlQueryResponse> { - explicit TEvControlQueryResponse(const YandexQuery::ControlQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvControlQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ControlQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvGetResultDataRequest : NActors::TEventLocal<TEvGetResultDataRequest, EvGetResultDataRequest> { - explicit TEvGetResultDataRequest(const TString& folderId, - const YandexQuery::GetResultDataRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::GetResultDataRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvGetResultDataResponse : NActors::TEventLocal<TEvGetResultDataResponse, EvGetResultDataResponse> { - explicit TEvGetResultDataResponse(const YandexQuery::GetResultDataResult& result) - : Result(result) - { - } - - explicit TEvGetResultDataResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::GetResultDataResult Result; - NYql::TIssues Issues; - }; - - struct TEvListJobsRequest : NActors::TEventLocal<TEvListJobsRequest, EvListJobsRequest> { - explicit TEvListJobsRequest(const TString& folderId, - const YandexQuery::ListJobsRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ListJobsRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvListJobsResponse : NActors::TEventLocal<TEvListJobsResponse, EvListJobsResponse> { - explicit TEvListJobsResponse(const YandexQuery::ListJobsResult& result) - : Result(result) - { - } - - explicit TEvListJobsResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListJobsResult Result; - NYql::TIssues Issues; - }; - + struct TEvModifyQueryRequest : NActors::TEventLocal<TEvModifyQueryRequest, EvModifyQueryRequest> { + explicit TEvModifyQueryRequest(const TString& folderId, + const YandexQuery::ModifyQueryRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ModifyQueryRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvModifyQueryResponse : NActors::TEventLocal<TEvModifyQueryResponse, EvModifyQueryResponse> { + explicit TEvModifyQueryResponse(const YandexQuery::ModifyQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvModifyQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ModifyQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvDeleteQueryRequest : NActors::TEventLocal<TEvDeleteQueryRequest, EvDeleteQueryRequest> { + explicit TEvDeleteQueryRequest(const TString& folderId, + const YandexQuery::DeleteQueryRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::DeleteQueryRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvDeleteQueryResponse : NActors::TEventLocal<TEvDeleteQueryResponse, EvDeleteQueryResponse> { + explicit TEvDeleteQueryResponse(const YandexQuery::DeleteQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvDeleteQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DeleteQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvControlQueryRequest : NActors::TEventLocal<TEvControlQueryRequest, EvControlQueryRequest> { + explicit TEvControlQueryRequest(const TString& folderId, + const YandexQuery::ControlQueryRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ControlQueryRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvControlQueryResponse : NActors::TEventLocal<TEvControlQueryResponse, EvControlQueryResponse> { + explicit TEvControlQueryResponse(const YandexQuery::ControlQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvControlQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ControlQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvGetResultDataRequest : NActors::TEventLocal<TEvGetResultDataRequest, EvGetResultDataRequest> { + explicit TEvGetResultDataRequest(const TString& folderId, + const YandexQuery::GetResultDataRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::GetResultDataRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvGetResultDataResponse : NActors::TEventLocal<TEvGetResultDataResponse, EvGetResultDataResponse> { + explicit TEvGetResultDataResponse(const YandexQuery::GetResultDataResult& result) + : Result(result) + { + } + + explicit TEvGetResultDataResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::GetResultDataResult Result; + NYql::TIssues Issues; + }; + + struct TEvListJobsRequest : NActors::TEventLocal<TEvListJobsRequest, EvListJobsRequest> { + explicit TEvListJobsRequest(const TString& folderId, + const YandexQuery::ListJobsRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ListJobsRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvListJobsResponse : NActors::TEventLocal<TEvListJobsResponse, EvListJobsResponse> { + explicit TEvListJobsResponse(const YandexQuery::ListJobsResult& result) + : Result(result) + { + } + + explicit TEvListJobsResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListJobsResult Result; + NYql::TIssues Issues; + }; + struct TEvDescribeJobRequest : NActors::TEventLocal<TEvDescribeJobRequest, EvDescribeJobRequest> { explicit TEvDescribeJobRequest(const TString& folderId, const YandexQuery::DescribeJobRequest& request, @@ -434,419 +434,419 @@ struct TEvControlPlaneProxy { NYql::TIssues Issues; }; - struct TEvCreateConnectionRequest : NActors::TEventLocal<TEvCreateConnectionRequest, EvCreateConnectionRequest> { - explicit TEvCreateConnectionRequest(const TString& folderId, - const YandexQuery::CreateConnectionRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::CreateConnectionRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvCreateConnectionResponse : NActors::TEventLocal<TEvCreateConnectionResponse, EvCreateConnectionResponse> { - explicit TEvCreateConnectionResponse(const YandexQuery::CreateConnectionResult& result, - const TAuditDetails<YandexQuery::Connection>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvCreateConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::CreateConnectionResult Result; - TAuditDetails<YandexQuery::Connection> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvListConnectionsRequest : NActors::TEventLocal<TEvListConnectionsRequest, EvListConnectionsRequest> { - explicit TEvListConnectionsRequest(const TString& folderId, - const YandexQuery::ListConnectionsRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ListConnectionsRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvListConnectionsResponse : NActors::TEventLocal<TEvListConnectionsResponse, EvListConnectionsResponse> { - explicit TEvListConnectionsResponse(const YandexQuery::ListConnectionsResult& result) - : Result(result) - { - } - - explicit TEvListConnectionsResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListConnectionsResult Result; - NYql::TIssues Issues; - }; - - struct TEvDescribeConnectionRequest : NActors::TEventLocal<TEvDescribeConnectionRequest, EvDescribeConnectionRequest> { - explicit TEvDescribeConnectionRequest(const TString& folderId, - const YandexQuery::DescribeConnectionRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::DescribeConnectionRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvDescribeConnectionResponse : NActors::TEventLocal<TEvDescribeConnectionResponse, EvDescribeConnectionResponse> { - explicit TEvDescribeConnectionResponse(const YandexQuery::DescribeConnectionResult& result) - : Result(result) - { - } - - explicit TEvDescribeConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DescribeConnectionResult Result; - NYql::TIssues Issues; - }; - - struct TEvModifyConnectionRequest : NActors::TEventLocal<TEvModifyConnectionRequest, EvModifyConnectionRequest> { - explicit TEvModifyConnectionRequest(const TString& folderId, - const YandexQuery::ModifyConnectionRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ModifyConnectionRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvModifyConnectionResponse : NActors::TEventLocal<TEvModifyConnectionResponse, EvModifyConnectionResponse> { - explicit TEvModifyConnectionResponse(const YandexQuery::ModifyConnectionResult& result, - const TAuditDetails<YandexQuery::Connection>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvModifyConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ModifyConnectionResult Result; - TAuditDetails<YandexQuery::Connection> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvDeleteConnectionRequest : NActors::TEventLocal<TEvDeleteConnectionRequest, EvDeleteConnectionRequest> { - explicit TEvDeleteConnectionRequest(const TString& folderId, - const YandexQuery::DeleteConnectionRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::DeleteConnectionRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvDeleteConnectionResponse : NActors::TEventLocal<TEvDeleteConnectionResponse, EvDeleteConnectionResponse> { - explicit TEvDeleteConnectionResponse(const YandexQuery::DeleteConnectionResult& result, - const TAuditDetails<YandexQuery::Connection>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvDeleteConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DeleteConnectionResult Result; - TAuditDetails<YandexQuery::Connection> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvTestConnectionRequest : NActors::TEventLocal<TEvTestConnectionRequest, EvTestConnectionRequest> { - explicit TEvTestConnectionRequest(const TString& folderId, - const YandexQuery::TestConnectionRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::TestConnectionRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvTestConnectionResponse : NActors::TEventLocal<TEvTestConnectionResponse, EvTestConnectionResponse> { - explicit TEvTestConnectionResponse(const YandexQuery::TestConnectionResult& result) - : Result(result) - { - } - - explicit TEvTestConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::TestConnectionResult Result; - NYql::TIssues Issues; - }; - - struct TEvCreateBindingRequest : NActors::TEventLocal<TEvCreateBindingRequest, EvCreateBindingRequest> { - explicit TEvCreateBindingRequest(const TString& folderId, - const YandexQuery::CreateBindingRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::CreateBindingRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvCreateBindingResponse : NActors::TEventLocal<TEvCreateBindingResponse, EvCreateBindingResponse> { - explicit TEvCreateBindingResponse(const YandexQuery::CreateBindingResult& result, - const TAuditDetails<YandexQuery::Binding>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvCreateBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::CreateBindingResult Result; - TAuditDetails<YandexQuery::Binding> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvListBindingsRequest : NActors::TEventLocal<TEvListBindingsRequest, EvListBindingsRequest> { - explicit TEvListBindingsRequest(const TString& folderId, - const YandexQuery::ListBindingsRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ListBindingsRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvListBindingsResponse : NActors::TEventLocal<TEvListBindingsResponse, EvListBindingsResponse> { - explicit TEvListBindingsResponse(const YandexQuery::ListBindingsResult& result) - : Result(result) - { - } - - explicit TEvListBindingsResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListBindingsResult Result; - NYql::TIssues Issues; - }; - - struct TEvDescribeBindingRequest : NActors::TEventLocal<TEvDescribeBindingRequest, EvDescribeBindingRequest> { - explicit TEvDescribeBindingRequest(const TString& folderId, - const YandexQuery::DescribeBindingRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::DescribeBindingRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvDescribeBindingResponse : NActors::TEventLocal<TEvDescribeBindingResponse, EvDescribeBindingResponse> { - explicit TEvDescribeBindingResponse(const YandexQuery::DescribeBindingResult& result) - : Result(result) - { - } - - explicit TEvDescribeBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DescribeBindingResult Result; - NYql::TIssues Issues; - }; - - struct TEvModifyBindingRequest : NActors::TEventLocal<TEvModifyBindingRequest, EvModifyBindingRequest> { - explicit TEvModifyBindingRequest(const TString& folderId, - const YandexQuery::ModifyBindingRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::ModifyBindingRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvModifyBindingResponse : NActors::TEventLocal<TEvModifyBindingResponse, EvModifyBindingResponse> { - explicit TEvModifyBindingResponse(const YandexQuery::ModifyBindingResult& result, - const TAuditDetails<YandexQuery::Binding>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvModifyBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ModifyBindingResult Result; - TAuditDetails<YandexQuery::Binding> AuditDetails; - NYql::TIssues Issues; - }; - - struct TEvDeleteBindingRequest : NActors::TEventLocal<TEvDeleteBindingRequest, EvDeleteBindingRequest> { - explicit TEvDeleteBindingRequest(const TString& folderId, - const YandexQuery::DeleteBindingRequest& request, - const TString& user, - const TString& token, - const TVector<TString>& permissions) - : FolderId(folderId) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString FolderId; - YandexQuery::DeleteBindingRequest Request; - TString User; - TString Token; - TVector<TString> Permissions; - }; - - struct TEvDeleteBindingResponse : NActors::TEventLocal<TEvDeleteBindingResponse, EvDeleteBindingResponse> { - explicit TEvDeleteBindingResponse(const YandexQuery::DeleteBindingResult& result, - const TAuditDetails<YandexQuery::Binding>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvDeleteBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DeleteBindingResult Result; - TAuditDetails<YandexQuery::Binding> AuditDetails; - NYql::TIssues Issues; - }; -}; - -} + struct TEvCreateConnectionRequest : NActors::TEventLocal<TEvCreateConnectionRequest, EvCreateConnectionRequest> { + explicit TEvCreateConnectionRequest(const TString& folderId, + const YandexQuery::CreateConnectionRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::CreateConnectionRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvCreateConnectionResponse : NActors::TEventLocal<TEvCreateConnectionResponse, EvCreateConnectionResponse> { + explicit TEvCreateConnectionResponse(const YandexQuery::CreateConnectionResult& result, + const TAuditDetails<YandexQuery::Connection>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvCreateConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::CreateConnectionResult Result; + TAuditDetails<YandexQuery::Connection> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvListConnectionsRequest : NActors::TEventLocal<TEvListConnectionsRequest, EvListConnectionsRequest> { + explicit TEvListConnectionsRequest(const TString& folderId, + const YandexQuery::ListConnectionsRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ListConnectionsRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvListConnectionsResponse : NActors::TEventLocal<TEvListConnectionsResponse, EvListConnectionsResponse> { + explicit TEvListConnectionsResponse(const YandexQuery::ListConnectionsResult& result) + : Result(result) + { + } + + explicit TEvListConnectionsResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListConnectionsResult Result; + NYql::TIssues Issues; + }; + + struct TEvDescribeConnectionRequest : NActors::TEventLocal<TEvDescribeConnectionRequest, EvDescribeConnectionRequest> { + explicit TEvDescribeConnectionRequest(const TString& folderId, + const YandexQuery::DescribeConnectionRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::DescribeConnectionRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvDescribeConnectionResponse : NActors::TEventLocal<TEvDescribeConnectionResponse, EvDescribeConnectionResponse> { + explicit TEvDescribeConnectionResponse(const YandexQuery::DescribeConnectionResult& result) + : Result(result) + { + } + + explicit TEvDescribeConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DescribeConnectionResult Result; + NYql::TIssues Issues; + }; + + struct TEvModifyConnectionRequest : NActors::TEventLocal<TEvModifyConnectionRequest, EvModifyConnectionRequest> { + explicit TEvModifyConnectionRequest(const TString& folderId, + const YandexQuery::ModifyConnectionRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ModifyConnectionRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvModifyConnectionResponse : NActors::TEventLocal<TEvModifyConnectionResponse, EvModifyConnectionResponse> { + explicit TEvModifyConnectionResponse(const YandexQuery::ModifyConnectionResult& result, + const TAuditDetails<YandexQuery::Connection>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvModifyConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ModifyConnectionResult Result; + TAuditDetails<YandexQuery::Connection> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvDeleteConnectionRequest : NActors::TEventLocal<TEvDeleteConnectionRequest, EvDeleteConnectionRequest> { + explicit TEvDeleteConnectionRequest(const TString& folderId, + const YandexQuery::DeleteConnectionRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::DeleteConnectionRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvDeleteConnectionResponse : NActors::TEventLocal<TEvDeleteConnectionResponse, EvDeleteConnectionResponse> { + explicit TEvDeleteConnectionResponse(const YandexQuery::DeleteConnectionResult& result, + const TAuditDetails<YandexQuery::Connection>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvDeleteConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DeleteConnectionResult Result; + TAuditDetails<YandexQuery::Connection> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvTestConnectionRequest : NActors::TEventLocal<TEvTestConnectionRequest, EvTestConnectionRequest> { + explicit TEvTestConnectionRequest(const TString& folderId, + const YandexQuery::TestConnectionRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::TestConnectionRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvTestConnectionResponse : NActors::TEventLocal<TEvTestConnectionResponse, EvTestConnectionResponse> { + explicit TEvTestConnectionResponse(const YandexQuery::TestConnectionResult& result) + : Result(result) + { + } + + explicit TEvTestConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::TestConnectionResult Result; + NYql::TIssues Issues; + }; + + struct TEvCreateBindingRequest : NActors::TEventLocal<TEvCreateBindingRequest, EvCreateBindingRequest> { + explicit TEvCreateBindingRequest(const TString& folderId, + const YandexQuery::CreateBindingRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::CreateBindingRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvCreateBindingResponse : NActors::TEventLocal<TEvCreateBindingResponse, EvCreateBindingResponse> { + explicit TEvCreateBindingResponse(const YandexQuery::CreateBindingResult& result, + const TAuditDetails<YandexQuery::Binding>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvCreateBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::CreateBindingResult Result; + TAuditDetails<YandexQuery::Binding> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvListBindingsRequest : NActors::TEventLocal<TEvListBindingsRequest, EvListBindingsRequest> { + explicit TEvListBindingsRequest(const TString& folderId, + const YandexQuery::ListBindingsRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ListBindingsRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvListBindingsResponse : NActors::TEventLocal<TEvListBindingsResponse, EvListBindingsResponse> { + explicit TEvListBindingsResponse(const YandexQuery::ListBindingsResult& result) + : Result(result) + { + } + + explicit TEvListBindingsResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListBindingsResult Result; + NYql::TIssues Issues; + }; + + struct TEvDescribeBindingRequest : NActors::TEventLocal<TEvDescribeBindingRequest, EvDescribeBindingRequest> { + explicit TEvDescribeBindingRequest(const TString& folderId, + const YandexQuery::DescribeBindingRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::DescribeBindingRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvDescribeBindingResponse : NActors::TEventLocal<TEvDescribeBindingResponse, EvDescribeBindingResponse> { + explicit TEvDescribeBindingResponse(const YandexQuery::DescribeBindingResult& result) + : Result(result) + { + } + + explicit TEvDescribeBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DescribeBindingResult Result; + NYql::TIssues Issues; + }; + + struct TEvModifyBindingRequest : NActors::TEventLocal<TEvModifyBindingRequest, EvModifyBindingRequest> { + explicit TEvModifyBindingRequest(const TString& folderId, + const YandexQuery::ModifyBindingRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::ModifyBindingRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvModifyBindingResponse : NActors::TEventLocal<TEvModifyBindingResponse, EvModifyBindingResponse> { + explicit TEvModifyBindingResponse(const YandexQuery::ModifyBindingResult& result, + const TAuditDetails<YandexQuery::Binding>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvModifyBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ModifyBindingResult Result; + TAuditDetails<YandexQuery::Binding> AuditDetails; + NYql::TIssues Issues; + }; + + struct TEvDeleteBindingRequest : NActors::TEventLocal<TEvDeleteBindingRequest, EvDeleteBindingRequest> { + explicit TEvDeleteBindingRequest(const TString& folderId, + const YandexQuery::DeleteBindingRequest& request, + const TString& user, + const TString& token, + const TVector<TString>& permissions) + : FolderId(folderId) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString FolderId; + YandexQuery::DeleteBindingRequest Request; + TString User; + TString Token; + TVector<TString> Permissions; + }; + + struct TEvDeleteBindingResponse : NActors::TEventLocal<TEvDeleteBindingResponse, EvDeleteBindingResponse> { + explicit TEvDeleteBindingResponse(const YandexQuery::DeleteBindingResult& result, + const TAuditDetails<YandexQuery::Binding>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvDeleteBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DeleteBindingResult Result; + TAuditDetails<YandexQuery::Binding> AuditDetails; + NYql::TIssues Issues; + }; +}; + +} diff --git a/ydb/core/yq/libs/control_plane_proxy/events/ya.make b/ydb/core/yq/libs/control_plane_proxy/events/ya.make index 55797e73e8..d061c578cf 100644 --- a/ydb/core/yq/libs/control_plane_proxy/events/ya.make +++ b/ydb/core/yq/libs/control_plane_proxy/events/ya.make @@ -1,15 +1,15 @@ OWNER(g:yq) - -LIBRARY() - -SRCS( - events.cpp -) - -PEERDIR( - library/cpp/actors/core - library/cpp/actors/interconnect + +LIBRARY() + +SRCS( + events.cpp +) + +PEERDIR( + library/cpp/actors/core + library/cpp/actors/interconnect ydb/core/yq/libs/control_plane_storage/events -) - -END() +) + +END() diff --git a/ydb/core/yq/libs/control_plane_proxy/probes.cpp b/ydb/core/yq/libs/control_plane_proxy/probes.cpp index ea704cf1bd..576bfea9f4 100644 --- a/ydb/core/yq/libs/control_plane_proxy/probes.cpp +++ b/ydb/core/yq/libs/control_plane_proxy/probes.cpp @@ -1,3 +1,3 @@ -#include "probes.h" - -LWTRACE_DEFINE_PROVIDER(YQ_CONTROL_PLANE_PROXY_PROVIDER)
\ No newline at end of file +#include "probes.h" + +LWTRACE_DEFINE_PROVIDER(YQ_CONTROL_PLANE_PROXY_PROVIDER)
\ No newline at end of file diff --git a/ydb/core/yq/libs/control_plane_proxy/probes.h b/ydb/core/yq/libs/control_plane_proxy/probes.h index 1d790f6f93..2a67805a7a 100644 --- a/ydb/core/yq/libs/control_plane_proxy/probes.h +++ b/ydb/core/yq/libs/control_plane_proxy/probes.h @@ -1,93 +1,93 @@ -#pragma once - -#include <library/cpp/lwtrace/all.h> - -#define YQ_CONTROL_PLANE_PROXY_PROVIDER(PROBE, EVENT, GROUPS, TYPES, NAMES) \ - PROBE(CreateQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - PROBE(ListQueriesRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - PROBE(DescribeQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ +#pragma once + +#include <library/cpp/lwtrace/all.h> + +#define YQ_CONTROL_PLANE_PROXY_PROVIDER(PROBE, EVENT, GROUPS, TYPES, NAMES) \ + PROBE(CreateQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + PROBE(ListQueriesRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + PROBE(DescribeQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ PROBE(GetQueryStatusRequest, \ GROUPS(), \ TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ - PROBE(ModifyQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ - PROBE(DeleteQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ - PROBE(ControlQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ - PROBE(GetResultDataRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, i32, i64, i64, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "queryId", "resultSetIndex", "offset", "limit", "latencyMs", "size", "success", "timeout")) \ - PROBE(ListJobsRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ + PROBE(ModifyQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ + PROBE(DeleteQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ + PROBE(ControlQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ + PROBE(GetResultDataRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, i32, i64, i64, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "queryId", "resultSetIndex", "offset", "limit", "latencyMs", "size", "success", "timeout")) \ + PROBE(ListJobsRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success", "timeout")) \ PROBE(DescribeJobRequest, \ GROUPS(), \ TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ NAMES("scope", "user", "jobId", "latencyMs", "size", "success", "timeout")) \ - PROBE(CreateConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - PROBE(ListConnectionsRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - PROBE(DescribeConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "connectionId", "latencyMs", "size", "success", "timeout")) \ - PROBE(ModifyConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "connectionId", "latencyMs", "size", "success", "timeout")) \ - PROBE(DeleteConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "connectionId", "latencyMs", "size", "success", "timeout")) \ - PROBE(TestConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - PROBE(CreateBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - PROBE(ListBindingsRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - PROBE(DescribeBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "bindingId", "latencyMs", "size", "success", "timeout")) \ - PROBE(ModifyBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "bindingId", "latencyMs", "size", "success", "timeout")) \ - PROBE(DeleteBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "bindingId", "latencyMs", "size", "success", "timeout")) \ - -// YQ_CONTROL_PLANE_PROXY_PROVIDER - -LWTRACE_DECLARE_PROVIDER(YQ_CONTROL_PLANE_PROXY_PROVIDER) + PROBE(CreateConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + PROBE(ListConnectionsRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + PROBE(DescribeConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "connectionId", "latencyMs", "size", "success", "timeout")) \ + PROBE(ModifyConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "connectionId", "latencyMs", "size", "success", "timeout")) \ + PROBE(DeleteConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "connectionId", "latencyMs", "size", "success", "timeout")) \ + PROBE(TestConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + PROBE(CreateBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + PROBE(ListBindingsRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + PROBE(DescribeBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "bindingId", "latencyMs", "size", "success", "timeout")) \ + PROBE(ModifyBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "bindingId", "latencyMs", "size", "success", "timeout")) \ + PROBE(DeleteBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "bindingId", "latencyMs", "size", "success", "timeout")) \ + +// YQ_CONTROL_PLANE_PROXY_PROVIDER + +LWTRACE_DECLARE_PROVIDER(YQ_CONTROL_PLANE_PROXY_PROVIDER) diff --git a/ydb/core/yq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp b/ydb/core/yq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp index 3d0c5bb70b..c57f1e2069 100644 --- a/ydb/core/yq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp +++ b/ydb/core/yq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp @@ -2,136 +2,136 @@ #include <ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.h> #include <ydb/core/yq/libs/control_plane_storage/control_plane_storage.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> -#include <ydb/core/yq/libs/test_connection/events/events.h> -#include <ydb/core/yq/libs/test_connection/test_connection.h> +#include <ydb/core/yq/libs/test_connection/events/events.h> +#include <ydb/core/yq/libs/test_connection/test_connection.h> #include <ydb/core/yq/libs/ydb/util.h> #include <ydb/core/yq/libs/ydb/ydb.h> - + #include <ydb/core/yq/libs/control_plane_proxy/events/events.h> - -#include <library/cpp/actors/core/executor_pool_basic.h> -#include <library/cpp/actors/core/scheduler_basic.h> -#include <library/cpp/testing/unittest/registar.h> - + +#include <library/cpp/actors/core/executor_pool_basic.h> +#include <library/cpp/actors/core/scheduler_basic.h> +#include <library/cpp/testing/unittest/registar.h> + #include <ydb/core/testlib/basics/runtime.h> #include <ydb/core/testlib/tablet_helpers.h> #include <ydb/core/base/path.h> - + #include <ydb/library/folder_service/folder_service.h> #include <ydb/library/folder_service/mock/mock_folder_service.h> - -#include <util/system/env.h> - -namespace NYq { - -using namespace NActors; -using namespace NKikimr; - -namespace { - -////////////////////////////////////////////////////// - -using TRuntimePtr = std::shared_ptr<TTestActorRuntime>; - -class TGrabActor: public TActor<TGrabActor> { - std::deque<NThreading::TPromise<TAutoPtr<IEventHandle>>> Futures; - std::deque<TAutoPtr<IEventHandle>> Inputs; - TMutex Mutex; - -public: - TRuntimePtr Runtime; - - TGrabActor(TRuntimePtr runtime) - : TActor(&TGrabActor::StateFunc) - , Runtime(runtime) - { } - - STFUNC(StateFunc) - { - Y_UNUSED(ctx); - TGuard<TMutex> lock(Mutex); - if (!Futures.empty()) { - auto front = Futures.front(); - Futures.pop_front(); - front.SetValue(ev); - return; - } - Inputs.push_back(ev); - } - - NThreading::TFuture<TAutoPtr<IEventHandle>> WaitRequest() - { - TGuard<TMutex> lock(Mutex); - if (!Inputs.empty()) { - auto front = Inputs.front(); - Inputs.pop_front(); - return NThreading::MakeFuture(front); - } - Futures.push_back(NThreading::NewPromise<TAutoPtr<IEventHandle>>()); - return Futures.back(); - } - - TAutoPtr<IEventHandle> GetRequest() - { - auto future = WaitRequest(); - while (!future.HasValue()) { - Runtime->DispatchEvents({}, TDuration::MilliSeconds(1)); - } - return future.GetValue(); - } -}; - -struct TTestBootstrap { - const TDuration RequestTimeout = TDuration::Seconds(10); - NConfig::TControlPlaneProxyConfig Config; - - TRuntimePtr Runtime; - TGrabActor* MetaStorageGrab; - TGrabActor* TestConnectionGrab; - - TTestBootstrap(const NConfig::TControlPlaneProxyConfig& config = {}) - : Config(config) - , Runtime(PrepareTestActorRuntime()) - { - } - - ~TTestBootstrap() - { - MetaStorageGrab->Runtime.reset(); - TestConnectionGrab->Runtime.reset(); - } - - void SendCreateQueryRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::CreateQueryRequest proto; - proto.mutable_content()->set_name("my_query_name"); - - auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateQueryRequest>("", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendListQueriesRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ListQueriesRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvListQueriesRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendDescribeQueryRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::DescribeQueryRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - + +#include <util/system/env.h> + +namespace NYq { + +using namespace NActors; +using namespace NKikimr; + +namespace { + +////////////////////////////////////////////////////// + +using TRuntimePtr = std::shared_ptr<TTestActorRuntime>; + +class TGrabActor: public TActor<TGrabActor> { + std::deque<NThreading::TPromise<TAutoPtr<IEventHandle>>> Futures; + std::deque<TAutoPtr<IEventHandle>> Inputs; + TMutex Mutex; + +public: + TRuntimePtr Runtime; + + TGrabActor(TRuntimePtr runtime) + : TActor(&TGrabActor::StateFunc) + , Runtime(runtime) + { } + + STFUNC(StateFunc) + { + Y_UNUSED(ctx); + TGuard<TMutex> lock(Mutex); + if (!Futures.empty()) { + auto front = Futures.front(); + Futures.pop_front(); + front.SetValue(ev); + return; + } + Inputs.push_back(ev); + } + + NThreading::TFuture<TAutoPtr<IEventHandle>> WaitRequest() + { + TGuard<TMutex> lock(Mutex); + if (!Inputs.empty()) { + auto front = Inputs.front(); + Inputs.pop_front(); + return NThreading::MakeFuture(front); + } + Futures.push_back(NThreading::NewPromise<TAutoPtr<IEventHandle>>()); + return Futures.back(); + } + + TAutoPtr<IEventHandle> GetRequest() + { + auto future = WaitRequest(); + while (!future.HasValue()) { + Runtime->DispatchEvents({}, TDuration::MilliSeconds(1)); + } + return future.GetValue(); + } +}; + +struct TTestBootstrap { + const TDuration RequestTimeout = TDuration::Seconds(10); + NConfig::TControlPlaneProxyConfig Config; + + TRuntimePtr Runtime; + TGrabActor* MetaStorageGrab; + TGrabActor* TestConnectionGrab; + + TTestBootstrap(const NConfig::TControlPlaneProxyConfig& config = {}) + : Config(config) + , Runtime(PrepareTestActorRuntime()) + { + } + + ~TTestBootstrap() + { + MetaStorageGrab->Runtime.reset(); + TestConnectionGrab->Runtime.reset(); + } + + void SendCreateQueryRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::CreateQueryRequest proto; + proto.mutable_content()->set_name("my_query_name"); + + auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateQueryRequest>("", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendListQueriesRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ListQueriesRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvListQueriesRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendDescribeQueryRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::DescribeQueryRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + void SendGetQueryStatusRequest(const TVector<TString>& permissions = {}) { TActorId sender = Runtime->AllocateEdgeActor(); @@ -142,57 +142,57 @@ struct TTestBootstrap { Runtime->DispatchEvents({}, TDuration::Zero()); } - void SendModifyQueryRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ModifyQueryRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendDeleteQueryRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::DeleteQueryRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendControlQueryRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ControlQueryRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvControlQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendGetResultDataRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::GetResultDataRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvGetResultDataRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendListJobsRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ListJobsRequest proto; - proto.set_query_id("my_query_id"); - - auto request = std::make_unique<TEvControlPlaneProxy::TEvListJobsRequest>("", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - + void SendModifyQueryRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ModifyQueryRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendDeleteQueryRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::DeleteQueryRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendControlQueryRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ControlQueryRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvControlQueryRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendGetResultDataRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::GetResultDataRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvGetResultDataRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendListJobsRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ListJobsRequest proto; + proto.set_query_id("my_query_id"); + + auto request = std::make_unique<TEvControlPlaneProxy::TEvListJobsRequest>("", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + void SendDescribeJobRequest(const TVector<TString>& permissions = {}) { TActorId sender = Runtime->AllocateEdgeActor(); @@ -203,218 +203,218 @@ struct TTestBootstrap { Runtime->DispatchEvents({}, TDuration::Zero()); } - void SendCreateConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::CreateConnectionRequest proto; - if (serviceAccountId) { - proto.mutable_content() - ->mutable_setting() - ->mutable_ydb_database() - ->mutable_auth() - ->mutable_service_account() - ->set_id(serviceAccountId); - } - - auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendListConnectionsRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ListConnectionsRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvListConnectionsRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendDescribeConnectionRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::DescribeConnectionRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendModifyConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ModifyConnectionRequest proto; - if (serviceAccountId) { - proto.mutable_content() - ->mutable_setting() - ->mutable_ydb_database() - ->mutable_auth() - ->mutable_service_account() - ->set_id(serviceAccountId); - } - - auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendDeleteConnectionRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::DeleteConnectionRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendTestConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::TestConnectionRequest proto; - if (serviceAccountId) { - proto.mutable_setting() - ->mutable_ydb_database() - ->mutable_auth() - ->mutable_service_account() - ->set_id(serviceAccountId); - } - - auto request = std::make_unique<TEvControlPlaneProxy::TEvTestConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendCreateBindingRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::CreateBindingRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendListBindingsRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ListBindingsRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvListBindingsRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendDescribeBindingRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::DescribeBindingRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendModifyBindingRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::ModifyBindingRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - void SendDeleteBindingRequest(const TVector<TString>& permissions = {}) - { - TActorId sender = Runtime->AllocateEdgeActor(); - YandexQuery::DeleteBindingRequest proto; - - auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); - Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); - Runtime->DispatchEvents({}, TDuration::Zero()); - } - - template<typename T> - std::pair<TAutoPtr<IEventHandle>, T*> Grab() - { - TAutoPtr<IEventHandle> handle; - T* event = Runtime->GrabEdgeEvent<T>(handle); - return {handle, event}; - } - - -private: - TRuntimePtr PrepareTestActorRuntime() - { - TRuntimePtr runtime(new TTestBasicRuntime()); - runtime->SetLogPriority(NKikimrServices::STREAMS_CONTROL_PLANE_SERVICE, NLog::PRI_DEBUG); - - auto controlPlaneProxy = CreateControlPlaneProxyActor(Config, MakeIntrusive<NMonitoring::TDynamicCounters>()); - runtime->AddLocalService( - ControlPlaneProxyActorId(), - TActorSetupCmd(controlPlaneProxy, TMailboxType::Simple, 0)); - + void SendCreateConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::CreateConnectionRequest proto; + if (serviceAccountId) { + proto.mutable_content() + ->mutable_setting() + ->mutable_ydb_database() + ->mutable_auth() + ->mutable_service_account() + ->set_id(serviceAccountId); + } + + auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendListConnectionsRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ListConnectionsRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvListConnectionsRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendDescribeConnectionRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::DescribeConnectionRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendModifyConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ModifyConnectionRequest proto; + if (serviceAccountId) { + proto.mutable_content() + ->mutable_setting() + ->mutable_ydb_database() + ->mutable_auth() + ->mutable_service_account() + ->set_id(serviceAccountId); + } + + auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendDeleteConnectionRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::DeleteConnectionRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendTestConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::TestConnectionRequest proto; + if (serviceAccountId) { + proto.mutable_setting() + ->mutable_ydb_database() + ->mutable_auth() + ->mutable_service_account() + ->set_id(serviceAccountId); + } + + auto request = std::make_unique<TEvControlPlaneProxy::TEvTestConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendCreateBindingRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::CreateBindingRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendListBindingsRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ListBindingsRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvListBindingsRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendDescribeBindingRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::DescribeBindingRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendModifyBindingRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::ModifyBindingRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + void SendDeleteBindingRequest(const TVector<TString>& permissions = {}) + { + TActorId sender = Runtime->AllocateEdgeActor(); + YandexQuery::DeleteBindingRequest proto; + + auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteBindingRequest>("my_folder", proto, "test_user@staff", "", permissions); + Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release())); + Runtime->DispatchEvents({}, TDuration::Zero()); + } + + template<typename T> + std::pair<TAutoPtr<IEventHandle>, T*> Grab() + { + TAutoPtr<IEventHandle> handle; + T* event = Runtime->GrabEdgeEvent<T>(handle); + return {handle, event}; + } + + +private: + TRuntimePtr PrepareTestActorRuntime() + { + TRuntimePtr runtime(new TTestBasicRuntime()); + runtime->SetLogPriority(NKikimrServices::STREAMS_CONTROL_PLANE_SERVICE, NLog::PRI_DEBUG); + + auto controlPlaneProxy = CreateControlPlaneProxyActor(Config, MakeIntrusive<NMonitoring::TDynamicCounters>()); + runtime->AddLocalService( + ControlPlaneProxyActorId(), + TActorSetupCmd(controlPlaneProxy, TMailboxType::Simple, 0)); + auto folderService = NKikimr::NFolderService::CreateMockFolderServiceActor(NKikimrProto::NFolderService::TFolderServiceConfig{}); - runtime->AddLocalService( + runtime->AddLocalService( NKikimr::NFolderService::FolderServiceActorId(), - TActorSetupCmd(folderService, TMailboxType::Simple, 0), - 0 - ); - - MetaStorageGrab = new TGrabActor(runtime); - runtime->AddLocalService( - ControlPlaneStorageServiceActorId(), - TActorSetupCmd(MetaStorageGrab, TMailboxType::Simple, 0), - 0 - ); - - TestConnectionGrab = new TGrabActor(runtime); - runtime->AddLocalService( - TestConnectionActorId(), - TActorSetupCmd(TestConnectionGrab, TMailboxType::Simple, 0), - 0 - ); - - SetupTabletServices(*runtime); - - return runtime; - } -}; - -} // namespace - -////////////////////////////////////////////////////// - -Y_UNIT_TEST_SUITE(TControlPlaneProxyTest) { - Y_UNIT_TEST(ShouldSendCreateQuery) - { - TTestBootstrap bootstrap; - bootstrap.SendCreateQueryRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateQueryRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Request.content().name(), "my_query_name"); - } - - Y_UNIT_TEST(ShouldSendListQueries) - { - TTestBootstrap bootstrap; - bootstrap.SendListQueriesRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListQueriesRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendDescribeQuery) - { - TTestBootstrap bootstrap; - bootstrap.SendDescribeQueryRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeQueryRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - + TActorSetupCmd(folderService, TMailboxType::Simple, 0), + 0 + ); + + MetaStorageGrab = new TGrabActor(runtime); + runtime->AddLocalService( + ControlPlaneStorageServiceActorId(), + TActorSetupCmd(MetaStorageGrab, TMailboxType::Simple, 0), + 0 + ); + + TestConnectionGrab = new TGrabActor(runtime); + runtime->AddLocalService( + TestConnectionActorId(), + TActorSetupCmd(TestConnectionGrab, TMailboxType::Simple, 0), + 0 + ); + + SetupTabletServices(*runtime); + + return runtime; + } +}; + +} // namespace + +////////////////////////////////////////////////////// + +Y_UNIT_TEST_SUITE(TControlPlaneProxyTest) { + Y_UNIT_TEST(ShouldSendCreateQuery) + { + TTestBootstrap bootstrap; + bootstrap.SendCreateQueryRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateQueryRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Request.content().name(), "my_query_name"); + } + + Y_UNIT_TEST(ShouldSendListQueries) + { + TTestBootstrap bootstrap; + bootstrap.SendListQueriesRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListQueriesRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendDescribeQuery) + { + TTestBootstrap bootstrap; + bootstrap.SendDescribeQueryRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeQueryRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + Y_UNIT_TEST(ShouldSendGetQueryStatus) { TTestBootstrap bootstrap; @@ -424,51 +424,51 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyTest) { UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); } - Y_UNIT_TEST(ShouldSendModifyQuery) - { - TTestBootstrap bootstrap; - bootstrap.SendModifyQueryRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyQueryRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendDeleteQuery) - { - TTestBootstrap bootstrap; - bootstrap.SendDeleteQueryRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteQueryRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendControlQuery) - { - TTestBootstrap bootstrap; - bootstrap.SendControlQueryRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvControlQueryRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendGetResultData) - { - TTestBootstrap bootstrap; - bootstrap.SendGetResultDataRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvGetResultDataRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendListJobs) - { - TTestBootstrap bootstrap; - bootstrap.SendListJobsRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListJobsRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Request.query_id(), "my_query_id"); - } - + Y_UNIT_TEST(ShouldSendModifyQuery) + { + TTestBootstrap bootstrap; + bootstrap.SendModifyQueryRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyQueryRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendDeleteQuery) + { + TTestBootstrap bootstrap; + bootstrap.SendDeleteQueryRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteQueryRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendControlQuery) + { + TTestBootstrap bootstrap; + bootstrap.SendControlQueryRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvControlQueryRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendGetResultData) + { + TTestBootstrap bootstrap; + bootstrap.SendGetResultDataRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvGetResultDataRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendListJobs) + { + TTestBootstrap bootstrap; + bootstrap.SendListJobsRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListJobsRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Request.query_id(), "my_query_id"); + } + Y_UNIT_TEST(ShouldSendDescribeJob) { TTestBootstrap bootstrap; @@ -478,137 +478,137 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyTest) { UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); } - Y_UNIT_TEST(ShouldSendCreateConnection) - { - TTestBootstrap bootstrap; - bootstrap.SendCreateConnectionRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendListConnections) - { - TTestBootstrap bootstrap; - bootstrap.SendListConnectionsRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListConnectionsRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendDescribeConnection) - { - TTestBootstrap bootstrap; - bootstrap.SendDescribeConnectionRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeConnectionRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendModifyConnection) - { - TTestBootstrap bootstrap; - bootstrap.SendModifyConnectionRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendDeleteConnection) - { - TTestBootstrap bootstrap; - bootstrap.SendDeleteConnectionRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteConnectionRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendTestConnection) - { - TTestBootstrap bootstrap; - bootstrap.SendTestConnectionRequest(); - auto request = bootstrap.TestConnectionGrab->GetRequest(); - auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendCreateBinding) - { - TTestBootstrap bootstrap; - bootstrap.SendCreateBindingRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateBindingRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendListBindings) - { - TTestBootstrap bootstrap; - bootstrap.SendListBindingsRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListBindingsRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendDescribeBinding) - { - TTestBootstrap bootstrap; - bootstrap.SendDescribeBindingRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeBindingRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendModifyBinding) - { - TTestBootstrap bootstrap; - bootstrap.SendModifyBindingRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyBindingRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } - - Y_UNIT_TEST(ShouldSendDeleteBinding) - { - TTestBootstrap bootstrap; - bootstrap.SendDeleteBindingRequest(); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteBindingRequest>(); - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - } -}; - -Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsFailed) { - Y_UNIT_TEST(ShouldSendCreateQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateQueryRequest(); + Y_UNIT_TEST(ShouldSendCreateConnection) + { + TTestBootstrap bootstrap; + bootstrap.SendCreateConnectionRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendListConnections) + { + TTestBootstrap bootstrap; + bootstrap.SendListConnectionsRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListConnectionsRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendDescribeConnection) + { + TTestBootstrap bootstrap; + bootstrap.SendDescribeConnectionRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeConnectionRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendModifyConnection) + { + TTestBootstrap bootstrap; + bootstrap.SendModifyConnectionRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendDeleteConnection) + { + TTestBootstrap bootstrap; + bootstrap.SendDeleteConnectionRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteConnectionRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendTestConnection) + { + TTestBootstrap bootstrap; + bootstrap.SendTestConnectionRequest(); + auto request = bootstrap.TestConnectionGrab->GetRequest(); + auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendCreateBinding) + { + TTestBootstrap bootstrap; + bootstrap.SendCreateBindingRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateBindingRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendListBindings) + { + TTestBootstrap bootstrap; + bootstrap.SendListBindingsRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListBindingsRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendDescribeBinding) + { + TTestBootstrap bootstrap; + bootstrap.SendDescribeBindingRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeBindingRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendModifyBinding) + { + TTestBootstrap bootstrap; + bootstrap.SendModifyBindingRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyBindingRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } + + Y_UNIT_TEST(ShouldSendDeleteBinding) + { + TTestBootstrap bootstrap; + bootstrap.SendDeleteBindingRequest(); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteBindingRequest>(); + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + } +}; + +Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsFailed) { + Y_UNIT_TEST(ShouldSendCreateQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateQueryRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateQueryResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendListQueries) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListQueriesRequest(); + } + + Y_UNIT_TEST(ShouldSendListQueries) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListQueriesRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListQueriesResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendDescribeQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeQueryRequest(); + } + + Y_UNIT_TEST(ShouldSendDescribeQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeQueryRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeQueryResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - + } + Y_UNIT_TEST(ShouldSendGetQueryStatus) { NConfig::TControlPlaneProxyConfig config; @@ -619,59 +619,59 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsFailed) { UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); } - Y_UNIT_TEST(ShouldSendModifyQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyQueryRequest(); + Y_UNIT_TEST(ShouldSendModifyQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyQueryRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyQueryResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendDeleteQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteQueryRequest(); + } + + Y_UNIT_TEST(ShouldSendDeleteQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteQueryRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteQueryResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendControlQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendControlQueryRequest(); + } + + Y_UNIT_TEST(ShouldSendControlQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendControlQueryRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvControlQueryResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendGetResultData) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendGetResultDataRequest(); + } + + Y_UNIT_TEST(ShouldSendGetResultData) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendGetResultDataRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvGetResultDataResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendListJobs) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListJobsRequest(); + } + + Y_UNIT_TEST(ShouldSendListJobs) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListJobsRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListJobsResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - + } + Y_UNIT_TEST(ShouldSendDescribeJob) { - NConfig::TControlPlaneProxyConfig config; + NConfig::TControlPlaneProxyConfig config; config.SetEnablePermissions(true); TTestBootstrap bootstrap(config); bootstrap.SendDescribeJobRequest(); @@ -679,208 +679,208 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsFailed) { UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); } - Y_UNIT_TEST(ShouldSendCreateConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateConnectionRequest(); - const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateConnectionResponse>(); - UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendCreateConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateConnectionRequest({"yq.connections.create@as"}, "my_sa_id"); + Y_UNIT_TEST(ShouldSendCreateConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateConnectionRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateConnectionResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendListConnections) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListConnectionsRequest(); + } + + Y_UNIT_TEST(ShouldSendCreateConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateConnectionRequest({"yq.connections.create@as"}, "my_sa_id"); + const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateConnectionResponse>(); + UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); + } + + Y_UNIT_TEST(ShouldSendListConnections) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListConnectionsRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListConnectionsResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendDescribeConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeConnectionRequest(); + } + + Y_UNIT_TEST(ShouldSendDescribeConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeConnectionRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeConnectionResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendModifyConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyConnectionRequest(); - const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyConnectionResponse>(); - UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendModifyConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyConnectionRequest({"yq.connections.update@as"}, "my_sa_id"); + } + + Y_UNIT_TEST(ShouldSendModifyConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyConnectionRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyConnectionResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendDeleteConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteConnectionRequest(); + } + + Y_UNIT_TEST(ShouldSendModifyConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyConnectionRequest({"yq.connections.update@as"}, "my_sa_id"); + const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyConnectionResponse>(); + UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); + } + + Y_UNIT_TEST(ShouldSendDeleteConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteConnectionRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteConnectionResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendTestConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendTestConnectionRequest(); - const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvTestConnectionResponse>(); - UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendTestConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendTestConnectionRequest({"yq.connections.create@as"}, "my_sa_id"); - const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvTestConnectionResponse>(); - UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendCreateBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateBindingRequest(); + } + + Y_UNIT_TEST(ShouldSendTestConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendTestConnectionRequest(); + const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvTestConnectionResponse>(); + UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); + } + + Y_UNIT_TEST(ShouldSendTestConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendTestConnectionRequest({"yq.connections.create@as"}, "my_sa_id"); + const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvTestConnectionResponse>(); + UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); + } + + Y_UNIT_TEST(ShouldSendCreateBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateBindingRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateBindingResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendListBindings) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListBindingsRequest(); + } + + Y_UNIT_TEST(ShouldSendListBindings) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListBindingsRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListBindingsResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendDescribeBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeBindingRequest(); + } + + Y_UNIT_TEST(ShouldSendDescribeBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeBindingRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeBindingResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendModifyBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyBindingRequest(); + } + + Y_UNIT_TEST(ShouldSendModifyBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyBindingRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyBindingResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } - - Y_UNIT_TEST(ShouldSendDeleteBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteBindingRequest(); + } + + Y_UNIT_TEST(ShouldSendDeleteBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteBindingRequest(); const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteBindingResponse>(); UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission"); - } -}; - -Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsSuccess) { - Y_UNIT_TEST(ShouldSendCreateQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateQueryRequest({"yq.queries.create@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Request.content().name(), "my_query_name"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListQueries) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListQueriesRequest({"yq.queries.get@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListQueriesRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDescribeQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeQueryRequest({"yq.queries.get@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - + } +}; + +Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsSuccess) { + Y_UNIT_TEST(ShouldSendCreateQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateQueryRequest({"yq.queries.create@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Request.content().name(), "my_query_name"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListQueries) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListQueriesRequest({"yq.queries.get@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListQueriesRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDescribeQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeQueryRequest({"yq.queries.get@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + Y_UNIT_TEST(ShouldSendGetQueryStatus) { NConfig::TControlPlaneProxyConfig config; @@ -901,965 +901,965 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsSuccess) { UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); } - Y_UNIT_TEST(ShouldSendModifyQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyQueryRequest({"yq.queries.update@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDeleteQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteQueryRequest({"yq.queries.delete@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendControlQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendControlQueryRequest({"yq.queries.control@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvControlQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendGetResultData) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendGetResultDataRequest({"yq.queries.getData@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvGetResultDataRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListJobs) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListJobsRequest({"yq.jobs.get@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListJobsRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Request.query_id(), "my_query_id"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - + Y_UNIT_TEST(ShouldSendModifyQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyQueryRequest({"yq.queries.update@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDeleteQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteQueryRequest({"yq.queries.delete@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendControlQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendControlQueryRequest({"yq.queries.control@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvControlQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendGetResultData) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendGetResultDataRequest({"yq.queries.getData@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvGetResultDataRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListJobs) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListJobsRequest({"yq.jobs.get@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListJobsRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Request.query_id(), "my_query_id"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + Y_UNIT_TEST(ShouldSendDescribeJob) { - NConfig::TControlPlaneProxyConfig config; + NConfig::TControlPlaneProxyConfig config; config.SetEnablePermissions(true); TTestBootstrap bootstrap(config); bootstrap.SendDescribeJobRequest({"yq.jobs.get@as"}); auto request = bootstrap.MetaStorageGrab->GetRequest(); auto event = request->Get<TEvControlPlaneStorage::TEvDescribeJobRequest>(); - auto permissions = event->Permissions; + auto permissions = event->Permissions; UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendCreateConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateConnectionRequest({"yq.connections.create@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendCreateConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateConnectionRequest({"yq.connections.create@as", "iam.serviceAccounts.use@as"}, "my_sa_id"); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListConnections) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListConnectionsRequest({"yq.connections.get@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListConnectionsRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDescribeConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeConnectionRequest({"yq.connections.get@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendModifyConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyConnectionRequest({"yq.connections.update@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendModifyConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyConnectionRequest({"yq.connections.update@as", "iam.serviceAccounts.use@as"}, "my_sa_id"); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDeleteConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteConnectionRequest({"yq.connections.delete@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendTestConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendTestConnectionRequest({"yq.connections.create@as"}); - auto request = bootstrap.TestConnectionGrab->GetRequest(); - auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendTestConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendTestConnectionRequest({"yq.connections.create@as", "iam.serviceAccounts.use@as"}, "my_sa_id"); - auto request = bootstrap.TestConnectionGrab->GetRequest(); - auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendCreateBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateBindingRequest({"yq.bindings.create@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListBindings) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListBindingsRequest({"yq.bindings.get@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListBindingsRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDescribeBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeBindingRequest({"yq.bindings.get@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendModifyBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyBindingRequest({"yq.bindings.update@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDeleteBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteBindingRequest({"yq.bindings.delete@as"}); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } -}; - -Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsControlPlaneStorageSuccess) { - Y_UNIT_TEST(ShouldSendCreateQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateQueryRequest({ - "yq.queries.create@as", - "yq.queries.invoke@as", - "yq.connections.use@as", - "yq.bindings.use@as", - "yq.resources.managePublic@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Request.content().name(), "my_query_name"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListQueries) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListQueriesRequest({ - "yq.queries.get@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListQueriesRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDescribeQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeQueryRequest({ - "yq.queries.get@as", - "yq.queries.viewAst@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendModifyQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyQueryRequest({ - "yq.queries.update@as", - "yq.queries.invoke@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as", - "yq.connections.use@as", - "yq.bindings.use@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDeleteQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteQueryRequest({ - "yq.queries.delete@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendControlQuery) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendControlQueryRequest({ - "yq.queries.control@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvControlQueryRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendGetResultData) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendGetResultDataRequest({ - "yq.queries.getData@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvGetResultDataRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListJobs) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListJobsRequest({ - "yq.jobs.get@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListJobsRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Request.query_id(), "my_query_id"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDescribeJob) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeJobRequest({ - "yq.jobs.get@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeJobRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendCreateConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateConnectionRequest({ - "yq.connections.create@as", - "yq.resources.managePublic@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendCreateConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateConnectionRequest({ - "yq.connections.create@as", - "iam.serviceAccounts.use@as", - "yq.resources.managePublic@as" - }, "my_sa_id"); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListConnections) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListConnectionsRequest({ - "yq.connections.get@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListConnectionsRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDescribeConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeConnectionRequest({ - "yq.connections.get@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendModifyConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyConnectionRequest({ - "yq.connections.update@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendModifyConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyConnectionRequest({ - "yq.connections.update@as", - "iam.serviceAccounts.use@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as" - }, "my_sa_id"); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDeleteConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteConnectionRequest({ - "yq.connections.delete@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendTestConnection) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendTestConnectionRequest({ - "yq.connections.create@as", - "yq.resources.managePublic@as" - }); - - auto request = bootstrap.TestConnectionGrab->GetRequest(); - auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendTestConnectionWithServiceAccount) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendTestConnectionRequest({ - "yq.connections.create@as", - "iam.serviceAccounts.use@as", - "yq.resources.managePublic@as" - }, "my_sa_id"); - - auto request = bootstrap.TestConnectionGrab->GetRequest(); - auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendCreateBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendCreateBindingRequest({ - "yq.bindings.create@as", - "yq.resources.managePublic@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvCreateBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendListBindings) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendListBindingsRequest({ - "yq.bindings.get@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvListBindingsRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDescribeBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDescribeBindingRequest({ - "yq.bindings.get@as", - "yq.resources.viewPublic@as", - "yq.resources.viewPrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDescribeBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendModifyBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendModifyBindingRequest({ - "yq.bindings.update@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvModifyBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } - - Y_UNIT_TEST(ShouldSendDeleteBinding) - { - NConfig::TControlPlaneProxyConfig config; - config.SetEnablePermissions(true); - TTestBootstrap bootstrap(config); - bootstrap.SendDeleteBindingRequest({ - "yq.bindings.delete@as", - "yq.resources.managePublic@as", - "yq.resources.managePrivate@as" - }); - auto request = bootstrap.MetaStorageGrab->GetRequest(); - auto event = request->Get<TEvControlPlaneStorage::TEvDeleteBindingRequest>(); - auto permissions = event->Permissions; - UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); - UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); - UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); - UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); - } -}; - -} // namespace NYq + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendCreateConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateConnectionRequest({"yq.connections.create@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendCreateConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateConnectionRequest({"yq.connections.create@as", "iam.serviceAccounts.use@as"}, "my_sa_id"); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListConnections) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListConnectionsRequest({"yq.connections.get@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListConnectionsRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDescribeConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeConnectionRequest({"yq.connections.get@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendModifyConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyConnectionRequest({"yq.connections.update@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendModifyConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyConnectionRequest({"yq.connections.update@as", "iam.serviceAccounts.use@as"}, "my_sa_id"); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDeleteConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteConnectionRequest({"yq.connections.delete@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendTestConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendTestConnectionRequest({"yq.connections.create@as"}); + auto request = bootstrap.TestConnectionGrab->GetRequest(); + auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendTestConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendTestConnectionRequest({"yq.connections.create@as", "iam.serviceAccounts.use@as"}, "my_sa_id"); + auto request = bootstrap.TestConnectionGrab->GetRequest(); + auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendCreateBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateBindingRequest({"yq.bindings.create@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListBindings) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListBindingsRequest({"yq.bindings.get@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListBindingsRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDescribeBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeBindingRequest({"yq.bindings.get@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendModifyBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyBindingRequest({"yq.bindings.update@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDeleteBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteBindingRequest({"yq.bindings.delete@as"}); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } +}; + +Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsControlPlaneStorageSuccess) { + Y_UNIT_TEST(ShouldSendCreateQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateQueryRequest({ + "yq.queries.create@as", + "yq.queries.invoke@as", + "yq.connections.use@as", + "yq.bindings.use@as", + "yq.resources.managePublic@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Request.content().name(), "my_query_name"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListQueries) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListQueriesRequest({ + "yq.queries.get@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListQueriesRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDescribeQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeQueryRequest({ + "yq.queries.get@as", + "yq.queries.viewAst@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendModifyQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyQueryRequest({ + "yq.queries.update@as", + "yq.queries.invoke@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as", + "yq.connections.use@as", + "yq.bindings.use@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDeleteQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteQueryRequest({ + "yq.queries.delete@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendControlQuery) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendControlQueryRequest({ + "yq.queries.control@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvControlQueryRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendGetResultData) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendGetResultDataRequest({ + "yq.queries.getData@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvGetResultDataRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListJobs) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListJobsRequest({ + "yq.jobs.get@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListJobsRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Request.query_id(), "my_query_id"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDescribeJob) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeJobRequest({ + "yq.jobs.get@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeJobRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendCreateConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateConnectionRequest({ + "yq.connections.create@as", + "yq.resources.managePublic@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendCreateConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateConnectionRequest({ + "yq.connections.create@as", + "iam.serviceAccounts.use@as", + "yq.resources.managePublic@as" + }, "my_sa_id"); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListConnections) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListConnectionsRequest({ + "yq.connections.get@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListConnectionsRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDescribeConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeConnectionRequest({ + "yq.connections.get@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendModifyConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyConnectionRequest({ + "yq.connections.update@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendModifyConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyConnectionRequest({ + "yq.connections.update@as", + "iam.serviceAccounts.use@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as" + }, "my_sa_id"); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDeleteConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteConnectionRequest({ + "yq.connections.delete@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendTestConnection) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendTestConnectionRequest({ + "yq.connections.create@as", + "yq.resources.managePublic@as" + }); + + auto request = bootstrap.TestConnectionGrab->GetRequest(); + auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendTestConnectionWithServiceAccount) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendTestConnectionRequest({ + "yq.connections.create@as", + "iam.serviceAccounts.use@as", + "yq.resources.managePublic@as" + }, "my_sa_id"); + + auto request = bootstrap.TestConnectionGrab->GetRequest(); + auto event = request->Get<TEvTestConnection::TEvTestConnectionRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendCreateBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendCreateBindingRequest({ + "yq.bindings.create@as", + "yq.resources.managePublic@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvCreateBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendListBindings) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendListBindingsRequest({ + "yq.bindings.get@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvListBindingsRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDescribeBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDescribeBindingRequest({ + "yq.bindings.get@as", + "yq.resources.viewPublic@as", + "yq.resources.viewPrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDescribeBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendModifyBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendModifyBindingRequest({ + "yq.bindings.update@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvModifyBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } + + Y_UNIT_TEST(ShouldSendDeleteBinding) + { + NConfig::TControlPlaneProxyConfig config; + config.SetEnablePermissions(true); + TTestBootstrap bootstrap(config); + bootstrap.SendDeleteBindingRequest({ + "yq.bindings.delete@as", + "yq.resources.managePublic@as", + "yq.resources.managePrivate@as" + }); + auto request = bootstrap.MetaStorageGrab->GetRequest(); + auto event = request->Get<TEvControlPlaneStorage::TEvDeleteBindingRequest>(); + auto permissions = event->Permissions; + UNIT_ASSERT_VALUES_EQUAL(event->Scope, "yandexcloud://my_folder"); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PUBLIC)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::VIEW_AST)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PUBLIC)); + UNIT_ASSERT(permissions.Check(TPermissions::MANAGE_PRIVATE)); + UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE)); + UNIT_ASSERT(!permissions.Check(TPermissions::QUERY_INVOKE)); + } +}; + +} // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_proxy/ut/ya.make b/ydb/core/yq/libs/control_plane_proxy/ut/ya.make index 1550392ebc..474bff7a49 100644 --- a/ydb/core/yq/libs/control_plane_proxy/ut/ya.make +++ b/ydb/core/yq/libs/control_plane_proxy/ut/ya.make @@ -1,22 +1,22 @@ UNITTEST_FOR(ydb/core/yq/libs/control_plane_proxy) - + OWNER(g:yq) - -PEERDIR( + +PEERDIR( library/cpp/testing/unittest ydb/core/base ydb/core/testlib ydb/core/yq/libs/actors/logging ydb/core/yq/libs/control_plane_storage - ydb/core/yq/libs/test_connection + ydb/core/yq/libs/test_connection ydb/library/folder_service ydb/library/folder_service/mock -) - -YQL_LAST_ABI_VERSION() - -SRCS( - control_plane_proxy_ut.cpp -) - -END() +) + +YQL_LAST_ABI_VERSION() + +SRCS( + control_plane_proxy_ut.cpp +) + +END() diff --git a/ydb/core/yq/libs/control_plane_proxy/utils.h b/ydb/core/yq/libs/control_plane_proxy/utils.h index 96e901b5f8..df0961cff5 100644 --- a/ydb/core/yq/libs/control_plane_proxy/utils.h +++ b/ydb/core/yq/libs/control_plane_proxy/utils.h @@ -1,48 +1,48 @@ -#pragma once - +#pragma once + #include <ydb/public/api/protos/yq.pb.h> - -namespace NYq { - -inline TString GetServiceAccountId(const YandexQuery::IamAuth& auth) { - return auth.has_service_account() - ? auth.service_account().id() - : TString{}; -} - -template<typename T> -TString ExtractServiceAccountIdImpl(const T& setting) { - switch (setting.connection_case()) { - case YandexQuery::ConnectionSetting::kYdbDatabase: { - return GetServiceAccountId(setting.ydb_database().auth()); - } - case YandexQuery::ConnectionSetting::kDataStreams: { - return GetServiceAccountId(setting.data_streams().auth()); - } - case YandexQuery::ConnectionSetting::kObjectStorage: { - return GetServiceAccountId(setting.object_storage().auth()); - } - case YandexQuery::ConnectionSetting::kMonitoring: { - return GetServiceAccountId(setting.monitoring().auth()); - } - case YandexQuery::ConnectionSetting::kClickhouseCluster: { - return GetServiceAccountId(setting.clickhouse_cluster().auth()); - } - // Do not replace with default. Adding a new connection should cause a compilation error - case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: - break; - } - return {}; -} - -inline TString ExtractServiceAccountId(const YandexQuery::TestConnectionRequest& c) { - return ExtractServiceAccountIdImpl(c.setting()); -} - + +namespace NYq { + +inline TString GetServiceAccountId(const YandexQuery::IamAuth& auth) { + return auth.has_service_account() + ? auth.service_account().id() + : TString{}; +} + +template<typename T> +TString ExtractServiceAccountIdImpl(const T& setting) { + switch (setting.connection_case()) { + case YandexQuery::ConnectionSetting::kYdbDatabase: { + return GetServiceAccountId(setting.ydb_database().auth()); + } + case YandexQuery::ConnectionSetting::kDataStreams: { + return GetServiceAccountId(setting.data_streams().auth()); + } + case YandexQuery::ConnectionSetting::kObjectStorage: { + return GetServiceAccountId(setting.object_storage().auth()); + } + case YandexQuery::ConnectionSetting::kMonitoring: { + return GetServiceAccountId(setting.monitoring().auth()); + } + case YandexQuery::ConnectionSetting::kClickhouseCluster: { + return GetServiceAccountId(setting.clickhouse_cluster().auth()); + } + // Do not replace with default. Adding a new connection should cause a compilation error + case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: + break; + } + return {}; +} + +inline TString ExtractServiceAccountId(const YandexQuery::TestConnectionRequest& c) { + return ExtractServiceAccountIdImpl(c.setting()); +} + inline TString ExtractServiceAccountId(const YandexQuery::CreateConnectionRequest& c) { - return ExtractServiceAccountIdImpl(c.content().setting()); -} - + return ExtractServiceAccountIdImpl(c.content().setting()); +} + inline TString ExtractServiceAccountId(const YandexQuery::ModifyConnectionRequest& c) { return ExtractServiceAccountIdImpl(c.content().setting()); } @@ -52,4 +52,4 @@ TString ExtractServiceAccountId(const T&) { return {}; } -} // namespace NYq +} // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_proxy/ya.make b/ydb/core/yq/libs/control_plane_proxy/ya.make index 785bc92f28..0e462250d5 100644 --- a/ydb/core/yq/libs/control_plane_proxy/ya.make +++ b/ydb/core/yq/libs/control_plane_proxy/ya.make @@ -1,14 +1,14 @@ OWNER(g:yq) - -LIBRARY() - -SRCS( - control_plane_proxy.cpp - probes.cpp -) - -PEERDIR( - library/cpp/actors/core + +LIBRARY() + +SRCS( + control_plane_proxy.cpp + probes.cpp +) + +PEERDIR( + library/cpp/actors/core ydb/core/base ydb/core/mon ydb/core/yq/libs/actors/logging @@ -17,16 +17,16 @@ PEERDIR( ydb/core/yq/libs/control_plane_storage ydb/library/folder_service ydb/library/security -) - -YQL_LAST_ABI_VERSION() - -END() - -RECURSE( - events -) - +) + +YQL_LAST_ABI_VERSION() + +END() + +RECURSE( + events +) + RECURSE_FOR_TESTS( ut ) diff --git a/ydb/core/yq/libs/control_plane_storage/control_plane_storage.h b/ydb/core/yq/libs/control_plane_storage/control_plane_storage.h index 5180aedeea..43fecf247b 100644 --- a/ydb/core/yq/libs/control_plane_storage/control_plane_storage.h +++ b/ydb/core/yq/libs/control_plane_storage/control_plane_storage.h @@ -1,48 +1,48 @@ -#pragma once - -#include <library/cpp/actors/core/actor.h> -#include <library/cpp/monlib/dynamic_counters/counters.h> - +#pragma once + +#include <library/cpp/actors/core/actor.h> +#include <library/cpp/monlib/dynamic_counters/counters.h> + #include <ydb/core/yq/libs/config/protos/common.pb.h> #include <ydb/core/yq/libs/config/protos/control_plane_storage.pb.h> #include <ydb/core/yq/libs/shared_resources/shared_resources.h> #include <ydb/core/yq/libs/actors/logging/log.h> - -#define CPS_LOG_D(s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_DEBUG(s) -#define CPS_LOG_I(s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_INFO(s) -#define CPS_LOG_W(s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_WARN(s) -#define CPS_LOG_E(s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_ERROR(s) -#define CPS_LOG_T(s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_TRACE(s) - - -#define CPS_LOG_AS_D(a, s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_AS_DEBUG(a, s) -#define CPS_LOG_AS_I(a, s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_AS_INFO(a, s) -#define CPS_LOG_AS_W(a, s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_AS_WARN(a, s) -#define CPS_LOG_AS_E(a, s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_AS_ERROR(a, s) -#define CPS_LOG_AS_T(a, s) \ - LOG_YQ_CONTROL_PLANE_STORAGE_AS_TRACE(a, s) - - -namespace NYq { - -NActors::TActorId ControlPlaneStorageServiceActorId(ui32 nodeId = 0); - -NActors::IActor* CreateInMemoryControlPlaneStorageServiceActor(const NConfig::TControlPlaneStorageConfig& config); - + +#define CPS_LOG_D(s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_DEBUG(s) +#define CPS_LOG_I(s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_INFO(s) +#define CPS_LOG_W(s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_WARN(s) +#define CPS_LOG_E(s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_ERROR(s) +#define CPS_LOG_T(s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_TRACE(s) + + +#define CPS_LOG_AS_D(a, s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_AS_DEBUG(a, s) +#define CPS_LOG_AS_I(a, s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_AS_INFO(a, s) +#define CPS_LOG_AS_W(a, s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_AS_WARN(a, s) +#define CPS_LOG_AS_E(a, s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_AS_ERROR(a, s) +#define CPS_LOG_AS_T(a, s) \ + LOG_YQ_CONTROL_PLANE_STORAGE_AS_TRACE(a, s) + + +namespace NYq { + +NActors::TActorId ControlPlaneStorageServiceActorId(ui32 nodeId = 0); + +NActors::IActor* CreateInMemoryControlPlaneStorageServiceActor(const NConfig::TControlPlaneStorageConfig& config); + NActors::IActor* CreateYdbControlPlaneStorageServiceActor( - const NConfig::TControlPlaneStorageConfig& config, - const NConfig::TCommonConfig& common, + const NConfig::TControlPlaneStorageConfig& config, + const NConfig::TCommonConfig& common, const NMonitoring::TDynamicCounterPtr& counters, const NYq::TYqSharedResources::TPtr& yqSharedResources, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory); - -} // namespace NYq + +} // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_storage/events/events.cpp b/ydb/core/yq/libs/control_plane_storage/events/events.cpp index 6c3d2603e7..a4930159cf 100644 --- a/ydb/core/yq/libs/control_plane_storage/events/events.cpp +++ b/ydb/core/yq/libs/control_plane_storage/events/events.cpp @@ -1 +1 @@ -#include "events.h" +#include "events.h" diff --git a/ydb/core/yq/libs/control_plane_storage/events/events.h b/ydb/core/yq/libs/control_plane_storage/events/events.h index 8c98e790d7..4dabc3544d 100644 --- a/ydb/core/yq/libs/control_plane_storage/events/events.h +++ b/ydb/core/yq/libs/control_plane_storage/events/events.h @@ -1,272 +1,272 @@ -#pragma once - +#pragma once + #include <util/datetime/base.h> -#include <util/generic/map.h> -#include <util/generic/maybe.h> - -#include <library/cpp/actors/core/event_pb.h> -#include <library/cpp/actors/core/events.h> -#include <library/cpp/actors/interconnect/events_local.h> - +#include <util/generic/map.h> +#include <util/generic/maybe.h> + +#include <library/cpp/actors/core/event_pb.h> +#include <library/cpp/actors/core/events.h> +#include <library/cpp/actors/interconnect/events_local.h> + #include <ydb/public/api/protos/draft/yq_private.pb.h> #include <ydb/public/api/protos/yq.pb.h> #include <ydb/public/sdk/cpp/client/ydb_params/params.h> - + #include <ydb/library/yql/public/issue/yql_issue.h> - + #include <ydb/core/yq/libs/control_plane_storage/proto/yq_internal.pb.h> #include <ydb/core/yq/libs/events/event_subspace.h> - -namespace NYq { - -template<typename T> -struct TAuditDetails { - TMaybe<T> Before; - TMaybe<T> After; - bool IdempotencyResult = false; - TString CloudId; -}; - + +namespace NYq { + +template<typename T> +struct TAuditDetails { + TMaybe<T> Before; + TMaybe<T> After; + bool IdempotencyResult = false; + TString CloudId; +}; + struct TNodeInfo { ui32 NodeId; TString InstanceId; TString HostName; }; -struct TDebugItem { - TString Query; - NYdb::TParams Params; - TString Plan; - TString Ast; - TString Error; - - TString ToString() const { - TString result; - result += "Query: " + Query + "\n"; - result += "Plan: " + Plan + "\n"; - result += "Ast: " + Ast + "\n"; - for (const auto& param: Params.GetValues()) { - result += "Params: " + param.first + ", " + param.second.GetType().ToString() + "\n"; - } - result += "Error: " + Error + "\n"; - return result; - } -}; - -using TDebugInfo = TVector<TDebugItem>; -using TDebugInfoPtr = std::shared_ptr<TDebugInfo>; - -struct TPermissions { - enum TPermission { - VIEW_PUBLIC = 0x1, - VIEW_PRIVATE = 0x2, - VIEW_AST = 0x4, - MANAGE_PUBLIC = 0x8, - MANAGE_PRIVATE = 0x10, - CONNECTIONS_USE = 0x40, - BINDINGS_USE = 0x80, - QUERY_INVOKE = 0x100 - }; - -private: - uint32_t Permissions = 0; - -public: - TPermissions() - {} - - explicit TPermissions(uint32_t permissions) - : Permissions(permissions) - {} - - void Set(TPermission permission) { - Permissions |= permission; - } - - bool Check(TPermission permission) const { - return Permissions & permission; - } - - void SetAll() { - Permissions = 0xFFFFFFFF; - } -}; - -struct TEvControlPlaneStorage { - // Event ids. - enum EEv : ui32 { +struct TDebugItem { + TString Query; + NYdb::TParams Params; + TString Plan; + TString Ast; + TString Error; + + TString ToString() const { + TString result; + result += "Query: " + Query + "\n"; + result += "Plan: " + Plan + "\n"; + result += "Ast: " + Ast + "\n"; + for (const auto& param: Params.GetValues()) { + result += "Params: " + param.first + ", " + param.second.GetType().ToString() + "\n"; + } + result += "Error: " + Error + "\n"; + return result; + } +}; + +using TDebugInfo = TVector<TDebugItem>; +using TDebugInfoPtr = std::shared_ptr<TDebugInfo>; + +struct TPermissions { + enum TPermission { + VIEW_PUBLIC = 0x1, + VIEW_PRIVATE = 0x2, + VIEW_AST = 0x4, + MANAGE_PUBLIC = 0x8, + MANAGE_PRIVATE = 0x10, + CONNECTIONS_USE = 0x40, + BINDINGS_USE = 0x80, + QUERY_INVOKE = 0x100 + }; + +private: + uint32_t Permissions = 0; + +public: + TPermissions() + {} + + explicit TPermissions(uint32_t permissions) + : Permissions(permissions) + {} + + void Set(TPermission permission) { + Permissions |= permission; + } + + bool Check(TPermission permission) const { + return Permissions & permission; + } + + void SetAll() { + Permissions = 0xFFFFFFFF; + } +}; + +struct TEvControlPlaneStorage { + // Event ids. + enum EEv : ui32 { EvCreateQueryRequest = YqEventSubspaceBegin(NYq::TYqEventSubspace::ControlPlaneStorage), - EvCreateQueryResponse, - EvListQueriesRequest, - EvListQueriesResponse, - EvDescribeQueryRequest, - EvDescribeQueryResponse, + EvCreateQueryResponse, + EvListQueriesRequest, + EvListQueriesResponse, + EvDescribeQueryRequest, + EvDescribeQueryResponse, EvGetQueryStatusRequest, EvGetQueryStatusResponse, - EvModifyQueryRequest, - EvModifyQueryResponse, - EvDeleteQueryRequest, - EvDeleteQueryResponse, - EvControlQueryRequest, + EvModifyQueryRequest, + EvModifyQueryResponse, + EvDeleteQueryRequest, + EvDeleteQueryResponse, + EvControlQueryRequest, EvControlQueryResponse, - EvGetResultDataRequest, - EvGetResultDataResponse, - EvListJobsRequest, - EvListJobsResponse, + EvGetResultDataRequest, + EvGetResultDataResponse, + EvListJobsRequest, + EvListJobsResponse, EvDescribeJobRequest, EvDescribeJobResponse, - EvCreateConnectionRequest, - EvCreateConnectionResponse, - EvListConnectionsRequest, - EvListConnectionsResponse, - EvDescribeConnectionRequest, - EvDescribeConnectionResponse, - EvModifyConnectionRequest, - EvModifyConnectionResponse, - EvDeleteConnectionRequest, - EvDeleteConnectionResponse, - EvCreateBindingRequest, - EvCreateBindingResponse, - EvListBindingsRequest, - EvListBindingsResponse, - EvDescribeBindingRequest, - EvDescribeBindingResponse, - EvModifyBindingRequest, - EvModifyBindingResponse, - EvDeleteBindingRequest, - EvDeleteBindingResponse, - EvWriteResultDataRequest, - EvWriteResultDataResponse, - EvGetTaskRequest, - EvGetTaskResponse, - EvPingTaskRequest, - EvPingTaskResponse, + EvCreateConnectionRequest, + EvCreateConnectionResponse, + EvListConnectionsRequest, + EvListConnectionsResponse, + EvDescribeConnectionRequest, + EvDescribeConnectionResponse, + EvModifyConnectionRequest, + EvModifyConnectionResponse, + EvDeleteConnectionRequest, + EvDeleteConnectionResponse, + EvCreateBindingRequest, + EvCreateBindingResponse, + EvListBindingsRequest, + EvListBindingsResponse, + EvDescribeBindingRequest, + EvDescribeBindingResponse, + EvModifyBindingRequest, + EvModifyBindingResponse, + EvDeleteBindingRequest, + EvDeleteBindingResponse, + EvWriteResultDataRequest, + EvWriteResultDataResponse, + EvGetTaskRequest, + EvGetTaskResponse, + EvPingTaskRequest, + EvPingTaskResponse, EvNodesHealthCheckRequest, EvNodesHealthCheckResponse, EvGetHealthNodesRequest, EvGetHealthNodesResponse, - EvEnd, - }; - + EvEnd, + }; + static_assert(EvEnd <= YqEventSubspaceEnd(NYq::TYqEventSubspace::ControlPlaneStorage), "All events must be in their subspace"); - - struct TEvCreateQueryRequest : NActors::TEventLocal<TEvCreateQueryRequest, EvCreateQueryRequest> { - explicit TEvCreateQueryRequest(const TString& scope, - const YandexQuery::CreateQueryRequest& request, - const TString& user, - const TString& token, - const TString& cloudId, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , CloudId(cloudId) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::CreateQueryRequest Request; - TString User; - TString Token; - TString CloudId; - TPermissions Permissions; - }; - - struct TEvCreateQueryResponse : NActors::TEventLocal<TEvCreateQueryResponse, EvCreateQueryResponse> { - explicit TEvCreateQueryResponse(const YandexQuery::CreateQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvCreateQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::CreateQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvListQueriesRequest : NActors::TEventLocal<TEvListQueriesRequest, EvListQueriesRequest> { - explicit TEvListQueriesRequest(const TString& scope, - const YandexQuery::ListQueriesRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ListQueriesRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvListQueriesResponse : NActors::TEventLocal<TEvListQueriesResponse, EvListQueriesResponse> { - explicit TEvListQueriesResponse(const YandexQuery::ListQueriesResult& result) - : Result(result) - { - } - - explicit TEvListQueriesResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListQueriesResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvDescribeQueryRequest : NActors::TEventLocal<TEvDescribeQueryRequest, EvDescribeQueryRequest> { - explicit TEvDescribeQueryRequest(const TString& scope, - const YandexQuery::DescribeQueryRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::DescribeQueryRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvDescribeQueryResponse : NActors::TEventLocal<TEvDescribeQueryResponse, EvDescribeQueryResponse> { - explicit TEvDescribeQueryResponse(const YandexQuery::DescribeQueryResult& result) - : Result(result) - { - } - - explicit TEvDescribeQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DescribeQueryResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - + + struct TEvCreateQueryRequest : NActors::TEventLocal<TEvCreateQueryRequest, EvCreateQueryRequest> { + explicit TEvCreateQueryRequest(const TString& scope, + const YandexQuery::CreateQueryRequest& request, + const TString& user, + const TString& token, + const TString& cloudId, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , CloudId(cloudId) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::CreateQueryRequest Request; + TString User; + TString Token; + TString CloudId; + TPermissions Permissions; + }; + + struct TEvCreateQueryResponse : NActors::TEventLocal<TEvCreateQueryResponse, EvCreateQueryResponse> { + explicit TEvCreateQueryResponse(const YandexQuery::CreateQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvCreateQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::CreateQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvListQueriesRequest : NActors::TEventLocal<TEvListQueriesRequest, EvListQueriesRequest> { + explicit TEvListQueriesRequest(const TString& scope, + const YandexQuery::ListQueriesRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ListQueriesRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvListQueriesResponse : NActors::TEventLocal<TEvListQueriesResponse, EvListQueriesResponse> { + explicit TEvListQueriesResponse(const YandexQuery::ListQueriesResult& result) + : Result(result) + { + } + + explicit TEvListQueriesResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListQueriesResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvDescribeQueryRequest : NActors::TEventLocal<TEvDescribeQueryRequest, EvDescribeQueryRequest> { + explicit TEvDescribeQueryRequest(const TString& scope, + const YandexQuery::DescribeQueryRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::DescribeQueryRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvDescribeQueryResponse : NActors::TEventLocal<TEvDescribeQueryResponse, EvDescribeQueryResponse> { + explicit TEvDescribeQueryResponse(const YandexQuery::DescribeQueryResult& result) + : Result(result) + { + } + + explicit TEvDescribeQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DescribeQueryResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + struct TEvGetQueryStatusRequest : NActors::TEventLocal<TEvGetQueryStatusRequest, EvGetQueryStatusRequest> { explicit TEvGetQueryStatusRequest(const TString& scope, const YandexQuery::GetQueryStatusRequest& request, @@ -304,211 +304,211 @@ struct TEvControlPlaneStorage { TDebugInfoPtr DebugInfo; }; - struct TEvModifyQueryRequest : NActors::TEventLocal<TEvModifyQueryRequest, EvModifyQueryRequest> { - explicit TEvModifyQueryRequest(const TString& scope, - const YandexQuery::ModifyQueryRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ModifyQueryRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvModifyQueryResponse : NActors::TEventLocal<TEvModifyQueryResponse, EvModifyQueryResponse> { - explicit TEvModifyQueryResponse(const YandexQuery::ModifyQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvModifyQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ModifyQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvDeleteQueryRequest : NActors::TEventLocal<TEvDeleteQueryRequest, EvDeleteQueryRequest> { - explicit TEvDeleteQueryRequest(const TString& scope, - const YandexQuery::DeleteQueryRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::DeleteQueryRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvDeleteQueryResponse : NActors::TEventLocal<TEvDeleteQueryResponse, EvDeleteQueryResponse> { - explicit TEvDeleteQueryResponse(const YandexQuery::DeleteQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvDeleteQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DeleteQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvControlQueryRequest : NActors::TEventLocal<TEvControlQueryRequest, EvControlQueryRequest> { - explicit TEvControlQueryRequest(const TString& scope, - const YandexQuery::ControlQueryRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ControlQueryRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvControlQueryResponse : NActors::TEventLocal<TEvControlQueryResponse, EvControlQueryResponse> { - explicit TEvControlQueryResponse(const YandexQuery::ControlQueryResult& result, - const TAuditDetails<YandexQuery::Query>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvControlQueryResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ControlQueryResult Result; - TAuditDetails<YandexQuery::Query> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvGetResultDataRequest : NActors::TEventLocal<TEvGetResultDataRequest, EvGetResultDataRequest> { - explicit TEvGetResultDataRequest(const TString& scope, - const YandexQuery::GetResultDataRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::GetResultDataRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvGetResultDataResponse : NActors::TEventLocal<TEvGetResultDataResponse, EvGetResultDataResponse> { - explicit TEvGetResultDataResponse(const YandexQuery::GetResultDataResult& result) - : Result(result) - { - } - - explicit TEvGetResultDataResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::GetResultDataResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvListJobsRequest : NActors::TEventLocal<TEvListJobsRequest, EvListJobsRequest> { - explicit TEvListJobsRequest(const TString& scope, - const YandexQuery::ListJobsRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ListJobsRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvListJobsResponse : NActors::TEventLocal<TEvListJobsResponse, EvListJobsResponse> { - explicit TEvListJobsResponse(const YandexQuery::ListJobsResult& result) - : Result(result) - { - } - - explicit TEvListJobsResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListJobsResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - + struct TEvModifyQueryRequest : NActors::TEventLocal<TEvModifyQueryRequest, EvModifyQueryRequest> { + explicit TEvModifyQueryRequest(const TString& scope, + const YandexQuery::ModifyQueryRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ModifyQueryRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvModifyQueryResponse : NActors::TEventLocal<TEvModifyQueryResponse, EvModifyQueryResponse> { + explicit TEvModifyQueryResponse(const YandexQuery::ModifyQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvModifyQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ModifyQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvDeleteQueryRequest : NActors::TEventLocal<TEvDeleteQueryRequest, EvDeleteQueryRequest> { + explicit TEvDeleteQueryRequest(const TString& scope, + const YandexQuery::DeleteQueryRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::DeleteQueryRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvDeleteQueryResponse : NActors::TEventLocal<TEvDeleteQueryResponse, EvDeleteQueryResponse> { + explicit TEvDeleteQueryResponse(const YandexQuery::DeleteQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvDeleteQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DeleteQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvControlQueryRequest : NActors::TEventLocal<TEvControlQueryRequest, EvControlQueryRequest> { + explicit TEvControlQueryRequest(const TString& scope, + const YandexQuery::ControlQueryRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ControlQueryRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvControlQueryResponse : NActors::TEventLocal<TEvControlQueryResponse, EvControlQueryResponse> { + explicit TEvControlQueryResponse(const YandexQuery::ControlQueryResult& result, + const TAuditDetails<YandexQuery::Query>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvControlQueryResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ControlQueryResult Result; + TAuditDetails<YandexQuery::Query> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvGetResultDataRequest : NActors::TEventLocal<TEvGetResultDataRequest, EvGetResultDataRequest> { + explicit TEvGetResultDataRequest(const TString& scope, + const YandexQuery::GetResultDataRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::GetResultDataRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvGetResultDataResponse : NActors::TEventLocal<TEvGetResultDataResponse, EvGetResultDataResponse> { + explicit TEvGetResultDataResponse(const YandexQuery::GetResultDataResult& result) + : Result(result) + { + } + + explicit TEvGetResultDataResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::GetResultDataResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvListJobsRequest : NActors::TEventLocal<TEvListJobsRequest, EvListJobsRequest> { + explicit TEvListJobsRequest(const TString& scope, + const YandexQuery::ListJobsRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ListJobsRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvListJobsResponse : NActors::TEventLocal<TEvListJobsResponse, EvListJobsResponse> { + explicit TEvListJobsResponse(const YandexQuery::ListJobsResult& result) + : Result(result) + { + } + + explicit TEvListJobsResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListJobsResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + struct TEvDescribeJobRequest : NActors::TEventLocal<TEvDescribeJobRequest, EvDescribeJobRequest> { explicit TEvDescribeJobRequest(const TString& scope, const YandexQuery::DescribeJobRequest& request, const TString& user, - const TString& token, - TPermissions permissions) + const TString& token, + TPermissions permissions) : Scope(scope) , Request(request) , User(user) , Token(token) - , Permissions(permissions) + , Permissions(permissions) { } @@ -516,7 +516,7 @@ struct TEvControlPlaneStorage { YandexQuery::DescribeJobRequest Request; TString User; TString Token; - TPermissions Permissions; + TPermissions Permissions; }; struct TEvDescribeJobResponse : NActors::TEventLocal<TEvDescribeJobResponse, EvDescribeJobResponse> { @@ -532,431 +532,431 @@ struct TEvControlPlaneStorage { YandexQuery::DescribeJobResult Result; NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvCreateConnectionRequest : NActors::TEventLocal<TEvCreateConnectionRequest, EvCreateConnectionRequest> { - explicit TEvCreateConnectionRequest(const TString& scope, - const YandexQuery::CreateConnectionRequest& request, - const TString& user, - const TString& token, - const TString& cloudId, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , CloudId(cloudId) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::CreateConnectionRequest Request; - TString User; - TString Token; - TString CloudId; - TPermissions Permissions; - }; - - struct TEvCreateConnectionResponse : NActors::TEventLocal<TEvCreateConnectionResponse, EvCreateConnectionResponse> { - explicit TEvCreateConnectionResponse(const YandexQuery::CreateConnectionResult& result, - const TAuditDetails<YandexQuery::Connection>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvCreateConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::CreateConnectionResult Result; - TAuditDetails<YandexQuery::Connection> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; + TDebugInfoPtr DebugInfo; }; - struct TEvListConnectionsRequest : NActors::TEventLocal<TEvListConnectionsRequest, EvListConnectionsRequest> { - explicit TEvListConnectionsRequest(const TString& scope, - const YandexQuery::ListConnectionsRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ListConnectionsRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvListConnectionsResponse : NActors::TEventLocal<TEvListConnectionsResponse, EvListConnectionsResponse> { - explicit TEvListConnectionsResponse(const YandexQuery::ListConnectionsResult& result) - : Result(result) - { - } - - explicit TEvListConnectionsResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListConnectionsResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvDescribeConnectionRequest : NActors::TEventLocal<TEvDescribeConnectionRequest, EvDescribeConnectionRequest> { - explicit TEvDescribeConnectionRequest(const TString& scope, - const YandexQuery::DescribeConnectionRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::DescribeConnectionRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvDescribeConnectionResponse : NActors::TEventLocal<TEvDescribeConnectionResponse, EvDescribeConnectionResponse> { - explicit TEvDescribeConnectionResponse(const YandexQuery::DescribeConnectionResult& result) - : Result(result) - { - } - - explicit TEvDescribeConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DescribeConnectionResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvModifyConnectionRequest : NActors::TEventLocal<TEvModifyConnectionRequest, EvModifyConnectionRequest> { - explicit TEvModifyConnectionRequest(const TString& scope, - const YandexQuery::ModifyConnectionRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ModifyConnectionRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvModifyConnectionResponse : NActors::TEventLocal<TEvModifyConnectionResponse, EvModifyConnectionResponse> { - explicit TEvModifyConnectionResponse(const YandexQuery::ModifyConnectionResult& result, - const TAuditDetails<YandexQuery::Connection>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvModifyConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ModifyConnectionResult Result; - TAuditDetails<YandexQuery::Connection> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvDeleteConnectionRequest : NActors::TEventLocal<TEvDeleteConnectionRequest, EvDeleteConnectionRequest> { - explicit TEvDeleteConnectionRequest(const TString& scope, - const YandexQuery::DeleteConnectionRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::DeleteConnectionRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvDeleteConnectionResponse : NActors::TEventLocal<TEvDeleteConnectionResponse, EvDeleteConnectionResponse> { - explicit TEvDeleteConnectionResponse(const YandexQuery::DeleteConnectionResult& result, - const TAuditDetails<YandexQuery::Connection>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvDeleteConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DeleteConnectionResult Result; - TAuditDetails<YandexQuery::Connection> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvCreateBindingRequest : NActors::TEventLocal<TEvCreateBindingRequest, EvCreateBindingRequest> { - explicit TEvCreateBindingRequest(const TString& scope, - const YandexQuery::CreateBindingRequest& request, - const TString& user, - const TString& token, - const TString& cloudId, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , CloudId(cloudId) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::CreateBindingRequest Request; - TString User; - TString Token; - TString CloudId; - TPermissions Permissions; - }; - - struct TEvCreateBindingResponse : NActors::TEventLocal<TEvCreateBindingResponse, EvCreateBindingResponse> { - explicit TEvCreateBindingResponse(const YandexQuery::CreateBindingResult& result, - const TAuditDetails<YandexQuery::Binding>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvCreateBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::CreateBindingResult Result; - TAuditDetails<YandexQuery::Binding> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvListBindingsRequest : NActors::TEventLocal<TEvListBindingsRequest, EvListBindingsRequest> { - explicit TEvListBindingsRequest(const TString& scope, - const YandexQuery::ListBindingsRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ListBindingsRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvListBindingsResponse : NActors::TEventLocal<TEvListBindingsResponse, EvListBindingsResponse> { - explicit TEvListBindingsResponse(const YandexQuery::ListBindingsResult& result) - : Result(result) - { - } - - explicit TEvListBindingsResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ListBindingsResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvDescribeBindingRequest : NActors::TEventLocal<TEvDescribeBindingRequest, EvDescribeBindingRequest> { - explicit TEvDescribeBindingRequest(const TString& scope, - const YandexQuery::DescribeBindingRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::DescribeBindingRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvDescribeBindingResponse : NActors::TEventLocal<TEvDescribeBindingResponse, EvDescribeBindingResponse> { - explicit TEvDescribeBindingResponse(const YandexQuery::DescribeBindingResult& result) - : Result(result) - { - } - - explicit TEvDescribeBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DescribeBindingResult Result; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvModifyBindingRequest : NActors::TEventLocal<TEvModifyBindingRequest, EvModifyBindingRequest> { - explicit TEvModifyBindingRequest(const TString& scope, - const YandexQuery::ModifyBindingRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::ModifyBindingRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvModifyBindingResponse : NActors::TEventLocal<TEvModifyBindingResponse, EvModifyBindingResponse> { - explicit TEvModifyBindingResponse(const YandexQuery::ModifyBindingResult& result, - const TAuditDetails<YandexQuery::Binding>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvModifyBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::ModifyBindingResult Result; - TAuditDetails<YandexQuery::Binding> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - struct TEvDeleteBindingRequest : NActors::TEventLocal<TEvDeleteBindingRequest, EvDeleteBindingRequest> { - explicit TEvDeleteBindingRequest(const TString& scope, - const YandexQuery::DeleteBindingRequest& request, - const TString& user, - const TString& token, - TPermissions permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::DeleteBindingRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvDeleteBindingResponse : NActors::TEventLocal<TEvDeleteBindingResponse, EvDeleteBindingResponse> { - explicit TEvDeleteBindingResponse(const YandexQuery::DeleteBindingResult& result, - const TAuditDetails<YandexQuery::Binding>& auditDetails) - : Result(result) - , AuditDetails(auditDetails) - { - } - - explicit TEvDeleteBindingResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::DeleteBindingResult Result; - TAuditDetails<YandexQuery::Binding> AuditDetails; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; - - // internal messages - struct TEvWriteResultDataRequest : NActors::TEventLocal<TEvWriteResultDataRequest, EvWriteResultDataRequest> { + struct TEvCreateConnectionRequest : NActors::TEventLocal<TEvCreateConnectionRequest, EvCreateConnectionRequest> { + explicit TEvCreateConnectionRequest(const TString& scope, + const YandexQuery::CreateConnectionRequest& request, + const TString& user, + const TString& token, + const TString& cloudId, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , CloudId(cloudId) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::CreateConnectionRequest Request; + TString User; + TString Token; + TString CloudId; + TPermissions Permissions; + }; + + struct TEvCreateConnectionResponse : NActors::TEventLocal<TEvCreateConnectionResponse, EvCreateConnectionResponse> { + explicit TEvCreateConnectionResponse(const YandexQuery::CreateConnectionResult& result, + const TAuditDetails<YandexQuery::Connection>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvCreateConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::CreateConnectionResult Result; + TAuditDetails<YandexQuery::Connection> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvListConnectionsRequest : NActors::TEventLocal<TEvListConnectionsRequest, EvListConnectionsRequest> { + explicit TEvListConnectionsRequest(const TString& scope, + const YandexQuery::ListConnectionsRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ListConnectionsRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvListConnectionsResponse : NActors::TEventLocal<TEvListConnectionsResponse, EvListConnectionsResponse> { + explicit TEvListConnectionsResponse(const YandexQuery::ListConnectionsResult& result) + : Result(result) + { + } + + explicit TEvListConnectionsResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListConnectionsResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvDescribeConnectionRequest : NActors::TEventLocal<TEvDescribeConnectionRequest, EvDescribeConnectionRequest> { + explicit TEvDescribeConnectionRequest(const TString& scope, + const YandexQuery::DescribeConnectionRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::DescribeConnectionRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvDescribeConnectionResponse : NActors::TEventLocal<TEvDescribeConnectionResponse, EvDescribeConnectionResponse> { + explicit TEvDescribeConnectionResponse(const YandexQuery::DescribeConnectionResult& result) + : Result(result) + { + } + + explicit TEvDescribeConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DescribeConnectionResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvModifyConnectionRequest : NActors::TEventLocal<TEvModifyConnectionRequest, EvModifyConnectionRequest> { + explicit TEvModifyConnectionRequest(const TString& scope, + const YandexQuery::ModifyConnectionRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ModifyConnectionRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvModifyConnectionResponse : NActors::TEventLocal<TEvModifyConnectionResponse, EvModifyConnectionResponse> { + explicit TEvModifyConnectionResponse(const YandexQuery::ModifyConnectionResult& result, + const TAuditDetails<YandexQuery::Connection>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvModifyConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ModifyConnectionResult Result; + TAuditDetails<YandexQuery::Connection> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvDeleteConnectionRequest : NActors::TEventLocal<TEvDeleteConnectionRequest, EvDeleteConnectionRequest> { + explicit TEvDeleteConnectionRequest(const TString& scope, + const YandexQuery::DeleteConnectionRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::DeleteConnectionRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvDeleteConnectionResponse : NActors::TEventLocal<TEvDeleteConnectionResponse, EvDeleteConnectionResponse> { + explicit TEvDeleteConnectionResponse(const YandexQuery::DeleteConnectionResult& result, + const TAuditDetails<YandexQuery::Connection>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvDeleteConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DeleteConnectionResult Result; + TAuditDetails<YandexQuery::Connection> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvCreateBindingRequest : NActors::TEventLocal<TEvCreateBindingRequest, EvCreateBindingRequest> { + explicit TEvCreateBindingRequest(const TString& scope, + const YandexQuery::CreateBindingRequest& request, + const TString& user, + const TString& token, + const TString& cloudId, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , CloudId(cloudId) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::CreateBindingRequest Request; + TString User; + TString Token; + TString CloudId; + TPermissions Permissions; + }; + + struct TEvCreateBindingResponse : NActors::TEventLocal<TEvCreateBindingResponse, EvCreateBindingResponse> { + explicit TEvCreateBindingResponse(const YandexQuery::CreateBindingResult& result, + const TAuditDetails<YandexQuery::Binding>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvCreateBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::CreateBindingResult Result; + TAuditDetails<YandexQuery::Binding> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvListBindingsRequest : NActors::TEventLocal<TEvListBindingsRequest, EvListBindingsRequest> { + explicit TEvListBindingsRequest(const TString& scope, + const YandexQuery::ListBindingsRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ListBindingsRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvListBindingsResponse : NActors::TEventLocal<TEvListBindingsResponse, EvListBindingsResponse> { + explicit TEvListBindingsResponse(const YandexQuery::ListBindingsResult& result) + : Result(result) + { + } + + explicit TEvListBindingsResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ListBindingsResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvDescribeBindingRequest : NActors::TEventLocal<TEvDescribeBindingRequest, EvDescribeBindingRequest> { + explicit TEvDescribeBindingRequest(const TString& scope, + const YandexQuery::DescribeBindingRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::DescribeBindingRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvDescribeBindingResponse : NActors::TEventLocal<TEvDescribeBindingResponse, EvDescribeBindingResponse> { + explicit TEvDescribeBindingResponse(const YandexQuery::DescribeBindingResult& result) + : Result(result) + { + } + + explicit TEvDescribeBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DescribeBindingResult Result; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvModifyBindingRequest : NActors::TEventLocal<TEvModifyBindingRequest, EvModifyBindingRequest> { + explicit TEvModifyBindingRequest(const TString& scope, + const YandexQuery::ModifyBindingRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::ModifyBindingRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvModifyBindingResponse : NActors::TEventLocal<TEvModifyBindingResponse, EvModifyBindingResponse> { + explicit TEvModifyBindingResponse(const YandexQuery::ModifyBindingResult& result, + const TAuditDetails<YandexQuery::Binding>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvModifyBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::ModifyBindingResult Result; + TAuditDetails<YandexQuery::Binding> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + struct TEvDeleteBindingRequest : NActors::TEventLocal<TEvDeleteBindingRequest, EvDeleteBindingRequest> { + explicit TEvDeleteBindingRequest(const TString& scope, + const YandexQuery::DeleteBindingRequest& request, + const TString& user, + const TString& token, + TPermissions permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::DeleteBindingRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvDeleteBindingResponse : NActors::TEventLocal<TEvDeleteBindingResponse, EvDeleteBindingResponse> { + explicit TEvDeleteBindingResponse(const YandexQuery::DeleteBindingResult& result, + const TAuditDetails<YandexQuery::Binding>& auditDetails) + : Result(result) + , AuditDetails(auditDetails) + { + } + + explicit TEvDeleteBindingResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::DeleteBindingResult Result; + TAuditDetails<YandexQuery::Binding> AuditDetails; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; + + // internal messages + struct TEvWriteResultDataRequest : NActors::TEventLocal<TEvWriteResultDataRequest, EvWriteResultDataRequest> { explicit TEvWriteResultDataRequest(const TString& resultId, - const int32_t resultSetId, - const int64_t startRowId, - const TInstant& deadline, - const Ydb::ResultSet& resultSet) + const int32_t resultSetId, + const int64_t startRowId, + const TInstant& deadline, + const Ydb::ResultSet& resultSet) : ResultId(resultId) - , ResultSetId(resultSetId) - , StartRowId(startRowId) - , Deadline(deadline) - , ResultSet(resultSet) - { - } - + , ResultSetId(resultSetId) + , StartRowId(startRowId) + , Deadline(deadline) + , ResultSet(resultSet) + { + } + TString ResultId; - int32_t ResultSetId = 0; - int64_t StartRowId = 0; - TInstant Deadline; - Ydb::ResultSet ResultSet; - }; - - struct TEvWriteResultDataResponse : NActors::TEventLocal<TEvWriteResultDataResponse, EvWriteResultDataResponse> { - explicit TEvWriteResultDataResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - + int32_t ResultSetId = 0; + int64_t StartRowId = 0; + TInstant Deadline; + Ydb::ResultSet ResultSet; + }; + + struct TEvWriteResultDataResponse : NActors::TEventLocal<TEvWriteResultDataResponse, EvWriteResultDataResponse> { + explicit TEvWriteResultDataResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + explicit TEvWriteResultDataResponse( const NYql::TIssues& issues, const ui64 requestId) @@ -965,24 +965,24 @@ struct TEvControlPlaneStorage { { } - NYql::TIssues Issues; + NYql::TIssues Issues; const ui64 RequestId = 0; - TDebugInfoPtr DebugInfo; - }; - - struct TEvGetTaskRequest : NActors::TEventLocal<TEvGetTaskRequest, EvGetTaskRequest> { + TDebugInfoPtr DebugInfo; + }; + + struct TEvGetTaskRequest : NActors::TEventLocal<TEvGetTaskRequest, EvGetTaskRequest> { explicit TEvGetTaskRequest( const TString& owner, const TString& hostName) - : Owner(owner) - , HostName(hostName) - { - } - - TString Owner; - TString HostName; - }; - + : Owner(owner) + , HostName(hostName) + { + } + + TString Owner; + TString HostName; + }; + struct TTask { TString Scope; TString QueryId; @@ -992,24 +992,24 @@ struct TEvControlPlaneStorage { TInstant Deadline; }; - struct TEvGetTaskResponse : NActors::TEventLocal<TEvGetTaskResponse, EvGetTaskResponse> { + struct TEvGetTaskResponse : NActors::TEventLocal<TEvGetTaskResponse, EvGetTaskResponse> { explicit TEvGetTaskResponse(const TVector<TTask>& tasks, const TString& owner) : Tasks(tasks) , Owner(owner) - { - } - - explicit TEvGetTaskResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - NYql::TIssues Issues; + { + } + + explicit TEvGetTaskResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + NYql::TIssues Issues; TVector<TTask> Tasks; TString Owner; - TDebugInfoPtr DebugInfo; - }; - + TDebugInfoPtr DebugInfo; + }; + // Description of consumer that was created by YQ struct TTopicConsumer { TString DatabaseId; @@ -1022,53 +1022,53 @@ struct TEvControlPlaneStorage { bool AddBearerToToken = false; }; - struct TEvPingTaskRequest : NActors::TEventLocal<TEvPingTaskRequest, EvPingTaskRequest> { + struct TEvPingTaskRequest : NActors::TEventLocal<TEvPingTaskRequest, EvPingTaskRequest> { explicit TEvPingTaskRequest(const TString& scope, const TString& queryId, const TString& owner, const TInstant& deadline, const TString& resultId = "") - : Scope(scope) - , QueryId(queryId) + : Scope(scope) + , QueryId(queryId) , Owner(owner) , Deadline(deadline) , ResultId(resultId) - { - } - + { + } + const TString Scope; const TString QueryId; const TString Owner; const TInstant Deadline; TString ResultId; - TMaybe<YandexQuery::QueryMeta::ComputeStatus> Status; - TMaybe<NYql::TIssues> Issues; - TMaybe<NYql::TIssues> TransientIssues; - TMaybe<TString> Statistics; + TMaybe<YandexQuery::QueryMeta::ComputeStatus> Status; + TMaybe<NYql::TIssues> Issues; + TMaybe<NYql::TIssues> TransientIssues; + TMaybe<TString> Statistics; TMaybe<TVector<YandexQuery::ResultSetMeta>> ResultSetMetas; - TMaybe<TString> Ast; - TMaybe<TString> Plan; - TMaybe<TInstant> StartedAt; - TMaybe<TInstant> FinishedAt; + TMaybe<TString> Ast; + TMaybe<TString> Plan; + TMaybe<TInstant> StartedAt; + TMaybe<TInstant> FinishedAt; bool ResignQuery = false; TVector<TTopicConsumer> CreatedTopicConsumers; TVector<TString> DqGraphs; i32 DqGraphIndex = 0; YandexQuery::StateLoadMode StateLoadMode = YandexQuery::STATE_LOAD_MODE_UNSPECIFIED; TMaybe<YandexQuery::StreamingDisposition> StreamingDisposition; - }; - - struct TEvPingTaskResponse : NActors::TEventLocal<TEvPingTaskResponse, EvPingTaskResponse> { - explicit TEvPingTaskResponse(const YandexQuery::QueryAction& action) - : Action(action) - { - } - - explicit TEvPingTaskResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - + }; + + struct TEvPingTaskResponse : NActors::TEventLocal<TEvPingTaskResponse, EvPingTaskResponse> { + explicit TEvPingTaskResponse(const YandexQuery::QueryAction& action) + : Action(action) + { + } + + explicit TEvPingTaskResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + YandexQuery::QueryAction Action = YandexQuery::QUERY_ACTION_UNSPECIFIED; - NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; - }; + NYql::TIssues Issues; + TDebugInfoPtr DebugInfo; + }; struct TEvNodesHealthCheckRequest : NActors::TEventLocal<TEvNodesHealthCheckRequest, EvNodesHealthCheckRequest> { explicit TEvNodesHealthCheckRequest( @@ -1092,9 +1092,9 @@ struct TEvControlPlaneStorage { Yq::Private::NodesHealthCheckResult Record; NYql::TIssues Issues; - TDebugInfoPtr DebugInfo; + TDebugInfoPtr DebugInfo; }; -}; - -} +}; + +} diff --git a/ydb/core/yq/libs/control_plane_storage/events/ya.make b/ydb/core/yq/libs/control_plane_storage/events/ya.make index 6bfef24891..df6e2734ac 100644 --- a/ydb/core/yq/libs/control_plane_storage/events/ya.make +++ b/ydb/core/yq/libs/control_plane_storage/events/ya.make @@ -1,16 +1,16 @@ OWNER(g:yq) - -LIBRARY() - -SRCS( - events.cpp -) - -PEERDIR( - library/cpp/actors/core - library/cpp/actors/interconnect + +LIBRARY() + +SRCS( + events.cpp +) + +PEERDIR( + library/cpp/actors/core + library/cpp/actors/interconnect ydb/core/yq/libs/control_plane_storage/proto ydb/core/yq/libs/events -) - -END() +) + +END() diff --git a/ydb/core/yq/libs/control_plane_storage/exceptions.cpp b/ydb/core/yq/libs/control_plane_storage/exceptions.cpp index ab971f11d3..b013e4127a 100644 --- a/ydb/core/yq/libs/control_plane_storage/exceptions.cpp +++ b/ydb/core/yq/libs/control_plane_storage/exceptions.cpp @@ -1,37 +1,37 @@ -#include "exceptions.h" - -#include <util/string/builder.h> - -namespace NYq { - -TControlPlaneStorageException::TControlPlaneStorageException(TIssuesIds::EIssueCode code) - : SourceLocation("", 0) - , Code(code) -{} - -TControlPlaneStorageException::TControlPlaneStorageException(const TSourceLocation& sl, const TControlPlaneStorageException& t) - : yexception(t) - , SourceLocation(sl) - , Code(t.Code) -{} - -const char* TControlPlaneStorageException::GetRawMessage() const { - return yexception::what(); -} - -const char* TControlPlaneStorageException::what() const noexcept { - try { - if (!Message) { - Message = TStringBuilder{} << SourceLocation << TStringBuf(": ") << yexception::what(); - } - return Message.c_str(); - } catch(...) { - return "Unexpected exception in TControlPlaneStorageException::what()"; - } -} - -TControlPlaneStorageException operator+(const TSourceLocation& sl, TControlPlaneStorageException&& t) { - return TControlPlaneStorageException(sl, t); -} - -} // namespace NYq
\ No newline at end of file +#include "exceptions.h" + +#include <util/string/builder.h> + +namespace NYq { + +TControlPlaneStorageException::TControlPlaneStorageException(TIssuesIds::EIssueCode code) + : SourceLocation("", 0) + , Code(code) +{} + +TControlPlaneStorageException::TControlPlaneStorageException(const TSourceLocation& sl, const TControlPlaneStorageException& t) + : yexception(t) + , SourceLocation(sl) + , Code(t.Code) +{} + +const char* TControlPlaneStorageException::GetRawMessage() const { + return yexception::what(); +} + +const char* TControlPlaneStorageException::what() const noexcept { + try { + if (!Message) { + Message = TStringBuilder{} << SourceLocation << TStringBuf(": ") << yexception::what(); + } + return Message.c_str(); + } catch(...) { + return "Unexpected exception in TControlPlaneStorageException::what()"; + } +} + +TControlPlaneStorageException operator+(const TSourceLocation& sl, TControlPlaneStorageException&& t) { + return TControlPlaneStorageException(sl, t); +} + +} // namespace NYq
\ No newline at end of file diff --git a/ydb/core/yq/libs/control_plane_storage/exceptions.h b/ydb/core/yq/libs/control_plane_storage/exceptions.h index 996fc379f4..6fd960878c 100644 --- a/ydb/core/yq/libs/control_plane_storage/exceptions.h +++ b/ydb/core/yq/libs/control_plane_storage/exceptions.h @@ -1,26 +1,26 @@ -#pragma once - -#include <util/generic/yexception.h> -#include <util/system/compiler.h> - +#pragma once + +#include <util/generic/yexception.h> +#include <util/system/compiler.h> + #include <ydb/core/yq/libs/config/protos/issue_id.pb.h> - -namespace NYq { - -struct TControlPlaneStorageException: public yexception { - TSourceLocation SourceLocation; - mutable TString Message; - TIssuesIds::EIssueCode Code; - - TControlPlaneStorageException(TIssuesIds::EIssueCode code); - - TControlPlaneStorageException(const TSourceLocation& sl, const TControlPlaneStorageException& t); - - const char* what() const noexcept override; - - const char* GetRawMessage() const; -}; - -TControlPlaneStorageException operator+(const TSourceLocation& sl, TControlPlaneStorageException&& t); - -} // namespace NYq + +namespace NYq { + +struct TControlPlaneStorageException: public yexception { + TSourceLocation SourceLocation; + mutable TString Message; + TIssuesIds::EIssueCode Code; + + TControlPlaneStorageException(TIssuesIds::EIssueCode code); + + TControlPlaneStorageException(const TSourceLocation& sl, const TControlPlaneStorageException& t); + + const char* what() const noexcept override; + + const char* GetRawMessage() const; +}; + +TControlPlaneStorageException operator+(const TSourceLocation& sl, TControlPlaneStorageException&& t); + +} // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_storage/extractors.h b/ydb/core/yq/libs/control_plane_storage/extractors.h index 6d75f372a3..3f0632ab64 100644 --- a/ydb/core/yq/libs/control_plane_storage/extractors.h +++ b/ydb/core/yq/libs/control_plane_storage/extractors.h @@ -1,45 +1,45 @@ -#pragma once - -#include "validators.h" - +#pragma once + +#include "validators.h" + #include <ydb/core/yq/libs/db_schema/db_schema.h> - -namespace NYq { - -template<typename T, typename A> -TValidationQuery CreateEntityExtractor(const TString& scope, - const TString& id, - const TString& entityColumnName, - const TString& idColumnName, - const TString& tableName, - std::shared_ptr<std::pair<T, A>> response, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("id", id); - queryBuilder.AddText( - "SELECT `" + entityColumnName + "` FROM `" + tableName + "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + idColumnName + "` = $id;\n" - ); - - auto validator = [response, entityColumnName](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "internal error, result set size is not equal to 1 but equal " << resultSets.size(); - } - - NYdb::TResultSetParser parser(resultSets.back()); - if (!parser.TryNextRow()) { - return false; // continue - } - - if (!response->second.Before.ConstructInPlace().ParseFromString(*parser.ColumnParser(entityColumnName).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message. Please contact internal support"; - } - return false; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -} + +namespace NYq { + +template<typename T, typename A> +TValidationQuery CreateEntityExtractor(const TString& scope, + const TString& id, + const TString& entityColumnName, + const TString& idColumnName, + const TString& tableName, + std::shared_ptr<std::pair<T, A>> response, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("id", id); + queryBuilder.AddText( + "SELECT `" + entityColumnName + "` FROM `" + tableName + "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + idColumnName + "` = $id;\n" + ); + + auto validator = [response, entityColumnName](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "internal error, result set size is not equal to 1 but equal " << resultSets.size(); + } + + NYdb::TResultSetParser parser(resultSets.back()); + if (!parser.TryNextRow()) { + return false; // continue + } + + if (!response->second.Before.ConstructInPlace().ParseFromString(*parser.ColumnParser(entityColumnName).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message. Please contact internal support"; + } + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +} diff --git a/ydb/core/yq/libs/control_plane_storage/in_memory_control_plane_storage.cpp b/ydb/core/yq/libs/control_plane_storage/in_memory_control_plane_storage.cpp index 783b924238..1daa6b19ec 100644 --- a/ydb/core/yq/libs/control_plane_storage/in_memory_control_plane_storage.cpp +++ b/ydb/core/yq/libs/control_plane_storage/in_memory_control_plane_storage.cpp @@ -1,286 +1,286 @@ -#include "control_plane_storage.h" -#include "util.h" - -#include <util/generic/guid.h> -#include <util/generic/set.h> - +#include "control_plane_storage.h" +#include "util.h" + +#include <util/generic/guid.h> +#include <util/generic/set.h> + #include <library/cpp/protobuf/interop/cast.h> #include <ydb/core/yq/libs/config/yq_issue.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> - -namespace NYq { - -class TInMemoryControlPlaneStorageActor : public NActors::TActor<TInMemoryControlPlaneStorageActor> { - struct TKey { - TString Scope; - TString Id; - - bool operator<(const TKey& other) const - { - return tie(Scope, Id) < tie(other.Scope, other.Id); - } - }; - - struct TConfig { - NConfig::TControlPlaneStorageConfig Proto; - TDuration IdempotencyKeyTtl; - TDuration AutomaticQueriesTtl; + +namespace NYq { + +class TInMemoryControlPlaneStorageActor : public NActors::TActor<TInMemoryControlPlaneStorageActor> { + struct TKey { + TString Scope; + TString Id; + + bool operator<(const TKey& other) const + { + return tie(Scope, Id) < tie(other.Scope, other.Id); + } + }; + + struct TConfig { + NConfig::TControlPlaneStorageConfig Proto; + TDuration IdempotencyKeyTtl; + TDuration AutomaticQueriesTtl; TDuration ResultSetsTtl; - TDuration AnalyticsRetryCounterUpdateTime; - TDuration StreamingRetryCounterUpdateTime; - TDuration TaskLeaseTtl; - - TConfig(const NConfig::TControlPlaneStorageConfig& config) - : Proto(FillDefaultParameters(config)) - , IdempotencyKeyTtl(GetDuration(Proto.GetIdempotencyKeysTtl(), TDuration::Minutes(10))) - , AutomaticQueriesTtl(GetDuration(Proto.GetAutomaticQueriesTtl(), TDuration::Days(1))) + TDuration AnalyticsRetryCounterUpdateTime; + TDuration StreamingRetryCounterUpdateTime; + TDuration TaskLeaseTtl; + + TConfig(const NConfig::TControlPlaneStorageConfig& config) + : Proto(FillDefaultParameters(config)) + , IdempotencyKeyTtl(GetDuration(Proto.GetIdempotencyKeysTtl(), TDuration::Minutes(10))) + , AutomaticQueriesTtl(GetDuration(Proto.GetAutomaticQueriesTtl(), TDuration::Days(1))) , ResultSetsTtl(GetDuration(Proto.GetResultSetsTtl(), TDuration::Days(1))) - , AnalyticsRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) - , StreamingRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) - , TaskLeaseTtl(GetDuration(Proto.GetTaskLeaseTtl(), TDuration::Seconds(30))) - { - } - }; - - TConfig Config; - TMap<TKey, YandexQuery::Query> Queries; - TMap<TKey, YandexQuery::Connection> Connections; - TMap<TString, TInstant> IdempotencyKeys; // idempotency_key -> created_at - - static constexpr int64_t InitialRevision = 1; - -public: - TInMemoryControlPlaneStorageActor(const NConfig::TControlPlaneStorageConfig& config) - : TActor(&TThis::StateFunc) - , Config(config) - { - } - + , AnalyticsRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) + , StreamingRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) + , TaskLeaseTtl(GetDuration(Proto.GetTaskLeaseTtl(), TDuration::Seconds(30))) + { + } + }; + + TConfig Config; + TMap<TKey, YandexQuery::Query> Queries; + TMap<TKey, YandexQuery::Connection> Connections; + TMap<TString, TInstant> IdempotencyKeys; // idempotency_key -> created_at + + static constexpr int64_t InitialRevision = 1; + +public: + TInMemoryControlPlaneStorageActor(const NConfig::TControlPlaneStorageConfig& config) + : TActor(&TThis::StateFunc) + , Config(config) + { + } + static constexpr char ActorName[] = "YQ_CONTROL_PLANE_STORAGE"; - -private: - STRICT_STFUNC(StateFunc, - hFunc(TEvControlPlaneStorage::TEvCreateQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListQueriesRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDescribeQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvModifyQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDeleteQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvControlQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvGetResultDataRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListJobsRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvCreateConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListConnectionsRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDescribeConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvModifyConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDeleteConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvCreateBindingRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListBindingsRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDescribeBindingRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvModifyBindingRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDeleteBindingRequest, Handle); + +private: + STRICT_STFUNC(StateFunc, + hFunc(TEvControlPlaneStorage::TEvCreateQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListQueriesRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDescribeQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvModifyQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDeleteQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvControlQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvGetResultDataRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListJobsRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvCreateConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListConnectionsRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDescribeConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvModifyConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDeleteConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvCreateBindingRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListBindingsRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDescribeBindingRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvModifyBindingRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDeleteBindingRequest, Handle); hFunc(TEvControlPlaneStorage::TEvDescribeJobRequest, Handle); hFunc(TEvControlPlaneStorage::TEvWriteResultDataRequest, Handle); hFunc(TEvControlPlaneStorage::TEvGetTaskRequest, Handle); hFunc(TEvControlPlaneStorage::TEvPingTaskRequest, Handle); hFunc(TEvControlPlaneStorage::TEvNodesHealthCheckRequest, Handle); hFunc(NActors::NMon::TEvHttpInfo, Handle); - ) - - void Handle(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev) - { + ) + + void Handle(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev) + { CPS_LOG_I("CreateQueryRequest"); - const YandexQuery::CreateQueryRequest& request = ev->Get()->Request; - CPS_LOG_D("CreateQueryRequest: " << request.DebugString()); - CleanupIndempotencyKeys(); - auto now = TInstant::Now(); - const TString idempotencyKey = request.idempotency_key(); - if (idempotencyKey && IdempotencyKeys.contains(idempotencyKey)) { - CPS_LOG_D("CreateQueryRequest, idempotency key already exist: " << request.DebugString()); - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::BAD_REQUEST, "idempotency key already exist"); - Send(ev->Sender, new TEvControlPlaneStorage::TEvCreateQueryResponse(NYql::TIssues{issue}), 0, ev->Cookie); - return; - } - - NYql::TIssues issues = ValidateCreateQueryRequest(ev); - if (issues) { - CPS_LOG_D("CreateQueryRequest, validation failed: " << request.DebugString() << " error: " << issues.ToString()); - Send(ev->Sender, new TEvControlPlaneStorage::TEvCreateQueryResponse(issues), 0, ev->Cookie); + const YandexQuery::CreateQueryRequest& request = ev->Get()->Request; + CPS_LOG_D("CreateQueryRequest: " << request.DebugString()); + CleanupIndempotencyKeys(); + auto now = TInstant::Now(); + const TString idempotencyKey = request.idempotency_key(); + if (idempotencyKey && IdempotencyKeys.contains(idempotencyKey)) { + CPS_LOG_D("CreateQueryRequest, idempotency key already exist: " << request.DebugString()); + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::BAD_REQUEST, "idempotency key already exist"); + Send(ev->Sender, new TEvControlPlaneStorage::TEvCreateQueryResponse(NYql::TIssues{issue}), 0, ev->Cookie); + return; + } + + NYql::TIssues issues = ValidateCreateQueryRequest(ev); + if (issues) { + CPS_LOG_D("CreateQueryRequest, validation failed: " << request.DebugString() << " error: " << issues.ToString()); + Send(ev->Sender, new TEvControlPlaneStorage::TEvCreateQueryResponse(issues), 0, ev->Cookie); return; - } - - const TString user = ev->Get()->User; - const TString scope = ev->Get()->Scope; - const TString queryId = CreateGuidAsString(); - YandexQuery::Query query; - YandexQuery::QueryContent& content = *query.mutable_content(); - content = request.content(); - YandexQuery::QueryMeta& meta = *query.mutable_meta(); - YandexQuery::CommonMeta& common = *meta.mutable_common(); - common.set_id(queryId); - common.set_created_by(user); + } + + const TString user = ev->Get()->User; + const TString scope = ev->Get()->Scope; + const TString queryId = CreateGuidAsString(); + YandexQuery::Query query; + YandexQuery::QueryContent& content = *query.mutable_content(); + content = request.content(); + YandexQuery::QueryMeta& meta = *query.mutable_meta(); + YandexQuery::CommonMeta& common = *meta.mutable_common(); + common.set_id(queryId); + common.set_created_by(user); auto timestamp = NProtoInterop::CastToProto(now); - *common.mutable_created_at() = timestamp; - common.set_revision(InitialRevision); - - Queries[{scope, queryId}] = query; - - if (!idempotencyKey) { - IdempotencyKeys[idempotencyKey] = now; - } - - CPS_LOG_D("CreateQueryRequest, success: " << request.DebugString() << " query_id: " << queryId); - YandexQuery::CreateQueryResult result; - result.set_query_id(queryId); - Send(ev->Sender, new TEvControlPlaneStorage::TEvCreateQueryResponse(result, TAuditDetails<YandexQuery::Query>{}), 0, ev->Cookie); - } - - void Handle(TEvControlPlaneStorage::TEvListQueriesRequest::TPtr& ev) - { + *common.mutable_created_at() = timestamp; + common.set_revision(InitialRevision); + + Queries[{scope, queryId}] = query; + + if (!idempotencyKey) { + IdempotencyKeys[idempotencyKey] = now; + } + + CPS_LOG_D("CreateQueryRequest, success: " << request.DebugString() << " query_id: " << queryId); + YandexQuery::CreateQueryResult result; + result.set_query_id(queryId); + Send(ev->Sender, new TEvControlPlaneStorage::TEvCreateQueryResponse(result, TAuditDetails<YandexQuery::Query>{}), 0, ev->Cookie); + } + + void Handle(TEvControlPlaneStorage::TEvListQueriesRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvListQueriesRequest::TPtr, YandexQuery::ListQueriesResult, TEvControlPlaneStorage::TEvListQueriesResponse>(ev, "ListQueriesRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvDescribeQueryRequest::TPtr& ev) - { + } + + void Handle(TEvControlPlaneStorage::TEvDescribeQueryRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvDescribeQueryRequest::TPtr, YandexQuery::DescribeQueryResult, TEvControlPlaneStorage::TEvDescribeQueryResponse>(ev, "DescribeQueryRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvModifyQueryRequest::TPtr& ev) - { - SendEmptyAuditResponse< + } + + void Handle(TEvControlPlaneStorage::TEvModifyQueryRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvModifyQueryRequest::TPtr, YandexQuery::ModifyQueryResult, - TEvControlPlaneStorage::TEvModifyQueryResponse, - TAuditDetails<YandexQuery::Query>>(ev, "ModifyQueryRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvDeleteQueryRequest::TPtr& ev) - { - SendEmptyAuditResponse< + TEvControlPlaneStorage::TEvModifyQueryResponse, + TAuditDetails<YandexQuery::Query>>(ev, "ModifyQueryRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvDeleteQueryRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvDeleteQueryRequest::TPtr, YandexQuery::DeleteQueryResult, - TEvControlPlaneStorage::TEvDeleteQueryResponse, - TAuditDetails<YandexQuery::Query>>(ev, "DeleteQueryRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvControlQueryRequest::TPtr& ev) - { - SendEmptyAuditResponse< + TEvControlPlaneStorage::TEvDeleteQueryResponse, + TAuditDetails<YandexQuery::Query>>(ev, "DeleteQueryRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvControlQueryRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvControlQueryRequest::TPtr, YandexQuery::ControlQueryResult, - TEvControlPlaneStorage::TEvControlQueryResponse, - TAuditDetails<YandexQuery::Query>>(ev, "ControlQueryRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvGetResultDataRequest::TPtr& ev) - { + TEvControlPlaneStorage::TEvControlQueryResponse, + TAuditDetails<YandexQuery::Query>>(ev, "ControlQueryRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvGetResultDataRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvGetResultDataRequest::TPtr, YandexQuery::GetResultDataResult, TEvControlPlaneStorage::TEvGetResultDataResponse>(ev, "GetResultDataRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvListJobsRequest::TPtr& ev) - { + } + + void Handle(TEvControlPlaneStorage::TEvListJobsRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvListJobsRequest::TPtr, YandexQuery::ListJobsResult, TEvControlPlaneStorage::TEvListJobsResponse>(ev, "ListJobsRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvCreateConnectionRequest::TPtr& ev) - { - SendEmptyAuditResponse< + } + + void Handle(TEvControlPlaneStorage::TEvCreateConnectionRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvCreateConnectionRequest::TPtr, YandexQuery::CreateConnectionResult, - TEvControlPlaneStorage::TEvCreateConnectionResponse, - TAuditDetails<YandexQuery::Connection>>(ev, "CreateConnectionRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvListConnectionsRequest::TPtr& ev) - { + TEvControlPlaneStorage::TEvCreateConnectionResponse, + TAuditDetails<YandexQuery::Connection>>(ev, "CreateConnectionRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvListConnectionsRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvListConnectionsRequest::TPtr, YandexQuery::ListConnectionsResult, TEvControlPlaneStorage::TEvListConnectionsResponse>(ev, "ListConnectionsRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvDescribeConnectionRequest::TPtr& ev) - { + } + + void Handle(TEvControlPlaneStorage::TEvDescribeConnectionRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvDescribeConnectionRequest::TPtr, YandexQuery::DescribeConnectionResult, TEvControlPlaneStorage::TEvDescribeConnectionResponse>(ev, "DescribeConnectionRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvModifyConnectionRequest::TPtr& ev) - { - SendEmptyAuditResponse< + } + + void Handle(TEvControlPlaneStorage::TEvModifyConnectionRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvModifyConnectionRequest::TPtr, YandexQuery::ModifyConnectionResult, - TEvControlPlaneStorage::TEvModifyConnectionResponse, - TAuditDetails<YandexQuery::Connection>>(ev, "ModifyConnectionRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvDeleteConnectionRequest::TPtr& ev) - { - SendEmptyAuditResponse< + TEvControlPlaneStorage::TEvModifyConnectionResponse, + TAuditDetails<YandexQuery::Connection>>(ev, "ModifyConnectionRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvDeleteConnectionRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvDeleteConnectionRequest::TPtr, YandexQuery::DeleteConnectionResult, - TEvControlPlaneStorage::TEvDeleteConnectionResponse, - TAuditDetails<YandexQuery::Connection>>(ev, "DeleteConnectionRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvCreateBindingRequest::TPtr& ev) - { - SendEmptyAuditResponse< + TEvControlPlaneStorage::TEvDeleteConnectionResponse, + TAuditDetails<YandexQuery::Connection>>(ev, "DeleteConnectionRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvCreateBindingRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvCreateBindingRequest::TPtr, YandexQuery::CreateBindingResult, - TEvControlPlaneStorage::TEvCreateBindingResponse, - TAuditDetails<YandexQuery::Binding>>(ev, "CreateBindingRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvListBindingsRequest::TPtr& ev) - { + TEvControlPlaneStorage::TEvCreateBindingResponse, + TAuditDetails<YandexQuery::Binding>>(ev, "CreateBindingRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvListBindingsRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvListBindingsRequest::TPtr, YandexQuery::ListBindingsResult, TEvControlPlaneStorage::TEvListBindingsResponse>(ev, "ListBindingsRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvDescribeBindingRequest::TPtr& ev) - { + } + + void Handle(TEvControlPlaneStorage::TEvDescribeBindingRequest::TPtr& ev) + { SendEmptyResponse< TEvControlPlaneStorage::TEvDescribeBindingRequest::TPtr, YandexQuery::DescribeBindingResult, TEvControlPlaneStorage::TEvDescribeBindingResponse>(ev, "DescribeBindingRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvModifyBindingRequest::TPtr& ev) - { - SendEmptyAuditResponse< + } + + void Handle(TEvControlPlaneStorage::TEvModifyBindingRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvModifyBindingRequest::TPtr, YandexQuery::ModifyBindingResult, - TEvControlPlaneStorage::TEvModifyBindingResponse, - TAuditDetails<YandexQuery::Binding>>(ev, "ModifyBindingRequest"); - } - - void Handle(TEvControlPlaneStorage::TEvDeleteBindingRequest::TPtr& ev) - { - SendEmptyAuditResponse< + TEvControlPlaneStorage::TEvModifyBindingResponse, + TAuditDetails<YandexQuery::Binding>>(ev, "ModifyBindingRequest"); + } + + void Handle(TEvControlPlaneStorage::TEvDeleteBindingRequest::TPtr& ev) + { + SendEmptyAuditResponse< TEvControlPlaneStorage::TEvDeleteBindingRequest::TPtr, YandexQuery::DeleteBindingResult, - TEvControlPlaneStorage::TEvDeleteBindingResponse, - TAuditDetails<YandexQuery::Binding>>(ev, "DeleteBindingRequest"); - } - + TEvControlPlaneStorage::TEvDeleteBindingResponse, + TAuditDetails<YandexQuery::Binding>>(ev, "DeleteBindingRequest"); + } + void Handle(TEvControlPlaneStorage::TEvDescribeJobRequest::TPtr& ev) { SendEmptyResponse< @@ -336,70 +336,70 @@ private: NActors::TActivationContext::ActorSystem()->Send(new IEventHandle(ev->Sender, SelfId(), event.release(), 0, ev->Cookie)); } - template<typename TRequest, typename TResult, typename TEvResult, typename TAuditDetails> - void SendEmptyAuditResponse(TRequest& ev, std::string logText) { - CPS_LOG_I(logText); - - TResult result = {}; - TAuditDetails auditDetails = {}; - auto event = std::make_unique<TEvResult>(result, auditDetails); - NActors::TActivationContext::ActorSystem()->Send(new IEventHandle(ev->Sender, SelfId(), event.release(), 0, ev->Cookie)); - } - - NYql::TIssues ValidateCreateQueryRequest(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev) - { - NYql::TIssues issues; - const YandexQuery::CreateQueryRequest& request = ev->Get()->Request; - const TString user = ev->Get()->User; - const TString scope = ev->Get()->Scope; - const YandexQuery::QueryContent& query = request.content(); - - TString error; - if (!request.validate(error)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, error)); - } - - if (query.type() == YandexQuery::QueryContent::QUERY_TYPE_UNSPECIFIED) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "type field is not specified")); - } - - if (query.acl().visibility() == YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "acl.visibility field is not specified")); - } - - if (request.ByteSize() > static_cast<int>(Config.Proto.GetMaxRequestSize())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "Request size exceeded " + ToString(request.ByteSize()) + " out of " + ToString(Config.Proto.GetMaxRequestSize()) + " bytes")); - } - + template<typename TRequest, typename TResult, typename TEvResult, typename TAuditDetails> + void SendEmptyAuditResponse(TRequest& ev, std::string logText) { + CPS_LOG_I(logText); + + TResult result = {}; + TAuditDetails auditDetails = {}; + auto event = std::make_unique<TEvResult>(result, auditDetails); + NActors::TActivationContext::ActorSystem()->Send(new IEventHandle(ev->Sender, SelfId(), event.release(), 0, ev->Cookie)); + } + + NYql::TIssues ValidateCreateQueryRequest(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev) + { + NYql::TIssues issues; + const YandexQuery::CreateQueryRequest& request = ev->Get()->Request; + const TString user = ev->Get()->User; + const TString scope = ev->Get()->Scope; + const YandexQuery::QueryContent& query = request.content(); + + TString error; + if (!request.validate(error)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, error)); + } + + if (query.type() == YandexQuery::QueryContent::QUERY_TYPE_UNSPECIFIED) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "type field is not specified")); + } + + if (query.acl().visibility() == YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "acl.visibility field is not specified")); + } + + if (request.ByteSize() > static_cast<int>(Config.Proto.GetMaxRequestSize())) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "Request size exceeded " + ToString(request.ByteSize()) + " out of " + ToString(Config.Proto.GetMaxRequestSize()) + " bytes")); + } + const uint64_t countQueries = count_if(Queries.begin(), Queries.end(), [scope](const auto& item) { - const auto& [key, value] = item; - return key.Scope == scope; - }); - - if (countQueries > Config.Proto.GetMaxCountQueries()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "The count of the queries exceeds the limit of " + ToString(countQueries) + " out of " + ToString(Config.Proto.GetMaxCountQueries()))); - } - - return issues; - } - - void CleanupIndempotencyKeys() - { - auto now = TInstant::Now(); - erase_if(IdempotencyKeys, [this, now](const auto& item) { - auto const& [idempotencyKey, timestamp] = item; - return timestamp + Config.IdempotencyKeyTtl < now; - }); - } -}; - -NActors::TActorId ControlPlaneStorageServiceActorId(ui32 nodeId) { - constexpr TStringBuf name = "CTRLSTORAGE"; - return NActors::TActorId(nodeId, name); -} - -NActors::IActor* CreateInMemoryControlPlaneStorageServiceActor(const NConfig::TControlPlaneStorageConfig& config) { - return new TInMemoryControlPlaneStorageActor(config); -} - -} // NYq + const auto& [key, value] = item; + return key.Scope == scope; + }); + + if (countQueries > Config.Proto.GetMaxCountQueries()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "The count of the queries exceeds the limit of " + ToString(countQueries) + " out of " + ToString(Config.Proto.GetMaxCountQueries()))); + } + + return issues; + } + + void CleanupIndempotencyKeys() + { + auto now = TInstant::Now(); + erase_if(IdempotencyKeys, [this, now](const auto& item) { + auto const& [idempotencyKey, timestamp] = item; + return timestamp + Config.IdempotencyKeyTtl < now; + }); + } +}; + +NActors::TActorId ControlPlaneStorageServiceActorId(ui32 nodeId) { + constexpr TStringBuf name = "CTRLSTORAGE"; + return NActors::TActorId(nodeId, name); +} + +NActors::IActor* CreateInMemoryControlPlaneStorageServiceActor(const NConfig::TControlPlaneStorageConfig& config) { + return new TInMemoryControlPlaneStorageActor(config); +} + +} // NYq diff --git a/ydb/core/yq/libs/control_plane_storage/internal/nodes_health_check.cpp b/ydb/core/yq/libs/control_plane_storage/internal/nodes_health_check.cpp index eb25dac4b1..e849096239 100644 --- a/ydb/core/yq/libs/control_plane_storage/internal/nodes_health_check.cpp +++ b/ydb/core/yq/libs/control_plane_storage/internal/nodes_health_check.cpp @@ -1,7 +1,7 @@ #include "utils.h" #include <ydb/core/yq/libs/db_schema/db_schema.h> - + namespace NYq { void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvNodesHealthCheckRequest::TPtr& ev) @@ -48,13 +48,13 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvNodesHealth } TSqlQueryBuilder readQueryBuilder(YdbConnection->TablePathPrefix, "NodesHealthCheck(read)"); - readQueryBuilder.AddTimestamp("now", TInstant::Now()); - readQueryBuilder.AddString("tenant", tenant); - readQueryBuilder.AddText( + readQueryBuilder.AddTimestamp("now", TInstant::Now()); + readQueryBuilder.AddString("tenant", tenant); + readQueryBuilder.AddText( "SELECT `" NODE_ID_COLUMN_NAME "`, `" INSTANCE_ID_COLUMN_NAME "`, `" HOST_NAME_COLUMN_NAME "`, `" ACTIVE_WORKERS_COLUMN_NAME"`, `" MEMORY_LIMIT_COLUMN_NAME"`, " "`" MEMORY_ALLOCATED_COLUMN_NAME"`, `" INTERCONNECT_PORT_COLUMN_NAME "`, `" NODE_ADDRESS_COLUMN_NAME "` FROM `" NODES_TABLE_NAME "`\n" "WHERE `" TENANT_COLUMN_NAME"` = $tenant AND `" EXPIRE_AT_COLUMN_NAME "` >= $now;\n" - ); + ); auto prepareParams = [=](const TVector<TResultSet>& resultSets) { for (const auto& resultSet : resultSets) { @@ -74,31 +74,31 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvNodesHealth } } } - + TSqlQueryBuilder writeQueryBuilder(YdbConnection->TablePathPrefix, "NodesHealthCheck(write)"); - writeQueryBuilder.AddString("tenant", tenant); - writeQueryBuilder.AddUint32("node_id", nodeId); - writeQueryBuilder.AddString("instance_id", instanceId); - writeQueryBuilder.AddString("hostname", hostName); - writeQueryBuilder.AddTimestamp("deadline", deadline); - writeQueryBuilder.AddUint64("active_workers", activeWorkers); - writeQueryBuilder.AddUint64("memory_limit", memoryLimit); - writeQueryBuilder.AddUint64("memory_allocated", memoryAllocated); - writeQueryBuilder.AddUint32("ic_port", icPort); - writeQueryBuilder.AddString("node_address", nodeAddress); - writeQueryBuilder.AddText( - "UPSERT INTO `" NODES_TABLE_NAME "`\n" - "(`" TENANT_COLUMN_NAME "`, `" NODE_ID_COLUMN_NAME "`, `" INSTANCE_ID_COLUMN_NAME "`,\n" - "`" HOST_NAME_COLUMN_NAME "`, `" EXPIRE_AT_COLUMN_NAME "`, `" ACTIVE_WORKERS_COLUMN_NAME"`, `" MEMORY_LIMIT_COLUMN_NAME"`, `" MEMORY_ALLOCATED_COLUMN_NAME "`, `" INTERCONNECT_PORT_COLUMN_NAME "`, `" NODE_ADDRESS_COLUMN_NAME "`)\n" - "VALUES ($tenant ,$node_id, $instance_id, $hostname, $deadline, $active_workers, $memory_limit, $memory_allocated, $ic_port, $node_address);\n" - ); - const auto writeQuery = writeQueryBuilder.Build(); - return std::make_pair(writeQuery.Sql, writeQuery.Params); + writeQueryBuilder.AddString("tenant", tenant); + writeQueryBuilder.AddUint32("node_id", nodeId); + writeQueryBuilder.AddString("instance_id", instanceId); + writeQueryBuilder.AddString("hostname", hostName); + writeQueryBuilder.AddTimestamp("deadline", deadline); + writeQueryBuilder.AddUint64("active_workers", activeWorkers); + writeQueryBuilder.AddUint64("memory_limit", memoryLimit); + writeQueryBuilder.AddUint64("memory_allocated", memoryAllocated); + writeQueryBuilder.AddUint32("ic_port", icPort); + writeQueryBuilder.AddString("node_address", nodeAddress); + writeQueryBuilder.AddText( + "UPSERT INTO `" NODES_TABLE_NAME "`\n" + "(`" TENANT_COLUMN_NAME "`, `" NODE_ID_COLUMN_NAME "`, `" INSTANCE_ID_COLUMN_NAME "`,\n" + "`" HOST_NAME_COLUMN_NAME "`, `" EXPIRE_AT_COLUMN_NAME "`, `" ACTIVE_WORKERS_COLUMN_NAME"`, `" MEMORY_LIMIT_COLUMN_NAME"`, `" MEMORY_ALLOCATED_COLUMN_NAME "`, `" INTERCONNECT_PORT_COLUMN_NAME "`, `" NODE_ADDRESS_COLUMN_NAME "`)\n" + "VALUES ($tenant ,$node_id, $instance_id, $hostname, $deadline, $active_workers, $memory_limit, $memory_allocated, $ic_port, $node_address);\n" + ); + const auto writeQuery = writeQueryBuilder.Build(); + return std::make_pair(writeQuery.Sql, writeQuery.Params); }; - const auto readQuery = readQueryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - TAsyncStatus status = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo); + const auto readQuery = readQueryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + TAsyncStatus status = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo); auto prepare = [response] { return *response; }; auto success = SendResponse<TEvControlPlaneStorage::TEvNodesHealthCheckResponse, Yq::Private::NodesHealthCheckResult>( "NodesHealthCheckRequest", diff --git a/ydb/core/yq/libs/control_plane_storage/internal/response_tasks.h b/ydb/core/yq/libs/control_plane_storage/internal/response_tasks.h index 1ab660d43d..023b52b1b2 100644 --- a/ydb/core/yq/libs/control_plane_storage/internal/response_tasks.h +++ b/ydb/core/yq/libs/control_plane_storage/internal/response_tasks.h @@ -2,7 +2,7 @@ #include <util/system/mutex.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> - + namespace NYq { class TResponseTasks { @@ -28,4 +28,4 @@ private: THashMap<TString, TEvControlPlaneStorage::TTask> Tasks; }; -} //NYq +} //NYq diff --git a/ydb/core/yq/libs/control_plane_storage/internal/task_get.cpp b/ydb/core/yq/libs/control_plane_storage/internal/task_get.cpp index 42b3c1a1ac..d540b5c9b3 100644 --- a/ydb/core/yq/libs/control_plane_storage/internal/task_get.cpp +++ b/ydb/core/yq/libs/control_plane_storage/internal/task_get.cpp @@ -2,11 +2,11 @@ #include <random> -#include <util/datetime/base.h> - +#include <util/datetime/base.h> + #include <ydb/core/yq/libs/control_plane_storage/schema.h> #include <ydb/core/yq/libs/db_schema/db_schema.h> - + namespace NYq { namespace { @@ -31,33 +31,33 @@ std::pair<TString, NYdb::TParams> MakeSql(const TTaskInternal& taskInternal) { const auto& owner = taskInternal.Owner; TSqlQueryBuilder queryBuilder(taskInternal.TablePathPrefix, "GetTask(write)"); - queryBuilder.AddString("scope", task.Scope); - queryBuilder.AddString("query_id", task.QueryId); - queryBuilder.AddString("query", task.Query.SerializeAsString()); - queryBuilder.AddString("internal", task.Internal.SerializeAsString()); - queryBuilder.AddString("host", hostName); - queryBuilder.AddString("owner", owner); - queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddUint64("retry_counter", retryCounter); - queryBuilder.AddUint64("generation", task.Generation); - queryBuilder.AddTimestamp("retry_counter_update_time", retryCounterUpdatedAt); - - // update queries - queryBuilder.AddText( + queryBuilder.AddString("scope", task.Scope); + queryBuilder.AddString("query_id", task.QueryId); + queryBuilder.AddString("query", task.Query.SerializeAsString()); + queryBuilder.AddString("internal", task.Internal.SerializeAsString()); + queryBuilder.AddString("host", hostName); + queryBuilder.AddString("owner", owner); + queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddUint64("retry_counter", retryCounter); + queryBuilder.AddUint64("generation", task.Generation); + queryBuilder.AddTimestamp("retry_counter_update_time", retryCounterUpdatedAt); + + // update queries + queryBuilder.AddText( "UPDATE `" QUERIES_TABLE_NAME "` SET `" GENERATION_COLUMN_NAME "` = $generation, `" QUERY_COLUMN_NAME "` = $query, `" INTERNAL_COLUMN_NAME "` = $internal\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - ); - - // update pending small - queryBuilder.AddText( + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + ); + + // update pending small + queryBuilder.AddText( "UPDATE `" PENDING_SMALL_TABLE_NAME "` SET `" LAST_SEEN_AT_COLUMN_NAME "` = $now,\n" "`" RETRY_COUNTER_COLUMN_NAME "` = $retry_counter, `" RETRY_COUNTER_UPDATE_COLUMN_NAME "` = $retry_counter_update_time, `" IS_RESIGN_QUERY_COLUMN_NAME "` = false,\n" "`" HOST_NAME_COLUMN_NAME "` = $host, `" OWNER_COLUMN_NAME "` = $owner\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - ); + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + ); - const auto query = queryBuilder.Build(); - return std::make_pair(query.Sql, query.Params); + const auto query = queryBuilder.Build(); + return std::make_pair(query.Sql, query.Params); } } // namespace @@ -65,7 +65,7 @@ std::pair<TString, NYdb::TParams> MakeSql(const TTaskInternal& taskInternal) { std::tuple<TString, NYdb::TParams, std::function<std::pair<TString, NYdb::TParams>(const TVector<NYdb::TResultSet>&)>> MakeGetTaskUpdateQuery( const TTaskInternal& taskInternal, const std::shared_ptr<TResponseTasks>& responseTasks, - const TInstant& taskLeaseTimestamp, + const TInstant& taskLeaseTimestamp, bool disableCurrentIam, const TDuration& automaticQueriesTtl, const TDuration& resultSetsTtl) @@ -73,18 +73,18 @@ std::tuple<TString, NYdb::TParams, std::function<std::pair<TString, NYdb::TParam const auto& task = taskInternal.Task; TSqlQueryBuilder queryBuilder(taskInternal.TablePathPrefix, "GetTask(read)"); - queryBuilder.AddString("scope", task.Scope); - queryBuilder.AddString("query_id", task.QueryId); - queryBuilder.AddTimestamp("from", taskLeaseTimestamp); + queryBuilder.AddString("scope", task.Scope); + queryBuilder.AddString("query_id", task.QueryId); + queryBuilder.AddTimestamp("from", taskLeaseTimestamp); - queryBuilder.AddText( + queryBuilder.AddText( "SELECT `" GENERATION_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "`, `" QUERY_COLUMN_NAME "`\n" "FROM `" QUERIES_TABLE_NAME "`\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" "SELECT `" LAST_SEEN_AT_COLUMN_NAME "`\n" "FROM `" PENDING_SMALL_TABLE_NAME "`\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" LAST_SEEN_AT_COLUMN_NAME "` < $from;\n" - ); + ); auto prepareParams = [=, taskInternal=taskInternal, responseTasks=responseTasks](const TVector<TResultSet>& resultSets) mutable { auto& task = taskInternal.Task; @@ -109,9 +109,9 @@ std::tuple<TString, NYdb::TParams, std::function<std::pair<TString, NYdb::TParam throw TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query internal. Please contact internal support"; } - if (disableCurrentIam) { - task.Internal.clear_token(); - } + if (disableCurrentIam) { + task.Internal.clear_token(); + } } } @@ -128,8 +128,8 @@ std::tuple<TString, NYdb::TParams, std::function<std::pair<TString, NYdb::TParam return MakeSql(taskInternal); }; - const auto query = queryBuilder.Build(); - return std::make_tuple(query.Sql, query.Params, prepareParams); + const auto query = queryBuilder.Build(); + return std::make_tuple(query.Sql, query.Params, prepareParams); } void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetTaskRequest::TPtr& ev) @@ -141,8 +141,8 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetTaskRequ TEvControlPlaneStorage::TEvGetTaskRequest& request = *ev->Get(); const TString owner = request.Owner; const TString hostName = request.HostName; - const ui64 tasksBatchSize = Config.Proto.GetTasksBatchSize(); - const ui64 numTasksProportion = Config.Proto.GetNumTasksProportion(); + const ui64 tasksBatchSize = Config.Proto.GetTasksBatchSize(); + const ui64 numTasksProportion = Config.Proto.GetNumTasksProportion(); CPS_LOG_T("GetTaskRequest: " << owner << " " << hostName); @@ -155,20 +155,20 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetTaskRequ return; } - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; auto response = std::make_shared<std::tuple<TVector<TEvControlPlaneStorage::TTask>, TString>>(); //tasks, owner TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "GetTask(read stale ro)"); - const auto taskLeaseTimestamp = TInstant::Now() - Config.TaskLeaseTtl; - queryBuilder.AddTimestamp("from", taskLeaseTimestamp); - queryBuilder.AddUint64("tasks_limit", tasksBatchSize); - queryBuilder.AddText( + const auto taskLeaseTimestamp = TInstant::Now() - Config.TaskLeaseTtl; + queryBuilder.AddTimestamp("from", taskLeaseTimestamp); + queryBuilder.AddUint64("tasks_limit", tasksBatchSize); + queryBuilder.AddText( "SELECT `" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`,\n" "`" RETRY_COUNTER_COLUMN_NAME "`, `" RETRY_COUNTER_UPDATE_COLUMN_NAME "`, `" QUERY_TYPE_COLUMN_NAME "`, `" IS_RESIGN_QUERY_COLUMN_NAME "`\n" "FROM `" PENDING_SMALL_TABLE_NAME "`\n" "WHERE `" LAST_SEEN_AT_COLUMN_NAME "` < $from ORDER BY `" QUERY_ID_COLUMN_NAME "` DESC LIMIT $tasks_limit;\n" - ); + ); auto responseTasks = std::make_shared<TResponseTasks>(); auto prepareParams = [=, responseTasks=responseTasks](const TVector<TResultSet>& resultSets) mutable { @@ -197,8 +197,8 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetTaskRequ YandexQuery::QueryContent::QueryType queryType = static_cast<YandexQuery::QueryContent::QueryType>(parser.ColumnParser(QUERY_TYPE_COLUMN_NAME).GetOptionalInt64().GetOrElse(0)); - const auto retryCounterLimit = queryType == YandexQuery::QueryContent::ANALYTICS ? Config.Proto.GetAnalyticsRetryCounterLimit() : Config.Proto.GetStreamingRetryCounterLimit(); - const auto retryCounterUpdateTime = queryType == YandexQuery::QueryContent::ANALYTICS ? Config.AnalyticsRetryCounterUpdateTime : Config.StreamingRetryCounterUpdateTime; + const auto retryCounterLimit = queryType == YandexQuery::QueryContent::ANALYTICS ? Config.Proto.GetAnalyticsRetryCounterLimit() : Config.Proto.GetStreamingRetryCounterLimit(); + const auto retryCounterUpdateTime = queryType == YandexQuery::QueryContent::ANALYTICS ? Config.AnalyticsRetryCounterUpdateTime : Config.StreamingRetryCounterUpdateTime; if (isResignQuery) { continue; @@ -231,8 +231,8 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetTaskRequ return pickTaskParams; }; - const auto query = queryBuilder.Build(); - auto [readStatus, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo, TTxSettings::StaleRO()); + const auto query = queryBuilder.Build(); + auto [readStatus, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo, TTxSettings::StaleRO()); auto result = readStatus.Apply( [=, resultSets=resultSets, @@ -251,25 +251,25 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetTaskRequ if (pickTaskParams.empty()) return readFuture; - auto debugInfos = std::make_shared<TVector<TDebugInfoPtr>>(pickTaskParams.size()); - if (Config.Proto.GetEnableDebugMode()) { - for (size_t i = 0; i < pickTaskParams.size(); i++) { - (*debugInfos)[i] = std::make_shared<TDebugInfo>(); - } - } - + auto debugInfos = std::make_shared<TVector<TDebugInfoPtr>>(pickTaskParams.size()); + if (Config.Proto.GetEnableDebugMode()) { + for (size_t i = 0; i < pickTaskParams.size(); i++) { + (*debugInfos)[i] = std::make_shared<TDebugInfo>(); + } + } + TVector<TFuture<void>> futures; for (size_t i = 0; i < pickTaskParams.size(); ++i) { - futures.emplace_back(PickTask(pickTaskParams[i], requestCounters, (*debugInfos)[i], responseTasks)); + futures.emplace_back(PickTask(pickTaskParams[i], requestCounters, (*debugInfos)[i], responseTasks)); } auto allFuture = NThreading::WaitExceptionOrAll(futures); return allFuture.Apply([=, responseTasks=responseTasks](const auto& future) mutable { - if (debugInfo) { - for (const auto& info: *debugInfos) { - debugInfo->insert(debugInfo->end(), info->begin(), info->end()); - } - } + if (debugInfo) { + for (const auto& info: *debugInfos) { + debugInfo->insert(debugInfo->end(), info->begin(), info->end()); + } + } NYql::TIssues issues; auto status = MakeFuture(TStatus{EStatus::SUCCESS, std::move(issues)}); try { diff --git a/ydb/core/yq/libs/control_plane_storage/internal/task_ping.cpp b/ydb/core/yq/libs/control_plane_storage/internal/task_ping.cpp index 834d40c0f7..2f19b8e7ca 100644 --- a/ydb/core/yq/libs/control_plane_storage/internal/task_ping.cpp +++ b/ydb/core/yq/libs/control_plane_storage/internal/task_ping.cpp @@ -1,9 +1,9 @@ #include "utils.h" -#include <util/datetime/base.h> - +#include <util/datetime/base.h> + #include <ydb/core/yq/libs/db_schema/db_schema.h> - + namespace NYq { namespace { @@ -22,9 +22,9 @@ std::tuple<TString, TParams, const std::function<std::pair<TString, NYdb::TParam const TString& tablePathPrefix, const TDuration& automaticQueriesTtl) { TSqlQueryBuilder readQueryBuilder(tablePathPrefix, "HardPingTask(read)"); - readQueryBuilder.AddString("scope", request->Scope); - readQueryBuilder.AddString("query_id", request->QueryId); - readQueryBuilder.AddText( + readQueryBuilder.AddString("scope", request->Scope); + readQueryBuilder.AddString("query_id", request->QueryId); + readQueryBuilder.AddText( "$last_job_id = SELECT `" LAST_JOB_ID_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" " WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" "SELECT `" QUERY_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" @@ -33,7 +33,7 @@ std::tuple<TString, TParams, const std::function<std::pair<TString, NYdb::TParam " WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" JOB_ID_COLUMN_NAME "` = $last_job_id;\n" "SELECT `" OWNER_COLUMN_NAME "` FROM `" PENDING_SMALL_TABLE_NAME "`\n" " WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - ); + ); auto prepareParams = [=](const TVector<TResultSet>& resultSets) { TString jobId; @@ -204,87 +204,87 @@ std::tuple<TString, TParams, const std::function<std::pair<TString, NYdb::TParam } TSqlQueryBuilder writeQueryBuilder(tablePathPrefix, "HardPingTask(write)"); - writeQueryBuilder.AddString("scope", request->Scope); - writeQueryBuilder.AddString("job_id", jobId); - writeQueryBuilder.AddString("job", job.SerializeAsString()); - writeQueryBuilder.AddString("query", query.SerializeAsString()); - writeQueryBuilder.AddInt64("status", query.meta().status()); - writeQueryBuilder.AddString("internal", internal.SerializeAsString()); - writeQueryBuilder.AddString("result_id", request->ResultId); - writeQueryBuilder.AddString("query_id", request->QueryId); - - if (IsTerminalStatus(query.meta().status())) { - // delete pending - writeQueryBuilder.AddText( - "DELETE FROM `" PENDING_SMALL_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - ); - } else { + writeQueryBuilder.AddString("scope", request->Scope); + writeQueryBuilder.AddString("job_id", jobId); + writeQueryBuilder.AddString("job", job.SerializeAsString()); + writeQueryBuilder.AddString("query", query.SerializeAsString()); + writeQueryBuilder.AddInt64("status", query.meta().status()); + writeQueryBuilder.AddString("internal", internal.SerializeAsString()); + writeQueryBuilder.AddString("result_id", request->ResultId); + writeQueryBuilder.AddString("query_id", request->QueryId); + + if (IsTerminalStatus(query.meta().status())) { + // delete pending + writeQueryBuilder.AddText( + "DELETE FROM `" PENDING_SMALL_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + ); + } else { // update pending small - writeQueryBuilder.AddTimestamp("now", request->ResignQuery ? TInstant::Zero() : TInstant::Now()); - const TString updateResignQueryFlag = request->ResignQuery ? ", `" IS_RESIGN_QUERY_COLUMN_NAME "` = true" : ""; - writeQueryBuilder.AddText( - "UPDATE `" PENDING_SMALL_TABLE_NAME "` SET `" LAST_SEEN_AT_COLUMN_NAME "` = $now " + updateResignQueryFlag + "\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - ); - } - - if (IsTerminalStatus(query.meta().status()) && query.content().automatic()) { - // set jobs ttl - writeQueryBuilder.AddText( - "UPDATE `" JOBS_TABLE_NAME "` SET `" EXPIRE_AT_COLUMN_NAME "` = $expire_at\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" EXPIRE_AT_COLUMN_NAME "` IS NULL;\n" - ); - } else if (IsTerminalStatus(query.meta().status())) { - // set jobs ttl null - writeQueryBuilder.AddText( - "UPDATE `" JOBS_TABLE_NAME "` SET `" EXPIRE_AT_COLUMN_NAME "` = NULL\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" EXPIRE_AT_COLUMN_NAME "` IS NOT NULL;\n" - ); - } - - TString updateResultSetsExpire; - if (query.meta().status() == YandexQuery::QueryMeta::COMPLETED) { - writeQueryBuilder.AddTimestamp("result_sets_expire_at", request->Deadline); - updateResultSetsExpire = "`" RESULT_SETS_EXPIRE_AT_COLUMN_NAME "` = $result_sets_expire_at"; - } else { - updateResultSetsExpire = "`" RESULT_SETS_EXPIRE_AT_COLUMN_NAME "` = NULL"; - } - - TString updateQueryTtl; - if (IsTerminalStatus(query.meta().status()) && query.content().automatic()) { - writeQueryBuilder.AddTimestamp("expire_at", expireAt); - updateQueryTtl = "`" EXPIRE_AT_COLUMN_NAME "` = $expire_at"; - } else { - updateQueryTtl = "`" EXPIRE_AT_COLUMN_NAME "` = NULL"; - } - - writeQueryBuilder.AddText( + writeQueryBuilder.AddTimestamp("now", request->ResignQuery ? TInstant::Zero() : TInstant::Now()); + const TString updateResignQueryFlag = request->ResignQuery ? ", `" IS_RESIGN_QUERY_COLUMN_NAME "` = true" : ""; + writeQueryBuilder.AddText( + "UPDATE `" PENDING_SMALL_TABLE_NAME "` SET `" LAST_SEEN_AT_COLUMN_NAME "` = $now " + updateResignQueryFlag + "\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + ); + } + + if (IsTerminalStatus(query.meta().status()) && query.content().automatic()) { + // set jobs ttl + writeQueryBuilder.AddText( + "UPDATE `" JOBS_TABLE_NAME "` SET `" EXPIRE_AT_COLUMN_NAME "` = $expire_at\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" EXPIRE_AT_COLUMN_NAME "` IS NULL;\n" + ); + } else if (IsTerminalStatus(query.meta().status())) { + // set jobs ttl null + writeQueryBuilder.AddText( + "UPDATE `" JOBS_TABLE_NAME "` SET `" EXPIRE_AT_COLUMN_NAME "` = NULL\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" EXPIRE_AT_COLUMN_NAME "` IS NOT NULL;\n" + ); + } + + TString updateResultSetsExpire; + if (query.meta().status() == YandexQuery::QueryMeta::COMPLETED) { + writeQueryBuilder.AddTimestamp("result_sets_expire_at", request->Deadline); + updateResultSetsExpire = "`" RESULT_SETS_EXPIRE_AT_COLUMN_NAME "` = $result_sets_expire_at"; + } else { + updateResultSetsExpire = "`" RESULT_SETS_EXPIRE_AT_COLUMN_NAME "` = NULL"; + } + + TString updateQueryTtl; + if (IsTerminalStatus(query.meta().status()) && query.content().automatic()) { + writeQueryBuilder.AddTimestamp("expire_at", expireAt); + updateQueryTtl = "`" EXPIRE_AT_COLUMN_NAME "` = $expire_at"; + } else { + updateQueryTtl = "`" EXPIRE_AT_COLUMN_NAME "` = NULL"; + } + + writeQueryBuilder.AddText( "UPSERT INTO `" JOBS_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`, `" JOB_ID_COLUMN_NAME "`, `" JOB_COLUMN_NAME "`) VALUES($scope, $query_id, $job_id, $job);\n" "UPDATE `" QUERIES_TABLE_NAME "` SET `" QUERY_COLUMN_NAME "` = $query, `" STATUS_COLUMN_NAME "` = $status, `" INTERNAL_COLUMN_NAME "` = $internal, `" RESULT_ID_COLUMN_NAME "` = $result_id, " + updateResultSetsExpire + ", " + updateQueryTtl + ", `" META_REVISION_COLUMN_NAME "` = `" META_REVISION_COLUMN_NAME "` + 1\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - ); + ); *response = internal.action(); - const auto writeQuery = writeQueryBuilder.Build(); - return std::make_pair(writeQuery.Sql, writeQuery.Params); + const auto writeQuery = writeQueryBuilder.Build(); + return std::make_pair(writeQuery.Sql, writeQuery.Params); }; - const auto readQuery = readQueryBuilder.Build(); - return std::make_tuple(readQuery.Sql, readQuery.Params, prepareParams); + const auto readQuery = readQueryBuilder.Build(); + return std::make_tuple(readQuery.Sql, readQuery.Params, prepareParams); } std::tuple<TString, TParams, const std::function<std::pair<TString, NYdb::TParams>(const TVector<NYdb::TResultSet>&)>> ConstructSoftPingTask( const TEvControlPlaneStorage::TEvPingTaskRequest* request, std::shared_ptr<YandexQuery::QueryAction> response, const TString& tablePathPrefix) { TSqlQueryBuilder readQueryBuilder(tablePathPrefix, "SoftPingTask(read)"); - readQueryBuilder.AddString("scope", request->Scope); - readQueryBuilder.AddString("query_id", request->QueryId); - readQueryBuilder.AddText( + readQueryBuilder.AddString("scope", request->Scope); + readQueryBuilder.AddString("query_id", request->QueryId); + readQueryBuilder.AddText( "SELECT `" INTERNAL_COLUMN_NAME "`\n" "FROM `" QUERIES_TABLE_NAME "` WHERE `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" SCOPE_COLUMN_NAME "` = $scope;\n" "SELECT `" OWNER_COLUMN_NAME "`\n" "FROM `" PENDING_SMALL_TABLE_NAME "` WHERE `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" SCOPE_COLUMN_NAME "` = $scope;\n" - ); + ); auto prepareParams = [=](const TVector<TResultSet>& resultSets) { TString selectedOwner; @@ -316,22 +316,22 @@ std::tuple<TString, TParams, const std::function<std::pair<TString, NYdb::TParam } TSqlQueryBuilder writeQueryBuilder(tablePathPrefix, "SoftPingTask(write)"); - writeQueryBuilder.AddTimestamp("now", request->ResignQuery ? TInstant::Zero() : TInstant::Now()); - writeQueryBuilder.AddString("scope", request->Scope); - writeQueryBuilder.AddString("query_id", request->QueryId); - writeQueryBuilder.AddString("owner", request->Owner); + writeQueryBuilder.AddTimestamp("now", request->ResignQuery ? TInstant::Zero() : TInstant::Now()); + writeQueryBuilder.AddString("scope", request->Scope); + writeQueryBuilder.AddString("query_id", request->QueryId); + writeQueryBuilder.AddString("owner", request->Owner); const TString updateResignQueryFlag = request->ResignQuery ? ", `" IS_RESIGN_QUERY_COLUMN_NAME "` = true" : ""; - writeQueryBuilder.AddText( - "UPDATE `" PENDING_SMALL_TABLE_NAME "` SET `" LAST_SEEN_AT_COLUMN_NAME "` = $now " + updateResignQueryFlag + "\n" + writeQueryBuilder.AddText( + "UPDATE `" PENDING_SMALL_TABLE_NAME "` SET `" LAST_SEEN_AT_COLUMN_NAME "` = $now " + updateResignQueryFlag + "\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" ); - const auto writeQuery = writeQueryBuilder.Build(); - return std::make_pair(writeQuery.Sql, writeQuery.Params); + const auto writeQuery = writeQueryBuilder.Build(); + return std::make_pair(writeQuery.Sql, writeQuery.Params); }; - const auto readQuery = readQueryBuilder.Build(); - return std::make_tuple(readQuery.Sql, readQuery.Params, prepareParams); + const auto readQuery = readQueryBuilder.Build(); + return std::make_tuple(readQuery.Sql, readQuery.Params, prepareParams); } void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvPingTaskRequest::TPtr& ev) @@ -364,13 +364,13 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvPingTaskReq if (request->Status) FinalStatusCounters.IncByStatus(*request->Status); auto pingTaskParams = DoesPingTaskUpdateQueriesTable(request) ? - ConstructHardPingTask(request, response, YdbConnection->TablePathPrefix, Config.AutomaticQueriesTtl) : + ConstructHardPingTask(request, response, YdbConnection->TablePathPrefix, Config.AutomaticQueriesTtl) : ConstructSoftPingTask(request, response, YdbConnection->TablePathPrefix); auto readQuery = std::get<0>(pingTaskParams); // Use std::get for win compiler auto readParams = std::get<1>(pingTaskParams); auto prepareParams = std::get<2>(pingTaskParams); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery, readParams, prepareParams, requestCounters, debugInfo); auto prepare = [response] { return std::make_tuple(*response); }; auto success = SendResponseTuple<TEvControlPlaneStorage::TEvPingTaskResponse, std::tuple<YandexQuery::QueryAction>>( diff --git a/ydb/core/yq/libs/control_plane_storage/internal/task_result_write.cpp b/ydb/core/yq/libs/control_plane_storage/internal/task_result_write.cpp index db945dcca9..5b3d00a5b9 100644 --- a/ydb/core/yq/libs/control_plane_storage/internal/task_result_write.cpp +++ b/ydb/core/yq/libs/control_plane_storage/internal/task_result_write.cpp @@ -12,7 +12,7 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvWriteResult const TString resultId = request.ResultId; const int32_t resultSetId = request.ResultSetId; const int64_t startRowId = request.StartRowId; - const TInstant deadline = request.Deadline; + const TInstant deadline = request.Deadline; const Ydb::ResultSet& resultSet = request.ResultSet; const int byteSize = resultSet.ByteSize(); @@ -40,7 +40,7 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvWriteResult itemsAsList.AddListItem() .BeginStruct() .AddMember("row_id").Int64(rowId) - .AddMember("result_set").String(row.SerializeAsString()) + .AddMember("result_set").String(row.SerializeAsString()) .EndStruct(); rowId++; } @@ -48,20 +48,20 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvWriteResult itemsAsList.EndList(); TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "TaskResultWrite"); - queryBuilder.AddString("result_id", resultId); - queryBuilder.AddInt32("result_set_id", resultSetId); - queryBuilder.AddTimestamp("expire_at", deadline); - queryBuilder.AddValue("items", itemsAsList.Build()); + queryBuilder.AddString("result_id", resultId); + queryBuilder.AddInt32("result_set_id", resultSetId); + queryBuilder.AddTimestamp("expire_at", deadline); + queryBuilder.AddValue("items", itemsAsList.Build()); - queryBuilder.AddText( + queryBuilder.AddText( "UPSERT INTO `" RESULT_SETS_TABLE_NAME "`\n" "SELECT $result_id as result_id, $result_set_id as result_set_id,\n" - " T.*, $expire_at as expire_at FROM as_table($items) AS T;\n" - ); + " T.*, $expire_at as expire_at FROM as_table($items) AS T;\n" + ); - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - TAsyncStatus result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo); + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + TAsyncStatus result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo); auto prepare = []() { return std::make_tuple<NYql::TIssues>(NYql::TIssues{}); }; auto success = SendResponseTuple<TEvControlPlaneStorage::TEvWriteResultDataResponse, std::tuple<NYql::TIssues>>( "WriteResultDataRequest", diff --git a/ydb/core/yq/libs/control_plane_storage/internal/utils.h b/ydb/core/yq/libs/control_plane_storage/internal/utils.h index 2fd0f708d1..793c0c5053 100644 --- a/ydb/core/yq/libs/control_plane_storage/internal/utils.h +++ b/ydb/core/yq/libs/control_plane_storage/internal/utils.h @@ -1,11 +1,11 @@ #pragma once -#include <tuple> - +#include <tuple> + #include <ydb/public/sdk/cpp/client/ydb_value/value.h> - + #include <ydb/library/yql/public/issue/yql_issue_message.h> - + #include <ydb/core/yq/libs/config/protos/issue_id.pb.h> #include <ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_impl.h> @@ -29,4 +29,4 @@ NYql::TIssues ValidateNodesHealthCheck( const TString& instanceId, const TString& hostName); -}; +}; diff --git a/ydb/core/yq/libs/control_plane_storage/message_builders.h b/ydb/core/yq/libs/control_plane_storage/message_builders.h index 75ee6f1f9f..ef7a629c70 100644 --- a/ydb/core/yq/libs/control_plane_storage/message_builders.h +++ b/ydb/core/yq/libs/control_plane_storage/message_builders.h @@ -1,131 +1,131 @@ -#pragma once - +#pragma once + #include <util/datetime/base.h> - + #include <ydb/public/api/protos/yq.pb.h> - + #include <ydb/core/yq/libs/control_plane_storage/events/events.h> - -namespace NYq { - -// Queries - -class TCreateQueryBuilder { - YandexQuery::CreateQueryRequest Request; - -public: - TCreateQueryBuilder() - { - SetMode(YandexQuery::RUN); - SetType(YandexQuery::QueryContent::ANALYTICS); - SetName("test_query_name_1"); - SetVisibility(YandexQuery::Acl::SCOPE); - SetText("SELECT 1;"); - } - - TCreateQueryBuilder& SetMode(YandexQuery::ExecuteMode mode) - { - Request.set_execute_mode(mode); - return *this; - } - - TCreateQueryBuilder& SetType(YandexQuery::QueryContent::QueryType type) - { - Request.mutable_content()->set_type(type); - return *this; - } - - TCreateQueryBuilder& SetAutomatic(bool automatic) - { - Request.mutable_content()->set_automatic(automatic); - return *this; - } - - TCreateQueryBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) - { - Request.mutable_content()->mutable_acl()->set_visibility(visibility); - return *this; - } - - TCreateQueryBuilder& SetText(const TString& content) - { - Request.mutable_content()->set_text(content); - return *this; - } - - TCreateQueryBuilder& SetName(const TString& name) - { - Request.mutable_content()->set_name(name); - return *this; - } - - TCreateQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TCreateQueryBuilder& SetDisposition(const YandexQuery::StreamingDisposition& disposition) - { - *Request.mutable_disposition() = disposition; - return *this; - } - - TCreateQueryBuilder& ClearAcl() - { - Request.mutable_content()->clear_acl(); - return *this; - } - - const YandexQuery::CreateQueryRequest& Build() - { - return Request; - } -}; - -class TListQueriesBuilder { - YandexQuery::ListQueriesRequest Request; - -public: - TListQueriesBuilder() - { - SetLimit(10); - } - - TListQueriesBuilder& SetPageToken(const TString& pageToken) - { - Request.set_page_token(pageToken); - return *this; - } - - TListQueriesBuilder& SetLimit(int64_t limit) - { - Request.set_limit(limit); - return *this; - } - - const YandexQuery::ListQueriesRequest& Build() - { - return Request; - } -}; - -class TDescribeQueryBuilder { - YandexQuery::DescribeQueryRequest Request; - -public: - TDescribeQueryBuilder& SetQueryId(const TString& queryId) - { - Request.set_query_id(queryId); - return *this; - } - - const YandexQuery::DescribeQueryRequest& Build() - { - return Request; - } -}; - + +namespace NYq { + +// Queries + +class TCreateQueryBuilder { + YandexQuery::CreateQueryRequest Request; + +public: + TCreateQueryBuilder() + { + SetMode(YandexQuery::RUN); + SetType(YandexQuery::QueryContent::ANALYTICS); + SetName("test_query_name_1"); + SetVisibility(YandexQuery::Acl::SCOPE); + SetText("SELECT 1;"); + } + + TCreateQueryBuilder& SetMode(YandexQuery::ExecuteMode mode) + { + Request.set_execute_mode(mode); + return *this; + } + + TCreateQueryBuilder& SetType(YandexQuery::QueryContent::QueryType type) + { + Request.mutable_content()->set_type(type); + return *this; + } + + TCreateQueryBuilder& SetAutomatic(bool automatic) + { + Request.mutable_content()->set_automatic(automatic); + return *this; + } + + TCreateQueryBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) + { + Request.mutable_content()->mutable_acl()->set_visibility(visibility); + return *this; + } + + TCreateQueryBuilder& SetText(const TString& content) + { + Request.mutable_content()->set_text(content); + return *this; + } + + TCreateQueryBuilder& SetName(const TString& name) + { + Request.mutable_content()->set_name(name); + return *this; + } + + TCreateQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TCreateQueryBuilder& SetDisposition(const YandexQuery::StreamingDisposition& disposition) + { + *Request.mutable_disposition() = disposition; + return *this; + } + + TCreateQueryBuilder& ClearAcl() + { + Request.mutable_content()->clear_acl(); + return *this; + } + + const YandexQuery::CreateQueryRequest& Build() + { + return Request; + } +}; + +class TListQueriesBuilder { + YandexQuery::ListQueriesRequest Request; + +public: + TListQueriesBuilder() + { + SetLimit(10); + } + + TListQueriesBuilder& SetPageToken(const TString& pageToken) + { + Request.set_page_token(pageToken); + return *this; + } + + TListQueriesBuilder& SetLimit(int64_t limit) + { + Request.set_limit(limit); + return *this; + } + + const YandexQuery::ListQueriesRequest& Build() + { + return Request; + } +}; + +class TDescribeQueryBuilder { + YandexQuery::DescribeQueryRequest Request; + +public: + TDescribeQueryBuilder& SetQueryId(const TString& queryId) + { + Request.set_query_id(queryId); + return *this; + } + + const YandexQuery::DescribeQueryRequest& Build() + { + return Request; + } +}; + class TGetQueryStatusBuilder { YandexQuery::GetQueryStatusRequest Request; @@ -142,240 +142,240 @@ public: } }; -class TDeleteQueryBuilder { - YandexQuery::DeleteQueryRequest Request; - -public: - TDeleteQueryBuilder& SetQueryId(const TString& queryId) - { - Request.set_query_id(queryId); - return *this; - } - - TDeleteQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TDeleteQueryBuilder& SetPreviousRevision(const int64_t periousRevision) - { - Request.set_previous_revision(periousRevision); - return *this; - } - - const YandexQuery::DeleteQueryRequest& Build() - { - return Request; - } -}; - -class TModifyQueryBuilder { - YandexQuery::ModifyQueryRequest Request; - -public: - TModifyQueryBuilder() - { - SetName("test_query_name_2"); - SetMode(YandexQuery::RUN); - SetType(YandexQuery::QueryContent::ANALYTICS); - SetVisibility(YandexQuery::Acl::SCOPE); - SetText("SELECT 1;"); - } - - TModifyQueryBuilder& SetQueryId(const TString& queryId) - { - Request.set_query_id(queryId); - return *this; - } - - TModifyQueryBuilder& SetType(YandexQuery::QueryContent::QueryType type) - { - Request.mutable_content()->set_type(type); - return *this; - } - - TModifyQueryBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) - { - Request.mutable_content()->mutable_acl()->set_visibility(visibility); - return *this; - } - - TModifyQueryBuilder& SetMode(YandexQuery::ExecuteMode mode) - { - Request.set_execute_mode(mode); - return *this; - } - +class TDeleteQueryBuilder { + YandexQuery::DeleteQueryRequest Request; + +public: + TDeleteQueryBuilder& SetQueryId(const TString& queryId) + { + Request.set_query_id(queryId); + return *this; + } + + TDeleteQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TDeleteQueryBuilder& SetPreviousRevision(const int64_t periousRevision) + { + Request.set_previous_revision(periousRevision); + return *this; + } + + const YandexQuery::DeleteQueryRequest& Build() + { + return Request; + } +}; + +class TModifyQueryBuilder { + YandexQuery::ModifyQueryRequest Request; + +public: + TModifyQueryBuilder() + { + SetName("test_query_name_2"); + SetMode(YandexQuery::RUN); + SetType(YandexQuery::QueryContent::ANALYTICS); + SetVisibility(YandexQuery::Acl::SCOPE); + SetText("SELECT 1;"); + } + + TModifyQueryBuilder& SetQueryId(const TString& queryId) + { + Request.set_query_id(queryId); + return *this; + } + + TModifyQueryBuilder& SetType(YandexQuery::QueryContent::QueryType type) + { + Request.mutable_content()->set_type(type); + return *this; + } + + TModifyQueryBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) + { + Request.mutable_content()->mutable_acl()->set_visibility(visibility); + return *this; + } + + TModifyQueryBuilder& SetMode(YandexQuery::ExecuteMode mode) + { + Request.set_execute_mode(mode); + return *this; + } + TModifyQueryBuilder& SetAutomatic(bool automatic) { Request.mutable_content()->set_automatic(automatic); return *this; } - TModifyQueryBuilder& SetText(const TString& content) - { - Request.mutable_content()->set_text(content); - return *this; - } - - TModifyQueryBuilder& SetDisposition(const YandexQuery::StreamingDisposition& disposition) - { - *Request.mutable_disposition() = disposition; - return *this; - } - - TModifyQueryBuilder& SetState(const YandexQuery::StateLoadMode& state) - { + TModifyQueryBuilder& SetText(const TString& content) + { + Request.mutable_content()->set_text(content); + return *this; + } + + TModifyQueryBuilder& SetDisposition(const YandexQuery::StreamingDisposition& disposition) + { + *Request.mutable_disposition() = disposition; + return *this; + } + + TModifyQueryBuilder& SetState(const YandexQuery::StateLoadMode& state) + { Request.set_state_load_mode(state); - return *this; - } - - TModifyQueryBuilder& SetName(const TString& name) - { - Request.mutable_content()->set_name(name); - return *this; - } - - TModifyQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TModifyQueryBuilder& SetPreviousRevision(const int64_t periousRevision) - { - Request.set_previous_revision(periousRevision); - return *this; - } - + return *this; + } + + TModifyQueryBuilder& SetName(const TString& name) + { + Request.mutable_content()->set_name(name); + return *this; + } + + TModifyQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TModifyQueryBuilder& SetPreviousRevision(const int64_t periousRevision) + { + Request.set_previous_revision(periousRevision); + return *this; + } + TModifyQueryBuilder& SetDescription(const TString& description) { Request.mutable_content()->set_description(description); return *this; } - const YandexQuery::ModifyQueryRequest& Build() - { - return Request; - } -}; - -class TControlQueryBuilder { - YandexQuery::ControlQueryRequest Request; - -public: - TControlQueryBuilder() - { - SetAction(YandexQuery::ABORT); - } - - TControlQueryBuilder& SetAction(const YandexQuery::QueryAction& action) - { - Request.set_action(action); - return *this; - } - - TControlQueryBuilder& SetQueryId(const TString& queryId) - { - Request.set_query_id(queryId); - return *this; - } - - TControlQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TControlQueryBuilder& SetPreviousRevision(const int64_t periousRevision) - { - Request.set_previous_revision(periousRevision); - return *this; - } - - const YandexQuery::ControlQueryRequest& Build() - { - return Request; - } -}; - -// Results - -class TGetResultDataBuilder { - YandexQuery::GetResultDataRequest Request; - -public: - TGetResultDataBuilder() - { - SetLimit(10); - } - - TGetResultDataBuilder& SetQueryId(const TString& queryId) - { - Request.set_query_id(queryId); - return *this; - } - - TGetResultDataBuilder& SetResultSetIndex(int64_t resultSetIndex) - { - Request.set_result_set_index(resultSetIndex); - return *this; - } - - TGetResultDataBuilder& SetOffset(int64_t offset) - { - Request.set_offset(offset); - return *this; - } - - TGetResultDataBuilder& SetLimit(int64_t limit) - { - Request.set_limit(limit); - return *this; - } - - const YandexQuery::GetResultDataRequest& Build() - { - return Request; - } -}; - -// Jobs - -class TListJobsBuilder { - YandexQuery::ListJobsRequest Request; - -public: - TListJobsBuilder() - { - SetLimit(10); - } - - TListJobsBuilder& SetQueryId(const TString& queryId) - { - Request.mutable_filter()->set_query_id(queryId); - return *this; - } - - TListJobsBuilder& SetPageToken(const TString& pageToken) - { - Request.set_page_token(pageToken); - return *this; - } - - TListJobsBuilder& SetLimit(int64_t limit) - { - Request.set_limit(limit); - return *this; - } - - const YandexQuery::ListJobsRequest& Build() - { - return Request; - } -}; - + const YandexQuery::ModifyQueryRequest& Build() + { + return Request; + } +}; + +class TControlQueryBuilder { + YandexQuery::ControlQueryRequest Request; + +public: + TControlQueryBuilder() + { + SetAction(YandexQuery::ABORT); + } + + TControlQueryBuilder& SetAction(const YandexQuery::QueryAction& action) + { + Request.set_action(action); + return *this; + } + + TControlQueryBuilder& SetQueryId(const TString& queryId) + { + Request.set_query_id(queryId); + return *this; + } + + TControlQueryBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TControlQueryBuilder& SetPreviousRevision(const int64_t periousRevision) + { + Request.set_previous_revision(periousRevision); + return *this; + } + + const YandexQuery::ControlQueryRequest& Build() + { + return Request; + } +}; + +// Results + +class TGetResultDataBuilder { + YandexQuery::GetResultDataRequest Request; + +public: + TGetResultDataBuilder() + { + SetLimit(10); + } + + TGetResultDataBuilder& SetQueryId(const TString& queryId) + { + Request.set_query_id(queryId); + return *this; + } + + TGetResultDataBuilder& SetResultSetIndex(int64_t resultSetIndex) + { + Request.set_result_set_index(resultSetIndex); + return *this; + } + + TGetResultDataBuilder& SetOffset(int64_t offset) + { + Request.set_offset(offset); + return *this; + } + + TGetResultDataBuilder& SetLimit(int64_t limit) + { + Request.set_limit(limit); + return *this; + } + + const YandexQuery::GetResultDataRequest& Build() + { + return Request; + } +}; + +// Jobs + +class TListJobsBuilder { + YandexQuery::ListJobsRequest Request; + +public: + TListJobsBuilder() + { + SetLimit(10); + } + + TListJobsBuilder& SetQueryId(const TString& queryId) + { + Request.mutable_filter()->set_query_id(queryId); + return *this; + } + + TListJobsBuilder& SetPageToken(const TString& pageToken) + { + Request.set_page_token(pageToken); + return *this; + } + + TListJobsBuilder& SetLimit(int64_t limit) + { + Request.set_limit(limit); + return *this; + } + + const YandexQuery::ListJobsRequest& Build() + { + return Request; + } +}; + class TDescribeJobBuilder { YandexQuery::DescribeJobRequest Request; @@ -392,640 +392,640 @@ public: } }; -// Connections - -class TCreateConnectionBuilder { - YandexQuery::CreateConnectionRequest Request; - -public: - TCreateConnectionBuilder() - { - SetName("test_connection_name_1"); - SetVisibility(YandexQuery::Acl::SCOPE); - CreateDataStreams("my_database_id", ""); - } - - TCreateConnectionBuilder& CreateYdb(const TString& database, const TString& endpoint, const TString& serviceAccount) - { - auto& ydb = *Request.mutable_content()->mutable_setting()->mutable_ydb_database(); - if (serviceAccount) { - ydb.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - ydb.mutable_auth()->mutable_current_iam(); - } - - ydb.set_database(database); - ydb.set_endpoint(endpoint); - return *this; - } - - TCreateConnectionBuilder& CreateYdb(const TString& databaseId, const TString& serviceAccount) - { - auto& ydb = *Request.mutable_content()->mutable_setting()->mutable_ydb_database(); - if (serviceAccount) { - ydb.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - ydb.mutable_auth()->mutable_current_iam(); - } - - ydb.set_database_id(databaseId); - return *this; - } - - TCreateConnectionBuilder& CreateDataStreams(const TString& databaseId, const TString& serviceAccount) - { - auto& yds = *Request.mutable_content()->mutable_setting()->mutable_data_streams(); - if (serviceAccount) { - yds.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - yds.mutable_auth()->mutable_current_iam(); - } - - yds.set_database_id(databaseId); - return *this; - } - - TCreateConnectionBuilder& CreateClickHouse(const TString& databaseId, const TString& login, const TString& password, const TString& serviceAccount) - { - auto& ch = *Request.mutable_content()->mutable_setting()->mutable_clickhouse_cluster(); - if (serviceAccount) { - ch.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - ch.mutable_auth()->mutable_current_iam(); - } - - ch.set_database_id(databaseId); - ch.set_login(login); - ch.set_password(password); - return *this; - } - - TCreateConnectionBuilder& CreateObjectStorage(const TString& bucket, const TString& serviceAccount) - { - auto& os = *Request.mutable_content()->mutable_setting()->mutable_object_storage(); - if (serviceAccount) { - os.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - os.mutable_auth()->mutable_current_iam(); - } - - os.set_bucket(bucket); - return *this; - } - - TCreateConnectionBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) - { - Request.mutable_content()->mutable_acl()->set_visibility(visibility); - return *this; - } - - TCreateConnectionBuilder& SetName(const TString& name) - { - Request.mutable_content()->set_name(name); - return *this; - } - - TCreateConnectionBuilder& SetDescription(const TString& description) - { - Request.mutable_content()->set_name(description); - return *this; - } - - TCreateConnectionBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - const YandexQuery::CreateConnectionRequest& Build() - { - return Request; - } -}; - -class TListConnectionsBuilder { - YandexQuery::ListConnectionsRequest Request; - -public: - TListConnectionsBuilder() - { - SetLimit(10); - } - - TListConnectionsBuilder& SetPageToken(const TString& pageToken) - { - Request.set_page_token(pageToken); - return *this; - } - - TListConnectionsBuilder& SetLimit(int64_t limit) - { - Request.set_limit(limit); - return *this; - } - - const YandexQuery::ListConnectionsRequest& Build() - { - return Request; - } -}; - -class TDescribeConnectionBuilder { - YandexQuery::DescribeConnectionRequest Request; - -public: - TDescribeConnectionBuilder& SetConnectionId(const TString& connectionId) - { - Request.set_connection_id(connectionId); - return *this; - } - - const YandexQuery::DescribeConnectionRequest& Build() - { - return Request; - } -}; - -class TModifyConnectionBuilder { - YandexQuery::ModifyConnectionRequest Request; - -public: - TModifyConnectionBuilder() - { - SetName("test_connection_name_2"); - SetVisibility(YandexQuery::Acl::SCOPE); - CreateDataStreams("my_database_id", ""); - } - - TModifyConnectionBuilder& CreateYdb(const TString& databaseId, const TString& serviceAccount) - { - auto& ydb = *Request.mutable_content()->mutable_setting()->mutable_ydb_database(); - if (serviceAccount) { - ydb.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - ydb.mutable_auth()->mutable_current_iam(); - } - - ydb.set_database_id(databaseId); - return *this; - } - - TModifyConnectionBuilder& CreateDataStreams(const TString& databaseId, const TString& serviceAccount) - { - auto& yds = *Request.mutable_content()->mutable_setting()->mutable_data_streams(); - if (serviceAccount) { - yds.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - yds.mutable_auth()->mutable_current_iam(); - } - - yds.set_database_id(databaseId); - return *this; - } - - TModifyConnectionBuilder& CreateClickHouse(const TString& databaseId, const TString& login, const TString& password, const TString& serviceAccount) - { - auto& ch = *Request.mutable_content()->mutable_setting()->mutable_clickhouse_cluster(); - if (serviceAccount) { - ch.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - ch.mutable_auth()->mutable_current_iam(); - } - - ch.set_database_id(databaseId); - ch.set_login(login); - ch.set_password(password); - return *this; - } - - TModifyConnectionBuilder& CreateObjectStorage(const TString& bucket, const TString& serviceAccount) - { - auto& os = *Request.mutable_content()->mutable_setting()->mutable_object_storage(); - if (serviceAccount) { - os.mutable_auth()->mutable_service_account()->set_id(serviceAccount); - } else { - os.mutable_auth()->mutable_current_iam(); - } - - os.set_bucket(bucket); - return *this; - } - - TModifyConnectionBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) - { - Request.mutable_content()->mutable_acl()->set_visibility(visibility); - return *this; - } - - TModifyConnectionBuilder& SetName(const TString& name) - { - Request.mutable_content()->set_name(name); - return *this; - } - - TModifyConnectionBuilder& SetDescription(const TString& description) - { +// Connections + +class TCreateConnectionBuilder { + YandexQuery::CreateConnectionRequest Request; + +public: + TCreateConnectionBuilder() + { + SetName("test_connection_name_1"); + SetVisibility(YandexQuery::Acl::SCOPE); + CreateDataStreams("my_database_id", ""); + } + + TCreateConnectionBuilder& CreateYdb(const TString& database, const TString& endpoint, const TString& serviceAccount) + { + auto& ydb = *Request.mutable_content()->mutable_setting()->mutable_ydb_database(); + if (serviceAccount) { + ydb.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + ydb.mutable_auth()->mutable_current_iam(); + } + + ydb.set_database(database); + ydb.set_endpoint(endpoint); + return *this; + } + + TCreateConnectionBuilder& CreateYdb(const TString& databaseId, const TString& serviceAccount) + { + auto& ydb = *Request.mutable_content()->mutable_setting()->mutable_ydb_database(); + if (serviceAccount) { + ydb.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + ydb.mutable_auth()->mutable_current_iam(); + } + + ydb.set_database_id(databaseId); + return *this; + } + + TCreateConnectionBuilder& CreateDataStreams(const TString& databaseId, const TString& serviceAccount) + { + auto& yds = *Request.mutable_content()->mutable_setting()->mutable_data_streams(); + if (serviceAccount) { + yds.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + yds.mutable_auth()->mutable_current_iam(); + } + + yds.set_database_id(databaseId); + return *this; + } + + TCreateConnectionBuilder& CreateClickHouse(const TString& databaseId, const TString& login, const TString& password, const TString& serviceAccount) + { + auto& ch = *Request.mutable_content()->mutable_setting()->mutable_clickhouse_cluster(); + if (serviceAccount) { + ch.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + ch.mutable_auth()->mutable_current_iam(); + } + + ch.set_database_id(databaseId); + ch.set_login(login); + ch.set_password(password); + return *this; + } + + TCreateConnectionBuilder& CreateObjectStorage(const TString& bucket, const TString& serviceAccount) + { + auto& os = *Request.mutable_content()->mutable_setting()->mutable_object_storage(); + if (serviceAccount) { + os.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + os.mutable_auth()->mutable_current_iam(); + } + + os.set_bucket(bucket); + return *this; + } + + TCreateConnectionBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) + { + Request.mutable_content()->mutable_acl()->set_visibility(visibility); + return *this; + } + + TCreateConnectionBuilder& SetName(const TString& name) + { + Request.mutable_content()->set_name(name); + return *this; + } + + TCreateConnectionBuilder& SetDescription(const TString& description) + { + Request.mutable_content()->set_name(description); + return *this; + } + + TCreateConnectionBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + const YandexQuery::CreateConnectionRequest& Build() + { + return Request; + } +}; + +class TListConnectionsBuilder { + YandexQuery::ListConnectionsRequest Request; + +public: + TListConnectionsBuilder() + { + SetLimit(10); + } + + TListConnectionsBuilder& SetPageToken(const TString& pageToken) + { + Request.set_page_token(pageToken); + return *this; + } + + TListConnectionsBuilder& SetLimit(int64_t limit) + { + Request.set_limit(limit); + return *this; + } + + const YandexQuery::ListConnectionsRequest& Build() + { + return Request; + } +}; + +class TDescribeConnectionBuilder { + YandexQuery::DescribeConnectionRequest Request; + +public: + TDescribeConnectionBuilder& SetConnectionId(const TString& connectionId) + { + Request.set_connection_id(connectionId); + return *this; + } + + const YandexQuery::DescribeConnectionRequest& Build() + { + return Request; + } +}; + +class TModifyConnectionBuilder { + YandexQuery::ModifyConnectionRequest Request; + +public: + TModifyConnectionBuilder() + { + SetName("test_connection_name_2"); + SetVisibility(YandexQuery::Acl::SCOPE); + CreateDataStreams("my_database_id", ""); + } + + TModifyConnectionBuilder& CreateYdb(const TString& databaseId, const TString& serviceAccount) + { + auto& ydb = *Request.mutable_content()->mutable_setting()->mutable_ydb_database(); + if (serviceAccount) { + ydb.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + ydb.mutable_auth()->mutable_current_iam(); + } + + ydb.set_database_id(databaseId); + return *this; + } + + TModifyConnectionBuilder& CreateDataStreams(const TString& databaseId, const TString& serviceAccount) + { + auto& yds = *Request.mutable_content()->mutable_setting()->mutable_data_streams(); + if (serviceAccount) { + yds.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + yds.mutable_auth()->mutable_current_iam(); + } + + yds.set_database_id(databaseId); + return *this; + } + + TModifyConnectionBuilder& CreateClickHouse(const TString& databaseId, const TString& login, const TString& password, const TString& serviceAccount) + { + auto& ch = *Request.mutable_content()->mutable_setting()->mutable_clickhouse_cluster(); + if (serviceAccount) { + ch.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + ch.mutable_auth()->mutable_current_iam(); + } + + ch.set_database_id(databaseId); + ch.set_login(login); + ch.set_password(password); + return *this; + } + + TModifyConnectionBuilder& CreateObjectStorage(const TString& bucket, const TString& serviceAccount) + { + auto& os = *Request.mutable_content()->mutable_setting()->mutable_object_storage(); + if (serviceAccount) { + os.mutable_auth()->mutable_service_account()->set_id(serviceAccount); + } else { + os.mutable_auth()->mutable_current_iam(); + } + + os.set_bucket(bucket); + return *this; + } + + TModifyConnectionBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) + { + Request.mutable_content()->mutable_acl()->set_visibility(visibility); + return *this; + } + + TModifyConnectionBuilder& SetName(const TString& name) + { + Request.mutable_content()->set_name(name); + return *this; + } + + TModifyConnectionBuilder& SetDescription(const TString& description) + { Request.mutable_content()->set_description(description); - return *this; - } - - TModifyConnectionBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TModifyConnectionBuilder& SetConnectionId(const TString& connectionId) - { - Request.set_connection_id(connectionId); - return *this; - } - - TModifyConnectionBuilder& SetPreviousRevision(const int64_t periousRevision) - { - Request.set_previous_revision(periousRevision); - return *this; - } - - const YandexQuery::ModifyConnectionRequest& Build() - { - return Request; - } -}; - -class TDeleteConnectionBuilder { - YandexQuery::DeleteConnectionRequest Request; - -public: - TDeleteConnectionBuilder& SetConnectionId(const TString& connectionId) - { - Request.set_connection_id(connectionId); - return *this; - } - - TDeleteConnectionBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TDeleteConnectionBuilder& SetPreviousRevision(const int64_t periousRevision) - { - Request.set_previous_revision(periousRevision); - return *this; - } - - const YandexQuery::DeleteConnectionRequest& Build() - { - return Request; - } -}; - -// Bindings - -class TCreateBindingBuilder { - YandexQuery::CreateBindingRequest Request; - -public: - TCreateBindingBuilder() - { - SetName("test_binding_name_1"); - SetVisibility(YandexQuery::Acl::SCOPE); - YandexQuery::DataStreamsBinding binding; - binding.set_stream_name("my_stream"); - binding.set_format("json"); - binding.set_compression("zip"); + return *this; + } + + TModifyConnectionBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TModifyConnectionBuilder& SetConnectionId(const TString& connectionId) + { + Request.set_connection_id(connectionId); + return *this; + } + + TModifyConnectionBuilder& SetPreviousRevision(const int64_t periousRevision) + { + Request.set_previous_revision(periousRevision); + return *this; + } + + const YandexQuery::ModifyConnectionRequest& Build() + { + return Request; + } +}; + +class TDeleteConnectionBuilder { + YandexQuery::DeleteConnectionRequest Request; + +public: + TDeleteConnectionBuilder& SetConnectionId(const TString& connectionId) + { + Request.set_connection_id(connectionId); + return *this; + } + + TDeleteConnectionBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TDeleteConnectionBuilder& SetPreviousRevision(const int64_t periousRevision) + { + Request.set_previous_revision(periousRevision); + return *this; + } + + const YandexQuery::DeleteConnectionRequest& Build() + { + return Request; + } +}; + +// Bindings + +class TCreateBindingBuilder { + YandexQuery::CreateBindingRequest Request; + +public: + TCreateBindingBuilder() + { + SetName("test_binding_name_1"); + SetVisibility(YandexQuery::Acl::SCOPE); + YandexQuery::DataStreamsBinding binding; + binding.set_stream_name("my_stream"); + binding.set_format("json"); + binding.set_compression("zip"); auto* column = binding.mutable_schema()->add_column(); column->set_name("sample_column_name"); column->mutable_type()->set_type_id(Ydb::Type::UINT64); - CreateDataStreams(binding); - } - - TCreateBindingBuilder& SetConnectionId(const TString& connectionId) - { - Request.mutable_content()->set_connection_id(connectionId); - return *this; - } - - TCreateBindingBuilder& CreateDataStreams(const YandexQuery::DataStreamsBinding& binding) - { - *Request.mutable_content()->mutable_setting()->mutable_data_streams() = binding; - return *this; - } - - TCreateBindingBuilder& CreateObjectStorage(const YandexQuery::ObjectStorageBinding& binding) - { - *Request.mutable_content()->mutable_setting()->mutable_object_storage() = binding; - return *this; - } - - TCreateBindingBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) - { - Request.mutable_content()->mutable_acl()->set_visibility(visibility); - return *this; - } - - TCreateBindingBuilder& SetName(const TString& name) - { - Request.mutable_content()->set_name(name); - return *this; - } - - TCreateBindingBuilder& SetDescription(const TString& description) - { - Request.mutable_content()->set_name(description); - return *this; - } - - TCreateBindingBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - const YandexQuery::CreateBindingRequest& Build() - { - return Request; - } -}; - -class TListBindingsBuilder { - YandexQuery::ListBindingsRequest Request; - -public: - TListBindingsBuilder() - { - SetLimit(10); - } - - TListBindingsBuilder& SetPageToken(const TString& pageToken) - { - Request.set_page_token(pageToken); - return *this; - } - - TListBindingsBuilder& SetLimit(int64_t limit) - { - Request.set_limit(limit); - return *this; - } - - TListBindingsBuilder& SetConnectionId(const TString& connectionId) - { - Request.mutable_filter()->set_connection_id(connectionId); - return *this; - } - - const YandexQuery::ListBindingsRequest& Build() - { - return Request; - } -}; - -class TDescribeBindingBuilder { - YandexQuery::DescribeBindingRequest Request; - -public: - TDescribeBindingBuilder& SetBindingId(const TString& bindingId) - { - Request.set_binding_id(bindingId); - return *this; - } - - const YandexQuery::DescribeBindingRequest& Build() - { - return Request; - } -}; - -class TModifyBindingBuilder { - YandexQuery::ModifyBindingRequest Request; - -public: - TModifyBindingBuilder() - { - SetName("test_binding_name_2"); - SetVisibility(YandexQuery::Acl::SCOPE); - YandexQuery::DataStreamsBinding binding; - binding.set_stream_name("my_stream"); - binding.set_format("json"); - binding.set_compression("zip"); + CreateDataStreams(binding); + } + + TCreateBindingBuilder& SetConnectionId(const TString& connectionId) + { + Request.mutable_content()->set_connection_id(connectionId); + return *this; + } + + TCreateBindingBuilder& CreateDataStreams(const YandexQuery::DataStreamsBinding& binding) + { + *Request.mutable_content()->mutable_setting()->mutable_data_streams() = binding; + return *this; + } + + TCreateBindingBuilder& CreateObjectStorage(const YandexQuery::ObjectStorageBinding& binding) + { + *Request.mutable_content()->mutable_setting()->mutable_object_storage() = binding; + return *this; + } + + TCreateBindingBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) + { + Request.mutable_content()->mutable_acl()->set_visibility(visibility); + return *this; + } + + TCreateBindingBuilder& SetName(const TString& name) + { + Request.mutable_content()->set_name(name); + return *this; + } + + TCreateBindingBuilder& SetDescription(const TString& description) + { + Request.mutable_content()->set_name(description); + return *this; + } + + TCreateBindingBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + const YandexQuery::CreateBindingRequest& Build() + { + return Request; + } +}; + +class TListBindingsBuilder { + YandexQuery::ListBindingsRequest Request; + +public: + TListBindingsBuilder() + { + SetLimit(10); + } + + TListBindingsBuilder& SetPageToken(const TString& pageToken) + { + Request.set_page_token(pageToken); + return *this; + } + + TListBindingsBuilder& SetLimit(int64_t limit) + { + Request.set_limit(limit); + return *this; + } + + TListBindingsBuilder& SetConnectionId(const TString& connectionId) + { + Request.mutable_filter()->set_connection_id(connectionId); + return *this; + } + + const YandexQuery::ListBindingsRequest& Build() + { + return Request; + } +}; + +class TDescribeBindingBuilder { + YandexQuery::DescribeBindingRequest Request; + +public: + TDescribeBindingBuilder& SetBindingId(const TString& bindingId) + { + Request.set_binding_id(bindingId); + return *this; + } + + const YandexQuery::DescribeBindingRequest& Build() + { + return Request; + } +}; + +class TModifyBindingBuilder { + YandexQuery::ModifyBindingRequest Request; + +public: + TModifyBindingBuilder() + { + SetName("test_binding_name_2"); + SetVisibility(YandexQuery::Acl::SCOPE); + YandexQuery::DataStreamsBinding binding; + binding.set_stream_name("my_stream"); + binding.set_format("json"); + binding.set_compression("zip"); auto* column = binding.mutable_schema()->add_column(); column->set_name("sample_column_name"); column->mutable_type()->set_type_id(Ydb::Type::UINT64); - CreateDataStreams(binding); - } - - TModifyBindingBuilder& SetConnectionId(const TString& connectionId) - { - Request.mutable_content()->set_connection_id(connectionId); - return *this; - } - - TModifyBindingBuilder& CreateDataStreams(const YandexQuery::DataStreamsBinding& binding) - { - *Request.mutable_content()->mutable_setting()->mutable_data_streams() = binding; - return *this; - } - - TModifyBindingBuilder& CreateObjectStorage(const YandexQuery::ObjectStorageBinding& binding) - { - *Request.mutable_content()->mutable_setting()->mutable_object_storage() = binding; - return *this; - } - - TModifyBindingBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) - { - Request.mutable_content()->mutable_acl()->set_visibility(visibility); - return *this; - } - - TModifyBindingBuilder& SetName(const TString& name) - { - Request.mutable_content()->set_name(name); - return *this; - } - - TModifyBindingBuilder& SetDescription(const TString& description) - { - Request.mutable_content()->set_name(description); - return *this; - } - - TModifyBindingBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TModifyBindingBuilder& SetBindingId(const TString& bindingId) - { - Request.set_binding_id(bindingId); - return *this; - } - - TModifyBindingBuilder& SetPreviousRevision(const int64_t periousRevision) - { - Request.set_previous_revision(periousRevision); - return *this; - } - - const YandexQuery::ModifyBindingRequest& Build() - { - return Request; - } -}; - -class TDeleteBindingBuilder { - YandexQuery::DeleteBindingRequest Request; - -public: - TDeleteBindingBuilder& SetBindingId(const TString& bindingId) - { - Request.set_binding_id(bindingId); - return *this; - } - - TDeleteBindingBuilder& SetIdempotencyKey(const TString& idempotencyKey) - { - Request.set_idempotency_key(idempotencyKey); - return *this; - } - - TDeleteBindingBuilder& SetPreviousRevision(const int64_t periousRevision) - { - Request.set_previous_revision(periousRevision); - return *this; - } - - const YandexQuery::DeleteBindingRequest& Build() - { - return Request; - } -}; - -// internal - -class TWriteResultDataBuilder { + CreateDataStreams(binding); + } + + TModifyBindingBuilder& SetConnectionId(const TString& connectionId) + { + Request.mutable_content()->set_connection_id(connectionId); + return *this; + } + + TModifyBindingBuilder& CreateDataStreams(const YandexQuery::DataStreamsBinding& binding) + { + *Request.mutable_content()->mutable_setting()->mutable_data_streams() = binding; + return *this; + } + + TModifyBindingBuilder& CreateObjectStorage(const YandexQuery::ObjectStorageBinding& binding) + { + *Request.mutable_content()->mutable_setting()->mutable_object_storage() = binding; + return *this; + } + + TModifyBindingBuilder& SetVisibility(YandexQuery::Acl::Visibility visibility) + { + Request.mutable_content()->mutable_acl()->set_visibility(visibility); + return *this; + } + + TModifyBindingBuilder& SetName(const TString& name) + { + Request.mutable_content()->set_name(name); + return *this; + } + + TModifyBindingBuilder& SetDescription(const TString& description) + { + Request.mutable_content()->set_name(description); + return *this; + } + + TModifyBindingBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TModifyBindingBuilder& SetBindingId(const TString& bindingId) + { + Request.set_binding_id(bindingId); + return *this; + } + + TModifyBindingBuilder& SetPreviousRevision(const int64_t periousRevision) + { + Request.set_previous_revision(periousRevision); + return *this; + } + + const YandexQuery::ModifyBindingRequest& Build() + { + return Request; + } +}; + +class TDeleteBindingBuilder { + YandexQuery::DeleteBindingRequest Request; + +public: + TDeleteBindingBuilder& SetBindingId(const TString& bindingId) + { + Request.set_binding_id(bindingId); + return *this; + } + + TDeleteBindingBuilder& SetIdempotencyKey(const TString& idempotencyKey) + { + Request.set_idempotency_key(idempotencyKey); + return *this; + } + + TDeleteBindingBuilder& SetPreviousRevision(const int64_t periousRevision) + { + Request.set_previous_revision(periousRevision); + return *this; + } + + const YandexQuery::DeleteBindingRequest& Build() + { + return Request; + } +}; + +// internal + +class TWriteResultDataBuilder { TString ResultId; - int32_t ResultSetId = 0; - int64_t StartRowId = 0; - TInstant Deadline; - Ydb::ResultSet ResultSet; - -public: - TWriteResultDataBuilder() - { - SetDeadline(TInstant::Now() + TDuration::Minutes(5)); - Ydb::ResultSet resultSet; - auto& value = *resultSet.add_rows(); - value.set_int64_value(1); - SetResultSet(resultSet); - } - + int32_t ResultSetId = 0; + int64_t StartRowId = 0; + TInstant Deadline; + Ydb::ResultSet ResultSet; + +public: + TWriteResultDataBuilder() + { + SetDeadline(TInstant::Now() + TDuration::Minutes(5)); + Ydb::ResultSet resultSet; + auto& value = *resultSet.add_rows(); + value.set_int64_value(1); + SetResultSet(resultSet); + } + TWriteResultDataBuilder& SetResultId(const TString& resultId) - { + { ResultId = resultId; - return *this; - } - - TWriteResultDataBuilder& SetResultSetIndex(int32_t resultSetId) - { - ResultSetId = resultSetId; - return *this; - } - - TWriteResultDataBuilder& SetStartRowId(int64_t startRowId) - { - StartRowId = startRowId; - return *this; - } - - TWriteResultDataBuilder& SetDeadline(const TInstant& deadline) - { - Deadline = deadline; - return *this; - } - - TWriteResultDataBuilder& SetResultSet(const Ydb::ResultSet& resultSet) - { - ResultSet = resultSet; - return *this; - } - - std::unique_ptr<TEvControlPlaneStorage::TEvWriteResultDataRequest> Build() - { + return *this; + } + + TWriteResultDataBuilder& SetResultSetIndex(int32_t resultSetId) + { + ResultSetId = resultSetId; + return *this; + } + + TWriteResultDataBuilder& SetStartRowId(int64_t startRowId) + { + StartRowId = startRowId; + return *this; + } + + TWriteResultDataBuilder& SetDeadline(const TInstant& deadline) + { + Deadline = deadline; + return *this; + } + + TWriteResultDataBuilder& SetResultSet(const Ydb::ResultSet& resultSet) + { + ResultSet = resultSet; + return *this; + } + + std::unique_ptr<TEvControlPlaneStorage::TEvWriteResultDataRequest> Build() + { return std::make_unique<TEvControlPlaneStorage::TEvWriteResultDataRequest>(ResultId, ResultSetId, StartRowId, Deadline, ResultSet); - } -}; - -class TGetTaskBuilder { - TString Owner; - TString HostName; - -public: - TGetTaskBuilder() - { - SetOwner("owner"); - SetHostName("localhost"); - } - - TGetTaskBuilder& SetOwner(const TString& owner) - { - Owner = owner; - return *this; - } - - TGetTaskBuilder& SetHostName(const TString& hostName) - { - HostName = hostName; - return *this; - } - - std::unique_ptr<TEvControlPlaneStorage::TEvGetTaskRequest> Build() - { + } +}; + +class TGetTaskBuilder { + TString Owner; + TString HostName; + +public: + TGetTaskBuilder() + { + SetOwner("owner"); + SetHostName("localhost"); + } + + TGetTaskBuilder& SetOwner(const TString& owner) + { + Owner = owner; + return *this; + } + + TGetTaskBuilder& SetHostName(const TString& hostName) + { + HostName = hostName; + return *this; + } + + std::unique_ptr<TEvControlPlaneStorage::TEvGetTaskRequest> Build() + { return std::make_unique<TEvControlPlaneStorage::TEvGetTaskRequest>(Owner, HostName); - } -}; - -class TPingTaskBuilder { - TString Scope; - TString QueryId; + } +}; + +class TPingTaskBuilder { + TString Scope; + TString QueryId; TString ResultId; TString Owner; TInstant Deadline; - TMaybe<YandexQuery::QueryMeta::ComputeStatus> Status; - TMaybe<NYql::TIssues> Issues; - TMaybe<NYql::TIssues> TransientIssues; - TMaybe<TString> Statistics; + TMaybe<YandexQuery::QueryMeta::ComputeStatus> Status; + TMaybe<NYql::TIssues> Issues; + TMaybe<NYql::TIssues> TransientIssues; + TMaybe<TString> Statistics; TMaybe<TVector<YandexQuery::ResultSetMeta>> ResultSetMetas; - TMaybe<TString> Ast; - TMaybe<TString> Plan; - TMaybe<TInstant> StartedAt; - TMaybe<TInstant> FinishedAt; + TMaybe<TString> Ast; + TMaybe<TString> Plan; + TMaybe<TInstant> StartedAt; + TMaybe<TInstant> FinishedAt; bool ResignQuery = false; TVector<NYq::TEvControlPlaneStorage::TTopicConsumer> CreatedTopicConsumers; TVector<TString> DqGraphs; i32 DqGraphIndex = 0; - -public: - TPingTaskBuilder() + +public: + TPingTaskBuilder() { SetDeadline(TInstant::Now() + TDuration::Minutes(5)); } - - TPingTaskBuilder& SetScope(const TString& scope) - { - Scope = scope; - return *this; - } - - TPingTaskBuilder& SetQueryId(const TString& queryId) - { - QueryId = queryId; - return *this; - } - + + TPingTaskBuilder& SetScope(const TString& scope) + { + Scope = scope; + return *this; + } + + TPingTaskBuilder& SetQueryId(const TString& queryId) + { + QueryId = queryId; + return *this; + } + TPingTaskBuilder& SetResultId(const TString& resultId) { ResultId = resultId; @@ -1033,71 +1033,71 @@ public: } TPingTaskBuilder& SetOwner(const TString& owner) - { + { Owner = owner; - return *this; - } - + return *this; + } + TPingTaskBuilder& SetDeadline(const TInstant& deadline) { Deadline = deadline; return *this; } - TPingTaskBuilder& SetStatus(const YandexQuery::QueryMeta::ComputeStatus& status) - { - Status = status; - return *this; - } - - TPingTaskBuilder& SetIssues(const NYql::TIssues& issues) - { - Issues = issues; - return *this; - } - - TPingTaskBuilder& SetTransientIssues(const NYql::TIssues& issues) - { - TransientIssues = issues; - return *this; - } - - TPingTaskBuilder& SetStatistics(const TString& statistics) - { - Statistics = statistics; - return *this; - } - + TPingTaskBuilder& SetStatus(const YandexQuery::QueryMeta::ComputeStatus& status) + { + Status = status; + return *this; + } + + TPingTaskBuilder& SetIssues(const NYql::TIssues& issues) + { + Issues = issues; + return *this; + } + + TPingTaskBuilder& SetTransientIssues(const NYql::TIssues& issues) + { + TransientIssues = issues; + return *this; + } + + TPingTaskBuilder& SetStatistics(const TString& statistics) + { + Statistics = statistics; + return *this; + } + TPingTaskBuilder& SetResultSetMetas(const TVector<YandexQuery::ResultSetMeta>& resultSetMetas) - { + { ResultSetMetas = resultSetMetas; - return *this; - } - - TPingTaskBuilder& SetAst(const TString& ast) - { - Ast = ast; - return *this; - } - - TPingTaskBuilder& SetPlan(const TString& plan) - { - Plan = plan; - return *this; - } - - TPingTaskBuilder& SetStatedAt(const TInstant& started) - { - StartedAt = started; - return *this; - } - - TPingTaskBuilder& SetFinishedAt(const TInstant& finished) - { - FinishedAt = finished; - return *this; - } - + return *this; + } + + TPingTaskBuilder& SetAst(const TString& ast) + { + Ast = ast; + return *this; + } + + TPingTaskBuilder& SetPlan(const TString& plan) + { + Plan = plan; + return *this; + } + + TPingTaskBuilder& SetStatedAt(const TInstant& started) + { + StartedAt = started; + return *this; + } + + TPingTaskBuilder& SetFinishedAt(const TInstant& finished) + { + FinishedAt = finished; + return *this; + } + TPingTaskBuilder& SetResignQuery(bool resignQuery = true) { ResignQuery = resignQuery; @@ -1122,35 +1122,35 @@ public: return *this; } - std::unique_ptr<TEvControlPlaneStorage::TEvPingTaskRequest> Build() - { + std::unique_ptr<TEvControlPlaneStorage::TEvPingTaskRequest> Build() + { auto request = std::make_unique<TEvControlPlaneStorage::TEvPingTaskRequest>(Scope, QueryId, Owner, Deadline, ResultId); - request->Status = Status; - request->Issues = Issues; - request->TransientIssues = TransientIssues; - request->Statistics = Statistics; + request->Status = Status; + request->Issues = Issues; + request->TransientIssues = TransientIssues; + request->Statistics = Statistics; request->ResultSetMetas = ResultSetMetas; - request->Ast = Ast; - request->Plan = Plan; - request->StartedAt = StartedAt; - request->FinishedAt = FinishedAt; + request->Ast = Ast; + request->Plan = Plan; + request->StartedAt = StartedAt; + request->FinishedAt = FinishedAt; request->ResignQuery = ResignQuery; request->CreatedTopicConsumers = CreatedTopicConsumers; request->DqGraphs = DqGraphs; request->DqGraphIndex = DqGraphIndex; - return request; - } -}; - + return request; + } +}; + class TNodesHealthCheckBuilder { TString Tenant; - ui32 NodeId = 0; + ui32 NodeId = 0; TString HostName; TString InstanceId; - ui64 ActiveWorkers = 0; - ui64 MemoryLimit = 0; - ui64 MemoryAllocated = 0; - + ui64 ActiveWorkers = 0; + ui64 MemoryLimit = 0; + ui64 MemoryAllocated = 0; + public: TNodesHealthCheckBuilder() {} diff --git a/ydb/core/yq/libs/control_plane_storage/probes.cpp b/ydb/core/yq/libs/control_plane_storage/probes.cpp index 57c972306f..8b0fe2847d 100644 --- a/ydb/core/yq/libs/control_plane_storage/probes.cpp +++ b/ydb/core/yq/libs/control_plane_storage/probes.cpp @@ -1,3 +1,3 @@ -#include "probes.h" - -LWTRACE_DEFINE_PROVIDER(YQ_CONTROL_PLANE_STORAGE_PROVIDER)
\ No newline at end of file +#include "probes.h" + +LWTRACE_DEFINE_PROVIDER(YQ_CONTROL_PLANE_STORAGE_PROVIDER)
\ No newline at end of file diff --git a/ydb/core/yq/libs/control_plane_storage/probes.h b/ydb/core/yq/libs/control_plane_storage/probes.h index c82c68e5ef..6627755652 100644 --- a/ydb/core/yq/libs/control_plane_storage/probes.h +++ b/ydb/core/yq/libs/control_plane_storage/probes.h @@ -1,105 +1,105 @@ -#pragma once - -#include <library/cpp/lwtrace/all.h> - -#define YQ_CONTROL_PLANE_STORAGE_PROVIDER(PROBE, EVENT, GROUPS, TYPES, NAMES) \ - PROBE(CreateQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success")) \ - PROBE(ListQueriesRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success")) \ - PROBE(DescribeQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ +#pragma once + +#include <library/cpp/lwtrace/all.h> + +#define YQ_CONTROL_PLANE_STORAGE_PROVIDER(PROBE, EVENT, GROUPS, TYPES, NAMES) \ + PROBE(CreateQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success")) \ + PROBE(ListQueriesRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success")) \ + PROBE(DescribeQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ PROBE(GetQueryStatusRequest, \ GROUPS(), \ TYPES(TString, TString, TString, TDuration, i64, bool), \ NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ - PROBE(ModifyQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ - PROBE(DeleteQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ - PROBE(ControlQueryRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ - PROBE(GetResultDataRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, i32, i64, i64, TDuration, i64, bool), \ - NAMES("scope", "user", "queryId", "resultSetIndex", "offset", "limit", "latencyMs", "size", "success")) \ - PROBE(ListJobsRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ + PROBE(ModifyQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ + PROBE(DeleteQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ + PROBE(ControlQueryRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ + PROBE(GetResultDataRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, i32, i64, i64, TDuration, i64, bool), \ + NAMES("scope", "user", "queryId", "resultSetIndex", "offset", "limit", "latencyMs", "size", "success")) \ + PROBE(ListJobsRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "queryId", "latencyMs", "size", "success")) \ PROBE(DescribeJobRequest, \ GROUPS(), \ TYPES(TString, TString, TString, TDuration, i64, bool), \ NAMES("scope", "user", "jobId", "latencyMs", "size", "success")) \ - PROBE(CreateConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success")) \ - PROBE(ListConnectionsRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success")) \ - PROBE(DescribeConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "connectionId", "latencyMs", "size", "success")) \ - PROBE(ModifyConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "connectionId", "latencyMs", "size", "success")) \ - PROBE(DeleteConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "connectionId", "latencyMs", "size", "success")) \ - PROBE(CreateBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success")) \ - PROBE(ListBindingsRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success")) \ - PROBE(DescribeBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "bindingId", "latencyMs", "size", "success")) \ - PROBE(ModifyBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "bindingId", "latencyMs", "size", "success")) \ - PROBE(DeleteBindingRequest, \ - GROUPS(), \ - TYPES(TString, TString, TString, TDuration, i64, bool), \ - NAMES("scope", "user", "bindingId", "latencyMs", "size", "success")) \ - PROBE(WriteResultDataRequest, \ - GROUPS(), \ - TYPES(TString, i32, i64, i64, TDuration, TInstant, i64, bool), \ + PROBE(CreateConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success")) \ + PROBE(ListConnectionsRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success")) \ + PROBE(DescribeConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "connectionId", "latencyMs", "size", "success")) \ + PROBE(ModifyConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "connectionId", "latencyMs", "size", "success")) \ + PROBE(DeleteConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "connectionId", "latencyMs", "size", "success")) \ + PROBE(CreateBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success")) \ + PROBE(ListBindingsRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success")) \ + PROBE(DescribeBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "bindingId", "latencyMs", "size", "success")) \ + PROBE(ModifyBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "bindingId", "latencyMs", "size", "success")) \ + PROBE(DeleteBindingRequest, \ + GROUPS(), \ + TYPES(TString, TString, TString, TDuration, i64, bool), \ + NAMES("scope", "user", "bindingId", "latencyMs", "size", "success")) \ + PROBE(WriteResultDataRequest, \ + GROUPS(), \ + TYPES(TString, i32, i64, i64, TDuration, TInstant, i64, bool), \ NAMES("resultId", "resulSetId", "startRowId", "countRows", "latencyMs", "deadlineSec", "size", "success")) \ - PROBE(GetTaskRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, bool), \ - NAMES("owner", "hostName", "latencyMs", "success")) \ - PROBE(PingTaskRequest, \ - GROUPS(), \ - TYPES(TString, TDuration, bool), \ - NAMES("queryId", "latencyMs", "success")) \ + PROBE(GetTaskRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, bool), \ + NAMES("owner", "hostName", "latencyMs", "success")) \ + PROBE(PingTaskRequest, \ + GROUPS(), \ + TYPES(TString, TDuration, bool), \ + NAMES("queryId", "latencyMs", "success")) \ PROBE(NodesHealthCheckRequest, \ GROUPS(), \ TYPES(TString, ui32, TString, TString, TDuration, bool), \ NAMES("tenant", "nodeId", "instanceId", "hostName", "latencyMs", "success")) \ - -// YQ_CONTROL_PLANE_STORAGE_PROVIDER - -LWTRACE_DECLARE_PROVIDER(YQ_CONTROL_PLANE_STORAGE_PROVIDER)
\ No newline at end of file + +// YQ_CONTROL_PLANE_STORAGE_PROVIDER + +LWTRACE_DECLARE_PROVIDER(YQ_CONTROL_PLANE_STORAGE_PROVIDER)
\ No newline at end of file diff --git a/ydb/core/yq/libs/control_plane_storage/proto/ya.make b/ydb/core/yq/libs/control_plane_storage/proto/ya.make index d0c3b4f541..60d0400fd2 100644 --- a/ydb/core/yq/libs/control_plane_storage/proto/ya.make +++ b/ydb/core/yq/libs/control_plane_storage/proto/ya.make @@ -1,17 +1,17 @@ OWNER(g:yq) - -PROTO_LIBRARY() - -PEERDIR( + +PROTO_LIBRARY() + +PEERDIR( ydb/public/api/protos ydb/library/yql/dq/proto ydb/library/yql/providers/dq/api/protos -) - -SRCS( - yq_internal.proto -) - -EXCLUDE_TAGS(GO_PROTO) - -END() +) + +SRCS( + yq_internal.proto +) + +EXCLUDE_TAGS(GO_PROTO) + +END() diff --git a/ydb/core/yq/libs/control_plane_storage/proto/yq_internal.proto b/ydb/core/yq/libs/control_plane_storage/proto/yq_internal.proto index e6ebff0c84..127a48e9f8 100644 --- a/ydb/core/yq/libs/control_plane_storage/proto/yq_internal.proto +++ b/ydb/core/yq/libs/control_plane_storage/proto/yq_internal.proto @@ -1,44 +1,44 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package YandexQuery.Internal; -option java_package = "com.yandex.query.internal"; -option java_outer_classname = "YandexQueryInternalProtos"; - +syntax = "proto3"; +option cc_enable_arenas = true; + +package YandexQuery.Internal; +option java_package = "com.yandex.query.internal"; +option java_outer_classname = "YandexQueryInternalProtos"; + import "ydb/library/yql/providers/dq/api/protos/service.proto"; import "ydb/library/yql/dq/proto/dq_tasks.proto"; import "ydb/public/api/protos/yq.proto"; import "ydb/public/api/protos/draft/yq_private.proto"; - -message Consumer { - string name = 1; -} - -message QueryInternal { - string token = 1; + +message Consumer { + string name = 1; +} + +message QueryInternal { + string token = 1; repeated NYql.NDqProto.TDqTask task = 2; // deprected and should not be used, will be removed in future - repeated Yql.DqsProto.TAttr settings = 3; - repeated Consumer consumer = 4; - repeated YandexQuery.Connection connection = 5; - repeated YandexQuery.Binding binding = 6; - YandexQuery.QueryAction action = 7; + repeated Yql.DqsProto.TAttr settings = 3; + repeated Consumer consumer = 4; + repeated YandexQuery.Connection connection = 5; + repeated YandexQuery.Binding binding = 6; + YandexQuery.QueryAction action = 7; string ast = 8; // deprected and should not be used, will be removed in future ExecuteMode execute_mode = 9; StateLoadMode state_load_mode = 10; - string cloud_id = 11; + string cloud_id = 11; repeated Yq.Private.TopicConsumer created_topic_consumers = 12; repeated bytes dq_graph = 13; int32 dq_graph_index = 14; StreamingDisposition disposition = 15; -} - -message JobInternal { -} - -message ConnectionInternal { - string cloud_id = 2; -} - -message BindingInternal { - string cloud_id = 2; -} +} + +message JobInternal { +} + +message ConnectionInternal { + string cloud_id = 2; +} + +message BindingInternal { + string cloud_id = 2; +} diff --git a/ydb/core/yq/libs/control_plane_storage/schema.h b/ydb/core/yq/libs/control_plane_storage/schema.h index 613eb7bcc1..ab9509464b 100644 --- a/ydb/core/yq/libs/control_plane_storage/schema.h +++ b/ydb/core/yq/libs/control_plane_storage/schema.h @@ -1,70 +1,70 @@ -#pragma once - -namespace NYq { - -// tables -#define QUERIES_TABLE_NAME "queries" +#pragma once + +namespace NYq { + +// tables +#define QUERIES_TABLE_NAME "queries" #define PENDING_SMALL_TABLE_NAME "pending_small" -#define CONNECTIONS_TABLE_NAME "connections" -#define BINDINGS_TABLE_NAME "bindings" -#define RESULT_SETS_TABLE_NAME "result_sets" -#define IDEMPOTENCY_KEYS_TABLE_NAME "idempotency_keys" -#define JOBS_TABLE_NAME "jobs" -#define NODES_TABLE_NAME "nodes" - -// columns -#define SCOPE_COLUMN_NAME "scope" -#define VISIBILITY_COLUMN_NAME "visibility" +#define CONNECTIONS_TABLE_NAME "connections" +#define BINDINGS_TABLE_NAME "bindings" +#define RESULT_SETS_TABLE_NAME "result_sets" +#define IDEMPOTENCY_KEYS_TABLE_NAME "idempotency_keys" +#define JOBS_TABLE_NAME "jobs" +#define NODES_TABLE_NAME "nodes" + +// columns +#define SCOPE_COLUMN_NAME "scope" +#define VISIBILITY_COLUMN_NAME "visibility" #define AUTOMATIC_COLUMN_NAME "automatic" -#define USER_COLUMN_NAME "user" -#define REVISION_COLUMN_NAME "revision" +#define USER_COLUMN_NAME "user" +#define REVISION_COLUMN_NAME "revision" #define META_REVISION_COLUMN_NAME "meta_revision" -#define INTERNAL_COLUMN_NAME "internal" -#define GENERATION_COLUMN_NAME "generation" +#define INTERNAL_COLUMN_NAME "internal" +#define GENERATION_COLUMN_NAME "generation" #define RETRY_COUNTER_COLUMN_NAME "retry_counter" #define RETRY_COUNTER_UPDATE_COLUMN_NAME "retry_counter_updated_at" #define IS_RESIGN_QUERY_COLUMN_NAME "is_resign_query" -#define STATUS_COLUMN_NAME "status" -#define QUERY_TYPE_COLUMN_NAME "query_type" -#define EXECUTE_MODE_COLUMN_NAME "execute_mode" -#define LAST_JOB_ID_COLUMN_NAME "last_job_id" +#define STATUS_COLUMN_NAME "status" +#define QUERY_TYPE_COLUMN_NAME "query_type" +#define EXECUTE_MODE_COLUMN_NAME "execute_mode" +#define LAST_JOB_ID_COLUMN_NAME "last_job_id" #define RESULT_SETS_EXPIRE_AT_COLUMN_NAME "result_sets_expire_at" - -#define QUERY_ID_COLUMN_NAME "query_id" -#define QUERY_COLUMN_NAME "query" - + +#define QUERY_ID_COLUMN_NAME "query_id" +#define QUERY_COLUMN_NAME "query" + #define CONNECTION_ID_COLUMN_NAME "connection_id" -#define CONNECTION_COLUMN_NAME "connection" +#define CONNECTION_COLUMN_NAME "connection" #define CONNECTION_TYPE_COLUMN_NAME "connection_type" -#define NAME_COLUMN_NAME "name" - -#define BINDING_ID_COLUMN_NAME "binding_id" -#define BINDING_COLUMN_NAME "binding" - -#define IDEMPOTENCY_KEY_COLUMN_NAME "idempotency_key" -#define EXPIRE_AT_COLUMN_NAME "expire_at" -#define RESPONSE_COLUMN_NAME "response" - -#define RESULT_ID_COLUMN_NAME "result_id" -#define RESULT_SET_ID_COLUMN_NAME "result_set_id" -#define ROW_ID_COLUMN_NAME "row_id" -#define RESULT_SET_COLUMN_NAME "result_set" - -#define JOB_COLUMN_NAME "job" -#define JOB_ID_COLUMN_NAME "job_id" - -#define TENANT_COLUMN_NAME "tenant" -#define INSTANCE_ID_COLUMN_NAME "instance_id" -#define NODE_ID_COLUMN_NAME "node_id" -#define ACTIVE_WORKERS_COLUMN_NAME "active_workers" +#define NAME_COLUMN_NAME "name" + +#define BINDING_ID_COLUMN_NAME "binding_id" +#define BINDING_COLUMN_NAME "binding" + +#define IDEMPOTENCY_KEY_COLUMN_NAME "idempotency_key" +#define EXPIRE_AT_COLUMN_NAME "expire_at" +#define RESPONSE_COLUMN_NAME "response" + +#define RESULT_ID_COLUMN_NAME "result_id" +#define RESULT_SET_ID_COLUMN_NAME "result_set_id" +#define ROW_ID_COLUMN_NAME "row_id" +#define RESULT_SET_COLUMN_NAME "result_set" + +#define JOB_COLUMN_NAME "job" +#define JOB_ID_COLUMN_NAME "job_id" + +#define TENANT_COLUMN_NAME "tenant" +#define INSTANCE_ID_COLUMN_NAME "instance_id" +#define NODE_ID_COLUMN_NAME "node_id" +#define ACTIVE_WORKERS_COLUMN_NAME "active_workers" #define MEMORY_LIMIT_COLUMN_NAME "memory_limit" #define MEMORY_ALLOCATED_COLUMN_NAME "memory_allocated" #define INTERCONNECT_PORT_COLUMN_NAME "interconnect_port" #define NODE_ADDRESS_COLUMN_NAME "node_address" - -#define HOST_NAME_COLUMN_NAME "hostname" -#define OWNER_COLUMN_NAME "owner" -#define LAST_SEEN_AT_COLUMN_NAME "last_seen_at" - + +#define HOST_NAME_COLUMN_NAME "hostname" +#define OWNER_COLUMN_NAME "owner" +#define LAST_SEEN_AT_COLUMN_NAME "last_seen_at" + } // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_storage/util.cpp b/ydb/core/yq/libs/control_plane_storage/util.cpp index 288f25a1cb..5ad1166b4e 100644 --- a/ydb/core/yq/libs/control_plane_storage/util.cpp +++ b/ydb/core/yq/libs/control_plane_storage/util.cpp @@ -1,48 +1,48 @@ -#include "util.h" - -#include <util/stream/file.h> -#include <util/string/strip.h> - -namespace NYq { - +#include "util.h" + +#include <util/stream/file.h> +#include <util/string/strip.h> + +namespace NYq { + bool IsTerminalStatus(YandexQuery::QueryMeta::ComputeStatus status) { return IsIn({ YandexQuery::QueryMeta::ABORTED_BY_USER, YandexQuery::QueryMeta::ABORTED_BY_SYSTEM, YandexQuery::QueryMeta::COMPLETED, YandexQuery::QueryMeta::FAILED }, status); } -TDuration GetDuration(const TString& value, const TDuration& defaultValue) -{ - TDuration result = defaultValue; - TDuration::TryParse(value, result); - return result; -} - -NConfig::TControlPlaneStorageConfig FillDefaultParameters(NConfig::TControlPlaneStorageConfig config) -{ - if (!config.GetIdempotencyKeysTtl()) { - config.SetIdempotencyKeysTtl("10m"); - } - - if (!config.GetMaxRequestSize()) { - config.SetMaxRequestSize(7 * 1024 * 1024); - } - - if (!config.GetMaxCountConnections()) { - config.SetMaxCountConnections(1000000); - } - - if (!config.GetMaxCountQueries()) { - config.SetMaxCountQueries(1000000); - } - - if (!config.GetMaxCountBindings()) { - config.SetMaxCountBindings(1000000); - } - - if (!config.GetMaxCountJobs()) { - config.SetMaxCountJobs(20); - } +TDuration GetDuration(const TString& value, const TDuration& defaultValue) +{ + TDuration result = defaultValue; + TDuration::TryParse(value, result); + return result; +} + +NConfig::TControlPlaneStorageConfig FillDefaultParameters(NConfig::TControlPlaneStorageConfig config) +{ + if (!config.GetIdempotencyKeysTtl()) { + config.SetIdempotencyKeysTtl("10m"); + } + + if (!config.GetMaxRequestSize()) { + config.SetMaxRequestSize(7 * 1024 * 1024); + } + + if (!config.GetMaxCountConnections()) { + config.SetMaxCountConnections(1000000); + } + + if (!config.GetMaxCountQueries()) { + config.SetMaxCountQueries(1000000); + } + + if (!config.GetMaxCountBindings()) { + config.SetMaxCountBindings(1000000); + } + + if (!config.GetMaxCountJobs()) { + config.SetMaxCountJobs(20); + } if (!config.GetTasksBatchSize()) { config.SetTasksBatchSize(100); @@ -64,33 +64,33 @@ NConfig::TControlPlaneStorageConfig FillDefaultParameters(NConfig::TControlPlane config.SetStreamingRetryCounterLimit(20); } - if (!config.GetAnalyticsRetryCounterUpdateTime()) { - config.SetAnalyticsRetryCounterUpdateTime("1d"); + if (!config.GetAnalyticsRetryCounterUpdateTime()) { + config.SetAnalyticsRetryCounterUpdateTime("1d"); } - if (!config.GetStreamingRetryCounterUpdateTime()) { - config.SetStreamingRetryCounterUpdateTime("1d"); + if (!config.GetStreamingRetryCounterUpdateTime()) { + config.SetStreamingRetryCounterUpdateTime("1d"); } if (!config.GetAutomaticQueriesTtl()) { config.SetAutomaticQueriesTtl("1d"); } - if (!config.GetTaskLeaseTtl()) { - config.SetTaskLeaseTtl("30s"); - } - - if (!config.GetStorage().GetToken() && config.GetStorage().GetOAuthFile()) { - config.MutableStorage()->SetToken(StripString(TFileInput(config.GetStorage().GetOAuthFile()).ReadAll())); + if (!config.GetTaskLeaseTtl()) { + config.SetTaskLeaseTtl("30s"); } + + if (!config.GetStorage().GetToken() && config.GetStorage().GetOAuthFile()) { + config.MutableStorage()->SetToken(StripString(TFileInput(config.GetStorage().GetOAuthFile()).ReadAll())); + } if (!config.GetResultSetsTtl()) { config.SetResultSetsTtl("1d"); } - - return config; -} - + + return config; +} + bool DoesPingTaskUpdateQueriesTable(const TEvControlPlaneStorage::TEvPingTaskRequest* request) { if (!request) { return false; @@ -127,4 +127,4 @@ std::pair<TString, TString> SplitId(const TString& id, char delim) { (it != id.end() ? id.substr(it - id.begin() + 1) : TString{""})); } -} //namespace NYq +} //namespace NYq diff --git a/ydb/core/yq/libs/control_plane_storage/util.h b/ydb/core/yq/libs/control_plane_storage/util.h index 8deddc25ca..95513cecee 100644 --- a/ydb/core/yq/libs/control_plane_storage/util.h +++ b/ydb/core/yq/libs/control_plane_storage/util.h @@ -1,29 +1,29 @@ -#pragma once - +#pragma once + #include <ydb/core/yq/libs/control_plane_storage/events/events.h> - -#include <util/datetime/base.h> - -#include <contrib/libs/protobuf/src/google/protobuf/timestamp.pb.h> - + +#include <util/datetime/base.h> + +#include <contrib/libs/protobuf/src/google/protobuf/timestamp.pb.h> + #include <ydb/core/yq/libs/config/protos/control_plane_storage.pb.h> - -namespace NYq { - + +namespace NYq { + bool IsTerminalStatus(YandexQuery::QueryMeta::ComputeStatus status); -TDuration GetDuration(const TString& value, const TDuration& defaultValue); - -NConfig::TControlPlaneStorageConfig FillDefaultParameters(NConfig::TControlPlaneStorageConfig config); - -template<std::size_t K, typename T, std::size_t N> -auto CreateArray(const T(&list)[N]) -> std::array<T, K> { - static_assert(N == K, "not valid array size"); - std::array<T, K> result; - std::copy(std::begin(list), std::end(list), std::begin(result)); - return result; -} - +TDuration GetDuration(const TString& value, const TDuration& defaultValue); + +NConfig::TControlPlaneStorageConfig FillDefaultParameters(NConfig::TControlPlaneStorageConfig config); + +template<std::size_t K, typename T, std::size_t N> +auto CreateArray(const T(&list)[N]) -> std::array<T, K> { + static_assert(N == K, "not valid array size"); + std::array<T, K> result; + std::copy(std::begin(list), std::end(list), std::begin(result)); + return result; +} + bool DoesPingTaskUpdateQueriesTable(const TEvControlPlaneStorage::TEvPingTaskRequest* request); NYdb::TValue PackItemsToList(const TVector<NYdb::TValue>& items); diff --git a/ydb/core/yq/libs/control_plane_storage/validators.cpp b/ydb/core/yq/libs/control_plane_storage/validators.cpp index 946ecfc3bd..7926da18b5 100644 --- a/ydb/core/yq/libs/control_plane_storage/validators.cpp +++ b/ydb/core/yq/libs/control_plane_storage/validators.cpp @@ -1,347 +1,347 @@ -#include "validators.h" -#include "ydb_control_plane_storage_impl.h" - +#include "validators.h" +#include "ydb_control_plane_storage_impl.h" + #include <ydb/public/api/protos/yq.pb.h> - + #include <ydb/core/yq/libs/control_plane_storage/events/events.h> #include <ydb/core/yq/libs/db_schema/db_schema.h> - -namespace NYq { - -TValidationQuery CreateUniqueNameValidator(const TString& tableName, - YandexQuery::Acl::Visibility visibility, - const TString& scope, - const TString& name, - const TString& user, - const TString& error, - const TString& tablePathPrefix) { - - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("name", name); - queryBuilder.AddInt64("visibility", visibility); - queryBuilder.AddText( - "SELECT COUNT(*) AS count\n" - "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" NAME_COLUMN_NAME "` = $name AND `" VISIBILITY_COLUMN_NAME "` = $visibility" - ); - - if (visibility != YandexQuery::Acl::SCOPE) { - queryBuilder.AddString("user", user); - queryBuilder.AddText(" AND `" USER_COLUMN_NAME "` = $user"); - } - - auto validator = [error](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; - } - - ui64 countNames = parser.ColumnParser("count").GetUint64(); - if (countNames != 0) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; - } - - return false; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -TValidationQuery CreateModifyUniqueNameValidator(const TString& tableName, - const TString& idColumnName, - YandexQuery::Acl::Visibility visibility, - const TString& scope, - const TString& name, - const TString& user, - const TString& id, - const TString& error, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("name", name); - queryBuilder.AddString("id", id); - queryBuilder.AddInt64("visibility", visibility); - queryBuilder.AddText( - "SELECT `" VISIBILITY_COLUMN_NAME "`, `" NAME_COLUMN_NAME "`\n" - "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + idColumnName + "` = $id;\n" - "SELECT COUNT(*) as count\n" - "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" NAME_COLUMN_NAME "` = $name AND `" VISIBILITY_COLUMN_NAME "` = $visibility" - ); - - if (visibility != YandexQuery::Acl::SCOPE) { - queryBuilder.AddString("user", user); - queryBuilder.AddText(" AND `" USER_COLUMN_NAME "` = $user"); - } - - auto validator = [error, visibility, name](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 2) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 2 but equal " << resultSets.size() << ". Please contact internal support"; - } - - { - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; - } - - YandexQuery::Acl::Visibility oldVisibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); - TString oldName = parser.ColumnParser(NAME_COLUMN_NAME).GetOptionalString().GetOrElse(""); - - if (oldVisibility == visibility && oldName == name) { - return false; - } - } - - TResultSetParser parser(resultSets.back()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; - } - - ui64 countNames = parser.ColumnParser("count").GetUint64(); - if (countNames != 0) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; - } - - return false; - }; - - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -TValidationQuery CreateCountEntitiesValidator(const TString& scope, - const TString& tableName, - ui64 limit, - const TString& error, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddText( - "SELECT COUNT(*) as count\n" - "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope;" - ); - - auto validator = [error, limit](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; - } - - ui64 countEntities = parser.ColumnParser("count").GetUint64(); - if (countEntities >= limit) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; - } - - return false; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -TValidationQuery CreateRevisionValidator(const TString& tableName, - const TString& columnName, - const TString& scope, - const TString& id, - i64 previousRevision, - const TString& error, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("id", id); - queryBuilder.AddText( - "SELECT `" REVISION_COLUMN_NAME "`\n" - "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + columnName + "` = $id;" - ); - - auto validator = [error, previousRevision](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - return false; - } - - i64 revision = parser.ColumnParser(REVISION_COLUMN_NAME).GetOptionalInt64().GetOrElse(0); - if (revision != previousRevision) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; - } - - return false; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -static TValidationQuery CreateAccessValidatorImpl(const TString& tableName, - const TString& columnName, - const TString& scope, - const TString& id, - TString user, - const TString& error, - TPermissions permissions, - const TString& tablePathPrefix, - TPermissions::TPermission privatePermission, - TPermissions::TPermission publicPermission) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("id", id); - queryBuilder.AddText( - "SELECT `" VISIBILITY_COLUMN_NAME "`, `" USER_COLUMN_NAME "`\n" - "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + columnName + "` = $id\n" - ); - - auto validator = [error, user, permissions, privatePermission, publicPermission](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; - } - - TString queryUser = parser.ColumnParser(USER_COLUMN_NAME).GetOptionalString().GetOrElse(""); - YandexQuery::Acl::Visibility visibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); - bool hasAccess = HasAccessImpl(permissions, visibility, queryUser, user, privatePermission, publicPermission); - if (!hasAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; - } - - return false; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -TValidationQuery CreateViewAccessValidator(const TString& tableName, - const TString& columnName, - const TString& scope, - const TString& id, - TString user, - const TString& error, - TPermissions permissions, - const TString& tablePathPrefix) { - return CreateAccessValidatorImpl( - tableName, columnName, scope, - id, user, error, permissions, tablePathPrefix, - TPermissions::VIEW_PRIVATE, TPermissions::VIEW_PUBLIC); -} - -TValidationQuery CreateManageAccessValidator(const TString& tableName, - const TString& columnName, - const TString& scope, - const TString& id, - TString user, - const TString& error, - TPermissions permissions, - const TString& tablePathPrefix) { - return CreateAccessValidatorImpl( - tableName, columnName, scope, - id, user, error, permissions, tablePathPrefix, - TPermissions::MANAGE_PRIVATE, TPermissions::MANAGE_PUBLIC); -} - -TValidationQuery CreateRelatedBindingsValidator(const TString& scope, - const TString& connectionId, - const TString& error, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("connection_id", connectionId); - queryBuilder.AddText( - "SELECT COUNT(*) as count\n" - "FROM `" BINDINGS_TABLE_NAME "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" - ); - - auto validator = [error](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; - } - - ui64 countEntities = parser.ColumnParser("count").GetUint64(); - if (countEntities != 0) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; - } - - return false; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -TValidationQuery CreateConnectionExistsValidator(const TString& scope, - const TString& connectionId, - const TString& error, - TPermissions permissions, - const TString& user, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("connection_id", connectionId); - queryBuilder.AddText( - "SELECT `" VISIBILITY_COLUMN_NAME "`, `" USER_COLUMN_NAME "`\n" - "FROM `" CONNECTIONS_TABLE_NAME "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" - ); - - auto validator = [error, user, permissions](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; - } - - YandexQuery::Acl::Visibility connectionVisibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); - TString connectionUser = parser.ColumnParser(USER_COLUMN_NAME).GetOptionalString().GetOrElse(""); - - if (!HasManageAccess(permissions, connectionVisibility, connectionUser, user)) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; - } - - return false; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - + +namespace NYq { + +TValidationQuery CreateUniqueNameValidator(const TString& tableName, + YandexQuery::Acl::Visibility visibility, + const TString& scope, + const TString& name, + const TString& user, + const TString& error, + const TString& tablePathPrefix) { + + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("name", name); + queryBuilder.AddInt64("visibility", visibility); + queryBuilder.AddText( + "SELECT COUNT(*) AS count\n" + "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" NAME_COLUMN_NAME "` = $name AND `" VISIBILITY_COLUMN_NAME "` = $visibility" + ); + + if (visibility != YandexQuery::Acl::SCOPE) { + queryBuilder.AddString("user", user); + queryBuilder.AddText(" AND `" USER_COLUMN_NAME "` = $user"); + } + + auto validator = [error](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; + } + + ui64 countNames = parser.ColumnParser("count").GetUint64(); + if (countNames != 0) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; + } + + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +TValidationQuery CreateModifyUniqueNameValidator(const TString& tableName, + const TString& idColumnName, + YandexQuery::Acl::Visibility visibility, + const TString& scope, + const TString& name, + const TString& user, + const TString& id, + const TString& error, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("name", name); + queryBuilder.AddString("id", id); + queryBuilder.AddInt64("visibility", visibility); + queryBuilder.AddText( + "SELECT `" VISIBILITY_COLUMN_NAME "`, `" NAME_COLUMN_NAME "`\n" + "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + idColumnName + "` = $id;\n" + "SELECT COUNT(*) as count\n" + "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" NAME_COLUMN_NAME "` = $name AND `" VISIBILITY_COLUMN_NAME "` = $visibility" + ); + + if (visibility != YandexQuery::Acl::SCOPE) { + queryBuilder.AddString("user", user); + queryBuilder.AddText(" AND `" USER_COLUMN_NAME "` = $user"); + } + + auto validator = [error, visibility, name](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 2) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 2 but equal " << resultSets.size() << ". Please contact internal support"; + } + + { + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; + } + + YandexQuery::Acl::Visibility oldVisibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); + TString oldName = parser.ColumnParser(NAME_COLUMN_NAME).GetOptionalString().GetOrElse(""); + + if (oldVisibility == visibility && oldName == name) { + return false; + } + } + + TResultSetParser parser(resultSets.back()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; + } + + ui64 countNames = parser.ColumnParser("count").GetUint64(); + if (countNames != 0) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; + } + + return false; + }; + + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +TValidationQuery CreateCountEntitiesValidator(const TString& scope, + const TString& tableName, + ui64 limit, + const TString& error, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddText( + "SELECT COUNT(*) as count\n" + "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope;" + ); + + auto validator = [error, limit](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; + } + + ui64 countEntities = parser.ColumnParser("count").GetUint64(); + if (countEntities >= limit) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; + } + + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +TValidationQuery CreateRevisionValidator(const TString& tableName, + const TString& columnName, + const TString& scope, + const TString& id, + i64 previousRevision, + const TString& error, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("id", id); + queryBuilder.AddText( + "SELECT `" REVISION_COLUMN_NAME "`\n" + "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + columnName + "` = $id;" + ); + + auto validator = [error, previousRevision](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + return false; + } + + i64 revision = parser.ColumnParser(REVISION_COLUMN_NAME).GetOptionalInt64().GetOrElse(0); + if (revision != previousRevision) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; + } + + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +static TValidationQuery CreateAccessValidatorImpl(const TString& tableName, + const TString& columnName, + const TString& scope, + const TString& id, + TString user, + const TString& error, + TPermissions permissions, + const TString& tablePathPrefix, + TPermissions::TPermission privatePermission, + TPermissions::TPermission publicPermission) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("id", id); + queryBuilder.AddText( + "SELECT `" VISIBILITY_COLUMN_NAME "`, `" USER_COLUMN_NAME "`\n" + "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + columnName + "` = $id\n" + ); + + auto validator = [error, user, permissions, privatePermission, publicPermission](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; + } + + TString queryUser = parser.ColumnParser(USER_COLUMN_NAME).GetOptionalString().GetOrElse(""); + YandexQuery::Acl::Visibility visibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); + bool hasAccess = HasAccessImpl(permissions, visibility, queryUser, user, privatePermission, publicPermission); + if (!hasAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; + } + + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +TValidationQuery CreateViewAccessValidator(const TString& tableName, + const TString& columnName, + const TString& scope, + const TString& id, + TString user, + const TString& error, + TPermissions permissions, + const TString& tablePathPrefix) { + return CreateAccessValidatorImpl( + tableName, columnName, scope, + id, user, error, permissions, tablePathPrefix, + TPermissions::VIEW_PRIVATE, TPermissions::VIEW_PUBLIC); +} + +TValidationQuery CreateManageAccessValidator(const TString& tableName, + const TString& columnName, + const TString& scope, + const TString& id, + TString user, + const TString& error, + TPermissions permissions, + const TString& tablePathPrefix) { + return CreateAccessValidatorImpl( + tableName, columnName, scope, + id, user, error, permissions, tablePathPrefix, + TPermissions::MANAGE_PRIVATE, TPermissions::MANAGE_PUBLIC); +} + +TValidationQuery CreateRelatedBindingsValidator(const TString& scope, + const TString& connectionId, + const TString& error, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("connection_id", connectionId); + queryBuilder.AddText( + "SELECT COUNT(*) as count\n" + "FROM `" BINDINGS_TABLE_NAME "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" + ); + + auto validator = [error](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Not valid number of lines, one is expected. Please contact internal support"; + } + + ui64 countEntities = parser.ColumnParser("count").GetUint64(); + if (countEntities != 0) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << error; + } + + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +TValidationQuery CreateConnectionExistsValidator(const TString& scope, + const TString& connectionId, + const TString& error, + TPermissions permissions, + const TString& user, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("connection_id", connectionId); + queryBuilder.AddText( + "SELECT `" VISIBILITY_COLUMN_NAME "`, `" USER_COLUMN_NAME "`\n" + "FROM `" CONNECTIONS_TABLE_NAME "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" + ); + + auto validator = [error, user, permissions](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; + } + + YandexQuery::Acl::Visibility connectionVisibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); + TString connectionUser = parser.ColumnParser(USER_COLUMN_NAME).GetOptionalString().GetOrElse(""); + + if (!HasManageAccess(permissions, connectionVisibility, connectionUser, user)) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << error; + } + + return false; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + TValidationQuery CreateTtlValidator(const TString& tableName, const TString& columnName, const TString& scope, const TString& id, const TString& error, const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("id", id); - queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddText( + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("id", id); + queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddText( "SELECT `" EXPIRE_AT_COLUMN_NAME "`\n" - "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + columnName + "` = $id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);\n" - ); + "FROM `" + tableName + "` WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" + columnName + "` = $id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);\n" + ); auto validator = [error](NYdb::NTable::TDataQueryResult result) { const auto& resultSets = result.GetResultSets(); @@ -356,8 +356,8 @@ TValidationQuery CreateTtlValidator(const TString& tableName, return false; }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; } -} // namespace NYq +} // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_storage/validators.h b/ydb/core/yq/libs/control_plane_storage/validators.h index 0b1fc32741..3cf7c0ac2c 100644 --- a/ydb/core/yq/libs/control_plane_storage/validators.h +++ b/ydb/core/yq/libs/control_plane_storage/validators.h @@ -1,92 +1,92 @@ -#pragma once - -#include "exceptions.h" -#include "schema.h" - -#include <functional> - -#include <util/generic/fwd.h> -#include <util/string/printf.h> - +#pragma once + +#include "exceptions.h" +#include "schema.h" + +#include <functional> + +#include <util/generic/fwd.h> +#include <util/string/printf.h> + #include <ydb/public/api/protos/yq.pb.h> #include <ydb/public/sdk/cpp/client/ydb_params/params.h> #include <ydb/public/sdk/cpp/client/ydb_params/params.h> #include <ydb/public/sdk/cpp/client/ydb_result/result.h> #include <ydb/public/sdk/cpp/client/ydb_table/table.h> - + #include <ydb/core/yq/libs/control_plane_storage/events/events.h> #include <ydb/core/yq/libs/db_schema/db_schema.h> - -namespace NYq { - -struct TValidationQuery { - TString Query; - NYdb::TParams Params; - std::function<bool(NYdb::NTable::TDataQueryResult)> Validator; -}; - -TValidationQuery CreateUniqueNameValidator(const TString& tableName, - YandexQuery::Acl::Visibility visibility, - const TString& scope, - const TString& name, - const TString& user, - const TString& error, - const TString& tablePathPrefix); - -TValidationQuery CreateModifyUniqueNameValidator(const TString& tableName, - const TString& idColumnName, - YandexQuery::Acl::Visibility visibility, - const TString& scope, - const TString& name, - const TString& user, - const TString& id, - const TString& error, - const TString& tablePathPrefix); - -TValidationQuery CreateCountEntitiesValidator(const TString& scope, - const TString& tableName, - ui64 limit, - const TString& error, - const TString& tablePathPrefix); - -TValidationQuery CreateRevisionValidator(const TString& tableName, - const TString& columnName, - const TString& scope, - const TString& id, - i64 previousRevision, - const TString& error, - const TString& tablePathPrefix); - -TValidationQuery CreateViewAccessValidator(const TString& tableName, - const TString& columnName, - const TString& scope, - const TString& id, - TString user, - const TString& error, - TPermissions permissions, - const TString& tablePathPrefix); - -TValidationQuery CreateManageAccessValidator(const TString& tableName, - const TString& columnName, - const TString& scope, - const TString& id, - TString user, - const TString& error, - TPermissions permissions, - const TString& tablePathPrefix); - -TValidationQuery CreateRelatedBindingsValidator(const TString& scope, - const TString& connectionId, - const TString& error, - const TString& tablePathPrefix); - -TValidationQuery CreateConnectionExistsValidator(const TString& scope, - const TString& connectionId, - const TString& error, - TPermissions permissions, - const TString& user, - const TString& tablePathPrefix); - + +namespace NYq { + +struct TValidationQuery { + TString Query; + NYdb::TParams Params; + std::function<bool(NYdb::NTable::TDataQueryResult)> Validator; +}; + +TValidationQuery CreateUniqueNameValidator(const TString& tableName, + YandexQuery::Acl::Visibility visibility, + const TString& scope, + const TString& name, + const TString& user, + const TString& error, + const TString& tablePathPrefix); + +TValidationQuery CreateModifyUniqueNameValidator(const TString& tableName, + const TString& idColumnName, + YandexQuery::Acl::Visibility visibility, + const TString& scope, + const TString& name, + const TString& user, + const TString& id, + const TString& error, + const TString& tablePathPrefix); + +TValidationQuery CreateCountEntitiesValidator(const TString& scope, + const TString& tableName, + ui64 limit, + const TString& error, + const TString& tablePathPrefix); + +TValidationQuery CreateRevisionValidator(const TString& tableName, + const TString& columnName, + const TString& scope, + const TString& id, + i64 previousRevision, + const TString& error, + const TString& tablePathPrefix); + +TValidationQuery CreateViewAccessValidator(const TString& tableName, + const TString& columnName, + const TString& scope, + const TString& id, + TString user, + const TString& error, + TPermissions permissions, + const TString& tablePathPrefix); + +TValidationQuery CreateManageAccessValidator(const TString& tableName, + const TString& columnName, + const TString& scope, + const TString& id, + TString user, + const TString& error, + TPermissions permissions, + const TString& tablePathPrefix); + +TValidationQuery CreateRelatedBindingsValidator(const TString& scope, + const TString& connectionId, + const TString& error, + const TString& tablePathPrefix); + +TValidationQuery CreateConnectionExistsValidator(const TString& scope, + const TString& connectionId, + const TString& error, + TPermissions permissions, + const TString& user, + const TString& tablePathPrefix); + TValidationQuery CreateTtlValidator(const TString& tableName, const TString& columnName, const TString& scope, @@ -94,74 +94,74 @@ TValidationQuery CreateTtlValidator(const TString& tableName, const TString& error, const TString& tablePathPrefix); -template<typename T> -TValidationQuery CreateIdempotencyKeyValidator(const TString& scope, - const TString& idempotencyKey, - std::shared_ptr<T> response, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("idempotency_key", idempotencyKey); - queryBuilder.AddString("scope", scope); - queryBuilder.AddText( - "SELECT `" RESPONSE_COLUMN_NAME "` FROM `" IDEMPOTENCY_KEYS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" IDEMPOTENCY_KEY_COLUMN_NAME "` = $idempotency_key;\n" - ); - - auto validator = [response](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "internal error, result set size is not equal to 1 but equal " << resultSets.size(); - } - - NYdb::TResultSetParser parser(resultSets.back()); - if (!parser.TryNextRow()) { - return false; // idempotency key does not exist. check other validators - } - - if (!response->first.ParseFromString(*parser.ColumnParser(RESPONSE_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for response. Please contact internal support"; - } - - return true; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -template<typename T, typename A> -TValidationQuery CreateIdempotencyKeyValidator(const TString& scope, - const TString& idempotencyKey, - std::shared_ptr<std::pair<T, A>> response, - const TString& tablePathPrefix) { - TSqlQueryBuilder queryBuilder(tablePathPrefix); - queryBuilder.AddString("idempotency_key", idempotencyKey); - queryBuilder.AddString("scope", scope); - queryBuilder.AddText( - "SELECT `" RESPONSE_COLUMN_NAME "` FROM `" IDEMPOTENCY_KEYS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" IDEMPOTENCY_KEY_COLUMN_NAME "` = $idempotency_key;\n" - ); - - auto validator = [response](NYdb::NTable::TDataQueryResult result) { - const auto& resultSets = result.GetResultSets(); - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "internal error, result set size is not equal to 1 but equal " << resultSets.size(); - } - - NYdb::TResultSetParser parser(resultSets.back()); - if (!parser.TryNextRow()) { - return false; // idempotency key does not exist. check other validators - } - - if (!response->first.ParseFromString(*parser.ColumnParser(RESPONSE_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for response. Please contact internal support"; - } - - response->second.IdempotencyResult = true; - - return true; - }; - const auto query = queryBuilder.Build(); - return {query.Sql, query.Params, validator}; -} - -} // namespace NYq +template<typename T> +TValidationQuery CreateIdempotencyKeyValidator(const TString& scope, + const TString& idempotencyKey, + std::shared_ptr<T> response, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("idempotency_key", idempotencyKey); + queryBuilder.AddString("scope", scope); + queryBuilder.AddText( + "SELECT `" RESPONSE_COLUMN_NAME "` FROM `" IDEMPOTENCY_KEYS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" IDEMPOTENCY_KEY_COLUMN_NAME "` = $idempotency_key;\n" + ); + + auto validator = [response](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "internal error, result set size is not equal to 1 but equal " << resultSets.size(); + } + + NYdb::TResultSetParser parser(resultSets.back()); + if (!parser.TryNextRow()) { + return false; // idempotency key does not exist. check other validators + } + + if (!response->first.ParseFromString(*parser.ColumnParser(RESPONSE_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for response. Please contact internal support"; + } + + return true; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +template<typename T, typename A> +TValidationQuery CreateIdempotencyKeyValidator(const TString& scope, + const TString& idempotencyKey, + std::shared_ptr<std::pair<T, A>> response, + const TString& tablePathPrefix) { + TSqlQueryBuilder queryBuilder(tablePathPrefix); + queryBuilder.AddString("idempotency_key", idempotencyKey); + queryBuilder.AddString("scope", scope); + queryBuilder.AddText( + "SELECT `" RESPONSE_COLUMN_NAME "` FROM `" IDEMPOTENCY_KEYS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" IDEMPOTENCY_KEY_COLUMN_NAME "` = $idempotency_key;\n" + ); + + auto validator = [response](NYdb::NTable::TDataQueryResult result) { + const auto& resultSets = result.GetResultSets(); + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "internal error, result set size is not equal to 1 but equal " << resultSets.size(); + } + + NYdb::TResultSetParser parser(resultSets.back()); + if (!parser.TryNextRow()) { + return false; // idempotency key does not exist. check other validators + } + + if (!response->first.ParseFromString(*parser.ColumnParser(RESPONSE_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for response. Please contact internal support"; + } + + response->second.IdempotencyResult = true; + + return true; + }; + const auto query = queryBuilder.Build(); + return {query.Sql, query.Params, validator}; +} + +} // namespace NYq diff --git a/ydb/core/yq/libs/control_plane_storage/ya.make b/ydb/core/yq/libs/control_plane_storage/ya.make index 8304e50db5..4282789527 100644 --- a/ydb/core/yq/libs/control_plane_storage/ya.make +++ b/ydb/core/yq/libs/control_plane_storage/ya.make @@ -1,22 +1,22 @@ OWNER(g:yq) - -LIBRARY() - -SRCS( + +LIBRARY() + +SRCS( control_plane_storage_counters.cpp - exceptions.cpp - in_memory_control_plane_storage.cpp - probes.cpp - util.cpp - validators.cpp - ydb_control_plane_storage.cpp - ydb_control_plane_storage_bindings.cpp - ydb_control_plane_storage_connections.cpp - ydb_control_plane_storage_queries.cpp -) - -PEERDIR( - library/cpp/lwtrace + exceptions.cpp + in_memory_control_plane_storage.cpp + probes.cpp + util.cpp + validators.cpp + ydb_control_plane_storage.cpp + ydb_control_plane_storage_bindings.cpp + ydb_control_plane_storage_connections.cpp + ydb_control_plane_storage_queries.cpp +) + +PEERDIR( + library/cpp/lwtrace library/cpp/protobuf/interop ydb/core/base ydb/core/mon @@ -36,14 +36,14 @@ PEERDIR( ydb/public/sdk/cpp/client/ydb_scheme ydb/public/sdk/cpp/client/ydb_table ydb/library/yql/public/issue -) - -YQL_LAST_ABI_VERSION() - -END() - -RECURSE( - events +) + +YQL_LAST_ABI_VERSION() + +END() + +RECURSE( + events internal - proto -) + proto +) diff --git a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage.cpp b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage.cpp index 222ebb6e8e..254e8c5a58 100644 --- a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage.cpp +++ b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage.cpp @@ -1,120 +1,120 @@ -#include "schema.h" -#include "validators.h" -#include "ydb_control_plane_storage_impl.h" - +#include "schema.h" +#include "validators.h" +#include "ydb_control_plane_storage_impl.h" + #include <ydb/library/security/ydb_credentials_provider_factory.h> -namespace NYq { - -namespace { - -void CollectDebugInfo(const TString& query, const TParams& params, TSession session, TDebugInfoPtr debugInfo) { - if (debugInfo) { - try { - auto explainResult = session.ExplainDataQuery(query).GetValue(TDuration::Minutes(1)); - debugInfo->push_back({query, params, explainResult.GetPlan(), explainResult.GetAst(), {}}); - } catch (...) { - debugInfo->push_back({query, params, {}, {}, CurrentExceptionMessage()}); - } - } -} - -inline YandexQuery::ConnectionSetting::ConnectionCase GetConnectionType(const TString& typeStr) { - YandexQuery::ConnectionSetting::ConnectionType type = YandexQuery::ConnectionSetting::CONNECTION_TYPE_UNSPECIFIED; - YandexQuery::ConnectionSetting::ConnectionType_Parse(typeStr, &type); - return static_cast<YandexQuery::ConnectionSetting::ConnectionCase>(type); -} - -inline YandexQuery::BindingSetting::BindingCase GetBindingType(const TString& typeStr) { - YandexQuery::BindingSetting::BindingType type = YandexQuery::BindingSetting::BINDING_TYPE_UNSPECIFIED; - YandexQuery::BindingSetting::BindingType_Parse(typeStr, &type); - return static_cast<YandexQuery::BindingSetting::BindingCase>(type); -} - -} // namespace - -void TYdbControlPlaneStorageActor::Bootstrap() { - CPS_LOG_I("Starting ydb control plane storage service. Actor id: " << SelfId()); - NLwTraceMonPage::ProbeRegistry().AddProbesList(LWTRACE_GET_PROBES(YQ_CONTROL_PLANE_STORAGE_PROVIDER)); - +namespace NYq { + +namespace { + +void CollectDebugInfo(const TString& query, const TParams& params, TSession session, TDebugInfoPtr debugInfo) { + if (debugInfo) { + try { + auto explainResult = session.ExplainDataQuery(query).GetValue(TDuration::Minutes(1)); + debugInfo->push_back({query, params, explainResult.GetPlan(), explainResult.GetAst(), {}}); + } catch (...) { + debugInfo->push_back({query, params, {}, {}, CurrentExceptionMessage()}); + } + } +} + +inline YandexQuery::ConnectionSetting::ConnectionCase GetConnectionType(const TString& typeStr) { + YandexQuery::ConnectionSetting::ConnectionType type = YandexQuery::ConnectionSetting::CONNECTION_TYPE_UNSPECIFIED; + YandexQuery::ConnectionSetting::ConnectionType_Parse(typeStr, &type); + return static_cast<YandexQuery::ConnectionSetting::ConnectionCase>(type); +} + +inline YandexQuery::BindingSetting::BindingCase GetBindingType(const TString& typeStr) { + YandexQuery::BindingSetting::BindingType type = YandexQuery::BindingSetting::BINDING_TYPE_UNSPECIFIED; + YandexQuery::BindingSetting::BindingType_Parse(typeStr, &type); + return static_cast<YandexQuery::BindingSetting::BindingCase>(type); +} + +} // namespace + +void TYdbControlPlaneStorageActor::Bootstrap() { + CPS_LOG_I("Starting ydb control plane storage service. Actor id: " << SelfId()); + NLwTraceMonPage::ProbeRegistry().AddProbesList(LWTRACE_GET_PROBES(YQ_CONTROL_PLANE_STORAGE_PROVIDER)); + DbPool = YqSharedResources->DbPoolHolder->GetOrCreate(EDbPoolId::MAIN, 10); - YdbConnection = NewYdbConnection(Config.Proto.GetStorage(), CredProviderFactory); - auto as = NActors::TActivationContext::ActorSystem(); - CreateDirectory(as); - CreateQueriesTable(as); + YdbConnection = NewYdbConnection(Config.Proto.GetStorage(), CredProviderFactory); + auto as = NActors::TActivationContext::ActorSystem(); + CreateDirectory(as); + CreateQueriesTable(as); CreatePendingSmallTable(as); - CreateConnectionsTable(as); - CreateBindingsTable(as); - CreateIdempotencyKeysTable(as); - CreateResultSetsTable(as); - CreateJobsTable(as); + CreateConnectionsTable(as); + CreateBindingsTable(as); + CreateIdempotencyKeysTable(as); + CreateResultSetsTable(as); + CreateJobsTable(as); CreateNodesTable(as); - Become(&TThis::StateFunc); -} - -TYdbControlPlaneStorageActor::TConfig::TConfig(const NConfig::TControlPlaneStorageConfig& config, const NConfig::TCommonConfig& common) - : Proto(FillDefaultParameters(config)) - , IdsPrefix(common.GetIdsPrefix()) - , IdempotencyKeyTtl(GetDuration(Proto.GetIdempotencyKeysTtl(), TDuration::Minutes(10))) - , AutomaticQueriesTtl(GetDuration(Proto.GetAutomaticQueriesTtl(), TDuration::Days(1))) + Become(&TThis::StateFunc); +} + +TYdbControlPlaneStorageActor::TConfig::TConfig(const NConfig::TControlPlaneStorageConfig& config, const NConfig::TCommonConfig& common) + : Proto(FillDefaultParameters(config)) + , IdsPrefix(common.GetIdsPrefix()) + , IdempotencyKeyTtl(GetDuration(Proto.GetIdempotencyKeysTtl(), TDuration::Minutes(10))) + , AutomaticQueriesTtl(GetDuration(Proto.GetAutomaticQueriesTtl(), TDuration::Days(1))) , ResultSetsTtl(GetDuration(Proto.GetResultSetsTtl(), TDuration::Days(1))) - , AnalyticsRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) - , StreamingRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) - , TaskLeaseTtl(GetDuration(Proto.GetTaskLeaseTtl(), TDuration::Seconds(30))) -{ - for (const auto& availableConnection: Proto.GetAvailableConnection()) { - AvailableConnections.insert(GetConnectionType(availableConnection)); - } - - for (const auto& availableBinding: Proto.GetAvailableBinding()) { - AvailableBindings.insert(GetBindingType(availableBinding)); - } -} - -/* -* Creating tables -*/ -TAsyncStatus TYdbControlPlaneStorageActor::CreateQueriesTable(TActorSystem* as) -{ + , AnalyticsRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) + , StreamingRetryCounterUpdateTime(GetDuration(Proto.GetAnalyticsRetryCounterUpdateTime(), TDuration::Days(1))) + , TaskLeaseTtl(GetDuration(Proto.GetTaskLeaseTtl(), TDuration::Seconds(30))) +{ + for (const auto& availableConnection: Proto.GetAvailableConnection()) { + AvailableConnections.insert(GetConnectionType(availableConnection)); + } + + for (const auto& availableBinding: Proto.GetAvailableBinding()) { + AvailableBindings.insert(GetBindingType(availableBinding)); + } +} + +/* +* Creating tables +*/ +TAsyncStatus TYdbControlPlaneStorageActor::CreateQueriesTable(TActorSystem* as) +{ auto tablePath = JoinPath(YdbConnection->TablePathPrefix, QUERIES_TABLE_NAME); - - auto description = TTableBuilder() - .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(QUERY_ID_COLUMN_NAME, EPrimitiveType::String) + + auto description = TTableBuilder() + .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(QUERY_ID_COLUMN_NAME, EPrimitiveType::String) .AddNullableColumn(RESULT_ID_COLUMN_NAME, EPrimitiveType::String) .AddNullableColumn(GENERATION_COLUMN_NAME, EPrimitiveType::Uint64) - .AddNullableColumn(NAME_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(NAME_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) .AddNullableColumn(AUTOMATIC_COLUMN_NAME, EPrimitiveType::Bool) - .AddNullableColumn(STATUS_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(QUERY_TYPE_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(EXECUTE_MODE_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(QUERY_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(REVISION_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(INTERNAL_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(LAST_JOB_ID_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(STATUS_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(QUERY_TYPE_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(EXECUTE_MODE_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(QUERY_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(REVISION_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(INTERNAL_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(LAST_JOB_ID_COLUMN_NAME, EPrimitiveType::String) .AddNullableColumn(EXPIRE_AT_COLUMN_NAME, EPrimitiveType::Timestamp) .AddNullableColumn(RESULT_SETS_EXPIRE_AT_COLUMN_NAME, EPrimitiveType::Timestamp) .AddNullableColumn(META_REVISION_COLUMN_NAME, EPrimitiveType::Int64) - .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, QUERY_ID_COLUMN_NAME}) + .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, QUERY_ID_COLUMN_NAME}) .SetTtlSettings(EXPIRE_AT_COLUMN_NAME) - .Build(); - - return YdbConnection->Client.RetryOperation( - [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { - return session.CreateTable(tablePath, TTableDescription(description)); - }) - .Apply([=](const auto& future) { - auto status = future.GetValue(); + .Build(); + + return YdbConnection->Client.RetryOperation( + [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { + return session.CreateTable(tablePath, TTableDescription(description)); + }) + .Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create quries table error: " << status.GetIssues().ToString()); - return CreateQueriesTable(as); - } - return future; - }); -} - + CPS_LOG_AS_E(*as, "create quries table error: " << status.GetIssues().ToString()); + return CreateQueriesTable(as); + } + return future; + }); +} + TAsyncStatus TYdbControlPlaneStorageActor::CreatePendingSmallTable(TActorSystem* as) { auto tablePath = JoinPath(YdbConnection->TablePathPrefix, PENDING_SMALL_TABLE_NAME); @@ -122,104 +122,104 @@ TAsyncStatus TYdbControlPlaneStorageActor::CreatePendingSmallTable(TActorSystem* auto description = TTableBuilder() .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) .AddNullableColumn(QUERY_ID_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(LAST_SEEN_AT_COLUMN_NAME, EPrimitiveType::Timestamp) + .AddNullableColumn(LAST_SEEN_AT_COLUMN_NAME, EPrimitiveType::Timestamp) .AddNullableColumn(RETRY_COUNTER_COLUMN_NAME, EPrimitiveType::Uint64) .AddNullableColumn(RETRY_COUNTER_UPDATE_COLUMN_NAME, EPrimitiveType::Timestamp) .AddNullableColumn(QUERY_TYPE_COLUMN_NAME, EPrimitiveType::Int64) .AddNullableColumn(IS_RESIGN_QUERY_COLUMN_NAME, EPrimitiveType::Bool) .AddNullableColumn(HOST_NAME_COLUMN_NAME, EPrimitiveType::String) .AddNullableColumn(OWNER_COLUMN_NAME, EPrimitiveType::String) - .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, QUERY_ID_COLUMN_NAME}) - .Build(); - - return YdbConnection->Client.RetryOperation( - [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { - return session.CreateTable(tablePath, TTableDescription(description)); - }) - .Apply([=](const auto& future) { - auto status = future.GetValue(); + .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, QUERY_ID_COLUMN_NAME}) + .Build(); + + return YdbConnection->Client.RetryOperation( + [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { + return session.CreateTable(tablePath, TTableDescription(description)); + }) + .Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create pending table error: " << status.GetIssues().ToString()); + CPS_LOG_AS_E(*as, "create pending table error: " << status.GetIssues().ToString()); return CreatePendingSmallTable(as); - } - return future; - }); -} - -TAsyncStatus TYdbControlPlaneStorageActor::CreateConnectionsTable(TActorSystem* as) -{ + } + return future; + }); +} + +TAsyncStatus TYdbControlPlaneStorageActor::CreateConnectionsTable(TActorSystem* as) +{ auto tablePath = JoinPath(YdbConnection->TablePathPrefix, CONNECTIONS_TABLE_NAME); - - auto description = TTableBuilder() - .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(CONNECTION_ID_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(NAME_COLUMN_NAME, EPrimitiveType::String) + + auto description = TTableBuilder() + .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(CONNECTION_ID_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(NAME_COLUMN_NAME, EPrimitiveType::String) .AddNullableColumn(CONNECTION_TYPE_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(CONNECTION_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(REVISION_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(INTERNAL_COLUMN_NAME, EPrimitiveType::String) - .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, CONNECTION_ID_COLUMN_NAME}) - .Build(); - - return YdbConnection->Client.RetryOperation( - [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { - return session.CreateTable(tablePath, TTableDescription(description)); - }) - .Apply([=](const auto& future) { - auto status = future.GetValue(); + .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(CONNECTION_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(REVISION_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(INTERNAL_COLUMN_NAME, EPrimitiveType::String) + .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, CONNECTION_ID_COLUMN_NAME}) + .Build(); + + return YdbConnection->Client.RetryOperation( + [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { + return session.CreateTable(tablePath, TTableDescription(description)); + }) + .Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create connections table error: " << status.GetIssues().ToString()); - return CreateConnectionsTable(as); - } - return future; - }); -} - -TAsyncStatus TYdbControlPlaneStorageActor::CreateDirectory(TActorSystem* as) -{ - auto schemeClient = NYdb::NScheme::TSchemeClient(YdbConnection->Driver); - return schemeClient.MakeDirectory(YdbConnection->TablePathPrefix).Apply([=](const auto& future) { - auto status = future.GetValue(); + CPS_LOG_AS_E(*as, "create connections table error: " << status.GetIssues().ToString()); + return CreateConnectionsTable(as); + } + return future; + }); +} + +TAsyncStatus TYdbControlPlaneStorageActor::CreateDirectory(TActorSystem* as) +{ + auto schemeClient = NYdb::NScheme::TSchemeClient(YdbConnection->Driver); + return schemeClient.MakeDirectory(YdbConnection->TablePathPrefix).Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create directory error: " << status.GetIssues().ToString()); - return CreateDirectory(as); - } - return future; - }); -} - -TAsyncStatus TYdbControlPlaneStorageActor::CreateJobsTable(TActorSystem* as) -{ + CPS_LOG_AS_E(*as, "create directory error: " << status.GetIssues().ToString()); + return CreateDirectory(as); + } + return future; + }); +} + +TAsyncStatus TYdbControlPlaneStorageActor::CreateJobsTable(TActorSystem* as) +{ auto tablePath = JoinPath(YdbConnection->TablePathPrefix, JOBS_TABLE_NAME); - - auto description = TTableBuilder() - .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(JOB_ID_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(QUERY_ID_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(JOB_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) + + auto description = TTableBuilder() + .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(JOB_ID_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(QUERY_ID_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(JOB_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) .AddNullableColumn(EXPIRE_AT_COLUMN_NAME, EPrimitiveType::Timestamp) .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, QUERY_ID_COLUMN_NAME, JOB_ID_COLUMN_NAME}) .SetTtlSettings(EXPIRE_AT_COLUMN_NAME) - .Build(); - - return YdbConnection->Client.RetryOperation( - [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { - return session.CreateTable(tablePath, TTableDescription(description)); - }) - .Apply([=](const auto& future) { - auto status = future.GetValue(); + .Build(); + + return YdbConnection->Client.RetryOperation( + [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { + return session.CreateTable(tablePath, TTableDescription(description)); + }) + .Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create jobs table error: " << status.GetIssues().ToString()); - return CreateJobsTable(as); - } - return future; - }); -} - + CPS_LOG_AS_E(*as, "create jobs table error: " << status.GetIssues().ToString()); + return CreateJobsTable(as); + } + return future; + }); +} + TAsyncStatus TYdbControlPlaneStorageActor::CreateNodesTable(TActorSystem* as) { auto tablePath = JoinPath(YdbConnection->TablePathPrefix, NODES_TABLE_NAME); @@ -253,163 +253,163 @@ TAsyncStatus TYdbControlPlaneStorageActor::CreateNodesTable(TActorSystem* as) }); } -TAsyncStatus TYdbControlPlaneStorageActor::CreateBindingsTable(TActorSystem* as) -{ +TAsyncStatus TYdbControlPlaneStorageActor::CreateBindingsTable(TActorSystem* as) +{ auto tablePath = JoinPath(YdbConnection->TablePathPrefix, BINDINGS_TABLE_NAME); - - auto description = TTableBuilder() - .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(BINDING_ID_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(CONNECTION_ID_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(NAME_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(BINDING_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(REVISION_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(INTERNAL_COLUMN_NAME, EPrimitiveType::String) - .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, BINDING_ID_COLUMN_NAME}) - .Build(); - - return YdbConnection->Client.RetryOperation( - [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { - return session.CreateTable(tablePath, TTableDescription(description)); - }) - .Apply([=](const auto& future) { - auto status = future.GetValue(); + + auto description = TTableBuilder() + .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(BINDING_ID_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(CONNECTION_ID_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(NAME_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(USER_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(VISIBILITY_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(BINDING_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(REVISION_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(INTERNAL_COLUMN_NAME, EPrimitiveType::String) + .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, BINDING_ID_COLUMN_NAME}) + .Build(); + + return YdbConnection->Client.RetryOperation( + [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { + return session.CreateTable(tablePath, TTableDescription(description)); + }) + .Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create bindings table error: " << status.GetIssues().ToString()); - return CreateBindingsTable(as); - } - return future; - }); -} - -TAsyncStatus TYdbControlPlaneStorageActor::CreateIdempotencyKeysTable(TActorSystem* as) -{ + CPS_LOG_AS_E(*as, "create bindings table error: " << status.GetIssues().ToString()); + return CreateBindingsTable(as); + } + return future; + }); +} + +TAsyncStatus TYdbControlPlaneStorageActor::CreateIdempotencyKeysTable(TActorSystem* as) +{ auto tablePath = JoinPath(YdbConnection->TablePathPrefix, IDEMPOTENCY_KEYS_TABLE_NAME); - - auto description = TTableBuilder() - .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(IDEMPOTENCY_KEY_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(RESPONSE_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(EXPIRE_AT_COLUMN_NAME, EPrimitiveType::Timestamp) - .SetTtlSettings(EXPIRE_AT_COLUMN_NAME) - .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, IDEMPOTENCY_KEY_COLUMN_NAME}) - .Build(); - - return YdbConnection->Client.RetryOperation( - [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { - return session.CreateTable(tablePath, TTableDescription(description)); - }) - .Apply([=](const auto& future) { - auto status = future.GetValue(); + + auto description = TTableBuilder() + .AddNullableColumn(SCOPE_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(IDEMPOTENCY_KEY_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(RESPONSE_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(EXPIRE_AT_COLUMN_NAME, EPrimitiveType::Timestamp) + .SetTtlSettings(EXPIRE_AT_COLUMN_NAME) + .SetPrimaryKeyColumns({SCOPE_COLUMN_NAME, IDEMPOTENCY_KEY_COLUMN_NAME}) + .Build(); + + return YdbConnection->Client.RetryOperation( + [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { + return session.CreateTable(tablePath, TTableDescription(description)); + }) + .Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create idempotency keys table error: " << status.GetIssues().ToString()); - return CreateIdempotencyKeysTable(as); - } - return future; - }); -} - -TAsyncStatus TYdbControlPlaneStorageActor::CreateResultSetsTable(TActorSystem* as) -{ + CPS_LOG_AS_E(*as, "create idempotency keys table error: " << status.GetIssues().ToString()); + return CreateIdempotencyKeysTable(as); + } + return future; + }); +} + +TAsyncStatus TYdbControlPlaneStorageActor::CreateResultSetsTable(TActorSystem* as) +{ auto tablePath = JoinPath(YdbConnection->TablePathPrefix, RESULT_SETS_TABLE_NAME); - - auto description = TTableBuilder() + + auto description = TTableBuilder() .AddNullableColumn(RESULT_ID_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(RESULT_SET_ID_COLUMN_NAME, EPrimitiveType::Int32) - .AddNullableColumn(ROW_ID_COLUMN_NAME, EPrimitiveType::Int64) - .AddNullableColumn(RESULT_SET_COLUMN_NAME, EPrimitiveType::String) - .AddNullableColumn(EXPIRE_AT_COLUMN_NAME, EPrimitiveType::Timestamp) - .SetTtlSettings(EXPIRE_AT_COLUMN_NAME) + .AddNullableColumn(RESULT_SET_ID_COLUMN_NAME, EPrimitiveType::Int32) + .AddNullableColumn(ROW_ID_COLUMN_NAME, EPrimitiveType::Int64) + .AddNullableColumn(RESULT_SET_COLUMN_NAME, EPrimitiveType::String) + .AddNullableColumn(EXPIRE_AT_COLUMN_NAME, EPrimitiveType::Timestamp) + .SetTtlSettings(EXPIRE_AT_COLUMN_NAME) .SetPrimaryKeyColumns({RESULT_ID_COLUMN_NAME, RESULT_SET_ID_COLUMN_NAME, ROW_ID_COLUMN_NAME}) - .Build(); - - return YdbConnection->Client.RetryOperation( - [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { - return session.CreateTable(tablePath, TTableDescription(description)); - }) - .Apply([=](const auto& future) { - auto status = future.GetValue(); + .Build(); + + return YdbConnection->Client.RetryOperation( + [tablePath = std::move(tablePath), description = std::move(description)] (TSession session) mutable { + return session.CreateTable(tablePath, TTableDescription(description)); + }) + .Apply([=](const auto& future) { + auto status = future.GetValue(); if (!IsTableCreated(status)) { - CPS_LOG_AS_E(*as, "create result sets table error: " << status.GetIssues().ToString()); - return CreateResultSetsTable(as); - } - return future; - }); -} - -bool TYdbControlPlaneStorageActor::IsSuperUser(const TString& user) -{ - return AnyOf(Config.Proto.GetSuperUsers(), [&user](const auto& superUser) { - return superUser == user; - }); -} - -void TYdbControlPlaneStorageActor::InsertIdempotencyKey(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey, const TString& response, const TInstant& expireAt) { - if (idempotencyKey) { - builder.AddString("scope", scope); - builder.AddString("idempotency_key", idempotencyKey); - builder.AddString("response", response); - builder.AddTimestamp("expire_at", expireAt); - builder.AddText( - "INSERT INTO `" IDEMPOTENCY_KEYS_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" IDEMPOTENCY_KEY_COLUMN_NAME "`, `" RESPONSE_COLUMN_NAME "`, `" EXPIRE_AT_COLUMN_NAME "`)\n" - "VALUES ($scope, $idempotency_key, $response, $expire_at);\n" - ); - } -} - -void TYdbControlPlaneStorageActor::ReadIdempotencyKeyQuery(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey) { - if (idempotencyKey) { - builder.AddString("scope", scope); - builder.AddString("idempotency_key", idempotencyKey); - builder.AddText( - "SELECT `" RESPONSE_COLUMN_NAME "` FROM `" IDEMPOTENCY_KEYS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" IDEMPOTENCY_KEY_COLUMN_NAME "` = $idempotency_key;\n" - ); - } -} - -class TDbRequest: public NActors::TActorBootstrapped<TDbRequest> { - using TFunction = std::function<NYdb::TAsyncStatus(NYdb::NTable::TSession&)>; + CPS_LOG_AS_E(*as, "create result sets table error: " << status.GetIssues().ToString()); + return CreateResultSetsTable(as); + } + return future; + }); +} + +bool TYdbControlPlaneStorageActor::IsSuperUser(const TString& user) +{ + return AnyOf(Config.Proto.GetSuperUsers(), [&user](const auto& superUser) { + return superUser == user; + }); +} + +void TYdbControlPlaneStorageActor::InsertIdempotencyKey(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey, const TString& response, const TInstant& expireAt) { + if (idempotencyKey) { + builder.AddString("scope", scope); + builder.AddString("idempotency_key", idempotencyKey); + builder.AddString("response", response); + builder.AddTimestamp("expire_at", expireAt); + builder.AddText( + "INSERT INTO `" IDEMPOTENCY_KEYS_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" IDEMPOTENCY_KEY_COLUMN_NAME "`, `" RESPONSE_COLUMN_NAME "`, `" EXPIRE_AT_COLUMN_NAME "`)\n" + "VALUES ($scope, $idempotency_key, $response, $expire_at);\n" + ); + } +} + +void TYdbControlPlaneStorageActor::ReadIdempotencyKeyQuery(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey) { + if (idempotencyKey) { + builder.AddString("scope", scope); + builder.AddString("idempotency_key", idempotencyKey); + builder.AddText( + "SELECT `" RESPONSE_COLUMN_NAME "` FROM `" IDEMPOTENCY_KEYS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" IDEMPOTENCY_KEY_COLUMN_NAME "` = $idempotency_key;\n" + ); + } +} + +class TDbRequest: public NActors::TActorBootstrapped<TDbRequest> { + using TFunction = std::function<NYdb::TAsyncStatus(NYdb::NTable::TSession&)>; TDbPool::TPtr DbPool; - TPromise<NYdb::TStatus> Promise; - TFunction Handler; - -public: + TPromise<NYdb::TStatus> Promise; + TFunction Handler; + +public: TDbRequest(const TDbPool::TPtr& dbPool, const TPromise<NYdb::TStatus>& promise, const TFunction& handler) - : DbPool(dbPool) - , Promise(promise) - , Handler(handler) - {} - + : DbPool(dbPool) + , Promise(promise) + , Handler(handler) + {} + static constexpr char ActorName[] = "YQ_CONTROL_PLANE_STORAGE_DB_REQUEST"; - void Bootstrap() { - CPS_LOG_T("DbRequest actor request. Actor id: " << SelfId()); - Become(&TDbRequest::StateFunc); + void Bootstrap() { + CPS_LOG_T("DbRequest actor request. Actor id: " << SelfId()); + Become(&TDbRequest::StateFunc); Send(DbPool->GetNextActor(), new TEvents::TEvDbFunctionRequest(Handler), IEventHandle::FlagTrackDelivery); - } - - STRICT_STFUNC(StateFunc, + } + + STRICT_STFUNC(StateFunc, hFunc(TEvents::TEvDbFunctionResponse, Handle); - hFunc(NActors::TEvents::TEvUndelivered, OnUndelivered) - ) - + hFunc(NActors::TEvents::TEvUndelivered, OnUndelivered) + ) + void Handle(TEvents::TEvDbFunctionResponse::TPtr& ev) { - CPS_LOG_T("DbRequest actor response. Actor id: " << SelfId()); - Promise.SetValue(ev->Get()->Status); - PassAway(); - } - - void OnUndelivered(NActors::TEvents::TEvUndelivered::TPtr&) { - CPS_LOG_E("On delivered. Actor id: " << SelfId()); + CPS_LOG_T("DbRequest actor response. Actor id: " << SelfId()); + Promise.SetValue(ev->Get()->Status); + PassAway(); + } + + void OnUndelivered(NActors::TEvents::TEvUndelivered::TPtr&) { + CPS_LOG_E("On delivered. Actor id: " << SelfId()); Send(DbPool->GetNextActor(), new TEvents::TEvDbFunctionRequest(Handler), IEventHandle::FlagTrackDelivery); - } -}; - - + } +}; + + std::pair<TAsyncStatus, std::shared_ptr<TVector<NYdb::TResultSet>>> TYdbControlPlaneStorageActor::Read( const TString& query, const NYdb::TParams& params, @@ -417,36 +417,36 @@ std::pair<TAsyncStatus, std::shared_ptr<TVector<NYdb::TResultSet>>> TYdbControlP TDebugInfoPtr debugInfo, TTxSettings transactionMode, bool retryOnTli) -{ - auto resultSet = std::make_shared<TVector<NYdb::TResultSet>>(); - - std::shared_ptr<int> retryCount = std::make_shared<int>(); - auto handler = [=](TSession& session) { - if (*retryCount != 0) { - requestCounters->Retry->Inc(); - } - ++(*retryCount); - CollectDebugInfo(query, params, session, debugInfo); +{ + auto resultSet = std::make_shared<TVector<NYdb::TResultSet>>(); + + std::shared_ptr<int> retryCount = std::make_shared<int>(); + auto handler = [=](TSession& session) { + if (*retryCount != 0) { + requestCounters->Retry->Inc(); + } + ++(*retryCount); + CollectDebugInfo(query, params, session, debugInfo); auto result = session.ExecuteDataQuery(query, TTxControl::BeginTx(transactionMode).CommitTx(), params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)); return result.Apply([retryOnTli, resultSet] (const TFuture<TDataQueryResult>& future) { - NYdb::NTable::TDataQueryResult result = future.GetValue(); - *resultSet = result.GetResultSets(); - auto status = static_cast<TStatus>(result); - if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist - return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; - } + NYdb::NTable::TDataQueryResult result = future.GetValue(); + *resultSet = result.GetResultSets(); + auto status = static_cast<TStatus>(result); + if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist + return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; + } if (!retryOnTli && status.GetStatus() == EStatus::ABORTED) { return TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{status.GetIssues()}}; } - return status; - }); - }; - - TPromise<NYdb::TStatus> promise = NewPromise<NYdb::TStatus>(); - Register(new TDbRequest(DbPool, promise, handler)); - return {promise.GetFuture(), resultSet}; -} - + return status; + }); + }; + + TPromise<NYdb::TStatus> promise = NewPromise<NYdb::TStatus>(); + Register(new TDbRequest(DbPool, promise, handler)); + return {promise.GetFuture(), resultSet}; +} + TAsyncStatus TYdbControlPlaneStorageActor::Validate( std::shared_ptr<TMaybe<TTransaction>> transaction, size_t item, @@ -456,31 +456,31 @@ TAsyncStatus TYdbControlPlaneStorageActor::Validate( TDebugInfoPtr debugInfo, TTxSettings transactionMode) { - if (item >= validators.size()) { - return MakeFuture(TStatus{EStatus::SUCCESS, NYql::TIssues{}}); - } - - const TValidationQuery& validatonItem = validators[item]; - CollectDebugInfo(validatonItem.Query, validatonItem.Params, session, debugInfo); - auto result = session.ExecuteDataQuery(validatonItem.Query, item == 0 ? TTxControl::BeginTx(transactionMode) : TTxControl::Tx(**transaction), validatonItem.Params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)); - return result.Apply([=, validator=validatonItem.Validator] (const TFuture<TDataQueryResult>& future) { - NYdb::NTable::TDataQueryResult result = future.GetValue(); - *transaction = result.GetTransaction(); - auto status = static_cast<TStatus>(result); - if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist - return MakeFuture(TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}); - } - if (!status.IsSuccess()) { - return MakeFuture(status); - } - *successFinish = validator(result); - if (*successFinish) { - return MakeFuture(TStatus{EStatus::SUCCESS, NYql::TIssues{}}); - } - return Validate(transaction, item + 1, validators, session, successFinish, debugInfo); - }); -} - + if (item >= validators.size()) { + return MakeFuture(TStatus{EStatus::SUCCESS, NYql::TIssues{}}); + } + + const TValidationQuery& validatonItem = validators[item]; + CollectDebugInfo(validatonItem.Query, validatonItem.Params, session, debugInfo); + auto result = session.ExecuteDataQuery(validatonItem.Query, item == 0 ? TTxControl::BeginTx(transactionMode) : TTxControl::Tx(**transaction), validatonItem.Params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)); + return result.Apply([=, validator=validatonItem.Validator] (const TFuture<TDataQueryResult>& future) { + NYdb::NTable::TDataQueryResult result = future.GetValue(); + *transaction = result.GetTransaction(); + auto status = static_cast<TStatus>(result); + if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist + return MakeFuture(TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}); + } + if (!status.IsSuccess()) { + return MakeFuture(status); + } + *successFinish = validator(result); + if (*successFinish) { + return MakeFuture(TStatus{EStatus::SUCCESS, NYql::TIssues{}}); + } + return Validate(transaction, item + 1, validators, session, successFinish, debugInfo); + }); +} + TAsyncStatus TYdbControlPlaneStorageActor::Write( NActors::TActorSystem* actorSystem, const TString& query, @@ -490,58 +490,58 @@ TAsyncStatus TYdbControlPlaneStorageActor::Write( const TVector<TValidationQuery>& validators, TTxSettings transactionMode, bool retryOnTli) -{ - std::shared_ptr<int> retryCount = std::make_shared<int>(); - auto transaction = std::make_shared<TMaybe<TTransaction>>(); +{ + std::shared_ptr<int> retryCount = std::make_shared<int>(); + auto transaction = std::make_shared<TMaybe<TTransaction>>(); auto writeHandler = [=, retryOnTli=retryOnTli] (TSession session) { - CollectDebugInfo(query, params, session, debugInfo); + CollectDebugInfo(query, params, session, debugInfo); auto result = session.ExecuteDataQuery(query, validators ? TTxControl::Tx(**transaction).CommitTx() : TTxControl::BeginTx(transactionMode).CommitTx(), params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)); return result.Apply([=] (const TFuture<TDataQueryResult>& future) { - NYdb::NTable::TDataQueryResult result = future.GetValue(); - auto status = static_cast<TStatus>(result); - if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist - return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; - } + NYdb::NTable::TDataQueryResult result = future.GetValue(); + auto status = static_cast<TStatus>(result); + if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist + return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; + } if (!retryOnTli && status.GetStatus() == EStatus::ABORTED) { return TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{status.GetIssues()}}; } - return status; - }); - }; - - auto handler = [=] (TSession session) { - if (*retryCount != 0) { - requestCounters->Retry->Inc(); - } - ++(*retryCount); - std::shared_ptr<bool> successFinish = std::make_shared<bool>(); - return Validate(transaction, 0, validators, session, successFinish, debugInfo).Apply([=](const auto& future) { - try { - auto status = future.GetValue(); - if (!status.IsSuccess()) { - return future; - } - if (*successFinish) { - return future; - } - return writeHandler(session); - } catch (const TControlPlaneStorageException& exception) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{MakeErrorIssue(exception.Code, exception.GetRawMessage())}}); - } catch (const std::exception& exception) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{exception.what()}}}); - } catch (...) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{CurrentExceptionMessage()}}}); - } - }); - }; - TPromise<NYdb::TStatus> promise = NewPromise<NYdb::TStatus>(); - Register(new TDbRequest(DbPool, promise, handler)); - return promise.GetFuture(); -} - + return status; + }); + }; + + auto handler = [=] (TSession session) { + if (*retryCount != 0) { + requestCounters->Retry->Inc(); + } + ++(*retryCount); + std::shared_ptr<bool> successFinish = std::make_shared<bool>(); + return Validate(transaction, 0, validators, session, successFinish, debugInfo).Apply([=](const auto& future) { + try { + auto status = future.GetValue(); + if (!status.IsSuccess()) { + return future; + } + if (*successFinish) { + return future; + } + return writeHandler(session); + } catch (const TControlPlaneStorageException& exception) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{MakeErrorIssue(exception.Code, exception.GetRawMessage())}}); + } catch (const std::exception& exception) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{exception.what()}}}); + } catch (...) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{CurrentExceptionMessage()}}}); + } + }); + }; + TPromise<NYdb::TStatus> promise = NewPromise<NYdb::TStatus>(); + Register(new TDbRequest(DbPool, promise, handler)); + return promise.GetFuture(); +} + NThreading::TFuture<void> TYdbControlPlaneStorageActor::PickTask( const TPickTaskParams& taskParams, const TRequestCountersPtr& requestCounters, @@ -549,7 +549,7 @@ NThreading::TFuture<void> TYdbControlPlaneStorageActor::PickTask( std::shared_ptr<TResponseTasks> responseTasks, const TVector<TValidationQuery>& validators, TTxSettings transactionMode) -{ +{ return ReadModifyWrite(NActors::TActivationContext::ActorSystem(), taskParams.ReadQuery, taskParams.ReadParams, taskParams.PrepareParams, requestCounters, debugInfo, validators, transactionMode, taskParams.RetryOnTli) .Apply([=, responseTasks=responseTasks, queryId = taskParams.QueryId](const auto& future) { @@ -571,112 +571,112 @@ TAsyncStatus TYdbControlPlaneStorageActor::ReadModifyWrite( TTxSettings transactionMode, bool retryOnTli) { - std::shared_ptr<int> retryCount = std::make_shared<int>(); - auto resultSets = std::make_shared<TVector<NYdb::TResultSet>>(); - auto transaction = std::make_shared<TMaybe<TTransaction>>(); - - auto readModifyWriteHandler = [=](TSession session) { - CollectDebugInfo(readQuery, readParams, session, debugInfo); + std::shared_ptr<int> retryCount = std::make_shared<int>(); + auto resultSets = std::make_shared<TVector<NYdb::TResultSet>>(); + auto transaction = std::make_shared<TMaybe<TTransaction>>(); + + auto readModifyWriteHandler = [=](TSession session) { + CollectDebugInfo(readQuery, readParams, session, debugInfo); auto readResult = session.ExecuteDataQuery(readQuery, validators ? TTxControl::Tx(**transaction) : TTxControl::BeginTx(transactionMode), readParams, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)); - auto readResultStatus = readResult.Apply([resultSets, transaction] (const TFuture<TDataQueryResult>& future) { - NYdb::NTable::TDataQueryResult result = future.GetValue(); - *resultSets = result.GetResultSets(); - *transaction = result.GetTransaction(); - auto status = static_cast<TStatus>(result); - if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist - return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; - } - return status; - }); - - TFuture<std::pair<TString, NYdb::TParams>> resultPrepare = readResultStatus.Apply([=](const auto& future) { - return future.GetValue().IsSuccess() ? prepare(*resultSets) : make_pair(TString(""), NYdb::TParamsBuilder{}.Build()); - }); - - return resultPrepare.Apply([=](const auto& future) mutable { - if (!readResultStatus.GetValue().IsSuccess()) { - return readResultStatus; - } - - try { - auto [writeQuery, params] = future.GetValue(); - if (!writeQuery) { - return transaction->Get()->Commit().Apply([] (const auto& future) { - auto result = future.GetValue(); - auto status = static_cast<TStatus>(result); - if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist - return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; - } - return status; - }); - } - CollectDebugInfo(writeQuery, params, session, debugInfo); - auto writeResult = session.ExecuteDataQuery(writeQuery, TTxControl::Tx(**transaction).CommitTx(), params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)); + auto readResultStatus = readResult.Apply([resultSets, transaction] (const TFuture<TDataQueryResult>& future) { + NYdb::NTable::TDataQueryResult result = future.GetValue(); + *resultSets = result.GetResultSets(); + *transaction = result.GetTransaction(); + auto status = static_cast<TStatus>(result); + if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist + return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; + } + return status; + }); + + TFuture<std::pair<TString, NYdb::TParams>> resultPrepare = readResultStatus.Apply([=](const auto& future) { + return future.GetValue().IsSuccess() ? prepare(*resultSets) : make_pair(TString(""), NYdb::TParamsBuilder{}.Build()); + }); + + return resultPrepare.Apply([=](const auto& future) mutable { + if (!readResultStatus.GetValue().IsSuccess()) { + return readResultStatus; + } + + try { + auto [writeQuery, params] = future.GetValue(); + if (!writeQuery) { + return transaction->Get()->Commit().Apply([] (const auto& future) { + auto result = future.GetValue(); + auto status = static_cast<TStatus>(result); + if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist + return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; + } + return status; + }); + } + CollectDebugInfo(writeQuery, params, session, debugInfo); + auto writeResult = session.ExecuteDataQuery(writeQuery, TTxControl::Tx(**transaction).CommitTx(), params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)); return writeResult.Apply([retryOnTli] (const TFuture<TDataQueryResult>& future) { - NYdb::NTable::TDataQueryResult result = future.GetValue(); - auto status = static_cast<TStatus>(result); - if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist - return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; - } + NYdb::NTable::TDataQueryResult result = future.GetValue(); + auto status = static_cast<TStatus>(result); + if (status.GetStatus() == EStatus::SCHEME_ERROR) { // retry if table does not exist + return TStatus{EStatus::UNAVAILABLE, NYql::TIssues{status.GetIssues()}}; + } if (!retryOnTli && status.GetStatus() == EStatus::ABORTED) { return TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{status.GetIssues()}}; } - return status; - }); - } catch (const TControlPlaneStorageException& exception) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{MakeErrorIssue(exception.Code, exception.GetRawMessage())}}); - } catch (const std::exception& exception) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{exception.what()}}}); - } catch (...) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{CurrentExceptionMessage()}}}); - } - }); - }; - - auto handler = [=] (TSession session) { - if (*retryCount != 0) { - requestCounters->Retry->Inc(); - } - ++(*retryCount); - - std::shared_ptr<bool> successFinish = std::make_shared<bool>(); - return Validate(transaction, 0, validators, session, successFinish, debugInfo).Apply([=](const auto& future) { - try { - auto status = future.GetValue(); - if (!status.IsSuccess()) { - return future; - } - if (*successFinish) { - return future; - } - return readModifyWriteHandler(session); - } catch (const TControlPlaneStorageException& exception) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{MakeErrorIssue(exception.Code, exception.GetRawMessage())}}); - } catch (const std::exception& exception) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{exception.what()}}}); - } catch (...) { - CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); - return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{CurrentExceptionMessage()}}}); - } - }); + return status; + }); + } catch (const TControlPlaneStorageException& exception) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{MakeErrorIssue(exception.Code, exception.GetRawMessage())}}); + } catch (const std::exception& exception) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{exception.what()}}}); + } catch (...) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{CurrentExceptionMessage()}}}); + } + }); }; - TPromise<NYdb::TStatus> promise = NewPromise<NYdb::TStatus>(); - Register(new TDbRequest(DbPool, promise, handler)); - return promise.GetFuture(); -} - + + auto handler = [=] (TSession session) { + if (*retryCount != 0) { + requestCounters->Retry->Inc(); + } + ++(*retryCount); + + std::shared_ptr<bool> successFinish = std::make_shared<bool>(); + return Validate(transaction, 0, validators, session, successFinish, debugInfo).Apply([=](const auto& future) { + try { + auto status = future.GetValue(); + if (!status.IsSuccess()) { + return future; + } + if (*successFinish) { + return future; + } + return readModifyWriteHandler(session); + } catch (const TControlPlaneStorageException& exception) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{MakeErrorIssue(exception.Code, exception.GetRawMessage())}}); + } catch (const std::exception& exception) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{exception.what()}}}); + } catch (...) { + CPS_LOG_AS_D(*actorSystem, "Validation: " << CurrentExceptionMessage()); + return MakeFuture(TStatus{EStatus::GENERIC_ERROR, NYql::TIssues{NYql::TIssue{CurrentExceptionMessage()}}}); + } + }); + }; + TPromise<NYdb::TStatus> promise = NewPromise<NYdb::TStatus>(); + Register(new TDbRequest(DbPool, promise, handler)); + return promise.GetFuture(); +} + NActors::IActor* CreateYdbControlPlaneStorageServiceActor( - const NConfig::TControlPlaneStorageConfig& config, - const NConfig::TCommonConfig& common, + const NConfig::TControlPlaneStorageConfig& config, + const NConfig::TCommonConfig& common, const NMonitoring::TDynamicCounterPtr& counters, const ::NYq::TYqSharedResources::TPtr& yqSharedResources, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory) { - return new TYdbControlPlaneStorageActor(config, common, counters, yqSharedResources, credentialsProviderFactory); -} - + return new TYdbControlPlaneStorageActor(config, common, counters, yqSharedResources, credentialsProviderFactory); +} + } // NYq diff --git a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp index fc617fe5f0..3432f1088a 100644 --- a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp +++ b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_bindings.cpp @@ -1,643 +1,643 @@ -#include "ydb_control_plane_storage_impl.h" - -#include <util/string/join.h> - +#include "ydb_control_plane_storage_impl.h" + +#include <util/string/join.h> + #include <ydb/core/yq/libs/config/protos/issue_id.pb.h> #include <ydb/core/yq/libs/control_plane_storage/validators.h> #include <ydb/core/yq/libs/db_schema/db_schema.h> - -namespace NYq { - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateBindingRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_BINDING]; - requestCounters->InFly->Inc(); - - const YandexQuery::CreateBindingRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - const TString cloudId = ev->Get()->CloudId; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const TString bindingId = GetEntityIdAsString(Config.IdsPrefix, EEntityType::BINDING); - int byteSize = request.ByteSize(); - const TString connectionId = request.content().connection_id(); - const TString idempotencyKey = request.idempotency_key(); - - CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) - << "CreateBindingRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateBinding(ev); - if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a binding with these parameters. Please receive a permission yq.resources.managePublic")); - } - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) - << "CreateBindingRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvCreateBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(CreateBindingRequest, scope, user, delta, byteSize, false); - return; - } - - YandexQuery::Binding binding; - YandexQuery::BindingContent& content = *binding.mutable_content(); - content = request.content(); - *binding.mutable_meta() = CreateCommonMeta(bindingId, user, startTime, InitialRevision); - - YandexQuery::Internal::BindingInternal bindingInternal; - bindingInternal.set_cloud_id(cloudId); - - std::shared_ptr<std::pair<YandexQuery::CreateBindingResult, TAuditDetails<YandexQuery::Binding>>> response = std::make_shared<std::pair<YandexQuery::CreateBindingResult, TAuditDetails<YandexQuery::Binding>>>(); - response->first.set_binding_id(bindingId); - response->second.After.ConstructInPlace().CopyFrom(binding); - response->second.CloudId = cloudId; - + +namespace NYq { + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateBindingRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_BINDING]; + requestCounters->InFly->Inc(); + + const YandexQuery::CreateBindingRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + const TString cloudId = ev->Get()->CloudId; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const TString bindingId = GetEntityIdAsString(Config.IdsPrefix, EEntityType::BINDING); + int byteSize = request.ByteSize(); + const TString connectionId = request.content().connection_id(); + const TString idempotencyKey = request.idempotency_key(); + + CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) + << "CreateBindingRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateBinding(ev); + if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a binding with these parameters. Please receive a permission yq.resources.managePublic")); + } + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) + << "CreateBindingRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvCreateBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(CreateBindingRequest, scope, user, delta, byteSize, false); + return; + } + + YandexQuery::Binding binding; + YandexQuery::BindingContent& content = *binding.mutable_content(); + content = request.content(); + *binding.mutable_meta() = CreateCommonMeta(bindingId, user, startTime, InitialRevision); + + YandexQuery::Internal::BindingInternal bindingInternal; + bindingInternal.set_cloud_id(cloudId); + + std::shared_ptr<std::pair<YandexQuery::CreateBindingResult, TAuditDetails<YandexQuery::Binding>>> response = std::make_shared<std::pair<YandexQuery::CreateBindingResult, TAuditDetails<YandexQuery::Binding>>>(); + response->first.set_binding_id(bindingId); + response->second.After.ConstructInPlace().CopyFrom(binding); + response->second.CloudId = cloudId; + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "CreateBinding"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("binding_id", bindingId); - queryBuilder.AddString("connection_id", connectionId); - queryBuilder.AddString("user", user); - queryBuilder.AddInt64("visibility", content.acl().visibility()); - queryBuilder.AddString("name", content.name()); - queryBuilder.AddString("binding", binding.SerializeAsString()); - queryBuilder.AddInt64("revision", InitialRevision); - queryBuilder.AddString("internal", bindingInternal.SerializeAsString()); - - InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); - queryBuilder.AddText( - "INSERT INTO `" BINDINGS_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" BINDING_ID_COLUMN_NAME "`, `" CONNECTION_ID_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" NAME_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "`, `" REVISION_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "`) VALUES\n" - " ($scope, $binding_id, $connection_id, $user, $visibility, $name, $binding, $revision, $internal);" - ); - - auto validatorName = 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 validatorCountBindings = CreateCountEntitiesValidator( - scope, - BINDINGS_TABLE_NAME, - Config.Proto.GetMaxCountBindings(), - "Too many bindings in folder: " + ToString(Config.Proto.GetMaxCountBindings()) + ". Please remove unused bindings", - YdbConnection->TablePathPrefix); - - auto validatorConnectionExists = CreateConnectionExistsValidator( - scope, - connectionId, - "Connection " + connectionId + " does not exist or permission denied. Please check the id connection or your access rights", - permissions, - user, - YdbConnection->TablePathPrefix); - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - validators.push_back(validatorName); - validators.push_back(validatorCountBindings); - validators.push_back(validatorConnectionExists); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - TAsyncStatus result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvCreateBindingResponse, YandexQuery::CreateBindingResult, TAuditDetails<YandexQuery::Binding>>( - MakeLogPrefix(scope, user, bindingId) + "CreateBindingRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(CreateBindingRequest, scope, user, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListBindingsRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_BINDINGS]; - requestCounters->InFly->Inc(); - - const YandexQuery::ListBindingsRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString pageToken = request.page_token(); - const int byteSize = ev->Get()->Request.ByteSize(); - const int64_t limit = request.limit(); - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - - CPS_LOG_T(MakeLogPrefix(scope, user) << "ListBindingsRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user) - << "ListBindingsRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvListBindingsResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ListBindingsRequest, scope, user, delta, byteSize, false); - return; - } - + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("binding_id", bindingId); + queryBuilder.AddString("connection_id", connectionId); + queryBuilder.AddString("user", user); + queryBuilder.AddInt64("visibility", content.acl().visibility()); + queryBuilder.AddString("name", content.name()); + queryBuilder.AddString("binding", binding.SerializeAsString()); + queryBuilder.AddInt64("revision", InitialRevision); + queryBuilder.AddString("internal", bindingInternal.SerializeAsString()); + + InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); + queryBuilder.AddText( + "INSERT INTO `" BINDINGS_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" BINDING_ID_COLUMN_NAME "`, `" CONNECTION_ID_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" NAME_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "`, `" REVISION_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "`) VALUES\n" + " ($scope, $binding_id, $connection_id, $user, $visibility, $name, $binding, $revision, $internal);" + ); + + auto validatorName = 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 validatorCountBindings = CreateCountEntitiesValidator( + scope, + BINDINGS_TABLE_NAME, + Config.Proto.GetMaxCountBindings(), + "Too many bindings in folder: " + ToString(Config.Proto.GetMaxCountBindings()) + ". Please remove unused bindings", + YdbConnection->TablePathPrefix); + + auto validatorConnectionExists = CreateConnectionExistsValidator( + scope, + connectionId, + "Connection " + connectionId + " does not exist or permission denied. Please check the id connection or your access rights", + permissions, + user, + YdbConnection->TablePathPrefix); + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + validators.push_back(validatorName); + validators.push_back(validatorCountBindings); + validators.push_back(validatorConnectionExists); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + TAsyncStatus result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvCreateBindingResponse, YandexQuery::CreateBindingResult, TAuditDetails<YandexQuery::Binding>>( + MakeLogPrefix(scope, user, bindingId) + "CreateBindingRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(CreateBindingRequest, scope, user, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListBindingsRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_BINDINGS]; + requestCounters->InFly->Inc(); + + const YandexQuery::ListBindingsRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString pageToken = request.page_token(); + const int byteSize = ev->Get()->Request.ByteSize(); + const int64_t limit = request.limit(); + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + + CPS_LOG_T(MakeLogPrefix(scope, user) << "ListBindingsRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user) + << "ListBindingsRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvListBindingsResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ListBindingsRequest, scope, user, delta, byteSize, false); + return; + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "ListBindings"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("last_binding", pageToken); - queryBuilder.AddUint64("limit", limit + 1); - - queryBuilder.AddText( - "SELECT `" BINDING_ID_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` >= $last_binding\n" - ); - - TString filter; - if (request.has_filter()) { - TVector<TString> filters; - if (request.filter().connection_id()) { - queryBuilder.AddString("connection_id", request.filter().connection_id()); - filters.push_back("`" CONNECTION_ID_COLUMN_NAME "` == $connection_id"); - } - - if (request.filter().name()) { - queryBuilder.AddString("filter_name", request.filter().name()); - filters.push_back("`" NAME_COLUMN_NAME "` LIKE '%' || $filter_name || '%'"); - } - - if (request.filter().created_by_me()) { - queryBuilder.AddString("user", user); - filters.push_back("`" USER_COLUMN_NAME "` = $user"); - } - + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("last_binding", pageToken); + queryBuilder.AddUint64("limit", limit + 1); + + queryBuilder.AddText( + "SELECT `" BINDING_ID_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` >= $last_binding\n" + ); + + TString filter; + if (request.has_filter()) { + TVector<TString> filters; + if (request.filter().connection_id()) { + queryBuilder.AddString("connection_id", request.filter().connection_id()); + filters.push_back("`" CONNECTION_ID_COLUMN_NAME "` == $connection_id"); + } + + if (request.filter().name()) { + queryBuilder.AddString("filter_name", request.filter().name()); + filters.push_back("`" NAME_COLUMN_NAME "` LIKE '%' || $filter_name || '%'"); + } + + if (request.filter().created_by_me()) { + queryBuilder.AddString("user", user); + filters.push_back("`" USER_COLUMN_NAME "` = $user"); + } + filter = JoinSeq(" AND ", filters); - } - - PrepareViewAccessCondition(queryBuilder, permissions, user); - - if (filter) { - queryBuilder.AddText(" AND (" + filter + ")"); - } - - queryBuilder.AddText( - "ORDER BY `" BINDING_ID_COLUMN_NAME "`\n" - "LIMIT $limit;" - ); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); - auto prepare = [resultSets=resultSets, limit] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; - } - - YandexQuery::ListBindingsResult result; - TResultSetParser parser(resultSets->front()); - while (parser.TryNextRow()) { - YandexQuery::Binding binding; - if (!binding.ParseFromString(*parser.ColumnParser(BINDING_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for binding. Please contact internal support"; - } - YandexQuery::BriefBinding& briefBinding = *result.add_binding(); - briefBinding.set_name(binding.content().name()); - briefBinding.set_connection_id(binding.content().connection_id()); - *briefBinding.mutable_meta() = binding.meta(); - switch (binding.content().setting().binding_case()) { - case YandexQuery::BindingSetting::kDataStreams: { - briefBinding.set_type(YandexQuery::BindingSetting::DATA_STREAMS); - break; - } - case YandexQuery::BindingSetting::kObjectStorage: { - briefBinding.set_type(YandexQuery::BindingSetting::OBJECT_STORAGE); - break; - } - // Do not replace with default. Adding a new binding should cause a compilation error - case YandexQuery::BindingSetting::BINDING_NOT_SET: - break; - } - } - - if (result.binding_size() == limit + 1) { - result.set_next_page_token(result.binding(result.binding_size() - 1).meta().id()); - result.mutable_binding()->RemoveLast(); - } - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvListBindingsResponse, YandexQuery::ListBindingsResult>( - MakeLogPrefix(scope, user) + "ListBindingsRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ListBindingsRequest, scope, user, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeBindingRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_BINDING]; - requestCounters->InFly->Inc(); - - const YandexQuery::DescribeBindingRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString bindingId = request.binding_id(); - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int byteSize = request.ByteSize(); - CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) - << "DescribeBindingRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) - << "DescribeBindingRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvDescribeBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(DescribeBindingRequest, scope, bindingId, user, delta, byteSize, false); - return; - } - + } + + PrepareViewAccessCondition(queryBuilder, permissions, user); + + if (filter) { + queryBuilder.AddText(" AND (" + filter + ")"); + } + + queryBuilder.AddText( + "ORDER BY `" BINDING_ID_COLUMN_NAME "`\n" + "LIMIT $limit;" + ); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + auto prepare = [resultSets=resultSets, limit] { + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + } + + YandexQuery::ListBindingsResult result; + TResultSetParser parser(resultSets->front()); + while (parser.TryNextRow()) { + YandexQuery::Binding binding; + if (!binding.ParseFromString(*parser.ColumnParser(BINDING_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for binding. Please contact internal support"; + } + YandexQuery::BriefBinding& briefBinding = *result.add_binding(); + briefBinding.set_name(binding.content().name()); + briefBinding.set_connection_id(binding.content().connection_id()); + *briefBinding.mutable_meta() = binding.meta(); + switch (binding.content().setting().binding_case()) { + case YandexQuery::BindingSetting::kDataStreams: { + briefBinding.set_type(YandexQuery::BindingSetting::DATA_STREAMS); + break; + } + case YandexQuery::BindingSetting::kObjectStorage: { + briefBinding.set_type(YandexQuery::BindingSetting::OBJECT_STORAGE); + break; + } + // Do not replace with default. Adding a new binding should cause a compilation error + case YandexQuery::BindingSetting::BINDING_NOT_SET: + break; + } + } + + if (result.binding_size() == limit + 1) { + result.set_next_page_token(result.binding(result.binding_size() - 1).meta().id()); + result.mutable_binding()->RemoveLast(); + } + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvListBindingsResponse, YandexQuery::ListBindingsResult>( + MakeLogPrefix(scope, user) + "ListBindingsRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ListBindingsRequest, scope, user, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeBindingRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_BINDING]; + requestCounters->InFly->Inc(); + + const YandexQuery::DescribeBindingRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString bindingId = request.binding_id(); + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int byteSize = request.ByteSize(); + CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) + << "DescribeBindingRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) + << "DescribeBindingRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvDescribeBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(DescribeBindingRequest, scope, bindingId, user, delta, byteSize, false); + return; + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "DescribeBinding"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("binding_id", bindingId); - queryBuilder.AddText( - "SELECT `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;" - ); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); - auto prepare = [=, resultSets=resultSets] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets->front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; - } - - YandexQuery::DescribeBindingResult result; - if (!result.mutable_binding()->ParseFromString(*parser.ColumnParser(BINDING_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for binding. Please contact internal support"; - } - - bool hasViewAccess = HasViewAccess(permissions, result.binding().content().acl().visibility(), result.binding().meta().created_by(), user); - if (!hasViewAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; - } - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvDescribeBindingResponse, YandexQuery::DescribeBindingResult>( - MakeLogPrefix(scope, user, bindingId) + "DescribeBindingRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(DescribeBindingRequest, scope, user, bindingId, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyBindingRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_BINDING]; - requestCounters->InFly->Inc(); - - const YandexQuery::ModifyBindingRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString bindingId = request.binding_id(); - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int64_t previousRevision = request.previous_revision(); - const TString idempotencyKey = request.idempotency_key(); - const int byteSize = request.ByteSize(); - CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) - << "ModifyBindingRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateBinding(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) - << "ModifyBindingRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvModifyBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ModifyBindingRequest, scope, bindingId, user, delta, byteSize, false); - return; - } - + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("binding_id", bindingId); + queryBuilder.AddText( + "SELECT `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;" + ); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + auto prepare = [=, resultSets=resultSets] { + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets->front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; + } + + YandexQuery::DescribeBindingResult result; + if (!result.mutable_binding()->ParseFromString(*parser.ColumnParser(BINDING_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for binding. Please contact internal support"; + } + + bool hasViewAccess = HasViewAccess(permissions, result.binding().content().acl().visibility(), result.binding().meta().created_by(), user); + if (!hasViewAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; + } + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvDescribeBindingResponse, YandexQuery::DescribeBindingResult>( + MakeLogPrefix(scope, user, bindingId) + "DescribeBindingRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(DescribeBindingRequest, scope, user, bindingId, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyBindingRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_BINDING]; + requestCounters->InFly->Inc(); + + const YandexQuery::ModifyBindingRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString bindingId = request.binding_id(); + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int64_t previousRevision = request.previous_revision(); + const TString idempotencyKey = request.idempotency_key(); + const int byteSize = request.ByteSize(); + CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) + << "ModifyBindingRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateBinding(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) + << "ModifyBindingRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvModifyBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ModifyBindingRequest, scope, bindingId, user, delta, byteSize, false); + return; + } + TSqlQueryBuilder readQueryBuilder(YdbConnection->TablePathPrefix, "ModifyBinding(read)"); - readQueryBuilder.AddString("scope", scope); - readQueryBuilder.AddString("binding_id", bindingId); - readQueryBuilder.AddText( - "SELECT `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;" - ); - - std::shared_ptr<std::pair<YandexQuery::ModifyBindingResult, TAuditDetails<YandexQuery::Binding>>> response = std::make_shared<std::pair<YandexQuery::ModifyBindingResult, TAuditDetails<YandexQuery::Binding>>>(); - auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - YandexQuery::Binding binding; - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; - } - - if (!binding.ParseFromString(*parser.ColumnParser(BINDING_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for binding. Please contact internal support"; - } - - bool hasManageAccess = HasManageAccess(permissions, binding.content().acl().visibility(), binding.meta().created_by(), user); - if (!hasManageAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; - } - - auto& meta = *binding.mutable_meta(); - meta.set_revision(meta.revision() + 1); - meta.set_modified_by(user); + readQueryBuilder.AddString("scope", scope); + readQueryBuilder.AddString("binding_id", bindingId); + readQueryBuilder.AddText( + "SELECT `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;" + ); + + std::shared_ptr<std::pair<YandexQuery::ModifyBindingResult, TAuditDetails<YandexQuery::Binding>>> response = std::make_shared<std::pair<YandexQuery::ModifyBindingResult, TAuditDetails<YandexQuery::Binding>>>(); + auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + YandexQuery::Binding binding; + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; + } + + if (!binding.ParseFromString(*parser.ColumnParser(BINDING_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for binding. Please contact internal support"; + } + + bool hasManageAccess = HasManageAccess(permissions, binding.content().acl().visibility(), binding.meta().created_by(), user); + if (!hasManageAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Binding does not exist or permission denied. Please check the id binding or your access rights"; + } + + auto& meta = *binding.mutable_meta(); + meta.set_revision(meta.revision() + 1); + meta.set_modified_by(user); *meta.mutable_modified_at() = NProtoInterop::CastToProto(TInstant::Now()); - - auto& content = *binding.mutable_content(); - - bool validateType = content.setting().binding_case() == request.content().setting().binding_case(); - - if (!validateType) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Binding type cannot be changed. Please specify the same binding type"; - } - - if (content.acl().visibility() == YandexQuery::Acl::SCOPE && request.content().acl().visibility() == YandexQuery::Acl::PRIVATE) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Changing visibility from SCOPE to PRIVATE is forbidden. Please create a new binding with visibility PRIVATE"; - } - - if (content.connection_id() != request.content().connection_id()) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Connection id cannot be changed. Please specify the same connection id"; - } - - content = request.content(); - - YandexQuery::Internal::BindingInternal bindingInternal; - response->second.After.ConstructInPlace().CopyFrom(binding); - response->second.CloudId = bindingInternal.cloud_id(); - + + auto& content = *binding.mutable_content(); + + bool validateType = content.setting().binding_case() == request.content().setting().binding_case(); + + if (!validateType) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Binding type cannot be changed. Please specify the same binding type"; + } + + if (content.acl().visibility() == YandexQuery::Acl::SCOPE && request.content().acl().visibility() == YandexQuery::Acl::PRIVATE) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Changing visibility from SCOPE to PRIVATE is forbidden. Please create a new binding with visibility PRIVATE"; + } + + if (content.connection_id() != request.content().connection_id()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Connection id cannot be changed. Please specify the same connection id"; + } + + content = request.content(); + + YandexQuery::Internal::BindingInternal bindingInternal; + response->second.After.ConstructInPlace().CopyFrom(binding); + response->second.CloudId = bindingInternal.cloud_id(); + TSqlQueryBuilder writeQueryBuilder(YdbConnection->TablePathPrefix, "ModifyBinding(write)"); - writeQueryBuilder.AddString("scope", scope); - writeQueryBuilder.AddString("binding_id", bindingId); - writeQueryBuilder.AddInt64("visibility", YandexQuery::Acl::SCOPE); // TODO: fix me - writeQueryBuilder.AddString("name", binding.content().name()); - writeQueryBuilder.AddInt64("revision", meta.revision()); - writeQueryBuilder.AddString("internal", bindingInternal.SerializeAsString()); - writeQueryBuilder.AddString("binding", binding.SerializeAsString()); - InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); - writeQueryBuilder.AddText( - "UPDATE `" BINDINGS_TABLE_NAME "` SET `" VISIBILITY_COLUMN_NAME "` = $visibility, `" NAME_COLUMN_NAME "` = $name, `" REVISION_COLUMN_NAME "` = $revision, `" INTERNAL_COLUMN_NAME "` = $internal, `" BINDING_COLUMN_NAME "` = $binding\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;\n" - ); - const auto writeQuery = writeQueryBuilder.Build(); - return make_pair(writeQuery.Sql, writeQuery.Params); - }; - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - auto accessValidator = CreateManageAccessValidator( - BINDINGS_TABLE_NAME, - BINDING_ID_COLUMN_NAME, - scope, - bindingId, - user, - "Binding does not exist or permission denied. Please check the id binding or your access rights", - permissions, - YdbConnection->TablePathPrefix); - validators.push_back(accessValidator); - - if (previousRevision > 0) { - auto revisionValidator = CreateRevisionValidator( - BINDINGS_TABLE_NAME, - BINDING_ID_COLUMN_NAME, - scope, - bindingId, - previousRevision, - "Revision of the binding has been changed already. Please restart the request with a new revision", - YdbConnection->TablePathPrefix); - validators.push_back(revisionValidator); - } - - { - auto modifyUniqueNameValidator = CreateModifyUniqueNameValidator( - BINDINGS_TABLE_NAME, - BINDING_ID_COLUMN_NAME, - request.content().acl().visibility(), - scope, - request.content().name(), - user, - bindingId, - "Binding with the same name already exists. Please choose another name", - YdbConnection->TablePathPrefix); - validators.push_back(modifyUniqueNameValidator); - } - - const auto readQuery = readQueryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvModifyBindingResponse, YandexQuery::ModifyBindingResult, TAuditDetails<YandexQuery::Binding>>( - MakeLogPrefix(scope, user, bindingId) + "ModifyBindingRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ModifyBindingRequest, scope, user, bindingId, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDeleteBindingRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_BINDING]; - requestCounters->InFly->Inc(); - - const YandexQuery::DeleteBindingRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - const TString bindingId = request.binding_id(); - const TString idempotencyKey = request.idempotency_key(); - const int byteSize = ev->Get()->Request.ByteSize(); - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int previousRevision = request.previous_revision(); - - CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) - << "DeleteBindingRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) - << "DeleteBindingRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvDeleteBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(DeleteBindingRequest, scope, bindingId, user, delta, byteSize, false); - return; - } - - std::shared_ptr<std::pair<YandexQuery::DeleteBindingResult, TAuditDetails<YandexQuery::Binding>>> response = std::make_shared<std::pair<YandexQuery::DeleteBindingResult, TAuditDetails<YandexQuery::Binding>>>(); - + writeQueryBuilder.AddString("scope", scope); + writeQueryBuilder.AddString("binding_id", bindingId); + writeQueryBuilder.AddInt64("visibility", YandexQuery::Acl::SCOPE); // TODO: fix me + writeQueryBuilder.AddString("name", binding.content().name()); + writeQueryBuilder.AddInt64("revision", meta.revision()); + writeQueryBuilder.AddString("internal", bindingInternal.SerializeAsString()); + writeQueryBuilder.AddString("binding", binding.SerializeAsString()); + InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); + writeQueryBuilder.AddText( + "UPDATE `" BINDINGS_TABLE_NAME "` SET `" VISIBILITY_COLUMN_NAME "` = $visibility, `" NAME_COLUMN_NAME "` = $name, `" REVISION_COLUMN_NAME "` = $revision, `" INTERNAL_COLUMN_NAME "` = $internal, `" BINDING_COLUMN_NAME "` = $binding\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;\n" + ); + const auto writeQuery = writeQueryBuilder.Build(); + return make_pair(writeQuery.Sql, writeQuery.Params); + }; + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + auto accessValidator = CreateManageAccessValidator( + BINDINGS_TABLE_NAME, + BINDING_ID_COLUMN_NAME, + scope, + bindingId, + user, + "Binding does not exist or permission denied. Please check the id binding or your access rights", + permissions, + YdbConnection->TablePathPrefix); + validators.push_back(accessValidator); + + if (previousRevision > 0) { + auto revisionValidator = CreateRevisionValidator( + BINDINGS_TABLE_NAME, + BINDING_ID_COLUMN_NAME, + scope, + bindingId, + previousRevision, + "Revision of the binding has been changed already. Please restart the request with a new revision", + YdbConnection->TablePathPrefix); + validators.push_back(revisionValidator); + } + + { + auto modifyUniqueNameValidator = CreateModifyUniqueNameValidator( + BINDINGS_TABLE_NAME, + BINDING_ID_COLUMN_NAME, + request.content().acl().visibility(), + scope, + request.content().name(), + user, + bindingId, + "Binding with the same name already exists. Please choose another name", + YdbConnection->TablePathPrefix); + validators.push_back(modifyUniqueNameValidator); + } + + const auto readQuery = readQueryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvModifyBindingResponse, YandexQuery::ModifyBindingResult, TAuditDetails<YandexQuery::Binding>>( + MakeLogPrefix(scope, user, bindingId) + "ModifyBindingRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ModifyBindingRequest, scope, user, bindingId, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDeleteBindingRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_BINDING]; + requestCounters->InFly->Inc(); + + const YandexQuery::DeleteBindingRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + const TString bindingId = request.binding_id(); + const TString idempotencyKey = request.idempotency_key(); + const int byteSize = ev->Get()->Request.ByteSize(); + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int previousRevision = request.previous_revision(); + + CPS_LOG_T(MakeLogPrefix(scope, user, bindingId) + << "DeleteBindingRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, bindingId) + << "DeleteBindingRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvDeleteBindingResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(DeleteBindingRequest, scope, bindingId, user, delta, byteSize, false); + return; + } + + std::shared_ptr<std::pair<YandexQuery::DeleteBindingResult, TAuditDetails<YandexQuery::Binding>>> response = std::make_shared<std::pair<YandexQuery::DeleteBindingResult, TAuditDetails<YandexQuery::Binding>>>(); + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "DeleteBinding"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("binding_id", bindingId); - - InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); - queryBuilder.AddText( - "DELETE FROM `" BINDINGS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;" - ); - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - auto accessValidator = CreateManageAccessValidator( - BINDINGS_TABLE_NAME, - BINDING_ID_COLUMN_NAME, - scope, - bindingId, - user, - "Binding does not exist or permission denied. Please check the id binding or your access rights", - permissions, - YdbConnection->TablePathPrefix); - validators.push_back(accessValidator); - - if (previousRevision > 0) { - auto revisionValidator = CreateRevisionValidator( - BINDINGS_TABLE_NAME, - BINDING_ID_COLUMN_NAME, - scope, - bindingId, - previousRevision, - "Revision of the binding has been changed already. Please restart the request with a new revision", - YdbConnection->TablePathPrefix); - validators.push_back(revisionValidator); - } - - validators.push_back(CreateEntityExtractor( - scope, - bindingId, - BINDING_COLUMN_NAME, - BINDING_ID_COLUMN_NAME, - BINDINGS_TABLE_NAME, - response, - YdbConnection->TablePathPrefix)); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvDeleteBindingResponse, YandexQuery::DeleteBindingResult, TAuditDetails<YandexQuery::Binding>>( - MakeLogPrefix(scope, user, bindingId) + "DeleteBindingRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(DeleteBindingRequest, scope, user, bindingId, delta, byteSize, future.GetValue()); - }); -} - -} // NYq + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("binding_id", bindingId); + + InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); + queryBuilder.AddText( + "DELETE FROM `" BINDINGS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" BINDING_ID_COLUMN_NAME "` = $binding_id;" + ); + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + auto accessValidator = CreateManageAccessValidator( + BINDINGS_TABLE_NAME, + BINDING_ID_COLUMN_NAME, + scope, + bindingId, + user, + "Binding does not exist or permission denied. Please check the id binding or your access rights", + permissions, + YdbConnection->TablePathPrefix); + validators.push_back(accessValidator); + + if (previousRevision > 0) { + auto revisionValidator = CreateRevisionValidator( + BINDINGS_TABLE_NAME, + BINDING_ID_COLUMN_NAME, + scope, + bindingId, + previousRevision, + "Revision of the binding has been changed already. Please restart the request with a new revision", + YdbConnection->TablePathPrefix); + validators.push_back(revisionValidator); + } + + validators.push_back(CreateEntityExtractor( + scope, + bindingId, + BINDING_COLUMN_NAME, + BINDING_ID_COLUMN_NAME, + BINDINGS_TABLE_NAME, + response, + YdbConnection->TablePathPrefix)); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvDeleteBindingResponse, YandexQuery::DeleteBindingResult, TAuditDetails<YandexQuery::Binding>>( + MakeLogPrefix(scope, user, bindingId) + "DeleteBindingRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(DeleteBindingRequest, scope, user, bindingId, delta, byteSize, future.GetValue()); + }); +} + +} // NYq diff --git a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp index ddb15b16c4..f22c782dce 100644 --- a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp +++ b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_connections.cpp @@ -1,640 +1,640 @@ -#include "validators.h" -#include "ydb_control_plane_storage_impl.h" - -#include <util/string/join.h> - +#include "validators.h" +#include "ydb_control_plane_storage_impl.h" + +#include <util/string/join.h> + #include <ydb/public/api/protos/yq.pb.h> - + #include <ydb/core/yq/libs/config/protos/issue_id.pb.h> #include <ydb/core/yq/libs/db_schema/db_schema.h> - -namespace NYq { - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateConnectionRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_CONNECTION]; - requestCounters->InFly->Inc(); - - const YandexQuery::CreateConnectionRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - const TString cloudId = ev->Get()->CloudId; - const int byteSize = ev->Get()->Request.ByteSize(); - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const TString idempotencyKey = request.idempotency_key(); - const TString connectionId = GetEntityIdAsString(Config.IdsPrefix, EEntityType::CONNECTION); - - CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) - << "CreateConnectionRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateConnection(ev); - if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a connection with these parameters. Please receive a permission yq.resources.managePublic")); - } - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) - << "CreateConnectionRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvCreateConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(CreateConnectionRequest, scope, user, delta, byteSize, false); + +namespace NYq { + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateConnectionRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_CONNECTION]; + requestCounters->InFly->Inc(); + + const YandexQuery::CreateConnectionRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + const TString cloudId = ev->Get()->CloudId; + const int byteSize = ev->Get()->Request.ByteSize(); + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const TString idempotencyKey = request.idempotency_key(); + const TString connectionId = GetEntityIdAsString(Config.IdsPrefix, EEntityType::CONNECTION); + + CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) + << "CreateConnectionRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateConnection(ev); + if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a connection with these parameters. Please receive a permission yq.resources.managePublic")); + } + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) + << "CreateConnectionRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvCreateConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(CreateConnectionRequest, scope, user, delta, byteSize, false); return; - } - - YandexQuery::Connection connection; - YandexQuery::ConnectionContent& content = *connection.mutable_content(); - content = request.content(); - *connection.mutable_meta() = CreateCommonMeta(connectionId, user, startTime, InitialRevision); - - YandexQuery::Internal::ConnectionInternal connectionInternal; - connectionInternal.set_cloud_id(cloudId); - - std::shared_ptr<std::pair<YandexQuery::CreateConnectionResult, TAuditDetails<YandexQuery::Connection>>> response = std::make_shared<std::pair<YandexQuery::CreateConnectionResult, TAuditDetails<YandexQuery::Connection>>>(); - response->first.set_connection_id(connectionId); - response->second.After.ConstructInPlace().CopyFrom(connection); - response->second.CloudId = cloudId; - + } + + YandexQuery::Connection connection; + YandexQuery::ConnectionContent& content = *connection.mutable_content(); + content = request.content(); + *connection.mutable_meta() = CreateCommonMeta(connectionId, user, startTime, InitialRevision); + + YandexQuery::Internal::ConnectionInternal connectionInternal; + connectionInternal.set_cloud_id(cloudId); + + std::shared_ptr<std::pair<YandexQuery::CreateConnectionResult, TAuditDetails<YandexQuery::Connection>>> response = std::make_shared<std::pair<YandexQuery::CreateConnectionResult, TAuditDetails<YandexQuery::Connection>>>(); + response->first.set_connection_id(connectionId); + response->second.After.ConstructInPlace().CopyFrom(connection); + response->second.CloudId = cloudId; + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "CreateConnection"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("connection_id", connectionId); - queryBuilder.AddString("user", user); - queryBuilder.AddInt64("visibility", content.acl().visibility()); - queryBuilder.AddString("name", content.name()); - queryBuilder.AddInt64("connection_type", content.setting().connection_case()); - queryBuilder.AddString("connection", connection.SerializeAsString()); - queryBuilder.AddInt64("revision", InitialRevision); - queryBuilder.AddString("internal", connectionInternal.SerializeAsString()); - - InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); - - queryBuilder.AddText( + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("connection_id", connectionId); + queryBuilder.AddString("user", user); + queryBuilder.AddInt64("visibility", content.acl().visibility()); + queryBuilder.AddString("name", content.name()); + queryBuilder.AddInt64("connection_type", content.setting().connection_case()); + queryBuilder.AddString("connection", connection.SerializeAsString()); + queryBuilder.AddInt64("revision", InitialRevision); + queryBuilder.AddString("internal", connectionInternal.SerializeAsString()); + + InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); + + queryBuilder.AddText( "INSERT INTO `" CONNECTIONS_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" CONNECTION_ID_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" NAME_COLUMN_NAME "`, `" CONNECTION_TYPE_COLUMN_NAME "`, `" CONNECTION_COLUMN_NAME "`, `" REVISION_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "`) VALUES\n" - " ($scope, $connection_id, $user, $visibility, $name, $connection_type, $connection, $revision, $internal);" - ); - - auto validatorName = 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 validatorCountConnections = CreateCountEntitiesValidator( - scope, - CONNECTIONS_TABLE_NAME, - Config.Proto.GetMaxCountConnections(), - "Too many connections in folder: " + ToString(Config.Proto.GetMaxCountConnections()) + ". Please remove unused connections", - YdbConnection->TablePathPrefix); - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - validators.push_back(validatorName); - validators.push_back(validatorCountConnections); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - TAsyncStatus result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvCreateConnectionResponse, YandexQuery::CreateConnectionResult, TAuditDetails<YandexQuery::Connection>>( - MakeLogPrefix(scope, user, connectionId) + "CreateConnectionRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(CreateConnectionRequest, scope, user, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListConnectionsRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_CONNECTIONS]; - requestCounters->InFly->Inc(); - - const YandexQuery::ListConnectionsRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString pageToken = request.page_token(); - const int byteSize = ev->Get()->Request.ByteSize(); - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int64_t limit = request.limit(); - CPS_LOG_T(MakeLogPrefix(scope, user) - << "ListConnectionsRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user) - << "ListConnectionsRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvListConnectionsResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ListConnectionsRequest, scope, user, delta, byteSize, false); + " ($scope, $connection_id, $user, $visibility, $name, $connection_type, $connection, $revision, $internal);" + ); + + auto validatorName = 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 validatorCountConnections = CreateCountEntitiesValidator( + scope, + CONNECTIONS_TABLE_NAME, + Config.Proto.GetMaxCountConnections(), + "Too many connections in folder: " + ToString(Config.Proto.GetMaxCountConnections()) + ". Please remove unused connections", + YdbConnection->TablePathPrefix); + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + validators.push_back(validatorName); + validators.push_back(validatorCountConnections); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + TAsyncStatus result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvCreateConnectionResponse, YandexQuery::CreateConnectionResult, TAuditDetails<YandexQuery::Connection>>( + MakeLogPrefix(scope, user, connectionId) + "CreateConnectionRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(CreateConnectionRequest, scope, user, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListConnectionsRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_CONNECTIONS]; + requestCounters->InFly->Inc(); + + const YandexQuery::ListConnectionsRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString pageToken = request.page_token(); + const int byteSize = ev->Get()->Request.ByteSize(); + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int64_t limit = request.limit(); + CPS_LOG_T(MakeLogPrefix(scope, user) + << "ListConnectionsRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user) + << "ListConnectionsRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvListConnectionsResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ListConnectionsRequest, scope, user, delta, byteSize, false); return; - } - + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "ListConnections"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("last_connection", pageToken); - queryBuilder.AddUint64("limit", limit + 1); - - queryBuilder.AddText( - "SELECT `" CONNECTION_ID_COLUMN_NAME "`, `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` >= $last_connection\n" - ); - - TString filter; - if (request.has_filter()) { - TVector<TString> filters; - if (request.filter().name()) { - queryBuilder.AddString("filter_name", request.filter().name()); - filters.push_back("`" NAME_COLUMN_NAME "` LIKE '%' || $filter_name || '%'"); - } - - if (request.filter().created_by_me()) { - queryBuilder.AddString("user", user); - filters.push_back("`" USER_COLUMN_NAME "` = $user"); - } - + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("last_connection", pageToken); + queryBuilder.AddUint64("limit", limit + 1); + + queryBuilder.AddText( + "SELECT `" CONNECTION_ID_COLUMN_NAME "`, `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` >= $last_connection\n" + ); + + TString filter; + if (request.has_filter()) { + TVector<TString> filters; + if (request.filter().name()) { + queryBuilder.AddString("filter_name", request.filter().name()); + filters.push_back("`" NAME_COLUMN_NAME "` LIKE '%' || $filter_name || '%'"); + } + + if (request.filter().created_by_me()) { + queryBuilder.AddString("user", user); + filters.push_back("`" USER_COLUMN_NAME "` = $user"); + } + if (request.filter().connection_type() != YandexQuery::ConnectionSetting::CONNECTION_TYPE_UNSPECIFIED) { - queryBuilder.AddInt64("connection_type", request.filter().connection_type()); - filters.push_back("`" CONNECTION_TYPE_COLUMN_NAME "` = $connection_type"); + queryBuilder.AddInt64("connection_type", request.filter().connection_type()); + filters.push_back("`" CONNECTION_TYPE_COLUMN_NAME "` = $connection_type"); } filter = JoinSeq(" AND ", filters); - } - - PrepareViewAccessCondition(queryBuilder, permissions, user); - - if (filter) { - queryBuilder.AddText(" AND (" + filter + ")\n"); - } - - queryBuilder.AddText( - "ORDER BY `" CONNECTION_ID_COLUMN_NAME "`\n" - "LIMIT $limit;" - ); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); - auto prepare = [resultSets=resultSets, limit] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; - } - - YandexQuery::ListConnectionsResult result; - TResultSetParser parser(resultSets->front()); - while (parser.TryNextRow()) { - auto& connection = *result.add_connection(); - if (!connection.ParseFromString(*parser.ColumnParser(CONNECTION_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for connection. Please contact internal support"; - } - auto& setting = *connection.mutable_content()->mutable_setting(); - if (setting.has_clickhouse_cluster()) { - auto& ch = *setting.mutable_clickhouse_cluster(); - ch.set_password(""); - } - } - - if (result.connection_size() == limit + 1) { - result.set_next_page_token(result.connection(result.connection_size() - 1).meta().id()); - result.mutable_connection()->RemoveLast(); - } - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvListConnectionsResponse, YandexQuery::ListConnectionsResult>( - MakeLogPrefix(scope, user) + "ListConnectionsRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ListConnectionsRequest, scope, user, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeConnectionRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_CONNECTION]; - requestCounters->InFly->Inc(); - - const YandexQuery::DescribeConnectionRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString connectionId = request.connection_id(); - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int byteSize = request.ByteSize(); - - CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) - << "DescribeConnectionRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) - << "DescribeConnectionRequest, validation failed: " - << NKikimr::MaskTicket(token)<< " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvDescribeConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(DescribeConnectionRequest, scope, connectionId, user, delta, byteSize, false); + } + + PrepareViewAccessCondition(queryBuilder, permissions, user); + + if (filter) { + queryBuilder.AddText(" AND (" + filter + ")\n"); + } + + queryBuilder.AddText( + "ORDER BY `" CONNECTION_ID_COLUMN_NAME "`\n" + "LIMIT $limit;" + ); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + auto prepare = [resultSets=resultSets, limit] { + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + } + + YandexQuery::ListConnectionsResult result; + TResultSetParser parser(resultSets->front()); + while (parser.TryNextRow()) { + auto& connection = *result.add_connection(); + if (!connection.ParseFromString(*parser.ColumnParser(CONNECTION_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for connection. Please contact internal support"; + } + auto& setting = *connection.mutable_content()->mutable_setting(); + if (setting.has_clickhouse_cluster()) { + auto& ch = *setting.mutable_clickhouse_cluster(); + ch.set_password(""); + } + } + + if (result.connection_size() == limit + 1) { + result.set_next_page_token(result.connection(result.connection_size() - 1).meta().id()); + result.mutable_connection()->RemoveLast(); + } + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvListConnectionsResponse, YandexQuery::ListConnectionsResult>( + MakeLogPrefix(scope, user) + "ListConnectionsRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ListConnectionsRequest, scope, user, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeConnectionRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_CONNECTION]; + requestCounters->InFly->Inc(); + + const YandexQuery::DescribeConnectionRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString connectionId = request.connection_id(); + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int byteSize = request.ByteSize(); + + CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) + << "DescribeConnectionRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) + << "DescribeConnectionRequest, validation failed: " + << NKikimr::MaskTicket(token)<< " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvDescribeConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(DescribeConnectionRequest, scope, connectionId, user, delta, byteSize, false); return; - } - + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "DescribeConnection"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("connection_id", connectionId); - - queryBuilder.AddText( - "SELECT `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" - ); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); - auto prepare = [=, resultSets=resultSets] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; - } - - YandexQuery::DescribeConnectionResult result; - TResultSetParser parser(resultSets->front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Connection does not exist or permission denied. Please check the id connection or your access rights"; - } - - if (!result.mutable_connection()->ParseFromString(*parser.ColumnParser(CONNECTION_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for connection. Please contact internal support"; - } - - bool hasViewAccess = HasViewAccess(permissions, result.connection().content().acl().visibility(), result.connection().meta().created_by(), user); - if (!hasViewAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Connection does not exist or permission denied. Please check the id connection or your access rights"; - } - - auto& setting = *result.mutable_connection()->mutable_content()->mutable_setting(); - if (setting.has_clickhouse_cluster()) { - auto& ch = *setting.mutable_clickhouse_cluster(); - ch.set_password(""); - } - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvDescribeConnectionResponse, YandexQuery::DescribeConnectionResult>( - MakeLogPrefix(scope, user, connectionId) + "DescribeConnectionRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(DescribeConnectionRequest, scope, connectionId, user, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyConnectionRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_CONNECTION]; - requestCounters->InFly->Inc(); - - const YandexQuery::ModifyConnectionRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const TString connectionId = request.connection_id(); - const int64_t previousRevision = request.previous_revision(); - const TString idempotencyKey = request.idempotency_key(); - const int byteSize = request.ByteSize(); - CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) - << "ModifyConnectionRequest: " - << NKikimr::MaskTicket(token) - << " " << request.DebugString()); - - NYql::TIssues issues = ValidateConnection(ev, false); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) - << "ModifyConnectionRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvModifyConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ModifyConnectionRequest, scope, connectionId, user, delta, byteSize, false); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("connection_id", connectionId); + + queryBuilder.AddText( + "SELECT `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" + ); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + auto prepare = [=, resultSets=resultSets] { + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + } + + YandexQuery::DescribeConnectionResult result; + TResultSetParser parser(resultSets->front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Connection does not exist or permission denied. Please check the id connection or your access rights"; + } + + if (!result.mutable_connection()->ParseFromString(*parser.ColumnParser(CONNECTION_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for connection. Please contact internal support"; + } + + bool hasViewAccess = HasViewAccess(permissions, result.connection().content().acl().visibility(), result.connection().meta().created_by(), user); + if (!hasViewAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Connection does not exist or permission denied. Please check the id connection or your access rights"; + } + + auto& setting = *result.mutable_connection()->mutable_content()->mutable_setting(); + if (setting.has_clickhouse_cluster()) { + auto& ch = *setting.mutable_clickhouse_cluster(); + ch.set_password(""); + } + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvDescribeConnectionResponse, YandexQuery::DescribeConnectionResult>( + MakeLogPrefix(scope, user, connectionId) + "DescribeConnectionRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(DescribeConnectionRequest, scope, connectionId, user, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyConnectionRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_CONNECTION]; + requestCounters->InFly->Inc(); + + const YandexQuery::ModifyConnectionRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const TString connectionId = request.connection_id(); + const int64_t previousRevision = request.previous_revision(); + const TString idempotencyKey = request.idempotency_key(); + const int byteSize = request.ByteSize(); + CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) + << "ModifyConnectionRequest: " + << NKikimr::MaskTicket(token) + << " " << request.DebugString()); + + NYql::TIssues issues = ValidateConnection(ev, false); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) + << "ModifyConnectionRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvModifyConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ModifyConnectionRequest, scope, connectionId, user, delta, byteSize, false); return; - } + } TSqlQueryBuilder readQueryBuilder(YdbConnection->TablePathPrefix, "ModifyConnection(read)"); - readQueryBuilder.AddString("scope", scope); - readQueryBuilder.AddString("connection_id", connectionId); - readQueryBuilder.AddText( - "SELECT `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" - ); - - std::shared_ptr<std::pair<YandexQuery::ModifyConnectionResult, TAuditDetails<YandexQuery::Connection>>> response = std::make_shared<std::pair<YandexQuery::ModifyConnectionResult, TAuditDetails<YandexQuery::Connection>>>(); - auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { - if (resultSets.size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Connection does not exist or permission denied. Please check the id connection or your access rights"; - } - - YandexQuery::Connection connection; - if (!connection.ParseFromString(*parser.ColumnParser(CONNECTION_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for connection. Please contact internal support"; - } - - auto& meta = *connection.mutable_meta(); - meta.set_revision(meta.revision() + 1); - meta.set_modified_by(user); + readQueryBuilder.AddString("scope", scope); + readQueryBuilder.AddString("connection_id", connectionId); + readQueryBuilder.AddText( + "SELECT `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" + ); + + std::shared_ptr<std::pair<YandexQuery::ModifyConnectionResult, TAuditDetails<YandexQuery::Connection>>> response = std::make_shared<std::pair<YandexQuery::ModifyConnectionResult, TAuditDetails<YandexQuery::Connection>>>(); + auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { + if (resultSets.size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Connection does not exist or permission denied. Please check the id connection or your access rights"; + } + + YandexQuery::Connection connection; + if (!connection.ParseFromString(*parser.ColumnParser(CONNECTION_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for connection. Please contact internal support"; + } + + auto& meta = *connection.mutable_meta(); + meta.set_revision(meta.revision() + 1); + meta.set_modified_by(user); *meta.mutable_modified_at() = NProtoInterop::CastToProto(TInstant::Now()); - - auto& content = *connection.mutable_content(); - - bool validateType = content.setting().connection_case() == request.content().setting().connection_case(); - - if (!validateType) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Connection type cannot be changed. Please specify the same connection type"; - } - - if (content.acl().visibility() == YandexQuery::Acl::SCOPE && request.content().acl().visibility() == YandexQuery::Acl::PRIVATE) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Changing visibility from SCOPE to PRIVATE is forbidden. Please create a new connection with visibility PRIVATE"; - } - - TString clickHousePassword; - if (request.content().setting().has_clickhouse_cluster()) { - clickHousePassword = request.content().setting().clickhouse_cluster().password(); - if (!clickHousePassword) { - clickHousePassword = content.setting().clickhouse_cluster().password(); - } - content = request.content(); - content.mutable_setting()->mutable_clickhouse_cluster()->set_password(clickHousePassword); - } else { - content = request.content(); - } - - YandexQuery::Internal::ConnectionInternal connectionInternal; - response->second.After.ConstructInPlace().CopyFrom(connection); - response->second.CloudId = connectionInternal.cloud_id(); - + + auto& content = *connection.mutable_content(); + + bool validateType = content.setting().connection_case() == request.content().setting().connection_case(); + + if (!validateType) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Connection type cannot be changed. Please specify the same connection type"; + } + + if (content.acl().visibility() == YandexQuery::Acl::SCOPE && request.content().acl().visibility() == YandexQuery::Acl::PRIVATE) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Changing visibility from SCOPE to PRIVATE is forbidden. Please create a new connection with visibility PRIVATE"; + } + + TString clickHousePassword; + if (request.content().setting().has_clickhouse_cluster()) { + clickHousePassword = request.content().setting().clickhouse_cluster().password(); + if (!clickHousePassword) { + clickHousePassword = content.setting().clickhouse_cluster().password(); + } + content = request.content(); + content.mutable_setting()->mutable_clickhouse_cluster()->set_password(clickHousePassword); + } else { + content = request.content(); + } + + YandexQuery::Internal::ConnectionInternal connectionInternal; + response->second.After.ConstructInPlace().CopyFrom(connection); + response->second.CloudId = connectionInternal.cloud_id(); + TSqlQueryBuilder writeQueryBuilder(YdbConnection->TablePathPrefix, "ModifyConnection(write)"); - writeQueryBuilder.AddString("scope", scope); - writeQueryBuilder.AddString("connection_id", connectionId); - writeQueryBuilder.AddInt64("visibility", connection.content().acl().visibility()); - writeQueryBuilder.AddString("name", connection.content().name()); - writeQueryBuilder.AddInt64("revision", meta.revision()); - writeQueryBuilder.AddString("internal", connectionInternal.SerializeAsString()); - writeQueryBuilder.AddString("connection", connection.SerializeAsString()); - InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); - writeQueryBuilder.AddText( - "UPDATE `" CONNECTIONS_TABLE_NAME "` SET `" VISIBILITY_COLUMN_NAME "` = $visibility, `" NAME_COLUMN_NAME "` = $name, `" REVISION_COLUMN_NAME "` = $revision, `" INTERNAL_COLUMN_NAME "` = $internal, `" CONNECTION_COLUMN_NAME "` = $connection\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" - ); - const auto writeQuery = writeQueryBuilder.Build(); - return make_pair(writeQuery.Sql, writeQuery.Params); - }; - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - auto accessValidator = CreateManageAccessValidator( - CONNECTIONS_TABLE_NAME, - CONNECTION_ID_COLUMN_NAME, - scope, - connectionId, - user, - "Connection does not exist or permission denied. Please check the id connection or your access rights", - permissions, - YdbConnection->TablePathPrefix); - validators.push_back(accessValidator); - - if (previousRevision > 0) { - auto revisionValidator = CreateRevisionValidator( - CONNECTIONS_TABLE_NAME, - CONNECTION_ID_COLUMN_NAME, - scope, - connectionId, - previousRevision, - "Revision of the connection has been changed already. Please restart the request with a new revision", - YdbConnection->TablePathPrefix); - validators.push_back(revisionValidator); - } - - { - auto modifyUniqueNameValidator = CreateModifyUniqueNameValidator( - CONNECTIONS_TABLE_NAME, - CONNECTION_ID_COLUMN_NAME, - request.content().acl().visibility(), - scope, - request.content().name(), - user, - connectionId, - "Connection with the same name already exists. Please choose another name", - YdbConnection->TablePathPrefix); - validators.push_back(modifyUniqueNameValidator); - } - - const auto readQuery = readQueryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvModifyConnectionResponse, YandexQuery::ModifyConnectionResult, TAuditDetails<YandexQuery::Connection>>( - MakeLogPrefix(scope, user, connectionId) + "ModifyConnectionRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ModifyConnectionRequest, scope, user, connectionId, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDeleteConnectionRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_CONNECTION]; - requestCounters->InFly->Inc(); - - const YandexQuery::DeleteConnectionRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const TString connectionId = request.connection_id(); - const TString idempotencyKey = request.idempotency_key(); - const int byteSize = request.ByteSize(); - const int previousRevision = request.previous_revision(); - CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) - << "DeleteConnectionRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) - << "DeleteConnectionRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvDeleteConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(DeleteConnectionRequest, scope, connectionId, user, delta, byteSize, false); + writeQueryBuilder.AddString("scope", scope); + writeQueryBuilder.AddString("connection_id", connectionId); + writeQueryBuilder.AddInt64("visibility", connection.content().acl().visibility()); + writeQueryBuilder.AddString("name", connection.content().name()); + writeQueryBuilder.AddInt64("revision", meta.revision()); + writeQueryBuilder.AddString("internal", connectionInternal.SerializeAsString()); + writeQueryBuilder.AddString("connection", connection.SerializeAsString()); + InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); + writeQueryBuilder.AddText( + "UPDATE `" CONNECTIONS_TABLE_NAME "` SET `" VISIBILITY_COLUMN_NAME "` = $visibility, `" NAME_COLUMN_NAME "` = $name, `" REVISION_COLUMN_NAME "` = $revision, `" INTERNAL_COLUMN_NAME "` = $internal, `" CONNECTION_COLUMN_NAME "` = $connection\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" + ); + const auto writeQuery = writeQueryBuilder.Build(); + return make_pair(writeQuery.Sql, writeQuery.Params); + }; + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + auto accessValidator = CreateManageAccessValidator( + CONNECTIONS_TABLE_NAME, + CONNECTION_ID_COLUMN_NAME, + scope, + connectionId, + user, + "Connection does not exist or permission denied. Please check the id connection or your access rights", + permissions, + YdbConnection->TablePathPrefix); + validators.push_back(accessValidator); + + if (previousRevision > 0) { + auto revisionValidator = CreateRevisionValidator( + CONNECTIONS_TABLE_NAME, + CONNECTION_ID_COLUMN_NAME, + scope, + connectionId, + previousRevision, + "Revision of the connection has been changed already. Please restart the request with a new revision", + YdbConnection->TablePathPrefix); + validators.push_back(revisionValidator); + } + + { + auto modifyUniqueNameValidator = CreateModifyUniqueNameValidator( + CONNECTIONS_TABLE_NAME, + CONNECTION_ID_COLUMN_NAME, + request.content().acl().visibility(), + scope, + request.content().name(), + user, + connectionId, + "Connection with the same name already exists. Please choose another name", + YdbConnection->TablePathPrefix); + validators.push_back(modifyUniqueNameValidator); + } + + const auto readQuery = readQueryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvModifyConnectionResponse, YandexQuery::ModifyConnectionResult, TAuditDetails<YandexQuery::Connection>>( + MakeLogPrefix(scope, user, connectionId) + "ModifyConnectionRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ModifyConnectionRequest, scope, user, connectionId, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDeleteConnectionRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_CONNECTION]; + requestCounters->InFly->Inc(); + + const YandexQuery::DeleteConnectionRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const TString connectionId = request.connection_id(); + const TString idempotencyKey = request.idempotency_key(); + const int byteSize = request.ByteSize(); + const int previousRevision = request.previous_revision(); + CPS_LOG_T(MakeLogPrefix(scope, user, connectionId) + << "DeleteConnectionRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, connectionId) + << "DeleteConnectionRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvDeleteConnectionResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(DeleteConnectionRequest, scope, connectionId, user, delta, byteSize, false); return; - } - - std::shared_ptr<std::pair<YandexQuery::DeleteConnectionResult, TAuditDetails<YandexQuery::Connection>>> response = std::make_shared<std::pair<YandexQuery::DeleteConnectionResult, TAuditDetails<YandexQuery::Connection>>>(); + } + std::shared_ptr<std::pair<YandexQuery::DeleteConnectionResult, TAuditDetails<YandexQuery::Connection>>> response = std::make_shared<std::pair<YandexQuery::DeleteConnectionResult, TAuditDetails<YandexQuery::Connection>>>(); + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "DeleteConnection"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("connection_id", connectionId); - - InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); - queryBuilder.AddText( - "DELETE FROM `" CONNECTIONS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" - ); - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - auto accessValidator = CreateManageAccessValidator( - CONNECTIONS_TABLE_NAME, - CONNECTION_ID_COLUMN_NAME, - scope, - connectionId, - user, - "Connection does not exist or permission denied. Please check the id connection or your access rights", - permissions, - YdbConnection->TablePathPrefix); - validators.push_back(accessValidator); - - if (previousRevision > 0) { - auto revisionValidator = CreateRevisionValidator( - CONNECTIONS_TABLE_NAME, - CONNECTION_ID_COLUMN_NAME, - scope, - connectionId, - previousRevision, - "Revision of the connection has been changed already. Please restart the request with a new revision", - YdbConnection->TablePathPrefix); - validators.push_back(revisionValidator); - } - - { - auto relatedBindingsValidator = CreateRelatedBindingsValidator(scope, - connectionId, - "There are bindings related with connection. Please remove them at the beginning", - YdbConnection->TablePathPrefix); - validators.push_back(relatedBindingsValidator); - } - - validators.push_back(CreateEntityExtractor( - scope, - connectionId, - CONNECTION_COLUMN_NAME, - CONNECTION_ID_COLUMN_NAME, - CONNECTIONS_TABLE_NAME, - response, - YdbConnection->TablePathPrefix)); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvDeleteConnectionResponse, YandexQuery::DeleteConnectionResult, TAuditDetails<YandexQuery::Connection>>( - MakeLogPrefix(scope, user, connectionId) + "DeleteConnectionRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(DeleteConnectionRequest, scope, user, connectionId, delta, byteSize, future.GetValue()); - }); -} - + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("connection_id", connectionId); + + InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); + queryBuilder.AddText( + "DELETE FROM `" CONNECTIONS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" CONNECTION_ID_COLUMN_NAME "` = $connection_id;" + ); + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + auto accessValidator = CreateManageAccessValidator( + CONNECTIONS_TABLE_NAME, + CONNECTION_ID_COLUMN_NAME, + scope, + connectionId, + user, + "Connection does not exist or permission denied. Please check the id connection or your access rights", + permissions, + YdbConnection->TablePathPrefix); + validators.push_back(accessValidator); + + if (previousRevision > 0) { + auto revisionValidator = CreateRevisionValidator( + CONNECTIONS_TABLE_NAME, + CONNECTION_ID_COLUMN_NAME, + scope, + connectionId, + previousRevision, + "Revision of the connection has been changed already. Please restart the request with a new revision", + YdbConnection->TablePathPrefix); + validators.push_back(revisionValidator); + } + + { + auto relatedBindingsValidator = CreateRelatedBindingsValidator(scope, + connectionId, + "There are bindings related with connection. Please remove them at the beginning", + YdbConnection->TablePathPrefix); + validators.push_back(relatedBindingsValidator); + } + + validators.push_back(CreateEntityExtractor( + scope, + connectionId, + CONNECTION_COLUMN_NAME, + CONNECTION_ID_COLUMN_NAME, + CONNECTIONS_TABLE_NAME, + response, + YdbConnection->TablePathPrefix)); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvDeleteConnectionResponse, YandexQuery::DeleteConnectionResult, TAuditDetails<YandexQuery::Connection>>( + MakeLogPrefix(scope, user, connectionId) + "DeleteConnectionRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(DeleteConnectionRequest, scope, user, connectionId, delta, byteSize, future.GetValue()); + }); +} + } // NYq diff --git a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_impl.h b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_impl.h index 1c8cda7ee7..3e8169f8a7 100644 --- a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_impl.h +++ b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_impl.h @@ -1,30 +1,30 @@ -#pragma once - -#include "control_plane_storage.h" +#pragma once + +#include "control_plane_storage.h" #include "control_plane_storage_counters.h" -#include "exceptions.h" -#include "extractors.h" +#include "exceptions.h" +#include "extractors.h" #include <ydb/core/yq/libs/control_plane_storage/internal/response_tasks.h> -#include "probes.h" -#include "util.h" -#include "validators.h" - -#include <util/generic/guid.h> -#include <util/system/yassert.h> - -#include <library/cpp/actors/core/actor_bootstrapped.h> -#include <library/cpp/lwtrace/mon/mon_lwtrace.h> -#include <library/cpp/monlib/service/pages/templates.h> +#include "probes.h" +#include "util.h" +#include "validators.h" + +#include <util/generic/guid.h> +#include <util/system/yassert.h> + +#include <library/cpp/actors/core/actor_bootstrapped.h> +#include <library/cpp/lwtrace/mon/mon_lwtrace.h> +#include <library/cpp/monlib/service/pages/templates.h> #include <library/cpp/protobuf/interop/cast.h> - + #include <ydb/public/api/protos/yq.pb.h> #include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h> - + #include <ydb/library/security/util.h> - + #include <ydb/core/base/appdata.h> #include <ydb/core/mon/mon.h> - + #include <ydb/core/yq/libs/common/entity_id.h> #include <ydb/core/yq/libs/config/protos/issue_id.pb.h> #include <ydb/core/yq/libs/config/yq_issue.h> @@ -33,371 +33,371 @@ #include <ydb/core/yq/libs/db_schema/db_schema.h> #include <ydb/core/yq/libs/ydb/util.h> #include <ydb/core/yq/libs/ydb/ydb.h> - -namespace NYq { - -using namespace NActors; -using namespace NConfig; -using namespace NKikimr; -using namespace NThreading; -using namespace NYdb; -using namespace NYdb::NTable; - -inline static void PrepareAccessConditionImpl(TSqlQueryBuilder& builder, TPermissions permissions, const TString& user, TPermissions::TPermission privatePermission, TPermissions::TPermission publicPermission) { - if (permissions.Check(publicPermission) && permissions.Check(privatePermission)) { - // any row - } else if (permissions.Check(publicPermission)) { - builder.AddString("user", user); - builder.AddInt64("visibility_scope", YandexQuery::Acl::SCOPE); - builder.AddText(" AND (`" VISIBILITY_COLUMN_NAME "` = $visibility_scope OR `" USER_COLUMN_NAME "` = $user)"); - } else if (permissions.Check(privatePermission)) { - builder.AddInt64("visibility_private", YandexQuery::Acl::PRIVATE); - builder.AddText(" AND (`" VISIBILITY_COLUMN_NAME "` = $visibility_private)"); - } else { - builder.AddString("user", user); - builder.AddInt64("visibility_private", YandexQuery::Acl::PRIVATE); - builder.AddText(" AND (`" VISIBILITY_COLUMN_NAME "` = $visibility_private AND `" USER_COLUMN_NAME "` = $user)"); - } -} - -inline static void PrepareViewAccessCondition(TSqlQueryBuilder& builder, TPermissions permissions, const TString& user) { - PrepareAccessConditionImpl(builder, permissions, user, TPermissions::VIEW_PRIVATE, TPermissions::VIEW_PUBLIC); -} - -inline static void PrepareManageAccessCondition(TSqlQueryBuilder& builder, TPermissions permissions, const TString& user) { - PrepareAccessConditionImpl(builder, permissions, user, TPermissions::MANAGE_PRIVATE, TPermissions::MANAGE_PUBLIC); -} - -inline static bool HasAccessImpl(TPermissions permissions, YandexQuery::Acl::Visibility entityVisibility, const TString& entityUser, const TString& user, TPermissions::TPermission privatePermission, TPermissions::TPermission publicPermission) { - return (permissions.Check(publicPermission) && permissions.Check(privatePermission)) - || (permissions.Check(publicPermission) && (entityVisibility == YandexQuery::Acl::SCOPE || entityUser == user)) - || (permissions.Check(privatePermission) && entityVisibility == YandexQuery::Acl::PRIVATE) - || (entityVisibility == YandexQuery::Acl::PRIVATE && entityUser == user); -} - - -inline static bool HasViewAccess(TPermissions permissions, YandexQuery::Acl::Visibility entityVisibility, const TString& entityUser, const TString& user) { - return HasAccessImpl(permissions, entityVisibility, entityUser, user, TPermissions::VIEW_PRIVATE, TPermissions::VIEW_PUBLIC); -} - -inline static bool HasManageAccess(TPermissions permissions, YandexQuery::Acl::Visibility entityVisibility, const TString& entityUser, const TString& user) { - return HasAccessImpl(permissions, entityVisibility, entityUser, user, TPermissions::MANAGE_PRIVATE, TPermissions::MANAGE_PUBLIC); -} - -LWTRACE_USING(YQ_CONTROL_PLANE_STORAGE_PROVIDER); - -using TRequestCountersPtr = TIntrusivePtr<TRequestCounters>; - -class TYdbControlPlaneStorageActor : public NActors::TActorBootstrapped<TYdbControlPlaneStorageActor> { - enum ERequestType { - RT_CREATE_QUERY, - RT_LIST_QUERIES, - RT_DESCRIBE_QUERY, + +namespace NYq { + +using namespace NActors; +using namespace NConfig; +using namespace NKikimr; +using namespace NThreading; +using namespace NYdb; +using namespace NYdb::NTable; + +inline static void PrepareAccessConditionImpl(TSqlQueryBuilder& builder, TPermissions permissions, const TString& user, TPermissions::TPermission privatePermission, TPermissions::TPermission publicPermission) { + if (permissions.Check(publicPermission) && permissions.Check(privatePermission)) { + // any row + } else if (permissions.Check(publicPermission)) { + builder.AddString("user", user); + builder.AddInt64("visibility_scope", YandexQuery::Acl::SCOPE); + builder.AddText(" AND (`" VISIBILITY_COLUMN_NAME "` = $visibility_scope OR `" USER_COLUMN_NAME "` = $user)"); + } else if (permissions.Check(privatePermission)) { + builder.AddInt64("visibility_private", YandexQuery::Acl::PRIVATE); + builder.AddText(" AND (`" VISIBILITY_COLUMN_NAME "` = $visibility_private)"); + } else { + builder.AddString("user", user); + builder.AddInt64("visibility_private", YandexQuery::Acl::PRIVATE); + builder.AddText(" AND (`" VISIBILITY_COLUMN_NAME "` = $visibility_private AND `" USER_COLUMN_NAME "` = $user)"); + } +} + +inline static void PrepareViewAccessCondition(TSqlQueryBuilder& builder, TPermissions permissions, const TString& user) { + PrepareAccessConditionImpl(builder, permissions, user, TPermissions::VIEW_PRIVATE, TPermissions::VIEW_PUBLIC); +} + +inline static void PrepareManageAccessCondition(TSqlQueryBuilder& builder, TPermissions permissions, const TString& user) { + PrepareAccessConditionImpl(builder, permissions, user, TPermissions::MANAGE_PRIVATE, TPermissions::MANAGE_PUBLIC); +} + +inline static bool HasAccessImpl(TPermissions permissions, YandexQuery::Acl::Visibility entityVisibility, const TString& entityUser, const TString& user, TPermissions::TPermission privatePermission, TPermissions::TPermission publicPermission) { + return (permissions.Check(publicPermission) && permissions.Check(privatePermission)) + || (permissions.Check(publicPermission) && (entityVisibility == YandexQuery::Acl::SCOPE || entityUser == user)) + || (permissions.Check(privatePermission) && entityVisibility == YandexQuery::Acl::PRIVATE) + || (entityVisibility == YandexQuery::Acl::PRIVATE && entityUser == user); +} + + +inline static bool HasViewAccess(TPermissions permissions, YandexQuery::Acl::Visibility entityVisibility, const TString& entityUser, const TString& user) { + return HasAccessImpl(permissions, entityVisibility, entityUser, user, TPermissions::VIEW_PRIVATE, TPermissions::VIEW_PUBLIC); +} + +inline static bool HasManageAccess(TPermissions permissions, YandexQuery::Acl::Visibility entityVisibility, const TString& entityUser, const TString& user) { + return HasAccessImpl(permissions, entityVisibility, entityUser, user, TPermissions::MANAGE_PRIVATE, TPermissions::MANAGE_PUBLIC); +} + +LWTRACE_USING(YQ_CONTROL_PLANE_STORAGE_PROVIDER); + +using TRequestCountersPtr = TIntrusivePtr<TRequestCounters>; + +class TYdbControlPlaneStorageActor : public NActors::TActorBootstrapped<TYdbControlPlaneStorageActor> { + enum ERequestType { + RT_CREATE_QUERY, + RT_LIST_QUERIES, + RT_DESCRIBE_QUERY, RT_GET_QUERY_STATUS, - RT_MODIFY_QUERY, - RT_DELETE_QUERY, - RT_CONTROL_QUERY, - RT_GET_RESULT_DATA, - RT_LIST_JOBS_DATA, + RT_MODIFY_QUERY, + RT_DELETE_QUERY, + RT_CONTROL_QUERY, + RT_GET_RESULT_DATA, + RT_LIST_JOBS_DATA, RT_DESCRIBE_JOB, - RT_CREATE_CONNECTION, - RT_LIST_CONNECTIONS, - RT_DESCRIBE_CONNECTION, - RT_MODIFY_CONNECTION, - RT_DELETE_CONNECTION, - RT_CREATE_BINDING, - RT_LIST_BINDINGS, - RT_DESCRIBE_BINDING, - RT_MODIFY_BINDING, - RT_DELETE_BINDING, - RT_WRITE_RESULT_DATA, - RT_GET_TASK, - RT_PING_TASK, + RT_CREATE_CONNECTION, + RT_LIST_CONNECTIONS, + RT_DESCRIBE_CONNECTION, + RT_MODIFY_CONNECTION, + RT_DELETE_CONNECTION, + RT_CREATE_BINDING, + RT_LIST_BINDINGS, + RT_DESCRIBE_BINDING, + RT_MODIFY_BINDING, + RT_DELETE_BINDING, + RT_WRITE_RESULT_DATA, + RT_GET_TASK, + RT_PING_TASK, RT_NODES_HEALTH_CHECK, - RT_MAX, - }; - - struct TCounters: public virtual TThrRefBase { - std::array<TRequestCountersPtr, RT_MAX> Requests = CreateArray<RT_MAX, TRequestCountersPtr>({ - { MakeIntrusive<TRequestCounters>("CreateQuery") }, - { MakeIntrusive<TRequestCounters>("ListQueries") }, - { MakeIntrusive<TRequestCounters>("DescribeQuery") }, + RT_MAX, + }; + + struct TCounters: public virtual TThrRefBase { + std::array<TRequestCountersPtr, RT_MAX> Requests = CreateArray<RT_MAX, TRequestCountersPtr>({ + { MakeIntrusive<TRequestCounters>("CreateQuery") }, + { MakeIntrusive<TRequestCounters>("ListQueries") }, + { MakeIntrusive<TRequestCounters>("DescribeQuery") }, { MakeIntrusive<TRequestCounters>("GetQueryStatus") }, - { MakeIntrusive<TRequestCounters>("ModifyQuery") }, - { MakeIntrusive<TRequestCounters>("DeleteQuery") }, - { MakeIntrusive<TRequestCounters>("ControlQuery") }, - { MakeIntrusive<TRequestCounters>("GetResultData") }, - { MakeIntrusive<TRequestCounters>("ListJobs") }, + { MakeIntrusive<TRequestCounters>("ModifyQuery") }, + { MakeIntrusive<TRequestCounters>("DeleteQuery") }, + { MakeIntrusive<TRequestCounters>("ControlQuery") }, + { MakeIntrusive<TRequestCounters>("GetResultData") }, + { MakeIntrusive<TRequestCounters>("ListJobs") }, { MakeIntrusive<TRequestCounters>("DescribeJob") }, - { MakeIntrusive<TRequestCounters>("CreateConnection") }, - { MakeIntrusive<TRequestCounters>("ListConnections") }, - { MakeIntrusive<TRequestCounters>("DescribeConnection") }, - { MakeIntrusive<TRequestCounters>("ModifyConnection") }, - { MakeIntrusive<TRequestCounters>("DeleteConnection") }, - { MakeIntrusive<TRequestCounters>("CreateBinding") }, - { MakeIntrusive<TRequestCounters>("ListBindings") }, - { MakeIntrusive<TRequestCounters>("DescribeBinding") }, - { MakeIntrusive<TRequestCounters>("ModifyBinding") }, - { MakeIntrusive<TRequestCounters>("DeleteBinding") }, - { MakeIntrusive<TRequestCounters>("WriteResultData") }, - { MakeIntrusive<TRequestCounters>("GetTask") }, - { MakeIntrusive<TRequestCounters>("PingTask") }, + { MakeIntrusive<TRequestCounters>("CreateConnection") }, + { MakeIntrusive<TRequestCounters>("ListConnections") }, + { MakeIntrusive<TRequestCounters>("DescribeConnection") }, + { MakeIntrusive<TRequestCounters>("ModifyConnection") }, + { MakeIntrusive<TRequestCounters>("DeleteConnection") }, + { MakeIntrusive<TRequestCounters>("CreateBinding") }, + { MakeIntrusive<TRequestCounters>("ListBindings") }, + { MakeIntrusive<TRequestCounters>("DescribeBinding") }, + { MakeIntrusive<TRequestCounters>("ModifyBinding") }, + { MakeIntrusive<TRequestCounters>("DeleteBinding") }, + { MakeIntrusive<TRequestCounters>("WriteResultData") }, + { MakeIntrusive<TRequestCounters>("GetTask") }, + { MakeIntrusive<TRequestCounters>("PingTask") }, { MakeIntrusive<TRequestCounters>("NodesHealthCheck") }, - }); - - NMonitoring::TDynamicCounterPtr Counters; - - explicit TCounters(const NMonitoring::TDynamicCounterPtr& counters) - : Counters(counters) - { - for (auto& request: Requests) { - request->Register(Counters); - } - } - }; - - struct TConfig { - NConfig::TControlPlaneStorageConfig Proto; - TString IdsPrefix; - TDuration IdempotencyKeyTtl; - TDuration AutomaticQueriesTtl; + }); + + NMonitoring::TDynamicCounterPtr Counters; + + explicit TCounters(const NMonitoring::TDynamicCounterPtr& counters) + : Counters(counters) + { + for (auto& request: Requests) { + request->Register(Counters); + } + } + }; + + struct TConfig { + NConfig::TControlPlaneStorageConfig Proto; + TString IdsPrefix; + TDuration IdempotencyKeyTtl; + TDuration AutomaticQueriesTtl; TDuration ResultSetsTtl; - TDuration AnalyticsRetryCounterUpdateTime; - TDuration StreamingRetryCounterUpdateTime; - TDuration TaskLeaseTtl; - TSet<YandexQuery::ConnectionSetting::ConnectionCase> AvailableConnections; - TSet<YandexQuery::BindingSetting::BindingCase> AvailableBindings; - - TConfig(const NConfig::TControlPlaneStorageConfig& config, const NConfig::TCommonConfig& common); - }; - - TCounters Counters; + TDuration AnalyticsRetryCounterUpdateTime; + TDuration StreamingRetryCounterUpdateTime; + TDuration TaskLeaseTtl; + TSet<YandexQuery::ConnectionSetting::ConnectionCase> AvailableConnections; + TSet<YandexQuery::BindingSetting::BindingCase> AvailableBindings; + + TConfig(const NConfig::TControlPlaneStorageConfig& config, const NConfig::TCommonConfig& common); + }; + + TCounters Counters; TFinalStatusCounters FinalStatusCounters; - - TConfig Config; - + + TConfig Config; + TYdbConnectionPtr YdbConnection; - + ::NYq::TYqSharedResources::TPtr YqSharedResources; TDbPool::TPtr DbPool; - - static constexpr int64_t InitialRevision = 1; + + static constexpr int64_t InitialRevision = 1; NKikimr::TYdbCredentialsProviderFactory CredProviderFactory; -public: +public: TYdbControlPlaneStorageActor( - const NConfig::TControlPlaneStorageConfig& config, - const NConfig::TCommonConfig& common, + const NConfig::TControlPlaneStorageConfig& config, + const NConfig::TCommonConfig& common, const NMonitoring::TDynamicCounterPtr& counters, const ::NYq::TYqSharedResources::TPtr& yqSharedResources, const NKikimr::TYdbCredentialsProviderFactory& credProviderFactory) - : Counters(counters) + : Counters(counters) , FinalStatusCounters(counters) - , Config(config, common) + , Config(config, common) , YqSharedResources(yqSharedResources) , CredProviderFactory(credProviderFactory) - { - } - + { + } + static constexpr char ActorName[] = "YQ_CONTROL_PLANE_STORAGE"; - void Bootstrap(); - - STRICT_STFUNC(StateFunc, - hFunc(TEvControlPlaneStorage::TEvCreateQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListQueriesRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDescribeQueryRequest, Handle); + void Bootstrap(); + + STRICT_STFUNC(StateFunc, + hFunc(TEvControlPlaneStorage::TEvCreateQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListQueriesRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDescribeQueryRequest, Handle); hFunc(TEvControlPlaneStorage::TEvGetQueryStatusRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvModifyQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDeleteQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvControlQueryRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvGetResultDataRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListJobsRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvModifyQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDeleteQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvControlQueryRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvGetResultDataRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListJobsRequest, Handle); hFunc(TEvControlPlaneStorage::TEvDescribeJobRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvCreateConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListConnectionsRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDescribeConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvModifyConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDeleteConnectionRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvCreateBindingRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvListBindingsRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDescribeBindingRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvModifyBindingRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvDeleteBindingRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvWriteResultDataRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvGetTaskRequest, Handle); - hFunc(TEvControlPlaneStorage::TEvPingTaskRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvCreateConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListConnectionsRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDescribeConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvModifyConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDeleteConnectionRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvCreateBindingRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvListBindingsRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDescribeBindingRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvModifyBindingRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvDeleteBindingRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvWriteResultDataRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvGetTaskRequest, Handle); + hFunc(TEvControlPlaneStorage::TEvPingTaskRequest, Handle); hFunc(TEvControlPlaneStorage::TEvNodesHealthCheckRequest, Handle); - hFunc(NMon::TEvHttpInfo, Handle); - ) - - void Handle(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvListQueriesRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvDescribeQueryRequest::TPtr& ev); + hFunc(NMon::TEvHttpInfo, Handle); + ) + + void Handle(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvListQueriesRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvDescribeQueryRequest::TPtr& ev); void Handle(TEvControlPlaneStorage::TEvGetQueryStatusRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvModifyQueryRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvDeleteQueryRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvControlQueryRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvGetResultDataRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvListJobsRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvModifyQueryRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvDeleteQueryRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvControlQueryRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvGetResultDataRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvListJobsRequest::TPtr& ev); void Handle(TEvControlPlaneStorage::TEvDescribeJobRequest::TPtr& ev); - - void Handle(TEvControlPlaneStorage::TEvCreateConnectionRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvListConnectionsRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvDescribeConnectionRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvModifyConnectionRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvDeleteConnectionRequest::TPtr& ev); - - void Handle(TEvControlPlaneStorage::TEvCreateBindingRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvListBindingsRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvDescribeBindingRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvModifyBindingRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvDeleteBindingRequest::TPtr& ev); - - void Handle(TEvControlPlaneStorage::TEvWriteResultDataRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvGetTaskRequest::TPtr& ev); - void Handle(TEvControlPlaneStorage::TEvPingTaskRequest::TPtr& ev); - + + void Handle(TEvControlPlaneStorage::TEvCreateConnectionRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvListConnectionsRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvDescribeConnectionRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvModifyConnectionRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvDeleteConnectionRequest::TPtr& ev); + + void Handle(TEvControlPlaneStorage::TEvCreateBindingRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvListBindingsRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvDescribeBindingRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvModifyBindingRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvDeleteBindingRequest::TPtr& ev); + + void Handle(TEvControlPlaneStorage::TEvWriteResultDataRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvGetTaskRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvPingTaskRequest::TPtr& ev); + void Handle(TEvControlPlaneStorage::TEvNodesHealthCheckRequest::TPtr& ev); - template<typename T> - NYql::TIssues ValidateConnection(T& ev, bool clickHousePasswordRequire = true) - { - const auto& request = ev->Get()->Request; - NYql::TIssues issues = ValidateEvent(ev); - - if (!request.has_content()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content field is not specified")); - } - - const YandexQuery::ConnectionContent& content = request.content(); - if (content.acl().visibility() == YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.acl.visibility field is not specified")); - } - + template<typename T> + NYql::TIssues ValidateConnection(T& ev, bool clickHousePasswordRequire = true) + { + const auto& request = ev->Get()->Request; + NYql::TIssues issues = ValidateEvent(ev); + + if (!request.has_content()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content field is not specified")); + } + + const YandexQuery::ConnectionContent& content = request.content(); + if (content.acl().visibility() == YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.acl.visibility field is not specified")); + } + if (content.name() != to_lower(content.name())) { issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "Incorrect connection name: " + content.name() + ". Please use only lower case")); } - if (!content.has_setting()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting field is not specified")); - } - - const YandexQuery::ConnectionSetting& setting = content.setting(); - if (!Config.AvailableConnections.contains(setting.connection_case())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "connection of the specified type is disabled")); - } - - switch (setting.connection_case()) { - case YandexQuery::ConnectionSetting::kYdbDatabase: { - const YandexQuery::YdbDatabase database = setting.ydb_database(); - if (!database.has_auth() || database.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.ydb_database.auth field is not specified")); - } - - if (database.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); - } - - if (!database.database_id() && !(database.endpoint() && database.database())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.ydb_database.{database_id||database,endpoint} field is not specified")); - } - break; - } - case YandexQuery::ConnectionSetting::kClickhouseCluster: { - const YandexQuery::ClickHouseCluster ch = setting.clickhouse_cluster(); - if (!ch.has_auth() || ch.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.auth field is not specified")); - } - - if (ch.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); - } - - if (!ch.database_id() && !(ch.host() && ch.port())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.{database_id||host,port} field is not specified")); - } - - if (!ch.login()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.login field is not specified")); - } - - if (!ch.password() && clickHousePasswordRequire) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.password field is not specified")); - } - break; - } - case YandexQuery::ConnectionSetting::kObjectStorage: { - const YandexQuery::ObjectStorageConnection objectStorage = setting.object_storage(); - if (!objectStorage.has_auth() || objectStorage.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.object_storage.auth field is not specified")); - } - - if (objectStorage.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); - } - - if (!objectStorage.bucket()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.object_storage.bucket field is not specified")); - } - break; - } - case YandexQuery::ConnectionSetting::kDataStreams: { - const YandexQuery::DataStreams dataStreams = setting.data_streams(); - if (!dataStreams.has_auth() || dataStreams.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.data_streams.auth field is not specified")); - } - - if (dataStreams.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); - } - - if (!dataStreams.database_id() && !(dataStreams.endpoint() && dataStreams.database())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.data_streams.{database_id||database,endpoint} field is not specified")); - } - break; - } - case YandexQuery::ConnectionSetting::kMonitoring: { - const YandexQuery::Monitoring monitoring = setting.monitoring(); - if (!monitoring.has_auth() || monitoring.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.monitoring.auth field is not specified")); - } - - if (monitoring.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); - } - - if (!monitoring.project()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.monitoring.project field is not specified")); - } - - if (!monitoring.cluster()) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.monitoring.cluster field is not specified")); - } - break; - } - case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "connection is not set")); - break; - } - // Do not add default. Adding a new connection should cause a compilation error - } - return issues; - } - - template<typename T> - NYql::TIssues ValidateBinding(T& ev) - { - const auto& request = ev->Get()->Request; - NYql::TIssues issues = ValidateEvent(ev); - + if (!content.has_setting()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting field is not specified")); + } + + const YandexQuery::ConnectionSetting& setting = content.setting(); + if (!Config.AvailableConnections.contains(setting.connection_case())) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "connection of the specified type is disabled")); + } + + switch (setting.connection_case()) { + case YandexQuery::ConnectionSetting::kYdbDatabase: { + const YandexQuery::YdbDatabase database = setting.ydb_database(); + if (!database.has_auth() || database.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.ydb_database.auth field is not specified")); + } + + if (database.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); + } + + if (!database.database_id() && !(database.endpoint() && database.database())) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.ydb_database.{database_id||database,endpoint} field is not specified")); + } + break; + } + case YandexQuery::ConnectionSetting::kClickhouseCluster: { + const YandexQuery::ClickHouseCluster ch = setting.clickhouse_cluster(); + if (!ch.has_auth() || ch.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.auth field is not specified")); + } + + if (ch.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); + } + + if (!ch.database_id() && !(ch.host() && ch.port())) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.{database_id||host,port} field is not specified")); + } + + if (!ch.login()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.login field is not specified")); + } + + if (!ch.password() && clickHousePasswordRequire) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.clickhouse_cluster.password field is not specified")); + } + break; + } + case YandexQuery::ConnectionSetting::kObjectStorage: { + const YandexQuery::ObjectStorageConnection objectStorage = setting.object_storage(); + if (!objectStorage.has_auth() || objectStorage.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.object_storage.auth field is not specified")); + } + + if (objectStorage.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); + } + + if (!objectStorage.bucket()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.object_storage.bucket field is not specified")); + } + break; + } + case YandexQuery::ConnectionSetting::kDataStreams: { + const YandexQuery::DataStreams dataStreams = setting.data_streams(); + if (!dataStreams.has_auth() || dataStreams.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.data_streams.auth field is not specified")); + } + + if (dataStreams.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); + } + + if (!dataStreams.database_id() && !(dataStreams.endpoint() && dataStreams.database())) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.data_streams.{database_id||database,endpoint} field is not specified")); + } + break; + } + case YandexQuery::ConnectionSetting::kMonitoring: { + const YandexQuery::Monitoring monitoring = setting.monitoring(); + if (!monitoring.has_auth() || monitoring.auth().identity_case() == YandexQuery::IamAuth::IDENTITY_NOT_SET) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.monitoring.auth field is not specified")); + } + + if (monitoring.auth().identity_case() == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "current iam authorization is disabled")); + } + + if (!monitoring.project()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.monitoring.project field is not specified")); + } + + if (!monitoring.cluster()) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "content.setting.monitoring.cluster field is not specified")); + } + break; + } + case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "connection is not set")); + break; + } + // Do not add default. Adding a new connection should cause a compilation error + } + return issues; + } + + template<typename T> + NYql::TIssues ValidateBinding(T& ev) + { + const auto& request = ev->Get()->Request; + NYql::TIssues issues = ValidateEvent(ev); + if (request.has_content()) { const YandexQuery::BindingContent& content = request.content(); if (content.acl().visibility() == YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "binding.acl.visibility field is not specified")); } - + if (content.name() != to_lower(content.name())) { issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "Incorrect binding name: " + content.name() + ". Please use only lower case")); } @@ -405,12 +405,12 @@ public: if (!content.has_setting()) { issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "binding.setting field is not specified")); } - + const YandexQuery::BindingSetting& setting = content.setting(); - if (!Config.AvailableBindings.contains(setting.binding_case())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "binding of the specified type is disabled")); - } - + if (!Config.AvailableBindings.contains(setting.binding_case())) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "binding of the specified type is disabled")); + } + switch (setting.binding_case()) { case YandexQuery::BindingSetting::kDataStreams: { const YandexQuery::DataStreamsBinding dataStreams = setting.data_streams(); @@ -429,107 +429,107 @@ public: } } else { issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "binding field is not specified")); - } - - return issues; - } - - void Handle(NMon::TEvHttpInfo::TPtr& ev) { - TStringStream str; - HTML(str) { - PRE() { - str << "Current config:" << Endl; - str << Config.Proto.DebugString() << Endl; - str << Endl; - } - } - Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str())); - } - - template<typename T> - NYql::TIssues ValidateQuery(T& ev) - { - NYql::TIssues issues = ValidateEvent(ev); - auto& request = ev->Get()->Request; - const auto& content = request.content(); - - if (request.execute_mode() == YandexQuery::ExecuteMode::EXECUTE_MODE_UNSPECIFIED) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "mode field is not specified")); - } - - if (content.type() == YandexQuery::QueryContent::QUERY_TYPE_UNSPECIFIED) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "type field is not specified")); - } - - if (content.acl().visibility() == YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "acl.visibility field is not specified")); - } - - if (content.type() == YandexQuery::QueryContent::STREAMING && !request.has_disposition()) { - request.mutable_disposition()->mutable_fresh(); - } - - return issues; - } - - template<class P> - NYql::TIssues ValidateEvent(P& ev) - { - const auto& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - const int byteSize = request.ByteSize(); - - NYql::TIssues issues; - if (!scope) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "scope is not specified")); - } - - if (!user) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "user is empty")); - } - - if (!token) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "token is empty")); - } - - if (byteSize > static_cast<int>(Config.Proto.GetMaxRequestSize())) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "request size exceeded " + ToString(request.ByteSize()) + " out of " + ToString(Config.Proto.GetMaxRequestSize()) + " bytes")); - } - - TString error; - if (!request.validate(error)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, error)); - } - + } + return issues; - } - - /* - * Creating tables - */ - TAsyncStatus CreateDirectory(TActorSystem* as); - TAsyncStatus CreateQueriesTable(TActorSystem* as); - TAsyncStatus CreatePendingTable(TActorSystem* as); + } + + void Handle(NMon::TEvHttpInfo::TPtr& ev) { + TStringStream str; + HTML(str) { + PRE() { + str << "Current config:" << Endl; + str << Config.Proto.DebugString() << Endl; + str << Endl; + } + } + Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str())); + } + + template<typename T> + NYql::TIssues ValidateQuery(T& ev) + { + NYql::TIssues issues = ValidateEvent(ev); + auto& request = ev->Get()->Request; + const auto& content = request.content(); + + if (request.execute_mode() == YandexQuery::ExecuteMode::EXECUTE_MODE_UNSPECIFIED) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "mode field is not specified")); + } + + if (content.type() == YandexQuery::QueryContent::QUERY_TYPE_UNSPECIFIED) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "type field is not specified")); + } + + if (content.acl().visibility() == YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "acl.visibility field is not specified")); + } + + if (content.type() == YandexQuery::QueryContent::STREAMING && !request.has_disposition()) { + request.mutable_disposition()->mutable_fresh(); + } + + return issues; + } + + template<class P> + NYql::TIssues ValidateEvent(P& ev) + { + const auto& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + const int byteSize = request.ByteSize(); + + NYql::TIssues issues; + if (!scope) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "scope is not specified")); + } + + if (!user) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "user is empty")); + } + + if (!token) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "token is empty")); + } + + if (byteSize > static_cast<int>(Config.Proto.GetMaxRequestSize())) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "request size exceeded " + ToString(request.ByteSize()) + " out of " + ToString(Config.Proto.GetMaxRequestSize()) + " bytes")); + } + + TString error; + if (!request.validate(error)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, error)); + } + + return issues; + } + + /* + * Creating tables + */ + TAsyncStatus CreateDirectory(TActorSystem* as); + TAsyncStatus CreateQueriesTable(TActorSystem* as); + TAsyncStatus CreatePendingTable(TActorSystem* as); TAsyncStatus CreatePendingSmallTable(TActorSystem* as); - TAsyncStatus CreateConnectionsTable(TActorSystem* as); - TAsyncStatus CreateJobsTable(TActorSystem* as); + TAsyncStatus CreateConnectionsTable(TActorSystem* as); + TAsyncStatus CreateJobsTable(TActorSystem* as); TAsyncStatus CreateNodesTable(TActorSystem* as); - TAsyncStatus CreateBindingsTable(TActorSystem* as); - TAsyncStatus CreateIdempotencyKeysTable(TActorSystem* as); - TAsyncStatus CreateResultSetsTable(TActorSystem* as); - -private: - /* - * Utility - */ - bool IsSuperUser(const TString& user); - - void InsertIdempotencyKey(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey, const TString& response, const TInstant& expireAt); - - void ReadIdempotencyKeyQuery(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey); - + TAsyncStatus CreateBindingsTable(TActorSystem* as); + TAsyncStatus CreateIdempotencyKeysTable(TActorSystem* as); + TAsyncStatus CreateResultSetsTable(TActorSystem* as); + +private: + /* + * Utility + */ + bool IsSuperUser(const TString& user); + + void InsertIdempotencyKey(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey, const TString& response, const TInstant& expireAt); + + void ReadIdempotencyKeyQuery(TSqlQueryBuilder& builder, const TString& scope, const TString& idempotencyKey); + std::pair<TAsyncStatus, std::shared_ptr<TVector<NYdb::TResultSet>>> Read( const TString& query, const NYdb::TParams& params, @@ -537,7 +537,7 @@ private: TDebugInfoPtr debugInfo, TTxSettings transactionMode = TTxSettings::SerializableRW(), bool retryOnTli = true); - + TAsyncStatus Validate( std::shared_ptr<TMaybe<TTransaction>> transaction, size_t item, const TVector<TValidationQuery>& validators, @@ -545,7 +545,7 @@ private: std::shared_ptr<bool> successFinish, TDebugInfoPtr debugInfo, TTxSettings transactionMode = TTxSettings::SerializableRW()); - + TAsyncStatus Write( NActors::TActorSystem* actorSystem, const TString& query, @@ -555,7 +555,7 @@ private: const TVector<TValidationQuery>& validators = {}, TTxSettings transactionMode = TTxSettings::SerializableRW(), bool retryTli = true); - + TAsyncStatus ReadModifyWrite( NActors::TActorSystem* actorSystem, const TString& readQuery, @@ -566,261 +566,261 @@ private: const TVector<TValidationQuery>& validators = {}, TTxSettings transactionMode = TTxSettings::SerializableRW(), bool retryOnTli = true); - - template<typename T> - THashMap<TString, T> GetEntitiesWithVisibilityPriority(const TResultSet& resultSet, const TString& columnName) - { - THashMap<TString, T> entities; - TResultSetParser parser(resultSet); - while (parser.TryNextRow()) { - T entity; - Y_VERIFY(entity.ParseFromString(*parser.ColumnParser(columnName).GetOptionalString())); // TODO: move to run actor - const TString name = entity.content().name(); - if (auto it = entities.find(name); it != entities.end()) { - const auto visibility = entity.content().acl().visibility(); - if (visibility == YandexQuery::Acl::PRIVATE) { - entities[name] = std::move(entity); - } - } else { - entities[name] = std::move(entity); - } - } - - return entities; - } - - template<class ResponseEvent, class Result, class RequestEventPtr> - TFuture<bool> SendResponse(const TString& name, - NActors::TActorSystem* actorSystem, - const TAsyncStatus& status, - TActorId self, - const RequestEventPtr& ev, - const TInstant& startTime, - const TRequestCountersPtr& requestCounters, - const std::function<Result()>& prepare, - TDebugInfoPtr debugInfo) - { - return status.Apply([=](const auto& future) { - NYql::TIssues internalIssues; - NYql::TIssues issues; - Result result; - - try { - TStatus status = future.GetValue(); - if (status.IsSuccess()) { - result = prepare(); - } else { - issues.AddIssues(status.GetIssues()); - internalIssues.AddIssues(status.GetIssues()); - } - } catch (const TControlPlaneStorageException& exception) { - NYql::TIssue issue = MakeErrorIssue(exception.Code, exception.GetRawMessage()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(exception.Code, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } catch (const std::exception& exception) { - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, exception.what()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } catch (...) { - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } - - const auto& request = ev->Get()->Request; - if (issues) { - CPS_LOG_AS_D(*actorSystem, name << ": " << request.DebugString() << " error: " << internalIssues.ToString()); - auto event = std::make_unique<ResponseEvent>(issues); - event->DebugInfo = debugInfo; - actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); - requestCounters->Error->Inc(); + + template<typename T> + THashMap<TString, T> GetEntitiesWithVisibilityPriority(const TResultSet& resultSet, const TString& columnName) + { + THashMap<TString, T> entities; + TResultSetParser parser(resultSet); + while (parser.TryNextRow()) { + T entity; + Y_VERIFY(entity.ParseFromString(*parser.ColumnParser(columnName).GetOptionalString())); // TODO: move to run actor + const TString name = entity.content().name(); + if (auto it = entities.find(name); it != entities.end()) { + const auto visibility = entity.content().acl().visibility(); + if (visibility == YandexQuery::Acl::PRIVATE) { + entities[name] = std::move(entity); + } + } else { + entities[name] = std::move(entity); + } + } + + return entities; + } + + template<class ResponseEvent, class Result, class RequestEventPtr> + TFuture<bool> SendResponse(const TString& name, + NActors::TActorSystem* actorSystem, + const TAsyncStatus& status, + TActorId self, + const RequestEventPtr& ev, + const TInstant& startTime, + const TRequestCountersPtr& requestCounters, + const std::function<Result()>& prepare, + TDebugInfoPtr debugInfo) + { + return status.Apply([=](const auto& future) { + NYql::TIssues internalIssues; + NYql::TIssues issues; + Result result; + + try { + TStatus status = future.GetValue(); + if (status.IsSuccess()) { + result = prepare(); + } else { + issues.AddIssues(status.GetIssues()); + internalIssues.AddIssues(status.GetIssues()); + } + } catch (const TControlPlaneStorageException& exception) { + NYql::TIssue issue = MakeErrorIssue(exception.Code, exception.GetRawMessage()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(exception.Code, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } catch (const std::exception& exception) { + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, exception.what()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } catch (...) { + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } + + const auto& request = ev->Get()->Request; + if (issues) { + CPS_LOG_AS_D(*actorSystem, name << ": " << request.DebugString() << " error: " << internalIssues.ToString()); + auto event = std::make_unique<ResponseEvent>(issues); + event->DebugInfo = debugInfo; + actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); + requestCounters->Error->Inc(); for (const auto& issue : issues) { NYql::WalkThroughIssues(issue, true, [&requestCounters](const NYql::TIssue& err, ui16 level) { Y_UNUSED(level); requestCounters->Issues->GetCounter(ToString(err.GetCode()), true)->Inc(); }); } - } else { - CPS_LOG_AS_T(*actorSystem, name << ": " << request.DebugString() << " success"); - auto event = std::make_unique<ResponseEvent>(result); - event->DebugInfo = debugInfo; - actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); - requestCounters->Ok->Inc(); - } - requestCounters->InFly->Dec(); - TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - return MakeFuture(!issues); - }); - } - - template<class ResponseEvent, class Result, class AuditDetails, class RequestEventPtr> - TFuture<bool> SendAuditResponse(const TString& name, - NActors::TActorSystem* actorSystem, - const TAsyncStatus& status, - TActorId self, - const RequestEventPtr& ev, - const TInstant& startTime, - const TRequestCountersPtr& requestCounters, - const std::function<std::pair<Result, AuditDetails>()>& prepare, - TDebugInfoPtr debugInfo) - { - return status.Apply([=](const auto& future) { - NYql::TIssues internalIssues; - NYql::TIssues issues; - Result result; - AuditDetails auditDetails; - - try { - TStatus status = future.GetValue(); - if (status.IsSuccess()) { - auto p = prepare(); - result = std::move(p.first); - auditDetails = std::move(p.second); - } else { - issues.AddIssues(status.GetIssues()); - internalIssues.AddIssues(status.GetIssues()); - } - } catch (const TControlPlaneStorageException& exception) { - NYql::TIssue issue = MakeErrorIssue(exception.Code, exception.GetRawMessage()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(exception.Code, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } catch (const std::exception& exception) { - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, exception.what()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } catch (...) { - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } - - const auto& request = ev->Get()->Request; - if (issues) { - CPS_LOG_AS_D(*actorSystem, name << ": " << request.DebugString() << " error: " << internalIssues.ToString()); - auto event = std::make_unique<ResponseEvent>(issues); - event->DebugInfo = debugInfo; - actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); - requestCounters->Error->Inc(); + } else { + CPS_LOG_AS_T(*actorSystem, name << ": " << request.DebugString() << " success"); + auto event = std::make_unique<ResponseEvent>(result); + event->DebugInfo = debugInfo; + actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); + requestCounters->Ok->Inc(); + } + requestCounters->InFly->Dec(); + TDuration delta = TInstant::Now() - startTime; + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + return MakeFuture(!issues); + }); + } + + template<class ResponseEvent, class Result, class AuditDetails, class RequestEventPtr> + TFuture<bool> SendAuditResponse(const TString& name, + NActors::TActorSystem* actorSystem, + const TAsyncStatus& status, + TActorId self, + const RequestEventPtr& ev, + const TInstant& startTime, + const TRequestCountersPtr& requestCounters, + const std::function<std::pair<Result, AuditDetails>()>& prepare, + TDebugInfoPtr debugInfo) + { + return status.Apply([=](const auto& future) { + NYql::TIssues internalIssues; + NYql::TIssues issues; + Result result; + AuditDetails auditDetails; + + try { + TStatus status = future.GetValue(); + if (status.IsSuccess()) { + auto p = prepare(); + result = std::move(p.first); + auditDetails = std::move(p.second); + } else { + issues.AddIssues(status.GetIssues()); + internalIssues.AddIssues(status.GetIssues()); + } + } catch (const TControlPlaneStorageException& exception) { + NYql::TIssue issue = MakeErrorIssue(exception.Code, exception.GetRawMessage()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(exception.Code, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } catch (const std::exception& exception) { + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, exception.what()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } catch (...) { + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } + + const auto& request = ev->Get()->Request; + if (issues) { + CPS_LOG_AS_D(*actorSystem, name << ": " << request.DebugString() << " error: " << internalIssues.ToString()); + auto event = std::make_unique<ResponseEvent>(issues); + event->DebugInfo = debugInfo; + actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); + requestCounters->Error->Inc(); for (const auto& issue : issues) { NYql::WalkThroughIssues(issue, true, [&requestCounters](const NYql::TIssue& err, ui16 level) { Y_UNUSED(level); requestCounters->Issues->GetCounter(ToString(err.GetCode()), true)->Inc(); }); } - } else { - CPS_LOG_AS_T(*actorSystem, name << ": " << request.DebugString() << " success"); - auto event = std::make_unique<ResponseEvent>(result, auditDetails); - event->DebugInfo = debugInfo; - actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); - requestCounters->Ok->Inc(); - } - requestCounters->InFly->Dec(); - TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - return MakeFuture(!issues); - }); - } - - template<class ResponseEvent, class Result, class RequestEventPtr> - TFuture<bool> SendResponseTuple(const TString& name, - NActors::TActorSystem* actorSystem, - const TAsyncStatus& status, - TActorId self, - const RequestEventPtr& ev, - const TInstant& startTime, - const TRequestCountersPtr& requestCounters, - const std::function<Result()>& prepare, - TDebugInfoPtr debugInfo) - { - return status.Apply([=](const auto& future) { - NYql::TIssues internalIssues; - NYql::TIssues issues; - Result result; - - try { - TStatus status = future.GetValue(); - if (status.IsSuccess()) { - result = prepare(); - } else { - issues.AddIssues(status.GetIssues()); - } - } catch (const TControlPlaneStorageException& exception) { - NYql::TIssue issue = MakeErrorIssue(exception.Code, exception.GetRawMessage()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(exception.Code, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } catch (const std::exception& exception) { - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, exception.what()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } catch (...) { - NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - issues.AddIssue(issue); - NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); - internalIssues.AddIssue(internalIssue); - } - - if (issues) { - CPS_LOG_AS_D(*actorSystem, name << ": error: " << internalIssues.ToString()); - auto event = std::unique_ptr<ResponseEvent>(new ResponseEvent(issues)); - event->DebugInfo = debugInfo; - actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); - requestCounters->Error->Inc(); + } else { + CPS_LOG_AS_T(*actorSystem, name << ": " << request.DebugString() << " success"); + auto event = std::make_unique<ResponseEvent>(result, auditDetails); + event->DebugInfo = debugInfo; + actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); + requestCounters->Ok->Inc(); + } + requestCounters->InFly->Dec(); + TDuration delta = TInstant::Now() - startTime; + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + return MakeFuture(!issues); + }); + } + + template<class ResponseEvent, class Result, class RequestEventPtr> + TFuture<bool> SendResponseTuple(const TString& name, + NActors::TActorSystem* actorSystem, + const TAsyncStatus& status, + TActorId self, + const RequestEventPtr& ev, + const TInstant& startTime, + const TRequestCountersPtr& requestCounters, + const std::function<Result()>& prepare, + TDebugInfoPtr debugInfo) + { + return status.Apply([=](const auto& future) { + NYql::TIssues internalIssues; + NYql::TIssues issues; + Result result; + + try { + TStatus status = future.GetValue(); + if (status.IsSuccess()) { + result = prepare(); + } else { + issues.AddIssues(status.GetIssues()); + } + } catch (const TControlPlaneStorageException& exception) { + NYql::TIssue issue = MakeErrorIssue(exception.Code, exception.GetRawMessage()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(exception.Code, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } catch (const std::exception& exception) { + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, exception.what()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } catch (...) { + NYql::TIssue issue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + issues.AddIssue(issue); + NYql::TIssue internalIssue = MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, CurrentExceptionMessage()); + internalIssues.AddIssue(internalIssue); + } + + if (issues) { + CPS_LOG_AS_D(*actorSystem, name << ": error: " << internalIssues.ToString()); + auto event = std::unique_ptr<ResponseEvent>(new ResponseEvent(issues)); + event->DebugInfo = debugInfo; + actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); + requestCounters->Error->Inc(); for (const auto& issue : issues) { NYql::WalkThroughIssues(issue, true, [&requestCounters](const NYql::TIssue& err, ui16 level) { Y_UNUSED(level); requestCounters->Issues->GetCounter(ToString(err.GetCode()), true)->Inc(); }); } - } else { - CPS_LOG_AS_T(*actorSystem, name << ": success"); - auto event = std::unique_ptr<ResponseEvent>(new ResponseEvent(std::make_from_tuple<ResponseEvent>(result))); - event->DebugInfo = debugInfo; - actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); - requestCounters->Ok->Inc(); - } - requestCounters->InFly->Dec(); - TDuration delta = TInstant::Now() - startTime; - requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - return MakeFuture(!issues); - }); - } - - template<typename T> - void SendResponseIssues(const TActorId sender, - const NYql::TIssues& issues, - ui64 cookie, - const TDuration& delta, - const TRequestCountersPtr& requestCounters) { - Send(sender, new T(issues), 0, cookie); - requestCounters->InFly->Dec(); - requestCounters->Error->Inc(); + } else { + CPS_LOG_AS_T(*actorSystem, name << ": success"); + auto event = std::unique_ptr<ResponseEvent>(new ResponseEvent(std::make_from_tuple<ResponseEvent>(result))); + event->DebugInfo = debugInfo; + actorSystem->Send(new IEventHandle(ev->Sender, self, event.release(), 0, ev->Cookie)); + requestCounters->Ok->Inc(); + } + requestCounters->InFly->Dec(); + TDuration delta = TInstant::Now() - startTime; + requestCounters->LatencyMs->Collect(delta.MilliSeconds()); + return MakeFuture(!issues); + }); + } + + template<typename T> + void SendResponseIssues(const TActorId sender, + const NYql::TIssues& issues, + ui64 cookie, + const TDuration& delta, + const TRequestCountersPtr& requestCounters) { + Send(sender, new T(issues), 0, cookie); + requestCounters->InFly->Dec(); + requestCounters->Error->Inc(); requestCounters->LatencyMs->Collect(delta.MilliSeconds()); - } - - static YandexQuery::CommonMeta CreateCommonMeta(const TString& id, const TString& user, const TInstant& startTime, int64_t revision) { - YandexQuery::CommonMeta common; - common.set_id(id); - common.set_created_by(user); - common.set_modified_by(user); + } + + static YandexQuery::CommonMeta CreateCommonMeta(const TString& id, const TString& user, const TInstant& startTime, int64_t revision) { + YandexQuery::CommonMeta common; + common.set_id(id); + common.set_created_by(user); + common.set_modified_by(user); auto now = NProtoInterop::CastToProto(startTime); - *common.mutable_created_at() = now; - *common.mutable_modified_at() = now; - common.set_revision(revision); - return common; - } - - static TString MakeLogPrefix(const TString& scope, const TString& user, const TString& id = "") { - return "[" + scope + ", " + user + (id ? ", " + id : "") + "] "; - } + *common.mutable_created_at() = now; + *common.mutable_modified_at() = now; + common.set_revision(revision); + return common; + } + + static TString MakeLogPrefix(const TString& scope, const TString& user, const TString& id = "") { + return "[" + scope + ", " + user + (id ? ", " + id : "") + "] "; + } struct TPickTaskParams { TString ReadQuery; @@ -837,6 +837,6 @@ private: std::shared_ptr<TResponseTasks> responseTasks, const TVector<TValidationQuery>& validators = {}, TTxSettings transactionMode = TTxSettings::SerializableRW()); -}; - -} +}; + +} diff --git a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp index 398725f7f4..44be666764 100644 --- a/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp +++ b/ydb/core/yq/libs/control_plane_storage/ydb_control_plane_storage_queries.cpp @@ -1,374 +1,374 @@ -#include "ydb_control_plane_storage_impl.h" - -#include <cstdint> - -#include <util/datetime/base.h> -#include <util/generic/yexception.h> -#include <util/string/join.h> - +#include "ydb_control_plane_storage_impl.h" + +#include <cstdint> + +#include <util/datetime/base.h> +#include <util/generic/yexception.h> +#include <util/string/join.h> + #include <ydb/core/yq/libs/common/entity_id.h> #include <ydb/core/yq/libs/control_plane_storage/events/events.h> #include <ydb/core/yq/libs/control_plane_storage/schema.h> #include <ydb/core/yq/libs/db_schema/db_schema.h> - + #include <ydb/public/api/protos/yq.pb.h> #include <ydb/public/sdk/cpp/client/ydb_value/value.h> - -namespace { - -YandexQuery::IamAuth::IdentityCase GetIamAuth(const YandexQuery::Connection& connection) { - const auto& setting = connection.content().setting(); - switch (setting.connection_case()) { - case YandexQuery::ConnectionSetting::kYdbDatabase: - return setting.data_streams().auth().identity_case(); - case YandexQuery::ConnectionSetting::kClickhouseCluster: - return setting.clickhouse_cluster().auth().identity_case(); - case YandexQuery::ConnectionSetting::kObjectStorage: - return setting.object_storage().auth().identity_case(); - case YandexQuery::ConnectionSetting::kDataStreams: - return setting.data_streams().auth().identity_case(); - case YandexQuery::ConnectionSetting::kMonitoring: - return setting.monitoring().auth().identity_case(); - case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: - return YandexQuery::IamAuth::IDENTITY_NOT_SET; - } -} - -} - -namespace NYq { - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_QUERY]; - requestCounters->InFly->Inc(); - - const TEvControlPlaneStorage::TEvCreateQueryRequest& event = *ev->Get(); - const YandexQuery::CreateQueryRequest& request = event.Request; - const TString scope = event.Scope; - const TString user = event.User; - const TString token = event.Token; - const TString cloudId = event.CloudId; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? event.Permissions - : TPermissions{TPermissions::QUERY_INVOKE | TPermissions::CONNECTIONS_USE | TPermissions::BINDINGS_USE | TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const size_t byteSize = request.ByteSizeLong(); - const TString queryId = GetEntityIdAsString(Config.IdsPrefix, EEntityType::QUERY); - - CPS_LOG_T(MakeLogPrefix(scope, user, queryId) - << "CreateQueryRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateQuery(ev); - if (request.execute_mode() != YandexQuery::SAVE && !permissions.Check(TPermissions::QUERY_INVOKE)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.queries.invoke")); - } - - if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.resources.managePublic")); - } + +namespace { + +YandexQuery::IamAuth::IdentityCase GetIamAuth(const YandexQuery::Connection& connection) { + const auto& setting = connection.content().setting(); + switch (setting.connection_case()) { + case YandexQuery::ConnectionSetting::kYdbDatabase: + return setting.data_streams().auth().identity_case(); + case YandexQuery::ConnectionSetting::kClickhouseCluster: + return setting.clickhouse_cluster().auth().identity_case(); + case YandexQuery::ConnectionSetting::kObjectStorage: + return setting.object_storage().auth().identity_case(); + case YandexQuery::ConnectionSetting::kDataStreams: + return setting.data_streams().auth().identity_case(); + case YandexQuery::ConnectionSetting::kMonitoring: + return setting.monitoring().auth().identity_case(); + case YandexQuery::ConnectionSetting::CONNECTION_NOT_SET: + return YandexQuery::IamAuth::IDENTITY_NOT_SET; + } +} + +} + +namespace NYq { + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvCreateQueryRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CREATE_QUERY]; + requestCounters->InFly->Inc(); + + const TEvControlPlaneStorage::TEvCreateQueryRequest& event = *ev->Get(); + const YandexQuery::CreateQueryRequest& request = event.Request; + const TString scope = event.Scope; + const TString user = event.User; + const TString token = event.Token; + const TString cloudId = event.CloudId; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? event.Permissions + : TPermissions{TPermissions::QUERY_INVOKE | TPermissions::CONNECTIONS_USE | TPermissions::BINDINGS_USE | TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const size_t byteSize = request.ByteSizeLong(); + const TString queryId = GetEntityIdAsString(Config.IdsPrefix, EEntityType::QUERY); + + CPS_LOG_T(MakeLogPrefix(scope, user, queryId) + << "CreateQueryRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateQuery(ev); + if (request.execute_mode() != YandexQuery::SAVE && !permissions.Check(TPermissions::QUERY_INVOKE)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.queries.invoke")); + } + + if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.resources.managePublic")); + } if (request.disposition().has_from_last_checkpoint()) { issues.AddIssue(MakeErrorIssue(TIssuesIds::BAD_REQUEST, "Streaming disposition \"from_last_checkpoint\" is not allowed in CreateQuery request")); } - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, queryId) - << "CreateQueryRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: "<< issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvCreateQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(CreateQueryRequest, scope, user, delta, byteSize, false); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, queryId) + << "CreateQueryRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: "<< issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvCreateQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(CreateQueryRequest, scope, user, delta, byteSize, false); return; - } - - const TString idempotencyKey = request.idempotency_key(); - const TString jobId = request.execute_mode() == YandexQuery::SAVE ? "" : GetEntityIdAsString(Config.IdsPrefix, EEntityType::JOB); - - YandexQuery::Query query; - YandexQuery::QueryContent& content = *query.mutable_content() = request.content(); - YandexQuery::QueryMeta& meta = *query.mutable_meta(); - YandexQuery::CommonMeta& common = *meta.mutable_common() = CreateCommonMeta(queryId, user, startTime, InitialRevision); - meta.set_execute_mode(request.execute_mode()); - meta.set_status(request.execute_mode() == YandexQuery::SAVE ? YandexQuery::QueryMeta::COMPLETED : YandexQuery::QueryMeta::STARTING); - - YandexQuery::Job job; - if (request.execute_mode() != YandexQuery::SAVE) { - meta.set_last_job_query_revision(InitialRevision); - meta.set_last_job_id(jobId); + } + + const TString idempotencyKey = request.idempotency_key(); + const TString jobId = request.execute_mode() == YandexQuery::SAVE ? "" : GetEntityIdAsString(Config.IdsPrefix, EEntityType::JOB); + + YandexQuery::Query query; + YandexQuery::QueryContent& content = *query.mutable_content() = request.content(); + YandexQuery::QueryMeta& meta = *query.mutable_meta(); + YandexQuery::CommonMeta& common = *meta.mutable_common() = CreateCommonMeta(queryId, user, startTime, InitialRevision); + meta.set_execute_mode(request.execute_mode()); + meta.set_status(request.execute_mode() == YandexQuery::SAVE ? YandexQuery::QueryMeta::COMPLETED : YandexQuery::QueryMeta::STARTING); + + YandexQuery::Job job; + if (request.execute_mode() != YandexQuery::SAVE) { + meta.set_last_job_query_revision(InitialRevision); + meta.set_last_job_id(jobId); meta.set_started_by(user); - - *job.mutable_meta() = common; - job.mutable_meta()->set_id(jobId); - job.set_text(content.text()); - *job.mutable_query_meta() = meta; + + *job.mutable_meta() = common; + job.mutable_meta()->set_id(jobId); + job.set_text(content.text()); + *job.mutable_query_meta() = meta; job.set_query_name(query.mutable_content()->name()); *job.mutable_acl() = content.acl(); job.set_automatic(content.automatic()); - } - - std::shared_ptr<std::pair<YandexQuery::CreateQueryResult, TAuditDetails<YandexQuery::Query>>> response = std::make_shared<std::pair<YandexQuery::CreateQueryResult, TAuditDetails<YandexQuery::Query>>>(); - response->first.set_query_id(queryId); - response->second.CloudId = cloudId; - + } + + std::shared_ptr<std::pair<YandexQuery::CreateQueryResult, TAuditDetails<YandexQuery::Query>>> response = std::make_shared<std::pair<YandexQuery::CreateQueryResult, TAuditDetails<YandexQuery::Query>>>(); + response->first.set_query_id(queryId); + response->second.CloudId = cloudId; + TSqlQueryBuilder readQueryBuilder(YdbConnection->TablePathPrefix, "CreateQuery(read)"); - ReadIdempotencyKeyQuery(readQueryBuilder, scope, idempotencyKey); - - if (request.execute_mode() != YandexQuery::SAVE) { - readQueryBuilder.AddString("scope", scope); - readQueryBuilder.AddString("user", user); - readQueryBuilder.AddInt64("scope_visibility", YandexQuery::Acl::SCOPE); - - // user connections - readQueryBuilder.AddText( - "SELECT `" CONNECTION_ID_COLUMN_NAME "`, `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);" - ); - - // user bindings - readQueryBuilder.AddText( - "SELECT `" BINDING_ID_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);" - ); - } - - auto prepareParams = [=](const TVector<TResultSet>& resultSets) mutable { - const size_t countSets = (idempotencyKey ? 1 : 0) + (request.execute_mode() != YandexQuery::SAVE ? 2 : 0); - if (resultSets.size() != countSets) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to " << countSets << " but equal " << resultSets.size() << ". Please contact internal support"; - } - - if (idempotencyKey) { - TResultSetParser parser(resultSets.front()); - if (parser.TryNextRow()) { - if (!response->first.ParseFromString(*parser.ColumnParser(RESPONSE_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for idempotency key request. Please contact internal support"; - } - response->second.IdempotencyResult = true; - return make_pair(TString{}, TParamsBuilder{}.Build()); - } - } - - YandexQuery::Internal::QueryInternal queryInternal; - if (!Config.Proto.GetDisableCurrentIam()) { - queryInternal.set_token(token); - } - queryInternal.set_cloud_id(cloudId); - queryInternal.set_state_load_mode(YandexQuery::StateLoadMode::EMPTY); + ReadIdempotencyKeyQuery(readQueryBuilder, scope, idempotencyKey); + + if (request.execute_mode() != YandexQuery::SAVE) { + readQueryBuilder.AddString("scope", scope); + readQueryBuilder.AddString("user", user); + readQueryBuilder.AddInt64("scope_visibility", YandexQuery::Acl::SCOPE); + + // user connections + readQueryBuilder.AddText( + "SELECT `" CONNECTION_ID_COLUMN_NAME "`, `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);" + ); + + // user bindings + readQueryBuilder.AddText( + "SELECT `" BINDING_ID_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);" + ); + } + + auto prepareParams = [=](const TVector<TResultSet>& resultSets) mutable { + const size_t countSets = (idempotencyKey ? 1 : 0) + (request.execute_mode() != YandexQuery::SAVE ? 2 : 0); + if (resultSets.size() != countSets) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to " << countSets << " but equal " << resultSets.size() << ". Please contact internal support"; + } + + if (idempotencyKey) { + TResultSetParser parser(resultSets.front()); + if (parser.TryNextRow()) { + if (!response->first.ParseFromString(*parser.ColumnParser(RESPONSE_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for idempotency key request. Please contact internal support"; + } + response->second.IdempotencyResult = true; + return make_pair(TString{}, TParamsBuilder{}.Build()); + } + } + + YandexQuery::Internal::QueryInternal queryInternal; + if (!Config.Proto.GetDisableCurrentIam()) { + queryInternal.set_token(token); + } + queryInternal.set_cloud_id(cloudId); + queryInternal.set_state_load_mode(YandexQuery::StateLoadMode::EMPTY); queryInternal.mutable_disposition()->CopyFrom(request.disposition()); - - if (request.execute_mode() != YandexQuery::SAVE) { - // TODO: move to run actor priority selection - if (permissions.Check(TPermissions::BINDINGS_USE)) { - auto bindings = GetEntitiesWithVisibilityPriority<YandexQuery::Binding>(resultSets[resultSets.size() - 1], BINDING_COLUMN_NAME); - for (const auto& [_, binding]: bindings) { - if (!Config.AvailableBindings.contains(binding.content().setting().binding_case())) { - continue; - } - - *queryInternal.add_binding() = binding; - } - } - - if (permissions.Check(TPermissions::CONNECTIONS_USE)) { - auto connections = GetEntitiesWithVisibilityPriority<YandexQuery::Connection>(resultSets[resultSets.size() - 2], CONNECTION_COLUMN_NAME); - for (const auto& [_, connection]: connections) { - if (!Config.AvailableConnections.contains(connection.content().setting().connection_case())) { - continue; - } - - if (GetIamAuth(connection) == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { - continue; - } - *queryInternal.add_connection() = connection; - } - } - } - - if (query.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query data is not placed in the table. Please shorten your request"; - } - - if (queryInternal.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query internal data is not placed in the table. Please reduce the number of connections and bindings"; - } - - response->second.After.ConstructInPlace().CopyFrom(query); - + + if (request.execute_mode() != YandexQuery::SAVE) { + // TODO: move to run actor priority selection + if (permissions.Check(TPermissions::BINDINGS_USE)) { + auto bindings = GetEntitiesWithVisibilityPriority<YandexQuery::Binding>(resultSets[resultSets.size() - 1], BINDING_COLUMN_NAME); + for (const auto& [_, binding]: bindings) { + if (!Config.AvailableBindings.contains(binding.content().setting().binding_case())) { + continue; + } + + *queryInternal.add_binding() = binding; + } + } + + if (permissions.Check(TPermissions::CONNECTIONS_USE)) { + auto connections = GetEntitiesWithVisibilityPriority<YandexQuery::Connection>(resultSets[resultSets.size() - 2], CONNECTION_COLUMN_NAME); + for (const auto& [_, connection]: connections) { + if (!Config.AvailableConnections.contains(connection.content().setting().connection_case())) { + continue; + } + + if (GetIamAuth(connection) == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { + continue; + } + *queryInternal.add_connection() = connection; + } + } + } + + if (query.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query data is not placed in the table. Please shorten your request"; + } + + if (queryInternal.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query internal data is not placed in the table. Please reduce the number of connections and bindings"; + } + + response->second.After.ConstructInPlace().CopyFrom(query); + TSqlQueryBuilder writeQueryBuilder(YdbConnection->TablePathPrefix, "CreateQuery(write)"); - writeQueryBuilder.AddString("scope", scope); - writeQueryBuilder.AddString("query_id", queryId); - writeQueryBuilder.AddString("name", query.content().name()); - writeQueryBuilder.AddInt64("status", query.meta().status()); - writeQueryBuilder.AddInt64("query_type", query.content().type()); - writeQueryBuilder.AddInt64("execute_mode", query.meta().execute_mode()); - writeQueryBuilder.AddString("user", user); - writeQueryBuilder.AddInt64("visibility", query.content().acl().visibility()); - writeQueryBuilder.AddBool("automatic", query.content().automatic()); - writeQueryBuilder.AddInt64("revision", InitialRevision); - writeQueryBuilder.AddString("query", query.SerializeAsString()); - writeQueryBuilder.AddString("internal", queryInternal.SerializeAsString()); - writeQueryBuilder.AddString("job_id", jobId); - - InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); - - if (request.execute_mode() != YandexQuery::SAVE) { - writeQueryBuilder.AddString("job", job.SerializeAsString()); - writeQueryBuilder.AddTimestamp("zero_timestamp", TInstant::Zero()); - writeQueryBuilder.AddTimestamp("now", TInstant::Now()); - - // insert job - writeQueryBuilder.AddText( + writeQueryBuilder.AddString("scope", scope); + writeQueryBuilder.AddString("query_id", queryId); + writeQueryBuilder.AddString("name", query.content().name()); + writeQueryBuilder.AddInt64("status", query.meta().status()); + writeQueryBuilder.AddInt64("query_type", query.content().type()); + writeQueryBuilder.AddInt64("execute_mode", query.meta().execute_mode()); + writeQueryBuilder.AddString("user", user); + writeQueryBuilder.AddInt64("visibility", query.content().acl().visibility()); + writeQueryBuilder.AddBool("automatic", query.content().automatic()); + writeQueryBuilder.AddInt64("revision", InitialRevision); + writeQueryBuilder.AddString("query", query.SerializeAsString()); + writeQueryBuilder.AddString("internal", queryInternal.SerializeAsString()); + writeQueryBuilder.AddString("job_id", jobId); + + InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); + + if (request.execute_mode() != YandexQuery::SAVE) { + writeQueryBuilder.AddString("job", job.SerializeAsString()); + writeQueryBuilder.AddTimestamp("zero_timestamp", TInstant::Zero()); + writeQueryBuilder.AddTimestamp("now", TInstant::Now()); + + // insert job + writeQueryBuilder.AddText( "INSERT INTO `" JOBS_TABLE_NAME "`\n" "(`" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`, `" JOB_ID_COLUMN_NAME "`, \n" "`" JOB_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`)\n" "VALUES\n" " ($scope, $query_id, $job_id, $job, $user, $visibility);" - ); - - // insert pending small - writeQueryBuilder.AddText( + ); + + // insert pending small + writeQueryBuilder.AddText( "INSERT INTO `" PENDING_SMALL_TABLE_NAME "`\n" "(`" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`, `" QUERY_TYPE_COLUMN_NAME "`, `" LAST_SEEN_AT_COLUMN_NAME "`,\n" "`" RETRY_COUNTER_COLUMN_NAME "`, `" RETRY_COUNTER_UPDATE_COLUMN_NAME "`, `" HOST_NAME_COLUMN_NAME "`, `" OWNER_COLUMN_NAME "`)\n" "VALUES\n" " ($scope, $query_id, $query_type, $zero_timestamp, 0, $now, \"\", \"\");" - ); - } - - // insert query - writeQueryBuilder.AddText( - "INSERT INTO `" QUERIES_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`, `" NAME_COLUMN_NAME "`, `" STATUS_COLUMN_NAME "`, `" QUERY_TYPE_COLUMN_NAME "`, " - "`" EXECUTE_MODE_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" AUTOMATIC_COLUMN_NAME "`, " + ); + } + + // insert query + writeQueryBuilder.AddText( + "INSERT INTO `" QUERIES_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`, `" NAME_COLUMN_NAME "`, `" STATUS_COLUMN_NAME "`, `" QUERY_TYPE_COLUMN_NAME "`, " + "`" EXECUTE_MODE_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" AUTOMATIC_COLUMN_NAME "`, " "`" REVISION_COLUMN_NAME "`, `" QUERY_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "`, `" LAST_JOB_ID_COLUMN_NAME "`, `" GENERATION_COLUMN_NAME "`, `" META_REVISION_COLUMN_NAME "`)\n" - "VALUES ($scope, $query_id, $name, $status, $query_type, " - "$execute_mode, $user, $visibility, $automatic, " + "VALUES ($scope, $query_id, $name, $status, $query_type, " + "$execute_mode, $user, $visibility, $automatic, " "$revision, $query, $internal, $job_id, 0, 0);" - ); - - const auto write = writeQueryBuilder.Build(); - return make_pair(write.Sql, write.Params); - }; - - const auto read = readQueryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - TAsyncStatus status = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), read.Sql, read.Params, prepareParams, requestCounters, debugInfo); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvCreateQueryResponse, YandexQuery::CreateQueryResult, TAuditDetails<YandexQuery::Query>>( - MakeLogPrefix(scope, user, queryId) + "CreateQueryRequest", - NActors::TActivationContext::ActorSystem(), - status, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(CreateQueryRequest, scope, user, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListQueriesRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_QUERIES]; - requestCounters->InFly->Inc(); - - const YandexQuery::ListQueriesRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } + ); + + const auto write = writeQueryBuilder.Build(); + return make_pair(write.Sql, write.Params); + }; + + const auto read = readQueryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + TAsyncStatus status = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), read.Sql, read.Params, prepareParams, requestCounters, debugInfo); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvCreateQueryResponse, YandexQuery::CreateQueryResult, TAuditDetails<YandexQuery::Query>>( + MakeLogPrefix(scope, user, queryId) + "CreateQueryRequest", + NActors::TActivationContext::ActorSystem(), + status, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(CreateQueryRequest, scope, user, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListQueriesRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_QUERIES]; + requestCounters->InFly->Inc(); + + const YandexQuery::ListQueriesRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } const TString pageToken = request.page_token(); - const int byteSize = request.ByteSize(); - const int64_t limit = request.limit(); - - CPS_LOG_T(MakeLogPrefix(scope, user) - << "ListQueriesRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user) - << "ListQueriesRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvListQueriesResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ListQueriesRequest, scope, user, delta, byteSize, false); + const int byteSize = request.ByteSize(); + const int64_t limit = request.limit(); + + CPS_LOG_T(MakeLogPrefix(scope, user) + << "ListQueriesRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user) + << "ListQueriesRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvListQueriesResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ListQueriesRequest, scope, user, delta, byteSize, false); return; - } - + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "ListQueries"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("last_query", pageToken); - queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddUint64("limit", limit + 1); - - queryBuilder.AddText( - "SELECT `" QUERY_ID_COLUMN_NAME "`, `" QUERY_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` >= $last_query AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now)" - ); - - TString filter; - if (request.has_filter()) { - TVector<TString> filters; - if (request.filter().name()) { - queryBuilder.AddString("filter_name", request.filter().name()); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("last_query", pageToken); + queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddUint64("limit", limit + 1); + + queryBuilder.AddText( + "SELECT `" QUERY_ID_COLUMN_NAME "`, `" QUERY_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` >= $last_query AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now)" + ); + + TString filter; + if (request.has_filter()) { + TVector<TString> filters; + if (request.filter().name()) { + queryBuilder.AddString("filter_name", request.filter().name()); filters.push_back("`" NAME_COLUMN_NAME "` ILIKE '%' || $filter_name || '%'"); - } - - if (request.filter().query_type() != YandexQuery::QueryContent::QUERY_TYPE_UNSPECIFIED) { - queryBuilder.AddInt64("filter_query_type", request.filter().query_type()); - filters.push_back("`" QUERY_TYPE_COLUMN_NAME "` = $filter_query_type"); - } - - if (request.filter().status_size() > 0) { - NYdb::TValueBuilder listStatusesBuilder; - listStatusesBuilder.BeginList(); - for (const auto& status: request.filter().status()) { - listStatusesBuilder.AddListItem(NYdb::TValueBuilder().Int64(status).Build()); - } - listStatusesBuilder.EndList(); - queryBuilder.AddValue("filter_statuses", listStatusesBuilder.Build()); - filters.push_back("`" STATUS_COLUMN_NAME "` IN $filter_statuses"); - } - - if (request.filter().mode_size() > 0) { - NYdb::TValueBuilder listModesBuilder; - listModesBuilder.BeginList(); - for (const auto& mode: request.filter().mode()) { - listModesBuilder.AddListItem(NYdb::TValueBuilder().Int64(mode).Build()); - } - listModesBuilder.EndList(); - queryBuilder.AddValue("filter_modes", listModesBuilder.Build()); - filters.push_back("`" EXECUTE_MODE_COLUMN_NAME "` IN $filter_modes"); - } - - if (request.filter().created_by_me()) { - queryBuilder.AddString("user", user); - filters.push_back("`" USER_COLUMN_NAME "` = $user"); - } - + } + + if (request.filter().query_type() != YandexQuery::QueryContent::QUERY_TYPE_UNSPECIFIED) { + queryBuilder.AddInt64("filter_query_type", request.filter().query_type()); + filters.push_back("`" QUERY_TYPE_COLUMN_NAME "` = $filter_query_type"); + } + + if (request.filter().status_size() > 0) { + NYdb::TValueBuilder listStatusesBuilder; + listStatusesBuilder.BeginList(); + for (const auto& status: request.filter().status()) { + listStatusesBuilder.AddListItem(NYdb::TValueBuilder().Int64(status).Build()); + } + listStatusesBuilder.EndList(); + queryBuilder.AddValue("filter_statuses", listStatusesBuilder.Build()); + filters.push_back("`" STATUS_COLUMN_NAME "` IN $filter_statuses"); + } + + if (request.filter().mode_size() > 0) { + NYdb::TValueBuilder listModesBuilder; + listModesBuilder.BeginList(); + for (const auto& mode: request.filter().mode()) { + listModesBuilder.AddListItem(NYdb::TValueBuilder().Int64(mode).Build()); + } + listModesBuilder.EndList(); + queryBuilder.AddValue("filter_modes", listModesBuilder.Build()); + filters.push_back("`" EXECUTE_MODE_COLUMN_NAME "` IN $filter_modes"); + } + + if (request.filter().created_by_me()) { + queryBuilder.AddString("user", user); + filters.push_back("`" USER_COLUMN_NAME "` = $user"); + } + if (request.filter().visibility() != YandexQuery::Acl::VISIBILITY_UNSPECIFIED) { - queryBuilder.AddInt64("filter_visibility", request.filter().visibility()); - filters.push_back("`" VISIBILITY_COLUMN_NAME "` = $filter_visibility"); + queryBuilder.AddInt64("filter_visibility", request.filter().visibility()); + filters.push_back("`" VISIBILITY_COLUMN_NAME "` = $filter_visibility"); } switch (request.filter().automatic()) { @@ -383,164 +383,164 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListQueries } filter = JoinSeq(" AND ", filters); - } - - PrepareViewAccessCondition(queryBuilder, permissions, user); - - if (filter) { - queryBuilder.AddText(" AND (" + filter + ")\n"); - } - - queryBuilder.AddText( - "ORDER BY " QUERY_ID_COLUMN_NAME "\n" - "LIMIT $limit;" - ); - - const auto read = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(read.Sql, read.Params, requestCounters, debugInfo); - auto prepare = [resultSets=resultSets, limit] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; - } - - YandexQuery::ListQueriesResult result; - TResultSetParser parser(resultSets->front()); - while (parser.TryNextRow()) { - YandexQuery::Query query; - if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; - } - YandexQuery::BriefQuery briefQuery; + } + + PrepareViewAccessCondition(queryBuilder, permissions, user); + + if (filter) { + queryBuilder.AddText(" AND (" + filter + ")\n"); + } + + queryBuilder.AddText( + "ORDER BY " QUERY_ID_COLUMN_NAME "\n" + "LIMIT $limit;" + ); + + const auto read = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(read.Sql, read.Params, requestCounters, debugInfo); + auto prepare = [resultSets=resultSets, limit] { + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + } + + YandexQuery::ListQueriesResult result; + TResultSetParser parser(resultSets->front()); + while (parser.TryNextRow()) { + YandexQuery::Query query; + if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; + } + YandexQuery::BriefQuery briefQuery; const auto lastJobId = query.meta().last_job_id(); query.mutable_meta()->set_last_job_id(lastJobId + "-" + query.meta().common().id()); - *briefQuery.mutable_meta() = query.meta(); - briefQuery.set_name(query.content().name()); - briefQuery.set_type(query.content().type()); - briefQuery.set_visibility(query.content().acl().visibility()); - briefQuery.set_automatic(query.content().automatic()); - *result.add_query() = briefQuery; - } - - if (result.query_size() == limit + 1) { - result.set_next_page_token(result.query(result.query_size() - 1).meta().common().id()); - result.mutable_query()->RemoveLast(); - } - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvListQueriesResponse, YandexQuery::ListQueriesResult>( - MakeLogPrefix(scope, user) + "ListQueriesRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ListQueriesRequest, scope, user, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeQueryRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_QUERY]; - requestCounters->InFly->Inc(); - - const YandexQuery::DescribeQueryRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC | TPermissions::VIEW_AST}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const TString queryId = request.query_id(); - const int byteSize = request.ByteSize(); - CPS_LOG_T(MakeLogPrefix(scope, user, queryId) - << "DescribeQueryRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, queryId) - << "DescribeQueryRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvDescribeQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(DescribeQueryRequest, scope, user, queryId, delta, byteSize, false); + *briefQuery.mutable_meta() = query.meta(); + briefQuery.set_name(query.content().name()); + briefQuery.set_type(query.content().type()); + briefQuery.set_visibility(query.content().acl().visibility()); + briefQuery.set_automatic(query.content().automatic()); + *result.add_query() = briefQuery; + } + + if (result.query_size() == limit + 1) { + result.set_next_page_token(result.query(result.query_size() - 1).meta().common().id()); + result.mutable_query()->RemoveLast(); + } + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvListQueriesResponse, YandexQuery::ListQueriesResult>( + MakeLogPrefix(scope, user) + "ListQueriesRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ListQueriesRequest, scope, user, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeQueryRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DESCRIBE_QUERY]; + requestCounters->InFly->Inc(); + + const YandexQuery::DescribeQueryRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC | TPermissions::VIEW_AST}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const TString queryId = request.query_id(); + const int byteSize = request.ByteSize(); + CPS_LOG_T(MakeLogPrefix(scope, user, queryId) + << "DescribeQueryRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, queryId) + << "DescribeQueryRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvDescribeQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(DescribeQueryRequest, scope, user, queryId, delta, byteSize, false); return; - } - + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "DescribeQuery"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("query_id", queryId); - queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddText( - "SELECT `" QUERY_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);" - ); - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); - auto prepare = [resultSets=resultSets, user,permissions] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets->front()); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - - YandexQuery::DescribeQueryResult result; - if (!result.mutable_query()->ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; - } - + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("query_id", queryId); + queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddText( + "SELECT `" QUERY_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);" + ); + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + auto prepare = [resultSets=resultSets, user,permissions] { + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets->front()); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + + YandexQuery::DescribeQueryResult result; + if (!result.mutable_query()->ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; + } + const auto lastJobId = result.query().meta().last_job_id(); result.mutable_query()->mutable_meta()->set_last_job_id(lastJobId + "-" + result.query().meta().common().id()); - const auto queryVisibility = result.query().content().acl().visibility(); - const auto queryUser = result.query().meta().common().created_by(); - const bool hasViewAccess = HasViewAccess(permissions, queryVisibility, queryUser, user); - if (!hasViewAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - - if (!permissions.Check(TPermissions::VIEW_AST)) { - result.mutable_query()->clear_ast(); - } - - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvDescribeQueryResponse, YandexQuery::DescribeQueryResult>( - MakeLogPrefix(scope, user, queryId) + "DescribeQueryRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(DescribeQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); - }); -} - + const auto queryVisibility = result.query().content().acl().visibility(); + const auto queryUser = result.query().meta().common().created_by(); + const bool hasViewAccess = HasViewAccess(permissions, queryVisibility, queryUser, user); + if (!hasViewAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + + if (!permissions.Check(TPermissions::VIEW_AST)) { + result.mutable_query()->clear_ast(); + } + + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvDescribeQueryResponse, YandexQuery::DescribeQueryResult>( + MakeLogPrefix(scope, user, queryId) + "DescribeQueryRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(DescribeQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); + }); +} + void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetQueryStatusRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); @@ -551,7 +551,7 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetQuerySta const TString scope = ev->Get()->Scope; const TString user = ev->Get()->User; const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() + TPermissions permissions = Config.Proto.GetEnablePermissions() ? ev->Get()->Permissions : TPermissions{TPermissions::VIEW_PUBLIC | TPermissions::VIEW_AST}; if (IsSuperUser(user)) { @@ -577,18 +577,18 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetQuerySta } TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "GetQueryStatus"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("query_id", queryId); - queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("query_id", queryId); + queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddText( + queryBuilder.AddText( "SELECT `" STATUS_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" META_REVISION_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);" - ); + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);" + ); - const auto read = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(read.Sql, read.Params, requestCounters, debugInfo); + const auto read = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(read.Sql, read.Params, requestCounters, debugInfo); auto prepare = [resultSets=resultSets, user,permissions] { if (resultSets->size() != 1) { ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; @@ -630,298 +630,298 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetQuerySta }); } -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyQueryRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_QUERY]; - requestCounters->InFly->Inc(); - - YandexQuery::ModifyQueryRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::QUERY_INVOKE | TPermissions::CONNECTIONS_USE | TPermissions::BINDINGS_USE | TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const TString queryId = request.query_id(); - const int byteSize = ev->Get()->Request.ByteSize(); - const int64_t previousRevision = request.previous_revision(); - - CPS_LOG_T(MakeLogPrefix(scope, user, queryId) - << "ModifyQueryRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyQueryRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_MODIFY_QUERY]; + requestCounters->InFly->Inc(); + + YandexQuery::ModifyQueryRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::QUERY_INVOKE | TPermissions::CONNECTIONS_USE | TPermissions::BINDINGS_USE | TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const TString queryId = request.query_id(); + const int byteSize = ev->Get()->Request.ByteSize(); + const int64_t previousRevision = request.previous_revision(); + + CPS_LOG_T(MakeLogPrefix(scope, user, queryId) + << "ModifyQueryRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + if (request.content().type() == YandexQuery::QueryContent::STREAMING && request.state_load_mode() == YandexQuery::STATE_LOAD_MODE_UNSPECIFIED) { request.set_state_load_mode(YandexQuery::EMPTY); - } - - NYql::TIssues issues = ValidateQuery(ev); - if (request.execute_mode() != YandexQuery::SAVE && !permissions.Check(TPermissions::QUERY_INVOKE)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.queries.invoke")); - } - - if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { - issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.resources.managePublic")); - } + } + + NYql::TIssues issues = ValidateQuery(ev); + if (request.execute_mode() != YandexQuery::SAVE && !permissions.Check(TPermissions::QUERY_INVOKE)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.queries.invoke")); + } + + if (request.content().acl().visibility() == YandexQuery::Acl::SCOPE && !permissions.Check(TPermissions::MANAGE_PUBLIC)) { + issues.AddIssue(MakeErrorIssue(TIssuesIds::ACCESS_DENIED, "Permission denied to create a query with these parameters. Please receive a permission yq.resources.managePublic")); + } if (request.state_load_mode() == YandexQuery::FROM_LAST_CHECKPOINT) { issues.AddIssue(MakeErrorIssue(TIssuesIds::UNSUPPORTED, "State load mode \"FROM_LAST_CHECKPOINT\" is not supported")); } - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, queryId) - << "ModifyQueryRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvModifyQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ModifyQueryRequest, scope, user, queryId, delta, byteSize, false); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, queryId) + << "ModifyQueryRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvModifyQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ModifyQueryRequest, scope, user, queryId, delta, byteSize, false); return; - } - - const TString idempotencyKey = request.idempotency_key(); - + } + + const TString idempotencyKey = request.idempotency_key(); + std::shared_ptr<std::pair<YandexQuery::ModifyQueryResult, TAuditDetails<YandexQuery::Query>>> response = std::make_shared<std::pair<YandexQuery::ModifyQueryResult, TAuditDetails<YandexQuery::Query>>>(); - + TSqlQueryBuilder readQueryBuilder(YdbConnection->TablePathPrefix, "ModifyQuery(read)"); - readQueryBuilder.AddString("scope", scope); - readQueryBuilder.AddString("query_id", queryId); - readQueryBuilder.AddTimestamp("now", TInstant::Now()); - - if (request.execute_mode() != YandexQuery::SAVE) { - readQueryBuilder.AddString("user", user); - readQueryBuilder.AddInt64("scope_visibility", YandexQuery::Acl::SCOPE); - // user connections - readQueryBuilder.AddText( - "SELECT `" CONNECTION_ID_COLUMN_NAME "`, `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);\n" - ); - - // user bindings - readQueryBuilder.AddText( - "SELECT `" BINDING_ID_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);\n" - ); - } - - readQueryBuilder.AddText( + readQueryBuilder.AddString("scope", scope); + readQueryBuilder.AddString("query_id", queryId); + readQueryBuilder.AddTimestamp("now", TInstant::Now()); + + if (request.execute_mode() != YandexQuery::SAVE) { + readQueryBuilder.AddString("user", user); + readQueryBuilder.AddInt64("scope_visibility", YandexQuery::Acl::SCOPE); + // user connections + readQueryBuilder.AddText( + "SELECT `" CONNECTION_ID_COLUMN_NAME "`, `" CONNECTION_COLUMN_NAME "` FROM `" CONNECTIONS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);\n" + ); + + // user bindings + readQueryBuilder.AddText( + "SELECT `" BINDING_ID_COLUMN_NAME "`, `" BINDING_COLUMN_NAME "` FROM `" BINDINGS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND (`" VISIBILITY_COLUMN_NAME "` = $scope_visibility OR `" USER_COLUMN_NAME "` = $user);\n" + ); + } + + readQueryBuilder.AddText( "SELECT `" QUERY_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "`, `" RESULT_ID_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);" - ); - - auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { - const size_t countSets = 1 + (request.execute_mode() != YandexQuery::SAVE ? 2 : 0); - - if (resultSets.size() != countSets) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to " << countSets << " but equal " << resultSets.size() << ". Please contact internal support"; - } - - TResultSetParser parser(resultSets.back()); - - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - - YandexQuery::Query query; - if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; - } - - YandexQuery::Internal::QueryInternal internal; - if (!internal.ParseFromString(*parser.ColumnParser(INTERNAL_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query internal. Please contact internal support"; - } - + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);" + ); + + auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { + const size_t countSets = 1 + (request.execute_mode() != YandexQuery::SAVE ? 2 : 0); + + if (resultSets.size() != countSets) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to " << countSets << " but equal " << resultSets.size() << ". Please contact internal support"; + } + + TResultSetParser parser(resultSets.back()); + + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + + YandexQuery::Query query; + if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; + } + + YandexQuery::Internal::QueryInternal internal; + if (!internal.ParseFromString(*parser.ColumnParser(INTERNAL_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query internal. Please contact internal support"; + } + const TString resultId = request.execute_mode() == YandexQuery::SAVE ? parser.ColumnParser(RESULT_ID_COLUMN_NAME).GetOptionalString().GetOrElse("") : ""; - const auto queryVisibility = query.content().acl().visibility(); - const auto queryUser = query.meta().common().created_by(); - const bool hasManageAccess = HasManageAccess(permissions, queryVisibility, queryUser, user); - if (!hasManageAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - - if (query.content().type() != request.content().type()) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query type cannot be changed. Please specify " << YandexQuery::QueryContent_QueryType_Name(query.content().type()) << " instead of " << YandexQuery::QueryContent_QueryType_Name(request.content().type()); - } - - if (query.content().acl().visibility() == YandexQuery::Acl::SCOPE && request.content().acl().visibility() == YandexQuery::Acl::PRIVATE) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Changing visibility from SCOPE to PRIVATE is forbidden. Please create a new query with visibility PRIVATE"; - } - - auto oldVisibility = query.content().acl().visibility(); - - auto now = TInstant::Now(); - auto& common = *query.mutable_meta()->mutable_common(); - common.set_revision(common.revision() + 1); - common.set_modified_by(user); + const auto queryVisibility = query.content().acl().visibility(); + const auto queryUser = query.meta().common().created_by(); + const bool hasManageAccess = HasManageAccess(permissions, queryVisibility, queryUser, user); + if (!hasManageAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + + if (query.content().type() != request.content().type()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query type cannot be changed. Please specify " << YandexQuery::QueryContent_QueryType_Name(query.content().type()) << " instead of " << YandexQuery::QueryContent_QueryType_Name(request.content().type()); + } + + if (query.content().acl().visibility() == YandexQuery::Acl::SCOPE && request.content().acl().visibility() == YandexQuery::Acl::PRIVATE) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Changing visibility from SCOPE to PRIVATE is forbidden. Please create a new query with visibility PRIVATE"; + } + + auto oldVisibility = query.content().acl().visibility(); + + auto now = TInstant::Now(); + auto& common = *query.mutable_meta()->mutable_common(); + common.set_revision(common.revision() + 1); + common.set_modified_by(user); *common.mutable_modified_at() = NProtoInterop::CastToProto(now); - - *query.mutable_content() = request.content(); - query.mutable_meta()->set_execute_mode(request.execute_mode()); - - bool isValidMode = request.execute_mode() == YandexQuery::SAVE || - IsIn({ - YandexQuery::QueryMeta::ABORTED_BY_USER, - YandexQuery::QueryMeta::ABORTED_BY_SYSTEM, - YandexQuery::QueryMeta::COMPLETED, - YandexQuery::QueryMeta::FAILED, - YandexQuery::QueryMeta::PAUSED - }, query.meta().status()); - - if (!isValidMode) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Conversion from status " << YandexQuery::QueryMeta::ComputeStatus_Name(query.meta().status()) << " to " << YandexQuery::QueryMeta::ComputeStatus_Name(YandexQuery::QueryMeta::STARTING) << " is not possible. Please wait for the query to complete or stop it"; - } - - if (!Config.Proto.GetDisableCurrentIam()) { - internal.set_token(token); - } - if (request.execute_mode() != YandexQuery::SAVE) { + + *query.mutable_content() = request.content(); + query.mutable_meta()->set_execute_mode(request.execute_mode()); + + bool isValidMode = request.execute_mode() == YandexQuery::SAVE || + IsIn({ + YandexQuery::QueryMeta::ABORTED_BY_USER, + YandexQuery::QueryMeta::ABORTED_BY_SYSTEM, + YandexQuery::QueryMeta::COMPLETED, + YandexQuery::QueryMeta::FAILED, + YandexQuery::QueryMeta::PAUSED + }, query.meta().status()); + + if (!isValidMode) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Conversion from status " << YandexQuery::QueryMeta::ComputeStatus_Name(query.meta().status()) << " to " << YandexQuery::QueryMeta::ComputeStatus_Name(YandexQuery::QueryMeta::STARTING) << " is not possible. Please wait for the query to complete or stop it"; + } + + if (!Config.Proto.GetDisableCurrentIam()) { + internal.set_token(token); + } + if (request.execute_mode() != YandexQuery::SAVE) { if (request.state_load_mode() != YandexQuery::StateLoadMode::STATE_LOAD_MODE_UNSPECIFIED) { internal.set_state_load_mode(request.state_load_mode()); } internal.mutable_disposition()->CopyFrom(request.disposition()); - internal.clear_binding(); - internal.clear_connection(); - // TODO: move to run actor priority selection - if (permissions.Check(TPermissions::BINDINGS_USE)) { - auto bindings = GetEntitiesWithVisibilityPriority<YandexQuery::Binding>(resultSets[resultSets.size() - 2], BINDING_COLUMN_NAME); - for (const auto& [_, binding]: bindings) { - if (!Config.AvailableBindings.contains(binding.content().setting().binding_case())) { - continue; - } - - *internal.add_binding() = binding; - } - } - - if (permissions.Check(TPermissions::CONNECTIONS_USE)) { - auto connections = GetEntitiesWithVisibilityPriority<YandexQuery::Connection>(resultSets[resultSets.size() - 3], CONNECTION_COLUMN_NAME); - for (const auto& [_, connection]: connections) { - if (!Config.AvailableConnections.contains(connection.content().setting().connection_case())) { - continue; - } - - if (GetIamAuth(connection) == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { - continue; - } - - *internal.add_connection() = connection; - } - } - } - - if (query.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query data is not placed in the table. Please shorten your request"; - } - - if (internal.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Internal data is not placed in the table. Please reduce the number of connections and bindings"; - } - - YandexQuery::Job job; - const TString jobId = request.execute_mode() == YandexQuery::SAVE ? "" : GetEntityIdAsString(Config.IdsPrefix, EEntityType::JOB); - if (request.execute_mode() != YandexQuery::SAVE) { - internal.clear_action(); - query.clear_result_set_meta(); - query.clear_plan(); + internal.clear_binding(); + internal.clear_connection(); + // TODO: move to run actor priority selection + if (permissions.Check(TPermissions::BINDINGS_USE)) { + auto bindings = GetEntitiesWithVisibilityPriority<YandexQuery::Binding>(resultSets[resultSets.size() - 2], BINDING_COLUMN_NAME); + for (const auto& [_, binding]: bindings) { + if (!Config.AvailableBindings.contains(binding.content().setting().binding_case())) { + continue; + } + + *internal.add_binding() = binding; + } + } + + if (permissions.Check(TPermissions::CONNECTIONS_USE)) { + auto connections = GetEntitiesWithVisibilityPriority<YandexQuery::Connection>(resultSets[resultSets.size() - 3], CONNECTION_COLUMN_NAME); + for (const auto& [_, connection]: connections) { + if (!Config.AvailableConnections.contains(connection.content().setting().connection_case())) { + continue; + } + + if (GetIamAuth(connection) == YandexQuery::IamAuth::kCurrentIam && Config.Proto.GetDisableCurrentIam()) { + continue; + } + + *internal.add_connection() = connection; + } + } + } + + if (query.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Query data is not placed in the table. Please shorten your request"; + } + + if (internal.ByteSizeLong() > Config.Proto.GetMaxRequestSize()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Internal data is not placed in the table. Please reduce the number of connections and bindings"; + } + + YandexQuery::Job job; + const TString jobId = request.execute_mode() == YandexQuery::SAVE ? "" : GetEntityIdAsString(Config.IdsPrefix, EEntityType::JOB); + if (request.execute_mode() != YandexQuery::SAVE) { + internal.clear_action(); + query.clear_result_set_meta(); + query.clear_plan(); query.clear_ast(); - query.clear_issue(); - query.clear_transient_issue(); - query.clear_statistics(); - query.mutable_meta()->clear_started_at(); - query.mutable_meta()->clear_finished_at(); - query.mutable_meta()->set_last_job_query_revision(common.revision()); - query.mutable_meta()->set_last_job_id(jobId); - query.mutable_meta()->set_status(YandexQuery::QueryMeta::STARTING); + query.clear_issue(); + query.clear_transient_issue(); + query.clear_statistics(); + query.mutable_meta()->clear_started_at(); + query.mutable_meta()->clear_finished_at(); + query.mutable_meta()->set_last_job_query_revision(common.revision()); + query.mutable_meta()->set_last_job_id(jobId); + query.mutable_meta()->set_status(YandexQuery::QueryMeta::STARTING); query.mutable_meta()->clear_expire_at(); query.mutable_meta()->clear_result_expire_at(); query.mutable_meta()->set_started_by(user); query.mutable_meta()->clear_action(); - - auto& jobMeta = *job.mutable_meta(); - jobMeta.set_id(jobId); - jobMeta.set_created_by(user); - jobMeta.set_modified_by(user); + + auto& jobMeta = *job.mutable_meta(); + jobMeta.set_id(jobId); + jobMeta.set_created_by(user); + jobMeta.set_modified_by(user); *jobMeta.mutable_modified_at() = NProtoInterop::CastToProto(now); *jobMeta.mutable_created_at() = NProtoInterop::CastToProto(now); - jobMeta.set_revision(InitialRevision); - - job.set_text(request.content().text()); - *job.mutable_query_meta() = query.meta(); + jobMeta.set_revision(InitialRevision); + + job.set_text(request.content().text()); + *job.mutable_query_meta() = query.meta(); job.set_query_name(query.mutable_content()->name()); *job.mutable_acl() = request.content().acl(); job.set_automatic(request.content().automatic()); - } - - response->second.After.ConstructInPlace().CopyFrom(query); - response->second.CloudId = internal.cloud_id(); - + } + + response->second.After.ConstructInPlace().CopyFrom(query); + response->second.CloudId = internal.cloud_id(); + TSqlQueryBuilder writeQueryBuilder(YdbConnection->TablePathPrefix, "ModifyQuery(write)"); - writeQueryBuilder.AddString("scope", scope); - writeQueryBuilder.AddString("query_id", queryId); - writeQueryBuilder.AddUint64("max_count_jobs", Config.Proto.GetMaxCountJobs()); - writeQueryBuilder.AddInt64("visibility", query.content().acl().visibility()); - writeQueryBuilder.AddString("job_id", jobId); - writeQueryBuilder.AddString("query", query.SerializeAsString()); - writeQueryBuilder.AddString("internal", internal.SerializeAsString()); - writeQueryBuilder.AddInt64("query_type", query.content().type()); - writeQueryBuilder.AddBool("automatic", query.content().automatic()); - writeQueryBuilder.AddString("name", query.content().name()); - writeQueryBuilder.AddInt64("execute_mode", request.execute_mode()); - writeQueryBuilder.AddInt64("revision", common.revision()); - writeQueryBuilder.AddInt64("status", query.meta().status()); - writeQueryBuilder.AddString("result_id", resultId); - - writeQueryBuilder.AddText( - "$to_delete = (\n" - "SELECT * FROM `" JOBS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id\n" - "ORDER BY `" JOB_ID_COLUMN_NAME "`\n" - "LIMIT $max_count_jobs, 1\n" - ");\n" - ); - - InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); - - if (request.content().acl().visibility() == oldVisibility) { - writeQueryBuilder.AddInt64("visibility", query.content().acl().visibility()); - // move jobs to scope - writeQueryBuilder.AddText( - "UPDATE `" JOBS_TABLE_NAME "` SET `" VISIBILITY_COLUMN_NAME "` = $visibility\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - ); - } - - if (request.execute_mode() != YandexQuery::SAVE) { - writeQueryBuilder.AddString("job", job.SerializeAsString()); - writeQueryBuilder.AddString("user", user); - writeQueryBuilder.AddTimestamp("zero_timestamp", TInstant::Zero()); - writeQueryBuilder.AddTimestamp("now", TInstant::Now()); - // insert job - writeQueryBuilder.AddText( + writeQueryBuilder.AddString("scope", scope); + writeQueryBuilder.AddString("query_id", queryId); + writeQueryBuilder.AddUint64("max_count_jobs", Config.Proto.GetMaxCountJobs()); + writeQueryBuilder.AddInt64("visibility", query.content().acl().visibility()); + writeQueryBuilder.AddString("job_id", jobId); + writeQueryBuilder.AddString("query", query.SerializeAsString()); + writeQueryBuilder.AddString("internal", internal.SerializeAsString()); + writeQueryBuilder.AddInt64("query_type", query.content().type()); + writeQueryBuilder.AddBool("automatic", query.content().automatic()); + writeQueryBuilder.AddString("name", query.content().name()); + writeQueryBuilder.AddInt64("execute_mode", request.execute_mode()); + writeQueryBuilder.AddInt64("revision", common.revision()); + writeQueryBuilder.AddInt64("status", query.meta().status()); + writeQueryBuilder.AddString("result_id", resultId); + + writeQueryBuilder.AddText( + "$to_delete = (\n" + "SELECT * FROM `" JOBS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id\n" + "ORDER BY `" JOB_ID_COLUMN_NAME "`\n" + "LIMIT $max_count_jobs, 1\n" + ");\n" + ); + + InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), startTime + Config.IdempotencyKeyTtl); + + if (request.content().acl().visibility() == oldVisibility) { + writeQueryBuilder.AddInt64("visibility", query.content().acl().visibility()); + // move jobs to scope + writeQueryBuilder.AddText( + "UPDATE `" JOBS_TABLE_NAME "` SET `" VISIBILITY_COLUMN_NAME "` = $visibility\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + ); + } + + if (request.execute_mode() != YandexQuery::SAVE) { + writeQueryBuilder.AddString("job", job.SerializeAsString()); + writeQueryBuilder.AddString("user", user); + writeQueryBuilder.AddTimestamp("zero_timestamp", TInstant::Zero()); + writeQueryBuilder.AddTimestamp("now", TInstant::Now()); + // insert job + writeQueryBuilder.AddText( "UPSERT INTO `" JOBS_TABLE_NAME "` (`" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`, `" JOB_ID_COLUMN_NAME "`, `" JOB_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`) VALUES\n" " ($scope, $query_id, $job_id, $job, $user, $visibility);\n" - ); - - // insert pending small - writeQueryBuilder.AddText( - "INSERT INTO `" PENDING_SMALL_TABLE_NAME "`\n" + ); + + // insert pending small + writeQueryBuilder.AddText( + "INSERT INTO `" PENDING_SMALL_TABLE_NAME "`\n" " (`" SCOPE_COLUMN_NAME "`, `" QUERY_ID_COLUMN_NAME "`, `" LAST_SEEN_AT_COLUMN_NAME "`, `" RETRY_COUNTER_COLUMN_NAME "`, \n" " `" RETRY_COUNTER_UPDATE_COLUMN_NAME "`, `" QUERY_TYPE_COLUMN_NAME "`, `" HOST_NAME_COLUMN_NAME "`, `" OWNER_COLUMN_NAME "`)\n" - "VALUES\n" + "VALUES\n" " ($scope, $query_id, $zero_timestamp, 0, $now, $query_type, \"\", \"\");\n" - ); - } - - writeQueryBuilder.AddText( - "DELETE FROM `" JOBS_TABLE_NAME "` ON\n" - "SELECT * FROM $to_delete;\n" + ); + } + + writeQueryBuilder.AddText( + "DELETE FROM `" JOBS_TABLE_NAME "` ON\n" + "SELECT * FROM $to_delete;\n" "UPDATE `" QUERIES_TABLE_NAME "` SET \n" " `" LAST_JOB_ID_COLUMN_NAME "` = $job_id, `" VISIBILITY_COLUMN_NAME "` = $visibility, `" AUTOMATIC_COLUMN_NAME "` = $automatic,\n" " `" NAME_COLUMN_NAME "` = $name, `" EXECUTE_MODE_COLUMN_NAME "` = $execute_mode,\n" @@ -933,29 +933,29 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyQuery writeQueryBuilder.AddText( " `" QUERY_TYPE_COLUMN_NAME "` = $query_type, `" QUERY_COLUMN_NAME "` = $query,\n" " `" RESULT_ID_COLUMN_NAME "` = $result_id, `" META_REVISION_COLUMN_NAME "` = `" META_REVISION_COLUMN_NAME "` + 1\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;" - ); - - const auto write = writeQueryBuilder.Build(); - return make_pair(write.Sql, write.Params); - }; - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - auto accessValidator = CreateManageAccessValidator( - QUERIES_TABLE_NAME, - QUERY_ID_COLUMN_NAME, - scope, - queryId, - user, - "Query does not exist or permission denied. Please check the id query or your access rights", - permissions, - YdbConnection->TablePathPrefix); - validators.push_back(accessValidator); - + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;" + ); + + const auto write = writeQueryBuilder.Build(); + return make_pair(write.Sql, write.Params); + }; + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + auto accessValidator = CreateManageAccessValidator( + QUERIES_TABLE_NAME, + QUERY_ID_COLUMN_NAME, + scope, + queryId, + user, + "Query does not exist or permission denied. Please check the id query or your access rights", + permissions, + YdbConnection->TablePathPrefix); + validators.push_back(accessValidator); + auto ttlValidator = CreateTtlValidator( QUERIES_TABLE_NAME, QUERY_ID_COLUMN_NAME, @@ -965,468 +965,468 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvModifyQuery YdbConnection->TablePathPrefix); validators.push_back(ttlValidator); - if (previousRevision > 0) { - auto revisionValidator = CreateRevisionValidator( - QUERIES_TABLE_NAME, - QUERY_ID_COLUMN_NAME, - scope, - queryId, - previousRevision, - "Revision of the query has been changed already. Please restart the request with a new revision", - YdbConnection->TablePathPrefix); - validators.push_back(revisionValidator); - } - - const auto read = readQueryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), read.Sql, read.Params, prepareParams, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvModifyQueryResponse, YandexQuery::ModifyQueryResult, TAuditDetails<YandexQuery::Query>>( - MakeLogPrefix(scope, user, queryId) + "ModifyQueryRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ModifyQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDeleteQueryRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_QUERY]; - requestCounters->InFly->Inc(); - - const YandexQuery::DeleteQueryRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const TString queryId = request.query_id(); - const int byteSize = request.ByteSize(); - const int64_t previousRevision = request.previous_revision(); - const TString idempotencyKey = request.idempotency_key(); - - CPS_LOG_T(MakeLogPrefix(scope, user, queryId) - << "DeleteQueryRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, queryId) - << "DeleteQueryRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvDeleteQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(DeleteQueryRequest, scope, queryId, user, delta, byteSize, false); + if (previousRevision > 0) { + auto revisionValidator = CreateRevisionValidator( + QUERIES_TABLE_NAME, + QUERY_ID_COLUMN_NAME, + scope, + queryId, + previousRevision, + "Revision of the query has been changed already. Please restart the request with a new revision", + YdbConnection->TablePathPrefix); + validators.push_back(revisionValidator); + } + + const auto read = readQueryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), read.Sql, read.Params, prepareParams, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvModifyQueryResponse, YandexQuery::ModifyQueryResult, TAuditDetails<YandexQuery::Query>>( + MakeLogPrefix(scope, user, queryId) + "ModifyQueryRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ModifyQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDeleteQueryRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_DELETE_QUERY]; + requestCounters->InFly->Inc(); + + const YandexQuery::DeleteQueryRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const TString queryId = request.query_id(); + const int byteSize = request.ByteSize(); + const int64_t previousRevision = request.previous_revision(); + const TString idempotencyKey = request.idempotency_key(); + + CPS_LOG_T(MakeLogPrefix(scope, user, queryId) + << "DeleteQueryRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, queryId) + << "DeleteQueryRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvDeleteQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(DeleteQueryRequest, scope, queryId, user, delta, byteSize, false); return; - } - std::shared_ptr<std::pair<YandexQuery::DeleteQueryResult, TAuditDetails<YandexQuery::Query>>> response = std::make_shared<std::pair<YandexQuery::DeleteQueryResult, TAuditDetails<YandexQuery::Query>>>(); + } + std::shared_ptr<std::pair<YandexQuery::DeleteQueryResult, TAuditDetails<YandexQuery::Query>>> response = std::make_shared<std::pair<YandexQuery::DeleteQueryResult, TAuditDetails<YandexQuery::Query>>>(); TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "DeleteQuery"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("query_id", queryId); - - InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); - queryBuilder.AddText( - "DELETE FROM `" JOBS_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("query_id", queryId); + + InsertIdempotencyKey(queryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), TInstant::Now() + Config.IdempotencyKeyTtl); + queryBuilder.AddText( + "DELETE FROM `" JOBS_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" "DELETE FROM `" PENDING_SMALL_TABLE_NAME "`\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - "DELETE FROM `" QUERIES_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;" - ); - - TVector<TValidationQuery> validators; - - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - auto accessValidator = CreateManageAccessValidator( - QUERIES_TABLE_NAME, - QUERY_ID_COLUMN_NAME, - scope, - queryId, - user, - "Query does not exist or permission denied. Please check the id query or your access rights", - permissions, - YdbConnection->TablePathPrefix); - validators.push_back(accessValidator); - - if (previousRevision > 0) { - auto revisionValidator = CreateRevisionValidator( - QUERIES_TABLE_NAME, - QUERY_ID_COLUMN_NAME, - scope, - queryId, - previousRevision, - "Revision of the query has been changed already. Please restart the request with a new revision", - YdbConnection->TablePathPrefix); - validators.push_back(revisionValidator); - } - - validators.push_back(CreateEntityExtractor( - scope, - queryId, - QUERY_COLUMN_NAME, - QUERY_ID_COLUMN_NAME, - QUERIES_TABLE_NAME, - response, - YdbConnection->TablePathPrefix)); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvDeleteQueryResponse, YandexQuery::DeleteQueryResult, TAuditDetails<YandexQuery::Query>>( - MakeLogPrefix(scope, user, queryId) + "DeleteQueryRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(DeleteQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvControlQueryRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_CONTROL_QUERY]; - requestCounters->InFly->Inc(); - - const YandexQuery::ControlQueryRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const TString queryId = request.query_id(); - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::MANAGE_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int byteSize = request.ByteSize(); - const int64_t previousRevision = request.previous_revision(); - const TString idempotencyKey = request.idempotency_key(); - const YandexQuery::QueryAction action = request.action(); - CPS_LOG_T(MakeLogPrefix(scope, user, queryId) - << "ControlQueryRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, queryId) - << "ControlQueryRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvControlQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ControlQueryRequest, scope, user, queryId, delta, byteSize, false); + "DELETE FROM `" QUERIES_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;" + ); + + TVector<TValidationQuery> validators; + + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + auto accessValidator = CreateManageAccessValidator( + QUERIES_TABLE_NAME, + QUERY_ID_COLUMN_NAME, + scope, + queryId, + user, + "Query does not exist or permission denied. Please check the id query or your access rights", + permissions, + YdbConnection->TablePathPrefix); + validators.push_back(accessValidator); + + if (previousRevision > 0) { + auto revisionValidator = CreateRevisionValidator( + QUERIES_TABLE_NAME, + QUERY_ID_COLUMN_NAME, + scope, + queryId, + previousRevision, + "Revision of the query has been changed already. Please restart the request with a new revision", + YdbConnection->TablePathPrefix); + validators.push_back(revisionValidator); + } + + validators.push_back(CreateEntityExtractor( + scope, + queryId, + QUERY_COLUMN_NAME, + QUERY_ID_COLUMN_NAME, + QUERIES_TABLE_NAME, + response, + YdbConnection->TablePathPrefix)); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto result = Write(NActors::TActivationContext::ActorSystem(), query.Sql, query.Params, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvDeleteQueryResponse, YandexQuery::DeleteQueryResult, TAuditDetails<YandexQuery::Query>>( + MakeLogPrefix(scope, user, queryId) + "DeleteQueryRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(DeleteQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvControlQueryRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_CONTROL_QUERY]; + requestCounters->InFly->Inc(); + + const YandexQuery::ControlQueryRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const TString queryId = request.query_id(); + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::MANAGE_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int byteSize = request.ByteSize(); + const int64_t previousRevision = request.previous_revision(); + const TString idempotencyKey = request.idempotency_key(); + const YandexQuery::QueryAction action = request.action(); + CPS_LOG_T(MakeLogPrefix(scope, user, queryId) + << "ControlQueryRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, queryId) + << "ControlQueryRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvControlQueryResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ControlQueryRequest, scope, user, queryId, delta, byteSize, false); return; - } - - std::shared_ptr<std::pair<YandexQuery::ControlQueryResult, TAuditDetails<YandexQuery::Query>>> response = std::make_shared<std::pair<YandexQuery::ControlQueryResult, TAuditDetails<YandexQuery::Query>>>(); - + } + + std::shared_ptr<std::pair<YandexQuery::ControlQueryResult, TAuditDetails<YandexQuery::Query>>> response = std::make_shared<std::pair<YandexQuery::ControlQueryResult, TAuditDetails<YandexQuery::Query>>>(); + TSqlQueryBuilder readQueryBuilder(YdbConnection->TablePathPrefix, "ControlQuery(read)"); - readQueryBuilder.AddString("scope", scope); - readQueryBuilder.AddString("query_id", queryId); - - readQueryBuilder.AddText( - "$selected = SELECT `" QUERY_COLUMN_NAME "`, `" LAST_JOB_ID_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" - "$job_id = SELECT `" LAST_JOB_ID_COLUMN_NAME "` FROM $selected;\n" - "SELECT * FROM $selected;" - "SELECT `" JOB_COLUMN_NAME "` FROM `" JOBS_TABLE_NAME "`\n" + readQueryBuilder.AddString("scope", scope); + readQueryBuilder.AddString("query_id", queryId); + + readQueryBuilder.AddText( + "$selected = SELECT `" QUERY_COLUMN_NAME "`, `" LAST_JOB_ID_COLUMN_NAME "`, `" INTERNAL_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + "$job_id = SELECT `" LAST_JOB_ID_COLUMN_NAME "` FROM $selected;\n" + "SELECT * FROM $selected;" + "SELECT `" JOB_COLUMN_NAME "` FROM `" JOBS_TABLE_NAME "`\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" JOB_ID_COLUMN_NAME "` = $job_id;\n" - ); - - auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { + ); + + auto prepareParams = [=, config=Config](const TVector<TResultSet>& resultSets) { if (resultSets.size() != 2) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 2 but equal " << resultSets.size() << ". Please contact internal support"; - } - - auto now = TInstant::Now(); - YandexQuery::Query query; - YandexQuery::Internal::QueryInternal queryInternal; - { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 2 but equal " << resultSets.size() << ". Please contact internal support"; + } + + auto now = TInstant::Now(); + YandexQuery::Query query; + YandexQuery::Internal::QueryInternal queryInternal; + { TResultSetParser parser(resultSets[0]); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - - if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; - } - - if (!queryInternal.ParseFromString(*parser.ColumnParser(INTERNAL_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query internal. Please contact internal support"; - } - } - - YandexQuery::Job job; - TString jobId; - { + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + + if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; + } + + if (!queryInternal.ParseFromString(*parser.ColumnParser(INTERNAL_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query internal. Please contact internal support"; + } + } + + YandexQuery::Job job; + TString jobId; + { TResultSetParser parser(resultSets[1]); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Job does not exist or permission denied. Please check the id query or your access rights"; - } - - if (!job.ParseFromString(parser.ColumnParser(JOB_COLUMN_NAME).GetOptionalString().GetOrElse(""))) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for job. Please contact internal support"; - } - - jobId = job.meta().id(); - - const bool hasManageAccess = HasManageAccess(permissions, query.content().acl().visibility(), query.meta().common().created_by(), user); - if (!hasManageAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - } - - queryInternal.set_action(action); - + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Job does not exist or permission denied. Please check the id query or your access rights"; + } + + if (!job.ParseFromString(parser.ColumnParser(JOB_COLUMN_NAME).GetOptionalString().GetOrElse(""))) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for job. Please contact internal support"; + } + + jobId = job.meta().id(); + + const bool hasManageAccess = HasManageAccess(permissions, query.content().acl().visibility(), query.meta().common().created_by(), user); + if (!hasManageAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + } + + queryInternal.set_action(action); + auto& metaQuery = *query.mutable_meta(); auto& commonQuery = *metaQuery.mutable_common(); commonQuery.set_revision(commonQuery.revision() + 1); commonQuery.set_modified_by(user); *commonQuery.mutable_modified_at() = NProtoInterop::CastToProto(now); - if (action == YandexQuery::ABORT || action == YandexQuery::ABORT_GRACEFULLY) { - const bool isValidStatusForAbort = IsIn({ - YandexQuery::QueryMeta::STARTING, - YandexQuery::QueryMeta::RESUMING, - YandexQuery::QueryMeta::RUNNING, - YandexQuery::QueryMeta::PAUSING + if (action == YandexQuery::ABORT || action == YandexQuery::ABORT_GRACEFULLY) { + const bool isValidStatusForAbort = IsIn({ + YandexQuery::QueryMeta::STARTING, + YandexQuery::QueryMeta::RESUMING, + YandexQuery::QueryMeta::RUNNING, + YandexQuery::QueryMeta::PAUSING }, metaQuery.status()); - if (isValidStatusForAbort) { + if (isValidStatusForAbort) { metaQuery.set_status(YandexQuery::QueryMeta::ABORTING_BY_USER); metaQuery.set_aborted_by(user); - } else { + } else { ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Conversion from status " << YandexQuery::QueryMeta::ComputeStatus_Name(metaQuery.status()) << " to " << YandexQuery::QueryMeta::ComputeStatus_Name(YandexQuery::QueryMeta::ABORTING_BY_USER) << " is not possible. Please wait for the previous operation to be completed"; - } - } - - if (action == YandexQuery::PAUSE || action == YandexQuery::PAUSE_GRACEFULLY) { - const bool isValidStatusForPause = IsIn({ - YandexQuery::QueryMeta::RESUMING, - YandexQuery::QueryMeta::RUNNING + } + } + + if (action == YandexQuery::PAUSE || action == YandexQuery::PAUSE_GRACEFULLY) { + const bool isValidStatusForPause = IsIn({ + YandexQuery::QueryMeta::RESUMING, + YandexQuery::QueryMeta::RUNNING }, metaQuery.status()); - if (isValidStatusForPause) { + if (isValidStatusForPause) { metaQuery.set_status(YandexQuery::QueryMeta::PAUSING); metaQuery.set_paused_by(user); - } else { + } else { ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Conversion from status " << YandexQuery::QueryMeta::ComputeStatus_Name(metaQuery.status()) << " to " << YandexQuery::QueryMeta::ComputeStatus_Name(YandexQuery::QueryMeta::PAUSING) << " is not possible. Please wait for the previous operation to be completed"; - } - } - - if (action == YandexQuery::RESUME) { + } + } + + if (action == YandexQuery::RESUME) { const bool isValidStatusForResume = metaQuery.status() == YandexQuery::QueryMeta::PAUSED; - if (isValidStatusForResume) { + if (isValidStatusForResume) { metaQuery.set_status(YandexQuery::QueryMeta::RESUMING); - } else { + } else { ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Conversion from status " << YandexQuery::QueryMeta::ComputeStatus_Name(metaQuery.status()) << " to " << YandexQuery::QueryMeta::ComputeStatus_Name(YandexQuery::QueryMeta::RESUMING) << " is not possible. Please wait for the previous operation to be completed"; - } - } - + } + } + job.mutable_query_meta()->CopyFrom(metaQuery); - job.mutable_meta()->set_revision(job.meta().revision() + 1); - job.mutable_meta()->set_modified_by(user); + job.mutable_meta()->set_revision(job.meta().revision() + 1); + job.mutable_meta()->set_modified_by(user); *job.mutable_meta()->mutable_modified_at() = NProtoInterop::CastToProto(now); - response->second.After.ConstructInPlace().CopyFrom(query); - response->second.CloudId = queryInternal.cloud_id(); - + response->second.After.ConstructInPlace().CopyFrom(query); + response->second.CloudId = queryInternal.cloud_id(); + TSqlQueryBuilder writeQueryBuilder(YdbConnection->TablePathPrefix, "ControlQuery(write)"); - writeQueryBuilder.AddString("scope", scope); - writeQueryBuilder.AddString("job", job.SerializeAsString()); - writeQueryBuilder.AddString("job_id", jobId); - writeQueryBuilder.AddString("query_id", queryId); - writeQueryBuilder.AddString("query", query.SerializeAsString()); - writeQueryBuilder.AddInt64("revision", query.meta().common().revision()); - writeQueryBuilder.AddInt64("status", query.meta().status()); - writeQueryBuilder.AddString("internal", queryInternal.SerializeAsString()); - - InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), now + Config.IdempotencyKeyTtl); - writeQueryBuilder.AddText( - "UPDATE `" JOBS_TABLE_NAME "` SET `" JOB_COLUMN_NAME "` = $job\n" + writeQueryBuilder.AddString("scope", scope); + writeQueryBuilder.AddString("job", job.SerializeAsString()); + writeQueryBuilder.AddString("job_id", jobId); + writeQueryBuilder.AddString("query_id", queryId); + writeQueryBuilder.AddString("query", query.SerializeAsString()); + writeQueryBuilder.AddInt64("revision", query.meta().common().revision()); + writeQueryBuilder.AddInt64("status", query.meta().status()); + writeQueryBuilder.AddString("internal", queryInternal.SerializeAsString()); + + InsertIdempotencyKey(writeQueryBuilder, scope, idempotencyKey, response->first.SerializeAsString(), now + Config.IdempotencyKeyTtl); + writeQueryBuilder.AddText( + "UPDATE `" JOBS_TABLE_NAME "` SET `" JOB_COLUMN_NAME "` = $job\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND `" JOB_ID_COLUMN_NAME "` = $job_id;\n" "UPDATE `" QUERIES_TABLE_NAME "` SET `" QUERY_COLUMN_NAME "` = $query, `" REVISION_COLUMN_NAME "` = $revision, `" STATUS_COLUMN_NAME "` = $status, `" INTERNAL_COLUMN_NAME "` = $internal, `" META_REVISION_COLUMN_NAME "` = `" META_REVISION_COLUMN_NAME "` + 1\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;\n" "UPDATE `" PENDING_SMALL_TABLE_NAME "` SET `" HOST_NAME_COLUMN_NAME "` = \"\"\n" - "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;" - ); - - const auto writeQuery = writeQueryBuilder.Build(); - return make_pair(writeQuery.Sql, writeQuery.Params); - }; - - TVector<TValidationQuery> validators; - if (idempotencyKey) { - validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); - } - - auto accessValidator = CreateManageAccessValidator( - QUERIES_TABLE_NAME, - QUERY_ID_COLUMN_NAME, - scope, - queryId, - user, - "Query does not exist or permission denied. Please check the id query or your access rights", - permissions, - YdbConnection->TablePathPrefix); - validators.push_back(accessValidator); - - if (previousRevision > 0) { - auto revisionValidator = CreateRevisionValidator( - QUERIES_TABLE_NAME, - QUERY_ID_COLUMN_NAME, - scope, - queryId, - previousRevision, - "Revision of the query has been changed already. Please restart the request with a new revision", - YdbConnection->TablePathPrefix); - validators.push_back(revisionValidator); - } - - const auto readQuery = readQueryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo, validators); - auto prepare = [response] { return *response; }; - auto success = SendAuditResponse<TEvControlPlaneStorage::TEvControlQueryResponse, YandexQuery::ControlQueryResult, TAuditDetails<YandexQuery::Query>>( - MakeLogPrefix(scope, user, queryId) + "ControlQueryRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ControlQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetResultDataRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_GET_RESULT_DATA]; - requestCounters->InFly->Inc(); - - const YandexQuery::GetResultDataRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - const int32_t resultSetIndex = request.result_set_index(); - const int64_t offset = request.offset(); - const TString queryId = request.query_id(); - const int byteSize = ev->Get()->Request.ByteSize(); - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int64_t limit = request.limit(); - CPS_LOG_T(MakeLogPrefix(scope, user, queryId) - << "GetResultDataRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, queryId) - << "GetResultDataRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvGetResultDataResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(GetResultDataRequest, scope, user, queryId, resultSetIndex, offset, limit, delta, byteSize, false); - return; - } - + "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id;" + ); + + const auto writeQuery = writeQueryBuilder.Build(); + return make_pair(writeQuery.Sql, writeQuery.Params); + }; + + TVector<TValidationQuery> validators; + if (idempotencyKey) { + validators.push_back(CreateIdempotencyKeyValidator(scope, idempotencyKey, response, YdbConnection->TablePathPrefix)); + } + + auto accessValidator = CreateManageAccessValidator( + QUERIES_TABLE_NAME, + QUERY_ID_COLUMN_NAME, + scope, + queryId, + user, + "Query does not exist or permission denied. Please check the id query or your access rights", + permissions, + YdbConnection->TablePathPrefix); + validators.push_back(accessValidator); + + if (previousRevision > 0) { + auto revisionValidator = CreateRevisionValidator( + QUERIES_TABLE_NAME, + QUERY_ID_COLUMN_NAME, + scope, + queryId, + previousRevision, + "Revision of the query has been changed already. Please restart the request with a new revision", + YdbConnection->TablePathPrefix); + validators.push_back(revisionValidator); + } + + const auto readQuery = readQueryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto result = ReadModifyWrite(NActors::TActivationContext::ActorSystem(), readQuery.Sql, readQuery.Params, prepareParams, requestCounters, debugInfo, validators); + auto prepare = [response] { return *response; }; + auto success = SendAuditResponse<TEvControlPlaneStorage::TEvControlQueryResponse, YandexQuery::ControlQueryResult, TAuditDetails<YandexQuery::Query>>( + MakeLogPrefix(scope, user, queryId) + "ControlQueryRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ControlQueryRequest, scope, user, queryId, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetResultDataRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_GET_RESULT_DATA]; + requestCounters->InFly->Inc(); + + const YandexQuery::GetResultDataRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + const int32_t resultSetIndex = request.result_set_index(); + const int64_t offset = request.offset(); + const TString queryId = request.query_id(); + const int byteSize = ev->Get()->Request.ByteSize(); + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int64_t limit = request.limit(); + CPS_LOG_T(MakeLogPrefix(scope, user, queryId) + << "GetResultDataRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, queryId) + << "GetResultDataRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvGetResultDataResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(GetResultDataRequest, scope, user, queryId, resultSetIndex, offset, limit, delta, byteSize, false); + return; + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "GetResultData"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("query_id", queryId); - queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddInt64("offset", offset); - queryBuilder.AddInt32("result_set_index", resultSetIndex); - queryBuilder.AddUint64("limit", limit); - - queryBuilder.AddText( + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("query_id", queryId); + queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddInt64("offset", offset); + queryBuilder.AddInt32("result_set_index", resultSetIndex); + queryBuilder.AddUint64("limit", limit); + + queryBuilder.AddText( "$query_info = SELECT `" RESULT_ID_COLUMN_NAME "`, `" RESULT_SETS_EXPIRE_AT_COLUMN_NAME "`, `" QUERY_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" STATUS_COLUMN_NAME "` FROM `" QUERIES_TABLE_NAME "`\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);\n" "SELECT `" QUERY_COLUMN_NAME "`, `" USER_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "`, `" STATUS_COLUMN_NAME "`, `" RESULT_SETS_EXPIRE_AT_COLUMN_NAME "` FROM $query_info;\n" "$result_id = SELECT `" RESULT_ID_COLUMN_NAME "` FROM $query_info\n" "WHERE `" RESULT_SETS_EXPIRE_AT_COLUMN_NAME "` >= $now;\n" - "SELECT `" RESULT_SET_ID_COLUMN_NAME "`, `" RESULT_SET_COLUMN_NAME "`, `" ROW_ID_COLUMN_NAME "` FROM `" RESULT_SETS_TABLE_NAME "`\n" + "SELECT `" RESULT_SET_ID_COLUMN_NAME "`, `" RESULT_SET_COLUMN_NAME "`, `" ROW_ID_COLUMN_NAME "` FROM `" RESULT_SETS_TABLE_NAME "`\n" "WHERE `" RESULT_ID_COLUMN_NAME "` = $result_id AND `" RESULT_SET_ID_COLUMN_NAME "` = $result_set_index AND `" ROW_ID_COLUMN_NAME "` >= $offset\n" - "ORDER BY `" ROW_ID_COLUMN_NAME "`\n" + "ORDER BY `" ROW_ID_COLUMN_NAME "`\n" "LIMIT $limit;\n" - ); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + ); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); auto prepare = [resultSets=resultSets, resultSetIndex, user, permissions] { - if (resultSets->size() != 2) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 2 but equal " << resultSets->size() << ". Please contact internal support"; - } - - YandexQuery::GetResultDataResult result; - auto& resultSetProto = *result.mutable_result_set(); - { - const auto& resultSet = (*resultSets)[0]; - TResultSetParser parser(resultSet); - if (!parser.TryNextRow()) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - - YandexQuery::Query query; - if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; - } - - YandexQuery::Acl::Visibility queryVisibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); - TString queryUser = parser.ColumnParser(USER_COLUMN_NAME).GetOptionalString().GetOrElse(""); - - bool hasViewAccess = HasViewAccess(permissions, queryVisibility, queryUser, user); - if (!hasViewAccess) { - ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; - } - - if (resultSetIndex >= query.result_set_meta_size()) { - ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Result set index out of bound: " << resultSetIndex << " >= " << query.result_set_meta_size(); - } - + if (resultSets->size() != 2) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 2 but equal " << resultSets->size() << ". Please contact internal support"; + } + + YandexQuery::GetResultDataResult result; + auto& resultSetProto = *result.mutable_result_set(); + { + const auto& resultSet = (*resultSets)[0]; + TResultSetParser parser(resultSet); + if (!parser.TryNextRow()) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + + YandexQuery::Query query; + if (!query.ParseFromString(*parser.ColumnParser(QUERY_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for query. Please contact internal support"; + } + + YandexQuery::Acl::Visibility queryVisibility = static_cast<YandexQuery::Acl::Visibility>(parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64().GetOrElse(YandexQuery::Acl::VISIBILITY_UNSPECIFIED)); + TString queryUser = parser.ColumnParser(USER_COLUMN_NAME).GetOptionalString().GetOrElse(""); + + bool hasViewAccess = HasViewAccess(permissions, queryVisibility, queryUser, user); + if (!hasViewAccess) { + ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Query does not exist or permission denied. Please check the id query or your access rights"; + } + + if (resultSetIndex >= query.result_set_meta_size()) { + ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Result set index out of bound: " << resultSetIndex << " >= " << query.result_set_meta_size(); + } + if (YandexQuery::QueryMeta::ComputeStatus(*parser.ColumnParser(STATUS_COLUMN_NAME).GetOptionalInt64()) != YandexQuery::QueryMeta::COMPLETED) { ythrow TControlPlaneStorageException(TIssuesIds::BAD_REQUEST) << "Result doesn't exist"; } @@ -1440,175 +1440,175 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvGetResultDa ythrow TControlPlaneStorageException(TIssuesIds::EXPIRED) << "Result removed by TTL"; } - resultSetProto.mutable_columns()->CopyFrom(query.result_set_meta(resultSetIndex).column()); - } - - { - const auto& resultSet = (*resultSets)[1]; - TResultSetParser parser(resultSet); - while (parser.TryNextRow()) { - if (!resultSetProto.add_rows()->ParseFromString(*parser.ColumnParser(RESULT_SET_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for row. Please contact internal support"; - } - } - } - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvGetResultDataResponse, YandexQuery::GetResultDataResult>( - MakeLogPrefix(scope, user, queryId) + "GetResultDataRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(GetResultDataRequest, scope, user, queryId, resultSetIndex, offset, limit, delta, byteSize, future.GetValue()); - }); -} - -void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListJobsRequest::TPtr& ev) -{ - TInstant startTime = TInstant::Now(); - TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_JOBS_DATA]; - requestCounters->InFly->Inc(); - - const YandexQuery::ListJobsRequest& request = ev->Get()->Request; - const TString scope = ev->Get()->Scope; - const TString user = ev->Get()->User; - TString queryId = request.query_id(); // TODO: remove it - if (request.has_filter() && request.filter().query_id()) { - queryId = request.filter().query_id(); - } + resultSetProto.mutable_columns()->CopyFrom(query.result_set_meta(resultSetIndex).column()); + } + + { + const auto& resultSet = (*resultSets)[1]; + TResultSetParser parser(resultSet); + while (parser.TryNextRow()) { + if (!resultSetProto.add_rows()->ParseFromString(*parser.ColumnParser(RESULT_SET_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for row. Please contact internal support"; + } + } + } + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvGetResultDataResponse, YandexQuery::GetResultDataResult>( + MakeLogPrefix(scope, user, queryId) + "GetResultDataRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(GetResultDataRequest, scope, user, queryId, resultSetIndex, offset, limit, delta, byteSize, future.GetValue()); + }); +} + +void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvListJobsRequest::TPtr& ev) +{ + TInstant startTime = TInstant::Now(); + TRequestCountersPtr requestCounters = Counters.Requests[RT_LIST_JOBS_DATA]; + requestCounters->InFly->Inc(); + + const YandexQuery::ListJobsRequest& request = ev->Get()->Request; + const TString scope = ev->Get()->Scope; + const TString user = ev->Get()->User; + TString queryId = request.query_id(); // TODO: remove it + if (request.has_filter() && request.filter().query_id()) { + queryId = request.filter().query_id(); + } auto splittedPageToken = SplitId(request.page_token()); const auto jobIdToken = std::move(splittedPageToken.first); const auto queryIdToken = std::move(splittedPageToken.second); - const int byteSize = ev->Get()->Request.ByteSize(); - const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - const int64_t limit = request.limit(); - CPS_LOG_T(MakeLogPrefix(scope, user, queryId) - << "ListJobsRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); - - NYql::TIssues issues = ValidateEvent(ev); - if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, queryId) - << "ListJobsRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvListJobsResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); - LWPROBE(ListJobsRequest, scope, user, queryId, delta, byteSize, false); + const int byteSize = ev->Get()->Request.ByteSize(); + const TString token = ev->Get()->Token; + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + const int64_t limit = request.limit(); + CPS_LOG_T(MakeLogPrefix(scope, user, queryId) + << "ListJobsRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); + + NYql::TIssues issues = ValidateEvent(ev); + if (issues) { + CPS_LOG_D(MakeLogPrefix(scope, user, queryId) + << "ListJobsRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvListJobsResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + LWPROBE(ListJobsRequest, scope, user, queryId, delta, byteSize, false); return; - } - + } + TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "ListJobs"); - queryBuilder.AddString("scope", scope); + queryBuilder.AddString("scope", scope); queryBuilder.AddString("last_job", jobIdToken); queryBuilder.AddString("last_query", queryIdToken); - queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddUint64("limit", limit + 1); - queryBuilder.AddText( - "SELECT `" JOB_ID_COLUMN_NAME "`, `" JOB_COLUMN_NAME "` FROM `" JOBS_TABLE_NAME "`\n" + queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddUint64("limit", limit + 1); + queryBuilder.AddText( + "SELECT `" JOB_ID_COLUMN_NAME "`, `" JOB_COLUMN_NAME "` FROM `" JOBS_TABLE_NAME "`\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` >= $last_query\n" "AND `" JOB_ID_COLUMN_NAME "` >= $last_job AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now) " - ); - - TString filter; - if (request.has_filter() || queryId) { - TVector<TString> filters; - if (queryId) { - queryBuilder.AddString("query_id", queryId); - filters.push_back("`" QUERY_ID_COLUMN_NAME "` = $query_id"); - } - - if (request.filter().created_by_me()) { - queryBuilder.AddString("user", user); - filters.push_back("`" USER_COLUMN_NAME "` = $user"); - } - + ); + + TString filter; + if (request.has_filter() || queryId) { + TVector<TString> filters; + if (queryId) { + queryBuilder.AddString("query_id", queryId); + filters.push_back("`" QUERY_ID_COLUMN_NAME "` = $query_id"); + } + + if (request.filter().created_by_me()) { + queryBuilder.AddString("user", user); + filters.push_back("`" USER_COLUMN_NAME "` = $user"); + } + filter = JoinSeq(" AND ", filters); - } - - PrepareViewAccessCondition(queryBuilder, permissions, user); - - if (filter) { - queryBuilder.AddText(" AND (" + filter + ")\n"); - } - - queryBuilder.AddText( - "ORDER BY `" JOB_ID_COLUMN_NAME "`\n" - "LIMIT $limit;" - ); - - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); - auto prepare = [resultSets=resultSets, limit] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; - } - - YandexQuery::ListJobsResult result; - TResultSetParser parser(resultSets->front()); - while (parser.TryNextRow()) { - YandexQuery::Job job; - if (!job.ParseFromString(*parser.ColumnParser(JOB_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for job. Please contact internal support"; - } + } + + PrepareViewAccessCondition(queryBuilder, permissions, user); + + if (filter) { + queryBuilder.AddText(" AND (" + filter + ")\n"); + } + + queryBuilder.AddText( + "ORDER BY `" JOB_ID_COLUMN_NAME "`\n" + "LIMIT $limit;" + ); + + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + auto prepare = [resultSets=resultSets, limit] { + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + } + + YandexQuery::ListJobsResult result; + TResultSetParser parser(resultSets->front()); + while (parser.TryNextRow()) { + YandexQuery::Job job; + if (!job.ParseFromString(*parser.ColumnParser(JOB_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for job. Please contact internal support"; + } const TString mergedId = job.meta().id() + "-" + job.query_meta().common().id(); job.mutable_meta()->set_id(mergedId); job.mutable_query_meta()->set_last_job_id(mergedId); - YandexQuery::BriefJob briefJob; - *briefJob.mutable_meta() = job.meta(); - *briefJob.mutable_query_meta() = job.query_meta(); - briefJob.set_query_name(job.query_name()); - briefJob.set_visibility(job.acl().visibility()); - briefJob.set_automatic(job.automatic()); + YandexQuery::BriefJob briefJob; + *briefJob.mutable_meta() = job.meta(); + *briefJob.mutable_query_meta() = job.query_meta(); + briefJob.set_query_name(job.query_name()); + briefJob.set_visibility(job.acl().visibility()); + briefJob.set_automatic(job.automatic()); *briefJob.mutable_expire_at() = job.expire_at(); - *result.add_job() = briefJob; - } - - if (result.job_size() == limit + 1) { + *result.add_job() = briefJob; + } + + if (result.job_size() == limit + 1) { result.set_next_page_token( result.job(result.job_size() - 1).meta().id() + "-" + result.job(result.job_size() - 1).query_meta().common().id()); - result.mutable_job()->RemoveLast(); - } - return result; - }; - - auto success = SendResponse<TEvControlPlaneStorage::TEvListJobsResponse, YandexQuery::ListJobsResult>( - MakeLogPrefix(scope, user, queryId) + "ListJobsRequest", - NActors::TActivationContext::ActorSystem(), - result, - SelfId(), - ev, - startTime, - requestCounters, - prepare, - debugInfo); - - success.Apply([=](const auto& future) { - TDuration delta = TInstant::Now() - startTime; - LWPROBE(ListJobsRequest, scope, user, queryId, delta, byteSize, future.GetValue()); - }); -} - + result.mutable_job()->RemoveLast(); + } + return result; + }; + + auto success = SendResponse<TEvControlPlaneStorage::TEvListJobsResponse, YandexQuery::ListJobsResult>( + MakeLogPrefix(scope, user, queryId) + "ListJobsRequest", + NActors::TActivationContext::ActorSystem(), + result, + SelfId(), + ev, + startTime, + requestCounters, + prepare, + debugInfo); + + success.Apply([=](const auto& future) { + TDuration delta = TInstant::Now() - startTime; + LWPROBE(ListJobsRequest, scope, user, queryId, delta, byteSize, future.GetValue()); + }); +} + void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeJobRequest::TPtr& ev) { TInstant startTime = TInstant::Now(); @@ -1625,63 +1625,63 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeJob const int byteSize = ev->Get()->Request.ByteSize(); const TString token = ev->Get()->Token; - TPermissions permissions = Config.Proto.GetEnablePermissions() - ? ev->Get()->Permissions - : TPermissions{TPermissions::VIEW_PUBLIC}; - if (IsSuperUser(user)) { - permissions.SetAll(); - } - CPS_LOG_T(MakeLogPrefix(scope, user, jobId) - << "DescribeJobRequest: " - << NKikimr::MaskTicket(token) << " " - << request.DebugString()); + TPermissions permissions = Config.Proto.GetEnablePermissions() + ? ev->Get()->Permissions + : TPermissions{TPermissions::VIEW_PUBLIC}; + if (IsSuperUser(user)) { + permissions.SetAll(); + } + CPS_LOG_T(MakeLogPrefix(scope, user, jobId) + << "DescribeJobRequest: " + << NKikimr::MaskTicket(token) << " " + << request.DebugString()); NYql::TIssues issues = ValidateEvent(ev); if (issues) { - CPS_LOG_D(MakeLogPrefix(scope, user, jobId) - << "DescribeJobRequest, validation failed: " - << NKikimr::MaskTicket(token) << " " << request.DebugString() - << " error: " << issues.ToString()); - const TDuration delta = TInstant::Now() - startTime; - SendResponseIssues<TEvControlPlaneStorage::TEvDescribeJobResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); + CPS_LOG_D(MakeLogPrefix(scope, user, jobId) + << "DescribeJobRequest, validation failed: " + << NKikimr::MaskTicket(token) << " " << request.DebugString() + << " error: " << issues.ToString()); + const TDuration delta = TInstant::Now() - startTime; + SendResponseIssues<TEvControlPlaneStorage::TEvDescribeJobResponse>(ev->Sender, issues, ev->Cookie, delta, requestCounters); LWPROBE(DescribeJobRequest, scope, user, jobId, delta, byteSize, false); return; } TSqlQueryBuilder queryBuilder(YdbConnection->TablePathPrefix, "DescribeJob"); - queryBuilder.AddString("scope", scope); - queryBuilder.AddString("job_id", jobId); + queryBuilder.AddString("scope", scope); + queryBuilder.AddString("job_id", jobId); queryBuilder.AddString("query_id", queryId); - queryBuilder.AddTimestamp("now", TInstant::Now()); + queryBuilder.AddTimestamp("now", TInstant::Now()); - queryBuilder.AddText( - "SELECT `" JOB_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "` FROM `" JOBS_TABLE_NAME "`\n" + queryBuilder.AddText( + "SELECT `" JOB_COLUMN_NAME "`, `" VISIBILITY_COLUMN_NAME "` FROM `" JOBS_TABLE_NAME "`\n" "WHERE `" SCOPE_COLUMN_NAME "` = $scope AND `" QUERY_ID_COLUMN_NAME "` = $query_id\n" " AND `" JOB_ID_COLUMN_NAME "` = $job_id AND (`" EXPIRE_AT_COLUMN_NAME "` is NULL OR `" EXPIRE_AT_COLUMN_NAME "` > $now);\n" - ); + ); - const auto query = queryBuilder.Build(); - auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; - auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); + const auto query = queryBuilder.Build(); + auto debugInfo = Config.Proto.GetEnableDebugMode() ? std::make_shared<TDebugInfo>() : TDebugInfoPtr{}; + auto [result, resultSets] = Read(query.Sql, query.Params, requestCounters, debugInfo); auto prepare = [=, id=request.job_id(), resultSets=resultSets] { - if (resultSets->size() != 1) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; + if (resultSets->size() != 1) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Result set size is not equal to 1 but equal " << resultSets->size() << ". Please contact internal support"; } - - YandexQuery::DescribeJobResult result; - TResultSetParser parser(resultSets->front()); - if (!parser.TryNextRow()) { + + YandexQuery::DescribeJobResult result; + TResultSetParser parser(resultSets->front()); + if (!parser.TryNextRow()) { ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Job does not exist or permission denied. Please check the job id or your access rights"; } - if (!result.mutable_job()->ParseFromString(*parser.ColumnParser(JOB_COLUMN_NAME).GetOptionalString())) { - ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for job. Please contact internal support"; + if (!result.mutable_job()->ParseFromString(*parser.ColumnParser(JOB_COLUMN_NAME).GetOptionalString())) { + ythrow TControlPlaneStorageException(TIssuesIds::INTERNAL_ERROR) << "Error parsing proto message for job. Please contact internal support"; } - auto visibility = static_cast<YandexQuery::Acl::Visibility>(*parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64()); + auto visibility = static_cast<YandexQuery::Acl::Visibility>(*parser.ColumnParser(VISIBILITY_COLUMN_NAME).GetOptionalInt64()); result.mutable_job()->mutable_meta()->set_id(id); - bool hasViewAccces = HasViewAccess(permissions, visibility, result.job().meta().created_by(), user); - if (!hasViewAccces) { + bool hasViewAccces = HasViewAccess(permissions, visibility, result.job().meta().created_by(), user); + if (!hasViewAccces) { ythrow TControlPlaneStorageException(TIssuesIds::ACCESS_DENIED) << "Job does not exist or permission denied. Please check the job id or your access rights"; } return result; @@ -1695,8 +1695,8 @@ void TYdbControlPlaneStorageActor::Handle(TEvControlPlaneStorage::TEvDescribeJob ev, startTime, requestCounters, - prepare, - debugInfo); + prepare, + debugInfo); success.Apply([=](const auto& future) { TDuration delta = TInstant::Now() - startTime; diff --git a/ydb/core/yq/libs/db_schema/db_schema.cpp b/ydb/core/yq/libs/db_schema/db_schema.cpp index fdda16df40..b57d71cfc9 100644 --- a/ydb/core/yq/libs/db_schema/db_schema.cpp +++ b/ydb/core/yq/libs/db_schema/db_schema.cpp @@ -27,23 +27,23 @@ TSqlQueryBuilder& TSqlQueryBuilder::PopPk() { TSqlQueryBuilder& TSqlQueryBuilder::AddPk(const TString& name, const TValue& value) { Pk.push_back(name); - return AddValue(name, value, "=="); -} - -TSqlQueryBuilder& TSqlQueryBuilder::AddValue(const TString& name, const NYdb::TValue& value) -{ - const auto typeStr = value.GetType().ToString(); - auto it = Parameters.find(name); - if (it == Parameters.end()) { - Parameters.emplace(name, typeStr); - ParametersOrdered.emplace_back(name, typeStr); - ParamsBuilder.AddParam("$" + name, value); - } else if (it->second != typeStr) { - ythrow yexception() << "Parameter `" << name << "' type " << typeStr << " != " << it->second; - } - return *this; + return AddValue(name, value, "=="); } +TSqlQueryBuilder& TSqlQueryBuilder::AddValue(const TString& name, const NYdb::TValue& value) +{ + const auto typeStr = value.GetType().ToString(); + auto it = Parameters.find(name); + if (it == Parameters.end()) { + Parameters.emplace(name, typeStr); + ParametersOrdered.emplace_back(name, typeStr); + ParamsBuilder.AddParam("$" + name, value); + } else if (it->second != typeStr) { + ythrow yexception() << "Parameter `" << name << "' type " << typeStr << " != " << it->second; + } + return *this; +} + TSqlQueryBuilder& TSqlQueryBuilder::AddValue(const TString& name, const TValue& value, const TString& pred) { TStringBuilder var; var << name; @@ -73,7 +73,7 @@ TSqlQueryBuilder& TSqlQueryBuilder::AddColNames(TVector<TString>&& colNames) TSqlQueryBuilder& TSqlQueryBuilder::MaybeAddValue(const TString& name, const TMaybe<TValue>& value) { if (value) { - return AddValue(name, *value, "=="); + return AddValue(name, *value, "=="); } else { return *this; } @@ -82,7 +82,7 @@ TSqlQueryBuilder& TSqlQueryBuilder::MaybeAddValue(const TString& name, const TMa TSqlQueryBuilder& TSqlQueryBuilder::AddText(const TString& sql, const TString& tableName) { if (tableName) { - Text << SubstGlobalCopy(sql, TString("{TABLENAME}"), tableName); + Text << SubstGlobalCopy(sql, TString("{TABLENAME}"), tableName); } else { Text << sql; } @@ -91,7 +91,7 @@ TSqlQueryBuilder& TSqlQueryBuilder::AddText(const TString& sql, const TString& t TSqlQueryBuilder& TSqlQueryBuilder::AddBeforeQuery(const TString& sql, const TString& tableName ) { if (tableName) { - BeforeQuery << SubstGlobalCopy(sql, TString("{TABLENAME}"), tableName); + BeforeQuery << SubstGlobalCopy(sql, TString("{TABLENAME}"), tableName); } else { BeforeQuery << sql; } @@ -174,7 +174,7 @@ TSqlQueryBuilder& TSqlQueryBuilder::End() TStringBuilder text; if (Op == "DELETE") { - text << "$todelete" << Counter << " = (SELECT * FROM `" << Table << "`\n"; + text << "$todelete" << Counter << " = (SELECT * FROM `" << Table << "`\n"; if (Pk.empty() && Fields.empty() && !Limit) { ythrow yexception() << "dangerous sql query"; } @@ -189,7 +189,7 @@ TSqlQueryBuilder& TSqlQueryBuilder::End() text.clear(); - text << "DELETE FROM `" << Table << "`\n"; + text << "DELETE FROM `" << Table << "`\n"; text << "ON (SELECT * from $todelete" << Counter << ");\n"; } else if (Op == "SELECT") { text << Op << ' '; @@ -201,7 +201,7 @@ TSqlQueryBuilder& TSqlQueryBuilder::End() text << ", "; } } - text << "\nFROM `" << Table << "`\n"; + text << "\nFROM `" << Table << "`\n"; ConstructWhereFilter(text); if (Limit > 0) { text << " LIMIT " << Limit; @@ -220,11 +220,11 @@ TSqlQueryBuilder& TSqlQueryBuilder::End() text << "\n FROM $todelete" << (Counter-1) << ";\n"; } else if (Op == "SELECT COUNT(*)") { text << Op ; - text << "\nFROM `" << Table << "`\n"; + text << "\nFROM `" << Table << "`\n"; ConstructWhereFilter(text); text << ";\n"; } else if (Op == "UPDATE") { - text << Op << " `" << Table << "`\n"; + text << Op << " `" << Table << "`\n"; if (Pk.empty() && Fields.empty()) { ythrow yexception() << "dangerous sql query"; } @@ -249,7 +249,7 @@ TSqlQueryBuilder& TSqlQueryBuilder::End() BeforeQuery << text; text.clear(); } else { - text << Op << " INTO `" << Table << "`\n"; + text << Op << " INTO `" << Table << "`\n"; text << "(\n" << " "; for (const auto& pk : Pk) { text << "`" << pk << "`" << ","; @@ -291,7 +291,7 @@ TSqlQueryBuilder::TResult TSqlQueryBuilder::Build() TStringBuilder declr; declr << "--!syntax_v1\n"; declr << "-- Query name: " << QueryName << "\n"; - declr << "PRAGMA TablePathPrefix(\"" << TablePrefix << "\");\n"; + declr << "PRAGMA TablePathPrefix(\"" << TablePrefix << "\");\n"; for (const auto& [k, v] : ParametersOrdered) { declr << "DECLARE $" << k << " as " << v << ";\n"; } diff --git a/ydb/core/yq/libs/db_schema/db_schema.h b/ydb/core/yq/libs/db_schema/db_schema.h index c14a7d21c0..ddede9ab52 100644 --- a/ydb/core/yq/libs/db_schema/db_schema.h +++ b/ydb/core/yq/libs/db_schema/db_schema.h @@ -21,51 +21,51 @@ public: return AddPk(name, NYdb::TValueBuilder().String(value).Build()); } - TSqlQueryBuilder& AddValue(const TString& name, const NYdb::TValue& value); - - TSqlQueryBuilder& AddString(const TString& name, const TString& value) { - return AddValue(name, NYdb::TValueBuilder().String(value).Build()); - } - - TSqlQueryBuilder& AddUint32(const TString& name, ui32 value) { - return AddValue(name, NYdb::TValueBuilder().Uint32(value).Build()); - } - - TSqlQueryBuilder& AddInt32(const TString& name, i32 value) { - return AddValue(name, NYdb::TValueBuilder().Int32(value).Build()); - } - - TSqlQueryBuilder& AddUint64(const TString& name, ui64 value) { - return AddValue(name, NYdb::TValueBuilder().Uint64(value).Build()); - } - - TSqlQueryBuilder& AddInt64(const TString& name, i64 value) { - return AddValue(name, NYdb::TValueBuilder().Int64(value).Build()); - } - - TSqlQueryBuilder& AddTimestamp(const TString& name, TInstant value) { - return AddValue(name, NYdb::TValueBuilder().Timestamp(value).Build()); - } - - TSqlQueryBuilder& AddBool(const TString& name, bool value) { - return AddValue(name, NYdb::TValueBuilder().Bool(value).Build()); - } - - TSqlQueryBuilder& AddValue(const TString& name, const NYdb::TValue& value, const TString& pred); - - TSqlQueryBuilder& AddValue(const TString& name, const TString& value, const TString& pred) { + TSqlQueryBuilder& AddValue(const TString& name, const NYdb::TValue& value); + + TSqlQueryBuilder& AddString(const TString& name, const TString& value) { + return AddValue(name, NYdb::TValueBuilder().String(value).Build()); + } + + TSqlQueryBuilder& AddUint32(const TString& name, ui32 value) { + return AddValue(name, NYdb::TValueBuilder().Uint32(value).Build()); + } + + TSqlQueryBuilder& AddInt32(const TString& name, i32 value) { + return AddValue(name, NYdb::TValueBuilder().Int32(value).Build()); + } + + TSqlQueryBuilder& AddUint64(const TString& name, ui64 value) { + return AddValue(name, NYdb::TValueBuilder().Uint64(value).Build()); + } + + TSqlQueryBuilder& AddInt64(const TString& name, i64 value) { + return AddValue(name, NYdb::TValueBuilder().Int64(value).Build()); + } + + TSqlQueryBuilder& AddTimestamp(const TString& name, TInstant value) { + return AddValue(name, NYdb::TValueBuilder().Timestamp(value).Build()); + } + + TSqlQueryBuilder& AddBool(const TString& name, bool value) { + return AddValue(name, NYdb::TValueBuilder().Bool(value).Build()); + } + + TSqlQueryBuilder& AddValue(const TString& name, const NYdb::TValue& value, const TString& pred); + + TSqlQueryBuilder& AddValue(const TString& name, const TString& value, const TString& pred) { return AddValue(name, NYdb::TValueBuilder().String(value).Build(), pred); } - TSqlQueryBuilder& AddValue(const TString& name, ui32 value, const TString& pred) { + TSqlQueryBuilder& AddValue(const TString& name, ui32 value, const TString& pred) { return AddValue(name, NYdb::TValueBuilder().Uint32(value).Build(), pred); } - TSqlQueryBuilder& AddValue(const TString& name, ui64 value, const TString& pred) { + TSqlQueryBuilder& AddValue(const TString& name, ui64 value, const TString& pred) { return AddValue(name, NYdb::TValueBuilder().Uint64(value).Build(), pred); } - TSqlQueryBuilder& AddValue(const TString& name, TInstant value, const TString& pred) { + TSqlQueryBuilder& AddValue(const TString& name, TInstant value, const TString& pred) { return AddValue(name, NYdb::TValueBuilder().Timestamp(value).Build(), pred); } diff --git a/ydb/core/yq/libs/events/event_subspace.h b/ydb/core/yq/libs/events/event_subspace.h index 99814caaae..2bce74a2b5 100644 --- a/ydb/core/yq/libs/events/event_subspace.h +++ b/ydb/core/yq/libs/events/event_subspace.h @@ -22,10 +22,10 @@ struct TYqEventSubspace { CheckpointStorage, MetastorageProxy, ConfigUpdater, - ControlPlaneStorage, - ControlPlaneProxy, + ControlPlaneStorage, + ControlPlaneProxy, AuditService, - TestConnection, + TestConnection, SubspacesEnd, }; diff --git a/ydb/core/yq/libs/events/events.h b/ydb/core/yq/libs/events/events.h index b3c70e5c5f..cf21da6930 100644 --- a/ydb/core/yq/libs/events/events.h +++ b/ydb/core/yq/libs/events/events.h @@ -110,22 +110,22 @@ struct TEvents { }; struct TEvDbFunctionRequest : NActors::TEventLocal<TEvDbFunctionRequest, TEventIds::EvDbFunctionRequest> { - using TFunction = std::function<NYdb::TAsyncStatus(NYdb::NTable::TSession&)>; - TFunction Handler; - + using TFunction = std::function<NYdb::TAsyncStatus(NYdb::NTable::TSession&)>; + TFunction Handler; + explicit TEvDbFunctionRequest(const TFunction& handler) - : Handler(handler) - {} - }; - + : Handler(handler) + {} + }; + struct TEvDbFunctionResponse : NActors::TEventLocal<TEvDbFunctionResponse, TEventIds::EvDbFunctionResponse> { - NYdb::TStatus Status; - + NYdb::TStatus Status; + explicit TEvDbFunctionResponse(NYdb::TStatus status) - : Status(status) - {} - }; - + : Status(status) + {} + }; + struct TEvEndpointResponse : NActors::TEventLocal<TEvEndpointResponse, TEventIds::EvEndpointResponse> { struct TEndpoint { TString Endpoint; @@ -182,7 +182,7 @@ struct TEvents { NYql::TIssues Issues; }; - + struct TEvDataStreamsReadRulesDeletionResult : NActors::TEventLocal<TEvDataStreamsReadRulesDeletionResult, TEventIds::EvDataStreamsReadRulesDeletionResult> { explicit TEvDataStreamsReadRulesDeletionResult(NYql::TIssues transientIssues) : TransientIssues(std::move(transientIssues)) @@ -194,12 +194,12 @@ struct TEvents { struct TEvQueryActionResult : NActors::TEventLocal<TEvQueryActionResult, TEventIds::EvQueryActionResult> { explicit TEvQueryActionResult(YandexQuery::QueryAction action) - : Action(action) - { - } - - YandexQuery::QueryAction Action; - }; + : Action(action) + { + } + + YandexQuery::QueryAction Action; + }; struct TEvForwardPingRequest : NActors::TEventLocal<TEvForwardPingRequest, TEventIds::EvForwardPingRequest> { explicit TEvForwardPingRequest(const Yq::Private::PingTaskRequest& request, bool final = false) diff --git a/ydb/core/yq/libs/init/init.cpp b/ydb/core/yq/libs/init/init.cpp index d66ac202bf..b52e32caef 100644 --- a/ydb/core/yq/libs/init/init.cpp +++ b/ydb/core/yq/libs/init/init.cpp @@ -1,7 +1,7 @@ #include "init.h" #include <ydb/core/yq/libs/control_plane_storage/control_plane_storage.h> -#include <ydb/core/yq/libs/test_connection/test_connection.h> +#include <ydb/core/yq/libs/test_connection/test_connection.h> #include <ydb/core/yq/libs/audit/yq_audit_service.h> #include <ydb/core/yq/libs/common/service_counters.h> @@ -9,10 +9,10 @@ #include <ydb/core/yq/libs/shared_resources/shared_resources.h> #include <ydb/core/yq/libs/checkpoint_storage/storage_service.h> #include <ydb/library/folder_service/folder_service.h> - + #include <library/cpp/actors/http/http_proxy.h> #include <library/cpp/protobuf/json/json2proto.h> -#include <library/cpp/protobuf/json/proto2json.h> +#include <library/cpp/protobuf/json/proto2json.h> #include <ydb/library/yql/dq/actors/compute/dq_checkpoints.h> #include <ydb/library/yql/dq/actors/compute/dq_compute_actor_io_actors_factory.h> @@ -33,7 +33,7 @@ #include <ydb/library/yql/providers/ydb/comp_nodes/yql_ydb_factory.h> #include <ydb/library/yql/providers/ydb/comp_nodes/yql_ydb_dq_transform.h> #include <ydb/library/yql/providers/ydb/actors/yql_ydb_source_factory.h> - + #include <util/stream/file.h> #include <util/system/hostname.h> @@ -96,7 +96,7 @@ namespace NYq { using namespace NKikimr; void Init( - const NYq::NConfig::TConfig& protoConfig, + const NYq::NConfig::TConfig& protoConfig, ui32 nodeId, const TActorRegistrator& actorRegistrator, const TAppData* appData, @@ -104,7 +104,7 @@ void Init( ::NPq::NConfigurationManager::IConnections::TPtr pqCmConnections, const IYqSharedResources::TPtr& iyqSharedResources, const std::function<IActor*(const NKikimrProto::NFolderService::TFolderServiceConfig& authConfig)>& folderServiceFactory, - const std::function<IActor*(const NYq::NConfig::TAuditConfig& auditConfig)>& auditServiceFactory, + const std::function<IActor*(const NYq::NConfig::TAuditConfig& auditConfig)>& auditServiceFactory, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const ui32& icPort ) @@ -112,58 +112,58 @@ void Init( Y_VERIFY(iyqSharedResources, "No YQ shared resources created"); TYqSharedResources::TPtr yqSharedResources = TYqSharedResources::Cast(iyqSharedResources); const auto clientCounters = appData->Counters->GetSubgroup("counters", "yq")->GetSubgroup("subsystem", "ClientMetrics"); - - if (protoConfig.GetControlPlaneStorage().GetEnabled()) { - auto controlPlaneStorage = protoConfig.GetControlPlaneStorage().GetUseInMemory() - ? NYq::CreateInMemoryControlPlaneStorageServiceActor(protoConfig.GetControlPlaneStorage()) - : NYq::CreateYdbControlPlaneStorageServiceActor( - protoConfig.GetControlPlaneStorage(), - protoConfig.GetCommon(), - appData->Counters->GetSubgroup("counters", "yq")->GetSubgroup("subsystem", "ControlPlaneStorage"), - yqSharedResources, - credentialsProviderFactory); - actorRegistrator(NYq::ControlPlaneStorageServiceActorId(), controlPlaneStorage); - } - - if (protoConfig.GetTestConnection().GetEnabled()) { - auto testConnection = NYq::CreateTestConnectionActor( - protoConfig.GetTestConnection(), - appData->Counters->GetSubgroup("counters", "yq")->GetSubgroup("subsystem", "TestConnection")); - actorRegistrator(NYq::TestConnectionActorId(), testConnection); - } - - if (protoConfig.GetControlPlaneProxy().GetEnabled()) { - auto controlPlaneProxy = NYq::CreateControlPlaneProxyActor(protoConfig.GetControlPlaneProxy(), - appData->Counters->GetSubgroup("counters", "yq")->GetSubgroup("subsystem", "ControlPlaneProxy")); - actorRegistrator(NYq::ControlPlaneProxyActorId(), controlPlaneProxy); - } - - if (protoConfig.GetAudit().GetEnabled()) { - auto* auditSerive = auditServiceFactory(protoConfig.GetAudit()); - actorRegistrator(NYq::YqAuditServiceActorId(), auditSerive); - } - - // if not enabled then stub - { + + if (protoConfig.GetControlPlaneStorage().GetEnabled()) { + auto controlPlaneStorage = protoConfig.GetControlPlaneStorage().GetUseInMemory() + ? NYq::CreateInMemoryControlPlaneStorageServiceActor(protoConfig.GetControlPlaneStorage()) + : NYq::CreateYdbControlPlaneStorageServiceActor( + protoConfig.GetControlPlaneStorage(), + protoConfig.GetCommon(), + appData->Counters->GetSubgroup("counters", "yq")->GetSubgroup("subsystem", "ControlPlaneStorage"), + yqSharedResources, + credentialsProviderFactory); + actorRegistrator(NYq::ControlPlaneStorageServiceActorId(), controlPlaneStorage); + } + + if (protoConfig.GetTestConnection().GetEnabled()) { + auto testConnection = NYq::CreateTestConnectionActor( + protoConfig.GetTestConnection(), + appData->Counters->GetSubgroup("counters", "yq")->GetSubgroup("subsystem", "TestConnection")); + actorRegistrator(NYq::TestConnectionActorId(), testConnection); + } + + if (protoConfig.GetControlPlaneProxy().GetEnabled()) { + auto controlPlaneProxy = NYq::CreateControlPlaneProxyActor(protoConfig.GetControlPlaneProxy(), + appData->Counters->GetSubgroup("counters", "yq")->GetSubgroup("subsystem", "ControlPlaneProxy")); + actorRegistrator(NYq::ControlPlaneProxyActorId(), controlPlaneProxy); + } + + if (protoConfig.GetAudit().GetEnabled()) { + auto* auditSerive = auditServiceFactory(protoConfig.GetAudit()); + actorRegistrator(NYq::YqAuditServiceActorId(), auditSerive); + } + + // if not enabled then stub + { auto folderService = folderServiceFactory(protoConfig.GetFolderService()); actorRegistrator(NKikimr::NFolderService::FolderServiceActorId(), folderService); - } - - if (protoConfig.GetCheckpointCoordinator().GetEnabled()) { + } + + if (protoConfig.GetCheckpointCoordinator().GetEnabled()) { auto checkpointStorage = NYq::NewCheckpointStorageService(protoConfig.GetCheckpointCoordinator(), protoConfig.GetCommon(), credentialsProviderFactory); - actorRegistrator(NYql::NDq::MakeCheckpointStorageID(), checkpointStorage.release()); - } - + actorRegistrator(NYql::NDq::MakeCheckpointStorageID(), checkpointStorage.release()); + } + auto yqCounters = appData->Counters->GetSubgroup("counters", "yq"); auto workerManagerCounters = NYql::NDqs::TWorkerManagerCounters(yqCounters->GetSubgroup("subsystem", "worker_manager")); - - NKikimr::NMiniKQL::TComputationNodeFactory dqCompFactory = NKikimr::NMiniKQL::GetCompositeWithBuiltinFactory({ + + NKikimr::NMiniKQL::TComputationNodeFactory dqCompFactory = NKikimr::NMiniKQL::GetCompositeWithBuiltinFactory({ NYql::GetCommonDqFactory(), NYql::GetDqYdbFactory(yqSharedResources->YdbDriver), NKikimr::NMiniKQL::GetYqlFactory() }); - NYql::TTaskTransformFactory dqTaskTransformFactory = NYql::CreateCompositeTaskTransformFactory({ + NYql::TTaskTransformFactory dqTaskTransformFactory = NYql::CreateCompositeTaskTransformFactory({ NYql::CreateCommonDqTaskTransformFactory(), NYql::CreateYdbDqTaskTransformFactory() }); @@ -171,35 +171,35 @@ void Init( auto sourceActorFactory = MakeIntrusive<NYql::NDq::TDqSourceFactory>(); auto sinkActorFactory = MakeIntrusive<NYql::NDq::TDqSinkFactory>(); - NYql::ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory; + NYql::ISecuredServiceAccountCredentialsFactory::TPtr credentialsFactory; const auto httpGateway = NYql::IHTTPGateway::Make( &protoConfig.GetGateways().GetHttpGateway(), yqCounters->GetSubgroup("subcomponent", "http_gateway")); - if (protoConfig.GetTokenAccessor().GetEnabled()) { - credentialsFactory = NYql::CreateSecuredServiceAccountCredentialsOverTokenAccessorFactory(protoConfig.GetTokenAccessor().GetEndpoint(), protoConfig.GetTokenAccessor().GetUseSsl()); - RegisterDqPqReadActorFactory(*sourceActorFactory, yqSharedResources->YdbDriver, credentialsFactory); - RegisterYdbReadActorFactory(*sourceActorFactory, yqSharedResources->YdbDriver, credentialsFactory); + if (protoConfig.GetTokenAccessor().GetEnabled()) { + credentialsFactory = NYql::CreateSecuredServiceAccountCredentialsOverTokenAccessorFactory(protoConfig.GetTokenAccessor().GetEndpoint(), protoConfig.GetTokenAccessor().GetUseSsl()); + RegisterDqPqReadActorFactory(*sourceActorFactory, yqSharedResources->YdbDriver, credentialsFactory); + RegisterYdbReadActorFactory(*sourceActorFactory, yqSharedResources->YdbDriver, credentialsFactory); RegisterS3ReadActorFactory(*sourceActorFactory, credentialsFactory, httpGateway, std::make_shared<NYql::NS3::TRetryConfig>(protoConfig.GetReadActorsFactoryConfig().GetS3ReadActorFactoryConfig().GetRetryConfig())); RegisterClickHouseReadActorFactory(*sourceActorFactory, credentialsFactory, httpGateway); - - RegisterDqPqWriteActorFactory(*sinkActorFactory, yqSharedResources->YdbDriver, credentialsFactory); - RegisterDQSolomonWriteActorFactory(*sinkActorFactory, credentialsFactory); + + RegisterDqPqWriteActorFactory(*sinkActorFactory, yqSharedResources->YdbDriver, credentialsFactory); + RegisterDQSolomonWriteActorFactory(*sinkActorFactory, credentialsFactory); } ui64 mkqlInitialMemoryLimit = 8_GB; - if (protoConfig.GetResourceManager().GetEnabled()) { + if (protoConfig.GetResourceManager().GetEnabled()) { mkqlInitialMemoryLimit = protoConfig.GetResourceManager().GetMkqlInitialMemoryLimit(); - if (!mkqlInitialMemoryLimit) { - mkqlInitialMemoryLimit = 8_GB; - } - ui64 mkqlTotalMemoryLimit = protoConfig.GetResourceManager().GetMkqlTotalMemoryLimit(); - ui64 mkqlAllocSize = protoConfig.GetResourceManager().GetMkqlAllocSize(); - if (!mkqlAllocSize) { - mkqlAllocSize = 30_MB; - } + if (!mkqlInitialMemoryLimit) { + mkqlInitialMemoryLimit = 8_GB; + } + ui64 mkqlTotalMemoryLimit = protoConfig.GetResourceManager().GetMkqlTotalMemoryLimit(); + ui64 mkqlAllocSize = protoConfig.GetResourceManager().GetMkqlAllocSize(); + if (!mkqlAllocSize) { + mkqlAllocSize = 30_MB; + } NYql::NDqs::TLocalWorkerManagerOptions lwmOptions; lwmOptions.Counters = workerManagerCounters; lwmOptions.Factory = NYql::NTaskRunnerProxy::CreateFactory(appData->FunctionRegistry, dqCompFactory, dqTaskTransformFactory, false); @@ -211,67 +211,67 @@ void Init( lwmOptions.MkqlMinAllocSize = mkqlAllocSize; auto resman = NYql::NDqs::CreateLocalWorkerManager(lwmOptions); - actorRegistrator(NYql::NDqs::MakeWorkerManagerActorID(nodeId), resman); - } + actorRegistrator(NYql::NDqs::MakeWorkerManagerActorID(nodeId), resman); + } ::NYq::NCommon::TServiceCounters serviceCounters(appData->Counters); - if (protoConfig.GetNodesManager().GetEnabled()) { + if (protoConfig.GetNodesManager().GetEnabled()) { const auto localAddr = GetLocalAddress(&HostName()); - auto nodesManager = CreateYqlNodesManager( - workerManagerCounters, - TAppData::TimeProvider, - TAppData::RandomProvider, - serviceCounters, - protoConfig.GetPrivateApi(), - yqSharedResources, + auto nodesManager = CreateYqlNodesManager( + workerManagerCounters, + TAppData::TimeProvider, + TAppData::RandomProvider, + serviceCounters, + protoConfig.GetPrivateApi(), + yqSharedResources, icPort, std::get<1>(localAddr), tenant, mkqlInitialMemoryLimit, clientCounters); - actorRegistrator(MakeYqlNodesManagerId(), nodesManager); - } + actorRegistrator(MakeYqlNodesManagerId(), nodesManager); + } auto httpProxy = NHttp::CreateHttpProxy(*NMonitoring::TMetricRegistry::Instance()); actorRegistrator(MakeYqlAnalyticsHttpProxyId(), httpProxy); - if (protoConfig.GetPendingFetcher().GetEnabled()) { - auto fetcher = CreatePendingFetcher( - yqSharedResources, - protoConfig.GetCommon(), - protoConfig.GetCheckpointCoordinator(), - protoConfig.GetPrivateApi(), - protoConfig.GetGateways(), - protoConfig.GetPinger(), - appData->FunctionRegistry, - TAppData::TimeProvider, - TAppData::RandomProvider, - dqCompFactory, - serviceCounters, - credentialsFactory, + if (protoConfig.GetPendingFetcher().GetEnabled()) { + auto fetcher = CreatePendingFetcher( + yqSharedResources, + protoConfig.GetCommon(), + protoConfig.GetCheckpointCoordinator(), + protoConfig.GetPrivateApi(), + protoConfig.GetGateways(), + protoConfig.GetPinger(), + appData->FunctionRegistry, + TAppData::TimeProvider, + TAppData::RandomProvider, + dqCompFactory, + serviceCounters, + credentialsFactory, httpGateway, std::move(pqCmConnections), clientCounters - ); + ); - actorRegistrator(MakeYqlAnalyticsFetcherId(nodeId), fetcher); - } + actorRegistrator(MakeYqlAnalyticsFetcherId(nodeId), fetcher); + } - if (protoConfig.GetPrivateProxy().GetEnabled()) { - auto proxyPrivate = CreateYqlAnalyticsPrivateProxy( - TAppData::TimeProvider, - TAppData::RandomProvider, - serviceCounters.Counters, - protoConfig.GetTokenAccessor()); + if (protoConfig.GetPrivateProxy().GetEnabled()) { + auto proxyPrivate = CreateYqlAnalyticsPrivateProxy( + TAppData::TimeProvider, + TAppData::RandomProvider, + serviceCounters.Counters, + protoConfig.GetTokenAccessor()); actorRegistrator(MakeYqPrivateProxyId(), proxyPrivate); - } + } } IYqSharedResources::TPtr CreateYqSharedResources( - const NYq::NConfig::TConfig& config, + const NYq::NConfig::TConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters) { diff --git a/ydb/core/yq/libs/init/init.h b/ydb/core/yq/libs/init/init.h index fa26651f18..b7fb07e3f2 100644 --- a/ydb/core/yq/libs/init/init.h +++ b/ydb/core/yq/libs/init/init.h @@ -22,22 +22,22 @@ namespace NYq { using TActorRegistrator = std::function<void(NActors::TActorId, NActors::IActor*)>; IYqSharedResources::TPtr CreateYqSharedResources( - const NYq::NConfig::TConfig& config, + const NYq::NConfig::TConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters); void Init( - const NYq::NConfig::TConfig& config, + const NYq::NConfig::TConfig& config, ui32 nodeId, const TActorRegistrator& actorRegistrator, const NKikimr::TAppData* appData, - const TString& tenant, + const TString& tenant, ::NPq::NConfigurationManager::IConnections::TPtr pqCmConnections, const IYqSharedResources::TPtr& yqSharedResources, const std::function<IActor*(const NKikimrProto::NFolderService::TFolderServiceConfig& authConfig)>& folderServiceFactory, - const std::function<IActor*(const NYq::NConfig::TAuditConfig& auditConfig)>& auditServiceFactory, + const std::function<IActor*(const NYq::NConfig::TAuditConfig& auditConfig)>& auditServiceFactory, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const ui32& icPort ); - + } // NYq diff --git a/ydb/core/yq/libs/init/ya.make b/ydb/core/yq/libs/init/ya.make index 129103b024..1802147390 100644 --- a/ydb/core/yq/libs/init/ya.make +++ b/ydb/core/yq/libs/init/ya.make @@ -20,7 +20,7 @@ PEERDIR( ydb/core/yq/libs/events ydb/core/yq/libs/gateway ydb/core/yq/libs/shared_resources - ydb/core/yq/libs/test_connection + ydb/core/yq/libs/test_connection ydb/library/folder_service ydb/library/folder_service/proto ydb/library/yql/minikql/comp_nodes diff --git a/ydb/core/yq/libs/private_client/private_client.cpp b/ydb/core/yq/libs/private_client/private_client.cpp index bccb8ddd1d..37aa7aad4e 100644 --- a/ydb/core/yq/libs/private_client/private_client.cpp +++ b/ydb/core/yq/libs/private_client/private_client.cpp @@ -158,25 +158,25 @@ TPrivateClient::TPrivateClient( TAsyncPingTaskResult TPrivateClient::PingTask( Yq::Private::PingTaskRequest&& request, const TPingTaskSettings& settings) { - return Impl->PingTask(std::move(request), settings); + return Impl->PingTask(std::move(request), settings); } TAsyncGetTaskResult TPrivateClient::GetTask( Yq::Private::GetTaskRequest&& request, const TGetTaskSettings& settings) { - return Impl->GetTask(std::move(request), settings); + return Impl->GetTask(std::move(request), settings); } TAsyncWriteTaskResult TPrivateClient::WriteTaskResult( Yq::Private::WriteTaskResultRequest&& request, const TWriteTaskResultSettings& settings) { - return Impl->WriteTaskResult(std::move(request), settings); + return Impl->WriteTaskResult(std::move(request), settings); } TAsyncNodesHealthCheckResult TPrivateClient::NodesHealthCheck( Yq::Private::NodesHealthCheckRequest&& request, const TNodesHealthCheckSettings& settings) { - return Impl->NodesHealthCheck(std::move(request), settings); + return Impl->NodesHealthCheck(std::move(request), settings); } } //NYq diff --git a/ydb/core/yq/libs/private_client/private_client.h b/ydb/core/yq/libs/private_client/private_client.h index e63b67eddb..6c32450747 100644 --- a/ydb/core/yq/libs/private_client/private_client.h +++ b/ydb/core/yq/libs/private_client/private_client.h @@ -75,7 +75,7 @@ public: const TNodesHealthCheckSettings& settings = TNodesHealthCheckSettings()); private: - std::shared_ptr<TImpl> Impl; + std::shared_ptr<TImpl> Impl; }; } // namespace NYq diff --git a/ydb/core/yq/libs/shared_resources/db_pool.cpp b/ydb/core/yq/libs/shared_resources/db_pool.cpp index 372dfd72cd..3113538d69 100644 --- a/ydb/core/yq/libs/shared_resources/db_pool.cpp +++ b/ydb/core/yq/libs/shared_resources/db_pool.cpp @@ -6,9 +6,9 @@ #include <library/cpp/actors/core/hfunc.h> #include <library/cpp/actors/core/actor_bootstrapped.h> -#include <util/stream/file.h> -#include <util/string/strip.h> - +#include <util/stream/file.h> +#include <util/string/strip.h> + #define LOG_E(stream) \ LOG_ERROR_S(*TlsActivationContext, NKikimrServices::YQL_PROXY, stream) @@ -35,8 +35,8 @@ public: CFunc(NActors::TEvents::TEvPoison::EventType, Die) HFunc(TEvents::TEvDbRequest, HandleRequest) HFunc(TEvents::TEvDbResponse, HandleResponse) - HFunc(TEvents::TEvDbFunctionRequest, HandleRequest) - HFunc(TEvents::TEvDbFunctionResponse, HandleResponse) + HFunc(TEvents::TEvDbFunctionRequest, HandleRequest) + HFunc(TEvents::TEvDbFunctionResponse, HandleResponse) ) void Die(const TActorContext& ctx) override { @@ -44,11 +44,11 @@ public: issues.AddIssue("DB connection closed"); auto cancelled = NYdb::TStatus(NYdb::EStatus::CANCELLED, std::move(issues)); for (const auto& x : Requests) { - if (auto pRequest = std::get_if<TRequest>(&x)) { - ctx.Send(pRequest->Sender, new TEvents::TEvDbResponse(cancelled, {})); - } else if (auto pRequest = std::get_if<TFunctionRequest>(&x)) { - ctx.Send(pRequest->Sender, new TEvents::TEvDbFunctionResponse(cancelled)); - } + if (auto pRequest = std::get_if<TRequest>(&x)) { + ctx.Send(pRequest->Sender, new TEvents::TEvDbResponse(cancelled, {})); + } else if (auto pRequest = std::get_if<TFunctionRequest>(&x)) { + ctx.Send(pRequest->Sender, new TEvents::TEvDbFunctionResponse(cancelled)); + } } State.reset(); @@ -64,49 +64,49 @@ public: RequestInProgress = true; RequestInProgressTimestamp = TInstant::Now(); - const auto& requestVariant = Requests.front(); - - if (auto pRequest = std::get_if<TRequest>(&requestVariant)) { - auto& request = *pRequest; - auto actorSystem = ctx.ActorSystem(); - auto selfId = ctx.SelfID; - auto cookie = request.Cookie; - auto sharedResult = std::make_shared<TVector<NYdb::TResultSet>>(); - NYdb::NTable::TRetryOperationSettings settings; - settings.Idempotent(request.Idempotent); - TableClient.RetryOperation<NYdb::NTable::TDataQueryResult>([sharedResult, request](NYdb::NTable::TSession session) { - return session.ExecuteDataQuery(request.Sql, NYdb::NTable::TTxControl::BeginTx( - NYdb::NTable::TTxSettings::SerializableRW()).CommitTx(), - request.Params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)) - .Apply([sharedResult](const auto& future) mutable { - *sharedResult = future.GetValue().GetResultSets(); - return future; - }); - }, settings) - .Subscribe([state = std::weak_ptr<int>(State), sharedResult, actorSystem, cookie, selfId](const NThreading::TFuture<NYdb::TStatus>& statusFuture) { - if (state.lock()) { - actorSystem->Send(new IEventHandle(selfId, selfId, new TEvents::TEvDbResponse(statusFuture.GetValue(), *sharedResult), 0, cookie)); - } - }); - } else if (auto pRequest = std::get_if<TFunctionRequest>(&requestVariant)) { - auto& request = *pRequest; - auto selfId = ctx.SelfID; - auto cookie = request.Cookie; - auto actorSystem = ctx.ActorSystem(); - TableClient.RetryOperation([request](NYdb::NTable::TSession session) { - return request.Handler(session); - }) - .Subscribe([state = std::weak_ptr<int>(State), actorSystem, selfId, cookie](const NThreading::TFuture<NYdb::TStatus>& statusFuture) { - if (state.lock()) { - actorSystem->Send(new IEventHandle(selfId, selfId, new TEvents::TEvDbFunctionResponse(statusFuture.GetValue()), 0, cookie)); - } - }); - } + const auto& requestVariant = Requests.front(); + + if (auto pRequest = std::get_if<TRequest>(&requestVariant)) { + auto& request = *pRequest; + auto actorSystem = ctx.ActorSystem(); + auto selfId = ctx.SelfID; + auto cookie = request.Cookie; + auto sharedResult = std::make_shared<TVector<NYdb::TResultSet>>(); + NYdb::NTable::TRetryOperationSettings settings; + settings.Idempotent(request.Idempotent); + TableClient.RetryOperation<NYdb::NTable::TDataQueryResult>([sharedResult, request](NYdb::NTable::TSession session) { + return session.ExecuteDataQuery(request.Sql, NYdb::NTable::TTxControl::BeginTx( + NYdb::NTable::TTxSettings::SerializableRW()).CommitTx(), + request.Params, NYdb::NTable::TExecDataQuerySettings().KeepInQueryCache(true)) + .Apply([sharedResult](const auto& future) mutable { + *sharedResult = future.GetValue().GetResultSets(); + return future; + }); + }, settings) + .Subscribe([state = std::weak_ptr<int>(State), sharedResult, actorSystem, cookie, selfId](const NThreading::TFuture<NYdb::TStatus>& statusFuture) { + if (state.lock()) { + actorSystem->Send(new IEventHandle(selfId, selfId, new TEvents::TEvDbResponse(statusFuture.GetValue(), *sharedResult), 0, cookie)); + } + }); + } else if (auto pRequest = std::get_if<TFunctionRequest>(&requestVariant)) { + auto& request = *pRequest; + auto selfId = ctx.SelfID; + auto cookie = request.Cookie; + auto actorSystem = ctx.ActorSystem(); + TableClient.RetryOperation([request](NYdb::NTable::TSession session) { + return request.Handler(session); + }) + .Subscribe([state = std::weak_ptr<int>(State), actorSystem, selfId, cookie](const NThreading::TFuture<NYdb::TStatus>& statusFuture) { + if (state.lock()) { + actorSystem->Send(new IEventHandle(selfId, selfId, new TEvents::TEvDbFunctionResponse(statusFuture.GetValue()), 0, cookie)); + } + }); + } } void HandleRequest(TEvents::TEvDbRequest::TPtr& ev, const TActorContext& ctx) { auto request = ev->Get(); - Requests.emplace_back(TRequest{ev->Sender, ev->Cookie, request->Sql, std::move(request->Params), request->Idempotent}); + Requests.emplace_back(TRequest{ev->Sender, ev->Cookie, request->Sql, std::move(request->Params), request->Idempotent}); ProcessQueue(ctx); } @@ -124,18 +124,18 @@ public: PopFromQueueAndProcess(ctx); } - void HandleRequest(TEvents::TEvDbFunctionRequest::TPtr& ev, const TActorContext& ctx) { - auto request = ev->Get(); - Requests.emplace_back(TFunctionRequest{ev->Sender, ev->Cookie, std::move(request->Handler)}); - ProcessQueue(ctx); - } - - void HandleResponse(TEvents::TEvDbFunctionResponse::TPtr& ev, const TActorContext& ctx) { - const auto& request = Requests.front(); - ctx.Send(ev->Forward(std::visit([](const auto& arg) { return arg.Sender; }, request))); + void HandleRequest(TEvents::TEvDbFunctionRequest::TPtr& ev, const TActorContext& ctx) { + auto request = ev->Get(); + Requests.emplace_back(TFunctionRequest{ev->Sender, ev->Cookie, std::move(request->Handler)}); + ProcessQueue(ctx); + } + + void HandleResponse(TEvents::TEvDbFunctionResponse::TPtr& ev, const TActorContext& ctx) { + const auto& request = Requests.front(); + ctx.Send(ev->Forward(std::visit([](const auto& arg) { return arg.Sender; }, request))); PopFromQueueAndProcess(ctx); - } - + } + private: struct TRequest { TActorId Sender; @@ -154,22 +154,22 @@ private: {} }; - struct TFunctionRequest { - using TFunction = std::function<NYdb::TAsyncStatus(NYdb::NTable::TSession&)>; - TActorId Sender; - ui64 Cookie; - TFunction Handler; - - TFunctionRequest() = default; - TFunctionRequest(const TActorId sender, ui64 cookie, TFunction&& handler) - : Sender(sender) - , Cookie(cookie) - , Handler(handler) - {} - }; - + struct TFunctionRequest { + using TFunction = std::function<NYdb::TAsyncStatus(NYdb::NTable::TSession&)>; + TActorId Sender; + ui64 Cookie; + TFunction Handler; + + TFunctionRequest() = default; + TFunctionRequest(const TActorId sender, ui64 cookie, TFunction&& handler) + : Sender(sender) + , Cookie(cookie) + , Handler(handler) + {} + }; + NYdb::NTable::TTableClient TableClient; - TDeque<std::variant<TRequest, TFunctionRequest>> Requests; + TDeque<std::variant<TRequest, TFunctionRequest>> Requests; bool RequestInProgress = false; TInstant RequestInProgressTimestamp = TInstant::Now(); std::shared_ptr<int> State = std::make_shared<int>(); @@ -211,18 +211,18 @@ TActorId TDbPool::GetNextActor() { return Actors[Index++]; } -static void PrepareConfig(NYq::NConfig::TDbPoolConfig& config) { - if (!config.GetStorage().GetToken() && config.GetStorage().GetOAuthFile()) { - config.MutableStorage()->SetToken(StripString(TFileInput(config.GetStorage().GetOAuthFile()).ReadAll())); - } - - if (!config.GetMaxSessionCount()) { - config.SetMaxSessionCount(10); - } -} - +static void PrepareConfig(NYq::NConfig::TDbPoolConfig& config) { + if (!config.GetStorage().GetToken() && config.GetStorage().GetOAuthFile()) { + config.MutableStorage()->SetToken(StripString(TFileInput(config.GetStorage().GetOAuthFile()).ReadAll())); + } + + if (!config.GetMaxSessionCount()) { + config.SetMaxSessionCount(10); + } +} + TDbPoolMap::TDbPoolMap( - const NYq::NConfig::TDbPoolConfig& config, + const NYq::NConfig::TDbPoolConfig& config, NYdb::TDriver driver, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters) @@ -230,12 +230,12 @@ TDbPoolMap::TDbPoolMap( , Driver(driver) , CredentialsProviderFactory(credentialsProviderFactory) , Counters(counters) -{ - PrepareConfig(Config); -} +{ + PrepareConfig(Config); +} TDbPoolHolder::TDbPoolHolder( - const NYq::NConfig::TDbPoolConfig& config, + const NYq::NConfig::TDbPoolConfig& config, const NYdb::TDriver& driver, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters) @@ -248,7 +248,7 @@ TDbPoolHolder::~TDbPoolHolder() Driver.Stop(true); } -void TDbPoolHolder::Reset(const NYq::NConfig::TDbPoolConfig& config) { +void TDbPoolHolder::Reset(const NYq::NConfig::TDbPoolConfig& config) { Pools->Reset(config); } @@ -256,10 +256,10 @@ TDbPoolMap::TPtr TDbPoolHolder::Get() { return Pools; } -void TDbPoolMap::Reset(const NYq::NConfig::TDbPoolConfig& config) { +void TDbPoolMap::Reset(const NYq::NConfig::TDbPoolConfig& config) { TGuard<TMutex> lock(Mutex); Config = config; - PrepareConfig(Config); + PrepareConfig(Config); Pools.clear(); TableClient = nullptr; } @@ -275,24 +275,24 @@ TDbPool::TPtr TDbPoolMap::GetOrCreate(EDbPoolId dbPoolId, ui32 sessionsCount) { return it->second; } - if (!Config.GetStorage().GetEndpoint()) { + if (!Config.GetStorage().GetEndpoint()) { return nullptr; } if (!TableClient) { auto clientSettings = NYdb::NTable::TClientSettings() .UseQueryCache(false) - .SessionPoolSettings(NYdb::NTable::TSessionPoolSettings().MaxActiveSessions(1 + Config.GetMaxSessionCount())) - .Database(Config.GetStorage().GetDatabase()) - .DiscoveryEndpoint(Config.GetStorage().GetEndpoint()) + .SessionPoolSettings(NYdb::NTable::TSessionPoolSettings().MaxActiveSessions(1 + Config.GetMaxSessionCount())) + .Database(Config.GetStorage().GetDatabase()) + .DiscoveryEndpoint(Config.GetStorage().GetEndpoint()) .DiscoveryMode(NYdb::EDiscoveryMode::Async); NKikimr::TYdbCredentialsSettings credSettings; - credSettings.UseLocalMetadata = Config.GetStorage().GetUseLocalMetadataService(); - credSettings.OAuthToken = Config.GetStorage().GetToken(); + credSettings.UseLocalMetadata = Config.GetStorage().GetUseLocalMetadataService(); + credSettings.OAuthToken = Config.GetStorage().GetToken(); clientSettings.CredentialsProviderFactory(CredentialsProviderFactory(credSettings)); - clientSettings.EnableSsl(Config.GetStorage().GetUseSsl()); + clientSettings.EnableSsl(Config.GetStorage().GetUseSsl()); TableClient = MakeHolder<NYdb::NTable::TTableClient>(Driver, clientSettings); } diff --git a/ydb/core/yq/libs/shared_resources/db_pool.h b/ydb/core/yq/libs/shared_resources/db_pool.h index 68d9adc2fc..e9e9f69683 100644 --- a/ydb/core/yq/libs/shared_resources/db_pool.h +++ b/ydb/core/yq/libs/shared_resources/db_pool.h @@ -1,5 +1,5 @@ #pragma once - + #include <ydb/core/yq/libs/config/protos/yq_config.pb.h> #include <ydb/public/sdk/cpp/client/ydb_table/table.h> #include <ydb/core/yq/libs/events/events.h> @@ -46,14 +46,14 @@ public: private: friend class TDbPoolHolder; - TDbPoolMap(const NYq::NConfig::TDbPoolConfig& config, - NYdb::TDriver driver, + TDbPoolMap(const NYq::NConfig::TDbPoolConfig& config, + NYdb::TDriver driver, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters); - void Reset(const NYq::NConfig::TDbPoolConfig& config); + void Reset(const NYq::NConfig::TDbPoolConfig& config); TMutex Mutex; - NYq::NConfig::TDbPoolConfig Config; + NYq::NConfig::TDbPoolConfig Config; NYdb::TDriver Driver; THashMap<EDbPoolId, TDbPool::TPtr> Pools; THolder<NYdb::NTable::TTableClient> TableClient; @@ -65,14 +65,14 @@ class TDbPoolHolder: public TThrRefBase { public: using TPtr = TIntrusivePtr<TDbPoolHolder>; TDbPoolHolder( - const NYq::NConfig::TDbPoolConfig& config, + const NYq::NConfig::TDbPoolConfig& config, const NYdb::TDriver& driver, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters); ~TDbPoolHolder(); - void Reset(const NYq::NConfig::TDbPoolConfig& config); + void Reset(const NYq::NConfig::TDbPoolConfig& config); TDbPool::TPtr GetOrCreate(EDbPoolId poolId, ui32 sessionsCount); NYdb::TDriver& GetDriver(); TDbPoolMap::TPtr Get(); diff --git a/ydb/core/yq/libs/shared_resources/shared_resources.cpp b/ydb/core/yq/libs/shared_resources/shared_resources.cpp index 3dfd566232..a5296d4a4d 100644 --- a/ydb/core/yq/libs/shared_resources/shared_resources.cpp +++ b/ydb/core/yq/libs/shared_resources/shared_resources.cpp @@ -85,10 +85,10 @@ struct TActorSystemPtrMixin { struct TYqSharedResourcesImpl : public TActorSystemPtrMixin, public TYqSharedResources { explicit TYqSharedResourcesImpl( - const NYq::NConfig::TConfig& config, + const NYq::NConfig::TConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters) - : TYqSharedResources(NYdb::TDriver(GetYdbDriverConfig(config.GetCommon().GetYdbDriverConfig()))) + : TYqSharedResources(NYdb::TDriver(GetYdbDriverConfig(config.GetCommon().GetYdbDriverConfig()))) { CreateDbPoolHolder(config.GetDbPool(), credentialsProviderFactory, counters); } @@ -102,16 +102,16 @@ struct TYqSharedResourcesImpl : public TActorSystemPtrMixin, public TYqSharedRes YdbDriver.Stop(true); } - NYdb::TDriverConfig GetYdbDriverConfig(const NYq::NConfig::TYdbDriverConfig& config) { + NYdb::TDriverConfig GetYdbDriverConfig(const NYq::NConfig::TYdbDriverConfig& config) { NYdb::TDriverConfig cfg; - if (config.GetNetworkThreadsNum()) { - cfg.SetNetworkThreadsNum(config.GetNetworkThreadsNum()); + if (config.GetNetworkThreadsNum()) { + cfg.SetNetworkThreadsNum(config.GetNetworkThreadsNum()); } - if (config.GetClientThreadsNum()) { - cfg.SetClientThreadsNum(config.GetClientThreadsNum()); + if (config.GetClientThreadsNum()) { + cfg.SetClientThreadsNum(config.GetClientThreadsNum()); } - if (config.GetGrpcMemoryQuota()) { - cfg.SetGrpcMemoryQuota(config.GetGrpcMemoryQuota()); + if (config.GetGrpcMemoryQuota()) { + cfg.SetGrpcMemoryQuota(config.GetGrpcMemoryQuota()); } cfg.SetDiscoveryMode(NYdb::EDiscoveryMode::Async); // We are in actor system! cfg.SetLog(MakeHolder<TDeferredActorSystemPtrInitActorLogBackend>(ActorSystemPtr, NKikimrServices::EServiceKikimr::YDB_SDK)); @@ -119,7 +119,7 @@ struct TYqSharedResourcesImpl : public TActorSystemPtrMixin, public TYqSharedRes } void CreateDbPoolHolder( - const NYq::NConfig::TDbPoolConfig& config, + const NYq::NConfig::TDbPoolConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters) { DbPoolHolder = MakeIntrusive<NYq::TDbPoolHolder>(config, YdbDriver, credentialsProviderFactory, counters); @@ -129,7 +129,7 @@ struct TYqSharedResourcesImpl : public TActorSystemPtrMixin, public TYqSharedRes } // namespace TYqSharedResources::TPtr CreateYqSharedResourcesImpl( - const NYq::NConfig::TConfig& config, + const NYq::NConfig::TConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters) { return MakeIntrusive<TYqSharedResourcesImpl>(config, credentialsProviderFactory, counters); diff --git a/ydb/core/yq/libs/shared_resources/shared_resources.h b/ydb/core/yq/libs/shared_resources/shared_resources.h index bfd1ec6695..aafa57fa86 100644 --- a/ydb/core/yq/libs/shared_resources/shared_resources.h +++ b/ydb/core/yq/libs/shared_resources/shared_resources.h @@ -24,7 +24,7 @@ protected: }; TYqSharedResources::TPtr CreateYqSharedResourcesImpl( - const NYq::NConfig::TConfig& config, + const NYq::NConfig::TConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credentialsProviderFactory, const NMonitoring::TDynamicCounterPtr& counters); diff --git a/ydb/core/yq/libs/test_connection/events/events.cpp b/ydb/core/yq/libs/test_connection/events/events.cpp index 6c3d2603e7..a4930159cf 100644 --- a/ydb/core/yq/libs/test_connection/events/events.cpp +++ b/ydb/core/yq/libs/test_connection/events/events.cpp @@ -1 +1 @@ -#include "events.h" +#include "events.h" diff --git a/ydb/core/yq/libs/test_connection/events/events.h b/ydb/core/yq/libs/test_connection/events/events.h index 50af463d5b..73f265cede 100644 --- a/ydb/core/yq/libs/test_connection/events/events.h +++ b/ydb/core/yq/libs/test_connection/events/events.h @@ -1,63 +1,63 @@ -#pragma once - +#pragma once + #include <ydb/public/api/protos/yq.pb.h> #include <ydb/core/yq/libs/events/event_subspace.h> - -#include <ydb/core/yq/libs/control_plane_storage/events/events.h> - -#include <library/cpp/actors/core/event_pb.h> -#include <library/cpp/actors/core/events.h> -#include <library/cpp/actors/interconnect/events_local.h> - + +#include <ydb/core/yq/libs/control_plane_storage/events/events.h> + +#include <library/cpp/actors/core/event_pb.h> +#include <library/cpp/actors/core/events.h> +#include <library/cpp/actors/interconnect/events_local.h> + #include <ydb/library/yql/public/issue/yql_issue.h> - -namespace NYq { - -struct TEvTestConnection { - // Event ids. - enum EEv : ui32 { + +namespace NYq { + +struct TEvTestConnection { + // Event ids. + enum EEv : ui32 { EvTestConnectionRequest = YqEventSubspaceBegin(NYq::TYqEventSubspace::TestConnection), - EvTestConnectionResponse, - EvEnd, - }; - + EvTestConnectionResponse, + EvEnd, + }; + static_assert(EvEnd <= YqEventSubspaceEnd(NYq::TYqEventSubspace::TestConnection), "All events must be in their subspace"); - - struct TEvTestConnectionRequest : NActors::TEventLocal<TEvTestConnectionRequest, EvTestConnectionRequest> { - explicit TEvTestConnectionRequest(const TString& scope, - const YandexQuery::TestConnectionRequest& request, - const TString& user, - const TString& token, - const TPermissions& permissions) - : Scope(scope) - , Request(request) - , User(user) - , Token(token) - , Permissions(permissions) - { - } - - TString Scope; - YandexQuery::TestConnectionRequest Request; - TString User; - TString Token; - TPermissions Permissions; - }; - - struct TEvTestConnectionResponse : NActors::TEventLocal<TEvTestConnectionResponse, EvTestConnectionResponse> { - explicit TEvTestConnectionResponse(const YandexQuery::TestConnectionResult& result) - : Result(result) - { - } - - explicit TEvTestConnectionResponse(const NYql::TIssues& issues) - : Issues(issues) - { - } - - YandexQuery::TestConnectionResult Result; - NYql::TIssues Issues; - }; -}; - -} + + struct TEvTestConnectionRequest : NActors::TEventLocal<TEvTestConnectionRequest, EvTestConnectionRequest> { + explicit TEvTestConnectionRequest(const TString& scope, + const YandexQuery::TestConnectionRequest& request, + const TString& user, + const TString& token, + const TPermissions& permissions) + : Scope(scope) + , Request(request) + , User(user) + , Token(token) + , Permissions(permissions) + { + } + + TString Scope; + YandexQuery::TestConnectionRequest Request; + TString User; + TString Token; + TPermissions Permissions; + }; + + struct TEvTestConnectionResponse : NActors::TEventLocal<TEvTestConnectionResponse, EvTestConnectionResponse> { + explicit TEvTestConnectionResponse(const YandexQuery::TestConnectionResult& result) + : Result(result) + { + } + + explicit TEvTestConnectionResponse(const NYql::TIssues& issues) + : Issues(issues) + { + } + + YandexQuery::TestConnectionResult Result; + NYql::TIssues Issues; + }; +}; + +} diff --git a/ydb/core/yq/libs/test_connection/events/ya.make b/ydb/core/yq/libs/test_connection/events/ya.make index e447cded58..c15a6fc7d2 100644 --- a/ydb/core/yq/libs/test_connection/events/ya.make +++ b/ydb/core/yq/libs/test_connection/events/ya.make @@ -1,16 +1,16 @@ -OWNER(g:yq) - -LIBRARY() - -SRCS( - events.cpp -) - -PEERDIR( - ydb/core/yq/libs/control_plane_storage/events +OWNER(g:yq) + +LIBRARY() + +SRCS( + events.cpp +) + +PEERDIR( + ydb/core/yq/libs/control_plane_storage/events ydb/core/yq/libs/events ydb/public/api/protos ydb/library/yql/public/issue/protos -) - -END() +) + +END() diff --git a/ydb/core/yq/libs/test_connection/probes.cpp b/ydb/core/yq/libs/test_connection/probes.cpp index c9ee2232b4..894a5a0acd 100644 --- a/ydb/core/yq/libs/test_connection/probes.cpp +++ b/ydb/core/yq/libs/test_connection/probes.cpp @@ -1,3 +1,3 @@ -#include "probes.h" - -LWTRACE_DEFINE_PROVIDER(YQ_TEST_CONNECTION_PROVIDER) +#include "probes.h" + +LWTRACE_DEFINE_PROVIDER(YQ_TEST_CONNECTION_PROVIDER) diff --git a/ydb/core/yq/libs/test_connection/probes.h b/ydb/core/yq/libs/test_connection/probes.h index b1f1d51abc..c490a7bca8 100644 --- a/ydb/core/yq/libs/test_connection/probes.h +++ b/ydb/core/yq/libs/test_connection/probes.h @@ -1,13 +1,13 @@ -#pragma once - -#include <library/cpp/lwtrace/all.h> - -#define YQ_TEST_CONNECTION_PROVIDER(PROBE, EVENT, GROUPS, TYPES, NAMES) \ - PROBE(TestConnectionRequest, \ - GROUPS(), \ - TYPES(TString, TString, TDuration, i64, bool, bool), \ - NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ - -// YQ_TEST_CONNECTION_PROVIDER - -LWTRACE_DECLARE_PROVIDER(YQ_TEST_CONNECTION_PROVIDER) +#pragma once + +#include <library/cpp/lwtrace/all.h> + +#define YQ_TEST_CONNECTION_PROVIDER(PROBE, EVENT, GROUPS, TYPES, NAMES) \ + PROBE(TestConnectionRequest, \ + GROUPS(), \ + TYPES(TString, TString, TDuration, i64, bool, bool), \ + NAMES("scope", "user", "latencyMs", "size", "success", "timeout")) \ + +// YQ_TEST_CONNECTION_PROVIDER + +LWTRACE_DECLARE_PROVIDER(YQ_TEST_CONNECTION_PROVIDER) diff --git a/ydb/core/yq/libs/test_connection/test_connection.cpp b/ydb/core/yq/libs/test_connection/test_connection.cpp index b7148d0dbc..95e6c51989 100644 --- a/ydb/core/yq/libs/test_connection/test_connection.cpp +++ b/ydb/core/yq/libs/test_connection/test_connection.cpp @@ -1,70 +1,70 @@ -#include "events/events.h" -#include "probes.h" -#include "test_connection.h" - -#include <library/cpp/actors/core/actor_bootstrapped.h> -#include <library/cpp/lwtrace/mon/mon_lwtrace.h> -#include <library/cpp/monlib/service/pages/templates.h> - -#include <ydb/core/mon/mon.h> -#include <ydb/core/yq/libs/config/yq_issue.h> - -namespace NYq { - -using namespace NActors; - -class TTestConnectionActor : public NActors::TActorBootstrapped<TTestConnectionActor> { - NMonitoring::TDynamicCounterPtr Counters; - NConfig::TTestConnectionConfig Config; - -public: - TTestConnectionActor(const NConfig::TTestConnectionConfig& config, const NMonitoring::TDynamicCounterPtr& counters) - : Counters(counters) - , Config(config) - { - } - - static constexpr char ActorName[] = "YQ_TEST_CONNECTION"; - - void Bootstrap() { - TC_LOG_D("Starting yandex query test connection. Actor id: " << SelfId()); - - NLwTraceMonPage::ProbeRegistry().AddProbesList(LWTRACE_GET_PROBES(YQ_TEST_CONNECTION_PROVIDER)); - - Become(&TTestConnectionActor::StateFunc); - } - - STRICT_STFUNC(StateFunc, - hFunc(TEvTestConnection::TEvTestConnectionRequest, Handle); - hFunc(NMon::TEvHttpInfo, Handle); - ) - - void Handle(TEvTestConnection::TEvTestConnectionRequest::TPtr& ev) { - YandexQuery::TestConnectionRequest request = std::move(ev->Get()->Request); - TC_LOG_T("TestConnectionRequest: " << request.DebugString()); - Send(ev->Sender, new TEvTestConnection::TEvTestConnectionResponse(NYql::TIssues{MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, "Unimplemented yet")}), 0, ev->Cookie); - } - - void Handle(NMon::TEvHttpInfo::TPtr& ev) { - TStringStream str; - HTML(str) { - PRE() { - str << "Current config:" << Endl; - str << Config.DebugString() << Endl; - str << Endl; - } - } - Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str())); - } -}; - -NActors::TActorId TestConnectionActorId() { - constexpr TStringBuf name = "TSTCONN"; - return NActors::TActorId(0, name); -} - -NActors::IActor* CreateTestConnectionActor(const NConfig::TTestConnectionConfig& config, const NMonitoring::TDynamicCounterPtr& counters) { - return new TTestConnectionActor(config, counters); -} - -} // namespace NYq +#include "events/events.h" +#include "probes.h" +#include "test_connection.h" + +#include <library/cpp/actors/core/actor_bootstrapped.h> +#include <library/cpp/lwtrace/mon/mon_lwtrace.h> +#include <library/cpp/monlib/service/pages/templates.h> + +#include <ydb/core/mon/mon.h> +#include <ydb/core/yq/libs/config/yq_issue.h> + +namespace NYq { + +using namespace NActors; + +class TTestConnectionActor : public NActors::TActorBootstrapped<TTestConnectionActor> { + NMonitoring::TDynamicCounterPtr Counters; + NConfig::TTestConnectionConfig Config; + +public: + TTestConnectionActor(const NConfig::TTestConnectionConfig& config, const NMonitoring::TDynamicCounterPtr& counters) + : Counters(counters) + , Config(config) + { + } + + static constexpr char ActorName[] = "YQ_TEST_CONNECTION"; + + void Bootstrap() { + TC_LOG_D("Starting yandex query test connection. Actor id: " << SelfId()); + + NLwTraceMonPage::ProbeRegistry().AddProbesList(LWTRACE_GET_PROBES(YQ_TEST_CONNECTION_PROVIDER)); + + Become(&TTestConnectionActor::StateFunc); + } + + STRICT_STFUNC(StateFunc, + hFunc(TEvTestConnection::TEvTestConnectionRequest, Handle); + hFunc(NMon::TEvHttpInfo, Handle); + ) + + void Handle(TEvTestConnection::TEvTestConnectionRequest::TPtr& ev) { + YandexQuery::TestConnectionRequest request = std::move(ev->Get()->Request); + TC_LOG_T("TestConnectionRequest: " << request.DebugString()); + Send(ev->Sender, new TEvTestConnection::TEvTestConnectionResponse(NYql::TIssues{MakeErrorIssue(TIssuesIds::INTERNAL_ERROR, "Unimplemented yet")}), 0, ev->Cookie); + } + + void Handle(NMon::TEvHttpInfo::TPtr& ev) { + TStringStream str; + HTML(str) { + PRE() { + str << "Current config:" << Endl; + str << Config.DebugString() << Endl; + str << Endl; + } + } + Send(ev->Sender, new NMon::TEvHttpInfoRes(str.Str())); + } +}; + +NActors::TActorId TestConnectionActorId() { + constexpr TStringBuf name = "TSTCONN"; + return NActors::TActorId(0, name); +} + +NActors::IActor* CreateTestConnectionActor(const NConfig::TTestConnectionConfig& config, const NMonitoring::TDynamicCounterPtr& counters) { + return new TTestConnectionActor(config, counters); +} + +} // namespace NYq diff --git a/ydb/core/yq/libs/test_connection/test_connection.h b/ydb/core/yq/libs/test_connection/test_connection.h index 7be25e8e57..1f57eb996c 100644 --- a/ydb/core/yq/libs/test_connection/test_connection.h +++ b/ydb/core/yq/libs/test_connection/test_connection.h @@ -1,27 +1,27 @@ -#pragma once - +#pragma once + #include <ydb/core/yq/libs/actors/logging/log.h> -#include <ydb/core/yq/libs/config/protos/test_connection.pb.h> - -#include <library/cpp/actors/core/actor.h> -#include <library/cpp/monlib/dynamic_counters/counters.h> - - -#define TC_LOG_D(s) \ - LOG_YQ_TEST_CONNECTION_DEBUG(s) -#define TC_LOG_I(s) \ - LOG_YQ_TEST_CONNECTION_INFO(s) -#define TC_LOG_W(s) \ - LOG_YQ_TEST_CONNECTION_WARN(s) -#define TC_LOG_E(s) \ - LOG_YQ_TEST_CONNECTION_ERROR(s) -#define TC_LOG_T(s) \ - LOG_YQ_TEST_CONNECTION_TRACE(s) - -namespace NYq { - -NActors::TActorId TestConnectionActorId(); - -NActors::IActor* CreateTestConnectionActor(const NConfig::TTestConnectionConfig& config, const NMonitoring::TDynamicCounterPtr& counters); - -} // namespace NYq +#include <ydb/core/yq/libs/config/protos/test_connection.pb.h> + +#include <library/cpp/actors/core/actor.h> +#include <library/cpp/monlib/dynamic_counters/counters.h> + + +#define TC_LOG_D(s) \ + LOG_YQ_TEST_CONNECTION_DEBUG(s) +#define TC_LOG_I(s) \ + LOG_YQ_TEST_CONNECTION_INFO(s) +#define TC_LOG_W(s) \ + LOG_YQ_TEST_CONNECTION_WARN(s) +#define TC_LOG_E(s) \ + LOG_YQ_TEST_CONNECTION_ERROR(s) +#define TC_LOG_T(s) \ + LOG_YQ_TEST_CONNECTION_TRACE(s) + +namespace NYq { + +NActors::TActorId TestConnectionActorId(); + +NActors::IActor* CreateTestConnectionActor(const NConfig::TTestConnectionConfig& config, const NMonitoring::TDynamicCounterPtr& counters); + +} // namespace NYq diff --git a/ydb/core/yq/libs/test_connection/ut/test_connection_ut.cpp b/ydb/core/yq/libs/test_connection/ut/test_connection_ut.cpp index 0cd598c0d2..ff21e70a13 100644 --- a/ydb/core/yq/libs/test_connection/ut/test_connection_ut.cpp +++ b/ydb/core/yq/libs/test_connection/ut/test_connection_ut.cpp @@ -1,7 +1,7 @@ -#include <library/cpp/testing/unittest/registar.h> - -namespace NYq { - -// TODO: tests - -} // namespace NYq +#include <library/cpp/testing/unittest/registar.h> + +namespace NYq { + +// TODO: tests + +} // namespace NYq diff --git a/ydb/core/yq/libs/test_connection/ut/ya.make b/ydb/core/yq/libs/test_connection/ut/ya.make index fb0219a36b..b9b590f975 100644 --- a/ydb/core/yq/libs/test_connection/ut/ya.make +++ b/ydb/core/yq/libs/test_connection/ut/ya.make @@ -1,15 +1,15 @@ -UNITTEST_FOR(ydb/core/yq/libs/control_plane_proxy) - -OWNER(g:yq) - -PEERDIR( - library/cpp/testing/unittest -) - -YQL_LAST_ABI_VERSION() - -SRCS( - test_connection_ut.cpp -) - -END() +UNITTEST_FOR(ydb/core/yq/libs/control_plane_proxy) + +OWNER(g:yq) + +PEERDIR( + library/cpp/testing/unittest +) + +YQL_LAST_ABI_VERSION() + +SRCS( + test_connection_ut.cpp +) + +END() diff --git a/ydb/core/yq/libs/test_connection/ya.make b/ydb/core/yq/libs/test_connection/ya.make index 1b320aafcd..dc42a647ae 100644 --- a/ydb/core/yq/libs/test_connection/ya.make +++ b/ydb/core/yq/libs/test_connection/ya.make @@ -1,27 +1,27 @@ -OWNER(g:yq) - -LIBRARY() - -SRCS( - test_connection.cpp - probes.cpp -) - -PEERDIR( - library/cpp/lwtrace +OWNER(g:yq) + +LIBRARY() + +SRCS( + test_connection.cpp + probes.cpp +) + +PEERDIR( + library/cpp/lwtrace ydb/core/yq/libs/actors/logging - ydb/core/yq/libs/config/protos + ydb/core/yq/libs/config/protos ydb/core/yq/libs/test_connection/events -) - -YQL_LAST_ABI_VERSION() - -END() - -RECURSE( - events -) - -RECURSE_FOR_TESTS( - ut -) +) + +YQL_LAST_ABI_VERSION() + +END() + +RECURSE( + events +) + +RECURSE_FOR_TESTS( + ut +) diff --git a/ydb/core/yq/libs/ya.make b/ydb/core/yq/libs/ya.make index ccc88a55b6..2ddd5d54bd 100644 --- a/ydb/core/yq/libs/ya.make +++ b/ydb/core/yq/libs/ya.make @@ -7,7 +7,7 @@ RECURSE( checkpointing checkpointing_common common - config + config control_plane_proxy control_plane_storage db_resolver @@ -17,7 +17,7 @@ RECURSE( graph_params hmac init - logs + logs mock pretty_printers private_client @@ -26,6 +26,6 @@ RECURSE( shared_resources signer tasks_packer - test_connection - ydb + test_connection + ydb ) diff --git a/ydb/core/yq/libs/ydb/ydb.cpp b/ydb/core/yq/libs/ydb/ydb.cpp index d6096abce3..0c3a8d9e72 100644 --- a/ydb/core/yq/libs/ydb/ydb.cpp +++ b/ydb/core/yq/libs/ydb/ydb.cpp @@ -4,12 +4,12 @@ #include <util/stream/str.h> #include <util/string/printf.h> -#include <util/stream/file.h> -#include <util/string/strip.h> -#include <util/system/env.h> +#include <util/stream/file.h> +#include <util/string/strip.h> +#include <util/system/env.h> #include <ydb/library/security/ydb_credentials_provider_factory.h> - + namespace NYq { using namespace NThreading; @@ -55,10 +55,10 @@ TFuture<TStatus> CheckGeneration( return MakeFuture<TStatus>(selectResult); } - + TResultSetParser parser(selectResult.GetResultSet(0)); if (parser.TryNextRow()) { - context->GenerationRead = parser.ColumnParser(context->GenerationColumn).GetOptionalUint64().GetOrElse(0); + context->GenerationRead = parser.ColumnParser(context->GenerationColumn).GetOptionalUint64().GetOrElse(0); } bool isOk = false; @@ -186,24 +186,24 @@ TYdbConnection::~TYdbConnection() //////////////////////////////////////////////////////////////////////////////// - -NYdb::TDriverConfig GetDriverConfig(const NConfig::TYdbStorageConfig& config, - const NKikimr::TYdbCredentialsProviderFactory& credProviderFactory) { - TString oauth; - if (config.GetToken()) { - oauth = config.GetToken(); - } else if (config.GetOAuthFile()) { - oauth = StripString(TFileInput(config.GetOAuthFile()).ReadAll()); - } else { - oauth = GetEnv("YDB_TOKEN"); - } - - const TString iamEndpoint = config.GetIamEndpoint(); - const TString saKeyFile = config.GetSaKeyFile(); - + +NYdb::TDriverConfig GetDriverConfig(const NConfig::TYdbStorageConfig& config, + const NKikimr::TYdbCredentialsProviderFactory& credProviderFactory) { + TString oauth; + if (config.GetToken()) { + oauth = config.GetToken(); + } else if (config.GetOAuthFile()) { + oauth = StripString(TFileInput(config.GetOAuthFile()).ReadAll()); + } else { + oauth = GetEnv("YDB_TOKEN"); + } + + const TString iamEndpoint = config.GetIamEndpoint(); + const TString saKeyFile = config.GetSaKeyFile(); + auto driverConfig = TDriverConfig() .SetEndpoint(config.GetEndpoint()) - .SetDatabase(config.GetDatabase()); + .SetDatabase(config.GetDatabase()); NKikimr::TYdbCredentialsSettings credSettings; credSettings.UseLocalMetadata = config.GetUseLocalMetadataService(); @@ -213,20 +213,20 @@ NYdb::TDriverConfig GetDriverConfig(const NConfig::TYdbStorageConfig& config, driverConfig.SetCredentialsProviderFactory(credProviderFactory(credSettings)); - if (config.GetUseLocalMetadataService()) { - driverConfig.UseSecureConnection(); - } - - if (config.GetCertificateFile()) { - auto cert = StripString(TFileInput(config.GetCertificateFile()).ReadAll()); - driverConfig.UseSecureConnection(cert); - } - - return driverConfig; -} - -TYdbConnectionPtr NewYdbConnection(const NConfig::TYdbStorageConfig& config, - const NKikimr::TYdbCredentialsProviderFactory& credProviderFactory) { + if (config.GetUseLocalMetadataService()) { + driverConfig.UseSecureConnection(); + } + + if (config.GetCertificateFile()) { + auto cert = StripString(TFileInput(config.GetCertificateFile()).ReadAll()); + driverConfig.UseSecureConnection(cert); + } + + return driverConfig; +} + +TYdbConnectionPtr NewYdbConnection(const NConfig::TYdbStorageConfig& config, + const NKikimr::TYdbCredentialsProviderFactory& credProviderFactory) { auto driverConfig = GetDriverConfig(config, credProviderFactory); return MakeIntrusive<TYdbConnection>(driverConfig, config); } diff --git a/ydb/core/yq/libs/ydb/ydb.h b/ydb/core/yq/libs/ydb/ydb.h index 14c0742288..be2c330b58 100644 --- a/ydb/core/yq/libs/ydb/ydb.h +++ b/ydb/core/yq/libs/ydb/ydb.h @@ -95,7 +95,7 @@ using TGenerationContextPtr = TIntrusivePtr<TGenerationContext>; //////////////////////////////////////////////////////////////////////////////// NYdb::TDriverConfig GetDriverConfig(const NConfig::TYdbStorageConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credProviderFactory); - + TYdbConnectionPtr NewYdbConnection(const NConfig::TYdbStorageConfig& config, const NKikimr::TYdbCredentialsProviderFactory& credProviderFactory); NYdb::TStatus MakeErrorStatus( diff --git a/ydb/library/folder_service/folder_service.h b/ydb/library/folder_service/folder_service.h index 142118c3c9..1b7ef8ff5a 100644 --- a/ydb/library/folder_service/folder_service.h +++ b/ydb/library/folder_service/folder_service.h @@ -1,12 +1,12 @@ #pragma once #include <ydb/library/folder_service/proto/config.pb.h> -#include <library/cpp/actors/core/actor.h> - +#include <library/cpp/actors/core/actor.h> + namespace NKikimr::NFolderService { - + NActors::TActorId FolderServiceActorId(); - + NActors::IActor* CreateFolderServiceActor(const NKikimrProto::NFolderService::TFolderServiceConfig& config); - + } // namespace NKikimr::NFolderService diff --git a/ydb/library/protobuf_printer/hide_field_printer.cpp b/ydb/library/protobuf_printer/hide_field_printer.cpp index 743701a31b..8249baade9 100644 --- a/ydb/library/protobuf_printer/hide_field_printer.cpp +++ b/ydb/library/protobuf_printer/hide_field_printer.cpp @@ -3,49 +3,49 @@ namespace NKikimr { void THideFieldValuePrinter::PrintBool(bool, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } void THideFieldValuePrinter::PrintInt32(i32, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } void THideFieldValuePrinter::PrintUInt32(ui32, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } void THideFieldValuePrinter::PrintInt64(i64, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } void THideFieldValuePrinter::PrintUInt64(ui64, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } void THideFieldValuePrinter::PrintFloat(float, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } void THideFieldValuePrinter::PrintDouble(double, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } void THideFieldValuePrinter::PrintString(const TString&, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("\"***\""); + generator->PrintLiteral("\"***\""); } void THideFieldValuePrinter::PrintBytes(const TString&, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("\"***\""); + generator->PrintLiteral("\"***\""); } void THideFieldValuePrinter::PrintEnum(i32, const TString&, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); } bool THideFieldValuePrinter::PrintMessageContent(const google::protobuf::Message&, int, int, bool singleLineMode, google::protobuf::TextFormat::BaseTextGenerator* generator) const { - generator->PrintLiteral("***"); + generator->PrintLiteral("***"); if (singleLineMode) { generator->PrintLiteral(" "); } else { diff --git a/ydb/library/protobuf_printer/protobuf_printer_ut.cpp b/ydb/library/protobuf_printer/protobuf_printer_ut.cpp index f71c330d46..93f1a45716 100644 --- a/ydb/library/protobuf_printer/protobuf_printer_ut.cpp +++ b/ydb/library/protobuf_printer/protobuf_printer_ut.cpp @@ -1,6 +1,6 @@ #include "hide_field_printer.h" #include "protobuf_printer.h" -#include "security_printer.h" +#include "security_printer.h" #include "stream_helper.h" #include "token_field_printer.h" #include <ydb/library/protobuf_printer/ut/test_proto.pb.h> @@ -51,43 +51,43 @@ Y_UNIT_TEST_SUITE(HideFieldPrinterTest) { printer.RegisterFieldValuePrinters<NTestProto::TTestProto, THideFieldValuePrinter>("s1", "s2", "msg"); { const TString s = TProtobufPrinterOutputWrapper(m, printer); - UNIT_ASSERT_STRINGS_EQUAL(s, "s1: \"***\"\ns2: \"***\"\nmsg {\n ***\n}\n"); + UNIT_ASSERT_STRINGS_EQUAL(s, "s1: \"***\"\ns2: \"***\"\nmsg {\n ***\n}\n"); } printer.SetSingleLineMode(true); { const TString s = TProtobufPrinterOutputWrapper(m, printer); - UNIT_ASSERT_STRINGS_EQUAL(s, "s1: \"***\" s2: \"***\" msg { *** } "); - } - } -} - -Y_UNIT_TEST_SUITE(SecurityPrinterTest) { - Y_UNIT_TEST(PrintSensitive) { - NTestProto::TConnectionContent m; - m.set_name("name1"); - m.mutable_setting()->mutable_connection2()->set_login("login1"); - m.mutable_setting()->mutable_connection2()->set_password("pswd"); - - TSecurityTextFormatPrinter<NTestProto::TConnectionContent> printer; - printer.SetSingleLineMode(true); - { - const TString s = TProtobufPrinterOutputWrapper(m, printer); - UNIT_ASSERT_STRINGS_EQUAL(s, "name: \"name1\" setting { connection2 { login: \"***\" password: \"***\" } } "); - } - } - - Y_UNIT_TEST(PrintRecursiveType) { - NTestProto::TRecursiveType response; - response.set_name("name1"); - response.set_login("login1"); - response.add_types()->set_login("login2"); - response.add_types()->set_name("name3"); - TSecurityTextFormatPrinter<NTestProto::TRecursiveType> printer; - printer.SetSingleLineMode(true); - { - const TString s = TProtobufPrinterOutputWrapper(response, printer); - UNIT_ASSERT_STRINGS_EQUAL(s, "name: \"name1\" login: \"***\" types { login: \"***\" } types { name: \"name3\" } "); + UNIT_ASSERT_STRINGS_EQUAL(s, "s1: \"***\" s2: \"***\" msg { *** } "); } } } + +Y_UNIT_TEST_SUITE(SecurityPrinterTest) { + Y_UNIT_TEST(PrintSensitive) { + NTestProto::TConnectionContent m; + m.set_name("name1"); + m.mutable_setting()->mutable_connection2()->set_login("login1"); + m.mutable_setting()->mutable_connection2()->set_password("pswd"); + + TSecurityTextFormatPrinter<NTestProto::TConnectionContent> printer; + printer.SetSingleLineMode(true); + { + const TString s = TProtobufPrinterOutputWrapper(m, printer); + UNIT_ASSERT_STRINGS_EQUAL(s, "name: \"name1\" setting { connection2 { login: \"***\" password: \"***\" } } "); + } + } + + Y_UNIT_TEST(PrintRecursiveType) { + NTestProto::TRecursiveType response; + response.set_name("name1"); + response.set_login("login1"); + response.add_types()->set_login("login2"); + response.add_types()->set_name("name3"); + TSecurityTextFormatPrinter<NTestProto::TRecursiveType> printer; + printer.SetSingleLineMode(true); + { + const TString s = TProtobufPrinterOutputWrapper(response, printer); + UNIT_ASSERT_STRINGS_EQUAL(s, "name: \"name1\" login: \"***\" types { login: \"***\" } types { name: \"name3\" } "); + } + } +} diff --git a/ydb/library/protobuf_printer/security_printer.h b/ydb/library/protobuf_printer/security_printer.h index 69398949d0..6ab3bad060 100644 --- a/ydb/library/protobuf_printer/security_printer.h +++ b/ydb/library/protobuf_printer/security_printer.h @@ -1,37 +1,37 @@ -#pragma once - -#include "hide_field_printer.h" +#pragma once + +#include "hide_field_printer.h" #include <ydb/public/api/protos/annotations/sensitive.pb.h> - -#include <google/protobuf/message.h> -#include <google/protobuf/text_format.h> - -#include <util/generic/set.h> - -namespace NKikimr { - -template<typename TMsg> -class TSecurityTextFormatPrinter : public google::protobuf::TextFormat::Printer { -public: - TSecurityTextFormatPrinter() { - TSet<std::pair<TString, int>> visited; - Walk(TMsg::descriptor(), visited); - } - - void Walk(const google::protobuf::Descriptor* desc, TSet<std::pair<TString, int>>& visited) { - if (!desc || visited.contains(std::pair<TString, int>{desc->full_name(), desc->index()})) { - return; - } - visited.insert({desc->full_name(), desc->index()}); - for (int i = 0; i < desc->field_count(); i++) { - const auto field = desc->field(i); - const auto options = field->options(); - if (options.GetExtension(Ydb::sensitive)) { - RegisterFieldValuePrinter(field, new THideFieldValuePrinter()); - } - Walk(field->message_type(), visited); - } - } -}; - -} // namespace NKikimr + +#include <google/protobuf/message.h> +#include <google/protobuf/text_format.h> + +#include <util/generic/set.h> + +namespace NKikimr { + +template<typename TMsg> +class TSecurityTextFormatPrinter : public google::protobuf::TextFormat::Printer { +public: + TSecurityTextFormatPrinter() { + TSet<std::pair<TString, int>> visited; + Walk(TMsg::descriptor(), visited); + } + + void Walk(const google::protobuf::Descriptor* desc, TSet<std::pair<TString, int>>& visited) { + if (!desc || visited.contains(std::pair<TString, int>{desc->full_name(), desc->index()})) { + return; + } + visited.insert({desc->full_name(), desc->index()}); + for (int i = 0; i < desc->field_count(); i++) { + const auto field = desc->field(i); + const auto options = field->options(); + if (options.GetExtension(Ydb::sensitive)) { + RegisterFieldValuePrinter(field, new THideFieldValuePrinter()); + } + Walk(field->message_type(), visited); + } + } +}; + +} // namespace NKikimr diff --git a/ydb/library/protobuf_printer/ut/test_proto.proto b/ydb/library/protobuf_printer/ut/test_proto.proto index 80bf23c804..908530a799 100644 --- a/ydb/library/protobuf_printer/ut/test_proto.proto +++ b/ydb/library/protobuf_printer/ut/test_proto.proto @@ -3,7 +3,7 @@ syntax = "proto3"; package NTestProto; import "ydb/public/api/protos/annotations/sensitive.proto"; - + message TTestSubProto { uint64 i = 1; } @@ -14,33 +14,33 @@ message TTestProto { string token = 3; TTestSubProto msg = 4; } - -message TConnection1 { - string database_id = 1; - string token = 2 [(Ydb.sensitive) = true]; -} - -message TConnection2 { - string database_id = 1; - string login = 2 [(Ydb.sensitive) = true]; - string password = 3 [(Ydb.sensitive) = true]; -} - -message TConnectionSetting { - oneof connection { - TConnection1 connection1 = 1; - TConnection2 connection2 = 2; - } -} - -message TConnectionContent { - string name = 1; - TConnectionSetting setting = 2; - string description = 3; -} - -message TRecursiveType { - string name = 1; - string login = 2 [(Ydb.sensitive) = true]; - repeated TRecursiveType types = 3; -} + +message TConnection1 { + string database_id = 1; + string token = 2 [(Ydb.sensitive) = true]; +} + +message TConnection2 { + string database_id = 1; + string login = 2 [(Ydb.sensitive) = true]; + string password = 3 [(Ydb.sensitive) = true]; +} + +message TConnectionSetting { + oneof connection { + TConnection1 connection1 = 1; + TConnection2 connection2 = 2; + } +} + +message TConnectionContent { + string name = 1; + TConnectionSetting setting = 2; + string description = 3; +} + +message TRecursiveType { + string name = 1; + string login = 2 [(Ydb.sensitive) = true]; + repeated TRecursiveType types = 3; +} diff --git a/ydb/library/security/ut/util_ut.cpp b/ydb/library/security/ut/util_ut.cpp index bcb134f870..158c6b656e 100644 --- a/ydb/library/security/ut/util_ut.cpp +++ b/ydb/library/security/ut/util_ut.cpp @@ -1,11 +1,11 @@ - + #include <ydb/library/security/util.h> - -#include <library/cpp/testing/unittest/registar.h> - -Y_UNIT_TEST_SUITE(Util) { - Y_UNIT_TEST(MaskTicket) { - TString ticket = "my_secret_abaabaabaaba"; - UNIT_ASSERT_VALUES_EQUAL(NKikimr::MaskTicket(ticket), "my_s****aaba (47A7C701)"); - } -} + +#include <library/cpp/testing/unittest/registar.h> + +Y_UNIT_TEST_SUITE(Util) { + Y_UNIT_TEST(MaskTicket) { + TString ticket = "my_secret_abaabaabaaba"; + UNIT_ASSERT_VALUES_EQUAL(NKikimr::MaskTicket(ticket), "my_s****aaba (47A7C701)"); + } +} diff --git a/ydb/library/security/ut/ya.make b/ydb/library/security/ut/ya.make index a6955ed999..a0b65af91a 100644 --- a/ydb/library/security/ut/ya.make +++ b/ydb/library/security/ut/ya.make @@ -1,16 +1,16 @@ -UNITTEST() - +UNITTEST() + OWNER( hcpp g:kikimr ) - -PEERDIR( + +PEERDIR( ydb/library/security -) - -SRCS( - util_ut.cpp -) - -END() +) + +SRCS( + util_ut.cpp +) + +END() diff --git a/ydb/library/security/util.cpp b/ydb/library/security/util.cpp index 0472117a89..feb258bf8a 100644 --- a/ydb/library/security/util.cpp +++ b/ydb/library/security/util.cpp @@ -1,29 +1,29 @@ -#include "util.h" - -#include <util/string/builder.h> -#include <util/string/printf.h> - -#include <library/cpp/digest/crc32c/crc32c.h> - -namespace NKikimr { - -TString MaskTicket(TStringBuf token) { - TStringBuilder mask; - if (token.size() >= 16) { - mask << token.substr(0, 4); - mask << "****"; - mask << token.substr(token.size() - 4, 4); - } else { - mask << "****"; - } - mask << " ("; - mask << Sprintf("%08X", Crc32c(token.data(), token.size())); - mask << ")"; - return mask; -} - -TString MaskTicket(const TString& token) { - return MaskTicket(TStringBuf(token)); -} - -} // namespace NKikimr +#include "util.h" + +#include <util/string/builder.h> +#include <util/string/printf.h> + +#include <library/cpp/digest/crc32c/crc32c.h> + +namespace NKikimr { + +TString MaskTicket(TStringBuf token) { + TStringBuilder mask; + if (token.size() >= 16) { + mask << token.substr(0, 4); + mask << "****"; + mask << token.substr(token.size() - 4, 4); + } else { + mask << "****"; + } + mask << " ("; + mask << Sprintf("%08X", Crc32c(token.data(), token.size())); + mask << ")"; + return mask; +} + +TString MaskTicket(const TString& token) { + return MaskTicket(TStringBuf(token)); +} + +} // namespace NKikimr diff --git a/ydb/library/security/util.h b/ydb/library/security/util.h index 7f6d9791a2..5dcd2f35ea 100644 --- a/ydb/library/security/util.h +++ b/ydb/library/security/util.h @@ -1,11 +1,11 @@ -#pragma once - -#include <util/generic/fwd.h> +#pragma once + +#include <util/generic/fwd.h> #include <util/datetime/base.h> - -namespace NKikimr { - TString MaskTicket(TStringBuf token); - TString MaskTicket(const TString& token); + +namespace NKikimr { + TString MaskTicket(TStringBuf token); + TString MaskTicket(const TString& token); // copy-pasted from <robot/library/utils/time_convert.h> template<typename Rep, typename Period> @@ -17,4 +17,4 @@ namespace NKikimr { constexpr TInstant ToInstant(std::chrono::time_point<Clock, Duration> value) { return TInstant::MicroSeconds(ToMicroseconds(value.time_since_epoch())); } -} +} diff --git a/ydb/library/security/ya.make b/ydb/library/security/ya.make index ce048987e4..c6a72991fa 100644 --- a/ydb/library/security/ya.make +++ b/ydb/library/security/ya.make @@ -1,22 +1,22 @@ -LIBRARY() - +LIBRARY() + OWNER( hcpp g:kikimr ) - -PEERDIR( - library/cpp/digest/crc32c + +PEERDIR( + library/cpp/digest/crc32c ydb/public/sdk/cpp/client/ydb_types/credentials -) - -SRCS( - util.cpp +) + +SRCS( + util.cpp ydb_credentials_provider_factory.cpp -) - -END() - +) + +END() + RECURSE_FOR_TESTS( - ut -) + ut +) diff --git a/ydb/library/yql/providers/ydb/provider/yql_ydb_load_meta.cpp b/ydb/library/yql/providers/ydb/provider/yql_ydb_load_meta.cpp index 607b3ba7a8..eded643d5b 100644 --- a/ydb/library/yql/providers/ydb/provider/yql_ydb_load_meta.cpp +++ b/ydb/library/yql/providers/ydb/provider/yql_ydb_load_meta.cpp @@ -217,7 +217,7 @@ public: } else { failed = true; const auto& config = State_->Configuration->Clusters[TString(client.first)]; - ctx.AddError(TIssue({}, TStringBuilder() << "Failed to take snapshot for: `" << client.first << "`, endpoint: " << config.Endpoint << ", status: " << snapshot.GetStatus())); + ctx.AddError(TIssue({}, TStringBuilder() << "Failed to take snapshot for: `" << client.first << "`, endpoint: " << config.Endpoint << ", status: " << snapshot.GetStatus())); for (const auto& issue : snapshot.GetIssues()) ctx.AddError(issue); } @@ -254,7 +254,7 @@ public: meta.Partitions.back().back().clear(); } else { failed = true; - ctx.AddError(TIssue({}, TStringBuilder() << "Failed to load table metadata for: `" << pair.first.second << ", status: " << result.GetStatus() << "`\n")); + ctx.AddError(TIssue({}, TStringBuilder() << "Failed to load table metadata for: `" << pair.first.second << ", status: " << result.GetStatus() << "`\n")); for (const auto& issue : result.GetIssues()) ctx.AddError(issue); } diff --git a/ydb/public/api/grpc/ya.make b/ydb/public/api/grpc/ya.make index 24173a0264..a5bfe94831 100644 --- a/ydb/public/api/grpc/ya.make +++ b/ydb/public/api/grpc/ya.make @@ -24,7 +24,7 @@ SRCS( ydb_scheme_v1.proto ydb_scripting_v1.proto ydb_table_v1.proto - yq_v1.proto + yq_v1.proto ) PEERDIR( diff --git a/ydb/public/api/grpc/yq_v1.proto b/ydb/public/api/grpc/yq_v1.proto index 6f48bcc11f..ae5da41e7c 100644 --- a/ydb/public/api/grpc/yq_v1.proto +++ b/ydb/public/api/grpc/yq_v1.proto @@ -1,79 +1,79 @@ -syntax = "proto3"; - -package YandexQuery.V1; -option java_package = "com.yandex.query.v1"; - +syntax = "proto3"; + +package YandexQuery.V1; +option java_package = "com.yandex.query.v1"; + import "ydb/public/api/protos/yq.proto"; - -service YandexQueryService { - // Query - // Query is the text of an SQL request, the results of the last run and the state after the last run (partitions offsets, consumer in YDS) - // Create a query object with a given SQL - rpc CreateQuery(YandexQuery.CreateQueryRequest) returns (YandexQuery.CreateQueryResponse); - - // Get a list of brief queries objects - rpc ListQueries(YandexQuery.ListQueriesRequest) returns (YandexQuery.ListQueriesResponse); - - // Get full information about the object of the query - rpc DescribeQuery(YandexQuery.DescribeQueryRequest) returns (YandexQuery.DescribeQueryResponse); - + +service YandexQueryService { + // Query + // Query is the text of an SQL request, the results of the last run and the state after the last run (partitions offsets, consumer in YDS) + // Create a query object with a given SQL + rpc CreateQuery(YandexQuery.CreateQueryRequest) returns (YandexQuery.CreateQueryResponse); + + // Get a list of brief queries objects + rpc ListQueries(YandexQuery.ListQueriesRequest) returns (YandexQuery.ListQueriesResponse); + + // Get full information about the object of the query + rpc DescribeQuery(YandexQuery.DescribeQueryRequest) returns (YandexQuery.DescribeQueryResponse); + // Get status of the query rpc GetQueryStatus(YandexQuery.GetQueryStatusRequest) returns (YandexQuery.GetQueryStatusResponse); - // Change the attributes of the query (acl, name, ...) - rpc ModifyQuery(YandexQuery.ModifyQueryRequest) returns (YandexQuery.ModifyQueryResponse); - - // Completely delete the query - rpc DeleteQuery(YandexQuery.DeleteQueryRequest) returns (YandexQuery.DeleteQueryResponse); - - // Change the state of the query lifecycle - rpc ControlQuery(YandexQuery.ControlQueryRequest) returns (YandexQuery.ControlQueryResponse); - - // Get a results page - rpc GetResultData(YandexQuery.GetResultDataRequest) returns (YandexQuery.GetResultDataResponse); - - // Job - // Job - appears immediately after starting the request and contains the request metadata + // Change the attributes of the query (acl, name, ...) + rpc ModifyQuery(YandexQuery.ModifyQueryRequest) returns (YandexQuery.ModifyQueryResponse); + + // Completely delete the query + rpc DeleteQuery(YandexQuery.DeleteQueryRequest) returns (YandexQuery.DeleteQueryResponse); + + // Change the state of the query lifecycle + rpc ControlQuery(YandexQuery.ControlQueryRequest) returns (YandexQuery.ControlQueryResponse); + + // Get a results page + rpc GetResultData(YandexQuery.GetResultDataRequest) returns (YandexQuery.GetResultDataResponse); + + // Job + // Job - appears immediately after starting the request and contains the request metadata // Get a list of jobs - rpc ListJobs(YandexQuery.ListJobsRequest) returns (YandexQuery.ListJobsResponse); - + rpc ListJobs(YandexQuery.ListJobsRequest) returns (YandexQuery.ListJobsResponse); + // Get information about the job rpc DescribeJob(YandexQuery.DescribeJobRequest) returns (YandexQuery.DescribeJobResponse); - // Connection - // Connection - entity that describes connection points. This can be imagined as an analogue of a network address. - // Create a connection object (ObjectStorage, YDB, YDS, ...) - rpc CreateConnection(YandexQuery.CreateConnectionRequest) returns (YandexQuery.CreateConnectionResponse); - - // Get a list of connections objects - rpc ListConnections(YandexQuery.ListConnectionsRequest) returns (YandexQuery.ListConnectionsResponse); - - // Get information about the object of the connection - rpc DescribeConnection(YandexQuery.DescribeConnectionRequest) returns (YandexQuery.DescribeConnectionResponse); - - // Change the attributes of the connection - rpc ModifyConnection(YandexQuery.ModifyConnectionRequest) returns (YandexQuery.ModifyConnectionResponse); - - // Completely delete the connection - rpc DeleteConnection(YandexQuery.DeleteConnectionRequest) returns (YandexQuery.DeleteConnectionResponse); - - // Test the connection (permissions, network, ...) - rpc TestConnection(YandexQuery.TestConnectionRequest) returns (YandexQuery.TestConnectionResponse); - - // Binding - // Binding - entity using which a schema is assigned to non-schematic data - // Create a binding object - bind schema with ObjectStorage object or YDS stream - rpc CreateBinding(YandexQuery.CreateBindingRequest) returns (YandexQuery.CreateBindingResponse); - - // Get a list of bindings objects - rpc ListBindings(YandexQuery.ListBindingsRequest) returns (YandexQuery.ListBindingsResponse); - - // Get information about the object of the binding - rpc DescribeBinding(YandexQuery.DescribeBindingRequest) returns (YandexQuery.DescribeBindingResponse); - - // Change the attributes of the binding - rpc ModifyBinding(YandexQuery.ModifyBindingRequest) returns (YandexQuery.ModifyBindingResponse); - - // Completely delete the binding - rpc DeleteBinding(YandexQuery.DeleteBindingRequest) returns (YandexQuery.DeleteBindingResponse); -} + // Connection + // Connection - entity that describes connection points. This can be imagined as an analogue of a network address. + // Create a connection object (ObjectStorage, YDB, YDS, ...) + rpc CreateConnection(YandexQuery.CreateConnectionRequest) returns (YandexQuery.CreateConnectionResponse); + + // Get a list of connections objects + rpc ListConnections(YandexQuery.ListConnectionsRequest) returns (YandexQuery.ListConnectionsResponse); + + // Get information about the object of the connection + rpc DescribeConnection(YandexQuery.DescribeConnectionRequest) returns (YandexQuery.DescribeConnectionResponse); + + // Change the attributes of the connection + rpc ModifyConnection(YandexQuery.ModifyConnectionRequest) returns (YandexQuery.ModifyConnectionResponse); + + // Completely delete the connection + rpc DeleteConnection(YandexQuery.DeleteConnectionRequest) returns (YandexQuery.DeleteConnectionResponse); + + // Test the connection (permissions, network, ...) + rpc TestConnection(YandexQuery.TestConnectionRequest) returns (YandexQuery.TestConnectionResponse); + + // Binding + // Binding - entity using which a schema is assigned to non-schematic data + // Create a binding object - bind schema with ObjectStorage object or YDS stream + rpc CreateBinding(YandexQuery.CreateBindingRequest) returns (YandexQuery.CreateBindingResponse); + + // Get a list of bindings objects + rpc ListBindings(YandexQuery.ListBindingsRequest) returns (YandexQuery.ListBindingsResponse); + + // Get information about the object of the binding + rpc DescribeBinding(YandexQuery.DescribeBindingRequest) returns (YandexQuery.DescribeBindingResponse); + + // Change the attributes of the binding + rpc ModifyBinding(YandexQuery.ModifyBindingRequest) returns (YandexQuery.ModifyBindingResponse); + + // Completely delete the binding + rpc DeleteBinding(YandexQuery.DeleteBindingRequest) returns (YandexQuery.DeleteBindingResponse); +} diff --git a/ydb/public/api/protos/annotations/sensitive.proto b/ydb/public/api/protos/annotations/sensitive.proto index 081471030a..7c1ad048cc 100644 --- a/ydb/public/api/protos/annotations/sensitive.proto +++ b/ydb/public/api/protos/annotations/sensitive.proto @@ -1,12 +1,12 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package Ydb; -option java_package = "com.yandex.ydb"; - -import "google/protobuf/descriptor.proto"; - - -extend google.protobuf.FieldOptions { - bool sensitive = 87655; // do not print this field -} +syntax = "proto3"; +option cc_enable_arenas = true; + +package Ydb; +option java_package = "com.yandex.ydb"; + +import "google/protobuf/descriptor.proto"; + + +extend google.protobuf.FieldOptions { + bool sensitive = 87655; // do not print this field +} diff --git a/ydb/public/api/protos/annotations/ya.make b/ydb/public/api/protos/annotations/ya.make index a4d2dab483..3aa0c3c25c 100644 --- a/ydb/public/api/protos/annotations/ya.make +++ b/ydb/public/api/protos/annotations/ya.make @@ -6,7 +6,7 @@ OWNER( ) SRCS( - sensitive.proto + sensitive.proto validation.proto ) diff --git a/ydb/public/api/protos/draft/datastreams.proto b/ydb/public/api/protos/draft/datastreams.proto index 5c1354288a..816ad374fa 100644 --- a/ydb/public/api/protos/draft/datastreams.proto +++ b/ydb/public/api/protos/draft/datastreams.proto @@ -512,7 +512,7 @@ message PutRecordRequest { // Hash value used to explicitly determine the shard string explicit_hash_key = 3; // Used as input to hash function that maps partition key to a specific shard - string partition_key = 4; + string partition_key = 4; string sequence_number_for_ordering = 5; // Name of the stream to put record to string stream_name = 6; diff --git a/ydb/public/api/protos/ya.make b/ydb/public/api/protos/ya.make index 8a156403a3..08e9d19937 100644 --- a/ydb/public/api/protos/ya.make +++ b/ydb/public/api/protos/ya.make @@ -44,7 +44,7 @@ SRCS( ydb_table.proto ydb_value.proto ydb_s3_internal.proto - yq.proto + yq.proto ) CPP_PROTO_PLUGIN0(validation ydb/core/grpc_services/validation) diff --git a/ydb/public/api/protos/yq.proto b/ydb/public/api/protos/yq.proto index 6aa7169a89..ad67fb6169 100644 --- a/ydb/public/api/protos/yq.proto +++ b/ydb/public/api/protos/yq.proto @@ -1,85 +1,85 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package YandexQuery; -option java_package = "com.yandex.query"; -option java_outer_classname = "YandexQueryProtos"; - +syntax = "proto3"; +option cc_enable_arenas = true; + +package YandexQuery; +option java_package = "com.yandex.query"; +option java_outer_classname = "YandexQueryProtos"; + import "ydb/public/api/protos/annotations/sensitive.proto"; import "ydb/public/api/protos/annotations/validation.proto"; import "ydb/public/api/protos/ydb_operation.proto"; import "ydb/public/api/protos/ydb_value.proto"; import "ydb/public/api/protos/ydb_issue_message.proto"; - -import "google/protobuf/duration.proto"; -import "google/protobuf/timestamp.proto"; -import "google/protobuf/empty.proto"; - -//////////////////////////////////////////////////////////// - -// === Query API === - -// Header: x-yq-scope => yandexcloud://cloud_id/folder_id - -message Acl { - enum Visibility { - VISIBILITY_UNSPECIFIED = 0; - PRIVATE = 1; // Visibility only for the creator of the entity - SCOPE = 2; // Visibility for subjects within scope - } - Visibility visibility = 1; -} - -message Limits { - // Used only for streaming queries + +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/empty.proto"; + +//////////////////////////////////////////////////////////// + +// === Query API === + +// Header: x-yq-scope => yandexcloud://cloud_id/folder_id + +message Acl { + enum Visibility { + VISIBILITY_UNSPECIFIED = 0; + PRIVATE = 1; // Visibility only for the creator of the entity + SCOPE = 2; // Visibility for subjects within scope + } + Visibility visibility = 1; +} + +message Limits { + // Used only for streaming queries int64 vcpu_rate_limit = 1 [(Ydb.value) = ">= 0"]; // 0.01 vcpu per second int64 flow_rate_limit = 2 [(Ydb.value) = ">= 0"]; // Bytes per second int64 vcpu_time_limit = 3 [(Ydb.value) = ">= 0"]; // Milliseconds per second - - // Used only for analytics queries + + // Used only for analytics queries int64 max_result_size = 4 [(Ydb.value) = ">= 0"]; // Bytes int64 max_result_rows = 5 [(Ydb.value) = ">= 0"]; // Count - - // Common limits + + // Common limits int64 memory_limit = 6 [(Ydb.value) = ">= 0"]; // Bytes - google.protobuf.Duration result_ttl = 7; -} - -enum ExecuteMode { - EXECUTE_MODE_UNSPECIFIED = 0; - SAVE = 1; // Save a query without changing its state - PARSE = 2; // Parse the query - COMPILE = 3; // Parse and compile the query - VALIDATE = 4; // Parse, compile and validate the query - EXPLAIN = 5; // High-level query plan that specifies only physical operations and non-temporary table names - RUN = 6; // Do all the previous + execution of the query -} - -enum QueryAction { - QUERY_ACTION_UNSPECIFIED = 0; - PAUSE = 1; // Pause the query, with the possibility of its quick resumption + google.protobuf.Duration result_ttl = 7; +} + +enum ExecuteMode { + EXECUTE_MODE_UNSPECIFIED = 0; + SAVE = 1; // Save a query without changing its state + PARSE = 2; // Parse the query + COMPILE = 3; // Parse and compile the query + VALIDATE = 4; // Parse, compile and validate the query + EXPLAIN = 5; // High-level query plan that specifies only physical operations and non-temporary table names + RUN = 6; // Do all the previous + execution of the query +} + +enum QueryAction { + QUERY_ACTION_UNSPECIFIED = 0; + PAUSE = 1; // Pause the query, with the possibility of its quick resumption PAUSE_GRACEFULLY = 2; // Similar to PAUSE, only suspends the query allowing it to pause in checkpoint. Can work for a long time - ABORT = 3; // Stop the query + ABORT = 3; // Stop the query ABORT_GRACEFULLY = 4; // Similar to ABORT, only stops the query in checkpoint - RESUME = 5; // Resumes the execution of the query. Works only for PAUSE queries -} - -enum StateLoadMode { - STATE_LOAD_MODE_UNSPECIFIED = 0; + RESUME = 5; // Resumes the execution of the query. Works only for PAUSE queries +} + +enum StateLoadMode { + STATE_LOAD_MODE_UNSPECIFIED = 0; EMPTY = 1; // Start the query with an empty state - FROM_LAST_CHECKPOINT = 2; // Start the query with the state that is saved in the last checkpoint -} - -// For streaming queries only -message StreamingDisposition { - message FromTime { - google.protobuf.Timestamp timestamp = 1; - } - - message TimeAgo { - google.protobuf.Duration duration = 1; - } - + FROM_LAST_CHECKPOINT = 2; // Start the query with the state that is saved in the last checkpoint +} + +// For streaming queries only +message StreamingDisposition { + message FromTime { + google.protobuf.Timestamp timestamp = 1; + } + + message TimeAgo { + google.protobuf.Duration duration = 1; + } + message FromLastCheckpoint { // By default if new query streams set doesn't equal to old query streams set, // error will occur and query won't be allowed to load offsets for streams for the last checkpoint. @@ -88,65 +88,65 @@ message StreamingDisposition { bool force = 1; } - oneof disposition { + oneof disposition { google.protobuf.Empty oldest = 1; // Start processing with the oldest offset google.protobuf.Empty fresh = 2; // Start processing with the fresh offset - FromTime from_time = 3; // Start processing with offset from the specified time - TimeAgo time_ago = 4; // Start processing with offset some time ago + FromTime from_time = 3; // Start processing with offset from the specified time + TimeAgo time_ago = 4; // Start processing with offset some time ago FromLastCheckpoint from_last_checkpoint = 5; // Start processing with offset which corresponds to the last checkpoint - } -} - -// Query information that the subject can change -message QueryContent { - enum QueryType { - QUERY_TYPE_UNSPECIFIED = 0; - ANALYTICS = 1; // Analytical query (used for analytical data processing for example to work with YDB, ClickHouse, ...) - STREAMING = 2; // Streaming query (used for streaming data processing, such as working with YDS) - } + } +} + +// Query information that the subject can change +message QueryContent { + enum QueryType { + QUERY_TYPE_UNSPECIFIED = 0; + ANALYTICS = 1; // Analytical query (used for analytical data processing for example to work with YDB, ClickHouse, ...) + STREAMING = 2; // Streaming query (used for streaming data processing, such as working with YDS) + } QueryType type = 1; - string name = 2 [(Ydb.length).le = 1024]; - Acl acl = 3; - Limits limits = 4; - string text = 5 [(Ydb.length).le = 102400]; // The text of the query itself - bool automatic = 6; // Is used for queries that are created by automatic systems (robots, jdbc driver, ...) - string description = 7 [(Ydb.length).le = 10240]; // Description of the query, there can be any text -} - -message CommonMeta { - string id = 1 [(Ydb.length).range = {min: 1, max: 1024}]; - string created_by = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - string modified_by = 3 [(Ydb.length).range = {min: 1, max: 1024}]; - google.protobuf.Timestamp created_at = 4; - google.protobuf.Timestamp modified_at = 5; - int64 revision = 6 [(Ydb.value) = ">= 0"]; // Entity version, increases with each change -} - -message QueryMeta { - enum ComputeStatus { - COMPUTE_STATUS_UNSPECIFIED = 0; - STARTING = 1; // Start execution of the action on query - ABORTED_BY_USER = 2; // Query aborted by user - ABORTED_BY_SYSTEM = 3; // Query aborted by system - ABORTING_BY_USER = 4; // Query aborting by user - ABORTING_BY_SYSTEM = 5; // Query aborting by system - RESUMING = 6; // Resuming query execution from PAUSED status - RUNNING = 7; // Query started for execution - COMPLETED = 8; // Query completed successfully + string name = 2 [(Ydb.length).le = 1024]; + Acl acl = 3; + Limits limits = 4; + string text = 5 [(Ydb.length).le = 102400]; // The text of the query itself + bool automatic = 6; // Is used for queries that are created by automatic systems (robots, jdbc driver, ...) + string description = 7 [(Ydb.length).le = 10240]; // Description of the query, there can be any text +} + +message CommonMeta { + string id = 1 [(Ydb.length).range = {min: 1, max: 1024}]; + string created_by = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + string modified_by = 3 [(Ydb.length).range = {min: 1, max: 1024}]; + google.protobuf.Timestamp created_at = 4; + google.protobuf.Timestamp modified_at = 5; + int64 revision = 6 [(Ydb.value) = ">= 0"]; // Entity version, increases with each change +} + +message QueryMeta { + enum ComputeStatus { + COMPUTE_STATUS_UNSPECIFIED = 0; + STARTING = 1; // Start execution of the action on query + ABORTED_BY_USER = 2; // Query aborted by user + ABORTED_BY_SYSTEM = 3; // Query aborted by system + ABORTING_BY_USER = 4; // Query aborting by user + ABORTING_BY_SYSTEM = 5; // Query aborting by system + RESUMING = 6; // Resuming query execution from PAUSED status + RUNNING = 7; // Query started for execution + COMPLETED = 8; // Query completed successfully COMPLETING = 12; // Finalizing query before become COMPLETED - FAILED = 9; // Query completed with errors + FAILED = 9; // Query completed with errors FAILING = 13; // Finalizing query before become FAILED PAUSED = 11; // Query paused - PAUSING = 10; // Query starts pausing - } - - CommonMeta common = 1; - google.protobuf.Timestamp started_at = 2; - google.protobuf.Timestamp finished_at = 3; - ExecuteMode execute_mode = 4; - ComputeStatus status = 5; - int64 last_job_query_revision = 6; - string last_job_id = 7; + PAUSING = 10; // Query starts pausing + } + + CommonMeta common = 1; + google.protobuf.Timestamp started_at = 2; + google.protobuf.Timestamp finished_at = 3; + ExecuteMode execute_mode = 4; + ComputeStatus status = 5; + int64 last_job_query_revision = 6; + string last_job_id = 7; google.protobuf.Timestamp expire_at = 8; google.protobuf.Timestamp result_expire_at = 9; string started_by = 10; @@ -157,109 +157,109 @@ message QueryMeta { // One of the versions of this query has fully saved checkpoint. // If this flag is not set streaming disposition mode "from last checkpoint" can't be used. bool has_saved_checkpoints = 13; -} - -message BriefQuery { +} + +message BriefQuery { QueryContent.QueryType type = 1; - string name = 2 [(Ydb.length).le = 1024]; - QueryMeta meta = 3; - Acl.Visibility visibility = 4; - bool automatic = 5; -} - -message QueryPlan { - string json = 1; // No validation because generated on server side -} - + string name = 2 [(Ydb.length).le = 1024]; + QueryMeta meta = 3; + Acl.Visibility visibility = 4; + bool automatic = 5; +} + +message QueryPlan { + string json = 1; // No validation because generated on server side +} + message QueryAst { string data = 1; } -message ResultSetMeta { - repeated Ydb.Column column = 1; - int64 rows_count = 2 [(Ydb.value) = ">= 0"]; - bool truncated = 3; -} - -message Query { - QueryMeta meta = 1; - QueryContent content = 2; - QueryPlan plan = 3; - repeated Ydb.Issue.IssueMessage issue = 4; - repeated Ydb.Issue.IssueMessage transient_issue = 5; - QueryStatistics statistics = 6; - repeated ResultSetMeta result_set_meta = 7; +message ResultSetMeta { + repeated Ydb.Column column = 1; + int64 rows_count = 2 [(Ydb.value) = ">= 0"]; + bool truncated = 3; +} + +message Query { + QueryMeta meta = 1; + QueryContent content = 2; + QueryPlan plan = 3; + repeated Ydb.Issue.IssueMessage issue = 4; + repeated Ydb.Issue.IssueMessage transient_issue = 5; + QueryStatistics statistics = 6; + repeated ResultSetMeta result_set_meta = 7; QueryAst ast = 8; -} - -message QueryStatistics { - string json = 1; // No validation because generated on server side -} - -// Create a new query -message CreateQueryRequest { - Ydb.Operations.OperationParams operation_params = 1; - QueryContent content = 2; - ExecuteMode execute_mode = 3; +} + +message QueryStatistics { + string json = 1; // No validation because generated on server side +} + +// Create a new query +message CreateQueryRequest { + Ydb.Operations.OperationParams operation_params = 1; + QueryContent content = 2; + ExecuteMode execute_mode = 3; StreamingDisposition disposition = 4; - string idempotency_key = 5 [(Ydb.length).le = 1024]; -} - -message CreateQueryResponse { - Ydb.Operations.Operation operation = 1; // CreateQueryResult -} - -message CreateQueryResult { - string query_id = 1 [(Ydb.length).le = 1024]; -} - + string idempotency_key = 5 [(Ydb.length).le = 1024]; +} + +message CreateQueryResponse { + Ydb.Operations.Operation operation = 1; // CreateQueryResult +} + +message CreateQueryResult { + string query_id = 1 [(Ydb.length).le = 1024]; +} + enum AutomaticType { AUTOMATIC_TYPE_UNSPECIFIED = 0; AUTOMATIC = 1; NOT_AUTOMATIC = 2; } -// Getting brief information about queries -message ListQueriesRequest { - Ydb.Operations.OperationParams operation_params = 1; - string page_token = 2 [(Ydb.length).le = 1024]; - int32 limit = 3 [(Ydb.value) = "[1; 100]"]; - - message Filter { - QueryContent.QueryType query_type = 1; - repeated QueryMeta.ComputeStatus status = 2 [(Ydb.size).le = 20]; - repeated ExecuteMode mode = 3 [(Ydb.size).le = 20]; - string name = 4 [(Ydb.length).le = 1024]; // queries whose name contains the filter.name substring - bool created_by_me = 5; +// Getting brief information about queries +message ListQueriesRequest { + Ydb.Operations.OperationParams operation_params = 1; + string page_token = 2 [(Ydb.length).le = 1024]; + int32 limit = 3 [(Ydb.value) = "[1; 100]"]; + + message Filter { + QueryContent.QueryType query_type = 1; + repeated QueryMeta.ComputeStatus status = 2 [(Ydb.size).le = 20]; + repeated ExecuteMode mode = 3 [(Ydb.size).le = 20]; + string name = 4 [(Ydb.length).le = 1024]; // queries whose name contains the filter.name substring + bool created_by_me = 5; Acl.Visibility visibility = 6; AutomaticType automatic = 7; - } - Filter filter = 4; -} - -message ListQueriesResponse { - Ydb.Operations.Operation operation = 1; // ListQueriesResult -} - -message ListQueriesResult { - repeated BriefQuery query = 1; - string next_page_token = 2 [(Ydb.length).le = 1024]; -} - -// Getting complete information about the query -message DescribeQueryRequest { - Ydb.Operations.OperationParams operation_params = 1; - string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; -} - -message DescribeQueryResponse { - Ydb.Operations.Operation operation = 1; // DescribeQueryResult -} - -message DescribeQueryResult { - Query query = 1; -} - + } + Filter filter = 4; +} + +message ListQueriesResponse { + Ydb.Operations.Operation operation = 1; // ListQueriesResult +} + +message ListQueriesResult { + repeated BriefQuery query = 1; + string next_page_token = 2 [(Ydb.length).le = 1024]; +} + +// Getting complete information about the query +message DescribeQueryRequest { + Ydb.Operations.OperationParams operation_params = 1; + string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; +} + +message DescribeQueryResponse { + Ydb.Operations.Operation operation = 1; // DescribeQueryResult +} + +message DescribeQueryResult { + Query query = 1; +} + // Getting status of the query message GetQueryStatusRequest { Ydb.Operations.OperationParams operation_params = 1; @@ -275,58 +275,58 @@ message GetQueryStatusResult { int64 meta_revision = 2; } -// Complete removal of query. Recovery of the query after this operation is not possible -message DeleteQueryRequest { - Ydb.Operations.OperationParams operation_params = 1; - string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - int64 previous_revision = 3 [(Ydb.value) = ">= 0"]; - string idempotency_key = 4 [(Ydb.length).le = 1024]; -} - -message DeleteQueryResponse { - Ydb.Operations.Operation operation = 1; // DeleteQueryResult -} - -message DeleteQueryResult { -} - -// Change query information with launch policy option. All fields must be filled in the request. The query changes completely -message ModifyQueryRequest { - Ydb.Operations.OperationParams operation_params = 1; - string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - QueryContent content = 3; - ExecuteMode execute_mode = 4; - StreamingDisposition disposition = 5; +// Complete removal of query. Recovery of the query after this operation is not possible +message DeleteQueryRequest { + Ydb.Operations.OperationParams operation_params = 1; + string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + int64 previous_revision = 3 [(Ydb.value) = ">= 0"]; + string idempotency_key = 4 [(Ydb.length).le = 1024]; +} + +message DeleteQueryResponse { + Ydb.Operations.Operation operation = 1; // DeleteQueryResult +} + +message DeleteQueryResult { +} + +// Change query information with launch policy option. All fields must be filled in the request. The query changes completely +message ModifyQueryRequest { + Ydb.Operations.OperationParams operation_params = 1; + string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + QueryContent content = 3; + ExecuteMode execute_mode = 4; + StreamingDisposition disposition = 5; StateLoadMode state_load_mode = 6; - int64 previous_revision = 7 [(Ydb.value) = ">= 0"]; - string idempotency_key = 8 [(Ydb.length).le = 1024]; -} - -message ModifyQueryResponse { - Ydb.Operations.Operation operation = 1; // ModifyQueryResult -} - -message ModifyQueryResult { -} - -// Managing query status (pause, abort, resume, ...) -message ControlQueryRequest { - Ydb.Operations.OperationParams operation_params = 1; - string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - QueryAction action = 3; - int64 previous_revision = 4 [(Ydb.value) = ">= 0"]; - string idempotency_key = 5 [(Ydb.length).le = 1024]; -} - -message ControlQueryResponse { - Ydb.Operations.Operation operation = 1; // ControlQueryResult -} - -message ControlQueryResult { -} - -// === Job API === - + int64 previous_revision = 7 [(Ydb.value) = ">= 0"]; + string idempotency_key = 8 [(Ydb.length).le = 1024]; +} + +message ModifyQueryResponse { + Ydb.Operations.Operation operation = 1; // ModifyQueryResult +} + +message ModifyQueryResult { +} + +// Managing query status (pause, abort, resume, ...) +message ControlQueryRequest { + Ydb.Operations.OperationParams operation_params = 1; + string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + QueryAction action = 3; + int64 previous_revision = 4 [(Ydb.value) = ">= 0"]; + string idempotency_key = 5 [(Ydb.length).le = 1024]; +} + +message ControlQueryResponse { + Ydb.Operations.Operation operation = 1; // ControlQueryResult +} + +message ControlQueryResult { +} + +// === Job API === + message BriefJob { CommonMeta meta = 1; QueryMeta query_meta = 3; @@ -336,44 +336,44 @@ message BriefJob { google.protobuf.Timestamp expire_at = 12; } -message Job { - CommonMeta meta = 1; - string text = 2; - QueryMeta query_meta = 3; - QueryPlan plan = 4; - repeated Ydb.Issue.IssueMessage issue = 5; - QueryStatistics statistics = 6; - repeated ResultSetMeta result_set_meta = 7; +message Job { + CommonMeta meta = 1; + string text = 2; + QueryMeta query_meta = 3; + QueryPlan plan = 4; + repeated Ydb.Issue.IssueMessage issue = 5; + QueryStatistics statistics = 6; + repeated ResultSetMeta result_set_meta = 7; QueryAst ast = 8; string query_name = 9; Acl acl = 10; bool automatic = 11; google.protobuf.Timestamp expire_at = 12; -} - -// Information about recent query runs -message ListJobsRequest { - Ydb.Operations.OperationParams operation_params = 1; - string page_token = 2 [(Ydb.length).le = 1024]; - int32 limit = 3 [(Ydb.value) = "[1; 100]"]; - string query_id = 5; // deprecated - - message Filter { - string query_id = 1 [(Ydb.length).le = 1024]; - bool created_by_me = 2; - } - Filter filter = 4; -} - -message ListJobsResponse { - Ydb.Operations.Operation operation = 1; // ListJobsResult -} - -message ListJobsResult { +} + +// Information about recent query runs +message ListJobsRequest { + Ydb.Operations.OperationParams operation_params = 1; + string page_token = 2 [(Ydb.length).le = 1024]; + int32 limit = 3 [(Ydb.value) = "[1; 100]"]; + string query_id = 5; // deprecated + + message Filter { + string query_id = 1 [(Ydb.length).le = 1024]; + bool created_by_me = 2; + } + Filter filter = 4; +} + +message ListJobsResponse { + Ydb.Operations.Operation operation = 1; // ListJobsResult +} + +message ListJobsResult { repeated BriefJob job = 1; - string next_page_token = 2 [(Ydb.length).le = 1024]; -} - + string next_page_token = 2 [(Ydb.length).le = 1024]; +} + // Getting information about the job message DescribeJobRequest { Ydb.Operations.OperationParams operation_params = 1; @@ -388,70 +388,70 @@ message DescribeJobResult { Job job = 1; } -// === Connection API === - -message CurrentIAMTokenAuth { -} - +// === Connection API === + +message CurrentIAMTokenAuth { +} + message NoneAuth { } -message ServiceAccountAuth { - string id = 1 [(Ydb.length).le = 1024]; -} - -message IamAuth { - oneof identity { - CurrentIAMTokenAuth current_iam = 1; - ServiceAccountAuth service_account = 2; +message ServiceAccountAuth { + string id = 1 [(Ydb.length).le = 1024]; +} + +message IamAuth { + oneof identity { + CurrentIAMTokenAuth current_iam = 1; + ServiceAccountAuth service_account = 2; NoneAuth none = 3; - } -} - -message DataStreams { - string database_id = 1 [(Ydb.length).le = 1024]; - IamAuth auth = 2; - - // for internal usage - string endpoint = 3 [(Ydb.length).le = 1024]; - string database = 4 [(Ydb.length).le = 1024]; - bool secure = 5; -} - + } +} + +message DataStreams { + string database_id = 1 [(Ydb.length).le = 1024]; + IamAuth auth = 2; + + // for internal usage + string endpoint = 3 [(Ydb.length).le = 1024]; + string database = 4 [(Ydb.length).le = 1024]; + bool secure = 5; +} + message Monitoring { string project = 1 [(Ydb.length).le = 200]; string cluster = 2 [(Ydb.length).le = 200]; IamAuth auth = 3; } -message YdbDatabase { - string database_id = 1 [(Ydb.length).le = 1024]; - IamAuth auth = 2; - - // for internal usage - string endpoint = 3 [(Ydb.length).le = 1024]; - string database = 4 [(Ydb.length).le = 1024]; - bool secure = 5; -} - -message ClickHouseCluster { - string database_id = 1 [(Ydb.length).le = 1024]; - string login = 2 [(Ydb.length).le = 1024, (Ydb.sensitive) = true]; - string password = 3 [(Ydb.length).le = 1024, (Ydb.sensitive) = true]; - IamAuth auth = 4; - - // for internal usage - string host = 5 [(Ydb.length).le = 1024]; - int32 port = 6 [(Ydb.value) = "[0; 65536]"]; - bool secure = 7; -} - -message ObjectStorageConnection { - string bucket = 1 [(Ydb.length).le = 1024]; - IamAuth auth = 2; -} - -message ConnectionSetting { +message YdbDatabase { + string database_id = 1 [(Ydb.length).le = 1024]; + IamAuth auth = 2; + + // for internal usage + string endpoint = 3 [(Ydb.length).le = 1024]; + string database = 4 [(Ydb.length).le = 1024]; + bool secure = 5; +} + +message ClickHouseCluster { + string database_id = 1 [(Ydb.length).le = 1024]; + string login = 2 [(Ydb.length).le = 1024, (Ydb.sensitive) = true]; + string password = 3 [(Ydb.length).le = 1024, (Ydb.sensitive) = true]; + IamAuth auth = 4; + + // for internal usage + string host = 5 [(Ydb.length).le = 1024]; + int32 port = 6 [(Ydb.value) = "[0; 65536]"]; + bool secure = 7; +} + +message ObjectStorageConnection { + string bucket = 1 [(Ydb.length).le = 1024]; + IamAuth auth = 2; +} + +message ConnectionSetting { enum ConnectionType { CONNECTION_TYPE_UNSPECIFIED = 0; YDB_DATABASE = 1; @@ -461,279 +461,279 @@ message ConnectionSetting { MONITORING = 5; } - oneof connection { - YdbDatabase ydb_database = 1; - ClickHouseCluster clickhouse_cluster = 2; - DataStreams data_streams = 3; - ObjectStorageConnection object_storage = 4; + oneof connection { + YdbDatabase ydb_database = 1; + ClickHouseCluster clickhouse_cluster = 2; + DataStreams data_streams = 3; + ObjectStorageConnection object_storage = 4; Monitoring monitoring = 5; - } -} - -message ConnectionContent { - string name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; - ConnectionSetting setting = 2; - Acl acl = 3; - string description = 4 [(Ydb.length).le = 10240]; -} - -message Connection { - ConnectionContent content = 1; - CommonMeta meta = 2; -} - -// Create a new connection -message CreateConnectionRequest { - Ydb.Operations.OperationParams operation_params = 1; - ConnectionContent content = 2; - string idempotency_key = 3 [(Ydb.length).le = 1024]; -} - -message CreateConnectionResponse { - Ydb.Operations.Operation operation = 1; // CreateConnectionResult -} - -message CreateConnectionResult { - string connection_id = 1 [(Ydb.length).range = {min: 1, max: 1024}]; -} - -// Getting information about connections -message ListConnectionsRequest { - Ydb.Operations.OperationParams operation_params = 1; - string page_token = 2 [(Ydb.length).le = 1024]; - int32 limit = 3 [(Ydb.value) = "[1; 100]"]; - - message Filter { - string name = 1 [(Ydb.length).le = 1024]; // connections whose name contains the filter.name substring - bool created_by_me = 2; + } +} + +message ConnectionContent { + string name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; + ConnectionSetting setting = 2; + Acl acl = 3; + string description = 4 [(Ydb.length).le = 10240]; +} + +message Connection { + ConnectionContent content = 1; + CommonMeta meta = 2; +} + +// Create a new connection +message CreateConnectionRequest { + Ydb.Operations.OperationParams operation_params = 1; + ConnectionContent content = 2; + string idempotency_key = 3 [(Ydb.length).le = 1024]; +} + +message CreateConnectionResponse { + Ydb.Operations.Operation operation = 1; // CreateConnectionResult +} + +message CreateConnectionResult { + string connection_id = 1 [(Ydb.length).range = {min: 1, max: 1024}]; +} + +// Getting information about connections +message ListConnectionsRequest { + Ydb.Operations.OperationParams operation_params = 1; + string page_token = 2 [(Ydb.length).le = 1024]; + int32 limit = 3 [(Ydb.value) = "[1; 100]"]; + + message Filter { + string name = 1 [(Ydb.length).le = 1024]; // connections whose name contains the filter.name substring + bool created_by_me = 2; ConnectionSetting.ConnectionType connection_type = 3; - } - Filter filter = 4; -} - -message ListConnectionsResponse { - Ydb.Operations.Operation operation = 1; // ListConnectionsResult -} - -message ListConnectionsResult { - repeated Connection connection = 1; - string next_page_token = 2 [(Ydb.length).le = 1024]; -} - -// Getting information about the connection -message DescribeConnectionRequest { - Ydb.Operations.OperationParams operation_params = 1; - string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; -} - -message DescribeConnectionResponse { - Ydb.Operations.Operation operation = 1; // DescribeConnectionResult -} - -message DescribeConnectionResult { - Connection connection = 1; -} - -// Change connection information. All fields must be filled in the request. The connection changes completely -message ModifyConnectionRequest { - Ydb.Operations.OperationParams operation_params = 1; - string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - ConnectionContent content = 3; - int64 previous_revision = 4 [(Ydb.value) = ">= 0"]; - string idempotency_key = 5 [(Ydb.length).le = 1024]; -} - -message ModifyConnectionResponse { - Ydb.Operations.Operation operation = 1; // ModifyConnectionResult -} - -message ModifyConnectionResult { -} - -// Complete removal of connection. Recovery of the connection after this operation is not possible -message DeleteConnectionRequest { - Ydb.Operations.OperationParams operation_params = 1; - string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - int64 previous_revision = 3 [(Ydb.value) = ">= 0"]; - string idempotency_key = 4 [(Ydb.length).le = 1024]; -} - -message DeleteConnectionResponse { - Ydb.Operations.Operation operation = 1; // DeleteConnectionResult -} - -message DeleteConnectionResult { -} - -message TestConnectionRequest { - Ydb.Operations.OperationParams operation_params = 1; - ConnectionSetting setting = 2; -} - -message TestConnectionResponse { - Ydb.Operations.Operation operation = 1; // TestConnectionResult -} - -message TestConnectionResult { -} - -// ResultSet API - -// Getting the result of the query execution -message GetResultDataRequest { - Ydb.Operations.OperationParams operation_params = 1; - string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - int32 result_set_index = 3 [(Ydb.value) = ">= 0"]; - int64 offset = 4 [(Ydb.value) = ">= 0"]; + } + Filter filter = 4; +} + +message ListConnectionsResponse { + Ydb.Operations.Operation operation = 1; // ListConnectionsResult +} + +message ListConnectionsResult { + repeated Connection connection = 1; + string next_page_token = 2 [(Ydb.length).le = 1024]; +} + +// Getting information about the connection +message DescribeConnectionRequest { + Ydb.Operations.OperationParams operation_params = 1; + string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; +} + +message DescribeConnectionResponse { + Ydb.Operations.Operation operation = 1; // DescribeConnectionResult +} + +message DescribeConnectionResult { + Connection connection = 1; +} + +// Change connection information. All fields must be filled in the request. The connection changes completely +message ModifyConnectionRequest { + Ydb.Operations.OperationParams operation_params = 1; + string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + ConnectionContent content = 3; + int64 previous_revision = 4 [(Ydb.value) = ">= 0"]; + string idempotency_key = 5 [(Ydb.length).le = 1024]; +} + +message ModifyConnectionResponse { + Ydb.Operations.Operation operation = 1; // ModifyConnectionResult +} + +message ModifyConnectionResult { +} + +// Complete removal of connection. Recovery of the connection after this operation is not possible +message DeleteConnectionRequest { + Ydb.Operations.OperationParams operation_params = 1; + string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + int64 previous_revision = 3 [(Ydb.value) = ">= 0"]; + string idempotency_key = 4 [(Ydb.length).le = 1024]; +} + +message DeleteConnectionResponse { + Ydb.Operations.Operation operation = 1; // DeleteConnectionResult +} + +message DeleteConnectionResult { +} + +message TestConnectionRequest { + Ydb.Operations.OperationParams operation_params = 1; + ConnectionSetting setting = 2; +} + +message TestConnectionResponse { + Ydb.Operations.Operation operation = 1; // TestConnectionResult +} + +message TestConnectionResult { +} + +// ResultSet API + +// Getting the result of the query execution +message GetResultDataRequest { + Ydb.Operations.OperationParams operation_params = 1; + string query_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + int32 result_set_index = 3 [(Ydb.value) = ">= 0"]; + int64 offset = 4 [(Ydb.value) = ">= 0"]; int64 limit = 5 [(Ydb.value) = "[1; 1000]"]; -} - -message GetResultDataResponse { - Ydb.Operations.Operation operation = 1; // GetResultDataResult -} - -message GetResultDataResult { - Ydb.ResultSet result_set = 1; -} - -// Binding API - -message Schema { - repeated Ydb.Column column = 1 [(Ydb.size).le = 100]; -} - -message DataStreamsBinding { - string stream_name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; - string format = 2 [(Ydb.length).le = 1024]; - string compression = 3 [(Ydb.length).le = 1024]; - Schema schema = 4; +} + +message GetResultDataResponse { + Ydb.Operations.Operation operation = 1; // GetResultDataResult +} + +message GetResultDataResult { + Ydb.ResultSet result_set = 1; +} + +// Binding API + +message Schema { + repeated Ydb.Column column = 1 [(Ydb.size).le = 100]; +} + +message DataStreamsBinding { + string stream_name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; + string format = 2 [(Ydb.length).le = 1024]; + string compression = 3 [(Ydb.length).le = 1024]; + Schema schema = 4; map<string, string> format_setting = 5 [(Ydb.size).le = 100]; -} - -message ObjectStorageBinding { - message Subset { - string path_pattern = 1 [(Ydb.length).range = {min: 1, max: 1024}]; - string format = 2 [(Ydb.length).le = 1024]; - map<string, string> format_setting = 3 [(Ydb.size).le = 100]; - string compression = 4 [(Ydb.length).le = 1024]; - Schema schema = 5; - } - - repeated Subset subset = 1; -} - -message BindingSetting { +} + +message ObjectStorageBinding { + message Subset { + string path_pattern = 1 [(Ydb.length).range = {min: 1, max: 1024}]; + string format = 2 [(Ydb.length).le = 1024]; + map<string, string> format_setting = 3 [(Ydb.size).le = 100]; + string compression = 4 [(Ydb.length).le = 1024]; + Schema schema = 5; + } + + repeated Subset subset = 1; +} + +message BindingSetting { enum BindingType { BINDING_TYPE_UNSPECIFIED = 0; DATA_STREAMS = 1; OBJECT_STORAGE = 2; } - oneof binding { - DataStreamsBinding data_streams = 1; - ObjectStorageBinding object_storage = 2; - } -} - -message BriefBinding { - string name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; - string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - CommonMeta meta = 3; + oneof binding { + DataStreamsBinding data_streams = 1; + ObjectStorageBinding object_storage = 2; + } +} + +message BriefBinding { + string name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; + string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + CommonMeta meta = 3; BindingSetting.BindingType type = 4; -} - -message BindingContent { - string name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; - string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - BindingSetting setting = 3; - Acl acl = 4; - string description = 5 [(Ydb.length).le = 10240]; -} - -message Binding { - BindingContent content = 1; - CommonMeta meta = 2; -} - -// Create a new binding -message CreateBindingRequest { - Ydb.Operations.OperationParams operation_params = 1; - BindingContent content = 2; - string idempotency_key = 3 [(Ydb.length).le = 1024]; -} - -message CreateBindingResponse { - Ydb.Operations.Operation operation = 1; // CreateBindingResult -} - -message CreateBindingResult { - string binding_id = 1 [(Ydb.length).range = {min: 1, max: 1024}]; -} - -// Getting information about bindings -message ListBindingsRequest { - Ydb.Operations.OperationParams operation_params = 1; - string page_token = 2 [(Ydb.length).le = 1024]; - int32 limit = 3 [(Ydb.value) = "[1; 100]"]; - - message Filter { - string connection_id = 1 [(Ydb.length).le = 1024]; - string name = 2 [(Ydb.length).le = 1024]; // bindings whose name contains the filter.name substring - bool created_by_me = 3; - } - Filter filter = 4; -} - -message ListBindingsResponse { - Ydb.Operations.Operation operation = 1; // ListBindingsResult -} - -message ListBindingsResult { - repeated BriefBinding binding = 1; - string next_page_token = 2 [(Ydb.length).le = 1024]; -} - -// Getting information about the binding -message DescribeBindingRequest { - Ydb.Operations.OperationParams operation_params = 1; - string binding_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; -} - -message DescribeBindingResponse { - Ydb.Operations.Operation operation = 1; // DescribeBindingResult -} - -message DescribeBindingResult { - Binding binding = 1; -} - -// Change binding information. All fields must be filled in the request. The binding changes completely -message ModifyBindingRequest { - Ydb.Operations.OperationParams operation_params = 1; - string binding_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - BindingContent content = 3; - int64 previous_revision = 4 [(Ydb.value) = ">= 0"]; - string idempotency_key = 5 [(Ydb.length).le = 1024]; -} - -message ModifyBindingResponse { - Ydb.Operations.Operation operation = 1; // ModifyBindingResult -} - -message ModifyBindingResult { -} - -// Complete removal of binding. Recovery of the binding after this operation is not possible -message DeleteBindingRequest { - Ydb.Operations.OperationParams operation_params = 1; - string binding_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; - int64 previous_revision = 3 [(Ydb.value) = ">= 0"]; - string idempotency_key = 4 [(Ydb.length).le = 1024]; -} - -message DeleteBindingResponse { - Ydb.Operations.Operation operation = 1; // DeleteBindingResult -} - -message DeleteBindingResult { +} + +message BindingContent { + string name = 1 [(Ydb.length).range = {min: 1, max: 1024}]; + string connection_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + BindingSetting setting = 3; + Acl acl = 4; + string description = 5 [(Ydb.length).le = 10240]; +} + +message Binding { + BindingContent content = 1; + CommonMeta meta = 2; +} + +// Create a new binding +message CreateBindingRequest { + Ydb.Operations.OperationParams operation_params = 1; + BindingContent content = 2; + string idempotency_key = 3 [(Ydb.length).le = 1024]; +} + +message CreateBindingResponse { + Ydb.Operations.Operation operation = 1; // CreateBindingResult +} + +message CreateBindingResult { + string binding_id = 1 [(Ydb.length).range = {min: 1, max: 1024}]; +} + +// Getting information about bindings +message ListBindingsRequest { + Ydb.Operations.OperationParams operation_params = 1; + string page_token = 2 [(Ydb.length).le = 1024]; + int32 limit = 3 [(Ydb.value) = "[1; 100]"]; + + message Filter { + string connection_id = 1 [(Ydb.length).le = 1024]; + string name = 2 [(Ydb.length).le = 1024]; // bindings whose name contains the filter.name substring + bool created_by_me = 3; + } + Filter filter = 4; +} + +message ListBindingsResponse { + Ydb.Operations.Operation operation = 1; // ListBindingsResult +} + +message ListBindingsResult { + repeated BriefBinding binding = 1; + string next_page_token = 2 [(Ydb.length).le = 1024]; +} + +// Getting information about the binding +message DescribeBindingRequest { + Ydb.Operations.OperationParams operation_params = 1; + string binding_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; +} + +message DescribeBindingResponse { + Ydb.Operations.Operation operation = 1; // DescribeBindingResult +} + +message DescribeBindingResult { + Binding binding = 1; +} + +// Change binding information. All fields must be filled in the request. The binding changes completely +message ModifyBindingRequest { + Ydb.Operations.OperationParams operation_params = 1; + string binding_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + BindingContent content = 3; + int64 previous_revision = 4 [(Ydb.value) = ">= 0"]; + string idempotency_key = 5 [(Ydb.length).le = 1024]; +} + +message ModifyBindingResponse { + Ydb.Operations.Operation operation = 1; // ModifyBindingResult +} + +message ModifyBindingResult { +} + +// Complete removal of binding. Recovery of the binding after this operation is not possible +message DeleteBindingRequest { + Ydb.Operations.OperationParams operation_params = 1; + string binding_id = 2 [(Ydb.length).range = {min: 1, max: 1024}]; + int64 previous_revision = 3 [(Ydb.value) = ">= 0"]; + string idempotency_key = 4 [(Ydb.length).le = 1024]; +} + +message DeleteBindingResponse { + Ydb.Operations.Operation operation = 1; // DeleteBindingResult +} + +message DeleteBindingResult { } diff --git a/ydb/public/lib/ydb_cli/common/command.h b/ydb/public/lib/ydb_cli/common/command.h index 441206cdf7..6b53fc027c 100644 --- a/ydb/public/lib/ydb_cli/common/command.h +++ b/ydb/public/lib/ydb_cli/common/command.h @@ -97,7 +97,7 @@ public: bool UseMetadataCredentials = false; TString SaKeyFile; TString IamEndpoint; - TString YScope; + TString YScope; TString YdbDir; bool UseOAuthToken = true; diff --git a/ydb/public/lib/yq/helpers.h b/ydb/public/lib/yq/helpers.h index f07331f38f..07176e5796 100644 --- a/ydb/public/lib/yq/helpers.h +++ b/ydb/public/lib/yq/helpers.h @@ -6,10 +6,10 @@ namespace NYdb { namespace NYq { template<typename T> -T CreateYqSettings(const TString& folderId) +T CreateYqSettings(const TString& folderId) { T settings; - settings.Header_ = {{ "x-yq-scope", TScope::YandexCloudScopeSchema + "://" + folderId }}; + settings.Header_ = {{ "x-yq-scope", TScope::YandexCloudScopeSchema + "://" + folderId }}; return settings; } diff --git a/ydb/public/lib/yq/ya.make b/ydb/public/lib/yq/ya.make index df334eef0c..1fccdf95ff 100644 --- a/ydb/public/lib/yq/ya.make +++ b/ydb/public/lib/yq/ya.make @@ -1,19 +1,19 @@ -LIBRARY() - +LIBRARY() + OWNER( g:kikimr g:yq ) - -SRCS( - yq.cpp + +SRCS( + yq.cpp scope.cpp -) - -PEERDIR( - library/cpp/json +) + +PEERDIR( + library/cpp/json ydb/public/api/grpc/draft ydb/public/sdk/cpp/client/ydb_table -) - -END() +) + +END() diff --git a/ydb/public/lib/yq/yq.cpp b/ydb/public/lib/yq/yq.cpp index e9aa329323..bdd9f00e93 100644 --- a/ydb/public/lib/yq/yq.cpp +++ b/ydb/public/lib/yq/yq.cpp @@ -1,121 +1,121 @@ -#include "yq.h" - -#define INCLUDE_YDB_INTERNAL_H +#include "yq.h" + +#define INCLUDE_YDB_INTERNAL_H #include <ydb/public/sdk/cpp/client/impl/ydb_internal/make_request/make.h> -#undef INCLUDE_YDB_INTERNAL_H - +#undef INCLUDE_YDB_INTERNAL_H + #include <ydb/public/sdk/cpp/client/ydb_common_client/impl/client.h> - -namespace NYdb::NYq { - -using namespace NYdb; - -class TClient::TImpl : public TClientImplCommon<TClient::TImpl> { -public: - TImpl(std::shared_ptr<TGRpcConnectionsImpl>&& connections, const TCommonClientSettings& settings) - : TClientImplCommon(std::move(connections), settings) {} - - template<class TProtoResult, class TResultWrapper> - auto MakeResultExtractor(NThreading::TPromise<TResultWrapper> promise) { - return [promise = std::move(promise)] - (google::protobuf::Any* any, TPlainStatus status) mutable { - std::unique_ptr<TProtoResult> result; - if (any) { - result.reset(new TProtoResult); - any->UnpackTo(result.get()); - } - - promise.SetValue( - TResultWrapper( - TStatus(std::move(status)), - std::move(result))); - }; - } - - TAsyncCreateQueryResult CreateQuery( - const YandexQuery::CreateQueryRequest& protoRequest, - const TCreateQuerySettings& settings) { - auto request = MakeOperationRequest<YandexQuery::CreateQueryRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TCreateQueryResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::CreateQueryResult, - TCreateQueryResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::CreateQueryRequest, - YandexQuery::CreateQueryResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncCreateQuery, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncListQueriesResult ListQueries( - const YandexQuery::ListQueriesRequest& protoRequest, - const TListQueriesSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ListQueriesRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TListQueriesResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ListQueriesResult, - TListQueriesResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ListQueriesRequest, - YandexQuery::ListQueriesResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncListQueries, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncDescribeQueryResult DescribeQuery( - const YandexQuery::DescribeQueryRequest& protoRequest, - const TDescribeQuerySettings& settings) { - auto request = MakeOperationRequest<YandexQuery::DescribeQueryRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TDescribeQueryResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::DescribeQueryResult, - TDescribeQueryResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::DescribeQueryRequest, - YandexQuery::DescribeQueryResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncDescribeQuery, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - + +namespace NYdb::NYq { + +using namespace NYdb; + +class TClient::TImpl : public TClientImplCommon<TClient::TImpl> { +public: + TImpl(std::shared_ptr<TGRpcConnectionsImpl>&& connections, const TCommonClientSettings& settings) + : TClientImplCommon(std::move(connections), settings) {} + + template<class TProtoResult, class TResultWrapper> + auto MakeResultExtractor(NThreading::TPromise<TResultWrapper> promise) { + return [promise = std::move(promise)] + (google::protobuf::Any* any, TPlainStatus status) mutable { + std::unique_ptr<TProtoResult> result; + if (any) { + result.reset(new TProtoResult); + any->UnpackTo(result.get()); + } + + promise.SetValue( + TResultWrapper( + TStatus(std::move(status)), + std::move(result))); + }; + } + + TAsyncCreateQueryResult CreateQuery( + const YandexQuery::CreateQueryRequest& protoRequest, + const TCreateQuerySettings& settings) { + auto request = MakeOperationRequest<YandexQuery::CreateQueryRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TCreateQueryResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::CreateQueryResult, + TCreateQueryResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::CreateQueryRequest, + YandexQuery::CreateQueryResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncCreateQuery, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncListQueriesResult ListQueries( + const YandexQuery::ListQueriesRequest& protoRequest, + const TListQueriesSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ListQueriesRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TListQueriesResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ListQueriesResult, + TListQueriesResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ListQueriesRequest, + YandexQuery::ListQueriesResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncListQueries, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncDescribeQueryResult DescribeQuery( + const YandexQuery::DescribeQueryRequest& protoRequest, + const TDescribeQuerySettings& settings) { + auto request = MakeOperationRequest<YandexQuery::DescribeQueryRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TDescribeQueryResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::DescribeQueryResult, + TDescribeQueryResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::DescribeQueryRequest, + YandexQuery::DescribeQueryResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncDescribeQuery, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + TAsyncGetQueryStatusResult GetQueryStatus( const YandexQuery::GetQueryStatusRequest& protoRequest, const TGetQueryStatusSettings& settings) { @@ -144,146 +144,146 @@ public: return future; } - TAsyncModifyQueryResult ModifyQuery( - const YandexQuery::ModifyQueryRequest& protoRequest, - const TModifyQuerySettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ModifyQueryRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TModifyQueryResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ModifyQueryResult, - TModifyQueryResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ModifyQueryRequest, - YandexQuery::ModifyQueryResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncModifyQuery, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncDeleteQueryResult DeleteQuery( - const YandexQuery::DeleteQueryRequest& protoRequest, - const TDeleteQuerySettings& settings) { - auto request = MakeOperationRequest<YandexQuery::DeleteQueryRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TDeleteQueryResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::DeleteQueryResult, - TDeleteQueryResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::DeleteQueryRequest, - YandexQuery::DeleteQueryResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncDeleteQuery, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncControlQueryResult ControlQuery( - const YandexQuery::ControlQueryRequest& protoRequest, - const TControlQuerySettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ControlQueryRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TControlQueryResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ControlQueryResult, - TControlQueryResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ControlQueryRequest, - YandexQuery::ControlQueryResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncControlQuery, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncGetResultDataResult GetResultData( - const YandexQuery::GetResultDataRequest& protoRequest, - const TGetResultDataSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::GetResultDataRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TGetResultDataResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::GetResultDataResult, - TGetResultDataResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::GetResultDataRequest, - YandexQuery::GetResultDataResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncGetResultData, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncListJobsResult ListJobs( - const YandexQuery::ListJobsRequest& protoRequest, - const TListJobsSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ListJobsRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TListJobsResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ListJobsResult, - TListJobsResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ListJobsRequest, - YandexQuery::ListJobsResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncListJobs, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - + TAsyncModifyQueryResult ModifyQuery( + const YandexQuery::ModifyQueryRequest& protoRequest, + const TModifyQuerySettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ModifyQueryRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TModifyQueryResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ModifyQueryResult, + TModifyQueryResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ModifyQueryRequest, + YandexQuery::ModifyQueryResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncModifyQuery, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncDeleteQueryResult DeleteQuery( + const YandexQuery::DeleteQueryRequest& protoRequest, + const TDeleteQuerySettings& settings) { + auto request = MakeOperationRequest<YandexQuery::DeleteQueryRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TDeleteQueryResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::DeleteQueryResult, + TDeleteQueryResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::DeleteQueryRequest, + YandexQuery::DeleteQueryResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncDeleteQuery, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncControlQueryResult ControlQuery( + const YandexQuery::ControlQueryRequest& protoRequest, + const TControlQuerySettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ControlQueryRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TControlQueryResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ControlQueryResult, + TControlQueryResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ControlQueryRequest, + YandexQuery::ControlQueryResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncControlQuery, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncGetResultDataResult GetResultData( + const YandexQuery::GetResultDataRequest& protoRequest, + const TGetResultDataSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::GetResultDataRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TGetResultDataResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::GetResultDataResult, + TGetResultDataResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::GetResultDataRequest, + YandexQuery::GetResultDataResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncGetResultData, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncListJobsResult ListJobs( + const YandexQuery::ListJobsRequest& protoRequest, + const TListJobsSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ListJobsRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TListJobsResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ListJobsResult, + TListJobsResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ListJobsRequest, + YandexQuery::ListJobsResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncListJobs, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + TAsyncDescribeJobResult DescribeJob( const YandexQuery::DescribeJobRequest& protoRequest, const TDescribeJobSettings& settings) { @@ -312,146 +312,146 @@ public: return future; } - TAsyncCreateConnectionResult CreateConnection( - const YandexQuery::CreateConnectionRequest& protoRequest, - const TCreateConnectionSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::CreateConnectionRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TCreateConnectionResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::CreateConnectionResult, - TCreateConnectionResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::CreateConnectionRequest, - YandexQuery::CreateConnectionResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncCreateConnection, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncListConnectionsResult ListConnections( - const YandexQuery::ListConnectionsRequest& protoRequest, - const TListConnectionsSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ListConnectionsRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TListConnectionsResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ListConnectionsResult, - TListConnectionsResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ListConnectionsRequest, - YandexQuery::ListConnectionsResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncListConnections, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncDescribeConnectionResult DescribeConnection( - const YandexQuery::DescribeConnectionRequest& protoRequest, - const TDescribeConnectionSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::DescribeConnectionRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TDescribeConnectionResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::DescribeConnectionResult, - TDescribeConnectionResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::DescribeConnectionRequest, - YandexQuery::DescribeConnectionResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncDescribeConnection, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncModifyConnectionResult ModifyConnection( - const YandexQuery::ModifyConnectionRequest& protoRequest, - const TModifyConnectionSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ModifyConnectionRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TModifyConnectionResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ModifyConnectionResult, - TModifyConnectionResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ModifyConnectionRequest, - YandexQuery::ModifyConnectionResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncModifyConnection, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncDeleteConnectionResult DeleteConnection( - const YandexQuery::DeleteConnectionRequest& protoRequest, - const TDeleteConnectionSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::DeleteConnectionRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TDeleteConnectionResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::DeleteConnectionResult, - TDeleteConnectionResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::DeleteConnectionRequest, - YandexQuery::DeleteConnectionResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncDeleteConnection, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - + TAsyncCreateConnectionResult CreateConnection( + const YandexQuery::CreateConnectionRequest& protoRequest, + const TCreateConnectionSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::CreateConnectionRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TCreateConnectionResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::CreateConnectionResult, + TCreateConnectionResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::CreateConnectionRequest, + YandexQuery::CreateConnectionResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncCreateConnection, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncListConnectionsResult ListConnections( + const YandexQuery::ListConnectionsRequest& protoRequest, + const TListConnectionsSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ListConnectionsRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TListConnectionsResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ListConnectionsResult, + TListConnectionsResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ListConnectionsRequest, + YandexQuery::ListConnectionsResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncListConnections, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncDescribeConnectionResult DescribeConnection( + const YandexQuery::DescribeConnectionRequest& protoRequest, + const TDescribeConnectionSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::DescribeConnectionRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TDescribeConnectionResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::DescribeConnectionResult, + TDescribeConnectionResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::DescribeConnectionRequest, + YandexQuery::DescribeConnectionResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncDescribeConnection, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncModifyConnectionResult ModifyConnection( + const YandexQuery::ModifyConnectionRequest& protoRequest, + const TModifyConnectionSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ModifyConnectionRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TModifyConnectionResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ModifyConnectionResult, + TModifyConnectionResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ModifyConnectionRequest, + YandexQuery::ModifyConnectionResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncModifyConnection, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncDeleteConnectionResult DeleteConnection( + const YandexQuery::DeleteConnectionRequest& protoRequest, + const TDeleteConnectionSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::DeleteConnectionRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TDeleteConnectionResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::DeleteConnectionResult, + TDeleteConnectionResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::DeleteConnectionRequest, + YandexQuery::DeleteConnectionResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncDeleteConnection, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + TAsyncTestConnectionResult TestConnection( const YandexQuery::TestConnectionRequest& protoRequest, const TTestConnectionSettings& settings) { @@ -480,276 +480,276 @@ public: return future; } - TAsyncCreateBindingResult CreateBinding( - const YandexQuery::CreateBindingRequest& protoRequest, - const TCreateBindingSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::CreateBindingRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TCreateBindingResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::CreateBindingResult, - TCreateBindingResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::CreateBindingRequest, - YandexQuery::CreateBindingResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncCreateBinding, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncListBindingsResult ListBindings( - const YandexQuery::ListBindingsRequest& protoRequest, - const TListBindingsSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ListBindingsRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TListBindingsResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ListBindingsResult, - TListBindingsResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ListBindingsRequest, - YandexQuery::ListBindingsResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncListBindings, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncDescribeBindingResult DescribeBinding( - const YandexQuery::DescribeBindingRequest& protoRequest, - const TDescribeBindingSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::DescribeBindingRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TDescribeBindingResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::DescribeBindingResult, - TDescribeBindingResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::DescribeBindingRequest, - YandexQuery::DescribeBindingResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncDescribeBinding, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncModifyBindingResult ModifyBinding( - const YandexQuery::ModifyBindingRequest& protoRequest, - const TModifyBindingSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::ModifyBindingRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TModifyBindingResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::ModifyBindingResult, - TModifyBindingResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::ModifyBindingRequest, - YandexQuery::ModifyBindingResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncModifyBinding, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } - - TAsyncDeleteBindingResult DeleteBinding( - const YandexQuery::DeleteBindingRequest& protoRequest, - const TDeleteBindingSettings& settings) { - auto request = MakeOperationRequest<YandexQuery::DeleteBindingRequest>(settings); - request = protoRequest; - - auto promise = NThreading::NewPromise<TDeleteBindingResult>(); - auto future = promise.GetFuture(); - - auto extractor = MakeResultExtractor< - YandexQuery::DeleteBindingResult, - TDeleteBindingResult>(std::move(promise)); - - Connections_->RunDeferred< - YandexQuery::V1::YandexQueryService, - YandexQuery::DeleteBindingRequest, - YandexQuery::DeleteBindingResponse>( - std::move(request), - std::move(extractor), - &YandexQuery::V1::YandexQueryService::Stub::AsyncDeleteBinding, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings), - settings.ClientTimeout_); - - return future; - } -}; - -TClient::TClient(const TDriver& driver, const TCommonClientSettings& settings) - : Impl_(new TImpl(CreateInternalInterface(driver), settings)) -{} - -TAsyncCreateQueryResult TClient::CreateQuery( - const YandexQuery::CreateQueryRequest& request, - const TCreateQuerySettings& settings) { - return Impl_->CreateQuery(request, settings); -} - -TAsyncListQueriesResult TClient::ListQueries( - const YandexQuery::ListQueriesRequest& request, - const TListQueriesSettings& settings) { - return Impl_->ListQueries(request, settings); -} - -TAsyncDescribeQueryResult TClient::DescribeQuery( - const YandexQuery::DescribeQueryRequest& request, - const TDescribeQuerySettings& settings) { - return Impl_->DescribeQuery(request, settings); -} - + TAsyncCreateBindingResult CreateBinding( + const YandexQuery::CreateBindingRequest& protoRequest, + const TCreateBindingSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::CreateBindingRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TCreateBindingResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::CreateBindingResult, + TCreateBindingResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::CreateBindingRequest, + YandexQuery::CreateBindingResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncCreateBinding, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncListBindingsResult ListBindings( + const YandexQuery::ListBindingsRequest& protoRequest, + const TListBindingsSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ListBindingsRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TListBindingsResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ListBindingsResult, + TListBindingsResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ListBindingsRequest, + YandexQuery::ListBindingsResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncListBindings, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncDescribeBindingResult DescribeBinding( + const YandexQuery::DescribeBindingRequest& protoRequest, + const TDescribeBindingSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::DescribeBindingRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TDescribeBindingResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::DescribeBindingResult, + TDescribeBindingResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::DescribeBindingRequest, + YandexQuery::DescribeBindingResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncDescribeBinding, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncModifyBindingResult ModifyBinding( + const YandexQuery::ModifyBindingRequest& protoRequest, + const TModifyBindingSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::ModifyBindingRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TModifyBindingResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::ModifyBindingResult, + TModifyBindingResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::ModifyBindingRequest, + YandexQuery::ModifyBindingResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncModifyBinding, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } + + TAsyncDeleteBindingResult DeleteBinding( + const YandexQuery::DeleteBindingRequest& protoRequest, + const TDeleteBindingSettings& settings) { + auto request = MakeOperationRequest<YandexQuery::DeleteBindingRequest>(settings); + request = protoRequest; + + auto promise = NThreading::NewPromise<TDeleteBindingResult>(); + auto future = promise.GetFuture(); + + auto extractor = MakeResultExtractor< + YandexQuery::DeleteBindingResult, + TDeleteBindingResult>(std::move(promise)); + + Connections_->RunDeferred< + YandexQuery::V1::YandexQueryService, + YandexQuery::DeleteBindingRequest, + YandexQuery::DeleteBindingResponse>( + std::move(request), + std::move(extractor), + &YandexQuery::V1::YandexQueryService::Stub::AsyncDeleteBinding, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings), + settings.ClientTimeout_); + + return future; + } +}; + +TClient::TClient(const TDriver& driver, const TCommonClientSettings& settings) + : Impl_(new TImpl(CreateInternalInterface(driver), settings)) +{} + +TAsyncCreateQueryResult TClient::CreateQuery( + const YandexQuery::CreateQueryRequest& request, + const TCreateQuerySettings& settings) { + return Impl_->CreateQuery(request, settings); +} + +TAsyncListQueriesResult TClient::ListQueries( + const YandexQuery::ListQueriesRequest& request, + const TListQueriesSettings& settings) { + return Impl_->ListQueries(request, settings); +} + +TAsyncDescribeQueryResult TClient::DescribeQuery( + const YandexQuery::DescribeQueryRequest& request, + const TDescribeQuerySettings& settings) { + return Impl_->DescribeQuery(request, settings); +} + TAsyncGetQueryStatusResult TClient::GetQueryStatus( const YandexQuery::GetQueryStatusRequest& request, const TGetQueryStatusSettings& settings) { return Impl_->GetQueryStatus(request, settings); } -TAsyncModifyQueryResult TClient::ModifyQuery( - const YandexQuery::ModifyQueryRequest& request, - const TModifyQuerySettings& settings) { - return Impl_->ModifyQuery(request, settings); -} - -TAsyncDeleteQueryResult TClient::DeleteQuery( - const YandexQuery::DeleteQueryRequest& request, - const TDeleteQuerySettings& settings) { - return Impl_->DeleteQuery(request, settings); -} - -TAsyncControlQueryResult TClient::ControlQuery( - const YandexQuery::ControlQueryRequest& request, - const TControlQuerySettings& settings) { - return Impl_->ControlQuery(request, settings); -} - -TAsyncGetResultDataResult TClient::GetResultData( - const YandexQuery::GetResultDataRequest& request, - const TGetResultDataSettings& settings) { - return Impl_->GetResultData(request, settings); -} - -TAsyncListJobsResult TClient::ListJobs( - const YandexQuery::ListJobsRequest& request, - const TListJobsSettings& settings) { - return Impl_->ListJobs(request, settings); -} - +TAsyncModifyQueryResult TClient::ModifyQuery( + const YandexQuery::ModifyQueryRequest& request, + const TModifyQuerySettings& settings) { + return Impl_->ModifyQuery(request, settings); +} + +TAsyncDeleteQueryResult TClient::DeleteQuery( + const YandexQuery::DeleteQueryRequest& request, + const TDeleteQuerySettings& settings) { + return Impl_->DeleteQuery(request, settings); +} + +TAsyncControlQueryResult TClient::ControlQuery( + const YandexQuery::ControlQueryRequest& request, + const TControlQuerySettings& settings) { + return Impl_->ControlQuery(request, settings); +} + +TAsyncGetResultDataResult TClient::GetResultData( + const YandexQuery::GetResultDataRequest& request, + const TGetResultDataSettings& settings) { + return Impl_->GetResultData(request, settings); +} + +TAsyncListJobsResult TClient::ListJobs( + const YandexQuery::ListJobsRequest& request, + const TListJobsSettings& settings) { + return Impl_->ListJobs(request, settings); +} + TAsyncDescribeJobResult TClient::DescribeJob( const YandexQuery::DescribeJobRequest& request, const TDescribeJobSettings& settings) { return Impl_->DescribeJob(request, settings); } -TAsyncCreateConnectionResult TClient::CreateConnection( - const YandexQuery::CreateConnectionRequest& request, - const TCreateConnectionSettings& settings) { - return Impl_->CreateConnection(request, settings); -} - -TAsyncListConnectionsResult TClient::ListConnections( - const YandexQuery::ListConnectionsRequest& request, - const TListConnectionsSettings& settings) { - return Impl_->ListConnections(request, settings); -} - -TAsyncDescribeConnectionResult TClient::DescribeConnection( - const YandexQuery::DescribeConnectionRequest& request, - const TDescribeConnectionSettings& settings) { - return Impl_->DescribeConnection(request, settings); -} - -TAsyncModifyConnectionResult TClient::ModifyConnection( - const YandexQuery::ModifyConnectionRequest& request, - const TModifyConnectionSettings& settings) { - return Impl_->ModifyConnection(request, settings); -} - -TAsyncDeleteConnectionResult TClient::DeleteConnection( - const YandexQuery::DeleteConnectionRequest& request, - const TDeleteConnectionSettings& settings) { - return Impl_->DeleteConnection(request, settings); -} - +TAsyncCreateConnectionResult TClient::CreateConnection( + const YandexQuery::CreateConnectionRequest& request, + const TCreateConnectionSettings& settings) { + return Impl_->CreateConnection(request, settings); +} + +TAsyncListConnectionsResult TClient::ListConnections( + const YandexQuery::ListConnectionsRequest& request, + const TListConnectionsSettings& settings) { + return Impl_->ListConnections(request, settings); +} + +TAsyncDescribeConnectionResult TClient::DescribeConnection( + const YandexQuery::DescribeConnectionRequest& request, + const TDescribeConnectionSettings& settings) { + return Impl_->DescribeConnection(request, settings); +} + +TAsyncModifyConnectionResult TClient::ModifyConnection( + const YandexQuery::ModifyConnectionRequest& request, + const TModifyConnectionSettings& settings) { + return Impl_->ModifyConnection(request, settings); +} + +TAsyncDeleteConnectionResult TClient::DeleteConnection( + const YandexQuery::DeleteConnectionRequest& request, + const TDeleteConnectionSettings& settings) { + return Impl_->DeleteConnection(request, settings); +} + TAsyncTestConnectionResult TClient::TestConnection( const YandexQuery::TestConnectionRequest& request, const TTestConnectionSettings& settings) { return Impl_->TestConnection(request, settings); } -TAsyncCreateBindingResult TClient::CreateBinding( - const YandexQuery::CreateBindingRequest& request, - const TCreateBindingSettings& settings) { - return Impl_->CreateBinding(request, settings); -} - -TAsyncListBindingsResult TClient::ListBindings( - const YandexQuery::ListBindingsRequest& request, - const TListBindingsSettings& settings) { - return Impl_->ListBindings(request, settings); -} - -TAsyncDescribeBindingResult TClient::DescribeBinding( - const YandexQuery::DescribeBindingRequest& request, - const TDescribeBindingSettings& settings) { - return Impl_->DescribeBinding(request, settings); -} - -TAsyncModifyBindingResult TClient::ModifyBinding( - const YandexQuery::ModifyBindingRequest& request, - const TModifyBindingSettings& settings) { - return Impl_->ModifyBinding(request, settings); -} - -TAsyncDeleteBindingResult TClient::DeleteBinding( - const YandexQuery::DeleteBindingRequest& request, - const TDeleteBindingSettings& settings) { - return Impl_->DeleteBinding(request, settings); -} - -} - +TAsyncCreateBindingResult TClient::CreateBinding( + const YandexQuery::CreateBindingRequest& request, + const TCreateBindingSettings& settings) { + return Impl_->CreateBinding(request, settings); +} + +TAsyncListBindingsResult TClient::ListBindings( + const YandexQuery::ListBindingsRequest& request, + const TListBindingsSettings& settings) { + return Impl_->ListBindings(request, settings); +} + +TAsyncDescribeBindingResult TClient::DescribeBinding( + const YandexQuery::DescribeBindingRequest& request, + const TDescribeBindingSettings& settings) { + return Impl_->DescribeBinding(request, settings); +} + +TAsyncModifyBindingResult TClient::ModifyBinding( + const YandexQuery::ModifyBindingRequest& request, + const TModifyBindingSettings& settings) { + return Impl_->ModifyBinding(request, settings); +} + +TAsyncDeleteBindingResult TClient::DeleteBinding( + const YandexQuery::DeleteBindingRequest& request, + const TDeleteBindingSettings& settings) { + return Impl_->DeleteBinding(request, settings); +} + +} + diff --git a/ydb/public/lib/yq/yq.h b/ydb/public/lib/yq/yq.h index 31b3a6b991..8747b92e35 100644 --- a/ydb/public/lib/yq/yq.h +++ b/ydb/public/lib/yq/yq.h @@ -1,215 +1,215 @@ -#pragma once - +#pragma once + #include <ydb/public/sdk/cpp/client/ydb_table/table.h> - + #include <ydb/public/api/grpc/yq_v1.grpc.pb.h> - -namespace NYdb::NYq { - -template<class TProtoResult> -class TProtoResultWrapper : public NYdb::TStatus { - friend class TClient; - -private: - TProtoResultWrapper( - NYdb::TStatus&& status, - std::unique_ptr<TProtoResult> result) - : TStatus(std::move(status)) - , Result(std::move(result)) - { } - -public: - const TProtoResult& GetResult() const { - if (!Result) { - ythrow yexception() << "Uninitialized result: " << GetIssues().ToString(); - } - return *Result; - } - - bool HasResult() const { - return Result; - } - -private: - std::unique_ptr<TProtoResult> Result; -}; - -using TCreateQueryResult = TProtoResultWrapper<YandexQuery::CreateQueryResult>; -using TAsyncCreateQueryResult = NThreading::TFuture<TCreateQueryResult>; -struct TCreateQuerySettings : public NYdb::TOperationRequestSettings<TCreateQuerySettings> {}; - -using TListQueriesResult = TProtoResultWrapper<YandexQuery::ListQueriesResult>; -using TAsyncListQueriesResult = NThreading::TFuture<TListQueriesResult>; -struct TListQueriesSettings : public NYdb::TOperationRequestSettings<TListQueriesSettings> {}; - -using TDescribeQueryResult = TProtoResultWrapper<YandexQuery::DescribeQueryResult>; -using TAsyncDescribeQueryResult = NThreading::TFuture<TDescribeQueryResult>; -struct TDescribeQuerySettings : public NYdb::TOperationRequestSettings<TDescribeQuerySettings> {}; - + +namespace NYdb::NYq { + +template<class TProtoResult> +class TProtoResultWrapper : public NYdb::TStatus { + friend class TClient; + +private: + TProtoResultWrapper( + NYdb::TStatus&& status, + std::unique_ptr<TProtoResult> result) + : TStatus(std::move(status)) + , Result(std::move(result)) + { } + +public: + const TProtoResult& GetResult() const { + if (!Result) { + ythrow yexception() << "Uninitialized result: " << GetIssues().ToString(); + } + return *Result; + } + + bool HasResult() const { + return Result; + } + +private: + std::unique_ptr<TProtoResult> Result; +}; + +using TCreateQueryResult = TProtoResultWrapper<YandexQuery::CreateQueryResult>; +using TAsyncCreateQueryResult = NThreading::TFuture<TCreateQueryResult>; +struct TCreateQuerySettings : public NYdb::TOperationRequestSettings<TCreateQuerySettings> {}; + +using TListQueriesResult = TProtoResultWrapper<YandexQuery::ListQueriesResult>; +using TAsyncListQueriesResult = NThreading::TFuture<TListQueriesResult>; +struct TListQueriesSettings : public NYdb::TOperationRequestSettings<TListQueriesSettings> {}; + +using TDescribeQueryResult = TProtoResultWrapper<YandexQuery::DescribeQueryResult>; +using TAsyncDescribeQueryResult = NThreading::TFuture<TDescribeQueryResult>; +struct TDescribeQuerySettings : public NYdb::TOperationRequestSettings<TDescribeQuerySettings> {}; + using TGetQueryStatusResult = TProtoResultWrapper<YandexQuery::GetQueryStatusResult>; using TAsyncGetQueryStatusResult = NThreading::TFuture<TGetQueryStatusResult>; struct TGetQueryStatusSettings : public NYdb::TOperationRequestSettings<TGetQueryStatusSettings> {}; -using TModifyQueryResult = TProtoResultWrapper<YandexQuery::ModifyQueryResult>; -using TAsyncModifyQueryResult = NThreading::TFuture<TModifyQueryResult>; -struct TModifyQuerySettings : public NYdb::TOperationRequestSettings<TModifyQuerySettings> {}; - -using TDeleteQueryResult = TProtoResultWrapper<YandexQuery::DeleteQueryResult>; -using TAsyncDeleteQueryResult = NThreading::TFuture<TDeleteQueryResult>; -struct TDeleteQuerySettings : public NYdb::TOperationRequestSettings<TDeleteQuerySettings> {}; - -using TControlQueryResult = TProtoResultWrapper<YandexQuery::ControlQueryResult>; -using TAsyncControlQueryResult = NThreading::TFuture<TControlQueryResult>; -struct TControlQuerySettings : public NYdb::TOperationRequestSettings<TControlQuerySettings> {}; - -using TGetResultDataResult = TProtoResultWrapper<YandexQuery::GetResultDataResult>; -using TAsyncGetResultDataResult = NThreading::TFuture<TGetResultDataResult>; -struct TGetResultDataSettings : public NYdb::TOperationRequestSettings<TGetResultDataSettings> {}; - -using TListJobsResult = TProtoResultWrapper<YandexQuery::ListJobsResult>; -using TAsyncListJobsResult = NThreading::TFuture<TListJobsResult>; -struct TListJobsSettings : public NYdb::TOperationRequestSettings<TListJobsSettings> {}; - +using TModifyQueryResult = TProtoResultWrapper<YandexQuery::ModifyQueryResult>; +using TAsyncModifyQueryResult = NThreading::TFuture<TModifyQueryResult>; +struct TModifyQuerySettings : public NYdb::TOperationRequestSettings<TModifyQuerySettings> {}; + +using TDeleteQueryResult = TProtoResultWrapper<YandexQuery::DeleteQueryResult>; +using TAsyncDeleteQueryResult = NThreading::TFuture<TDeleteQueryResult>; +struct TDeleteQuerySettings : public NYdb::TOperationRequestSettings<TDeleteQuerySettings> {}; + +using TControlQueryResult = TProtoResultWrapper<YandexQuery::ControlQueryResult>; +using TAsyncControlQueryResult = NThreading::TFuture<TControlQueryResult>; +struct TControlQuerySettings : public NYdb::TOperationRequestSettings<TControlQuerySettings> {}; + +using TGetResultDataResult = TProtoResultWrapper<YandexQuery::GetResultDataResult>; +using TAsyncGetResultDataResult = NThreading::TFuture<TGetResultDataResult>; +struct TGetResultDataSettings : public NYdb::TOperationRequestSettings<TGetResultDataSettings> {}; + +using TListJobsResult = TProtoResultWrapper<YandexQuery::ListJobsResult>; +using TAsyncListJobsResult = NThreading::TFuture<TListJobsResult>; +struct TListJobsSettings : public NYdb::TOperationRequestSettings<TListJobsSettings> {}; + using TDescribeJobResult = TProtoResultWrapper<YandexQuery::DescribeJobResult>; using TAsyncDescribeJobResult = NThreading::TFuture<TDescribeJobResult>; struct TDescribeJobSettings : public NYdb::TOperationRequestSettings<TDescribeJobSettings> {}; -using TCreateConnectionResult = TProtoResultWrapper<YandexQuery::CreateConnectionResult>; -using TAsyncCreateConnectionResult = NThreading::TFuture<TCreateConnectionResult>; -struct TCreateConnectionSettings : public NYdb::TOperationRequestSettings<TCreateConnectionSettings> {}; - -using TListConnectionsResult = TProtoResultWrapper<YandexQuery::ListConnectionsResult>; -using TAsyncListConnectionsResult = NThreading::TFuture<TListConnectionsResult>; -struct TListConnectionsSettings : public NYdb::TOperationRequestSettings<TListConnectionsSettings> {}; - -using TDescribeConnectionResult = TProtoResultWrapper<YandexQuery::DescribeConnectionResult>; -using TAsyncDescribeConnectionResult = NThreading::TFuture<TDescribeConnectionResult>; -struct TDescribeConnectionSettings : public NYdb::TOperationRequestSettings<TDescribeConnectionSettings> {}; - -using TModifyConnectionResult = TProtoResultWrapper<YandexQuery::ModifyConnectionResult>; -using TAsyncModifyConnectionResult = NThreading::TFuture<TModifyConnectionResult>; -struct TModifyConnectionSettings : public NYdb::TOperationRequestSettings<TModifyConnectionSettings> {}; - -using TDeleteConnectionResult = TProtoResultWrapper<YandexQuery::DeleteConnectionResult>; -using TAsyncDeleteConnectionResult = NThreading::TFuture<TDeleteConnectionResult>; -struct TDeleteConnectionSettings : public NYdb::TOperationRequestSettings<TDeleteConnectionSettings> {}; - +using TCreateConnectionResult = TProtoResultWrapper<YandexQuery::CreateConnectionResult>; +using TAsyncCreateConnectionResult = NThreading::TFuture<TCreateConnectionResult>; +struct TCreateConnectionSettings : public NYdb::TOperationRequestSettings<TCreateConnectionSettings> {}; + +using TListConnectionsResult = TProtoResultWrapper<YandexQuery::ListConnectionsResult>; +using TAsyncListConnectionsResult = NThreading::TFuture<TListConnectionsResult>; +struct TListConnectionsSettings : public NYdb::TOperationRequestSettings<TListConnectionsSettings> {}; + +using TDescribeConnectionResult = TProtoResultWrapper<YandexQuery::DescribeConnectionResult>; +using TAsyncDescribeConnectionResult = NThreading::TFuture<TDescribeConnectionResult>; +struct TDescribeConnectionSettings : public NYdb::TOperationRequestSettings<TDescribeConnectionSettings> {}; + +using TModifyConnectionResult = TProtoResultWrapper<YandexQuery::ModifyConnectionResult>; +using TAsyncModifyConnectionResult = NThreading::TFuture<TModifyConnectionResult>; +struct TModifyConnectionSettings : public NYdb::TOperationRequestSettings<TModifyConnectionSettings> {}; + +using TDeleteConnectionResult = TProtoResultWrapper<YandexQuery::DeleteConnectionResult>; +using TAsyncDeleteConnectionResult = NThreading::TFuture<TDeleteConnectionResult>; +struct TDeleteConnectionSettings : public NYdb::TOperationRequestSettings<TDeleteConnectionSettings> {}; + using TTestConnectionResult = TProtoResultWrapper<YandexQuery::TestConnectionResult>; using TAsyncTestConnectionResult = NThreading::TFuture<TTestConnectionResult>; struct TTestConnectionSettings : public NYdb::TOperationRequestSettings<TTestConnectionSettings> {}; -using TCreateBindingResult = TProtoResultWrapper<YandexQuery::CreateBindingResult>; -using TAsyncCreateBindingResult = NThreading::TFuture<TCreateBindingResult>; -struct TCreateBindingSettings : public NYdb::TOperationRequestSettings<TCreateBindingSettings> {}; - -using TListBindingsResult = TProtoResultWrapper<YandexQuery::ListBindingsResult>; -using TAsyncListBindingsResult = NThreading::TFuture<TListBindingsResult>; -struct TListBindingsSettings : public NYdb::TOperationRequestSettings<TListBindingsSettings> {}; - -using TDescribeBindingResult = TProtoResultWrapper<YandexQuery::DescribeBindingResult>; -using TAsyncDescribeBindingResult = NThreading::TFuture<TDescribeBindingResult>; -struct TDescribeBindingSettings : public NYdb::TOperationRequestSettings<TDescribeBindingSettings> {}; - -using TModifyBindingResult = TProtoResultWrapper<YandexQuery::ModifyBindingResult>; -using TAsyncModifyBindingResult = NThreading::TFuture<TModifyBindingResult>; -struct TModifyBindingSettings : public NYdb::TOperationRequestSettings<TModifyBindingSettings> {}; - -using TDeleteBindingResult = TProtoResultWrapper<YandexQuery::DeleteBindingResult>; -using TAsyncDeleteBindingResult = NThreading::TFuture<TDeleteBindingResult>; -struct TDeleteBindingSettings : public NYdb::TOperationRequestSettings<TDeleteBindingSettings> {}; - -class TClient { - class TImpl; - -public: - TClient(const NYdb::TDriver& driver, const NYdb::TCommonClientSettings& settings = NYdb::TCommonClientSettings()); - - TAsyncCreateQueryResult CreateQuery( - const YandexQuery::CreateQueryRequest& request, - const TCreateQuerySettings& settings = TCreateQuerySettings()); - - TAsyncListQueriesResult ListQueries( - const YandexQuery::ListQueriesRequest& request, - const TListQueriesSettings& settings = TListQueriesSettings()); - - TAsyncDescribeQueryResult DescribeQuery( - const YandexQuery::DescribeQueryRequest& request, - const TDescribeQuerySettings& settings = TDescribeQuerySettings()); - +using TCreateBindingResult = TProtoResultWrapper<YandexQuery::CreateBindingResult>; +using TAsyncCreateBindingResult = NThreading::TFuture<TCreateBindingResult>; +struct TCreateBindingSettings : public NYdb::TOperationRequestSettings<TCreateBindingSettings> {}; + +using TListBindingsResult = TProtoResultWrapper<YandexQuery::ListBindingsResult>; +using TAsyncListBindingsResult = NThreading::TFuture<TListBindingsResult>; +struct TListBindingsSettings : public NYdb::TOperationRequestSettings<TListBindingsSettings> {}; + +using TDescribeBindingResult = TProtoResultWrapper<YandexQuery::DescribeBindingResult>; +using TAsyncDescribeBindingResult = NThreading::TFuture<TDescribeBindingResult>; +struct TDescribeBindingSettings : public NYdb::TOperationRequestSettings<TDescribeBindingSettings> {}; + +using TModifyBindingResult = TProtoResultWrapper<YandexQuery::ModifyBindingResult>; +using TAsyncModifyBindingResult = NThreading::TFuture<TModifyBindingResult>; +struct TModifyBindingSettings : public NYdb::TOperationRequestSettings<TModifyBindingSettings> {}; + +using TDeleteBindingResult = TProtoResultWrapper<YandexQuery::DeleteBindingResult>; +using TAsyncDeleteBindingResult = NThreading::TFuture<TDeleteBindingResult>; +struct TDeleteBindingSettings : public NYdb::TOperationRequestSettings<TDeleteBindingSettings> {}; + +class TClient { + class TImpl; + +public: + TClient(const NYdb::TDriver& driver, const NYdb::TCommonClientSettings& settings = NYdb::TCommonClientSettings()); + + TAsyncCreateQueryResult CreateQuery( + const YandexQuery::CreateQueryRequest& request, + const TCreateQuerySettings& settings = TCreateQuerySettings()); + + TAsyncListQueriesResult ListQueries( + const YandexQuery::ListQueriesRequest& request, + const TListQueriesSettings& settings = TListQueriesSettings()); + + TAsyncDescribeQueryResult DescribeQuery( + const YandexQuery::DescribeQueryRequest& request, + const TDescribeQuerySettings& settings = TDescribeQuerySettings()); + TAsyncGetQueryStatusResult GetQueryStatus( const YandexQuery::GetQueryStatusRequest& request, const TGetQueryStatusSettings& settings = TGetQueryStatusSettings()); - TAsyncModifyQueryResult ModifyQuery( - const YandexQuery::ModifyQueryRequest& request, - const TModifyQuerySettings& settings = TModifyQuerySettings()); - - TAsyncDeleteQueryResult DeleteQuery( - const YandexQuery::DeleteQueryRequest& request, - const TDeleteQuerySettings& settings = TDeleteQuerySettings()); - - TAsyncControlQueryResult ControlQuery( - const YandexQuery::ControlQueryRequest& request, - const TControlQuerySettings& settings = TControlQuerySettings()); - - TAsyncGetResultDataResult GetResultData( - const YandexQuery::GetResultDataRequest& request, - const TGetResultDataSettings& settings = TGetResultDataSettings()); - - TAsyncListJobsResult ListJobs( - const YandexQuery::ListJobsRequest& request, - const TListJobsSettings& settings = TListJobsSettings()); - + TAsyncModifyQueryResult ModifyQuery( + const YandexQuery::ModifyQueryRequest& request, + const TModifyQuerySettings& settings = TModifyQuerySettings()); + + TAsyncDeleteQueryResult DeleteQuery( + const YandexQuery::DeleteQueryRequest& request, + const TDeleteQuerySettings& settings = TDeleteQuerySettings()); + + TAsyncControlQueryResult ControlQuery( + const YandexQuery::ControlQueryRequest& request, + const TControlQuerySettings& settings = TControlQuerySettings()); + + TAsyncGetResultDataResult GetResultData( + const YandexQuery::GetResultDataRequest& request, + const TGetResultDataSettings& settings = TGetResultDataSettings()); + + TAsyncListJobsResult ListJobs( + const YandexQuery::ListJobsRequest& request, + const TListJobsSettings& settings = TListJobsSettings()); + TAsyncDescribeJobResult DescribeJob( const YandexQuery::DescribeJobRequest& request, const TDescribeJobSettings& settings = TDescribeJobSettings()); - TAsyncCreateConnectionResult CreateConnection( - const YandexQuery::CreateConnectionRequest& request, - const TCreateConnectionSettings& settings = TCreateConnectionSettings()); - - TAsyncListConnectionsResult ListConnections( - const YandexQuery::ListConnectionsRequest& request, - const TListConnectionsSettings& settings = TListConnectionsSettings()); - - TAsyncDescribeConnectionResult DescribeConnection( - const YandexQuery::DescribeConnectionRequest& request, - const TDescribeConnectionSettings& settings = TDescribeConnectionSettings()); - - TAsyncModifyConnectionResult ModifyConnection( - const YandexQuery::ModifyConnectionRequest& request, - const TModifyConnectionSettings& settings = TModifyConnectionSettings()); - - TAsyncDeleteConnectionResult DeleteConnection( - const YandexQuery::DeleteConnectionRequest& request, - const TDeleteConnectionSettings& settings = TDeleteConnectionSettings()); - + TAsyncCreateConnectionResult CreateConnection( + const YandexQuery::CreateConnectionRequest& request, + const TCreateConnectionSettings& settings = TCreateConnectionSettings()); + + TAsyncListConnectionsResult ListConnections( + const YandexQuery::ListConnectionsRequest& request, + const TListConnectionsSettings& settings = TListConnectionsSettings()); + + TAsyncDescribeConnectionResult DescribeConnection( + const YandexQuery::DescribeConnectionRequest& request, + const TDescribeConnectionSettings& settings = TDescribeConnectionSettings()); + + TAsyncModifyConnectionResult ModifyConnection( + const YandexQuery::ModifyConnectionRequest& request, + const TModifyConnectionSettings& settings = TModifyConnectionSettings()); + + TAsyncDeleteConnectionResult DeleteConnection( + const YandexQuery::DeleteConnectionRequest& request, + const TDeleteConnectionSettings& settings = TDeleteConnectionSettings()); + TAsyncTestConnectionResult TestConnection( const YandexQuery::TestConnectionRequest& request, const TTestConnectionSettings& settings = TTestConnectionSettings()); - TAsyncCreateBindingResult CreateBinding( - const YandexQuery::CreateBindingRequest& request, - const TCreateBindingSettings& settings = TCreateBindingSettings()); - - TAsyncListBindingsResult ListBindings( - const YandexQuery::ListBindingsRequest& request, - const TListBindingsSettings& settings = TListBindingsSettings()); - - TAsyncDescribeBindingResult DescribeBinding( - const YandexQuery::DescribeBindingRequest& request, - const TDescribeBindingSettings& settings = TDescribeBindingSettings()); - - TAsyncModifyBindingResult ModifyBinding( - const YandexQuery::ModifyBindingRequest& request, - const TModifyBindingSettings& settings = TModifyBindingSettings()); - - TAsyncDeleteBindingResult DeleteBinding( - const YandexQuery::DeleteBindingRequest& request, - const TDeleteBindingSettings& settings = TDeleteBindingSettings()); - -private: - std::shared_ptr<TImpl> Impl_; -}; - -} // namespace NYdb::NYq + TAsyncCreateBindingResult CreateBinding( + const YandexQuery::CreateBindingRequest& request, + const TCreateBindingSettings& settings = TCreateBindingSettings()); + + TAsyncListBindingsResult ListBindings( + const YandexQuery::ListBindingsRequest& request, + const TListBindingsSettings& settings = TListBindingsSettings()); + + TAsyncDescribeBindingResult DescribeBinding( + const YandexQuery::DescribeBindingRequest& request, + const TDescribeBindingSettings& settings = TDescribeBindingSettings()); + + TAsyncModifyBindingResult ModifyBinding( + const YandexQuery::ModifyBindingRequest& request, + const TModifyBindingSettings& settings = TModifyBindingSettings()); + + TAsyncDeleteBindingResult DeleteBinding( + const YandexQuery::DeleteBindingRequest& request, + const TDeleteBindingSettings& settings = TDeleteBindingSettings()); + +private: + std::shared_ptr<TImpl> Impl_; +}; + +} // namespace NYdb::NYq diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/grpc_connections/grpc_connections.h b/ydb/public/sdk/cpp/client/impl/ydb_internal/grpc_connections/grpc_connections.h index bfc1b7ec38..1eccb11db5 100644 --- a/ydb/public/sdk/cpp/client/impl/ydb_internal/grpc_connections/grpc_connections.h +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/grpc_connections/grpc_connections.h @@ -202,8 +202,8 @@ public: meta.Aux.push_back({YDB_SDK_BUILD_INFO_HEADER, CreateSDKBuildInfo()}); } - meta.Aux.insert(meta.Aux.end(), requestSettings.Header.begin(), requestSettings.Header.end()); - + meta.Aux.insert(meta.Aux.end(), requestSettings.Header.begin(), requestSettings.Header.end()); + dbState->StatCollector.IncGRpcInFlight(); dbState->StatCollector.IncGRpcInFlightByHost(endpoint); diff --git a/ydb/public/sdk/cpp/client/impl/ydb_internal/rpc_request_settings/settings.h b/ydb/public/sdk/cpp/client/impl/ydb_internal/rpc_request_settings/settings.h index 2a2611794d..3173e34c00 100644 --- a/ydb/public/sdk/cpp/client/impl/ydb_internal/rpc_request_settings/settings.h +++ b/ydb/public/sdk/cpp/client/impl/ydb_internal/rpc_request_settings/settings.h @@ -20,7 +20,7 @@ struct TRpcRequestSettings { TRpcRequestSettings rpcSettings; rpcSettings.TraceId = settings.TraceId_; rpcSettings.RequestType = settings.RequestType_; - rpcSettings.Header = settings.Header_; + rpcSettings.Header = settings.Header_; rpcSettings.EndpointPolicy = TEndpointPolicy::UsePreferedEndpoint; rpcSettings.UseAuth = true; return rpcSettings; diff --git a/ydb/public/sdk/cpp/client/resources/ydb_resources.cpp b/ydb/public/sdk/cpp/client/resources/ydb_resources.cpp index 079e8a59a2..fec977630f 100644 --- a/ydb/public/sdk/cpp/client/resources/ydb_resources.cpp +++ b/ydb/public/sdk/cpp/client/resources/ydb_resources.cpp @@ -4,10 +4,10 @@ namespace NYdb { -const char* YDB_AUTH_TICKET_HEADER = "x-ydb-auth-ticket"; -const char* YDB_DATABASE_HEADER = "x-ydb-database"; -const char* YDB_TRACE_ID_HEADER = "x-ydb-trace-id"; -const char* YDB_SDK_BUILD_INFO_HEADER = "x-ydb-sdk-build-info"; +const char* YDB_AUTH_TICKET_HEADER = "x-ydb-auth-ticket"; +const char* YDB_DATABASE_HEADER = "x-ydb-database"; +const char* YDB_TRACE_ID_HEADER = "x-ydb-trace-id"; +const char* YDB_SDK_BUILD_INFO_HEADER = "x-ydb-sdk-build-info"; const char* YDB_REQUEST_TYPE_HEADER = "x-ydb-request-type"; const char* YDB_CONSUMED_UNITS_HEADER = "x-ydb-consumed-units"; diff --git a/ydb/public/sdk/cpp/client/resources/ydb_resources.h b/ydb/public/sdk/cpp/client/resources/ydb_resources.h index 61dee0d2f4..c015bfca7e 100644 --- a/ydb/public/sdk/cpp/client/resources/ydb_resources.h +++ b/ydb/public/sdk/cpp/client/resources/ydb_resources.h @@ -4,10 +4,10 @@ namespace NYdb { -extern const char* YDB_AUTH_TICKET_HEADER; -extern const char* YDB_DATABASE_HEADER; -extern const char* YDB_TRACE_ID_HEADER; -extern const char* YDB_SDK_BUILD_INFO_HEADER; +extern const char* YDB_AUTH_TICKET_HEADER; +extern const char* YDB_DATABASE_HEADER; +extern const char* YDB_TRACE_ID_HEADER; +extern const char* YDB_SDK_BUILD_INFO_HEADER; extern const char* YDB_REQUEST_TYPE_HEADER; extern const char* YDB_CONSUMED_UNITS_HEADER; extern const char* YDB_SERVER_HINTS; diff --git a/ydb/public/sdk/cpp/client/ydb_types/request_settings.h b/ydb/public/sdk/cpp/client/ydb_types/request_settings.h index fb8aa8ac68..336ea5e228 100644 --- a/ydb/public/sdk/cpp/client/ydb_types/request_settings.h +++ b/ydb/public/sdk/cpp/client/ydb_types/request_settings.h @@ -4,19 +4,19 @@ #include <util/datetime/base.h> -#include <vector> -#include <utility> - +#include <vector> +#include <utility> + namespace NYdb { template<typename TDerived> struct TRequestSettings { using TSelf = TDerived; - using THeader = std::vector<std::pair<TString, TString>>; + using THeader = std::vector<std::pair<TString, TString>>; FLUENT_SETTING(TString, TraceId); FLUENT_SETTING(TString, RequestType); - FLUENT_SETTING(THeader, Header); + FLUENT_SETTING(THeader, Header); TRequestSettings() = default; @@ -24,7 +24,7 @@ struct TRequestSettings { explicit TRequestSettings(const TRequestSettings<T>& other) : TraceId_(other.TraceId_) , RequestType_(other.RequestType_) - , Header_(other.Header_) + , Header_(other.Header_) {} }; diff --git a/ydb/services/ydb/ydb_common_ut.h b/ydb/services/ydb/ydb_common_ut.h index c067928c78..2e2ca6a118 100644 --- a/ydb/services/ydb/ydb_common_ut.h +++ b/ydb/services/ydb/ydb_common_ut.h @@ -46,7 +46,7 @@ public: NKikimrConfig::TAppConfig appConfig = {}, const TVector<NKikimrKqp::TKqpSetting>& kqpSettings = {}, TAutoPtr<TLogBackend> logBackend = {}, - bool enableYq = false, + bool enableYq = false, TAppPrepare::TFnReg udfFrFactory = nullptr, std::function<void(TServerSettings& settings)> builder = nullptr) { @@ -77,7 +77,7 @@ public: ServerSettings->SetEnableNotNullColumns(true); ServerSettings->SetEnableSystemViews(TestSettings::EnableSystemViews); ServerSettings->SetEnableSchemeTransactionsAtSchemeShard(true); - ServerSettings->SetEnableYq(enableYq); + ServerSettings->SetEnableYq(enableYq); ServerSettings->Formats = new TFormatFactory; ServerSettings->PQConfig = appConfig.GetPQConfig(); if (appConfig.HasMeteringConfig() && appConfig.GetMeteringConfig().HasMeteringFilePath()) { diff --git a/ydb/services/yq/grpc_service.cpp b/ydb/services/yq/grpc_service.cpp index bb71dde092..d18b2ce29a 100644 --- a/ydb/services/yq/grpc_service.cpp +++ b/ydb/services/yq/grpc_service.cpp @@ -1,40 +1,40 @@ -#include "grpc_service.h" - +#include "grpc_service.h" + #include <ydb/core/grpc_services/grpc_helper.h> #include <ydb/core/grpc_services/grpc_request_proxy.h> #include <ydb/core/grpc_services/rpc_calls.h> #include <ydb/core/grpc_services/service_yq.h> #include <ydb/library/protobuf_printer/security_printer.h> - -namespace NKikimr::NGRpcService { - -TGRpcYandexQueryService::TGRpcYandexQueryService(NActors::TActorSystem *system, - TIntrusivePtr<NMonitoring::TDynamicCounters> counters, NActors::TActorId id) - : ActorSystem_(system) - , Counters_(counters) - , GRpcRequestProxyId_(id) {} - -void TGRpcYandexQueryService::InitService(grpc::ServerCompletionQueue *cq, NGrpc::TLoggerPtr logger) { - CQ_ = cq; - SetupIncomingRequests(std::move(logger)); -} - -void TGRpcYandexQueryService::SetGlobalLimiterHandle(NGrpc::TGlobalLimiter* limiter) { - Limiter_ = limiter; -} - -bool TGRpcYandexQueryService::IncRequest() { - return Limiter_->Inc(); -} - -void TGRpcYandexQueryService::DecRequest() { - Limiter_->Dec(); - Y_ASSERT(Limiter_->GetCurrentInFlight() >= 0); -} - -void TGRpcYandexQueryService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) { - auto getCounterBlock = CreateCounterCb(Counters_, ActorSystem_); - + +namespace NKikimr::NGRpcService { + +TGRpcYandexQueryService::TGRpcYandexQueryService(NActors::TActorSystem *system, + TIntrusivePtr<NMonitoring::TDynamicCounters> counters, NActors::TActorId id) + : ActorSystem_(system) + , Counters_(counters) + , GRpcRequestProxyId_(id) {} + +void TGRpcYandexQueryService::InitService(grpc::ServerCompletionQueue *cq, NGrpc::TLoggerPtr logger) { + CQ_ = cq; + SetupIncomingRequests(std::move(logger)); +} + +void TGRpcYandexQueryService::SetGlobalLimiterHandle(NGrpc::TGlobalLimiter* limiter) { + Limiter_ = limiter; +} + +bool TGRpcYandexQueryService::IncRequest() { + return Limiter_->Inc(); +} + +void TGRpcYandexQueryService::DecRequest() { + Limiter_->Dec(); + Y_ASSERT(Limiter_->GetCurrentInFlight() >= 0); +} + +void TGRpcYandexQueryService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) { + auto getCounterBlock = CreateCounterCb(Counters_, ActorSystem_); + static const TVector<TString> CreateQueryPermissions = { "yq.queries.create", "yq.queries.invoke", @@ -143,9 +143,9 @@ void TGRpcYandexQueryService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) { "yq.resources.managePrivate" }; -#ifdef ADD_REQUEST -#error ADD_REQUEST macro already defined -#endif +#ifdef ADD_REQUEST +#error ADD_REQUEST macro already defined +#endif #define ADD_REQUEST(NAME, CB, PERMISSIONS) \ MakeIntrusive<TGRpcRequest<YandexQuery::NAME##Request, YandexQuery::NAME##Response, TGRpcYandexQueryService, TSecurityTextFormatPrinter<YandexQuery::NAME##Request>, TSecurityTextFormatPrinter<YandexQuery::NAME##Response>>>( \ this, &Service_, CQ_, \ @@ -158,7 +158,7 @@ MakeIntrusive<TGRpcRequest<YandexQuery::NAME##Request, YandexQuery::NAME##Respon &YandexQuery::V1::YandexQueryService::AsyncService::Request##NAME, \ #NAME, logger, getCounterBlock("yq", #NAME)) \ ->Run(); \ - + ADD_REQUEST(CreateQuery, DoYandexQueryCreateQueryRequest, CreateQueryPermissions) ADD_REQUEST(ListQueries, DoYandexQueryListQueriesRequest, ListQueriesPermissions) ADD_REQUEST(DescribeQuery, DoYandexQueryDescribeQueryRequest, DescribeQueryPermissions) @@ -180,9 +180,9 @@ MakeIntrusive<TGRpcRequest<YandexQuery::NAME##Request, YandexQuery::NAME##Respon ADD_REQUEST(DescribeBinding, DoDescribeBindingRequest, DescribeBindingPermissions) ADD_REQUEST(ModifyBinding, DoModifyBindingRequest, ModifyBindingPermissions) ADD_REQUEST(DeleteBinding, DoDeleteBindingRequest, DeleteBindingPermissions) - + #undef ADD_REQUEST - -} - -} // namespace NKikimr::NGRpcService + +} + +} // namespace NKikimr::NGRpcService diff --git a/ydb/services/yq/grpc_service.h b/ydb/services/yq/grpc_service.h index 6cb8d70c64..3140d03ca5 100644 --- a/ydb/services/yq/grpc_service.h +++ b/ydb/services/yq/grpc_service.h @@ -1,36 +1,36 @@ -#pragma once - -#include <library/cpp/actors/core/actorsystem.h> - -#include <library/cpp/grpc/server/grpc_server.h> - +#pragma once + +#include <library/cpp/actors/core/actorsystem.h> + +#include <library/cpp/grpc/server/grpc_server.h> + #include <ydb/public/api/grpc/yq_v1.grpc.pb.h> - -namespace NKikimr { -namespace NGRpcService { - -class TGRpcYandexQueryService - : public NGrpc::TGrpcServiceBase<YandexQuery::V1::YandexQueryService> -{ -public: - TGRpcYandexQueryService(NActors::TActorSystem* system, TIntrusivePtr<NMonitoring::TDynamicCounters> counters, - NActors::TActorId id); - - void InitService(grpc::ServerCompletionQueue* cq, NGrpc::TLoggerPtr logger) override; - void SetGlobalLimiterHandle(NGrpc::TGlobalLimiter* limiter) override; - - bool IncRequest(); - void DecRequest(); -private: - void SetupIncomingRequests(NGrpc::TLoggerPtr logger); - - NActors::TActorSystem* ActorSystem_; + +namespace NKikimr { +namespace NGRpcService { + +class TGRpcYandexQueryService + : public NGrpc::TGrpcServiceBase<YandexQuery::V1::YandexQueryService> +{ +public: + TGRpcYandexQueryService(NActors::TActorSystem* system, TIntrusivePtr<NMonitoring::TDynamicCounters> counters, + NActors::TActorId id); + + void InitService(grpc::ServerCompletionQueue* cq, NGrpc::TLoggerPtr logger) override; + void SetGlobalLimiterHandle(NGrpc::TGlobalLimiter* limiter) override; + + bool IncRequest(); + void DecRequest(); +private: + void SetupIncomingRequests(NGrpc::TLoggerPtr logger); + + NActors::TActorSystem* ActorSystem_; grpc::ServerCompletionQueue* CQ_ = nullptr; - - TIntrusivePtr<NMonitoring::TDynamicCounters> Counters_; - NActors::TActorId GRpcRequestProxyId_; + + TIntrusivePtr<NMonitoring::TDynamicCounters> Counters_; + NActors::TActorId GRpcRequestProxyId_; NGrpc::TGlobalLimiter* Limiter_ = nullptr; -}; - -} // namespace NGRpcService -} // namespace NKikimr +}; + +} // namespace NGRpcService +} // namespace NKikimr diff --git a/ydb/services/yq/private_grpc.cpp b/ydb/services/yq/private_grpc.cpp index c4c076b482..6e1f1534db 100644 --- a/ydb/services/yq/private_grpc.cpp +++ b/ydb/services/yq/private_grpc.cpp @@ -39,7 +39,7 @@ void TGRpcYqPrivateTaskService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) #error ADD_REQUEST macro already defined #endif #define ADD_REQUEST(NAME, CB) \ -MakeIntrusive<TGRpcRequest<Yq::Private::NAME##Request, Yq::Private::NAME##Response, TGRpcYqPrivateTaskService, TSecurityTextFormatPrinter<Yq::Private::NAME##Request>, TSecurityTextFormatPrinter<Yq::Private::NAME##Response>>>( \ +MakeIntrusive<TGRpcRequest<Yq::Private::NAME##Request, Yq::Private::NAME##Response, TGRpcYqPrivateTaskService, TSecurityTextFormatPrinter<Yq::Private::NAME##Request>, TSecurityTextFormatPrinter<Yq::Private::NAME##Response>>>( \ this, &Service_, CQ_, \ [this](NGrpc::IRequestContextBase *ctx) { \ NGRpcService::ReportGrpcReqToMon(*ActorSystem_, ctx->GetPeer()); \ diff --git a/ydb/services/yq/ut_integration/ut_utils.cpp b/ydb/services/yq/ut_integration/ut_utils.cpp index 925f74f7b3..9cb4c16623 100644 --- a/ydb/services/yq/ut_integration/ut_utils.cpp +++ b/ydb/services/yq/ut_integration/ut_utils.cpp @@ -40,7 +40,7 @@ void UpsertToExistingTable(TDriver& driver, const TString& location){ paramsBuilder.AddParam("$now").Timestamp(now).Build(); auto params = paramsBuilder.Build(); - const TString scope = TScope("some_folder_id").ToString(); + const TString scope = TScope("some_folder_id").ToString(); { auto result = session.ExecuteSchemeQuery( diff --git a/ydb/services/yq/ut_integration/ya.make b/ydb/services/yq/ut_integration/ya.make index bc62df4563..b384b23d5d 100644 --- a/ydb/services/yq/ut_integration/ya.make +++ b/ydb/services/yq/ut_integration/ya.make @@ -12,7 +12,7 @@ SIZE(MEDIUM) SRCS( ut_utils.cpp - yq_ut.cpp + yq_ut.cpp ) PEERDIR( diff --git a/ydb/services/yq/ut_integration/yq_ut.cpp b/ydb/services/yq/ut_integration/yq_ut.cpp index d4a35f195e..8dc4cf0f93 100644 --- a/ydb/services/yq/ut_integration/yq_ut.cpp +++ b/ydb/services/yq/ut_integration/yq_ut.cpp @@ -9,11 +9,11 @@ #include <ydb/core/yq/libs/control_plane_storage/message_builders.h> #include <ydb/core/yq/libs/actors/database_resolver.h> - + #include <ydb/library/yql/public/issue/yql_issue_message.h> #include <library/cpp/protobuf/util/pb_io.h> -#include <library/cpp/retry/retry.h> +#include <library/cpp/retry/retry.h> #include <util/system/mutex.h> #include "ut_utils.h" #include <google/protobuf/util/time_util.h> @@ -24,7 +24,7 @@ #include <util/string/split.h> using namespace NYdb; -using namespace YandexQuery;; +using namespace YandexQuery;; using namespace NYdb::NYq; namespace { @@ -40,7 +40,7 @@ namespace { Cerr << ">>> Issues: " << issues.ToString() << Endl; } - TString CreateNewHistoryAndWaitFinish(const TString& folderId, + TString CreateNewHistoryAndWaitFinish(const TString& folderId, NYdb::NYq::TClient& client, const TString& yqlText, const YandexQuery::QueryMeta::ComputeStatus& expectedStatusResult) { @@ -51,7 +51,7 @@ namespace { .SetText(yqlText) .Build(); auto result = client.CreateQuery( - request, CreateYqSettings<TCreateQuerySettings>(folderId)) + request, CreateYqSettings<TCreateQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); @@ -85,7 +85,7 @@ namespace { .SetQueryId(queryId) .Build(); const auto result = client.GetResultData( - request, CreateYqSettings<TGetResultDataSettings>(folderId)) + request, CreateYqSettings<TGetResultDataSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); @@ -103,16 +103,16 @@ namespace { } } -Y_UNIT_TEST_SUITE(Yq_1) { +Y_UNIT_TEST_SUITE(Yq_1) { Y_UNIT_TEST(Basic) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); NYdb::NYq::TClient client(driver); const auto folderId = "some_folder_id"; - const auto queryId = CreateNewHistoryAndWaitFinish(folderId, client, "select 1", YandexQuery::QueryMeta::COMPLETED); - CheckGetResultData(client, queryId, folderId, 1, 1, 1); + const auto queryId = CreateNewHistoryAndWaitFinish(folderId, client, "select 1", YandexQuery::QueryMeta::COMPLETED); + CheckGetResultData(client, queryId, folderId, 1, 1, 1); { const auto request = ::NYq::TDescribeQueryBuilder() @@ -120,7 +120,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .Build(); const auto result = DoWithRetryOnRetCode([&]() { auto result = client.DescribeQuery( - request, CreateYqSettings<TDescribeQuerySettings>("WTF")) + request, CreateYqSettings<TDescribeQuerySettings>("WTF")) .ExtractValueSync(); return result.GetStatus() == EStatus::BAD_REQUEST; }, TRetryOptions(Retries)); @@ -131,7 +131,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { auto request = ::NYq::TListQueriesBuilder{}.Build(); auto result = DoWithRetryOnRetCode([&]() { auto result = client.ListQueries( - request, CreateYqSettings<TListQueriesSettings>("WTF")) + request, CreateYqSettings<TListQueriesSettings>("WTF")) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); UNIT_ASSERT_VALUES_EQUAL(result.GetResult().query().size(), 0); @@ -145,7 +145,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetQueryId(queryId) .Build(); auto result = client.DescribeQuery( - request, CreateYqSettings<TDescribeQuerySettings>(folderId)) + request, CreateYqSettings<TDescribeQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); const auto status = result.GetResult().query().meta().status(); @@ -158,7 +158,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetName("MODIFIED_NAME") .Build(); const auto result = client.ModifyQuery( - request, CreateYqSettings<TModifyQuerySettings>(folderId)) + request, CreateYqSettings<TModifyQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); } @@ -168,7 +168,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetQueryId(queryId) .Build(); const auto result = client.DescribeQuery( - request, CreateYqSettings<TDescribeQuerySettings>(folderId)) + request, CreateYqSettings<TDescribeQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); const auto& res = result.GetResult(); @@ -181,7 +181,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetQueryId("") .Build(); const auto result = client.DescribeQuery( - request, CreateYqSettings<TDescribeQuerySettings>("")) + request, CreateYqSettings<TDescribeQuerySettings>("")) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::BAD_REQUEST, result.GetIssues().ToString()); } @@ -191,14 +191,14 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetQueryId("") .Build(); const auto result = client.GetResultData( - request, CreateYqSettings<TGetResultDataSettings>("")) + request, CreateYqSettings<TGetResultDataSettings>("")) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::BAD_REQUEST, result.GetIssues().ToString()); } } Y_UNIT_TEST(Basic_EmptyTable) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -211,20 +211,20 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("Root", location, "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } const TString queryId = CreateNewHistoryAndWaitFinish( - folderId, client, + folderId, client, "select count(*) from testdbempty.`yq/empty_table`", YandexQuery::QueryMeta::COMPLETED); - CheckGetResultData(client, queryId, folderId, 1, 1, 0); + CheckGetResultData(client, queryId, folderId, 1, 1, 0); } Y_UNIT_TEST(Basic_EmptyList) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -235,7 +235,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(Basic_EmptyDict) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -246,7 +246,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(Basic_Null) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -257,7 +257,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } SIMPLE_UNIT_FORKED_TEST(Basic_Tagged) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -283,7 +283,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(Basic_TaggedLiteral) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -296,7 +296,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { // use fork for data test due to ch initialization problem SIMPLE_UNIT_FORKED_TEST(ExtendedDatabaseId) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -309,7 +309,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("FakeDatabaseId", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } @@ -320,27 +320,27 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("FakeDatabaseId", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } { - const auto queryId = CreateNewHistoryAndWaitFinish(folderId, client, + const auto queryId = CreateNewHistoryAndWaitFinish(folderId, client, "select count(*) from testdb01.`yq/connections`", YandexQuery::QueryMeta::COMPLETED); - CheckGetResultData(client, queryId, folderId, 1, 1, 2); + CheckGetResultData(client, queryId, folderId, 1, 1, 2); } { // test connections db with 2 databaseId - const auto queryId = CreateNewHistoryAndWaitFinish(folderId, client, + const auto queryId = CreateNewHistoryAndWaitFinish(folderId, client, "select count(*) from testdb02.`yq/connections`", YandexQuery::QueryMeta::COMPLETED); - CheckGetResultData(client, queryId, folderId, 1, 1, 2); + CheckGetResultData(client, queryId, folderId, 1, 1, 2); } } Y_UNIT_TEST(DescribeConnection) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -353,7 +353,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); conId = result.GetResult().connection_id(); @@ -363,7 +363,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetConnectionId(conId) .Build(); auto result = client - .DescribeConnection(request, CreateYqSettings<TDescribeConnectionSettings>(folderId)) + .DescribeConnection(request, CreateYqSettings<TDescribeConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::SUCCESS); const auto& res = result.GetResult().connection(); @@ -375,7 +375,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(ListConnections) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -389,7 +389,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("FakeDatabaseId", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } @@ -400,7 +400,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateDataStreams("FakeDatabaseId", "") // We can use the same db in yds and ydb .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } @@ -408,7 +408,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { { const auto request = ::NYq::TListConnectionsBuilder().Build(); auto result = client - .ListConnections(request, CreateYqSettings<TListConnectionsSettings>(folderId)) + .ListConnections(request, CreateYqSettings<TListConnectionsSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); UNIT_ASSERT_VALUES_EQUAL(result.GetResult().connection().size(), conns); @@ -435,7 +435,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(ListConnectionsOnEmptyConnectionsTable) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -444,7 +444,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { { const auto request = ::NYq::TListConnectionsBuilder().Build(); auto result = client - .ListConnections(request, CreateYqSettings<TListConnectionsSettings>("WTF")) + .ListConnections(request, CreateYqSettings<TListConnectionsSettings>("WTF")) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); UNIT_ASSERT(result.GetResult().connection().empty()); @@ -452,7 +452,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(ModifyConnections) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -468,7 +468,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); conId = result.GetResult().connection_id(); @@ -482,7 +482,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetDescription("Modified") .Build(); const auto result = client - .ModifyConnection(request, CreateYqSettings<TModifyConnectionSettings>(folderId)) + .ModifyConnection(request, CreateYqSettings<TModifyConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } @@ -492,7 +492,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetConnectionId(conId) .Build(); auto result = client - .DescribeConnection(request, CreateYqSettings<TDescribeConnectionSettings>(folderId)) + .DescribeConnection(request, CreateYqSettings<TDescribeConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); const auto& res = result.GetResult().connection(); @@ -505,7 +505,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(DeleteConnections) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -519,7 +519,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); conId = result.GetResult().connection_id(); @@ -531,14 +531,14 @@ Y_UNIT_TEST_SUITE(Yq_1) { .Build(); const auto result = client - .DeleteConnection(request, CreateYqSettings<TDeleteConnectionSettings>(folderId)) + .DeleteConnection(request, CreateYqSettings<TDeleteConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } } Y_UNIT_TEST(Create_And_Modify_The_Same_Connection) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -554,7 +554,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); conId = result.GetResult().connection_id(); @@ -566,14 +566,14 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("modified_db", "")//TODO remove .Build(); const auto result = client - .ModifyConnection(request, CreateYqSettings<TModifyConnectionSettings>(folderId)) + .ModifyConnection(request, CreateYqSettings<TModifyConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } } Y_UNIT_TEST(CreateConnection_With_Existing_Name) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -590,7 +590,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); } @@ -601,14 +601,14 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::BAD_REQUEST, result.GetIssues().ToString()); //TODO status should be ALREADY_EXISTS } } Y_UNIT_TEST(CreateConnections_With_Idempotency) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -627,7 +627,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); conId = result.GetResult().connection_id(); @@ -640,7 +640,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .CreateYdb("created_db", "") .Build(); const auto result = client - .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .CreateConnection(request, CreateYqSettings<TCreateConnectionSettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_C(result.GetStatus() == EStatus::SUCCESS, result.GetIssues().ToString()); UNIT_ASSERT_VALUES_EQUAL(conId, result.GetResult().connection_id()); @@ -648,7 +648,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } Y_UNIT_TEST(CreateQuery_With_Idempotency) {//TODO Fix - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -666,7 +666,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { { auto result = client.CreateQuery( - request, CreateYqSettings<TCreateQuerySettings>(folderId)) + request, CreateYqSettings<TCreateQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); queryId = result.GetResult().query_id(); @@ -678,7 +678,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .Build(); const auto result = DoWithRetryOnRetCode([&]() { auto result = client.DescribeQuery( - req, CreateYqSettings<TDescribeQuerySettings>(folderId)) + req, CreateYqSettings<TDescribeQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); const auto status = result.GetResult().query().meta().status(); @@ -689,18 +689,18 @@ Y_UNIT_TEST_SUITE(Yq_1) { } { auto result = client.CreateQuery( - request, CreateYqSettings<TCreateQuerySettings>(folderId)) + request, CreateYqSettings<TCreateQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); UNIT_ASSERT_VALUES_EQUAL(queryId, result.GetResult().query_id()); } - CheckGetResultData(client, queryId, folderId, 1, 1, 1); + CheckGetResultData(client, queryId, folderId, 1, 1, 1); } // use fork for data test due to ch initialization problem SIMPLE_UNIT_FORKED_TEST(CreateQuery_Without_Connection) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -708,12 +708,12 @@ Y_UNIT_TEST_SUITE(Yq_1) { NYdb::NYq::TClient client(driver); const TString yqlText = "select count(*) from testdbWTF.`connections`"; - CreateNewHistoryAndWaitFinish("folder_id_WTF", client, + CreateNewHistoryAndWaitFinish("folder_id_WTF", client, yqlText, YandexQuery::QueryMeta::FAILED); } Y_UNIT_TEST(DeleteQuery) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -722,16 +722,16 @@ Y_UNIT_TEST_SUITE(Yq_1) { const auto folderId = TString(__func__) + "folder_id"; const TString yqlText = "select 1"; - const TString queryId = CreateNewHistoryAndWaitFinish(folderId, client, + const TString queryId = CreateNewHistoryAndWaitFinish(folderId, client, yqlText, YandexQuery::QueryMeta::COMPLETED); - CheckGetResultData(client, queryId, folderId, 1, 1, 1); + CheckGetResultData(client, queryId, folderId, 1, 1, 1); { const auto request = ::NYq::TDeleteQueryBuilder() .SetQueryId(queryId) .Build(); auto result = client - .DeleteQuery(request, CreateYqSettings<TDeleteQuerySettings>(folderId)) + .DeleteQuery(request, CreateYqSettings<TDeleteQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL(result.IsTransportError(), false); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); @@ -742,14 +742,14 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetQueryId(queryId) .Build(); auto result = client - .DescribeQuery(request, CreateYqSettings<TDescribeQuerySettings>(folderId)) + .DescribeQuery(request, CreateYqSettings<TDescribeQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::BAD_REQUEST, result.GetIssues().ToString()); } } Y_UNIT_TEST(ModifyQuery) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; TString userToken = "root@builtin"; @@ -758,9 +758,9 @@ Y_UNIT_TEST_SUITE(Yq_1) { const auto folderId = TString(__func__) + "folder_id"; const TString yqlText = "select 1"; - const TString queryId = CreateNewHistoryAndWaitFinish(folderId, client, + const TString queryId = CreateNewHistoryAndWaitFinish(folderId, client, yqlText, YandexQuery::QueryMeta::COMPLETED); - CheckGetResultData(client, queryId, folderId, 1, 1, 1); + CheckGetResultData(client, queryId, folderId, 1, 1, 1); { const auto request = ::NYq::TModifyQueryBuilder() @@ -769,7 +769,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetDescription("OK") .Build(); auto result = client - .ModifyQuery(request, CreateYqSettings<TModifyQuerySettings>(folderId)) + .ModifyQuery(request, CreateYqSettings<TModifyQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL(result.IsTransportError(), false); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); @@ -780,7 +780,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { .SetQueryId(queryId) .Build(); auto result = client - .DescribeQuery(request, CreateYqSettings<TDescribeQuerySettings>(folderId)) + .DescribeQuery(request, CreateYqSettings<TDescribeQuerySettings>(folderId)) .ExtractValueSync(); UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); const auto& query = result.GetResult().query(); @@ -855,7 +855,7 @@ Y_UNIT_TEST_SUITE(Yq_1) { } } -Y_UNIT_TEST_SUITE(Yq_2) { +Y_UNIT_TEST_SUITE(Yq_2) { // use fork for data test due to ch initialization problem Y_UNIT_TEST(Test_HostNameTrasformation) { UNIT_ASSERT_VALUES_EQUAL(::NYq::TransformMdbHostToCorrectFormat("rc1c-p5waby2y5y1kb5ue.mdb.yandexcloud.net"), "rc1c-p5waby2y5y1kb5ue.db.yandex.net:8443"); @@ -863,79 +863,79 @@ Y_UNIT_TEST_SUITE(Yq_2) { UNIT_ASSERT_VALUES_EQUAL(::NYq::TransformMdbHostToCorrectFormat("host."), "host.db.yandex.net:8443"); } - SIMPLE_UNIT_FORKED_TEST(ReadFromYdbOverYq) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); - ui16 grpc = server.GetPort(); - TString location = TStringBuilder() << "localhost:" << grpc; - auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); - NYdb::NYq::TClient client(driver); - const auto folderId = TString(__func__) + "folder_id"; - - { - auto request = ::NYq::TCreateConnectionBuilder{} - .SetName("testdb00") - .CreateYdb("Root", location, "") - .Build(); - - auto result = client.CreateConnection( - request, CreateYqSettings<TCreateConnectionSettings>(folderId)) - .ExtractValueSync(); - - UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); - } - - TString queryId; - { - auto request = ::NYq::TCreateQueryBuilder{} + SIMPLE_UNIT_FORKED_TEST(ReadFromYdbOverYq) { + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + ui16 grpc = server.GetPort(); + TString location = TStringBuilder() << "localhost:" << grpc; + auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); + NYdb::NYq::TClient client(driver); + const auto folderId = TString(__func__) + "folder_id"; + + { + auto request = ::NYq::TCreateConnectionBuilder{} + .SetName("testdb00") + .CreateYdb("Root", location, "") + .Build(); + + auto result = client.CreateConnection( + request, CreateYqSettings<TCreateConnectionSettings>(folderId)) + .ExtractValueSync(); + + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + } + + TString queryId; + { + auto request = ::NYq::TCreateQueryBuilder{} .SetText("select count(*) from testdb00.`yq/connections`") - .Build(); - auto result = client.CreateQuery( - request, CreateYqSettings<TCreateQuerySettings>(folderId)) - .ExtractValueSync(); - - UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); - queryId = result.GetResult().query_id(); - } - - { - auto request = ::NYq::TDescribeQueryBuilder{}.SetQueryId(queryId).Build(); - auto result = DoWithRetryOnRetCode([&]() { - auto result = client.DescribeQuery( - request, CreateYqSettings<TDescribeQuerySettings>(folderId)) - .ExtractValueSync(); - UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); - const auto status = result.GetResult().query().meta().status(); + .Build(); + auto result = client.CreateQuery( + request, CreateYqSettings<TCreateQuerySettings>(folderId)) + .ExtractValueSync(); + + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + queryId = result.GetResult().query_id(); + } + + { + auto request = ::NYq::TDescribeQueryBuilder{}.SetQueryId(queryId).Build(); + auto result = DoWithRetryOnRetCode([&]() { + auto result = client.DescribeQuery( + request, CreateYqSettings<TDescribeQuerySettings>(folderId)) + .ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + const auto status = result.GetResult().query().meta().status(); PrintProtoIssues(result.GetResult().query().issue()); - return status == YandexQuery::QueryMeta::COMPLETED; - }, TRetryOptions(10)); - UNIT_ASSERT_C(result, "the execution of the query did not end within the time limit"); - } - - { - auto request = ::NYq::TGetResultDataBuilder{}.SetQueryId(queryId).Build(); - auto result = client.GetResultData( - request, CreateYqSettings<TGetResultDataSettings>(folderId)) - .ExtractValueSync(); - UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); - - const auto& resultSet = result.GetResult().result_set(); - UNIT_ASSERT_VALUES_EQUAL(resultSet.rows().size(), 1); - UNIT_ASSERT_VALUES_EQUAL(resultSet.columns().size(), 1); + return status == YandexQuery::QueryMeta::COMPLETED; + }, TRetryOptions(10)); + UNIT_ASSERT_C(result, "the execution of the query did not end within the time limit"); + } + + { + auto request = ::NYq::TGetResultDataBuilder{}.SetQueryId(queryId).Build(); + auto result = client.GetResultData( + request, CreateYqSettings<TGetResultDataSettings>(folderId)) + .ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); + + const auto& resultSet = result.GetResult().result_set(); + UNIT_ASSERT_VALUES_EQUAL(resultSet.rows().size(), 1); + UNIT_ASSERT_VALUES_EQUAL(resultSet.columns().size(), 1); UNIT_ASSERT_VALUES_EQUAL(resultSet.rows(0).items(0).uint64_value(), 1); - } - } + } + } } Y_UNIT_TEST_SUITE(PrivateApi) { Y_UNIT_TEST(PingTask) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); ::NYq::TPrivateClient client(driver); const TString historyId = "id"; const TString folderId = "folder_id"; - const TScope scope(folderId); + const TScope scope(folderId); { Yq::Private::PingTaskRequest req; req.mutable_query_id()->set_value("id"); @@ -949,7 +949,7 @@ Y_UNIT_TEST_SUITE(PrivateApi) { } Y_UNIT_TEST(GetTask) {//PendingFetcher can take task first - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); @@ -966,7 +966,7 @@ Y_UNIT_TEST_SUITE(PrivateApi) { } Y_UNIT_TEST(Nodes) { - TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); + TKikimrWithGrpcAndRootSchema server({}, {}, {}, true); ui16 grpc = server.GetPort(); TString location = TStringBuilder() << "localhost:" << grpc; auto driver = TDriver(TDriverConfig().SetEndpoint(location).SetAuthToken("root@builtin")); diff --git a/ydb/services/yq/ya.make b/ydb/services/yq/ya.make index 905c48a496..edc92f9c4e 100644 --- a/ydb/services/yq/ya.make +++ b/ydb/services/yq/ya.make @@ -1,26 +1,26 @@ -LIBRARY() - +LIBRARY() + OWNER( g:kikimr g:yq ) - -SRCS( - grpc_service.cpp + +SRCS( + grpc_service.cpp private_grpc.cpp -) - -PEERDIR( - library/cpp/grpc/server +) + +PEERDIR( + library/cpp/grpc/server library/cpp/retry ydb/core/grpc_services ydb/core/grpc_services/base ydb/library/protobuf_printer ydb/public/api/grpc -) - -END() - -RECURSE_FOR_TESTS( - ut_integration -) +) + +END() + +RECURSE_FOR_TESTS( + ut_integration +) |