aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormolotkov-and <molotkov-and@ydb.tech>2023-05-22 10:38:43 +0300
committermolotkov-and <molotkov-and@ydb.tech>2023-05-22 10:38:43 +0300
commit827280d9061e237d8812532534b97430cd1e0f04 (patch)
treec6f47a965d36ccb9268c3c5b090f60fb4df25391
parent54fd8a719ef2265cb25cd66535cea600f5ebf24c (diff)
downloadydb-827280d9061e237d8812532534b97430cd1e0f04.tar.gz
Move grpc call RegistrationNode to public api. Move to Discovery service. Revert with fixes
-rw-r--r--ydb/core/client/server/CMakeLists.darwin-x86_64.txt2
-rw-r--r--ydb/core/client/server/CMakeLists.linux-aarch64.txt2
-rw-r--r--ydb/core/client/server/CMakeLists.linux-x86_64.txt2
-rw-r--r--ydb/core/client/server/CMakeLists.windows-x86_64.txt2
-rw-r--r--ydb/core/client/server/grpc_server.h2
-rw-r--r--ydb/core/client/server/msgbus_server.h2
-rw-r--r--ydb/core/client/server/msgbus_server_node_registration.cpp8
-rw-r--r--ydb/core/driver_lib/cli_utils/CMakeLists.darwin-x86_64.txt2
-rw-r--r--ydb/core/driver_lib/cli_utils/CMakeLists.linux-aarch64.txt2
-rw-r--r--ydb/core/driver_lib/cli_utils/CMakeLists.linux-x86_64.txt2
-rw-r--r--ydb/core/driver_lib/cli_utils/CMakeLists.windows-x86_64.txt2
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp265
-rw-r--r--ydb/core/driver_lib/run/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/core/driver_lib/run/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/core/driver_lib/run/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/core/driver_lib/run/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/core/driver_lib/run/cert_auth_props.h2
-rw-r--r--ydb/core/driver_lib/run/run.cpp14
-rw-r--r--ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt3
-rw-r--r--ydb/core/grpc_services/CMakeLists.linux-aarch64.txt3
-rw-r--r--ydb/core/grpc_services/CMakeLists.linux-x86_64.txt3
-rw-r--r--ydb/core/grpc_services/CMakeLists.windows-x86_64.txt3
-rw-r--r--ydb/core/grpc_services/auth_processor/CMakeLists.darwin-x86_64.txt19
-rw-r--r--ydb/core/grpc_services/auth_processor/CMakeLists.linux-aarch64.txt20
-rw-r--r--ydb/core/grpc_services/auth_processor/CMakeLists.linux-x86_64.txt20
-rw-r--r--ydb/core/grpc_services/auth_processor/CMakeLists.txt17
-rw-r--r--ydb/core/grpc_services/auth_processor/CMakeLists.windows-x86_64.txt19
-rw-r--r--ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.cpp (renamed from ydb/core/client/server/dynamic_node_auth_processor.cpp)0
-rw-r--r--ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h (renamed from ydb/core/client/server/dynamic_node_auth_processor.h)0
-rw-r--r--ydb/core/grpc_services/rpc_node_registration.cpp303
-rw-r--r--ydb/core/grpc_services/service_discovery.h4
-rw-r--r--ydb/core/testlib/test_client.cpp6
-rw-r--r--ydb/public/api/grpc/ydb_discovery_v1.proto1
-rw-r--r--ydb/public/api/protos/ydb_discovery.proto50
-rw-r--r--ydb/public/sdk/cpp/client/ydb_discovery/discovery.cpp139
-rw-r--r--ydb/public/sdk/cpp/client/ydb_discovery/discovery.h68
-rw-r--r--ydb/services/discovery/grpc_service.cpp12
-rw-r--r--ydb/services/discovery/grpc_service.h9
-rw-r--r--ydb/services/local_discovery/grpc_service.cpp12
-rw-r--r--ydb/services/local_discovery/grpc_service.h6
-rw-r--r--ydb/services/ydb/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/services/ydb/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/services/ydb/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/services/ydb/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/services/ydb/ydb_client_certs_ut.cpp268
45 files changed, 1139 insertions, 163 deletions
diff --git a/ydb/core/client/server/CMakeLists.darwin-x86_64.txt b/ydb/core/client/server/CMakeLists.darwin-x86_64.txt
index 7a21a804543..b620712f4dd 100644
--- a/ydb/core/client/server/CMakeLists.darwin-x86_64.txt
+++ b/ydb/core/client/server/CMakeLists.darwin-x86_64.txt
@@ -31,6 +31,7 @@ target_link_libraries(core-client-server PUBLIC
ydb-core-engine
core-engine-minikql
ydb-core-grpc_services
+ core-grpc_services-auth_processor
core-grpc_services-base
ydb-core-keyvalue
core-kqp-common
@@ -53,7 +54,6 @@ target_link_libraries(core-client-server PUBLIC
cpp-deprecated-atomic
)
target_sources(core-client-server PRIVATE
- ${CMAKE_SOURCE_DIR}/ydb/core/client/server/dynamic_node_auth_processor.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/http_ping.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_blobstorage_config.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_bsadm.cpp
diff --git a/ydb/core/client/server/CMakeLists.linux-aarch64.txt b/ydb/core/client/server/CMakeLists.linux-aarch64.txt
index 19c69222682..36a40015b50 100644
--- a/ydb/core/client/server/CMakeLists.linux-aarch64.txt
+++ b/ydb/core/client/server/CMakeLists.linux-aarch64.txt
@@ -32,6 +32,7 @@ target_link_libraries(core-client-server PUBLIC
ydb-core-engine
core-engine-minikql
ydb-core-grpc_services
+ core-grpc_services-auth_processor
core-grpc_services-base
ydb-core-keyvalue
core-kqp-common
@@ -54,7 +55,6 @@ target_link_libraries(core-client-server PUBLIC
cpp-deprecated-atomic
)
target_sources(core-client-server PRIVATE
- ${CMAKE_SOURCE_DIR}/ydb/core/client/server/dynamic_node_auth_processor.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/http_ping.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_blobstorage_config.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_bsadm.cpp
diff --git a/ydb/core/client/server/CMakeLists.linux-x86_64.txt b/ydb/core/client/server/CMakeLists.linux-x86_64.txt
index 19c69222682..36a40015b50 100644
--- a/ydb/core/client/server/CMakeLists.linux-x86_64.txt
+++ b/ydb/core/client/server/CMakeLists.linux-x86_64.txt
@@ -32,6 +32,7 @@ target_link_libraries(core-client-server PUBLIC
ydb-core-engine
core-engine-minikql
ydb-core-grpc_services
+ core-grpc_services-auth_processor
core-grpc_services-base
ydb-core-keyvalue
core-kqp-common
@@ -54,7 +55,6 @@ target_link_libraries(core-client-server PUBLIC
cpp-deprecated-atomic
)
target_sources(core-client-server PRIVATE
- ${CMAKE_SOURCE_DIR}/ydb/core/client/server/dynamic_node_auth_processor.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/http_ping.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_blobstorage_config.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_bsadm.cpp
diff --git a/ydb/core/client/server/CMakeLists.windows-x86_64.txt b/ydb/core/client/server/CMakeLists.windows-x86_64.txt
index 7a21a804543..b620712f4dd 100644
--- a/ydb/core/client/server/CMakeLists.windows-x86_64.txt
+++ b/ydb/core/client/server/CMakeLists.windows-x86_64.txt
@@ -31,6 +31,7 @@ target_link_libraries(core-client-server PUBLIC
ydb-core-engine
core-engine-minikql
ydb-core-grpc_services
+ core-grpc_services-auth_processor
core-grpc_services-base
ydb-core-keyvalue
core-kqp-common
@@ -53,7 +54,6 @@ target_link_libraries(core-client-server PUBLIC
cpp-deprecated-atomic
)
target_sources(core-client-server PRIVATE
- ${CMAKE_SOURCE_DIR}/ydb/core/client/server/dynamic_node_auth_processor.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/http_ping.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_blobstorage_config.cpp
${CMAKE_SOURCE_DIR}/ydb/core/client/server/msgbus_bsadm.cpp
diff --git a/ydb/core/client/server/grpc_server.h b/ydb/core/client/server/grpc_server.h
index 7f1a4b9ea71..267de686f5a 100644
--- a/ydb/core/client/server/grpc_server.h
+++ b/ydb/core/client/server/grpc_server.h
@@ -1,5 +1,5 @@
#pragma once
-#include "dynamic_node_auth_processor.h"
+#include <ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h>
#include <ydb/core/protos/grpc.grpc.pb.h>
diff --git a/ydb/core/client/server/msgbus_server.h b/ydb/core/client/server/msgbus_server.h
index 0e6da0ecbb3..df4ad2da596 100644
--- a/ydb/core/client/server/msgbus_server.h
+++ b/ydb/core/client/server/msgbus_server.h
@@ -1,5 +1,5 @@
#pragma once
-#include "dynamic_node_auth_processor.h"
+#include <ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h>
#include <library/cpp/actors/core/actorsystem.h>
#include <library/cpp/actors/core/actor_bootstrapped.h>
#include <ydb/public/lib/base/defs.h>
diff --git a/ydb/core/client/server/msgbus_server_node_registration.cpp b/ydb/core/client/server/msgbus_server_node_registration.cpp
index e19f2c0524f..ac87b12bd59 100644
--- a/ydb/core/client/server/msgbus_server_node_registration.cpp
+++ b/ydb/core/client/server/msgbus_server_node_registration.cpp
@@ -23,7 +23,7 @@ class TNodeRegistrationActor : public TActorBootstrapped<TNodeRegistrationActor>
struct TNodeAuthorizationResult {
bool IsAuthorized = false;
- bool IsCertififateUsed = false;
+ bool IsCertificateUsed = false;
operator bool() const {
return IsAuthorized;
@@ -88,7 +88,7 @@ public:
if (Request.HasPath()) {
request->Record.SetPath(Request.GetPath());
}
- request->Record.SetAuthorizedByCertificate(nodeAuthorizationResult.IsCertififateUsed);
+ request->Record.SetAuthorizedByCertificate(nodeAuthorizationResult.IsCertificateUsed);
NTabletPipe::SendData(ctx, NodeBrokerPipe, request.Release());
@@ -185,7 +185,7 @@ public:
private:
TNodeAuthorizationResult IsNodeAuthorized() {
- TNodeAuthorizationResult result {.IsAuthorized = false, .IsCertififateUsed = false};
+ TNodeAuthorizationResult result {.IsAuthorized = false, .IsCertificateUsed = false};
auto* appdata = AppData();
if (appdata && appdata->FeatureFlags.GetEnableDynamicNodeAuthorization() && DynamicNodeAuthorizationParams) {
const auto& nodeAuthValues = FindClientCert();
@@ -212,7 +212,7 @@ private:
Response.MutableStatus()->SetReason("Cannot authorize node with host: " + host);
return result;
}
- result.IsCertififateUsed = true;
+ result.IsCertificateUsed = true;
}
result.IsAuthorized = true;
return result;;
diff --git a/ydb/core/driver_lib/cli_utils/CMakeLists.darwin-x86_64.txt b/ydb/core/driver_lib/cli_utils/CMakeLists.darwin-x86_64.txt
index 2e8256f0ccd..9283d5e78f1 100644
--- a/ydb/core/driver_lib/cli_utils/CMakeLists.darwin-x86_64.txt
+++ b/ydb/core/driver_lib/cli_utils/CMakeLists.darwin-x86_64.txt
@@ -37,6 +37,8 @@ target_link_libraries(cli_utils PUBLIC
api-grpc-draft
lib-deprecated-client
common
+ cpp-client-ydb_discovery
+ cpp-client-ydb_driver
)
target_sources(cli_utils PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/driver_lib/cli_utils/cli.cpp
diff --git a/ydb/core/driver_lib/cli_utils/CMakeLists.linux-aarch64.txt b/ydb/core/driver_lib/cli_utils/CMakeLists.linux-aarch64.txt
index e54a367187b..21aefec97bb 100644
--- a/ydb/core/driver_lib/cli_utils/CMakeLists.linux-aarch64.txt
+++ b/ydb/core/driver_lib/cli_utils/CMakeLists.linux-aarch64.txt
@@ -38,6 +38,8 @@ target_link_libraries(cli_utils PUBLIC
api-grpc-draft
lib-deprecated-client
common
+ cpp-client-ydb_discovery
+ cpp-client-ydb_driver
)
target_sources(cli_utils PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/driver_lib/cli_utils/cli.cpp
diff --git a/ydb/core/driver_lib/cli_utils/CMakeLists.linux-x86_64.txt b/ydb/core/driver_lib/cli_utils/CMakeLists.linux-x86_64.txt
index e54a367187b..21aefec97bb 100644
--- a/ydb/core/driver_lib/cli_utils/CMakeLists.linux-x86_64.txt
+++ b/ydb/core/driver_lib/cli_utils/CMakeLists.linux-x86_64.txt
@@ -38,6 +38,8 @@ target_link_libraries(cli_utils PUBLIC
api-grpc-draft
lib-deprecated-client
common
+ cpp-client-ydb_discovery
+ cpp-client-ydb_driver
)
target_sources(cli_utils PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/driver_lib/cli_utils/cli.cpp
diff --git a/ydb/core/driver_lib/cli_utils/CMakeLists.windows-x86_64.txt b/ydb/core/driver_lib/cli_utils/CMakeLists.windows-x86_64.txt
index 2e8256f0ccd..9283d5e78f1 100644
--- a/ydb/core/driver_lib/cli_utils/CMakeLists.windows-x86_64.txt
+++ b/ydb/core/driver_lib/cli_utils/CMakeLists.windows-x86_64.txt
@@ -37,6 +37,8 @@ target_link_libraries(cli_utils PUBLIC
api-grpc-draft
lib-deprecated-client
common
+ cpp-client-ydb_discovery
+ cpp-client-ydb_driver
)
target_sources(cli_utils PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/driver_lib/cli_utils/cli.cpp
diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp
index b7be0a6ff28..1153b5c6c1b 100644
--- a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp
+++ b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp
@@ -14,6 +14,9 @@
#include <util/system/hostname.h>
#include <google/protobuf/text_format.h>
+#include <ydb/public/sdk/cpp/client/ydb_discovery/discovery.h>
+#include <ydb/public/sdk/cpp/client/ydb_driver/driver.h>
+
extern TAutoPtr<NKikimrConfig::TActorSystemConfig> DummyActorSystemConfig();
extern TAutoPtr<NKikimrConfig::TAllocatorConfig> DummyAllocatorConfig();
@@ -924,16 +927,25 @@ protected:
}
}
- THolder<NClient::TRegistrationResult> TryToRegisterDynamicNode(
- const TString &addr,
- const TString &domainName,
- const TString &nodeHost,
- const TString &nodeAddress,
- const TString &nodeResolveHost,
- const TMaybe<TString>& path) {
- NClient::TKikimr kikimr(GetKikimr(addr));
- auto registrant = kikimr.GetNodeRegistrant();
+ void MaybeRegisterAndLoadConfigs()
+ {
+ // static node
+ if (NodeBrokerAddresses.empty() && !NodeBrokerPort) {
+ if (!NodeId) {
+ ythrow yexception() << "Either --node [NUM|'static'] or --node-broker[-port] should be specified";
+ }
+ if (!HierarchicalCfg && RunConfig.PathToConfigCacheFile)
+ LoadCachedConfigsForStaticNode();
+ return;
+ }
+
+ RegisterDynamicNode();
+ if (!HierarchicalCfg && !IgnoreCmsConfigs)
+ LoadConfigForDynamicNode();
+ }
+
+ TNodeLocation CreateNodeLocation() {
NActorsInterconnect::TNodeLocation location;
location.SetDataCenter(DataCenter);
location.SetRack(Rack);
@@ -946,8 +958,75 @@ protected:
legacy.SetRackNum(RackFromString(Rack));
legacy.SetBodyNum(Body);
loc.InheritLegacyValue(TNodeLocation(legacy));
+ return loc;
+ }
- Cout << "Trying to register at " << addr << Endl;
+ NYdb::NDiscovery::TNodeRegistrationSettings GetNodeRegistrationSettings(const TString &domainName,
+ const TString &nodeHost,
+ const TString &nodeAddress,
+ const TString &nodeResolveHost,
+ const TMaybe<TString>& path) {
+ NYdb::NDiscovery::TNodeRegistrationSettings settings;
+ settings.Host(nodeHost);
+ settings.Port(InterconnectPort);
+ settings.ResolveHost(nodeResolveHost);
+ settings.Address(nodeAddress);
+ settings.DomainPath(domainName);
+ settings.FixedNodeId(FixedNodeID);
+ if (path) {
+ settings.Path(*path);
+ }
+
+ auto loc = CreateNodeLocation();
+ NActorsInterconnect::TNodeLocation tmpLocation;
+ loc.Serialize(&tmpLocation, false);
+
+ NYdb::NDiscovery::TNodeLocation settingLocation;
+ CopyNodeLocation(&settingLocation, tmpLocation);
+ settings.Location(settingLocation);
+ return settings;
+ }
+
+ NYdb::NDiscovery::TNodeRegistrationResult TryToRegisterDynamicNodeViaDiscoveryService(
+ const TString &addr,
+ const TString &domainName,
+ const TString &nodeHost,
+ const TString &nodeAddress,
+ const TString &nodeResolveHost,
+ const TMaybe<TString>& path) {
+ TCommandConfig::TServerEndpoint endpoint = TCommandConfig::ParseServerAddress(addr);
+ NYdb::TDriverConfig config;
+ if (endpoint.EnableSsl.Defined()) {
+ if (PathToGrpcCaFile) {
+ config.UseSecureConnection(ReadFromFile(PathToGrpcCaFile, "CA certificates").c_str());
+ }
+ if (PathToGrpcCertFile && PathToGrpcPrivateKeyFile) {
+ auto certificate = ReadFromFile(PathToGrpcCertFile, "Client certificates");
+ auto privateKey = ReadFromFile(PathToGrpcPrivateKeyFile, "Client certificates key");
+ config.UseClientCertificate(certificate.c_str(), privateKey.c_str());
+ }
+ }
+ config.SetAuthToken(BUILTIN_ACL_ROOT);
+ config.SetEndpoint(endpoint.Address);
+ auto connection = NYdb::TDriver(config);
+
+ auto client = NYdb::NDiscovery::TDiscoveryClient(connection);
+ NYdb::NDiscovery::TNodeRegistrationResult result = client.NodeRegistration(GetNodeRegistrationSettings(domainName, nodeHost, nodeAddress, nodeResolveHost, path)).GetValueSync();
+ connection.Stop(true);
+ return result;
+ }
+
+ THolder<NClient::TRegistrationResult> TryToRegisterDynamicNodeViaLegacyService(
+ const TString &addr,
+ const TString &domainName,
+ const TString &nodeHost,
+ const TString &nodeAddress,
+ const TString &nodeResolveHost,
+ const TMaybe<TString>& path) {
+ NClient::TKikimr kikimr(GetKikimr(addr));
+ auto registrant = kikimr.GetNodeRegistrant();
+
+ auto loc = CreateNodeLocation();
return MakeHolder<NClient::TRegistrationResult>
(registrant.SyncRegisterNode(ToString(domainName),
@@ -991,31 +1070,131 @@ protected:
return {};
}
- void RegisterDynamicNode() {
- TVector<TString> addrs;
- auto &dnConfig = *RunConfig.AppConfig.MutableDynamicNodeConfig();
+ NYdb::NDiscovery::TNodeRegistrationResult RegisterDynamicNodeViaDiscoveryService(const TVector<TString>& addrs, const TString& domainName) {
+ NYdb::NDiscovery::TNodeRegistrationResult result;
+ const size_t maxNumberRecivedCallUnimplemented = 5;
+ size_t currentNumberRecivedCallUnimplemented = 0;
+ while (!result.IsSuccess() && currentNumberRecivedCallUnimplemented < maxNumberRecivedCallUnimplemented) {
+ for (const auto& addr : addrs) {
+ result = TryToRegisterDynamicNodeViaDiscoveryService(addr, domainName, NodeHost, NodeAddress, NodeResolveHost, GetSchemePath());
+ if (result.IsSuccess()) {
+ Cout << "Success. Registered via discovery service as " << result.GetNodeId() << Endl;
+ break;
+ }
+ Cerr << "Registration error: " << static_cast<NYdb::TStatus>(result) << Endl;
+ }
+ if (!result.IsSuccess()) {
+ Sleep(TDuration::Seconds(1));
+ if (result.GetStatus() == NYdb::EStatus::CLIENT_CALL_UNIMPLEMENTED) {
+ currentNumberRecivedCallUnimplemented++;
+ }
+ }
+ }
+ return result;
+ }
- FillClusterEndpoints(addrs);
+ void ProcessRegistrationDynamicNodeResult(const NYdb::NDiscovery::TNodeRegistrationResult& result) {
+ RunConfig.NodeId = result.GetNodeId();
+ NActors::TScopeId scopeId;
+ if (result.HasScopeTabletId() && result.HasScopePathId()) {
+ scopeId.first = result.GetScopeTabletId();
+ scopeId.second = result.GetScopePathId();
+ }
+ RunConfig.ScopeId = TKikimrScopeId(scopeId);
- if (!InterconnectPort)
- ythrow yexception() << "Either --node or --ic-port should be specified";
+ auto &nsConfig = *RunConfig.AppConfig.MutableNameserviceConfig();
+ nsConfig.ClearNode();
- if (addrs.empty()) {
- ythrow yexception() << "List of Node Broker end-points is empty";
+ auto &dnConfig = *RunConfig.AppConfig.MutableDynamicNodeConfig();
+ for (auto &node : result.GetNodes()) {
+ if (node.NodeId == result.GetNodeId()) {
+ auto nodeInfo = dnConfig.MutableNodeInfo();
+ nodeInfo->SetNodeId(node.NodeId);
+ nodeInfo->SetHost(node.Host);
+ nodeInfo->SetPort(node.Port);
+ nodeInfo->SetResolveHost(node.ResolveHost);
+ nodeInfo->SetAddress(node.Address);
+ nodeInfo->SetExpire(node.Expire);
+ CopyNodeLocation(nodeInfo->MutableLocation(), node.Location);
+ } else {
+ auto &info = *nsConfig.AddNode();
+ info.SetNodeId(node.NodeId);
+ info.SetAddress(node.Address);
+ info.SetPort(node.Port);
+ info.SetHost(node.Host);
+ info.SetInterconnectHost(node.ResolveHost);
+ CopyNodeLocation(info.MutableLocation(), node.Location);
+ }
}
+ }
- TString domainName = DeduceNodeDomain();
- if (!NodeHost)
- NodeHost = FQDNHostName();
- if (!NodeResolveHost)
- NodeResolveHost = NodeHost;
+ static void CopyNodeLocation(NActorsInterconnect::TNodeLocation* dst, const NYdb::NDiscovery::TNodeLocation& src) {
+ if (src.DataCenterNum) {
+ dst->SetDataCenterNum(src.DataCenterNum.value());
+ }
+ if (src.RoomNum) {
+ dst->SetRoomNum(src.RoomNum.value());
+ }
+ if (src.RackNum) {
+ dst->SetRackNum(src.RackNum.value());
+ }
+ if (src.BodyNum) {
+ dst->SetBodyNum(src.BodyNum.value());
+ }
+ if (src.Body) {
+ dst->SetBody(src.Body.value());
+ }
+ if (src.DataCenter) {
+ dst->SetDataCenter(src.DataCenter.value());
+ }
+ if (src.Module) {
+ dst->SetModule(src.Module.value());
+ }
+ if (src.Rack) {
+ dst->SetRack(src.Rack.value());
+ }
+ if (src.Unit) {
+ dst->SetUnit(src.Unit.value());
+ }
+ }
+ static void CopyNodeLocation(NYdb::NDiscovery::TNodeLocation* dst, const NActorsInterconnect::TNodeLocation& src) {
+ if (src.HasDataCenterNum()) {
+ dst->DataCenterNum = src.GetDataCenterNum();
+ }
+ if (src.HasRoomNum()) {
+ dst->RoomNum = src.GetRoomNum();
+ }
+ if (src.HasRackNum()) {
+ dst->RackNum = src.GetRackNum();
+ }
+ if (src.HasBodyNum()) {
+ dst->BodyNum = src.GetBodyNum();
+ }
+ if (src.HasBody()) {
+ dst->Body = src.GetBody();
+ }
+ if (src.HasDataCenter()) {
+ dst->DataCenter = src.GetDataCenter();
+ }
+ if (src.HasModule()) {
+ dst->Module = src.GetModule();
+ }
+ if (src.HasRack()) {
+ dst->Rack = src.GetRack();
+ }
+ if (src.HasUnit()) {
+ dst->Unit = src.GetUnit();
+ }
+ }
+
+ THolder<NClient::TRegistrationResult> RegisterDynamicNodeViaLegacyService(const TVector<TString>& addrs, const TString& domainName) {
THolder<NClient::TRegistrationResult> result;
while (!result || !result->IsSuccess()) {
- for (auto addr : addrs) {
- result = TryToRegisterDynamicNode(addr, domainName, NodeHost, NodeAddress, NodeResolveHost, GetSchemePath());
+ for (const auto& addr : addrs) {
+ result = TryToRegisterDynamicNodeViaLegacyService(addr, domainName, NodeHost, NodeAddress, NodeResolveHost, GetSchemePath());
if (result->IsSuccess()) {
- Cout << "Success. Registered as " << result->GetNodeId() << Endl;
+ Cout << "Success. Registered via legacy service as " << result->GetNodeId() << Endl;
break;
}
Cerr << "Registration error: " << result->GetErrorMessage() << Endl;
@@ -1028,12 +1207,17 @@ protected:
if (!result->IsSuccess())
ythrow yexception() << "Cannot register dynamic node: " << result->GetErrorMessage();
+ return result;
+ }
+
+ void ProcessRegistrationDynamicNodeResult(const THolder<NClient::TRegistrationResult>& result) {
RunConfig.NodeId = result->GetNodeId();
RunConfig.ScopeId = TKikimrScopeId(result->GetScopeId());
- auto &nsConfig = *RunConfig.AppConfig.MutableNameserviceConfig();
+ auto &nsConfig = *RunConfig.AppConfig.MutableNameserviceConfig();
nsConfig.ClearNode();
+ auto &dnConfig = *RunConfig.AppConfig.MutableDynamicNodeConfig();
for (auto &node : result->Record().GetNodes()) {
if (node.GetNodeId() == result->GetNodeId()) {
dnConfig.MutableNodeInfo()->CopyFrom(node);
@@ -1049,6 +1233,33 @@ protected:
}
}
+ void RegisterDynamicNode() {
+ TVector<TString> addrs;
+
+ FillClusterEndpoints(addrs);
+
+ if (!InterconnectPort)
+ ythrow yexception() << "Either --node or --ic-port should be specified";
+
+ if (addrs.empty()) {
+ ythrow yexception() << "List of Node Broker end-points is empty";
+ }
+
+ TString domainName = DeduceNodeDomain();
+ if (!NodeHost)
+ NodeHost = FQDNHostName();
+ if (!NodeResolveHost)
+ NodeResolveHost = NodeHost;
+
+ NYdb::NDiscovery::TNodeRegistrationResult result = RegisterDynamicNodeViaDiscoveryService(addrs, domainName);
+ if (result.IsSuccess()) {
+ ProcessRegistrationDynamicNodeResult(result);
+ } else {
+ THolder<NClient::TRegistrationResult> result = RegisterDynamicNodeViaLegacyService(addrs, domainName);
+ ProcessRegistrationDynamicNodeResult(result);
+ }
+ }
+
void ApplyConfigForNode(NKikimrConfig::TAppConfig &appConfig) {
AppConfig.Swap(&appConfig);
// Dynamic node config is defined by options and Node Broker response.
diff --git a/ydb/core/driver_lib/run/CMakeLists.darwin-x86_64.txt b/ydb/core/driver_lib/run/CMakeLists.darwin-x86_64.txt
index 0d09ac280c9..e7bbabfbedf 100644
--- a/ydb/core/driver_lib/run/CMakeLists.darwin-x86_64.txt
+++ b/ydb/core/driver_lib/run/CMakeLists.darwin-x86_64.txt
@@ -59,6 +59,7 @@ target_link_libraries(run PUBLIC
fq-libs-logs
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-http_proxy
core-kesus-proxy
diff --git a/ydb/core/driver_lib/run/CMakeLists.linux-aarch64.txt b/ydb/core/driver_lib/run/CMakeLists.linux-aarch64.txt
index a49f2149f3f..b1c4e4f1a30 100644
--- a/ydb/core/driver_lib/run/CMakeLists.linux-aarch64.txt
+++ b/ydb/core/driver_lib/run/CMakeLists.linux-aarch64.txt
@@ -60,6 +60,7 @@ target_link_libraries(run PUBLIC
fq-libs-logs
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-http_proxy
core-kesus-proxy
diff --git a/ydb/core/driver_lib/run/CMakeLists.linux-x86_64.txt b/ydb/core/driver_lib/run/CMakeLists.linux-x86_64.txt
index a49f2149f3f..b1c4e4f1a30 100644
--- a/ydb/core/driver_lib/run/CMakeLists.linux-x86_64.txt
+++ b/ydb/core/driver_lib/run/CMakeLists.linux-x86_64.txt
@@ -60,6 +60,7 @@ target_link_libraries(run PUBLIC
fq-libs-logs
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-http_proxy
core-kesus-proxy
diff --git a/ydb/core/driver_lib/run/CMakeLists.windows-x86_64.txt b/ydb/core/driver_lib/run/CMakeLists.windows-x86_64.txt
index 0d09ac280c9..e7bbabfbedf 100644
--- a/ydb/core/driver_lib/run/CMakeLists.windows-x86_64.txt
+++ b/ydb/core/driver_lib/run/CMakeLists.windows-x86_64.txt
@@ -59,6 +59,7 @@ target_link_libraries(run PUBLIC
fq-libs-logs
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-http_proxy
core-kesus-proxy
diff --git a/ydb/core/driver_lib/run/cert_auth_props.h b/ydb/core/driver_lib/run/cert_auth_props.h
index 9415c229a25..2b69e6aaff9 100644
--- a/ydb/core/driver_lib/run/cert_auth_props.h
+++ b/ydb/core/driver_lib/run/cert_auth_props.h
@@ -1,6 +1,6 @@
#pragma once
-#include <ydb/core/client/server/dynamic_node_auth_processor.h>
+#include <ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h>
#include <ydb/core/protos/config.pb.h>
#include <util/generic/string.h>
diff --git a/ydb/core/driver_lib/run/run.cpp b/ydb/core/driver_lib/run/run.cpp
index a830aefb9cd..357498e4aca 100644
--- a/ydb/core/driver_lib/run/run.cpp
+++ b/ydb/core/driver_lib/run/run.cpp
@@ -816,13 +816,19 @@ void TKikimrRunner::InitializeGRpc(const TKikimrRunConfig& runConfig) {
}
if (hasDiscovery) {
- server.AddService(new NGRpcService::TGRpcDiscoveryService(ActorSystem.Get(), Counters,
- grpcRequestProxies[0], hasDiscovery.IsRlAllowed()));
+ auto discoveryService = new NGRpcService::TGRpcDiscoveryService(ActorSystem.Get(), Counters,grpcRequestProxies[0], hasDiscovery.IsRlAllowed());
+ if (!opts.SslData.Empty()) {
+ discoveryService->SetDynamicNodeAuthParams(GetDynamicNodeAuthorizationParams(appConfig.GetClientCertificateAuthorization()));
+ }
+ server.AddService(discoveryService);
}
if (hasLocalDiscovery) {
- server.AddService(new NGRpcService::TGRpcLocalDiscoveryService(grpcConfig, ActorSystem.Get(), Counters,
- grpcRequestProxies[0]));
+ auto localDiscoveryService = new NGRpcService::TGRpcLocalDiscoveryService(grpcConfig, ActorSystem.Get(), Counters, grpcRequestProxies[0]);
+ if (!opts.SslData.Empty()) {
+ localDiscoveryService->SetDynamicNodeAuthParams(GetDynamicNodeAuthorizationParams(appConfig.GetClientCertificateAuthorization()));
+ }
+ server.AddService(localDiscoveryService);
}
if (hasRateLimiter) {
diff --git a/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt b/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt
index bed8458eab7..d1e1087ee09 100644
--- a/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt
+++ b/ydb/core/grpc_services/CMakeLists.darwin-x86_64.txt
@@ -6,6 +6,7 @@
# original buildsystem will not be accepted.
+add_subdirectory(auth_processor)
add_subdirectory(base)
add_subdirectory(cancelation)
add_subdirectory(counters)
@@ -34,6 +35,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
core-grpc_services-counters
core-grpc_services-local_rpc
core-grpc_services-cancelation
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-io_formats
core-kesus-tablet
@@ -111,6 +113,7 @@ target_sources(ydb-core-grpc_services PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_load_rows.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_log_store.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_long_tx.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_node_registration.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_make_directory.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_modify_permissions.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_monitoring.cpp
diff --git a/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt b/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt
index 11ee0e2eaba..591edc09801 100644
--- a/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt
+++ b/ydb/core/grpc_services/CMakeLists.linux-aarch64.txt
@@ -6,6 +6,7 @@
# original buildsystem will not be accepted.
+add_subdirectory(auth_processor)
add_subdirectory(base)
add_subdirectory(cancelation)
add_subdirectory(counters)
@@ -35,6 +36,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
core-grpc_services-counters
core-grpc_services-local_rpc
core-grpc_services-cancelation
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-io_formats
core-kesus-tablet
@@ -112,6 +114,7 @@ target_sources(ydb-core-grpc_services PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_load_rows.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_log_store.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_long_tx.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_node_registration.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_make_directory.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_modify_permissions.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_monitoring.cpp
diff --git a/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt b/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt
index 11ee0e2eaba..591edc09801 100644
--- a/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt
+++ b/ydb/core/grpc_services/CMakeLists.linux-x86_64.txt
@@ -6,6 +6,7 @@
# original buildsystem will not be accepted.
+add_subdirectory(auth_processor)
add_subdirectory(base)
add_subdirectory(cancelation)
add_subdirectory(counters)
@@ -35,6 +36,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
core-grpc_services-counters
core-grpc_services-local_rpc
core-grpc_services-cancelation
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-io_formats
core-kesus-tablet
@@ -112,6 +114,7 @@ target_sources(ydb-core-grpc_services PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_load_rows.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_log_store.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_long_tx.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_node_registration.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_make_directory.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_modify_permissions.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_monitoring.cpp
diff --git a/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt b/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt
index bed8458eab7..d1e1087ee09 100644
--- a/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt
+++ b/ydb/core/grpc_services/CMakeLists.windows-x86_64.txt
@@ -6,6 +6,7 @@
# original buildsystem will not be accepted.
+add_subdirectory(auth_processor)
add_subdirectory(base)
add_subdirectory(cancelation)
add_subdirectory(counters)
@@ -34,6 +35,7 @@ target_link_libraries(ydb-core-grpc_services PUBLIC
core-grpc_services-counters
core-grpc_services-local_rpc
core-grpc_services-cancelation
+ core-grpc_services-auth_processor
ydb-core-health_check
ydb-core-io_formats
core-kesus-tablet
@@ -111,6 +113,7 @@ target_sources(ydb-core-grpc_services PRIVATE
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_load_rows.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_log_store.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_long_tx.cpp
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_node_registration.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_make_directory.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_modify_permissions.cpp
${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/rpc_monitoring.cpp
diff --git a/ydb/core/grpc_services/auth_processor/CMakeLists.darwin-x86_64.txt b/ydb/core/grpc_services/auth_processor/CMakeLists.darwin-x86_64.txt
new file mode 100644
index 00000000000..0671197fd03
--- /dev/null
+++ b/ydb/core/grpc_services/auth_processor/CMakeLists.darwin-x86_64.txt
@@ -0,0 +1,19 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(OpenSSL REQUIRED)
+
+add_library(core-grpc_services-auth_processor)
+target_link_libraries(core-grpc_services-auth_processor PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ OpenSSL::OpenSSL
+)
+target_sources(core-grpc_services-auth_processor PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.cpp
+)
diff --git a/ydb/core/grpc_services/auth_processor/CMakeLists.linux-aarch64.txt b/ydb/core/grpc_services/auth_processor/CMakeLists.linux-aarch64.txt
new file mode 100644
index 00000000000..2b3e17d3202
--- /dev/null
+++ b/ydb/core/grpc_services/auth_processor/CMakeLists.linux-aarch64.txt
@@ -0,0 +1,20 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(OpenSSL REQUIRED)
+
+add_library(core-grpc_services-auth_processor)
+target_link_libraries(core-grpc_services-auth_processor PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ OpenSSL::OpenSSL
+)
+target_sources(core-grpc_services-auth_processor PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.cpp
+)
diff --git a/ydb/core/grpc_services/auth_processor/CMakeLists.linux-x86_64.txt b/ydb/core/grpc_services/auth_processor/CMakeLists.linux-x86_64.txt
new file mode 100644
index 00000000000..2b3e17d3202
--- /dev/null
+++ b/ydb/core/grpc_services/auth_processor/CMakeLists.linux-x86_64.txt
@@ -0,0 +1,20 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(OpenSSL REQUIRED)
+
+add_library(core-grpc_services-auth_processor)
+target_link_libraries(core-grpc_services-auth_processor PUBLIC
+ contrib-libs-linux-headers
+ contrib-libs-cxxsupp
+ yutil
+ OpenSSL::OpenSSL
+)
+target_sources(core-grpc_services-auth_processor PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.cpp
+)
diff --git a/ydb/core/grpc_services/auth_processor/CMakeLists.txt b/ydb/core/grpc_services/auth_processor/CMakeLists.txt
new file mode 100644
index 00000000000..f8b31df0c11
--- /dev/null
+++ b/ydb/core/grpc_services/auth_processor/CMakeLists.txt
@@ -0,0 +1,17 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-aarch64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ include(CMakeLists.darwin-x86_64.txt)
+elseif (WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64" AND NOT HAVE_CUDA)
+ include(CMakeLists.windows-x86_64.txt)
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT HAVE_CUDA)
+ include(CMakeLists.linux-x86_64.txt)
+endif()
diff --git a/ydb/core/grpc_services/auth_processor/CMakeLists.windows-x86_64.txt b/ydb/core/grpc_services/auth_processor/CMakeLists.windows-x86_64.txt
new file mode 100644
index 00000000000..0671197fd03
--- /dev/null
+++ b/ydb/core/grpc_services/auth_processor/CMakeLists.windows-x86_64.txt
@@ -0,0 +1,19 @@
+
+# This file was generated by the build system used internally in the Yandex monorepo.
+# Only simple modifications are allowed (adding source-files to targets, adding simple properties
+# like target_include_directories). These modifications will be ported to original
+# ya.make files by maintainers. Any complex modifications which can't be ported back to the
+# original buildsystem will not be accepted.
+
+
+find_package(OpenSSL REQUIRED)
+
+add_library(core-grpc_services-auth_processor)
+target_link_libraries(core-grpc_services-auth_processor PUBLIC
+ contrib-libs-cxxsupp
+ yutil
+ OpenSSL::OpenSSL
+)
+target_sources(core-grpc_services-auth_processor PRIVATE
+ ${CMAKE_SOURCE_DIR}/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.cpp
+)
diff --git a/ydb/core/client/server/dynamic_node_auth_processor.cpp b/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.cpp
index 394def2f52c..394def2f52c 100644
--- a/ydb/core/client/server/dynamic_node_auth_processor.cpp
+++ b/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.cpp
diff --git a/ydb/core/client/server/dynamic_node_auth_processor.h b/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h
index bafd4855b68..bafd4855b68 100644
--- a/ydb/core/client/server/dynamic_node_auth_processor.h
+++ b/ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h
diff --git a/ydb/core/grpc_services/rpc_node_registration.cpp b/ydb/core/grpc_services/rpc_node_registration.cpp
new file mode 100644
index 00000000000..1d2292407be
--- /dev/null
+++ b/ydb/core/grpc_services/rpc_node_registration.cpp
@@ -0,0 +1,303 @@
+#include "service_discovery.h"
+
+#include <ydb/core/grpc_services/base/base.h>
+#include <library/cpp/actors/core/actor_bootstrapped.h>
+#include <library/cpp/actors/interconnect/interconnect.h>
+#include <ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h>
+#include <ydb/core/base/tablet_pipe.h>
+#include <ydb/core/base/appdata.h>
+#include <ydb/core/mind/node_broker.h>
+#include <ydb/core/protos/node_broker.pb.h>
+#include <ydb/public/api/protos/ydb_discovery.pb.h>
+
+namespace NKikimr {
+namespace NGRpcService {
+
+using namespace NKikimrNodeBroker;
+using namespace NNodeBroker;
+
+using TEvNodeRegistrationRequest = TGrpcRequestOperationCall<Ydb::Discovery::NodeRegistrationRequest,
+ Ydb::Discovery::NodeRegistrationResponse>;
+
+class TNodeRegistrationRPC : public TActorBootstrapped<TNodeRegistrationRPC> {
+ using TActorBase = TActorBootstrapped<TNodeRegistrationRPC>;
+
+ struct TNodeAuthorizationResult {
+ bool IsAuthorized = false;
+ bool IsCertificateUsed = false;
+
+ operator bool() const {
+ return IsAuthorized;
+ }
+ };
+
+public:
+ static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
+ return NKikimrServices::TActivity::GRPC_REQ;
+ }
+
+ TNodeRegistrationRPC(IRequestOpCtx* request, const TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams)
+ : Request(request), DynamicNodeAuthorizationParams(dynamicNodeAuthorizationParams)
+ {}
+
+ void Bootstrap(const TActorContext& ctx) {
+ auto req = dynamic_cast<TEvNodeRegistrationRequest*>(Request.get());
+ Y_VERIFY(req, "Unexpected request type for TNodeRegistrationRPC");
+ const TNodeAuthorizationResult nodeAuthorizationResult = IsNodeAuthorized(req->FindClientCert());
+ if (!nodeAuthorizationResult.IsAuthorized) {
+ SendReplyAndDie(ctx);
+ }
+
+ auto dinfo = AppData(ctx)->DomainsInfo;
+ ui32 group;
+ auto request = TEvNodeRegistrationRequest::GetProtoRequest(Request);
+ const TString& domainPath = request->domain_path();
+ if (!domainPath.Empty()) {
+ auto *domain = dinfo->GetDomainByName(domainPath);
+ if (!domain) {
+ auto error = Sprintf("Unknown domain %s", domainPath.data());
+ ReplyWithErrorAndDie(error, ctx);
+ return;
+ }
+ group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ } else {
+ if (dinfo->Domains.size() > 1) {
+ auto error = "Ambiguous domain (specify DomainPath in request)";
+ ReplyWithErrorAndDie(error, ctx);
+ return;
+ }
+ auto domain = dinfo->Domains.begin()->second;
+ group = dinfo->GetDefaultStateStorageGroup(domain->DomainUid);
+ }
+
+ NTabletPipe::TClientConfig pipeConfig;
+ pipeConfig.RetryPolicy = {.RetryLimitCount = 10};
+ auto pipe = NTabletPipe::CreateClient(SelfId(), MakeNodeBrokerID(group), pipeConfig);
+ NodeBrokerPipe = ctx.RegisterWithSameMailbox(pipe);
+
+ TAutoPtr<TEvNodeBroker::TEvRegistrationRequest> nodeBrokerRequest
+ = new TEvNodeBroker::TEvRegistrationRequest;
+
+ nodeBrokerRequest->Record.SetHost(request->host());
+ nodeBrokerRequest->Record.SetPort(request->port());
+ nodeBrokerRequest->Record.SetResolveHost(request->resolve_host());
+ nodeBrokerRequest->Record.SetAddress(request->address());
+ CopyNodeLocation(nodeBrokerRequest->Record.MutableLocation(), request->location());
+ nodeBrokerRequest->Record.SetFixedNodeId(request->fixed_node_id());
+ if (request->has_path()) {
+ nodeBrokerRequest->Record.SetPath(request->path());
+ }
+ nodeBrokerRequest->Record.SetAuthorizedByCertificate(nodeAuthorizationResult.IsCertificateUsed);
+
+ NTabletPipe::SendData(ctx, NodeBrokerPipe, nodeBrokerRequest.Release());
+
+ Become(&TNodeRegistrationRPC::MainState);
+ }
+
+ void Handle(TEvNodeBroker::TEvRegistrationResponse::TPtr &ev, const TActorContext &ctx) {
+ auto &rec = ev->Get()->Record;
+
+ if (rec.GetStatus().GetCode() != TStatus::OK) {
+ ReplyWithErrorAndDie(rec.GetStatus().GetReason(), ctx);
+ return;
+ }
+
+ auto request = TEvNodeRegistrationRequest::GetProtoRequest(Request);
+ Result.set_node_id(rec.GetNode().GetNodeId());
+ Result.set_expire(rec.GetNode().GetExpire());
+ Result.set_domain_path(request->domain_path());
+ CopyNodeInfo(Result.add_nodes(), rec.GetNode());
+
+ if (rec.HasScopeTabletId()) {
+ Result.set_scope_tablet_id(rec.GetScopeTabletId());
+ }
+ if (rec.HasScopePathId()) {
+ Result.set_scope_path_id(rec.GetScopePathId());
+ }
+
+ const TActorId nameserviceId = GetNameserviceActorId();
+ ctx.Send(nameserviceId, new TEvInterconnect::TEvListNodes());
+ }
+
+ void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev, const TActorContext &ctx) {
+ auto config = AppData()->DynamicNameserviceConfig;
+
+ for (const auto &node : ev->Get()->Nodes) {
+ // Copy static nodes only.
+ if (!config || node.NodeId <= config->MaxStaticNodeId) {
+ auto &info = *Result.add_nodes();
+ info.set_node_id(node.NodeId);
+ info.set_host(node.Host);
+ info.set_address(node.Address);
+ info.set_resolve_host(node.ResolveHost);
+ info.set_port(node.Port);
+ NActorsInterconnect::TNodeLocation location;
+ node.Location.Serialize(&location, true);
+ CopyNodeLocation(info.mutable_location(), location);
+ }
+ }
+
+ Status = Ydb::StatusIds::SUCCESS;
+ SendReplyAndDie(ctx);
+ }
+
+ void Undelivered(const TActorContext &ctx) {
+ ReplyWithErrorAndDie("Node Broker is unavailable", ctx);
+ }
+
+ void Handle(TEvTabletPipe::TEvClientConnected::TPtr &ev, const TActorContext &ctx) noexcept
+ {
+ if (ev->Get()->Status != NKikimrProto::OK)
+ Undelivered(ctx);
+ }
+
+ void Die(const TActorContext &ctx)
+ {
+ if (NodeBrokerPipe) {
+ NTabletPipe::CloseClient(ctx, NodeBrokerPipe);
+ }
+ TActorBase::Die(ctx);
+ }
+
+ void SendReplyAndDie(const TActorContext &ctx)
+ {
+ Request->SendResult(Result, Status);
+ Die(ctx);
+ }
+
+ void ReplyWithErrorAndDie(const TString &error, const TActorContext &ctx)
+ {
+ auto issue = NYql::TIssue(error);
+ Request->RaiseIssue(issue);
+ Status = Ydb::StatusIds::GENERIC_ERROR;
+ SendReplyAndDie(ctx);
+ }
+
+ STFUNC(MainState) {
+ switch (ev->GetTypeRewrite()) {
+ CFunc(TEvents::TEvUndelivered::EventType, Undelivered);
+ HFunc(TEvNodeBroker::TEvRegistrationResponse, Handle);
+ HFunc(TEvInterconnect::TEvNodesInfo, Handle);
+ CFunc(TEvTabletPipe::EvClientDestroyed, Undelivered);
+ HFunc(TEvTabletPipe::TEvClientConnected, Handle);
+ }
+ }
+
+private:
+ TNodeAuthorizationResult IsNodeAuthorized(const TVector<TStringBuf>& nodeAuthValues) {
+ TNodeAuthorizationResult result {.IsAuthorized = false, .IsCertificateUsed = false};
+ auto* appdata = AppData();
+ if (appdata && appdata->FeatureFlags.GetEnableDynamicNodeAuthorization() && DynamicNodeAuthorizationParams) {
+ if (nodeAuthValues.empty()) {
+ Request->RaiseIssue(NYql::TIssue("Cannot authorize node. Node has not provided certificate"));
+ Status = Ydb::StatusIds::UNAUTHORIZED;
+ return result;
+ }
+ const auto& pemCert = nodeAuthValues.front();
+ TMap<TString, TString> subjectDescription;
+ X509CertificateReader::X509Ptr x509cert = X509CertificateReader::ReadCertAsPEM(pemCert);
+ for(const auto& term: X509CertificateReader::ReadSubjectTerms(x509cert)) {
+ subjectDescription.insert(term);
+ }
+
+ if (!DynamicNodeAuthorizationParams.IsSubjectDescriptionMatched(subjectDescription)) {
+ Status = Ydb::StatusIds::UNAUTHORIZED;
+ Request->RaiseIssue(NYql::TIssue("Cannot authorize node by certificate"));
+ return result;
+ }
+ auto request = TEvNodeRegistrationRequest::GetProtoRequest(Request);
+ const auto& host = request->host();
+ if (!DynamicNodeAuthorizationParams.IsHostMatchAttributeCN(host)) {
+ Status = Ydb::StatusIds::UNAUTHORIZED;
+ Request->RaiseIssue(NYql::TIssue("Cannot authorize node with host: " + host));
+ return result;
+ }
+ result.IsCertificateUsed = true;
+ }
+ result.IsAuthorized = true;
+ return result;;
+ }
+
+ static void CopyNodeInfo(Ydb::Discovery::NodeInfo* dst, const NKikimrNodeBroker::TNodeInfo& src) {
+ dst->set_node_id(src.GetNodeId());
+ dst->set_host(src.GetHost());
+ dst->set_port(src.GetPort());
+ dst->set_resolve_host(src.GetResolveHost());
+ dst->set_address(src.GetAddress());
+ CopyNodeLocation(dst->mutable_location(), src.GetLocation());
+ dst->set_expire(src.GetExpire());
+ }
+
+ static void CopyNodeLocation(NActorsInterconnect::TNodeLocation* dst, const Ydb::Discovery::NodeLocation& src) {
+ if (src.has_data_center_num()) {
+ dst->SetDataCenterNum(src.data_center_num());
+ }
+ if (src.has_room_num()) {
+ dst->SetRoomNum(src.room_num());
+ }
+ if (src.has_rack_num()) {
+ dst->SetRackNum(src.rack_num());
+ }
+ if (src.has_body_num()) {
+ dst->SetBodyNum(src.body_num());
+ }
+ if (src.has_body()) {
+ dst->SetBody(src.body());
+ }
+ if (src.has_data_center()) {
+ dst->SetDataCenter(src.data_center());
+ }
+ if (src.has_module()) {
+ dst->SetModule(src.module());
+ }
+ if (src.has_rack()) {
+ dst->SetRack(src.rack());
+ }
+ if (src.has_unit()) {
+ dst->SetUnit(src.unit());
+ }
+ }
+
+ static void CopyNodeLocation(Ydb::Discovery::NodeLocation* dst, const NActorsInterconnect::TNodeLocation& src) {
+ if (src.HasDataCenterNum()) {
+ dst->set_data_center_num(src.GetDataCenterNum());
+ }
+ if (src.HasRoomNum()) {
+ dst->set_room_num(src.GetRoomNum());
+ }
+ if (src.HasRackNum()) {
+ dst->set_rack_num(src.GetRackNum());
+ }
+ if (src.HasBodyNum()) {
+ dst->set_body_num(src.GetBodyNum());
+ }
+ if (src.HasBody()) {
+ dst->set_body(src.GetBody());
+ }
+ if (src.HasDataCenter()) {
+ dst->set_data_center(src.GetDataCenter());
+ }
+ if (src.HasModule()) {
+ dst->set_module(src.GetModule());
+ }
+ if (src.HasRack()) {
+ dst->set_rack(src.GetRack());
+ }
+ if (src.HasUnit()) {
+ dst->set_unit(src.GetUnit());
+ }
+ }
+
+ std::unique_ptr<IRequestOpCtx> Request;
+ Ydb::Discovery::NodeRegistrationResult Result;
+ Ydb::StatusIds_StatusCode Status = Ydb::StatusIds::SUCCESS;
+ TActorId NodeBrokerPipe;
+ const TDynamicNodeAuthorizationParams DynamicNodeAuthorizationParams;
+};
+
+void DoNodeRegistrationRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f, const TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams) {
+ f.RegisterActor(new TNodeRegistrationRPC(p.release(), dynamicNodeAuthorizationParams));
+}
+
+} // namespace NGRpcService
+} // namespace NKikimr
diff --git a/ydb/core/grpc_services/service_discovery.h b/ydb/core/grpc_services/service_discovery.h
index 871d877f456..e47ad65c636 100644
--- a/ydb/core/grpc_services/service_discovery.h
+++ b/ydb/core/grpc_services/service_discovery.h
@@ -3,6 +3,9 @@
#include <memory>
namespace NKikimr {
+
+struct TDynamicNodeAuthorizationParams;
+
namespace NGRpcService {
class IRequestOpCtx;
@@ -10,6 +13,7 @@ class IFacilityProvider;
void DoListEndpointsRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
void DoWhoAmIRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f);
+void DoNodeRegistrationRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f, const TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams);
}
}
diff --git a/ydb/core/testlib/test_client.cpp b/ydb/core/testlib/test_client.cpp
index 38172f02dc4..3a93133f463 100644
--- a/ydb/core/testlib/test_client.cpp
+++ b/ydb/core/testlib/test_client.cpp
@@ -364,7 +364,11 @@ namespace Tests {
GRpcServer->AddService(new NGRpcService::TGRpcPQClusterDiscoveryService(system, counters, grpcRequestProxies[0]));
GRpcServer->AddService(new NKesus::TKesusGRpcService(system, counters, grpcRequestProxies[0], true));
GRpcServer->AddService(new NGRpcService::TGRpcCmsService(system, counters, grpcRequestProxies[0], true));
- GRpcServer->AddService(new NGRpcService::TGRpcDiscoveryService(system, counters, grpcRequestProxies[0], true));
+ auto discoveryService = new NGRpcService::TGRpcDiscoveryService(system, counters, grpcRequestProxies[0], true);
+ if (!options.SslData.Empty()) {
+ discoveryService->SetDynamicNodeAuthParams(NKikimr::GetDynamicNodeAuthorizationParams(Settings->AppConfig.GetClientCertificateAuthorization()));
+ }
+ GRpcServer->AddService(discoveryService);
GRpcServer->AddService(new NGRpcService::TGRpcYdbClickhouseInternalService(system, counters, appData.InFlightLimiterRegistry, grpcRequestProxies[0], true));
GRpcServer->AddService(new NQuoter::TRateLimiterGRpcService(system, counters, grpcRequestProxies[0]));
GRpcServer->AddService(new NGRpcService::TGRpcYdbLongTxService(system, counters, grpcRequestProxies[0], true));
diff --git a/ydb/public/api/grpc/ydb_discovery_v1.proto b/ydb/public/api/grpc/ydb_discovery_v1.proto
index dc06a4f6788..7005b5b642e 100644
--- a/ydb/public/api/grpc/ydb_discovery_v1.proto
+++ b/ydb/public/api/grpc/ydb_discovery_v1.proto
@@ -8,4 +8,5 @@ import "ydb/public/api/protos/ydb_discovery.proto";
service DiscoveryService {
rpc ListEndpoints(Ydb.Discovery.ListEndpointsRequest) returns (Ydb.Discovery.ListEndpointsResponse);
rpc WhoAmI(Ydb.Discovery.WhoAmIRequest) returns (Ydb.Discovery.WhoAmIResponse);
+ rpc NodeRegistration(Ydb.Discovery.NodeRegistrationRequest) returns (Ydb.Discovery.NodeRegistrationResponse);
}
diff --git a/ydb/public/api/protos/ydb_discovery.proto b/ydb/public/api/protos/ydb_discovery.proto
index 5577dafe36d..4c94372eb71 100644
--- a/ydb/public/api/protos/ydb_discovery.proto
+++ b/ydb/public/api/protos/ydb_discovery.proto
@@ -49,7 +49,7 @@ message WhoAmIRequest {
// Include user groups in response
bool include_groups = 1;
}
-
+
message WhoAmIResult {
// User SID (Security ID)
string user = 1;
@@ -60,3 +60,51 @@ message WhoAmIResult {
message WhoAmIResponse {
Ydb.Operations.Operation operation = 1;
}
+
+message NodeLocation {
+ // compatibility section -- will be removed in future versions
+ optional uint32 data_center_num = 1 [deprecated=true];
+ optional uint32 room_num = 2 [deprecated=true];
+ optional uint32 rack_num = 3 [deprecated=true];
+ optional uint32 body_num = 4 [deprecated=true];
+ optional uint32 body = 100500 [deprecated=true]; // for compatibility with WalleLocation
+
+ optional string data_center = 10;
+ optional string module = 20;
+ optional string rack = 30;
+ optional string unit = 40;
+}
+
+message NodeInfo {
+ optional uint32 node_id = 1;
+ optional string host = 2;
+ optional uint32 port = 3;
+ optional string resolve_host = 4;
+ optional string address = 5;
+ optional NodeLocation location = 6;
+ optional uint64 expire = 7;
+}
+
+message NodeRegistrationRequest {
+ optional string host = 1;
+ optional uint32 port = 2;
+ optional string resolve_host = 3;
+ optional string address = 4;
+ optional NodeLocation location = 5;
+ optional string domain_path = 6;
+ optional bool fixed_node_id = 7;
+ optional string path = 8;
+}
+
+message NodeRegistrationResult {
+ optional uint32 node_id = 1;
+ optional string domain_path = 2;
+ optional uint64 expire = 3;
+ repeated NodeInfo nodes = 4;
+ optional uint64 scope_tablet_id = 5;
+ optional uint64 scope_path_id = 6;
+}
+
+message NodeRegistrationResponse {
+ Ydb.Operations.Operation operation = 1;
+}
diff --git a/ydb/public/sdk/cpp/client/ydb_discovery/discovery.cpp b/ydb/public/sdk/cpp/client/ydb_discovery/discovery.cpp
index b502222fc25..20c71a20385 100644
--- a/ydb/public/sdk/cpp/client/ydb_discovery/discovery.cpp
+++ b/ydb/public/sdk/cpp/client/ydb_discovery/discovery.cpp
@@ -57,6 +57,75 @@ const TVector<TString>& TWhoAmIResult::GetGroups() const {
return Groups_;
}
+TNodeLocation::TNodeLocation(const Ydb::Discovery::NodeLocation& location)
+ : DataCenterNum(location.has_data_center_num() ? std::make_optional(location.data_center_num()) : std::nullopt)
+ , RoomNum(location.has_room_num() ? std::make_optional(location.room_num()) : std::nullopt)
+ , RackNum(location.has_rack_num() ? std::make_optional(location.rack_num()) : std::nullopt)
+ , BodyNum(location.has_body_num() ? std::make_optional(location.body_num()) : std::nullopt)
+ , Body(location.has_body() ? std::make_optional(location.body()) : std::nullopt)
+ , DataCenter(location.has_data_center() ? std::make_optional(location.data_center()) : std::nullopt)
+ , Module(location.has_module() ? std::make_optional(location.module()) : std::nullopt)
+ , Rack(location.has_rack() ? std::make_optional(location.rack()) : std::nullopt)
+ , Unit(location.has_unit() ? std::make_optional(location.unit()) : std::nullopt)
+ {}
+
+TNodeInfo::TNodeInfo(const Ydb::Discovery::NodeInfo& info)
+ : NodeId(info.node_id())
+ , Host(info.host())
+ , Port(info.port())
+ , ResolveHost(info.resolve_host())
+ , Address(info.address())
+ , Location(info.location())
+ , Expire(info.expire())
+ {}
+
+TNodeRegistrationResult::TNodeRegistrationResult(TStatus&& status, const Ydb::Discovery::NodeRegistrationResult& proto)
+ : TStatus(std::move(status))
+ , NodeId_(proto.node_id())
+ , DomainPath_(proto.domain_path())
+ , Expire_(proto.expire())
+ , ScopeTableId_(proto.has_scope_tablet_id() ? std::make_optional(proto.scope_tablet_id()) : std::nullopt)
+ , ScopePathId_(proto.has_scope_path_id() ? std::make_optional(proto.scope_path_id()) : std::nullopt)
+{
+ const auto& nodes = proto.nodes();
+ Nodes_.reserve(nodes.size());
+ for (const auto& node : nodes) {
+ Nodes_.emplace_back(node);
+ }
+}
+
+const ui32& TNodeRegistrationResult::GetNodeId() const {
+ return NodeId_;
+}
+
+const TString& TNodeRegistrationResult::GetDomainPath() const {
+ return DomainPath_;
+}
+
+const ui64& TNodeRegistrationResult::GetExpire() const {
+ return Expire_;
+}
+
+const ui64& TNodeRegistrationResult::GetScopeTabletId() const {
+ return ScopeTableId_.value();
+}
+
+bool TNodeRegistrationResult::HasScopeTabletId() const {
+ return ScopeTableId_.has_value();
+}
+
+const ui64& TNodeRegistrationResult::GetScopePathId() const {
+ return ScopePathId_.value();
+}
+
+bool TNodeRegistrationResult::HasScopePathId() const {
+ return ScopePathId_.value();
+}
+
+const TVector<TNodeInfo>& TNodeRegistrationResult::GetNodes() const {
+ return Nodes_;
+}
+
class TDiscoveryClient::TImpl : public TClientImplCommon<TDiscoveryClient::TImpl> {
public:
TImpl(std::shared_ptr<TGRpcConnectionsImpl>&& connections, const TCommonClientSettings& settings)
@@ -118,6 +187,72 @@ public:
return promise.GetFuture();
}
+
+ TAsyncNodeRegistrationResult NodeRegistration(const TNodeRegistrationSettings& settings) {
+ Ydb::Discovery::NodeRegistrationRequest request;
+ request.set_host(settings.Host_);
+ request.set_port(settings.Port_);
+ request.set_resolve_host(settings.ResolveHost_);
+ request.set_address(settings.Address_);
+ request.set_domain_path(settings.DomainPath_);
+ request.set_fixed_node_id(settings.FixedNodeId_);
+ if (!settings.Path_.Empty()) {
+ request.set_path(settings.Path_);
+ }
+
+ auto requestLocation = request.mutable_location();
+ const auto& location = settings.Location_;
+
+ if (location.DataCenter) {
+ requestLocation->set_data_center(location.DataCenter.value());
+ }
+ if (location.Module) {
+ requestLocation->set_module(location.Module.value());
+ }
+ if (location.Rack) {
+ requestLocation->set_rack(location.Rack.value());
+ }
+ if (location.Unit) {
+ requestLocation->set_unit(location.Unit.value());
+ }
+
+ if (location.DataCenterNum) {
+ requestLocation->set_data_center_num(location.DataCenterNum.value());
+ }
+ if (location.RoomNum) {
+ requestLocation->set_room_num(location.RoomNum.value());
+ }
+ if (location.RackNum) {
+ requestLocation->set_rack_num(location.RackNum.value());
+ }
+ if (location.BodyNum) {
+ requestLocation->set_body_num(location.BodyNum.value());
+ }
+ if (location.Body) {
+ requestLocation->set_body(location.Body.value());
+ }
+
+ auto promise = NThreading::NewPromise<TNodeRegistrationResult>();
+
+ auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable {
+ Ydb::Discovery::NodeRegistrationResult result;
+ if (any) {
+ any->UnpackTo(&result);
+ }
+ TNodeRegistrationResult val{TStatus(std::move(status)), result};
+ promise.SetValue(std::move(val));
+ };
+
+ Connections_->RunDeferred<Ydb::Discovery::V1::DiscoveryService, Ydb::Discovery::NodeRegistrationRequest, Ydb::Discovery::NodeRegistrationResponse>(
+ std::move(request),
+ extractor,
+ &Ydb::Discovery::V1::DiscoveryService::Stub::AsyncNodeRegistration,
+ DbDriverState_,
+ INITIAL_DEFERRED_CALL_DELAY,
+ TRpcRequestSettings::Make(settings));
+
+ return promise.GetFuture();
+ }
};
TDiscoveryClient::TDiscoveryClient(const TDriver& driver, const TCommonClientSettings& settings)
@@ -132,5 +267,9 @@ TAsyncWhoAmIResult TDiscoveryClient::WhoAmI(const TWhoAmISettings& settings) {
return Impl_->WhoAmI(settings);
}
+TAsyncNodeRegistrationResult TDiscoveryClient::NodeRegistration(const TNodeRegistrationSettings& settings) {
+ return Impl_->NodeRegistration(settings);
+}
+
} // namespace NDiscovery
} // namespace NYdb
diff --git a/ydb/public/sdk/cpp/client/ydb_discovery/discovery.h b/ydb/public/sdk/cpp/client/ydb_discovery/discovery.h
index bd84cdd592e..3e9c20717b5 100644
--- a/ydb/public/sdk/cpp/client/ydb_discovery/discovery.h
+++ b/ydb/public/sdk/cpp/client/ydb_discovery/discovery.h
@@ -6,6 +6,9 @@ namespace Ydb {
namespace Discovery {
class ListEndpointsResult;
class WhoAmIResult;
+ class NodeRegistrationResult;
+ class NodeLocation;
+ class NodeInfo;
} // namespace Discovery
} // namespace Ydb
@@ -20,6 +23,33 @@ struct TWhoAmISettings : public TSimpleRequestSettings<TWhoAmISettings> {
FLUENT_SETTING_DEFAULT(bool, WithGroups, false);
};
+struct TNodeLocation {
+ TNodeLocation() = default;
+ TNodeLocation(const Ydb::Discovery::NodeLocation& location);
+
+ std::optional<ui32> DataCenterNum;
+ std::optional<ui32> RoomNum;
+ std::optional<ui32> RackNum;
+ std::optional<ui32> BodyNum;
+ std::optional<ui32> Body;
+
+ std::optional<TString> DataCenter;
+ std::optional<TString> Module;
+ std::optional<TString> Rack;
+ std::optional<TString> Unit;
+};
+
+struct TNodeRegistrationSettings : public TSimpleRequestSettings<TNodeRegistrationSettings> {
+ FLUENT_SETTING(TString, Host);
+ FLUENT_SETTING(ui32, Port);
+ FLUENT_SETTING(TString, ResolveHost);
+ FLUENT_SETTING(TString, Address);
+ FLUENT_SETTING(TNodeLocation, Location);
+ FLUENT_SETTING(TString, DomainPath);
+ FLUENT_SETTING_DEFAULT(bool, FixedNodeId, false);
+ FLUENT_SETTING(TString, Path);
+};
+
struct TEndpointInfo {
TString Address;
ui32 Port = 0;
@@ -55,6 +85,43 @@ private:
using TAsyncWhoAmIResult = NThreading::TFuture<TWhoAmIResult>;
+struct TNodeInfo {
+ TNodeInfo() = default;
+ TNodeInfo(const Ydb::Discovery::NodeInfo& info);
+
+ ui32 NodeId;
+ TString Host;
+ ui32 Port;
+ TString ResolveHost;
+ TString Address;
+ TNodeLocation Location;
+ ui64 Expire;
+};
+
+class TNodeRegistrationResult : public TStatus {
+public:
+ TNodeRegistrationResult() : TStatus(EStatus::GENERIC_ERROR, NYql::TIssues()) {}
+ TNodeRegistrationResult(TStatus&& status, const Ydb::Discovery::NodeRegistrationResult& proto);
+ const ui32& GetNodeId() const;
+ const TString& GetDomainPath() const;
+ const ui64& GetExpire() const;
+ const ui64& GetScopeTabletId() const;
+ bool HasScopeTabletId() const;
+ const ui64& GetScopePathId() const;
+ bool HasScopePathId() const;
+ const TVector<TNodeInfo>& GetNodes() const;
+
+private:
+ ui32 NodeId_;
+ TString DomainPath_;
+ ui64 Expire_;
+ std::optional<ui64> ScopeTableId_;
+ std::optional<ui64> ScopePathId_;
+ TVector<TNodeInfo> Nodes_;
+};
+
+using TAsyncNodeRegistrationResult = NThreading::TFuture<TNodeRegistrationResult>;
+
////////////////////////////////////////////////////////////////////////////////
class TDiscoveryClient {
@@ -63,6 +130,7 @@ public:
TAsyncListEndpointsResult ListEndpoints(const TListEndpointsSettings& settings = TListEndpointsSettings());
TAsyncWhoAmIResult WhoAmI(const TWhoAmISettings& settings = TWhoAmISettings());
+ TAsyncNodeRegistrationResult NodeRegistration(const TNodeRegistrationSettings& settings = TNodeRegistrationSettings());
private:
class TImpl;
diff --git a/ydb/services/discovery/grpc_service.cpp b/ydb/services/discovery/grpc_service.cpp
index 2ffebc9ff36..3c1e9a0d36a 100644
--- a/ydb/services/discovery/grpc_service.cpp
+++ b/ydb/services/discovery/grpc_service.cpp
@@ -16,6 +16,10 @@ static TString GetSdkBuildInfo(NGrpc::IRequestContextBase* reqCtx) {
return TString{res[0]};
}
+void TGRpcDiscoveryService::SetDynamicNodeAuthParams(const TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams) {
+ DynamicNodeAuthorizationParams = dynamicNodeAuthorizationParams;
+}
+
void TGRpcDiscoveryService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) {
auto getCounterBlock = CreateCounterCb(Counters_, ActorSystem_);
using namespace Ydb;
@@ -29,11 +33,15 @@ void TGRpcDiscoveryService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) {
NGRpcService::ReportGrpcReqToMon(*ActorSystem_, ctx->GetPeer(), GetSdkBuildInfo(ctx)); \
ActorSystem_->Send(GRpcRequestProxyId_, \
new TGrpcRequestOperationCall<Discovery::NAME##Request, Discovery::NAME##Response> \
- (ctx, &CB, TRequestAuxSettings{RLSWITCH(TRateLimiterMode::Rps), nullptr})); \
+ (ctx, CB, TRequestAuxSettings{RLSWITCH(TRateLimiterMode::Rps), nullptr})); \
}, &Ydb::Discovery::V1::DiscoveryService::AsyncService::Request ## NAME, \
#NAME, logger, getCounterBlock("discovery", #NAME))->Run();
- ADD_REQUEST(WhoAmI, DoWhoAmIRequest)
+ ADD_REQUEST(WhoAmI, &DoWhoAmIRequest)
+ NodeRegistrationRequest = [authParams = this->DynamicNodeAuthorizationParams] (std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f) {
+ DoNodeRegistrationRequest(std::move(p), f, authParams);
+ };
+ ADD_REQUEST(NodeRegistration, NodeRegistrationRequest)
#ifdef ADD_LEGACY_REQUEST
#error macro already defined
diff --git a/ydb/services/discovery/grpc_service.h b/ydb/services/discovery/grpc_service.h
index 697f6e1c07b..1a18e0bcf18 100644
--- a/ydb/services/discovery/grpc_service.h
+++ b/ydb/services/discovery/grpc_service.h
@@ -7,20 +7,27 @@
#include <library/cpp/grpc/server/grpc_server.h>
#include <ydb/core/grpc_services/base/base_service.h>
+#include <ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h>
namespace NKikimr {
namespace NGRpcService {
+ class IRequestOpCtx;
+ class IFacilityProvider;
+
class TGRpcDiscoveryService
: public TGrpcServiceBase<Ydb::Discovery::V1::DiscoveryService>
{
public:
using TGrpcServiceBase<Ydb::Discovery::V1::DiscoveryService>::TGrpcServiceBase;
+ void SetDynamicNodeAuthParams(const TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams);
+
private:
void SetupIncomingRequests(NGrpc::TLoggerPtr logger);
-
+ TDynamicNodeAuthorizationParams DynamicNodeAuthorizationParams = {};
+ std::function<void(std::unique_ptr<IRequestOpCtx>, const IFacilityProvider&)> NodeRegistrationRequest;
};
} // namespace NGRpcService
diff --git a/ydb/services/local_discovery/grpc_service.cpp b/ydb/services/local_discovery/grpc_service.cpp
index d2c091c3304..0836cbf34f9 100644
--- a/ydb/services/local_discovery/grpc_service.cpp
+++ b/ydb/services/local_discovery/grpc_service.cpp
@@ -76,6 +76,10 @@ void TGRpcLocalDiscoveryService::DecRequest() {
Y_ASSERT(Limiter_->GetCurrentInFlight() >= 0);
}
+void TGRpcLocalDiscoveryService::SetDynamicNodeAuthParams(const TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams) {
+ DynamicNodeAuthorizationParams = dynamicNodeAuthorizationParams;
+}
+
void TGRpcLocalDiscoveryService::SetupIncomingRequests(NGrpc::TLoggerPtr logger) {
auto getCounterBlock = CreateCounterCb(Counters_, ActorSystem_);
using namespace Ydb;
@@ -90,11 +94,15 @@ void TGRpcLocalDiscoveryService::SetupIncomingRequests(NGrpc::TLoggerPtr logger)
NGRpcService::ReportGrpcReqToMon(*ActorSystem_, ctx->GetPeer(), GetSdkBuildInfo(ctx)); \
ActorSystem_->Send(GRpcRequestProxyId_, \
new TGrpcRequestOperationCall<Discovery::NAME##Request, Discovery::NAME##Response> \
- (ctx, &CB, TRequestAuxSettings{TRateLimiterMode::Rps, nullptr})); \
+ (ctx, CB, TRequestAuxSettings{TRateLimiterMode::Rps, nullptr})); \
}, &Ydb::Discovery::V1::DiscoveryService::AsyncService::Request ## NAME, \
#NAME, logger, getCounterBlock("discovery", #NAME))->Run();
- ADD_REQUEST(WhoAmI, DoWhoAmIRequest)
+ ADD_REQUEST(WhoAmI, &DoWhoAmIRequest)
+ NodeRegistrationRequest = [authParams = this->DynamicNodeAuthorizationParams] (std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& f) {
+ DoNodeRegistrationRequest(std::move(p), f, authParams);
+ };
+ ADD_REQUEST(NodeRegistration, NodeRegistrationRequest)
#undef ADD_REQUEST
using namespace std::placeholders;
diff --git a/ydb/services/local_discovery/grpc_service.h b/ydb/services/local_discovery/grpc_service.h
index f58e81811c5..b2d6ad601aa 100644
--- a/ydb/services/local_discovery/grpc_service.h
+++ b/ydb/services/local_discovery/grpc_service.h
@@ -7,6 +7,7 @@
#include <library/cpp/grpc/server/grpc_server.h>
#include <ydb/core/grpc_services/base/base_service.h>
+#include <ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h>
namespace NKikimr {
namespace NGRpcService {
@@ -29,6 +30,8 @@ public:
bool IncRequest();
void DecRequest();
+ void SetDynamicNodeAuthParams(const TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams);
+
private:
void SetupIncomingRequests(NGrpc::TLoggerPtr logger);
void DoListEndpointsRequest(std::unique_ptr<IRequestOpCtx> p, const IFacilityProvider& provider);
@@ -40,6 +43,9 @@ private:
TIntrusivePtr<::NMonitoring::TDynamicCounters> Counters_;
NActors::TActorId GRpcRequestProxyId_;
NGrpc::TGlobalLimiter* Limiter_ = nullptr;
+
+ TDynamicNodeAuthorizationParams DynamicNodeAuthorizationParams = {};
+ std::function<void(std::unique_ptr<IRequestOpCtx>, const IFacilityProvider&)> NodeRegistrationRequest;
};
} // namespace NGRpcService
diff --git a/ydb/services/ydb/CMakeLists.darwin-x86_64.txt b/ydb/services/ydb/CMakeLists.darwin-x86_64.txt
index 813d577ed81..76c589603fb 100644
--- a/ydb/services/ydb/CMakeLists.darwin-x86_64.txt
+++ b/ydb/services/ydb/CMakeLists.darwin-x86_64.txt
@@ -24,6 +24,7 @@ target_link_libraries(ydb-services-ydb PUBLIC
ydb-core-formats
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-grpc_streaming
ydb-core-protos
ydb-core-scheme
diff --git a/ydb/services/ydb/CMakeLists.linux-aarch64.txt b/ydb/services/ydb/CMakeLists.linux-aarch64.txt
index 2f77c61e3d3..e481961748d 100644
--- a/ydb/services/ydb/CMakeLists.linux-aarch64.txt
+++ b/ydb/services/ydb/CMakeLists.linux-aarch64.txt
@@ -25,6 +25,7 @@ target_link_libraries(ydb-services-ydb PUBLIC
ydb-core-formats
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-grpc_streaming
ydb-core-protos
ydb-core-scheme
diff --git a/ydb/services/ydb/CMakeLists.linux-x86_64.txt b/ydb/services/ydb/CMakeLists.linux-x86_64.txt
index 2f77c61e3d3..e481961748d 100644
--- a/ydb/services/ydb/CMakeLists.linux-x86_64.txt
+++ b/ydb/services/ydb/CMakeLists.linux-x86_64.txt
@@ -25,6 +25,7 @@ target_link_libraries(ydb-services-ydb PUBLIC
ydb-core-formats
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-grpc_streaming
ydb-core-protos
ydb-core-scheme
diff --git a/ydb/services/ydb/CMakeLists.windows-x86_64.txt b/ydb/services/ydb/CMakeLists.windows-x86_64.txt
index 813d577ed81..76c589603fb 100644
--- a/ydb/services/ydb/CMakeLists.windows-x86_64.txt
+++ b/ydb/services/ydb/CMakeLists.windows-x86_64.txt
@@ -24,6 +24,7 @@ target_link_libraries(ydb-services-ydb PUBLIC
ydb-core-formats
ydb-core-grpc_services
core-grpc_services-base
+ core-grpc_services-auth_processor
ydb-core-grpc_streaming
ydb-core-protos
ydb-core-scheme
diff --git a/ydb/services/ydb/ydb_client_certs_ut.cpp b/ydb/services/ydb/ydb_client_certs_ut.cpp
index 6fcc7a203a0..e82fae12ae2 100644
--- a/ydb/services/ydb/ydb_client_certs_ut.cpp
+++ b/ydb/services/ydb/ydb_client_certs_ut.cpp
@@ -10,7 +10,7 @@
#include <ydb/core/scheme/scheme_tablecell.h>
#include <ydb/core/testlib/test_client.h>
#include <ydb/core/driver_lib/cli_config_base/config_base.h>
-#include <ydb/core/client/server/dynamic_node_auth_processor.h>
+#include <ydb/core/grpc_services/auth_processor/dynamic_node_auth_processor.h>
#include <ydb/public/api/grpc/ydb_scheme_v1.grpc.pb.h>
#include <ydb/public/api/grpc/ydb_operation_v1.grpc.pb.h>
@@ -30,6 +30,7 @@
#include <ydb/public/sdk/cpp/client/ydb_result/result.h>
#include <ydb/public/sdk/cpp/client/ydb_scheme/scheme.h>
#include <ydb/public/sdk/cpp/client/ydb_table/table.h>
+#include <ydb/public/sdk/cpp/client/ydb_discovery/discovery.h>
#include <ydb/public/sdk/cpp/client/resources/ydb_resources.h>
#include <ydb/public/lib/deprecated/kicli/kicli.h>
@@ -236,61 +237,153 @@ Y_UNIT_TEST(TestClientCertAuthorizationParamsMatch) {
}
}
-Y_UNIT_TEST(TestAllCertIsOk) {
+NDiscovery::TNodeRegistrationSettings GetNodeRegistrationSettings() {
+ NDiscovery::TNodeRegistrationSettings settings;
+ settings.Host("localhost");
+ settings.Port(GetRandomPort());
+ settings.ResolveHost("localhost");
+ settings.Address("localhost");
+ settings.DomainPath("Root");
+ settings.FixedNodeId(false);
+
+ NYdb::NDiscovery::TNodeLocation loc;
+ loc.DataCenterNum = DataCenterFromString("DataCenter");
+ loc.RoomNum = 0;
+ loc.RackNum = RackFromString("Rack");
+ loc.BodyNum = 2;
+ loc.DataCenter = "DataCenter";
+ loc.Rack = "Rack";
+ loc.Unit = "Body";
+
+ settings.Location(loc);
+ return settings;
+}
+
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientWithCorrectCerts) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
const NTest::TCertAndKey& caCert = TKikimrTestWithServerCert::GetCACertAndKey();
- const NTest::TCertAndKey& clientServerCert = NTest::GenerateSignedCert(caCert, NTest::TProps::AsClientServer());
+ NTest::TCertAndKey clientServerCert = NTest::GenerateSignedCert(caCert, NTest::TProps::AsClientServer());
+
+ auto connection = NYdb::TDriver(
+ TDriverConfig()
+ .UseSecureConnection(caCert.Certificate.c_str())
+ .UseClientCertificate(clientServerCert.Certificate.c_str(),clientServerCert.PrivateKey.c_str())
+ .SetEndpoint(location));
+
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
+ connection.Stop(true);
+
+ UNIT_ASSERT_C(!result.IsTransportError(), result.GetIssues().ToOneLineString());
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToOneLineString());
+}
+
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientProvidesEmptyClientCerts) {
+ TKikimrServerWithCertVerification server;
+ ui16 grpc = server.GetPort();
+ TString location = TStringBuilder() << "localhost:" << grpc;
+
+ const NTest::TCertAndKey& caCert = TKikimrTestWithServerCert::GetCACertAndKey();
+ NTest::TCertAndKey noCert;
+
+ auto connection = NYdb::TDriver(
+ TDriverConfig()
+ .UseSecureConnection(caCert.Certificate.c_str())
+ .UseClientCertificate(noCert.Certificate.c_str(),noCert.PrivateKey.c_str())
+ .SetEndpoint(location));
+
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
+ connection.Stop(true);
+
+ UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToOneLineString());
+ UNIT_ASSERT_STRINGS_EQUAL(result.GetIssues().ToOneLineString(), "{ <main>: Error: Cannot authorize node. Node has not provided certificate }");
+}
+
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithoutCertVerification_ClientProvidesCorrectCerts) {
+ TKikimrServerWithOutCertVerification server;
+ ui16 grpc = server.GetPort();
+ TString location = TStringBuilder() << "localhost:" << grpc;
+
+ const NTest::TCertAndKey& caCert = TKikimrTestWithServerCert::GetCACertAndKey();
+ NTest::TCertAndKey clientServerCert = NTest::GenerateSignedCert(caCert, NTest::TProps::AsClientServer());
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
.UseClientCertificate(clientServerCert.Certificate.c_str(),clientServerCert.PrivateKey.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(!sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- UNIT_ASSERT_EQUAL(sessionValue.GetStatus(), EStatus::SUCCESS);
- };
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
+ connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToOneLineString());
+}
+
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithoutCertVerification_ClientProvidesEmptyClientCerts) {
+ TKikimrServerWithOutCertVerification server;
+ ui16 grpc = server.GetPort();
+ TString location = TStringBuilder() << "localhost:" << grpc;
+
+ const NTest::TCertAndKey& caCert = TKikimrTestWithServerCert::GetCACertAndKey();
+ NTest::TCertAndKey noCert;
+
+ auto connection = NYdb::TDriver(
+ TDriverConfig()
+ .UseSecureConnection(caCert.Certificate.c_str())
+ .UseClientCertificate(noCert.Certificate.c_str(),noCert.PrivateKey.c_str())
+ .SetEndpoint(location));
- client.CreateSession().Apply(createSessionHandler).Wait();
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToOneLineString());
}
-Y_UNIT_TEST(TestWrongCertIndentity) {
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientDoesNotProvideCorrectCerts) {
TKikimrServerWithCertVerificationAndWrongIndentity server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
const NTest::TCertAndKey& caCert = TKikimrTestWithServerCert::GetCACertAndKey();
- const NTest::TCertAndKey& clientServerCert = NTest::GenerateSignedCert(caCert, NTest::TProps::AsClientServer());
+ NTest::TCertAndKey clientServerCert = NTest::GenerateSignedCert(caCert, NTest::TProps::AsClientServer());
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
- .UseClientCertificate(clientServerCert.Certificate.c_str(), clientServerCert.PrivateKey.c_str())
+ .UseClientCertificate(clientServerCert.Certificate.c_str(),clientServerCert.PrivateKey.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(!sessionValue.IsTransportError(), sessionValue.GetIssues().ToString()); // do not authorize table service through cert
- UNIT_ASSERT_EQUAL(sessionValue.GetStatus(), EStatus::SUCCESS);
- };
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
+ connection.Stop(true);
+
+ UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToOneLineString());
+ UNIT_ASSERT_STRINGS_EQUAL(result.GetIssues().ToOneLineString(), "{ <main>: Error: Cannot authorize node by certificate }");
+}
- client.CreateSession().Apply(createSessionHandler).Wait();
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientDoesNotProvideAnyCerts) {
+ TKikimrServerWithCertVerification server;
+ ui16 grpc = server.GetPort();
+ TString location = TStringBuilder() << "localhost:" << grpc;
+
+ auto connection = NYdb::TDriver(
+ TDriverConfig()
+ .SetEndpoint(location));
+
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsTransportError(), result.GetIssues().ToOneLineString());
}
-Y_UNIT_TEST(TestIncorrectUsageClientCertFails) {
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientProvidesServerCerts) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -300,23 +393,18 @@ Y_UNIT_TEST(TestIncorrectUsageClientCertFails) {
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
- .UseClientCertificate(serverCert.Certificate.c_str(), serverCert.PrivateKey.c_str())
+ .UseClientCertificate(serverCert.Certificate.c_str(),serverCert.PrivateKey.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- };
-
- client.CreateSession().Apply(createSessionHandler).Wait();
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsTransportError(), result.GetIssues().ToOneLineString());
}
-Y_UNIT_TEST(TestCorruptedCertFails) {
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientProvidesCorruptedCert) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -330,23 +418,18 @@ Y_UNIT_TEST(TestCorruptedCertFails) {
}
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
.UseClientCertificate(clientServerCert.Certificate.c_str(), clientServerCert.PrivateKey.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- };
-
- client.CreateSession().Apply(createSessionHandler).Wait();
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsTransportError(), result.GetIssues().ToOneLineString());
}
-Y_UNIT_TEST(TestCorruptedKeyFails) {
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientProvidesCorruptedPrivatekey) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -360,23 +443,18 @@ Y_UNIT_TEST(TestCorruptedKeyFails) {
}
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
.UseClientCertificate(clientServerCert.Certificate.c_str(), clientServerCert.PrivateKey.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- };
-
- client.CreateSession().Apply(createSessionHandler).Wait();
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsTransportError(), result.GetIssues().ToOneLineString());
}
-Y_UNIT_TEST(TestExpiredCertFails) {
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientProvidesExpiredCert) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -389,23 +467,18 @@ Y_UNIT_TEST(TestExpiredCertFails) {
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
.UseClientCertificate(clientServerCert.Certificate.c_str(), clientServerCert.PrivateKey.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- };
-
- client.CreateSession().Apply(createSessionHandler).Wait();
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsTransportError(), result.GetIssues().ToOneLineString());
}
-Y_UNIT_TEST(TestServerWithoutCertVerificationAndExpiredCertWorks) {
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithOutCertVerification_ClientProvidesExpiredCert) {
TKikimrServerWithOutCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -418,24 +491,18 @@ Y_UNIT_TEST(TestServerWithoutCertVerificationAndExpiredCertWorks) {
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
.UseClientCertificate(clientServerCert.Certificate.c_str(), clientServerCert.PrivateKey.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(!sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- UNIT_ASSERT_EQUAL(sessionValue.GetStatus(), EStatus::SUCCESS);
- };
-
- client.CreateSession().Apply(createSessionHandler).Wait();
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToOneLineString());
}
-Y_UNIT_TEST(TestClientWithoutCertPassed) {
+Y_UNIT_TEST(TestRegisterNodeViaDiscovery_ServerWithCertVerification_ClientDoesNotProvideClientCerts) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -444,20 +511,15 @@ Y_UNIT_TEST(TestClientWithoutCertPassed) {
auto connection = NYdb::TDriver(
TDriverConfig()
- .SetAuthToken("test_user@builtin")
.UseSecureConnection(caCert.Certificate.c_str())
.SetEndpoint(location));
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(!sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- UNIT_ASSERT_EQUAL(sessionValue.GetStatus(), EStatus::SUCCESS);
- };
-
- client.CreateSession().Apply(createSessionHandler).Wait();
+ NYdb::NDiscovery::TDiscoveryClient discoveryClient = NYdb::NDiscovery::TDiscoveryClient(connection);
+ const auto result = discoveryClient.NodeRegistration(GetNodeRegistrationSettings()).GetValueSync();
connection.Stop(true);
+
+ UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToOneLineString());
+ UNIT_ASSERT_STRINGS_EQUAL(result.GetIssues().ToOneLineString(), "{ <main>: Error: Cannot authorize node. Node has not provided certificate }");
}
NClient::TKikimr GetKikimr(const TString& addr, const NTest::TCertAndKey& caCert, const NTest::TCertAndKey& clientServerCert) {
@@ -504,7 +566,7 @@ THolder<NClient::TRegistrationResult> TryToRegisterDynamicNode(
false));
}
-Y_UNIT_TEST(TestServerWithCertVerificationClientWithCertCallsRegisterNode) {
+Y_UNIT_TEST(TestRegisterNodeViaLegacy_ServerWithCertVerification_ClientWithCorrectCerts) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -522,7 +584,7 @@ Y_UNIT_TEST(TestServerWithCertVerificationClientWithCertCallsRegisterNode) {
Cerr << "Register node result " << resp->Record().ShortUtf8DebugString() << Endl;
}
-Y_UNIT_TEST(TestServerWithCertVerificationClientWithoutCertCallsRegisterNodeFails) {
+Y_UNIT_TEST(TestRegisterNodeViaLegacy_ServerWithCertVerification_ClientProvidesEmptyClientCerts) {
TKikimrServerWithCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -541,7 +603,7 @@ Y_UNIT_TEST(TestServerWithCertVerificationClientWithoutCertCallsRegisterNodeFail
Cerr << "Register node result " << resp->Record().ShortUtf8DebugString() << Endl;
}
-Y_UNIT_TEST(TestServerWithoutCertVerificationClientWithCertCallsRegisterNode) {
+Y_UNIT_TEST(TestRegisterNodeViaLegacy_ServerWithoutCertVerification_ClientProvidesCorrectCerts) {
TKikimrServerWithOutCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -559,7 +621,7 @@ Y_UNIT_TEST(TestServerWithoutCertVerificationClientWithCertCallsRegisterNode) {
Cerr << "Register node result " << resp->Record().ShortUtf8DebugString() << Endl;
}
-Y_UNIT_TEST(TestServerWithoutCertVerificationClientWithoutCertCallsRegisterNode) {
+Y_UNIT_TEST(TestRegisterNodeViaLegacy_ServerWithoutCertVerification_ClientProvidesEmptyClientCerts) {
TKikimrServerWithOutCertVerification server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -577,7 +639,7 @@ Y_UNIT_TEST(TestServerWithoutCertVerificationClientWithoutCertCallsRegisterNode)
Cerr << "Register node result " << resp->Record().ShortUtf8DebugString() << Endl;
}
-Y_UNIT_TEST(TestServerWithWrongIndentityClientWithCertCallsRegisterNodeFails) {
+Y_UNIT_TEST(TestRegisterNodeViaLegacy_ServerWithCertVerification_ClientDoesNotProvideCorrectCerts) {
TKikimrServerWithCertVerificationAndWrongIndentity server;
ui16 grpc = server.GetPort();
TString location = TStringBuilder() << "localhost:" << grpc;
@@ -596,28 +658,6 @@ Y_UNIT_TEST(TestServerWithWrongIndentityClientWithCertCallsRegisterNodeFails) {
Cerr << "Register node result " << resp->Record().ShortUtf8DebugString() << Endl;
}
-Y_UNIT_TEST(TestInsecureClient) {
- TKikimrServerWithCertVerification server;
- ui16 grpc = server.GetPort();
- TString location = TStringBuilder() << "localhost:" << grpc;
-
- auto connection = NYdb::TDriver(
- TDriverConfig()
- .SetAuthToken("test_user@builtin")
- .SetEndpoint(location));
-
- auto client = NYdb::NTable::TTableClient(connection);
- std::function<void(const TAsyncCreateSessionResult& future)> createSessionHandler =
- [client] (const TAsyncCreateSessionResult& future) mutable {
- const auto& sessionValue = future.GetValue();
- UNIT_ASSERT_C(sessionValue.IsTransportError(), sessionValue.GetIssues().ToString());
- };
-
- client.CreateSession().Apply(createSessionHandler).Wait();
-
- connection.Stop(true);
-}
-
}
} // namespace NKikimr