WIP: C# implementation of FrostFS SDK
Find a file
Pavel Gross c9a75ea025 [#24] Client: Implement pool part1
first iteration - base classes and methods

Signed-off-by: Pavel Gross <p.gross@yadro.com>
2024-10-21 10:48:00 +03:00
.forgejo/workflows Add empty repo 2024-04-24 14:59:21 +03:00
src [#24] Client: Implement pool part1 2024-10-21 10:48:00 +03:00
.editorconfig [#13] Client: Use code analyzers 2024-09-23 19:25:59 +03:00
.gitignore [#11] Add Network Snapshot 2024-06-26 12:29:33 +03:00
FrostFS.SDK.sln [#13] Client: Use code analyzers 2024-09-23 19:25:59 +03:00
LICENSE Initial commit 2024-04-24 09:46:03 +00:00
README.md [#23] Client: Refactoring to optimize memory usage 2024-09-12 11:56:26 +03:00

frostfs-sdk-csharp

C# implementation of FrostFS SDK.

Prerequisites

Get the key for your wallet

  1. Get the address
cat <path_to_your_wallet> | jq .accounts[0].address | tr -d '"'
  1. Get the key
neo-go wallet export -w <path_to_your_wallet> -d <address_from_p1>

Example usage

Container

using FrostFS.SDK;
using FrostFS.SDK.ClientV2;

using Microsoft.Extensions.Options;

var Key = "KwHDAJ66o8FoLBjVbjP2sWBmgBMGjt7Vv4boA7xQrBoAYBE397Aq";
var Host = "http://172.22.33.44:8080";

var options = Options.Create(new SingleOwnerClientSettings
{
    Key = Key,
    Host = Host
});

using var client = Client.GetSingleOwnerInstance(options);

await foreach (var cid in client.ListContainersAsync())
{
    await client.DeleteContainerAsync(new PrmContainerDelete(cid));
}

var placementPolicy = new FrostFsPlacementPolicy(true, new FrostFsReplica(1));

var createContainerParam = new PrmContainerCreate(
    new FrostFsContainerInfo(BasicAcl.PublicRW, new FrostFsPlacementPolicy(true, new FrostFsReplica(1))));

var containerId = await client.CreateContainerAsync(createContainerParam);

using var fileStream = File.OpenRead(@"C:\Users\Paul\Pictures\cat.jpeg");

var param = new PrmObjectPut
{
    Header = new FrostFsObjectHeader(
                containerId: containerId,
                type: FrostFsObjectType.Regular,
                [new FrostFsAttribute("fileName", "test")]),
    Payload = fileStream
};

FrostFsObjectId objectId = await client.PutObjectAsync(param);

var filter = new FilterByAttribute(FrostFsMatchType.Equals, "fileName", "test");

await foreach (var objId in client.SearchObjectsAsync(new PrmObjectSearch(containerId) { Filters = [filter] }))
{
    var objHeader = await client.GetObjectHeadAsync(new PrmObjectHeadGet(containerId, objId));
}

var @object = await client.GetObjectAsync(new PrmObjectGet(containerId, objectId));

var downloadedBytes = new byte[@object.Header.PayloadLength];
MemoryStream ms = new(downloadedBytes);

ReadOnlyMemory<byte>? chunk = null;
while ((chunk = await @object.ObjectReader!.ReadChunk()) != null)
{
    ms.Write(chunk.Value.Span);
}