[#17] Client: Add extra parameter

API methods' parameters types with optional session, polling settings, xHeaders etc. and corresponding handlers have been added

Signed-off-by: Pavel Gross <p.gross@yadro.com>
This commit is contained in:
Pavel Gross 2024-07-18 15:08:53 +03:00 committed by p.gross
parent 00a1e9412f
commit 7b9c19f37c
42 changed files with 1054 additions and 386 deletions

View file

@ -2,6 +2,7 @@
using FrostFS.Netmap;
using FrostFS.Object;
using FrostFS.SDK.ClientV2.Interfaces;
using FrostFS.SDK.ClientV2.Parameters;
using FrostFS.SDK.Cryptography;
using FrostFS.SDK.ModelsV2;
using FrostFS.SDK.ModelsV2.Netmap;
@ -96,7 +97,8 @@ public class Client : IFrostFSClient
channel: channel,
version: new Version(2, 13));
CheckFrostFsVersionSupport();
// TODO: define timeout logic
CheckFrostFsVersionSupport(new Context { Timeout = TimeSpan.FromSeconds(20)});
}
public void Dispose()
@ -115,105 +117,106 @@ public class Client : IFrostFSClient
}
#region ContainerImplementation
public Task<ModelsV2.Container> GetContainerAsync(ContainerId containerId, Context? ctx = null)
public Task<ModelsV2.Container> GetContainerAsync(PrmGetContainer args)
{
var service = GetContainerService(ref ctx);
return service.GetContainerAsync(containerId, ctx!);
var service = GetContainerService(args);
return service.GetContainerAsync(args);
}
public IAsyncEnumerable<ContainerId> ListContainersAsync(Context? ctx = default)
public IAsyncEnumerable<ContainerId> ListContainersAsync(PrmListContainer? args = null)
{
var service = GetContainerService(ref ctx);
return service.ListContainersAsync(ctx!);
args = args ?? new PrmListContainer();
var service = GetContainerService(args);
return service.ListContainersAsync(args);
}
public Task<ContainerId> CreateContainerAsync(ModelsV2.Container container, Context? ctx = null)
public Task<ContainerId> CreateContainerAsync(PrmCreateContainer args)
{
var service = GetContainerService(ref ctx);
return service.CreateContainerAsync(container, ctx!);
var service = GetContainerService(args);
return service.CreateContainerAsync(args);
}
public Task DeleteContainerAsync(ContainerId containerId, Context? ctx = default)
public Task DeleteContainerAsync(PrmDeleteContainer args)
{
var service = GetContainerService(ref ctx);
return service.DeleteContainerAsync(containerId, ctx!);
var service = GetContainerService(args);
return service.DeleteContainerAsync(args);
}
#endregion
#region NetworkImplementation
public Task<NetmapSnapshot> GetNetmapSnapshotAsync(Context? ctx = default)
public Task<NetmapSnapshot> GetNetmapSnapshotAsync(PrmGetNetmapSnapshot? args)
{
var service = GetNetmapService(ref ctx);
return service.GetNetmapSnapshotAsync(ctx!);
args ??= new PrmGetNetmapSnapshot();
var service = GetNetmapService(args);
return service.GetNetmapSnapshotAsync(args);
}
public Task<ModelsV2.Netmap.NodeInfo> GetNodeInfoAsync(Context? ctx = default)
public Task<ModelsV2.Netmap.NodeInfo> GetNodeInfoAsync(PrmGetNodeInfo? args)
{
var service = GetNetmapService(ref ctx);
return service.GetLocalNodeInfoAsync(ctx!);
args ??= new PrmGetNodeInfo();
var service = GetNetmapService(args);
return service.GetLocalNodeInfoAsync(args);
}
public Task<NetworkSettings> GetNetworkSettingsAsync(Context? ctx = default)
{
var service = GetNetmapService(ref ctx);
return service.GetNetworkSettingsAsync(ctx!);
public Task<NetworkSettings> GetNetworkSettingsAsync(PrmGetNetworkSettings? args)
{
args ??= new PrmGetNetworkSettings();
var service = GetNetmapService(args);
return service.GetNetworkSettingsAsync(args.Context!);
}
#endregion
#region ObjectImplementation
public Task<ObjectHeader> GetObjectHeadAsync(ContainerId containerId, ObjectId objectId, Context? ctx = default)
public Task<ObjectHeader> GetObjectHeadAsync(PrmGetObjectHead args)
{
var service = GetObjectService(ref ctx);
return service.GetObjectHeadAsync(containerId, objectId, ctx!);
var service = GetObjectService(args);
return service.GetObjectHeadAsync(args);
}
public Task<FrostFsObject> GetObjectAsync(ContainerId containerId, ObjectId objectId, Context? ctx = default)
public Task<FrostFsObject> GetObjectAsync(PrmGetObject args)
{
var service = GetObjectService(ref ctx);
return service.GetObjectAsync(containerId, objectId, ctx!);
var service = GetObjectService(args);
return service.GetObjectAsync(args);
}
public Task<ObjectId> PutObjectAsync(PutObjectParameters putObjectParameters, Context? ctx = default)
public Task<ObjectId> PutObjectAsync(PrmPutObject args)
{
var service = GetObjectService(ref ctx);
return service.PutObjectAsync(putObjectParameters, ctx!);
var service = GetObjectService(args);
return service.PutObjectAsync(args);
}
public Task<ObjectId> PutSingleObjectAsync(FrostFsObject obj, Context? ctx = default)
public Task<ObjectId> PutSingleObjectAsync(PrmPutSingleObject args)
{
var service = GetObjectService(ref ctx);
return service.PutSingleObjectAsync(obj, ctx!);
var service = GetObjectService(args);
return service.PutSingleObjectAsync(args);
}
public Task DeleteObjectAsync(ContainerId containerId, ObjectId objectId, Context? ctx = default)
public Task DeleteObjectAsync(PrmDeleteObject args)
{
var service = GetObjectService(ref ctx);
return service.DeleteObjectAsync(containerId, objectId, ctx!);
var service = GetObjectService(args);
return service.DeleteObjectAsync(args);
}
public IAsyncEnumerable<ObjectId> SearchObjectsAsync(
ContainerId containerId,
IEnumerable<ObjectFilter> filters,
Context? ctx = default)
public IAsyncEnumerable<ObjectId> SearchObjectsAsync(PrmSearchObject args)
{
var service = GetObjectService(ref ctx);
return service.SearchObjectsAsync(containerId, filters, ctx!);
var service = GetObjectService(args);
return service.SearchObjectsAsync(args);
}
#endregion
#region SessionImplementation
public async Task<ModelsV2.SessionToken> CreateSessionAsync(ulong expiration, Context? ctx = null)
public async Task<ModelsV2.SessionToken> CreateSessionAsync(PrmCreateSession args)
{
var session = await CreateSessionInternalAsync(expiration, ctx);
var session = await CreateSessionInternalAsync(args);
var token = session.Serialize();
return new ModelsV2.SessionToken([], token);
return new ModelsV2.SessionToken(token);
}
public Task<Session.SessionToken> CreateSessionInternalAsync(ulong expiration, Context? ctx = null)
internal Task<Session.SessionToken> CreateSessionInternalAsync(PrmCreateSession args)
{
var service = GetSessionService(ref ctx);
return service.CreateSessionAsync(expiration, ctx!);
var service = GetSessionService(args);
return service.CreateSessionAsync(args);
}
#endregion
@ -226,8 +229,9 @@ public class Client : IFrostFSClient
private async void CheckFrostFsVersionSupport(Context? ctx = default)
{
var service = GetNetmapService(ref ctx);
var localNodeInfo = await service.GetLocalNodeInfoAsync(ctx!);
var args = new PrmGetNodeInfo(ctx);
var service = GetNetmapService(args);
var localNodeInfo = await service.GetLocalNodeInfoAsync(args);
if (!localNodeInfo.Version.IsSupported(ClientCtx.Version))
{
@ -237,24 +241,24 @@ public class Client : IFrostFSClient
}
}
private CallInvoker? SetupEnvironment(ref Context? ctx)
private CallInvoker? SetupEnvironment(IContext ctx)
{
if (isDisposed)
throw new Exception("Client is disposed.");
ctx ??= new Context();
ctx.Context ??= new Context();
CallInvoker? callInvoker = null;
if (ctx.Interceptors != null && ctx.Interceptors.Count > 0)
if (ctx.Context.Interceptors != null && ctx.Context.Interceptors.Count > 0)
{
foreach (var interceptor in ctx.Interceptors)
foreach (var interceptor in ctx.Context.Interceptors)
{
callInvoker = AddInvoker(callInvoker, interceptor);
}
}
if (ctx.Callback != null)
callInvoker = AddInvoker(callInvoker, new MetricsInterceptor(ctx.Callback));
if (ctx.Context.Callback != null)
callInvoker = AddInvoker(callInvoker, new MetricsInterceptor(ctx.Context.Callback));
return callInvoker;
@ -269,9 +273,9 @@ public class Client : IFrostFSClient
}
}
private NetmapServiceProvider GetNetmapService(ref Context? ctx)
private NetmapServiceProvider GetNetmapService(IContext ctx)
{
var callInvoker = SetupEnvironment(ref ctx);
var callInvoker = SetupEnvironment(ctx);
var client = NetmapServiceClient ?? (callInvoker != null
? new NetmapService.NetmapServiceClient(callInvoker)
: new NetmapService.NetmapServiceClient(ClientCtx.Channel));
@ -279,9 +283,9 @@ public class Client : IFrostFSClient
return new NetmapServiceProvider(client, ClientCtx);
}
private SessionServiceProvider GetSessionService(ref Context? ctx)
private SessionServiceProvider GetSessionService(IContext ctx)
{
var callInvoker = SetupEnvironment(ref ctx);
var callInvoker = SetupEnvironment(ctx);
var client = SessionServiceClient ?? (callInvoker != null
? new SessionService.SessionServiceClient(callInvoker)
: new SessionService.SessionServiceClient(ClientCtx.Channel));
@ -289,9 +293,9 @@ public class Client : IFrostFSClient
return new SessionServiceProvider(client, ClientCtx);
}
private ContainerServiceProvider GetContainerService(ref Context? ctx)
private ContainerServiceProvider GetContainerService(IContext ctx)
{
var callInvoker = SetupEnvironment(ref ctx);
var callInvoker = SetupEnvironment(ctx);
var client = ContainerServiceClient ?? (callInvoker != null
? new ContainerService.ContainerServiceClient(callInvoker)
: new ContainerService.ContainerServiceClient(ClientCtx.Channel));
@ -299,9 +303,9 @@ public class Client : IFrostFSClient
return new ContainerServiceProvider(client, ClientCtx);
}
private ObjectServiceProvider GetObjectService(ref Context? ctx)
private ObjectServiceProvider GetObjectService(IContext ctx)
{
var callInvoker = SetupEnvironment(ref ctx);
var callInvoker = SetupEnvironment(ctx);
var client = ObjectServiceClient ?? (callInvoker != null
? new ObjectService.ObjectServiceClient(callInvoker)
: new ObjectService.ObjectServiceClient(ClientCtx.Channel));