2020-10-03 05:21:51 +00:00
|
|
|
package s3api
|
|
|
|
|
|
|
|
import (
|
2022-07-29 07:17:28 +00:00
|
|
|
"github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
|
2020-10-03 05:21:51 +00:00
|
|
|
"strings"
|
|
|
|
|
2022-07-29 07:17:28 +00:00
|
|
|
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
|
2020-10-03 05:21:51 +00:00
|
|
|
)
|
|
|
|
|
2020-10-08 06:30:54 +00:00
|
|
|
const (
|
2022-05-31 05:57:41 +00:00
|
|
|
S3TAG_PREFIX = s3_constants.AmzObjectTagging + "-"
|
2020-10-03 05:21:51 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func (s3a *S3ApiServer) getTags(parentDirectoryPath string, entryName string) (tags map[string]string, err error) {
|
|
|
|
|
2021-12-26 08:15:03 +00:00
|
|
|
err = s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
|
2020-10-03 05:21:51 +00:00
|
|
|
|
|
|
|
resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
|
2020-10-08 06:30:54 +00:00
|
|
|
Directory: parentDirectoryPath,
|
|
|
|
Name: entryName,
|
2020-10-03 05:21:51 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
tags = make(map[string]string)
|
|
|
|
for k, v := range resp.Entry.Extended {
|
|
|
|
if strings.HasPrefix(k, S3TAG_PREFIX) {
|
|
|
|
tags[k[len(S3TAG_PREFIX):]] = string(v)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s3a *S3ApiServer) setTags(parentDirectoryPath string, entryName string, tags map[string]string) (err error) {
|
|
|
|
|
2021-12-26 08:15:03 +00:00
|
|
|
return s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
|
2020-10-03 05:21:51 +00:00
|
|
|
|
|
|
|
resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
|
2020-10-08 06:30:54 +00:00
|
|
|
Directory: parentDirectoryPath,
|
|
|
|
Name: entryName,
|
2020-10-03 05:21:51 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
for k, _ := range resp.Entry.Extended {
|
|
|
|
if strings.HasPrefix(k, S3TAG_PREFIX) {
|
|
|
|
delete(resp.Entry.Extended, k)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if resp.Entry.Extended == nil {
|
|
|
|
resp.Entry.Extended = make(map[string][]byte)
|
|
|
|
}
|
|
|
|
for k, v := range tags {
|
|
|
|
resp.Entry.Extended[S3TAG_PREFIX+k] = []byte(v)
|
|
|
|
}
|
|
|
|
|
|
|
|
return filer_pb.UpdateEntry(client, &filer_pb.UpdateEntryRequest{
|
|
|
|
Directory: parentDirectoryPath,
|
|
|
|
Entry: resp.Entry,
|
|
|
|
IsFromOtherCluster: false,
|
|
|
|
Signatures: nil,
|
|
|
|
})
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s3a *S3ApiServer) rmTags(parentDirectoryPath string, entryName string) (err error) {
|
|
|
|
|
2021-12-26 08:15:03 +00:00
|
|
|
return s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
|
2020-10-03 05:21:51 +00:00
|
|
|
|
|
|
|
resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
|
2020-10-08 06:30:54 +00:00
|
|
|
Directory: parentDirectoryPath,
|
|
|
|
Name: entryName,
|
2020-10-03 05:21:51 +00:00
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
hasDeletion := false
|
|
|
|
for k, _ := range resp.Entry.Extended {
|
|
|
|
if strings.HasPrefix(k, S3TAG_PREFIX) {
|
|
|
|
delete(resp.Entry.Extended, k)
|
|
|
|
hasDeletion = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if !hasDeletion {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return filer_pb.UpdateEntry(client, &filer_pb.UpdateEntryRequest{
|
|
|
|
Directory: parentDirectoryPath,
|
|
|
|
Entry: resp.Entry,
|
|
|
|
IsFromOtherCluster: false,
|
|
|
|
Signatures: nil,
|
|
|
|
})
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|