2021-11-08 10:52:44 +00:00
|
|
|
package storagegroup
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
|
|
"github.com/nspcc-dev/neofs-api-go/v2/storagegroup"
|
|
|
|
"github.com/nspcc-dev/neofs-sdk-go/checksum"
|
2022-01-25 16:20:32 +00:00
|
|
|
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
2021-11-08 10:52:44 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// StorageGroup represents v2-compatible storage group.
|
|
|
|
type StorageGroup storagegroup.StorageGroup
|
|
|
|
|
|
|
|
// NewFromV2 wraps v2 StorageGroup message to StorageGroup.
|
|
|
|
//
|
|
|
|
// Nil storagegroup.StorageGroup converts to nil.
|
|
|
|
func NewFromV2(aV2 *storagegroup.StorageGroup) *StorageGroup {
|
|
|
|
return (*StorageGroup)(aV2)
|
|
|
|
}
|
|
|
|
|
|
|
|
// New creates and initializes blank StorageGroup.
|
|
|
|
//
|
|
|
|
// Defaults:
|
|
|
|
// - size: 0;
|
|
|
|
// - exp: 0;
|
|
|
|
// - members: nil;
|
|
|
|
// - hash: nil.
|
|
|
|
func New() *StorageGroup {
|
|
|
|
return NewFromV2(new(storagegroup.StorageGroup))
|
|
|
|
}
|
|
|
|
|
|
|
|
// ValidationDataSize returns total size of the payloads
|
|
|
|
// of objects in the storage group.
|
|
|
|
func (sg *StorageGroup) ValidationDataSize() uint64 {
|
|
|
|
return (*storagegroup.StorageGroup)(sg).GetValidationDataSize()
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetValidationDataSize sets total size of the payloads
|
|
|
|
// of objects in the storage group.
|
|
|
|
func (sg *StorageGroup) SetValidationDataSize(epoch uint64) {
|
|
|
|
(*storagegroup.StorageGroup)(sg).SetValidationDataSize(epoch)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ValidationDataHash returns homomorphic hash from the
|
|
|
|
// concatenation of the payloads of the storage group members.
|
|
|
|
func (sg *StorageGroup) ValidationDataHash() *checksum.Checksum {
|
2021-03-22 10:56:18 +00:00
|
|
|
if v2 := (*storagegroup.StorageGroup)(sg).GetValidationHash(); v2 != nil {
|
|
|
|
var v checksum.Checksum
|
|
|
|
v.ReadFromV2(*v2)
|
|
|
|
|
|
|
|
return &v
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
2021-11-08 10:52:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// SetValidationDataHash sets homomorphic hash from the
|
|
|
|
// concatenation of the payloads of the storage group members.
|
|
|
|
func (sg *StorageGroup) SetValidationDataHash(hash *checksum.Checksum) {
|
2021-03-22 10:56:18 +00:00
|
|
|
var v2 refs.Checksum
|
|
|
|
hash.WriteToV2(&v2)
|
|
|
|
|
|
|
|
(*storagegroup.StorageGroup)(sg).SetValidationHash(&v2)
|
2021-11-08 10:52:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// ExpirationEpoch returns last NeoFS epoch number
|
|
|
|
// of the storage group lifetime.
|
|
|
|
func (sg *StorageGroup) ExpirationEpoch() uint64 {
|
|
|
|
return (*storagegroup.StorageGroup)(sg).GetExpirationEpoch()
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetExpirationEpoch sets last NeoFS epoch number
|
|
|
|
// of the storage group lifetime.
|
|
|
|
func (sg *StorageGroup) SetExpirationEpoch(epoch uint64) {
|
|
|
|
(*storagegroup.StorageGroup)(sg).SetExpirationEpoch(epoch)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Members returns strictly ordered list of
|
|
|
|
// storage group member objects.
|
2022-03-11 08:54:54 +00:00
|
|
|
func (sg *StorageGroup) Members() []oid.ID {
|
2021-11-08 10:52:44 +00:00
|
|
|
mV2 := (*storagegroup.StorageGroup)(sg).GetMembers()
|
|
|
|
|
|
|
|
if mV2 == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2022-03-11 08:54:54 +00:00
|
|
|
m := make([]oid.ID, len(mV2))
|
2021-11-08 10:52:44 +00:00
|
|
|
|
|
|
|
for i := range mV2 {
|
2022-03-11 08:54:54 +00:00
|
|
|
m[i] = *oid.NewIDFromV2(&mV2[i])
|
2021-11-08 10:52:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return m
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetMembers sets strictly ordered list of
|
|
|
|
// storage group member objects.
|
2022-03-11 08:54:54 +00:00
|
|
|
func (sg *StorageGroup) SetMembers(members []oid.ID) {
|
2021-11-08 10:52:44 +00:00
|
|
|
mV2 := (*storagegroup.StorageGroup)(sg).GetMembers()
|
|
|
|
|
|
|
|
if members == nil {
|
|
|
|
mV2 = nil
|
|
|
|
} else {
|
|
|
|
ln := len(members)
|
|
|
|
|
|
|
|
if cap(mV2) >= ln {
|
|
|
|
mV2 = mV2[:0]
|
|
|
|
} else {
|
2022-03-11 08:54:54 +00:00
|
|
|
mV2 = make([]refs.ObjectID, ln)
|
2021-11-08 10:52:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for i := 0; i < ln; i++ {
|
2022-03-11 08:54:54 +00:00
|
|
|
mV2[i] = *members[i].ToV2()
|
2021-11-08 10:52:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
(*storagegroup.StorageGroup)(sg).SetMembers(mV2)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ToV2 converts StorageGroup to v2 StorageGroup message.
|
|
|
|
//
|
|
|
|
// Nil StorageGroup converts to nil.
|
|
|
|
func (sg *StorageGroup) ToV2() *storagegroup.StorageGroup {
|
|
|
|
return (*storagegroup.StorageGroup)(sg)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Marshal marshals StorageGroup into a protobuf binary form.
|
|
|
|
func (sg *StorageGroup) Marshal() ([]byte, error) {
|
|
|
|
return (*storagegroup.StorageGroup)(sg).StableMarshal(nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Unmarshal unmarshals protobuf binary representation of StorageGroup.
|
|
|
|
func (sg *StorageGroup) Unmarshal(data []byte) error {
|
|
|
|
return (*storagegroup.StorageGroup)(sg).Unmarshal(data)
|
|
|
|
}
|
|
|
|
|
|
|
|
// MarshalJSON encodes StorageGroup to protobuf JSON format.
|
|
|
|
func (sg *StorageGroup) MarshalJSON() ([]byte, error) {
|
|
|
|
return (*storagegroup.StorageGroup)(sg).MarshalJSON()
|
|
|
|
}
|
|
|
|
|
|
|
|
// UnmarshalJSON decodes StorageGroup from protobuf JSON format.
|
|
|
|
func (sg *StorageGroup) UnmarshalJSON(data []byte) error {
|
|
|
|
return (*storagegroup.StorageGroup)(sg).UnmarshalJSON(data)
|
|
|
|
}
|