102 lines
No EOL
3 KiB
C#
102 lines
No EOL
3 KiB
C#
using System.Security.Cryptography;
|
|
using FrostFS.Container;
|
|
using FrostFS.Netmap;
|
|
using FrostFS.Object;
|
|
using FrostFS.SDK.ClientV2.Mappers.GRPC;
|
|
using FrostFS.SDK.Cryptography;
|
|
using FrostFS.SDK.ModelsV2;
|
|
using FrostFS.Session;
|
|
using Grpc.Core;
|
|
using Grpc.Net.Client;
|
|
|
|
namespace FrostFS.SDK.ClientV2;
|
|
|
|
public partial class Client: IFrostFSClient
|
|
{
|
|
private GrpcChannel _channel;
|
|
private readonly ECDsa _key;
|
|
private readonly OwnerId _owner;
|
|
public readonly ModelsV2.Version Version = new (2, 13);
|
|
|
|
private ContainerService.ContainerServiceClient _containerServiceClient;
|
|
private NetmapService.NetmapServiceClient _netmapServiceClient;
|
|
private ObjectService.ObjectServiceClient _objectServiceClient;
|
|
private SessionService.SessionServiceClient _sessionServiceClient;
|
|
|
|
public Client(string key, string host)
|
|
{
|
|
// TODO: Развязать клиент и реализацию GRPC
|
|
_key = key.LoadWif();
|
|
_owner = OwnerId.FromKey(_key);
|
|
InitGrpcChannel(host);
|
|
InitContainerClient();
|
|
InitNetmapClient();
|
|
InitObjectClient();
|
|
InitSessionClient();
|
|
CheckFrostFsVersionSupport();
|
|
}
|
|
|
|
private void CheckFrostFsVersionSupport()
|
|
{
|
|
var localNodeInfo = GetLocalNodeInfoAsync().Result;
|
|
var frostFsVersion = localNodeInfo.Body.Version.ToModel();
|
|
if (!frostFsVersion.IsSupported(Version))
|
|
{
|
|
var msg = $"FrostFS {frostFsVersion} is not supported.";
|
|
Console.WriteLine(msg);
|
|
throw new ApplicationException(msg);
|
|
}
|
|
}
|
|
|
|
private void InitGrpcChannel(string host)
|
|
{
|
|
Uri uri;
|
|
try
|
|
{
|
|
uri = new Uri(host);
|
|
}
|
|
catch (UriFormatException e)
|
|
{
|
|
var msg = $"Host '{host}' has invalid format. Error: {e.Message}";
|
|
Console.WriteLine(msg);
|
|
throw new ArgumentException(msg);
|
|
}
|
|
|
|
ChannelCredentials grpcCredentials;
|
|
switch (uri.Scheme)
|
|
{
|
|
case "https":
|
|
grpcCredentials = ChannelCredentials.SecureSsl;
|
|
break;
|
|
case "http":
|
|
grpcCredentials = ChannelCredentials.Insecure;
|
|
break;
|
|
default:
|
|
var msg = $"Host '{host}' has invalid URI scheme: '{uri.Scheme}'.";
|
|
Console.WriteLine(msg);
|
|
throw new ArgumentException(msg);
|
|
}
|
|
|
|
_channel = GrpcChannel.ForAddress(uri, new GrpcChannelOptions { Credentials = grpcCredentials });
|
|
}
|
|
|
|
private void InitContainerClient()
|
|
{
|
|
_containerServiceClient = new ContainerService.ContainerServiceClient(_channel);
|
|
}
|
|
|
|
private void InitNetmapClient()
|
|
{
|
|
_netmapServiceClient = new NetmapService.NetmapServiceClient(_channel);
|
|
}
|
|
|
|
private void InitObjectClient()
|
|
{
|
|
_objectServiceClient = new ObjectService.ObjectServiceClient(_channel);
|
|
}
|
|
|
|
private void InitSessionClient()
|
|
{
|
|
_sessionServiceClient = new SessionService.SessionServiceClient(_channel);
|
|
}
|
|
} |