diff --git a/src/FrostFS.SDK.ClientV2/Client.cs b/src/FrostFS.SDK.ClientV2/Client.cs index 6d47be5..8209571 100644 --- a/src/FrostFS.SDK.ClientV2/Client.cs +++ b/src/FrostFS.SDK.ClientV2/Client.cs @@ -7,7 +7,6 @@ using FrostFS.Container; using FrostFS.Netmap; using FrostFS.Object; using FrostFS.SDK.ClientV2.Interfaces; -using FrostFS.SDK.ClientV2; using FrostFS.SDK.Cryptography; using FrostFS.Session; @@ -16,6 +15,8 @@ using Grpc.Core.Interceptors; using Grpc.Net.Client; using Microsoft.Extensions.Options; +using Frostfs.V2.Apemanager; +using Frostfs.V2.Ape; namespace FrostFS.SDK.ClientV2; @@ -24,8 +25,13 @@ public class Client : IFrostFSClient private bool isDisposed; internal ContainerService.ContainerServiceClient? ContainerServiceClient { get; set; } + internal NetmapService.NetmapServiceClient? NetmapServiceClient { get; set; } + + internal APEManagerService.APEManagerServiceClient? ApeManagerServiceClient { get; set; } + internal SessionService.SessionServiceClient? SessionServiceClient { get; set; } + internal ObjectService.ObjectServiceClient? ObjectServiceClient { get; set; } internal ClientEnvironment ClientCtx { get; set; } @@ -140,6 +146,26 @@ public class Client : IFrostFSClient } } + #region ApeManagerImplementation + public Task AddChainAsync(PrmApeChainAdd args) + { + var service = GetApeManagerService(args); + return service.AddChainAsync(args); + } + + public Task RemoveChainAsync(PrmApeChainRemove args) + { + var service = GetApeManagerService(args); + return service.RemoveChainAsync(args); + } + + public Task ListChainAsync(PrmApeChainList args) + { + var service = GetApeManagerService(args); + return service.ListChainAsync(args); + } + #endregion + #region ContainerImplementation public Task GetContainerAsync(PrmContainerGet args) { @@ -344,6 +370,16 @@ public class Client : IFrostFSClient return new SessionServiceProvider(client, ClientCtx); } + private ApeManagerServiceProvider GetApeManagerService(IContext ctx) + { + var callInvoker = SetupEnvironment(ctx); + var client = ApeManagerServiceClient ?? (callInvoker != null + ? new APEManagerService.APEManagerServiceClient(callInvoker) + : new APEManagerService.APEManagerServiceClient(ClientCtx.Channel)); + + return new ApeManagerServiceProvider(client, ClientCtx); + } + private ContainerServiceProvider GetContainerService(IContext ctx) { var callInvoker = SetupEnvironment(ctx); diff --git a/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs b/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs index 80608d0..a580149 100644 --- a/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs +++ b/src/FrostFS.SDK.ClientV2/Interfaces/IFrostFSClient.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using FrostFS.SDK.ClientV2; +using Frostfs.V2.Ape; namespace FrostFS.SDK.ClientV2.Interfaces; public interface IFrostFSClient : IDisposable @@ -19,6 +19,14 @@ public interface IFrostFSClient : IDisposable Task CreateSessionAsync(PrmSessionCreate args); #endregion + #region ApeMAnager + Task AddChainAsync(PrmApeChainAdd args); + + Task RemoveChainAsync(PrmApeChainRemove args); + + Task ListChainAsync(PrmApeChainList args); + #endregion + #region Container Task GetContainerAsync(PrmContainerGet args); diff --git a/src/FrostFS.SDK.ClientV2/Models/Chain/ChainTarget.cs b/src/FrostFS.SDK.ClientV2/Models/Chain/ChainTarget.cs new file mode 100644 index 0000000..0d47993 --- /dev/null +++ b/src/FrostFS.SDK.ClientV2/Models/Chain/ChainTarget.cs @@ -0,0 +1,37 @@ +using System; + +using Frostfs.V2.Ape; + +namespace FrostFS.SDK.ClientV2 +{ + public struct FrostFsChainTarget(FrostFsTargetType type, string name) + { + private ChainTarget? chainTarget; + + public FrostFsTargetType Type { get; } = type; + + public string Name { get; } = name; + + internal ChainTarget GetChainTarget() + { + return chainTarget ??= new ChainTarget + { + Type = GetTargetType(Type), + Name = Name + }; + } + + private static TargetType GetTargetType(FrostFsTargetType type) + { + return type switch + { + FrostFsTargetType.Undefined => TargetType.Undefined, + FrostFsTargetType.Namespace => TargetType.Namespace, + FrostFsTargetType.Container => TargetType.Container, + FrostFsTargetType.User => TargetType.User, + FrostFsTargetType.Group => TargetType.Group, + _ => throw new ArgumentException("Unexpected value for TargetType", nameof(type)), + }; + } + } +} diff --git a/src/FrostFS.SDK.ClientV2/Models/Chain/FrostFsChain.cs b/src/FrostFS.SDK.ClientV2/Models/Chain/FrostFsChain.cs new file mode 100644 index 0000000..0c21521 --- /dev/null +++ b/src/FrostFS.SDK.ClientV2/Models/Chain/FrostFsChain.cs @@ -0,0 +1,16 @@ +using Google.Protobuf; + +namespace FrostFS.SDK.ClientV2 +{ + public struct FrostFsChain (byte[] raw) + { + private ByteString? grpcRaw; + + public byte[] Raw { get; } = raw; + + internal ByteString GetRaw() + { + return grpcRaw ??= ByteString.CopyFrom(Raw); + } + } +} diff --git a/src/FrostFS.SDK.ClientV2/Models/Chain/FrostFsTargetType.cs b/src/FrostFS.SDK.ClientV2/Models/Chain/FrostFsTargetType.cs new file mode 100644 index 0000000..56617d3 --- /dev/null +++ b/src/FrostFS.SDK.ClientV2/Models/Chain/FrostFsTargetType.cs @@ -0,0 +1,11 @@ +namespace FrostFS.SDK.ClientV2 +{ + public enum FrostFsTargetType + { + Undefined = 0, + Namespace, + Container, + User, + Group + } +} diff --git a/src/FrostFS.SDK.ClientV2/Models/Containers/FrostFsContainerInfo.cs b/src/FrostFS.SDK.ClientV2/Models/Containers/FrostFsContainerInfo.cs index 4a4d140..74d0e41 100644 --- a/src/FrostFS.SDK.ClientV2/Models/Containers/FrostFsContainerInfo.cs +++ b/src/FrostFS.SDK.ClientV2/Models/Containers/FrostFsContainerInfo.cs @@ -12,7 +12,7 @@ namespace FrostFS.SDK; public class FrostFsContainerInfo { - private Container.Container.Types.Attribute[]? grpsAttributes; + private FrostFS.Container.Container.Types.Attribute[]? grpsAttributes; private List? attributes; private FrostFsPlacementPolicy? placementPolicy; private Guid? nonce; diff --git a/src/FrostFS.SDK.ClientV2/Parameters/PrmApeChainList.cs b/src/FrostFS.SDK.ClientV2/Parameters/PrmApeChainList.cs new file mode 100644 index 0000000..a68e788 --- /dev/null +++ b/src/FrostFS.SDK.ClientV2/Parameters/PrmApeChainList.cs @@ -0,0 +1,6 @@ +namespace FrostFS.SDK.ClientV2; + +public sealed class PrmApeChainList(FrostFsChainTarget target) : PrmBase +{ + public FrostFsChainTarget Target { get; } = target; +} diff --git a/src/FrostFS.SDK.ClientV2/Parameters/PrmApeChainRemove.cs b/src/FrostFS.SDK.ClientV2/Parameters/PrmApeChainRemove.cs new file mode 100644 index 0000000..9371b43 --- /dev/null +++ b/src/FrostFS.SDK.ClientV2/Parameters/PrmApeChainRemove.cs @@ -0,0 +1,8 @@ +namespace FrostFS.SDK.ClientV2; + +public sealed class PrmApeChainRemove(FrostFsChainTarget target, FrostFsChain chain) : PrmBase +{ + public FrostFsChainTarget Target { get; } = target; + + public FrostFsChain Chain { get; } = chain; +} diff --git a/src/FrostFS.SDK.ClientV2/Parameters/PrmApeRemoveAdd.cs b/src/FrostFS.SDK.ClientV2/Parameters/PrmApeRemoveAdd.cs new file mode 100644 index 0000000..330f601 --- /dev/null +++ b/src/FrostFS.SDK.ClientV2/Parameters/PrmApeRemoveAdd.cs @@ -0,0 +1,8 @@ +namespace FrostFS.SDK.ClientV2; + +public sealed class PrmApeChainAdd(FrostFsChainTarget target, FrostFsChain chain) : PrmBase +{ + public FrostFsChainTarget Target { get; } = target; + + public FrostFsChain Chain { get; } = chain; +} diff --git a/src/FrostFS.SDK.ClientV2/Services/ContainerServiceProvider.cs b/src/FrostFS.SDK.ClientV2/Services/ContainerServiceProvider.cs index d959a5c..1e0ef9b 100644 --- a/src/FrostFS.SDK.ClientV2/Services/ContainerServiceProvider.cs +++ b/src/FrostFS.SDK.ClientV2/Services/ContainerServiceProvider.cs @@ -7,7 +7,6 @@ using FrostFS.SDK.ClientV2; using FrostFS.Container; using FrostFS.SDK.ClientV2.Mappers.GRPC; using FrostFS.SDK.Cryptography; -using FrostFS.SDK.ClientV2; using FrostFS.Refs; using FrostFS.Session; diff --git a/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs b/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs index 98523ac..d932dfb 100644 --- a/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs +++ b/src/FrostFS.SDK.ClientV2/Services/NetmapServiceProvider.cs @@ -3,7 +3,6 @@ using System.Text; using System.Threading.Tasks; using FrostFS.Netmap; -using FrostFS.SDK.ClientV2; using static FrostFS.Netmap.NetworkConfig.Types; diff --git a/src/FrostFS.SDK.ClientV2/Services/Shared/ApeManagerServiceProvider.cs b/src/FrostFS.SDK.ClientV2/Services/Shared/ApeManagerServiceProvider.cs new file mode 100644 index 0000000..596d79e --- /dev/null +++ b/src/FrostFS.SDK.ClientV2/Services/Shared/ApeManagerServiceProvider.cs @@ -0,0 +1,81 @@ +using System.Threading.Tasks; + +using Frostfs.V2.Ape; +using Frostfs.V2.Apemanager; + +namespace FrostFS.SDK.ClientV2; + +internal class ApeManagerServiceProvider : ContextAccessor +{ + private readonly APEManagerService.APEManagerServiceClient? _apeManagerServiceClient; + + internal ApeManagerServiceProvider(APEManagerService.APEManagerServiceClient? apeManagerServiceClient, ClientEnvironment context) + : base (context) + { + _apeManagerServiceClient = apeManagerServiceClient; + } + + internal async Task AddChainAsync(PrmApeChainAdd args) + { + var ctx = args.Context!; + + AddChainRequest request = new() + { + Body = new() + { + Chain = new () { Raw = args.Chain.GetRaw() }, + Target = args.Target.GetChainTarget() + } + }; + + request.AddMetaHeader(args.XHeaders); + request.Sign(ctx.Key); + + var response = await _apeManagerServiceClient!.AddChainAsync(request, null, ctx.Deadline, ctx.CancellationToken); + + Verifier.CheckResponse(response); + + return response.Body.ChainId.ToByteArray(); + } + + internal async Task RemoveChainAsync(PrmApeChainRemove args) + { + var ctx = args.Context!; + RemoveChainRequest request = new() + { + Body = new() + { + ChainId = args.Chain.GetRaw(), + Target = args.Target.GetChainTarget() + } + }; + + request.AddMetaHeader(args.XHeaders); + request.Sign(ctx.Key); + + var response = await _apeManagerServiceClient!.RemoveChainAsync(request, null, ctx.Deadline, ctx.CancellationToken); + + Verifier.CheckResponse(response); + } + + internal async Task ListChainAsync(PrmApeChainList args) + { + var ctx = args.Context!; + ListChainsRequest request = new() + { + Body = new() + { + Target = args.Target.GetChainTarget() + } + }; + + request.AddMetaHeader(args.XHeaders); + request.Sign(ctx.Key); + + var response = await _apeManagerServiceClient!.ListChainsAsync(request, null, ctx.Deadline, ctx.CancellationToken); + + Verifier.CheckResponse(response); + + return [.. response.Body.Chains]; + } +} \ No newline at end of file diff --git a/src/FrostFS.SDK.ClientV2/Services/Shared/SessionProvider.cs b/src/FrostFS.SDK.ClientV2/Services/Shared/SessionProvider.cs index d1cc432..9e5b142 100644 --- a/src/FrostFS.SDK.ClientV2/Services/Shared/SessionProvider.cs +++ b/src/FrostFS.SDK.ClientV2/Services/Shared/SessionProvider.cs @@ -1,7 +1,5 @@ using System.Threading.Tasks; -using FrostFS.SDK.ClientV2; - namespace FrostFS.SDK.ClientV2; internal interface ISessionProvider diff --git a/src/FrostFS.SDK.ProtosV2/FrostFS.SDK.ProtosV2.csproj b/src/FrostFS.SDK.ProtosV2/FrostFS.SDK.ProtosV2.csproj index 0a28822..093351c 100644 --- a/src/FrostFS.SDK.ProtosV2/FrostFS.SDK.ProtosV2.csproj +++ b/src/FrostFS.SDK.ProtosV2/FrostFS.SDK.ProtosV2.csproj @@ -17,12 +17,12 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/src/FrostFS.SDK.ProtosV2/apemanager/types.proto b/src/FrostFS.SDK.ProtosV2/ape/types.proto similarity index 86% rename from src/FrostFS.SDK.ProtosV2/apemanager/types.proto rename to src/FrostFS.SDK.ProtosV2/ape/types.proto index c064627..71468c3 100644 --- a/src/FrostFS.SDK.ProtosV2/apemanager/types.proto +++ b/src/FrostFS.SDK.ProtosV2/ape/types.proto @@ -1,8 +1,8 @@ -syntax = "proto3"; +syntax = "proto3"; -package frostfs.v2.apemanager; +package frostfs.v2.ape; -option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager/grpc;apemanager"; +option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc;ape"; // TargetType is a type target to which a rule chain is defined. enum TargetType { diff --git a/src/FrostFS.SDK.ProtosV2/apemanager/Extension.Message.cs b/src/FrostFS.SDK.ProtosV2/apemanager/Extension.Message.cs new file mode 100644 index 0000000..1f02ea5 --- /dev/null +++ b/src/FrostFS.SDK.ProtosV2/apemanager/Extension.Message.cs @@ -0,0 +1,174 @@ +using Google.Protobuf; + +using FrostFS.Session; +using FrostFS.SDK.ProtosV2.Interfaces; + +namespace Frostfs.V2.Apemanager; + +public partial class AddChainRequest : IRequest +{ + IMetaHeader IVerifiableMessage.GetMetaHeader() + { + return MetaHeader; + } + + IVerificationHeader IVerifiableMessage.GetVerificationHeader() + { + return VerifyHeader; + } + + void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) + { + MetaHeader = (RequestMetaHeader)metaHeader; + } + + void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) + { + VerifyHeader = (RequestVerificationHeader)verificationHeader; + } + + public IMessage GetBody() + { + return Body; + } +} + +public partial class AddChainResponse : IResponse +{ + IMetaHeader IVerifiableMessage.GetMetaHeader() + { + return MetaHeader; + } + + IVerificationHeader IVerifiableMessage.GetVerificationHeader() + { + return VerifyHeader; + } + + void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) + { + MetaHeader = (ResponseMetaHeader)metaHeader; + } + + void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) + { + VerifyHeader = (ResponseVerificationHeader)verificationHeader; + } + + public IMessage GetBody() + { + return Body; + } +} + +public partial class RemoveChainRequest : IRequest +{ + IMetaHeader IVerifiableMessage.GetMetaHeader() + { + return MetaHeader; + } + + IVerificationHeader IVerifiableMessage.GetVerificationHeader() + { + return VerifyHeader; + } + + void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) + { + MetaHeader = (RequestMetaHeader)metaHeader; + } + + void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) + { + VerifyHeader = (RequestVerificationHeader)verificationHeader; + } + + public IMessage GetBody() + { + return Body; + } +} + +public partial class RemoveChainResponse : IResponse +{ + IMetaHeader IVerifiableMessage.GetMetaHeader() + { + return MetaHeader; + } + + IVerificationHeader IVerifiableMessage.GetVerificationHeader() + { + return VerifyHeader; + } + + void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) + { + MetaHeader = (ResponseMetaHeader)metaHeader; + } + + void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) + { + VerifyHeader = (ResponseVerificationHeader)verificationHeader; + } + + public IMessage GetBody() + { + return Body; + } +} + +public partial class ListChainsRequest : IRequest +{ + IMetaHeader IVerifiableMessage.GetMetaHeader() + { + return MetaHeader; + } + + IVerificationHeader IVerifiableMessage.GetVerificationHeader() + { + return VerifyHeader; + } + + void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) + { + MetaHeader = (RequestMetaHeader)metaHeader; + } + + void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) + { + VerifyHeader = (RequestVerificationHeader)verificationHeader; + } + + public IMessage GetBody() + { + return Body; + } +} + +public partial class ListChainsResponse : IResponse +{ + IMetaHeader IVerifiableMessage.GetMetaHeader() + { + return MetaHeader; + } + + IVerificationHeader IVerifiableMessage.GetVerificationHeader() + { + return VerifyHeader; + } + + void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) + { + MetaHeader = (ResponseMetaHeader)metaHeader; + } + + void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) + { + VerifyHeader = (ResponseVerificationHeader)verificationHeader; + } + + public IMessage GetBody() + { + return Body; + } +} diff --git a/src/FrostFS.SDK.ProtosV2/apemanager/service.proto b/src/FrostFS.SDK.ProtosV2/apemanager/service.proto index 6b9da60..166ba4d 100644 --- a/src/FrostFS.SDK.ProtosV2/apemanager/service.proto +++ b/src/FrostFS.SDK.ProtosV2/apemanager/service.proto @@ -2,7 +2,7 @@ syntax = "proto3"; package frostfs.v2.apemanager; -import "apemanager/types.proto"; +import "ape/types.proto"; import "session/types.proto"; option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager/grpc;apemanager"; @@ -52,10 +52,10 @@ service APEManagerService { message AddChainRequest { message Body { // A target for which a rule chain is added. - ChainTarget target = 1; + frostfs.v2.ape.ChainTarget target = 1; // The chain to set for the target. - Chain chain = 2; + frostfs.v2.ape.Chain chain = 2; } // The request's body. @@ -95,7 +95,7 @@ message AddChainResponse { message RemoveChainRequest { message Body { // Target for which a rule chain is removed. - ChainTarget target = 1; + frostfs.v2.ape.ChainTarget target = 1; // Chain ID assigned for the rule chain. bytes chain_id = 2; @@ -135,7 +135,7 @@ message RemoveChainResponse { message ListChainsRequest { message Body { // Target for which rule chains are listed. - ChainTarget target = 1; + frostfs.v2.ape.ChainTarget target = 1; } // The request's body. @@ -154,7 +154,7 @@ message ListChainsRequest { message ListChainsResponse { message Body { // The list of chains defined for the reqeusted target. - repeated Chain chains = 1; + repeated frostfs.v2.ape.Chain chains = 1; } // The response's body. @@ -168,4 +168,4 @@ message ListChainsResponse { // authenticate the nodes of the message route and check the correctness of // transmission. neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; -} \ No newline at end of file +} diff --git a/src/FrostFS.SDK.ProtosV2/container/Extension.Message.cs b/src/FrostFS.SDK.ProtosV2/container/Extension.Message.cs index 5d48399..0b876f0 100644 --- a/src/FrostFS.SDK.ProtosV2/container/Extension.Message.cs +++ b/src/FrostFS.SDK.ProtosV2/container/Extension.Message.cs @@ -5,62 +5,6 @@ using FrostFS.SDK.ProtosV2.Interfaces; namespace FrostFS.Container; -public partial class AnnounceUsedSpaceRequest : IRequest -{ - IMetaHeader IVerifiableMessage.GetMetaHeader() - { - return MetaHeader; - } - - IVerificationHeader IVerifiableMessage.GetVerificationHeader() - { - return VerifyHeader; - } - - void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) - { - MetaHeader = (RequestMetaHeader)metaHeader; - } - - void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) - { - VerifyHeader = (RequestVerificationHeader)verificationHeader; - } - - public IMessage GetBody() - { - return Body; - } -} - -public partial class AnnounceUsedSpaceResponse : IResponse -{ - IMetaHeader IVerifiableMessage.GetMetaHeader() - { - return MetaHeader; - } - - IVerificationHeader IVerifiableMessage.GetVerificationHeader() - { - return VerifyHeader; - } - - void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) - { - MetaHeader = (ResponseMetaHeader)metaHeader; - } - - void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) - { - VerifyHeader = (ResponseVerificationHeader)verificationHeader; - } - - public IMessage GetBody() - { - return Body; - } -} - public partial class GetRequest : IRequest { IMetaHeader IVerifiableMessage.GetMetaHeader() @@ -284,115 +228,3 @@ public partial class ListResponse : IResponse return Body; } } - -public partial class SetExtendedACLRequest : IRequest -{ - IMetaHeader IVerifiableMessage.GetMetaHeader() - { - return MetaHeader; - } - - IVerificationHeader IVerifiableMessage.GetVerificationHeader() - { - return VerifyHeader; - } - - void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) - { - MetaHeader = (RequestMetaHeader)metaHeader; - } - - void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) - { - VerifyHeader = (RequestVerificationHeader)verificationHeader; - } - - public IMessage GetBody() - { - return Body; - } -} - -public partial class SetExtendedACLResponse : IResponse -{ - IMetaHeader IVerifiableMessage.GetMetaHeader() - { - return MetaHeader; - } - - IVerificationHeader IVerifiableMessage.GetVerificationHeader() - { - return VerifyHeader; - } - - void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) - { - MetaHeader = (ResponseMetaHeader)metaHeader; - } - - void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) - { - VerifyHeader = (ResponseVerificationHeader)verificationHeader; - } - - public IMessage GetBody() - { - return Body; - } -} - -public partial class GetExtendedACLRequest : IRequest -{ - IMetaHeader IVerifiableMessage.GetMetaHeader() - { - return MetaHeader; - } - - IVerificationHeader IVerifiableMessage.GetVerificationHeader() - { - return VerifyHeader; - } - - void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) - { - MetaHeader = (RequestMetaHeader)metaHeader; - } - - void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) - { - VerifyHeader = (RequestVerificationHeader)verificationHeader; - } - - public IMessage GetBody() - { - return Body; - } -} - -public partial class GetExtendedACLResponse : IResponse -{ - IMetaHeader IVerifiableMessage.GetMetaHeader() - { - return MetaHeader; - } - - IVerificationHeader IVerifiableMessage.GetVerificationHeader() - { - return VerifyHeader; - } - - void IVerifiableMessage.SetMetaHeader(IMetaHeader metaHeader) - { - MetaHeader = (ResponseMetaHeader)metaHeader; - } - - void IVerifiableMessage.SetVerificationHeader(IVerificationHeader verificationHeader) - { - VerifyHeader = (ResponseVerificationHeader)verificationHeader; - } - - public IMessage GetBody() - { - return Body; - } -} diff --git a/src/FrostFS.SDK.ProtosV2/container/service.proto b/src/FrostFS.SDK.ProtosV2/container/service.proto index 4a5cc02..abf3e9d 100644 --- a/src/FrostFS.SDK.ProtosV2/container/service.proto +++ b/src/FrostFS.SDK.ProtosV2/container/service.proto @@ -11,8 +11,8 @@ import "refs/types.proto"; import "session/types.proto"; // `ContainerService` provides API to interact with `Container` smart contract -// in NeoFS sidechain via other NeoFS nodes. All of those actions can be done -// equivalently by directly issuing transactions and RPC calls to sidechain +// in FrostFS sidechain via other FrostFS nodes. All of those actions can be +// done equivalently by directly issuing transactions and RPC calls to sidechain // nodes. service ContainerService { // `Put` invokes `Container` smart contract's `Put` method and returns @@ -25,7 +25,7 @@ service ContainerService { // request to save the container has been sent to the sidechain; // - Common failures (SECTION_FAILURE_COMMON); // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // container create access denied. + // container create access denied. rpc Put(PutRequest) returns (PutResponse); // `Delete` invokes `Container` smart contract's `Delete` method and returns @@ -38,7 +38,7 @@ service ContainerService { // request to remove the container has been sent to the sidechain; // - Common failures (SECTION_FAILURE_COMMON); // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // container delete access denied. + // container delete access denied. rpc Delete(DeleteRequest) returns (DeleteResponse); // Returns container structure from `Container` smart contract storage. @@ -50,7 +50,7 @@ service ContainerService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // requested container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied. + // access to container is denied. rpc Get(GetRequest) returns (GetResponse); // Returns all owner's containers from 'Container` smart contract' storage. @@ -60,47 +60,11 @@ service ContainerService { // container list has been successfully read; // - Common failures (SECTION_FAILURE_COMMON); // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // container list access denied. + // container list access denied. rpc List(ListRequest) returns (ListResponse); - - // Invokes 'SetEACL' method of 'Container` smart contract and returns response - // immediately. After one more block in sidechain, changes in an Extended ACL - // are added into smart contract storage. - // - // Statuses: - // - **OK** (0, SECTION_SUCCESS): \ - // request to save container eACL has been sent to the sidechain; - // - Common failures (SECTION_FAILURE_COMMON); - // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // set container eACL access denied. - rpc SetExtendedACL(SetExtendedACLRequest) returns (SetExtendedACLResponse); - - // Returns Extended ACL table and signature from `Container` smart contract - // storage. - // - // Statuses: - // - **OK** (0, SECTION_SUCCESS): \ - // container eACL has been successfully read; - // - Common failures (SECTION_FAILURE_COMMON); - // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ - // container not found; - // - **EACL_NOT_FOUND** (3073, SECTION_CONTAINER): \ - // eACL table not found; - // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container eACL is denied. - rpc GetExtendedACL(GetExtendedACLRequest) returns (GetExtendedACLResponse); - - // Announces the space values used by the container for P2P synchronization. - // - // Statuses: - // - **OK** (0, SECTION_SUCCESS): \ - // estimation of used space has been successfully announced; - // - Common failures (SECTION_FAILURE_COMMON). - rpc AnnounceUsedSpace(AnnounceUsedSpaceRequest) - returns (AnnounceUsedSpaceResponse); } -// New NeoFS Container creation request +// New FrostFS Container creation request message PutRequest { // Container creation request has container structure's signature as a // separate field. It's not stored in sidechain, just verified on container @@ -108,7 +72,7 @@ message PutRequest { // the stable-marshalled container strucutre, hence there is no need for // additional signature checks. message Body { - // Container structure to register in NeoFS + // Container structure to register in FrostFS container.Container container = 1; // Signature of a stable-marshalled container according to RFC-6979. @@ -127,7 +91,7 @@ message PutRequest { neo.fs.v2.session.RequestVerificationHeader verify_header = 3; } -// New NeoFS Container creation response +// New FrostFS Container creation response message PutResponse { // Container put response body contains information about the newly registered // container as seen by `Container` smart contract. `ContainerID` can be @@ -156,7 +120,7 @@ message DeleteRequest { // the container owner's intent. The signature will be verified by `Container` // smart contract, so signing algorithm must be supported by NeoVM. message Body { - // Identifier of the container to delete from NeoFS + // Identifier of the container to delete from FrostFS neo.fs.v2.refs.ContainerID container_id = 1; // `ContainerID` signed with the container owner's key according to @@ -282,150 +246,3 @@ message ListResponse { // transmission. neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; } - -// Set Extended ACL -message SetExtendedACLRequest { - // Set Extended ACL request body does not have separate `ContainerID` - // reference. It will be taken from `EACLTable.container_id` field. - message Body { - // Extended ACL table to set for the container - neo.fs.v2.acl.EACLTable eacl = 1; - - // Signature of stable-marshalled Extended ACL table according to RFC-6979. - neo.fs.v2.refs.SignatureRFC6979 signature = 2; - } - // Body of set extended acl request message. - Body body = 1; - - // Carries request meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.RequestMetaHeader meta_header = 2; - - // Carries request verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.RequestVerificationHeader verify_header = 3; -} - -// Set Extended ACL -message SetExtendedACLResponse { - // `SetExtendedACLResponse` has an empty body because the operation is - // asynchronous and the update should be reflected in `Container` smart - // contract's storage after next block is issued in sidechain. - message Body {} - - // Body of set extended acl response message. - Body body = 1; - - // Carries response meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.ResponseMetaHeader meta_header = 2; - - // Carries response verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; -} - -// Get Extended ACL -message GetExtendedACLRequest { - // Get Extended ACL request body - message Body { - // Identifier of the container having Extended ACL - neo.fs.v2.refs.ContainerID container_id = 1; - } - - // Body of get extended acl request message. - Body body = 1; - - // Carries request meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.RequestMetaHeader meta_header = 2; - - // Carries request verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.RequestVerificationHeader verify_header = 3; -} - -// Get Extended ACL -message GetExtendedACLResponse { - // Get Extended ACL Response body can be empty if the requested container does - // not have Extended ACL Table attached or Extended ACL has not been allowed - // at the time of container creation. - message Body { - // Extended ACL requested, if available - neo.fs.v2.acl.EACLTable eacl = 1; - - // Signature of stable-marshalled Extended ACL according to RFC-6979. - neo.fs.v2.refs.SignatureRFC6979 signature = 2; - - // Session token if Extended ACL was set within a session - neo.fs.v2.session.SessionToken session_token = 3; - } - // Body of get extended acl response message. - Body body = 1; - - // Carries response meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.ResponseMetaHeader meta_header = 2; - - // Carries response verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; -} - -// Announce container used space -message AnnounceUsedSpaceRequest { - // Container used space announcement body. - message Body { - // Announcement contains used space information for a single container. - message Announcement { - // Epoch number for which the container size estimation was produced. - uint64 epoch = 1; - - // Identifier of the container. - neo.fs.v2.refs.ContainerID container_id = 2; - - // Used space is a sum of object payload sizes of a specified - // container, stored in the node. It must not include inhumed objects. - uint64 used_space = 3; - } - - // List of announcements. If nodes share several containers, - // announcements are transferred in a batch. - repeated Announcement announcements = 1; - } - - // Body of announce used space request message. - Body body = 1; - - // Carries request meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.RequestMetaHeader meta_header = 2; - - // Carries request verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.RequestVerificationHeader verify_header = 3; -} - -// Announce container used space -message AnnounceUsedSpaceResponse { - // `AnnounceUsedSpaceResponse` has an empty body because announcements are - // one way communication. - message Body {} - - // Body of announce used space response message. - Body body = 1; - - // Carries response meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.ResponseMetaHeader meta_header = 2; - - // Carries response verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; -} diff --git a/src/FrostFS.SDK.ProtosV2/container/types.proto b/src/FrostFS.SDK.ProtosV2/container/types.proto index 075081a..c657d1c 100644 --- a/src/FrostFS.SDK.ProtosV2/container/types.proto +++ b/src/FrostFS.SDK.ProtosV2/container/types.proto @@ -50,7 +50,7 @@ message Container { // (`__NEOFS__DISABLE_HOMOMORPHIC_HASHING` is deprecated) \ // Disables homomorphic hashing for the container if the value equals "true" // string. Any other values are interpreted as missing attribute. Container - // could be accepted in a NeoFS network only if the global network hashing + // could be accepted in a FrostFS network only if the global network hashing // configuration value corresponds with that attribute's value. After // container inclusion, network setting is ignored. // diff --git a/src/FrostFS.SDK.Tests/SmokeTestsBase.cs b/src/FrostFS.SDK.Tests/SmokeTestsBase.cs index 60e4a20..45f3460 100644 --- a/src/FrostFS.SDK.Tests/SmokeTestsBase.cs +++ b/src/FrostFS.SDK.Tests/SmokeTestsBase.cs @@ -7,7 +7,7 @@ namespace FrostFS.SDK.SmokeTests; public abstract class SmokeTestsBase { - protected readonly string key = "KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq"; + protected readonly string key = "KzPXA6669m2pf18XmUdoR8MnP1pi1PMmefiFujStVFnv7WR5SRmK"; protected readonly string url = "http://172.23.32.4:8080"; protected ECDsa Key { get; }