forked from TrueCloudLab/frostfs-node
92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
package v2
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
|
eaclSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
|
objectSDK "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
|
)
|
|
|
|
type sysObjHdr struct {
|
|
k, v string
|
|
}
|
|
|
|
func (s sysObjHdr) Key() string {
|
|
return s.k
|
|
}
|
|
|
|
func (s sysObjHdr) Value() string {
|
|
return s.v
|
|
}
|
|
|
|
func u64Value(v uint64) string {
|
|
return strconv.FormatUint(v, 10)
|
|
}
|
|
|
|
func headersFromObject(obj *objectSDK.Object, cnr cid.ID, oid *oid.ID) []eaclSDK.Header {
|
|
var count int
|
|
for obj := obj; obj != nil; obj = obj.Parent() {
|
|
count += 9 + len(obj.Attributes())
|
|
}
|
|
|
|
res := make([]eaclSDK.Header, 0, count)
|
|
for ; obj != nil; obj = obj.Parent() {
|
|
res = append(res,
|
|
cidHeader(cnr),
|
|
// creation epoch
|
|
sysObjHdr{
|
|
k: acl.FilterObjectCreationEpoch,
|
|
v: u64Value(obj.CreationEpoch()),
|
|
},
|
|
// payload size
|
|
sysObjHdr{
|
|
k: acl.FilterObjectPayloadLength,
|
|
v: u64Value(obj.PayloadSize()),
|
|
},
|
|
// object version
|
|
sysObjHdr{
|
|
k: acl.FilterObjectVersion,
|
|
v: obj.Version().String(),
|
|
},
|
|
// object type
|
|
sysObjHdr{
|
|
k: acl.FilterObjectType,
|
|
v: obj.Type().String(),
|
|
},
|
|
)
|
|
|
|
if oid != nil {
|
|
res = append(res, oidHeader(*oid))
|
|
}
|
|
|
|
if idOwner := obj.OwnerID(); !idOwner.IsEmpty() {
|
|
res = append(res, ownerIDHeader(idOwner))
|
|
}
|
|
|
|
cs, ok := obj.PayloadChecksum()
|
|
if ok {
|
|
res = append(res, sysObjHdr{
|
|
k: acl.FilterObjectPayloadHash,
|
|
v: cs.String(),
|
|
})
|
|
}
|
|
|
|
cs, ok = obj.PayloadHomomorphicHash()
|
|
if ok {
|
|
res = append(res, sysObjHdr{
|
|
k: acl.FilterObjectHomomorphicHash,
|
|
v: cs.String(),
|
|
})
|
|
}
|
|
|
|
attrs := obj.Attributes()
|
|
for i := range attrs {
|
|
res = append(res, &attrs[i]) // only pointer attrs can implement eaclSDK.Header interface
|
|
}
|
|
}
|
|
|
|
return res
|
|
}
|