refactor(lcnode): hybrid cloud lifecycle rule prefix check #22726594

Signed-off-by: zhaochenyang <zhaochenyang@oppo.com>
This commit is contained in:
zhaochenyang 2024-11-27 15:48:42 +08:00 committed by AmazingChi
parent d15462b427
commit 824098f801
3 changed files with 78 additions and 3 deletions

View File

@ -7199,6 +7199,8 @@ func (m *Server) SetBucketLifecycle(w http.ResponseWriter, r *http.Request) {
}
err = m.cluster.SetBucketLifecycle(&req)
b, _ := json.Marshal(req)
auditlog.LogMasterOp("SetBucketLifecycle", fmt.Sprintf("LcConfiguration(%v)", string(b)), err)
if err != nil {
sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()})
return
@ -7261,6 +7263,7 @@ func (m *Server) DelBucketLifecycle(w http.ResponseWriter, r *http.Request) {
return
}
err = m.cluster.DelBucketLifecycle(name)
auditlog.LogMasterOp("DelBucketLifecycle", fmt.Sprintf("vol(%v)", name), err)
if err != nil {
sendErrReply(w, r, &proto.HTTPReply{Code: proto.ErrCodeInternalError, Msg: err.Error()})
return

View File

@ -337,3 +337,72 @@ func TestLifecycleConfigurationTransition3(t *testing.T) {
err = proto.ValidRules(l2.Rules)
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))
}

View File

@ -119,6 +119,9 @@ func ValidRules(Rules []*Rule) error {
func ValidRulePrefix(Rules []*Rule) error {
if len(Rules) == 1 {
if strings.HasPrefix(Rules[0].GetPrefix(), "/") {
return LifeCycleErrRulePrefix
}
return nil
}
var prefixes []string
@ -127,13 +130,13 @@ func ValidRulePrefix(Rules []*Rule) error {
return LifeCycleErrConflictRules
}
if rule.Filter != nil {
if rule.Filter.Prefix == "" {
if rule.GetPrefix() == "" {
return LifeCycleErrConflictRules
} else {
if strings.HasPrefix(rule.Filter.Prefix, "/") {
if strings.HasPrefix(rule.GetPrefix(), "/") {
return LifeCycleErrRulePrefix
}
prefixes = append(prefixes, rule.Filter.Prefix)
prefixes = append(prefixes, rule.GetPrefix())
}
}
}