mirror of
https://github.com/cubefs/cubefs.git
synced 2026-08-02 02:00:56 +00:00
refactor(lcnode): hybrid cloud lifecycle rule prefix check #22726594
Signed-off-by: zhaochenyang <zhaochenyang@oppo.com>
This commit is contained in:
parent
d15462b427
commit
824098f801
@ -7199,6 +7199,8 @@ func (m *Server) SetBucketLifecycle(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
err = m.cluster.SetBucketLifecycle(&req)
|
err = m.cluster.SetBucketLifecycle(&req)
|
||||||
|
b, _ := json.Marshal(req)
|
||||||
|
auditlog.LogMasterOp("SetBucketLifecycle", fmt.Sprintf("LcConfiguration(%v)", string(b)), err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()})
|
sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()})
|
||||||
return
|
return
|
||||||
@ -7261,6 +7263,7 @@ func (m *Server) DelBucketLifecycle(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
err = m.cluster.DelBucketLifecycle(name)
|
err = m.cluster.DelBucketLifecycle(name)
|
||||||
|
auditlog.LogMasterOp("DelBucketLifecycle", fmt.Sprintf("vol(%v)", name), err)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()})
|
sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()})
|
||||||
return
|
return
|
||||||
|
|||||||
@ -337,3 +337,72 @@ func TestLifecycleConfigurationTransition3(t *testing.T) {
|
|||||||
err = proto.ValidRules(l2.Rules)
|
err = proto.ValidRules(l2.Rules)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestValidRulePrefix(t *testing.T) {
|
||||||
|
rules := []*proto.Rule{
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require.NoError(t, proto.ValidRulePrefix(rules))
|
||||||
|
|
||||||
|
rules = []*proto.Rule{
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require.NoError(t, proto.ValidRulePrefix(rules))
|
||||||
|
|
||||||
|
rules = []*proto.Rule{
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: ""},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require.NoError(t, proto.ValidRulePrefix(rules))
|
||||||
|
|
||||||
|
rules = []*proto.Rule{
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: "/"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require.Equal(t, proto.LifeCycleErrRulePrefix, proto.ValidRulePrefix(rules))
|
||||||
|
|
||||||
|
rules = []*proto.Rule{
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: "/"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: "a/"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require.Equal(t, proto.LifeCycleErrRulePrefix, proto.ValidRulePrefix(rules))
|
||||||
|
|
||||||
|
rules = []*proto.Rule{
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: ""},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: "a/"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require.Equal(t, proto.LifeCycleErrConflictRules, proto.ValidRulePrefix(rules))
|
||||||
|
|
||||||
|
rules = []*proto.Rule{
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: "b/"},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ID: "a",
|
||||||
|
Filter: &proto.Filter{Prefix: "a/"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require.NoError(t, proto.ValidRulePrefix(rules))
|
||||||
|
}
|
||||||
|
|||||||
@ -119,6 +119,9 @@ func ValidRules(Rules []*Rule) error {
|
|||||||
|
|
||||||
func ValidRulePrefix(Rules []*Rule) error {
|
func ValidRulePrefix(Rules []*Rule) error {
|
||||||
if len(Rules) == 1 {
|
if len(Rules) == 1 {
|
||||||
|
if strings.HasPrefix(Rules[0].GetPrefix(), "/") {
|
||||||
|
return LifeCycleErrRulePrefix
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var prefixes []string
|
var prefixes []string
|
||||||
@ -127,13 +130,13 @@ func ValidRulePrefix(Rules []*Rule) error {
|
|||||||
return LifeCycleErrConflictRules
|
return LifeCycleErrConflictRules
|
||||||
}
|
}
|
||||||
if rule.Filter != nil {
|
if rule.Filter != nil {
|
||||||
if rule.Filter.Prefix == "" {
|
if rule.GetPrefix() == "" {
|
||||||
return LifeCycleErrConflictRules
|
return LifeCycleErrConflictRules
|
||||||
} else {
|
} else {
|
||||||
if strings.HasPrefix(rule.Filter.Prefix, "/") {
|
if strings.HasPrefix(rule.GetPrefix(), "/") {
|
||||||
return LifeCycleErrRulePrefix
|
return LifeCycleErrRulePrefix
|
||||||
}
|
}
|
||||||
prefixes = append(prefixes, rule.Filter.Prefix)
|
prefixes = append(prefixes, rule.GetPrefix())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user