Skip to content

Commit

Permalink
add more tests
Browse files Browse the repository at this point in the history
Signed-off-by: lhy1024 <admin@liudos.us>
  • Loading branch information
lhy1024 committed Nov 15, 2023
1 parent 73e7c6b commit 9f55a95
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 19 deletions.
4 changes: 2 additions & 2 deletions pkg/mcs/scheduling/server/apis/v1/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ func (s *Service) RegisterConfigRouter() {
regionLabel := router.Group("region-label")
regionLabel.GET("/rules", getAllRegionLabelRules)
regionLabel.GET("/rules/ids", getRegionLabelRulesByIDs)
regionLabel.GET("/rule/:id", getRegionLabelRuleByID)
regionLabel.GET("/rules/:id", getRegionLabelRuleByID)

regions := router.Group("regions")
regions.GET("/:id/label/:key", getRegionLabelByKey)
Expand Down Expand Up @@ -1096,7 +1096,7 @@ func getRegionLabelRulesByIDs(c *gin.Context) {
// @Success 200 {object} labeler.LabelRule
// @Failure 404 {string} string "The rule does not exist."
// @Failure 500 {string} string "PD server failed to proceed the request."
// @Router /config/region-label/rule/{id} [get]
// @Router /config/region-label/rules/{id} [get]
func getRegionLabelRuleByID(c *gin.Context) {
handler := c.MustGet(handlerKey).(*handler.Handler)

Expand Down
7 changes: 6 additions & 1 deletion pkg/utils/apiutil/serverapi/middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,12 +132,17 @@ func (h *redirector) matchMicroServiceRedirectRules(r *http.Request) (bool, stri
log.Warn("failed to get the service primary addr when trying to match redirect rules",
zap.String("path", r.URL.Path))
}
// If the URL contains escaped characters, use RawPath instead of Path
path := r.URL.Path
if r.URL.RawPath != "" {
path = r.URL.RawPath
}
// Extract parameters from the URL path
// e.g. r.URL.Path = /pd/api/v1/operators/1 (before redirect)
// matchPath = /pd/api/v1/operators
// targetPath = /scheduling/api/v1/operators
// r.URL.Path = /scheduling/api/v1/operator/1 (after redirect)
pathParams := strings.TrimPrefix(r.URL.Path, rule.matchPath)
pathParams := strings.TrimPrefix(path, rule.matchPath)
pathParams = strings.Trim(pathParams, "/") // Remove leading and trailing '/'
if len(pathParams) > 0 {
r.URL.Path = rule.targetPath + "/" + pathParams
Expand Down
9 changes: 7 additions & 2 deletions server/api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,13 @@ func NewHandler(_ context.Context, svr *server.Server) (http.Handler, apiutil.AP
return strings.Contains(r.URL.Path, "label")
}),
serverapi.MicroserviceRedirectRule(
prefix+"/config/region-label",
scheapi.APIPathPrefix+"/config/region-label",
prefix+"/config/region-label/rules",
scheapi.APIPathPrefix+"/config/region-label/rules",
mcs.SchedulingServiceName,
[]string{http.MethodGet}),
serverapi.MicroserviceRedirectRule(
prefix+"/config/region-label/rule/", // Note: this is a typo in the original code
scheapi.APIPathPrefix+"/config/region-label/rules",
mcs.SchedulingServiceName,
[]string{http.MethodGet}),
serverapi.MicroserviceRedirectRule(
Expand Down
60 changes: 46 additions & 14 deletions tests/server/api/rule_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"github.com/stretchr/testify/suite"
"github.com/tikv/pd/pkg/core"
"github.com/tikv/pd/pkg/errs"
"github.com/tikv/pd/pkg/schedule/labeler"
"github.com/tikv/pd/pkg/schedule/placement"
tu "github.com/tikv/pd/pkg/utils/testutil"
"github.com/tikv/pd/server/config"
Expand Down Expand Up @@ -1057,49 +1058,80 @@ func (suite *regionRuleTestSuite) checkRegionPlacementRule(cluster *tests.TestCl
})
fit := &placement.RegionFit{}

url := fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 1)
err := tu.ReadGetJSON(re, testDialClient, url, fit)
u := fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 1)
err := tu.ReadGetJSON(re, testDialClient, u, fit)
suite.NoError(err)
suite.Equal(len(fit.RuleFits), 1)
suite.Equal(len(fit.OrphanPeers), 1)
url = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 2)
u = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 2)
fit = &placement.RegionFit{}
err = tu.ReadGetJSON(re, testDialClient, url, fit)
err = tu.ReadGetJSON(re, testDialClient, u, fit)
suite.NoError(err)
suite.Equal(len(fit.RuleFits), 2)
suite.Equal(len(fit.OrphanPeers), 0)
url = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 3)
u = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 3)
fit = &placement.RegionFit{}
err = tu.ReadGetJSON(re, testDialClient, url, fit)
err = tu.ReadGetJSON(re, testDialClient, u, fit)
suite.NoError(err)
suite.Equal(len(fit.RuleFits), 0)
suite.Equal(len(fit.OrphanPeers), 2)

url = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 4)
err = tu.CheckGetJSON(testDialClient, url, nil, tu.Status(re, http.StatusNotFound), tu.StringContain(
var label labeler.LabelRule
escapedID := url.PathEscape("keyspaces/0")
u = fmt.Sprintf("%s/config/region-label/rule/%s", urlPrefix, escapedID)
fmt.Println("u====", u)
err = tu.ReadGetJSON(re, testDialClient, u, &label)
suite.NoError(err)
suite.Equal(label.ID, "keyspaces/0")

var labels []labeler.LabelRule
u = fmt.Sprintf("%s/config/region-label/rules", urlPrefix)
err = tu.ReadGetJSON(re, testDialClient, u, &labels)
suite.NoError(err)
suite.Len(labels, 1)
suite.Equal(labels[0].ID, "keyspaces/0")

u = fmt.Sprintf("%s/config/region-label/rules/ids", urlPrefix)
err = tu.CheckGetJSON(testDialClient, u, []byte(`["rule1", "rule3"]`), func(resp []byte, statusCode int, _ http.Header) {
err := json.Unmarshal(resp, &labels)
suite.NoError(err)
suite.Len(labels, 0)
})
suite.NoError(err)

err = tu.CheckGetJSON(testDialClient, u, []byte(`["keyspaces/0"]`), func(resp []byte, statusCode int, _ http.Header) {
err := json.Unmarshal(resp, &labels)
suite.NoError(err)
suite.Len(labels, 1)
suite.Equal(labels[0].ID, "keyspaces/0")
})
suite.NoError(err)

u = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 4)
err = tu.CheckGetJSON(testDialClient, u, nil, tu.Status(re, http.StatusNotFound), tu.StringContain(
re, "region 4 not found"))
suite.NoError(err)

url = fmt.Sprintf("%s/config/rules/region/%s/detail", urlPrefix, "id")
err = tu.CheckGetJSON(testDialClient, url, nil, tu.Status(re, http.StatusBadRequest), tu.StringContain(
u = fmt.Sprintf("%s/config/rules/region/%s/detail", urlPrefix, "id")
err = tu.CheckGetJSON(testDialClient, u, nil, tu.Status(re, http.StatusBadRequest), tu.StringContain(
re, errs.ErrRegionInvalidID.Error()))
suite.NoError(err)

data := make(map[string]interface{})
data["enable-placement-rules"] = "false"
reqData, e := json.Marshal(data)
re.NoError(e)
url = fmt.Sprintf("%s/config", urlPrefix)
err = tu.CheckPostJSON(testDialClient, url, reqData, tu.StatusOK(re))
u = fmt.Sprintf("%s/config", urlPrefix)
err = tu.CheckPostJSON(testDialClient, u, reqData, tu.StatusOK(re))
re.NoError(err)
if sche := cluster.GetSchedulingPrimaryServer(); sche != nil {
// wait for the scheduler server to update the config
tu.Eventually(re, func() bool {
return !sche.GetCluster().GetCheckerConfig().IsPlacementRulesEnabled()
})
}
url = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 1)
err = tu.CheckGetJSON(testDialClient, url, nil, tu.Status(re, http.StatusPreconditionFailed), tu.StringContain(
u = fmt.Sprintf("%s/config/rules/region/%d/detail", urlPrefix, 1)
err = tu.CheckGetJSON(testDialClient, u, nil, tu.Status(re, http.StatusPreconditionFailed), tu.StringContain(
re, "placement rules feature is disabled"))
suite.NoError(err)
}

0 comments on commit 9f55a95

Please sign in to comment.