[#1223] lens/tui: Add schema handlers for all bucket types

Signed-off-by: Aleksey Savchuk <a.savchuk@yadro.com>
This commit is contained in:
Aleksey Savchuk 2024-07-25 14:44:52 +03:00
parent 18c372198a
commit 1e07775161
No known key found for this signature in database
6 changed files with 174 additions and 53 deletions

View file

@ -173,7 +173,10 @@ var SmallHandler = NewHandler(
parse.EOF,
NewHandler(
parse.Chain(parse.OID, parse.EOF),
parse.StorageID,
parse.Any(
parse.StorageID,
parse.EOF,
),
nil,
),
)
@ -192,6 +195,34 @@ var EcInfoHandler = NewHandler(
),
)
var ParentHandler = NewHandler(
parse.Chain(
parse.Prefix(types.Parent),
parse.CID,
parse.EOF,
),
parse.EOF,
NewHandler(
parse.Chain(parse.OID, parse.EOF),
parse.Chain(parse.OIDsList, parse.EOF),
nil,
),
)
var SplitHandler = NewHandler(
parse.Chain(
parse.Prefix(types.Split),
parse.CID,
parse.EOF,
),
parse.EOF,
NewHandler(
parse.Chain(parse.UUID, parse.EOF),
parse.Chain(parse.OIDsList, parse.EOF),
nil,
),
)
var ContainerCountersHandler = NewHandler(
parse.Chain(parse.Prefix(types.ContainerCounters), parse.EOF),
parse.EOF,
@ -202,6 +233,68 @@ var ContainerCountersHandler = NewHandler(
),
)
var InhumeHandler = NewHandler(
parse.Chain(
parse.Any(
parse.Prefix(types.Graveyard),
parse.Prefix(types.Garbage),
),
parse.EOF,
),
parse.EOF,
NewHandler(
parse.Chain(parse.CID, parse.OID, parse.EOF),
parse.Any(
parse.Chain(parse.CID, parse.OID, parse.EOF),
parse.Skip,
),
nil,
),
)
var ShardInfoHandler = NewHandler(
parse.Chain(parse.Prefix(types.ShardInfo), parse.EOF),
parse.EOF,
NewHandler(
parse.Chain(
parse.Any(
parse.ExactString("logic_counter"),
parse.ExactString("phy_counter"),
parse.ExactString("user_counter"),
parse.ExactString("version"),
parse.ExactString("id"),
),
parse.EOF,
),
parse.Volume,
nil,
),
)
var LockedHandler = NewHandler(
parse.Chain(parse.Prefix(types.Locked), parse.EOF),
parse.EOF,
NewHandler(
parse.Chain(parse.CID, parse.EOF),
parse.EOF,
NewHandler(
parse.Chain(parse.OID, parse.EOF),
parse.Chain(parse.OIDsList, parse.EOF),
nil,
),
),
)
var ContainerVolumeHandler = NewHandler(
parse.Chain(parse.Prefix(types.ContainerVolume), parse.EOF),
parse.EOF,
NewHandler(
parse.Chain(parse.CID, parse.EOF),
parse.Chain(parse.Volume, parse.EOF),
nil,
),
)
var StartHandler = WithFallbackRecursively(
Any(
ObjectBucketHandler,
@ -212,6 +305,12 @@ var StartHandler = WithFallbackRecursively(
RootHandler,
EcInfoHandler,
ContainerCountersHandler,
ParentHandler,
SplitHandler,
ContainerVolumeHandler,
InhumeHandler,
ShardInfoHandler,
LockedHandler,
),
RawHandler,
)

View file

@ -2,6 +2,7 @@ package parse
import (
"bytes"
"encoding/binary"
"errors"
"fmt"
@ -10,6 +11,7 @@ import (
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
"github.com/google/uuid"
"github.com/nspcc-dev/neo-go/pkg/io"
)
@ -120,6 +122,36 @@ func ObjectCounters(init []byte) (result Result, next []byte, err error) {
return counters, next, nil
}
func UUID(init []byte) (result Result, next []byte, err error) {
if len(init) < 16 {
return nil, init, errors.New("can't parse UUID, not enough data")
}
id := uuid.UUID{}
if err := id.UnmarshalBinary(init[:16]); err != nil {
return nil, init, fmt.Errorf("can't parsse UUID: %w", err)
}
return id, init[16:], nil
}
func Volume(init []byte) (result Result, next []byte, err error) {
if len(init) < 8 {
return nil, init, errors.New("can't parse volume, not enough data")
}
volume := binary.LittleEndian.Uint64(init[:8])
return &types.Volume{Volume: volume}, init[8:], nil
}
func ExactString(s string) Parser {
return func(init []byte) (result Result, next []byte, err error) {
next, found := bytes.CutPrefix(init, []byte(s))
if !found {
return nil, init, errors.New("can't parse string")
}
return &resultFromString{str: s}, next, nil
}
}
func Skip(_ []byte) (result Result, next []byte, err error) {
return &resultFromString{}, nil, nil
}

View file

@ -4,6 +4,7 @@ import (
"encoding/binary"
"errors"
"fmt"
"strconv"
)
type ObjectCounters struct {
@ -28,3 +29,11 @@ func (c *ObjectCounters) Decode(b []byte) (rest []byte, err error) {
c.User = binary.LittleEndian.Uint64(b[16:])
return b[24:], nil
}
type Volume struct {
Volume uint64
}
func (v *Volume) String() string {
return strconv.FormatUint(v.Volume, 10)
}

View file

@ -23,7 +23,7 @@ type (
)
func (id CID) String() string {
return fmt.Sprintf(`CID(%s)`, id.ID)
return fmt.Sprintf(`CID [red]%s[white]`, id.ID)
}
func (id OID) String() string {

View file

@ -2,6 +2,8 @@
package types
import "fmt"
type Prefix byte
const (
@ -25,3 +27,33 @@ const (
ContainerCounters
EcInfo
)
var x = map[Prefix]string{
Graveyard: "Graveyard",
Garbage: "Garbage",
ToMoveIt: "To Move It",
ContainerVolume: "Container Volume",
Locked: "Locked",
ShardInfo: "Shard Info",
Primary: "Primary",
Lockers: "Lockers",
Tombstone: "Tombstone",
Small: "Small",
Root: "Root",
Owner: "Owner",
UserAttribute: "User Attribute",
PayloadHash: "Payload Hash",
Parent: "Parent",
Split: "Split",
ContainerCounters: "Container Counters",
EcInfo: "EC Info",
}
const format = "[green](%2d %-18s)[white]"
func (p Prefix) String() string {
if s, ok := x[p]; ok {
return fmt.Sprintf(format, p, s)
}
return fmt.Sprintf(format, p, "--Unknown--")
}

View file

@ -1,51 +0,0 @@
// Code generated by "stringer -type=Prefix"; DO NOT EDIT.
package types
import "strconv"
func _() {
// An "invalid array index" compiler error signifies that the constant values have changed.
// Re-run the stringer command to generate them again.
var x [1]struct{}
_ = x[Graveyard-0]
_ = x[Garbage-1]
_ = x[ToMoveIt-2]
_ = x[ContainerVolume-3]
_ = x[Locked-4]
_ = x[ShardInfo-5]
_ = x[Primary-6]
_ = x[Lockers-7]
_ = x[Tombstone-9]
_ = x[Small-10]
_ = x[Root-11]
_ = x[Owner-12]
_ = x[UserAttribute-13]
_ = x[PayloadHash-14]
_ = x[Parent-15]
_ = x[Split-16]
_ = x[ContainerCounters-17]
_ = x[EcInfo-18]
}
const (
_Prefix_name_0 = "GraveyardGarbageToMoveItContainerVolumeLockedShardInfoPrimaryLockers"
_Prefix_name_1 = "TombstoneSmallRootOwnerUserAttributePayloadHashParentSplitContainerCountersEcInfo"
)
var (
_Prefix_index_0 = [...]uint8{0, 9, 16, 24, 39, 45, 54, 61, 68}
_Prefix_index_1 = [...]uint8{0, 9, 14, 18, 23, 36, 47, 53, 58, 75, 81}
)
func (i Prefix) String() string {
switch {
case i <= 7:
return _Prefix_name_0[_Prefix_index_0[i]:_Prefix_index_0[i+1]]
case 9 <= i && i <= 18:
i -= 9
return _Prefix_name_1[_Prefix_index_1[i]:_Prefix_index_1[i+1]]
default:
return "Prefix(" + strconv.FormatInt(int64(i), 10) + ")"
}
}