mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
GetBucketLifecycleConfigurationHandler
This commit is contained in:
parent
be4b3ed509
commit
9d6ffa0ea1
|
@ -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
|
||||||
|
@ -85,20 +85,4 @@ services:
|
||||||
- master2
|
- master2
|
||||||
- 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
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,7 +265,26 @@ func (s3a *S3ApiServer) GetBucketLifecycleConfigurationHandler(w http.ResponseWr
|
||||||
s3err.WriteErrorResponse(w, s3err.ErrInternalError, r)
|
s3err.WriteErrorResponse(w, s3err.ErrInternalError, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
s3err.WriteErrorResponse(w, s3err.ErrNoSuchLifecycleConfiguration, r)
|
ttls := fc.GetCollectionTtls(bucket)
|
||||||
|
if len(ttls) == 0 {
|
||||||
|
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
|
||||||
|
|
|
@ -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…
Reference in a new issue