filer_util_tags.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package s3api
  2. import (
  3. "github.com/seaweedfs/seaweedfs/weed/s3api/s3_constants"
  4. "strings"
  5. "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
  6. )
  7. const (
  8. S3TAG_PREFIX = s3_constants.AmzObjectTagging + "-"
  9. )
  10. func (s3a *S3ApiServer) getTags(parentDirectoryPath string, entryName string) (tags map[string]string, err error) {
  11. err = s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
  12. resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
  13. Directory: parentDirectoryPath,
  14. Name: entryName,
  15. })
  16. if err != nil {
  17. return err
  18. }
  19. tags = make(map[string]string)
  20. for k, v := range resp.Entry.Extended {
  21. if strings.HasPrefix(k, S3TAG_PREFIX) {
  22. tags[k[len(S3TAG_PREFIX):]] = string(v)
  23. }
  24. }
  25. return nil
  26. })
  27. return
  28. }
  29. func (s3a *S3ApiServer) setTags(parentDirectoryPath string, entryName string, tags map[string]string) (err error) {
  30. return s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
  31. resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
  32. Directory: parentDirectoryPath,
  33. Name: entryName,
  34. })
  35. if err != nil {
  36. return err
  37. }
  38. for k, _ := range resp.Entry.Extended {
  39. if strings.HasPrefix(k, S3TAG_PREFIX) {
  40. delete(resp.Entry.Extended, k)
  41. }
  42. }
  43. if resp.Entry.Extended == nil {
  44. resp.Entry.Extended = make(map[string][]byte)
  45. }
  46. for k, v := range tags {
  47. resp.Entry.Extended[S3TAG_PREFIX+k] = []byte(v)
  48. }
  49. return filer_pb.UpdateEntry(client, &filer_pb.UpdateEntryRequest{
  50. Directory: parentDirectoryPath,
  51. Entry: resp.Entry,
  52. IsFromOtherCluster: false,
  53. Signatures: nil,
  54. })
  55. })
  56. }
  57. func (s3a *S3ApiServer) rmTags(parentDirectoryPath string, entryName string) (err error) {
  58. return s3a.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
  59. resp, err := filer_pb.LookupEntry(client, &filer_pb.LookupDirectoryEntryRequest{
  60. Directory: parentDirectoryPath,
  61. Name: entryName,
  62. })
  63. if err != nil {
  64. return err
  65. }
  66. hasDeletion := false
  67. for k, _ := range resp.Entry.Extended {
  68. if strings.HasPrefix(k, S3TAG_PREFIX) {
  69. delete(resp.Entry.Extended, k)
  70. hasDeletion = true
  71. }
  72. }
  73. if !hasDeletion {
  74. return nil
  75. }
  76. return filer_pb.UpdateEntry(client, &filer_pb.UpdateEntryRequest{
  77. Directory: parentDirectoryPath,
  78. Entry: resp.Entry,
  79. IsFromOtherCluster: false,
  80. Signatures: nil,
  81. })
  82. })
  83. }