Skip to content

Commit d63f559

Browse files
Merge pull request #2937 from actiontech/feat-rule-version-ce
Feat rule version ce
2 parents 0fa401c + 23978f8 commit d63f559

File tree

152 files changed

+693
-323
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

152 files changed

+693
-323
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,10 @@ docker_install:
175175
$(DOCKER) run -v $(shell pwd):/universe --rm $(GO_COMPILER_IMAGE) sh -c "git config --global --add safe.directory /universe && cd /universe && make install $(MAKEFLAGS)"
176176

177177
docker_install_sqled:
178-
$(DOCKER) run -v $(shell pwd):/universe --rm $(GO_COMPILER_IMAGE) sh -c "cd /universe && make install_sqled $(MAKEFLAGS)"
178+
$(DOCKER) run -v $(shell pwd):/universe --rm $(GO_COMPILER_IMAGE) sh -c "git config --global --add safe.directory /universe && cd /universe && make install_sqled $(MAKEFLAGS)"
179179

180180
docker_install_scannerd:
181-
$(DOCKER) run -v $(shell pwd):/universe --rm $(GO_COMPILER_IMAGE) sh -c "cd /universe && make install_scannerd $(MAKEFLAGS)"
181+
$(DOCKER) run -v $(shell pwd):/universe --rm $(GO_COMPILER_IMAGE) sh -c "git config --global --add safe.directory /universe && cd /universe && make install_scannerd $(MAKEFLAGS)"
182182

183183

184184
docker_rpm: docker_install

sqle/api/app.go

+1
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ func StartApi(net *gracenet.Net, exitChan chan struct{}, config *config.SqleOpti
452452

453453
//rule
454454
v1Router.GET("/rules", v1.GetRules)
455+
v1Router.GET("/rules_version_tips", v1.GetDriverRuleVersionTips)
455456
v1Router.GET("/custom_rules", v1.GetCustomRules)
456457
v1Router.GET("/custom_rules/:rule_id", v1.GetCustomRule)
457458
v1Router.GET("/custom_rules/:db_type/rule_types", v1.GetRuleTypeByDBType)

sqle/api/controller/v1/rule.go

+76-35
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ import (
1010
"io"
1111
"mime"
1212
"net/http"
13+
"strconv"
1314
"strings"
1415

1516
"github.com/actiontech/sqle/sqle/api/controller"
1617
"github.com/actiontech/sqle/sqle/dms"
18+
"github.com/actiontech/sqle/sqle/driver"
1719
"github.com/actiontech/sqle/sqle/driver/mysql/plocale"
1820
rulepkg "github.com/actiontech/sqle/sqle/driver/mysql/rule"
1921
driverV2 "github.com/actiontech/sqle/sqle/driver/v2"
@@ -29,7 +31,7 @@ type CreateRuleTemplateReqV1 struct {
2931
Name string `json:"rule_template_name" valid:"required,name"`
3032
Desc string `json:"desc"`
3133
DBType string `json:"db_type" valid:"required"`
32-
RuleVersion string `json:"rule_version"`
34+
RuleVersion uint32 `json:"rule_version"`
3335
RuleList []RuleReqV1 `json:"rule_list" form:"rule_list" valid:"required,dive,required"`
3436
}
3537

@@ -62,6 +64,9 @@ func checkAndGenerateRules(rulesReq []RuleReqV1, template *model.RuleTemplate) (
6264
templateRules := make([]model.RuleTemplateRule, 0, len(rulesReq))
6365
for _, r := range rulesReq {
6466
rule := rules[r.Name]
67+
if rule.Version != template.RuleVersion {
68+
return nil, fmt.Errorf("rule version of %s is not matched with the rule template", r.Name)
69+
}
6570
params := rule.Params
6671

6772
// check request params is equal rule params.
@@ -85,10 +90,11 @@ func checkAndGenerateRules(rulesReq []RuleReqV1, template *model.RuleTemplate) (
8590
}
8691
}
8792
templateRules = append(templateRules, model.NewRuleTemplateRule(template, &model.Rule{
88-
Name: r.Name,
89-
Level: r.Level,
90-
DBType: template.DBType,
91-
Params: params,
93+
Name: r.Name,
94+
Level: r.Level,
95+
DBType: template.DBType,
96+
Params: params,
97+
Version: template.RuleVersion,
9298
}))
9399
}
94100
return templateRules, nil
@@ -278,7 +284,7 @@ type RuleTemplateDetailResV1 struct {
278284
Name string `json:"rule_template_name"`
279285
Desc string `json:"desc"`
280286
DBType string `json:"db_type"`
281-
RuleVersion string `json:"rule_version"`
287+
RuleVersion uint32 `json:"rule_version"`
282288
RuleList []RuleResV1 `json:"rule_list,omitempty"`
283289
}
284290

@@ -405,7 +411,7 @@ type RuleTemplateResV1 struct {
405411
Name string `json:"rule_template_name"`
406412
Desc string `json:"desc"`
407413
DBType string `json:"db_type"`
408-
RuleVersion string `json:"rule_version"`
414+
RuleVersion uint32 `json:"rule_version"`
409415
}
410416

411417
// @Summary 全局规则模板列表
@@ -469,7 +475,7 @@ type GetRulesReqV1 struct {
469475
FilterDBType string `json:"filter_db_type" query:"filter_db_type"`
470476
FilterGlobalRuleTemplateName string `json:"filter_global_rule_template_name" query:"filter_global_rule_template_name"`
471477
FilterRuleNames string `json:"filter_rule_names" query:"filter_rule_names"`
472-
FilterRuleVersion string `json:"filter_rule_version" query:"filter_rule_version"`
478+
FilterRuleVersion uint32 `json:"filter_rule_version" query:"filter_rule_version"`
473479
FuzzyKeywordRule string `json:"fuzzy_keyword_rule" query:"fuzzy_keyword_rule"`
474480
Tags string `json:"tags" query:"tags"`
475481
}
@@ -584,7 +590,7 @@ func convertRulesToRes(ctx context.Context, rules interface{}) []RuleResV1 {
584590
// @Param fuzzy_keyword_rule query string false "fuzzy rule,keyword for desc and annotation"
585591
// @Param filter_global_rule_template_name query string false "filter global rule template name"
586592
// @Param filter_rule_names query string false "filter rule name list"
587-
// @Param filter_rule_version query string false "filter rule version"
593+
// @Param filter_rule_version query uint32 false "filter rule version"
588594
// @Param tags query string false "filter tags"
589595
// @Success 200 {object} v1.GetRulesResV1
590596
// @router /v1/rules [get]
@@ -629,6 +635,39 @@ func GetRules(c echo.Context) error {
629635
})
630636
}
631637

638+
type GetDriverRuleVersionTipsResV1 struct {
639+
controller.BaseRes
640+
Data []GetDriverRuleVersionTipsV1 `json:"data"`
641+
}
642+
643+
type GetDriverRuleVersionTipsV1 struct {
644+
DBType string `json:"db_type" example:"mysql"`
645+
RuleVersions []uint32 `json:"rule_versions"`
646+
}
647+
648+
// @Summary 获取插件包含的规则版本
649+
// @Description get the rule versions contained in plugins
650+
// @Id GetDriverRuleVersionTips
651+
// @Tags rule_template
652+
// @Security ApiKeyAuth
653+
// @Success 200 {object} v1.GetDriverRuleVersionTipsResV1
654+
// @router /v1/rules_version_tips [get]
655+
func GetDriverRuleVersionTips(c echo.Context) error {
656+
metas := driver.GetPluginManager().AllDriverMetas()
657+
data := make([]GetDriverRuleVersionTipsV1, 0, len(metas))
658+
for _, v := range metas {
659+
data = append(data, GetDriverRuleVersionTipsV1{
660+
DBType: v.PluginName,
661+
RuleVersions: v.RuleVersionIncluded,
662+
})
663+
}
664+
665+
return c.JSON(http.StatusOK, &GetDriverRuleVersionTipsResV1{
666+
BaseRes: controller.NewBaseReq(nil),
667+
Data: data,
668+
})
669+
}
670+
632671
// GetCategoryStatistics
633672
// @Summary 获取规则分类统计信息
634673
// @Description get all rule category statistics
@@ -682,7 +721,7 @@ type RuleTemplateTipResV1 struct {
682721
ID string `json:"rule_template_id"`
683722
Name string `json:"rule_template_name"`
684723
DBType string `json:"db_type"`
685-
RuleVersion string `json:"rule_version"`
724+
RuleVersion uint32 `json:"rule_version"`
686725
IsDefaultRuleTemplate bool `json:"is_default_rule_template"`
687726
}
688727

@@ -815,7 +854,7 @@ type CreateProjectRuleTemplateReqV1 struct {
815854
Name string `json:"rule_template_name" valid:"required,name"`
816855
Desc string `json:"desc"`
817856
DBType string `json:"db_type" valid:"required"`
818-
RuleVersion string `json:"rule_version"`
857+
RuleVersion uint32 `json:"rule_version"`
819858
RuleList []RuleReqV1 `json:"rule_list" form:"rule_list" valid:"required,dive,required"`
820859
}
821860

@@ -983,7 +1022,7 @@ type RuleProjectTemplateDetailResV1 struct {
9831022
Name string `json:"rule_template_name"`
9841023
Desc string `json:"desc"`
9851024
DBType string `json:"db_type"`
986-
RuleVersion string `json:"rule_version"`
1025+
RuleVersion uint32 `json:"rule_version"`
9871026
RuleList []RuleResV1 `json:"rule_list,omitempty"`
9881027
}
9891028

@@ -1304,7 +1343,7 @@ type ParseProjectRuleTemplateFileResDataV1 struct {
13041343
Name string `json:"name"`
13051344
Desc string `json:"desc"`
13061345
DBType string `json:"db_type"`
1307-
RuleVersion string `json:"rule_version"`
1346+
RuleVersion uint32 `json:"rule_version"`
13081347
RuleList []RuleResV1 `json:"rule_list"`
13091348
}
13101349

@@ -1349,19 +1388,8 @@ var ErrRule = e.New("rule has error")
13491388

13501389
func checkRuleList(file *ParseProjectRuleTemplateFileResDataV1) (*RuleTemplateExportErr, error) {
13511390
ruleNameList := make([]string, 0, len(file.RuleList))
1352-
var hasNewRule, hasOldRule bool
13531391
for _, rule := range file.RuleList {
13541392
ruleNameList = append(ruleNameList, rule.Name)
1355-
if file.DBType == driverV2.DriverTypeMySQL {
1356-
hasNewRule = hasNewRule || strings.HasPrefix(rule.Name, "SQLE")
1357-
hasOldRule = hasOldRule || !strings.HasPrefix(rule.Name, "SQLE")
1358-
if hasOldRule && hasNewRule {
1359-
return nil, fmt.Errorf("cannot import rule template that contains both old and new rules")
1360-
}
1361-
if hasNewRule {
1362-
file.RuleVersion = "v2"
1363-
}
1364-
}
13651393
}
13661394

13671395
s := model.GetStorage()
@@ -1372,6 +1400,7 @@ func checkRuleList(file *ParseProjectRuleTemplateFileResDataV1) (*RuleTemplateEx
13721400

13731401
ruleTemplateExport := new(RuleTemplateExportErr)
13741402
ruleTemplateExport.Name = file.Name
1403+
ruleTemplateExport.RuleVersion = file.RuleVersion
13751404
ruleTemplateExport.DBType = file.DBType
13761405
ruleTemplateExport.Desc = file.Desc
13771406
ruleTemplateExport.RuleList = make([]RuleTemplateResErr, len(file.RuleList))
@@ -1456,10 +1485,15 @@ func parseRuleTemplate(c echo.Context, fileType ExportType) (*ParseProjectRuleTe
14561485
}
14571486

14581487
// 因为wps保存csv文件时会自动填充短的列的个数,所以使用 >= 符号作比较,避免解析csv文件错误
1459-
if len(rule) >= 3 && index == 1 {
1488+
if len(rule) >= 4 && index == 1 {
1489+
v, err := strconv.Atoi(rule[1])
1490+
if err != nil {
1491+
return nil, fmt.Errorf("parse rule version err: %w", err)
1492+
}
14601493
resp.Name = rule[0]
1461-
resp.Desc = rule[1]
1462-
resp.DBType = rule[2]
1494+
resp.RuleVersion = uint32(v)
1495+
resp.Desc = rule[2]
1496+
resp.DBType = rule[3]
14631497
index++
14641498
continue
14651499
}
@@ -1529,6 +1563,7 @@ func parseRuleTemplate(c echo.Context, fileType ExportType) (*ParseProjectRuleTe
15291563
return nil, fmt.Errorf("the file format is incorrect. Please check the uploaded file, error: %v", err)
15301564
}
15311565
resp.Name = ruleTemplateExport.Name
1566+
resp.RuleVersion = ruleTemplateExport.RuleVersion
15321567
resp.Desc = ruleTemplateExport.Desc
15331568
resp.DBType = ruleTemplateExport.DBType
15341569
err = ruleTemplateExportToParseDataV1(ruleTemplateExport, resp)
@@ -1571,6 +1606,7 @@ func parseRuleCategory(csvRule []string) map[string][]string {
15711606

15721607
func ruleTemplateExportToParseDataV1(ruleTemplateExport *RuleTemplateExport, parseResData *ParseProjectRuleTemplateFileResDataV1) error {
15731608
parseResData.Name = ruleTemplateExport.Name
1609+
parseResData.RuleVersion = ruleTemplateExport.RuleVersion
15741610
parseResData.Desc = ruleTemplateExport.Desc
15751611
parseResData.DBType = ruleTemplateExport.DBType
15761612
for _, rule := range ruleTemplateExport.RuleList {
@@ -1671,7 +1707,7 @@ func ExportRuleTemplateFile(c echo.Context) error {
16711707
func exportTemplateFile(c echo.Context, exportType ExportType, templateFile interface{}, templateName string) error {
16721708
switch exportType {
16731709
case CsvExportType:
1674-
var name, desc, dbType string
1710+
var name, ruleVersion, desc, dbType string
16751711
var columnNameList []string
16761712
var columnContentList [][]string
16771713

@@ -1714,6 +1750,7 @@ func exportTemplateFile(c echo.Context, exportType ExportType, templateFile inte
17141750

17151751
if ruleTemplateExport, ok := templateFile.(*RuleTemplateExport); ok {
17161752
name = ruleTemplateExport.Name
1753+
ruleVersion = fmt.Sprint(ruleTemplateExport.RuleVersion)
17171754
desc = ruleTemplateExport.Desc
17181755
dbType = ruleTemplateExport.DBType
17191756
columnNameList = defaultColumnNameList
@@ -1727,6 +1764,7 @@ func exportTemplateFile(c echo.Context, exportType ExportType, templateFile inte
17271764
}
17281765
} else if ruleTemplateExportErr, ok := templateFile.(*RuleTemplateExportErr); ok {
17291766
name = ruleTemplateExportErr.Name
1767+
ruleVersion = fmt.Sprint(ruleTemplateExportErr.RuleVersion)
17301768
desc = ruleTemplateExportErr.Desc
17311769
dbType = ruleTemplateExportErr.DBType
17321770
columnNameList = append(defaultColumnNameList, locale.Bundle.LocalizeMsgByCtx(ctx, locale.RuleTemplateRuleErr))
@@ -1752,9 +1790,10 @@ func exportTemplateFile(c echo.Context, exportType ExportType, templateFile inte
17521790
writer := csv.NewWriter(buf)
17531791
err := writer.WriteAll([][]string{{
17541792
locale.Bundle.LocalizeMsgByCtx(ctx, locale.RuleTemplateName),
1793+
locale.Bundle.LocalizeMsgByCtx(ctx, locale.RuleTemplateRuleVersion),
17551794
locale.Bundle.LocalizeMsgByCtx(ctx, locale.RuleTemplateDesc),
17561795
locale.Bundle.LocalizeMsgByCtx(ctx, locale.RuleTemplateInstType),
1757-
}, {name, desc, dbType}})
1796+
}, {name, ruleVersion, desc, dbType}})
17581797
if err != nil {
17591798
return controller.JSONBaseErrorReq(c, err)
17601799
}
@@ -1828,9 +1867,10 @@ type RuleTemplateExport struct {
18281867
}
18291868

18301869
type RuleTemplate struct {
1831-
Name string
1832-
Desc string
1833-
DBType string `json:"db_type"`
1870+
Name string
1871+
RuleVersion uint32
1872+
Desc string
1873+
DBType string `json:"db_type"`
18341874
}
18351875

18361876
type RuleTemplateRes struct {
@@ -1880,9 +1920,10 @@ func getRuleTemplateFile(ctx context.Context, projectID string, ruleTemplateName
18801920

18811921
resp := &RuleTemplateExport{
18821922
RuleTemplate: RuleTemplate{
1883-
Name: template.Name,
1884-
Desc: template.Desc,
1885-
DBType: template.DBType,
1923+
Name: template.Name,
1924+
RuleVersion: template.RuleVersion,
1925+
Desc: template.Desc,
1926+
DBType: template.DBType,
18861927
},
18871928
RuleList: []RuleTemplateRes{},
18881929
}

0 commit comments

Comments
 (0)