forked from TrueCloudLab/frostfs-s3-gw
72 lines
1.9 KiB
Go
72 lines
1.9 KiB
Go
package container
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
containerContract "git.frostfs.info/TrueCloudLab/frostfs-contract/rpcclient/container"
|
|
frostfsutil "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/frostfs/util"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient"
|
|
"github.com/nspcc-dev/neo-go/pkg/rpcclient/actor"
|
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
|
)
|
|
|
|
type Client struct {
|
|
contract *containerContract.Contract
|
|
}
|
|
|
|
type Config struct {
|
|
RPCAddress string
|
|
Contract string
|
|
Key *keys.PrivateKey
|
|
RPCClient *rpcclient.Client
|
|
}
|
|
|
|
func New(cfg Config) (*Client, error) {
|
|
contractHash, err := frostfsutil.ResolveContractHash(cfg.Contract, cfg.RPCAddress)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("resolve frostfs contract hash: %w", err)
|
|
}
|
|
|
|
key := cfg.Key
|
|
if key == nil {
|
|
if key, err = keys.NewPrivateKey(); err != nil {
|
|
return nil, fmt.Errorf("generate anon private key for container contract: %w", err)
|
|
}
|
|
}
|
|
acc := wallet.NewAccountFromPrivateKey(key)
|
|
|
|
act, err := actor.NewSimple(cfg.RPCClient, acc)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("create new actor: %w", err)
|
|
}
|
|
|
|
return &Client{
|
|
contract: containerContract.New(act, contractHash),
|
|
}, nil
|
|
}
|
|
|
|
func (c *Client) GetContainerByID(cnrID cid.ID) (*container.Container, error) {
|
|
items, err := c.contract.Get(cnrID[:])
|
|
if err != nil {
|
|
return nil, fmt.Errorf("get container by cid: %w", err)
|
|
}
|
|
|
|
if len(items) != 4 {
|
|
return nil, fmt.Errorf("unexpected container stack item count: %d", len(items))
|
|
}
|
|
|
|
cnrBytes, err := items[0].TryBytes()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("could not get byte array of container: %w", err)
|
|
}
|
|
|
|
var cnr container.Container
|
|
if err = cnr.Unmarshal(cnrBytes); err != nil {
|
|
return nil, fmt.Errorf("can't unmarshal container: %w", err)
|
|
}
|
|
|
|
return &cnr, nil
|
|
}
|