Browse Source

GetBucketLifecycleConfigurationHandler

pull/2380/head
Konstantin Lebedev 3 years ago
parent
commit
9d6ffa0ea1
  1. 18
      docker/compose/local-cluster-compose.yml
  2. 12
      weed/filer/filer_conf.go
  3. 20
      weed/s3api/s3api_bucket_handlers.go
  4. 61
      weed/s3api/s3api_policy.go

18
docker/compose/local-cluster-compose.yml

@ -67,7 +67,7 @@ services:
- 8888:8888 - 8888:8888
- 18888:18888 - 18888:18888
- 8111:8111 - 8111:8111
command: 'filer -defaultReplicaPlacement 000 -iam -master="master0:9333,master1:9334,master2:9335"'
command: 'filer -defaultReplicaPlacement 100 -iam -master="master0:9333,master1:9334,master2:9335"'
depends_on: depends_on:
- master0 - master0
- master1 - master1
@ -86,19 +86,3 @@ services:
- volume1 - volume1
- volume2 - volume2
- filer - filer
minio:
image: minio/minio
ports:
- 9000:9000
command: 'minio server /data'
environment:
MINIO_ACCESS_KEY: "some_access_key1"
MINIO_SECRET_KEY: "some_secret_key1"
depends_on:
- s3
nexus:
image: registry.tochka-tech.com/oci_nexus/nexus:v3.34.1-2
ports:
- 8081:8081
depends_on:
- s3

12
weed/filer/filer_conf.go

@ -142,6 +142,18 @@ func (fc *FilerConf) MatchStorageRule(path string) (pathConf *filer_pb.FilerConf
return pathConf return pathConf
} }
func (fc *FilerConf) GetCollectionTtls(collection string) (ttls map[string]string) {
ttls = make(map[string]string)
fc.rules.Walk(func(key []byte, value interface{}) bool {
t := value.(*filer_pb.FilerConf_PathConf)
if t.Collection == collection {
ttls[t.LocationPrefix] = t.GetTtl()
}
return true
})
return ttls
}
// merge if values in b is not empty, merge them into a // merge if values in b is not empty, merge them into a
func mergePathConf(a, b *filer_pb.FilerConf_PathConf) { func mergePathConf(a, b *filer_pb.FilerConf_PathConf) {
a.Collection = util.Nvl(b.Collection, a.Collection) a.Collection = util.Nvl(b.Collection, a.Collection)

20
weed/s3api/s3api_bucket_handlers.go

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"github.com/chrislusf/seaweedfs/weed/filer" "github.com/chrislusf/seaweedfs/weed/filer"
"github.com/chrislusf/seaweedfs/weed/s3api/s3_constants" "github.com/chrislusf/seaweedfs/weed/s3api/s3_constants"
"github.com/chrislusf/seaweedfs/weed/storage/needle"
"math" "math"
"net/http" "net/http"
"time" "time"
@ -264,8 +265,27 @@ func (s3a *S3ApiServer) GetBucketLifecycleConfigurationHandler(w http.ResponseWr
s3err.WriteErrorResponse(w, s3err.ErrInternalError, r) s3err.WriteErrorResponse(w, s3err.ErrInternalError, r)
return return
} }
ttls := fc.GetCollectionTtls(bucket)
if len(ttls) == 0 {
s3err.WriteErrorResponse(w, s3err.ErrNoSuchLifecycleConfiguration, r) s3err.WriteErrorResponse(w, s3err.ErrNoSuchLifecycleConfiguration, r)
} }
response := Lifecycle{}
for prefix, internalTtl := range ttls {
ttl, _ := needle.ReadTTL(internalTtl)
days := int(ttl.Minutes() / 60 / 24)
if days == 0 {
continue
}
response.Rules = append(response.Rules, Rule{
Status: Enabled, Filter: Filter{
Prefix: Prefix{string: prefix, set: true},
set: true,
},
Expiration: Expiration{Days: days, set: true},
})
}
writeSuccessResponseXML(w, response)
}
// PutBucketLifecycleConfigurationHandler Put Bucket Lifecycle configuration // PutBucketLifecycleConfigurationHandler Put Bucket Lifecycle configuration
// https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html // https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html

61
weed/s3api/s3api_policy.go

@ -51,6 +51,24 @@ type Prefix struct {
set bool set bool
} }
// MarshalXML - decodes XML data.
func (p Prefix) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error {
if !p.set {
return nil
}
return e.EncodeElement(p.string, startElement)
}
func (f Filter) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if err := e.EncodeToken(start); err != nil {
return err
}
if err := e.EncodeElement(f.Prefix, xml.StartElement{Name: xml.Name{Local: "Prefix"}}); err != nil {
return err
}
return e.EncodeToken(xml.EndElement{Name: start.Name})
}
// And - a tag to combine a prefix and multiple tags for lifecycle configuration rule. // And - a tag to combine a prefix and multiple tags for lifecycle configuration rule.
type And struct { type And struct {
XMLName xml.Name `xml:"And"` XMLName xml.Name `xml:"And"`
@ -62,18 +80,50 @@ type And struct {
type Expiration struct { type Expiration struct {
XMLName xml.Name `xml:"Expiration"` XMLName xml.Name `xml:"Expiration"`
Days int `xml:"Days,omitempty"` Days int `xml:"Days,omitempty"`
Date time.Time `xml:"Date,omitempty"`
Date ExpirationDate `xml:"Date,omitempty"`
DeleteMarker ExpireDeleteMarker `xml:"ExpiredObjectDeleteMarker"` DeleteMarker ExpireDeleteMarker `xml:"ExpiredObjectDeleteMarker"`
set bool set bool
} }
// MarshalXML encodes expiration field into an XML form.
func (e Expiration) MarshalXML(enc *xml.Encoder, startElement xml.StartElement) error {
if !e.set {
return nil
}
type expirationWrapper Expiration
return enc.EncodeElement(expirationWrapper(e), startElement)
}
// ExpireDeleteMarker represents value of ExpiredObjectDeleteMarker field in Expiration XML element. // ExpireDeleteMarker represents value of ExpiredObjectDeleteMarker field in Expiration XML element.
type ExpireDeleteMarker struct { type ExpireDeleteMarker struct {
val bool val bool
set bool set bool
} }
// MarshalXML encodes delete marker boolean into an XML form.
func (b ExpireDeleteMarker) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error {
if !b.set {
return nil
}
return e.EncodeElement(b.val, startElement)
}
// ExpirationDate is a embedded type containing time.Time to unmarshal
// Date in Expiration
type ExpirationDate struct {
time.Time
}
// MarshalXML encodes expiration date if it is non-zero and encodes
// empty string otherwise
func (eDate ExpirationDate) MarshalXML(e *xml.Encoder, startElement xml.StartElement) error {
if eDate.Time.IsZero() {
return nil
}
return e.EncodeElement(eDate.Format(time.RFC3339), startElement)
}
// Transition - transition actions for a rule in lifecycle configuration. // Transition - transition actions for a rule in lifecycle configuration.
type Transition struct { type Transition struct {
XMLName xml.Name `xml:"Transition"` XMLName xml.Name `xml:"Transition"`
@ -84,5 +134,14 @@ type Transition struct {
set bool set bool
} }
// MarshalXML encodes transition field into an XML form.
func (t Transition) MarshalXML(enc *xml.Encoder, start xml.StartElement) error {
if !t.set {
return nil
}
type transitionWrapper Transition
return enc.EncodeElement(transitionWrapper(t), start)
}
// TransitionDays is a type alias to unmarshal Days in Transition // TransitionDays is a type alias to unmarshal Days in Transition
type TransitionDays int type TransitionDays int
Loading…
Cancel
Save