aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhcpp <hcpp@yandex-team.ru>2022-02-16 17:21:20 +0300
committerhcpp <hcpp@yandex-team.ru>2022-02-16 17:21:20 +0300
commitd85fd50f5013890b5b552e67c7aa9cda249bc01c (patch)
treecd81efc18656a5a95e22e2e10317f5a2285959e9
parent2a29aa7f66e39a293579f425cb40800ef5c93c9e (diff)
downloadydb-d85fd50f5013890b5b552e67c7aa9cda249bc01c.tar.gz
neg tests has been added YQ-660
ref:f2dee46c0a5f48d09ca08bd4b8979959ca6666bd
-rw-r--r--ydb/core/yq/libs/control_plane_proxy/control_plane_proxy.cpp155
-rw-r--r--ydb/core/yq/libs/control_plane_proxy/ut/control_plane_proxy_ut.cpp2268
2 files changed, 2352 insertions, 71 deletions
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..a41142e15f 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
@@ -386,11 +386,14 @@ private:
};
template<typename T>
- TPermissions ExtractPermissions(T& ev) {
+ TPermissions ExtractPermissions(T& ev, const TPermissions& availablePermissions) {
TPermissions permissions;
for (const auto& permission: ev->Get()->Permissions) {
if (auto it = PermissionsItems.find(permission); it != PermissionsItems.end()) {
- permissions.Set(it->second);
+ // cut off permissions that should not be used in other services
+ if (availablePermissions.Check(it->second)) {
+ permissions.Set(it->second);
+ }
}
}
return permissions;
@@ -439,6 +442,13 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::QUERY_INVOKE
+ | TPermissions::TPermission::CONNECTIONS_USE
+ | TPermissions::TPermission::BINDINGS_USE
+ | TPermissions::TPermission::MANAGE_PUBLIC
+ };
+
Register(new TRequestActor<YandexQuery::CreateQueryRequest,
TEvControlPlaneStorage::TEvCreateQueryRequest,
TEvControlPlaneStorage::TEvCreateQueryResponse,
@@ -447,7 +457,7 @@ private:
std::move(request), std::move(user), std::move(token),
ControlPlaneStorageServiceActorId(),
requestCounters,
- probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER]));
+ probe, ExtractPermissions(ev, availablePermissions), Counters.Requests[RT_RESOLVE_FOLDER]));
}
void Handle(TEvControlPlaneProxy::TEvListQueriesRequest::TPtr& ev) {
@@ -477,6 +487,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ListQueriesRequest,
TEvControlPlaneStorage::TEvListQueriesRequest,
TEvControlPlaneStorage::TEvListQueriesResponse,
@@ -485,7 +500,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvDescribeQueryRequest::TPtr& ev) {
@@ -516,6 +531,12 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_AST
+ | TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::DescribeQueryRequest,
TEvControlPlaneStorage::TEvDescribeQueryRequest,
TEvControlPlaneStorage::TEvDescribeQueryResponse,
@@ -524,7 +545,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvGetQueryStatusRequest::TPtr& ev) {
@@ -555,6 +576,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::GetQueryStatusRequest,
TEvControlPlaneStorage::TEvGetQueryStatusRequest,
TEvControlPlaneStorage::TEvGetQueryStatusResponse,
@@ -563,7 +589,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvModifyQueryRequest::TPtr& ev) {
@@ -594,6 +620,14 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::QUERY_INVOKE
+ | TPermissions::TPermission::CONNECTIONS_USE
+ | TPermissions::TPermission::BINDINGS_USE
+ | TPermissions::TPermission::MANAGE_PUBLIC
+ | TPermissions::TPermission::MANAGE_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ModifyQueryRequest,
TEvControlPlaneStorage::TEvModifyQueryRequest,
TEvControlPlaneStorage::TEvModifyQueryResponse,
@@ -602,7 +636,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvDeleteQueryRequest::TPtr& ev) {
@@ -633,6 +667,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ | TPermissions::TPermission::MANAGE_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::DeleteQueryRequest,
TEvControlPlaneStorage::TEvDeleteQueryRequest,
TEvControlPlaneStorage::TEvDeleteQueryResponse,
@@ -641,7 +680,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvControlQueryRequest::TPtr& ev) {
@@ -672,6 +711,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ | TPermissions::TPermission::MANAGE_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ControlQueryRequest,
TEvControlPlaneStorage::TEvControlQueryRequest,
TEvControlPlaneStorage::TEvControlQueryResponse,
@@ -680,7 +724,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvGetResultDataRequest::TPtr& ev) {
@@ -714,6 +758,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::GetResultDataRequest,
TEvControlPlaneStorage::TEvGetResultDataRequest,
TEvControlPlaneStorage::TEvGetResultDataResponse,
@@ -722,7 +771,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvListJobsRequest::TPtr& ev) {
@@ -742,6 +791,8 @@ private:
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());
@@ -753,6 +804,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ListJobsRequest,
TEvControlPlaneStorage::TEvListJobsRequest,
TEvControlPlaneStorage::TEvListJobsResponse,
@@ -761,7 +817,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvDescribeJobRequest::TPtr& ev) {
@@ -792,6 +848,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::DescribeJobRequest,
TEvControlPlaneStorage::TEvDescribeJobRequest,
TEvControlPlaneStorage::TEvDescribeJobResponse,
@@ -800,7 +861,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvCreateConnectionRequest::TPtr& ev) {
@@ -835,6 +896,10 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ };
+
Register(new TRequestActor<YandexQuery::CreateConnectionRequest,
TEvControlPlaneStorage::TEvCreateConnectionRequest,
TEvControlPlaneStorage::TEvCreateConnectionResponse,
@@ -843,7 +908,7 @@ private:
std::move(request), std::move(user), std::move(token),
ControlPlaneStorageServiceActorId(),
requestCounters,
- probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER]));
+ probe, ExtractPermissions(ev, availablePermissions), Counters.Requests[RT_RESOLVE_FOLDER]));
}
void Handle(TEvControlPlaneProxy::TEvListConnectionsRequest::TPtr& ev) {
@@ -873,6 +938,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ListConnectionsRequest,
TEvControlPlaneStorage::TEvListConnectionsRequest,
TEvControlPlaneStorage::TEvListConnectionsResponse,
@@ -881,7 +951,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvDescribeConnectionRequest::TPtr& ev) {
@@ -912,6 +982,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::DescribeConnectionRequest,
TEvControlPlaneStorage::TEvDescribeConnectionRequest,
TEvControlPlaneStorage::TEvDescribeConnectionResponse,
@@ -920,7 +995,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvModifyConnectionRequest::TPtr& ev) {
@@ -956,6 +1031,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ | TPermissions::TPermission::MANAGE_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ModifyConnectionRequest,
TEvControlPlaneStorage::TEvModifyConnectionRequest,
TEvControlPlaneStorage::TEvModifyConnectionResponse,
@@ -964,7 +1044,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvDeleteConnectionRequest::TPtr& ev) {
@@ -995,6 +1075,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ | TPermissions::TPermission::MANAGE_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::DeleteConnectionRequest,
TEvControlPlaneStorage::TEvDeleteConnectionRequest,
TEvControlPlaneStorage::TEvDeleteConnectionResponse,
@@ -1003,7 +1088,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvTestConnectionRequest::TPtr& ev) {
@@ -1046,7 +1131,7 @@ private:
std::move(request), std::move(user), std::move(token),
TestConnectionActorId(),
requestCounters,
- probe, ExtractPermissions(ev)));
+ probe, ExtractPermissions(ev, {})));
}
void Handle(TEvControlPlaneProxy::TEvCreateBindingRequest::TPtr& ev) {
@@ -1076,6 +1161,10 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ };
+
Register(new TRequestActor<YandexQuery::CreateBindingRequest,
TEvControlPlaneStorage::TEvCreateBindingRequest,
TEvControlPlaneStorage::TEvCreateBindingResponse,
@@ -1084,7 +1173,7 @@ private:
std::move(request), std::move(user), std::move(token),
ControlPlaneStorageServiceActorId(),
requestCounters,
- probe, ExtractPermissions(ev), Counters.Requests[RT_RESOLVE_FOLDER]));
+ probe, ExtractPermissions(ev, availablePermissions), Counters.Requests[RT_RESOLVE_FOLDER]));
}
void Handle(TEvControlPlaneProxy::TEvListBindingsRequest::TPtr& ev) {
@@ -1114,6 +1203,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ListBindingsRequest,
TEvControlPlaneStorage::TEvListBindingsRequest,
TEvControlPlaneStorage::TEvListBindingsResponse,
@@ -1122,7 +1216,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvDescribeBindingRequest::TPtr& ev) {
@@ -1153,6 +1247,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::VIEW_PUBLIC
+ | TPermissions::TPermission::VIEW_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::DescribeBindingRequest,
TEvControlPlaneStorage::TEvDescribeBindingRequest,
TEvControlPlaneStorage::TEvDescribeBindingResponse,
@@ -1161,7 +1260,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvModifyBindingRequest::TPtr& ev) {
@@ -1192,6 +1291,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ | TPermissions::TPermission::MANAGE_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::ModifyBindingRequest,
TEvControlPlaneStorage::TEvModifyBindingRequest,
TEvControlPlaneStorage::TEvModifyBindingResponse,
@@ -1200,7 +1304,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(TEvControlPlaneProxy::TEvDeleteBindingRequest::TPtr& ev) {
@@ -1231,6 +1335,11 @@ private:
return;
}
+ static const TPermissions availablePermissions {
+ TPermissions::TPermission::MANAGE_PUBLIC
+ | TPermissions::TPermission::MANAGE_PRIVATE
+ };
+
Register(new TRequestActor<YandexQuery::DeleteBindingRequest,
TEvControlPlaneStorage::TEvDeleteBindingRequest,
TEvControlPlaneStorage::TEvDeleteBindingResponse,
@@ -1239,7 +1348,7 @@ private:
ControlPlaneStorageServiceActorId(),
requestCounters,
probe,
- ExtractPermissions(ev)));
+ ExtractPermissions(ev, availablePermissions)));
}
void Handle(NMon::TEvHttpInfo::TPtr& ev) {
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..2d5fcefeef 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
@@ -101,109 +101,109 @@ struct TTestBootstrap {
TestConnectionGrab->Runtime.reset();
}
- void SendCreateQueryRequest(const TVector<TString>& permissions = {})
+ void SendCreateQueryRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
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);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateQueryRequest>("", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendListQueriesRequest(const TVector<TString>& permissions = {})
+ void SendListQueriesRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::ListQueriesRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvListQueriesRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvListQueriesRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendDescribeQueryRequest(const TVector<TString>& permissions = {})
+ void SendDescribeQueryRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::DescribeQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeQueryRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeQueryRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendGetQueryStatusRequest(const TVector<TString>& permissions = {})
+ void SendGetQueryStatusRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::GetQueryStatusRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvGetQueryStatusRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvGetQueryStatusRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendModifyQueryRequest(const TVector<TString>& permissions = {})
+ void SendModifyQueryRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::ModifyQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyQueryRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyQueryRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendDeleteQueryRequest(const TVector<TString>& permissions = {})
+ void SendDeleteQueryRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::DeleteQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteQueryRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteQueryRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendControlQueryRequest(const TVector<TString>& permissions = {})
+ void SendControlQueryRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::ControlQueryRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvControlQueryRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvControlQueryRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendGetResultDataRequest(const TVector<TString>& permissions = {})
+ void SendGetResultDataRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::GetResultDataRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvGetResultDataRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvGetResultDataRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendListJobsRequest(const TVector<TString>& permissions = {})
+ void SendListJobsRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
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);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvListJobsRequest>("", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendDescribeJobRequest(const TVector<TString>& permissions = {})
+ void SendDescribeJobRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::DescribeJobRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeJobRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeJobRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendCreateConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {})
+ void SendCreateConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::CreateConnectionRequest proto;
@@ -216,32 +216,32 @@ struct TTestBootstrap {
->set_id(serviceAccountId);
}
- auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateConnectionRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendListConnectionsRequest(const TVector<TString>& permissions = {})
+ void SendListConnectionsRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::ListConnectionsRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvListConnectionsRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvListConnectionsRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendDescribeConnectionRequest(const TVector<TString>& permissions = {})
+ void SendDescribeConnectionRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::DescribeConnectionRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeConnectionRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendModifyConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {})
+ void SendModifyConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::ModifyConnectionRequest proto;
@@ -254,22 +254,22 @@ struct TTestBootstrap {
->set_id(serviceAccountId);
}
- auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyConnectionRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendDeleteConnectionRequest(const TVector<TString>& permissions = {})
+ void SendDeleteConnectionRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::DeleteConnectionRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteConnectionRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendTestConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {})
+ void SendTestConnectionRequest(const TVector<TString>& permissions = {}, const TString& serviceAccountId = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::TestConnectionRequest proto;
@@ -281,57 +281,57 @@ struct TTestBootstrap {
->set_id(serviceAccountId);
}
- auto request = std::make_unique<TEvControlPlaneProxy::TEvTestConnectionRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvTestConnectionRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendCreateBindingRequest(const TVector<TString>& permissions = {})
+ void SendCreateBindingRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::CreateBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateBindingRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvCreateBindingRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendListBindingsRequest(const TVector<TString>& permissions = {})
+ void SendListBindingsRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::ListBindingsRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvListBindingsRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvListBindingsRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendDescribeBindingRequest(const TVector<TString>& permissions = {})
+ void SendDescribeBindingRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::DescribeBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeBindingRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDescribeBindingRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendModifyBindingRequest(const TVector<TString>& permissions = {})
+ void SendModifyBindingRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::ModifyBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyBindingRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvModifyBindingRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
- void SendDeleteBindingRequest(const TVector<TString>& permissions = {})
+ void SendDeleteBindingRequest(const TVector<TString>& permissions = {}, const TString& user = "test_user@staff")
{
TActorId sender = Runtime->AllocateEdgeActor();
YandexQuery::DeleteBindingRequest proto;
- auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteBindingRequest>("my_folder", proto, "test_user@staff", "", permissions);
+ auto request = std::make_unique<TEvControlPlaneProxy::TEvDeleteBindingRequest>("my_folder", proto, user, "", permissions);
Runtime->Send(new IEventHandle(ControlPlaneProxyActorId(), sender, request.release()));
Runtime->DispatchEvents({}, TDuration::Zero());
}
@@ -383,6 +383,51 @@ private:
}
};
+TVector<TString> AllPermissions() {
+ return {
+ "yq.queries.create@as",
+ "yq.queries.invoke@as",
+ "yq.connections.use@as",
+ "yq.bindings.use@as",
+ "yq.queries.get@as",
+ "yq.queries.viewAst@as",
+ "yq.queries.getStatus@as",
+ "yq.queries.update@as",
+ "yq.queries.invoke@as",
+ "yq.connections.use@as",
+ "yq.bindings.use@as",
+ "yq.queries.delete@as",
+ "yq.queries.control@as",
+ "yq.queries.getData@as",
+ "yq.jobs.get@as",
+ "yq.connections.create@as",
+ "yq.connections.get@as",
+ "yq.connections.update@as",
+ "yq.connections.delete@as",
+ "yq.bindings.create@as",
+ "yq.bindings.get@as",
+ "yq.bindings.update@as",
+ "yq.bindings.delete@as",
+ "yq.resources.viewPublic@as",
+ "yq.resources.viewPrivate@as",
+ "yq.resources.managePublic@as",
+ "yq.resources.managePrivate@as",
+ "iam.serviceAccounts.use@as"
+ };
+}
+
+TVector<TString> AllPermissionsExcept(const TVector<TString>& exceptItems) {
+ auto permissions = AllPermissions();
+ for (const auto& item: exceptItems) {
+ auto it = std::remove_if(
+ permissions.begin(),
+ permissions.end(),
+ [item](const TString& permission) { return permission == item; });
+ permissions.erase(it, permissions.end());
+ }
+ return permissions;
+}
+
} // namespace
//////////////////////////////////////////////////////
@@ -1699,8 +1744,7 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsControlPlaneStorageSuccess)
config.SetEnablePermissions(true);
TTestBootstrap bootstrap(config);
bootstrap.SendTestConnectionRequest({
- "yq.connections.create@as",
- "yq.resources.managePublic@as"
+ "yq.connections.create@as"
});
auto request = bootstrap.TestConnectionGrab->GetRequest();
@@ -1710,7 +1754,7 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsControlPlaneStorageSuccess)
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_PUBLIC));
UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE));
UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE));
UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE));
@@ -1724,8 +1768,7 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsControlPlaneStorageSuccess)
TTestBootstrap bootstrap(config);
bootstrap.SendTestConnectionRequest({
"yq.connections.create@as",
- "iam.serviceAccounts.use@as",
- "yq.resources.managePublic@as"
+ "iam.serviceAccounts.use@as"
}, "my_sa_id");
auto request = bootstrap.TestConnectionGrab->GetRequest();
@@ -1735,7 +1778,7 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsControlPlaneStorageSuccess)
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_PUBLIC));
UNIT_ASSERT(!permissions.Check(TPermissions::MANAGE_PRIVATE));
UNIT_ASSERT(!permissions.Check(TPermissions::CONNECTIONS_USE));
UNIT_ASSERT(!permissions.Check(TPermissions::BINDINGS_USE));
@@ -1862,4 +1905,2133 @@ Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckPermissionsControlPlaneStorageSuccess)
}
};
+Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckNegativePermissionsFailed) {
+ Y_UNIT_TEST(ShouldSendCreateQuery)
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ auto permissions = AllPermissionsExcept({"yq.queries.create@as"});
+ bootstrap.SendCreateQueryRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.queries.get@as"});
+ bootstrap.SendListQueriesRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.queries.get@as"});
+ bootstrap.SendDescribeQueryRequest(permissions);
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ Y_UNIT_TEST(ShouldSendGetQueryStatus)
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ auto permissions = AllPermissionsExcept({"yq.queries.getStatus@as"});
+ bootstrap.SendGetQueryStatusRequest(permissions);
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvGetQueryStatusResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ Y_UNIT_TEST(ShouldSendModifyQuery)
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ auto permissions = AllPermissionsExcept({"yq.queries.update@as"});
+ bootstrap.SendModifyQueryRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.queries.delete@as"});
+ bootstrap.SendDeleteQueryRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.queries.control@as"});
+ bootstrap.SendControlQueryRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.queries.getData@as"});
+ bootstrap.SendGetResultDataRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.jobs.get@as"});
+ bootstrap.SendListJobsRequest(permissions);
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListJobsResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ Y_UNIT_TEST(ShouldSendDescribeJob)
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ auto permissions = AllPermissionsExcept({"yq.jobs.get@as"});
+ bootstrap.SendDescribeJobRequest(permissions);
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeJobResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ Y_UNIT_TEST(ShouldSendCreateConnection)
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ auto permissions = AllPermissionsExcept({"yq.connections.create@as"});
+ bootstrap.SendCreateConnectionRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"iam.serviceAccounts.use@as"});
+ bootstrap.SendCreateConnectionRequest(permissions, "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);
+ auto permissions = AllPermissionsExcept({"yq.connections.get@as"});
+ bootstrap.SendListConnectionsRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.connections.get@as"});
+ bootstrap.SendDescribeConnectionRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.connections.update@as"});
+ bootstrap.SendModifyConnectionRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"iam.serviceAccounts.use@as"});
+ bootstrap.SendModifyConnectionRequest(permissions, "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);
+ auto permissions = AllPermissionsExcept({"yq.connections.delete@as"});
+ bootstrap.SendDeleteConnectionRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.connections.create@as"});
+ bootstrap.SendTestConnectionRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"iam.serviceAccounts.use@as"});
+ bootstrap.SendTestConnectionRequest(permissions, "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);
+ auto permissions = AllPermissionsExcept({"yq.bindings.create@as"});
+ bootstrap.SendCreateBindingRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.bindings.get@as"});
+ bootstrap.SendListBindingsRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.bindings.get@as"});
+ bootstrap.SendDescribeBindingRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.bindings.update@as"});
+ bootstrap.SendModifyBindingRequest(permissions);
+ 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);
+ auto permissions = AllPermissionsExcept({"yq.bindings.delete@as"});
+ bootstrap.SendDeleteBindingRequest();
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+};
+
+Y_UNIT_TEST_SUITE(TControlPlaneProxyCheckNegativePermissionsSuccess) {
+ Y_UNIT_TEST(ShouldSendCreateQuery)
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateQueryRequest(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetQueryStatusRequest(AllPermissions());
+ auto request = bootstrap.MetaStorageGrab->GetRequest();
+ auto event = request->Get<TEvControlPlaneStorage::TEvGetQueryStatusRequest>();
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions(), "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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions(), "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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions(), "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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(AllPermissions());
+ 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(TControlPlaneProxyShouldPassHids) {
+ Y_UNIT_TEST(ShouldCheckScenraio) {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+
+ const TVector<TString> testUser1Permissions {
+ "yq.resources.viewPrivate@as",
+ "yq.resources.managePrivate@as",
+
+ // yq.connections.*
+ "yq.connections.create@as",
+ "yq.connections.update@as",
+ "yq.connections.delete@as",
+
+ // yq.bindings.*
+ "yq.bindings.create@as",
+ "yq.bindings.update@as",
+ "yq.bindings.delete@as",
+
+ // yq.queries.*
+ "yq.queries.create@as",
+ "yq.queries.update@as",
+ "yq.queries.delete@as",
+ "yq.queries.control@as",
+
+ // yq.jobs.*
+
+ "yq.resources.managePublic@as",
+ "yq.connections.use@as",
+ "yq.bindings.use@as",
+ "yq.queries.invoke@as",
+ "yq.queries.getData@as",
+ "yq.queries.getStatus@as",
+ "yq.connections.get@as",
+ "yq.bindings.get@as",
+ "yq.queries.get@as",
+ "yq.jobs.get@as",
+ "yq.resources.viewPublic@as",
+ };
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateQueryRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListQueriesRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeQueryRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetQueryStatusRequest(testUser1Permissions, "test_user_1@staff");
+ auto request = bootstrap.MetaStorageGrab->GetRequest();
+ auto event = request->Get<TEvControlPlaneStorage::TEvGetQueryStatusRequest>();
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyQueryRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteQueryRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendControlQueryRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetResultDataRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListJobsRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeJobRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateConnectionRequest(testUser1Permissions, {}, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListConnectionsRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeConnectionRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyConnectionRequest(testUser1Permissions, {}, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteConnectionRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendTestConnectionRequest(testUser1Permissions, {}, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateBindingRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListBindingsRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeBindingRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyBindingRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteBindingRequest(testUser1Permissions, "test_user_1@staff");
+ 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));
+ }
+
+ const TVector<TString> testUser2Permissions {
+ // yq.connections.*
+ "yq.connections.create@as",
+ "yq.connections.update@as",
+ "yq.connections.delete@as",
+
+ // yq.bindings.*
+ "yq.bindings.create@as",
+ "yq.bindings.update@as",
+ "yq.bindings.delete@as",
+
+ // yq.queries.*
+ "yq.queries.create@as",
+ "yq.queries.update@as",
+ "yq.queries.delete@as",
+ "yq.queries.control@as",
+
+ // yq.jobs.*
+
+ "yq.resources.managePublic@as",
+ "yq.connections.use@as",
+ "yq.bindings.use@as",
+ "yq.queries.invoke@as",
+ "yq.queries.getData@as",
+ "yq.queries.getStatus@as",
+ "yq.connections.get@as",
+ "yq.bindings.get@as",
+ "yq.queries.get@as",
+ "yq.jobs.get@as",
+ "yq.resources.viewPublic@as",
+ };
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateQueryRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListQueriesRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeQueryRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetQueryStatusRequest(testUser2Permissions, "test_user_2@staff");
+ auto request = bootstrap.MetaStorageGrab->GetRequest();
+ auto event = request->Get<TEvControlPlaneStorage::TEvGetQueryStatusRequest>();
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyQueryRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteQueryRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendControlQueryRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetResultDataRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListJobsRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeJobRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateConnectionRequest(testUser2Permissions, {}, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListConnectionsRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeConnectionRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyConnectionRequest(testUser2Permissions, {}, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteConnectionRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendTestConnectionRequest(testUser2Permissions, {}, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateBindingRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListBindingsRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeBindingRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyBindingRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteBindingRequest(testUser2Permissions, "test_user_2@staff");
+ 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));
+ }
+
+ const TVector<TString> testUser3Permissions {
+ "yq.connections.get@as",
+ "yq.bindings.get@as",
+ "yq.queries.get@as",
+ "yq.jobs.get@as",
+ "yq.resources.viewPublic@as",
+ };
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateQueryRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListQueriesRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeQueryRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetQueryStatusRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvGetQueryStatusResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyQueryRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteQueryRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendControlQueryRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvControlQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetResultDataRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvGetResultDataResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListJobsRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeJobRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateConnectionRequest(testUser3Permissions, {}, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListConnectionsRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeConnectionRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyConnectionRequest(testUser3Permissions, {}, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteConnectionRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendTestConnectionRequest(testUser3Permissions, {}, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvTestConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateBindingRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListBindingsRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeBindingRequest(testUser3Permissions, "test_user_3@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyBindingRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteBindingRequest(testUser3Permissions, "test_user_3@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ const TVector<TString> testUser4Permissions {
+ "yq.connections.use@as",
+ "yq.bindings.use@as",
+ "yq.queries.invoke@as",
+ "yq.queries.create@as",
+ "yq.queries.getData@as",
+ "yq.queries.getStatus@as",
+ "yq.resources.viewPublic@as",
+ };
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateQueryRequest(testUser4Permissions, "test_user_4@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListQueriesRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListQueriesResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeQueryRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetQueryStatusRequest(testUser4Permissions, "test_user_4@staff");
+ auto request = bootstrap.MetaStorageGrab->GetRequest();
+ auto event = request->Get<TEvControlPlaneStorage::TEvGetQueryStatusRequest>();
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyQueryRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteQueryRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendControlQueryRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvControlQueryResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendGetResultDataRequest(testUser4Permissions, "test_user_4@staff");
+ 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));
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListJobsRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListJobsResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeJobRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeJobResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateConnectionRequest(testUser4Permissions, {}, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListConnectionsRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListConnectionsResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeConnectionRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyConnectionRequest(testUser4Permissions, {}, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteConnectionRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendTestConnectionRequest(testUser4Permissions, {}, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvTestConnectionResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendCreateBindingRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvCreateBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendListBindingsRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvListBindingsResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDescribeBindingRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDescribeBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendModifyBindingRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvModifyBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+
+ {
+ NConfig::TControlPlaneProxyConfig config;
+ config.SetEnablePermissions(true);
+ TTestBootstrap bootstrap(config);
+ bootstrap.SendDeleteBindingRequest(testUser4Permissions, "test_user_4@staff");
+ const auto [_, response] = bootstrap.Grab<TEvControlPlaneProxy::TEvDeleteBindingResponse>();
+ UNIT_ASSERT_STRING_CONTAINS(response->Issues.ToString(), "Error: No permission");
+ }
+ }
+};
+
+
+
} // namespace NYq