Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

client: add sdk api to get the config of the special scheduler #9140

Merged
merged 6 commits into from
Mar 19, 2025
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions client/errs/errno.go
Original file line number Diff line number Diff line change
@@ -116,3 +116,8 @@ type ErrClientGetResourceGroup struct {
func (e *ErrClientGetResourceGroup) Error() string {
return fmt.Sprintf("get resource group %s failed, %s", e.ResourceGroupName, e.Cause)
}

// scheduler errors
var (
ErrSchedulerConfigUnavailable = errors.Normalize("scheduler config is unavailable, %v", errors.RFCCodeText("PD:client:ErrSchedulerConfigUnavailable"))
)
7 changes: 7 additions & 0 deletions client/http/api.go
Original file line number Diff line number Diff line change
@@ -17,6 +17,7 @@ package http
import (
"fmt"
"net/url"
"path"
"time"
)

@@ -60,6 +61,7 @@ const (
RegionLabelRulesByIDs = "/pd/api/v1/config/region-label/rules/ids"
// Scheduler
Schedulers = "/pd/api/v1/schedulers"
SchedulerConfig = "/pd/api/v1/scheduler-config"
scatterRangeScheduler = "/pd/api/v1/schedulers/scatter-range-scheduler-"
// Admin
ResetTS = "/pd/api/v1/admin/reset-ts"
@@ -177,6 +179,11 @@ func PlacementRuleGroupByID(id string) string {
return fmt.Sprintf("%s/%s", placementRuleGroup, id)
}

// GetSchedulerConfigURIByName returns the path of PD HTTP API to get configuration of the given scheduler
func GetSchedulerConfigURIByName(name string) string {
return path.Join(SchedulerConfig, name, "list")
}

// SchedulerByName returns the scheduler API with the given scheduler name.
func SchedulerByName(name string) string {
return fmt.Sprintf("%s/%s", Schedulers, name)
30 changes: 30 additions & 0 deletions client/http/interface.go
Original file line number Diff line number Diff line change
@@ -67,8 +67,10 @@
/* Scheduler-related interfaces */
GetSchedulers(context.Context) ([]string, error)
CreateScheduler(ctx context.Context, name string, storeID uint64) error
CreateSchedulerWithInput(ctx context.Context, name string, input map[string]any) error
DeleteScheduler(ctx context.Context, name string) error
SetSchedulerDelay(context.Context, string, int64) error
GetSchedulerConfig(ctx context.Context, name string) (any, error)
/* Rule-related interfaces */
GetAllPlacementRuleBundles(context.Context) ([]*GroupBundle, error)
GetPlacementRuleBundleByGroup(context.Context, string) (*GroupBundle, error)
@@ -768,6 +770,34 @@
return schedulers, nil
}

// GetSchedulerConfig returns the configuration of the specified scheduler for pd cluster
func (c *client) GetSchedulerConfig(ctx context.Context, name string) (any, error) {
var config any
err := c.request(ctx, newRequestInfo().
WithName(getSchedulerConfig).
WithURI(GetSchedulerConfigURIByName(name)).
WithMethod(http.MethodGet).
WithResp(&config))
if err != nil {
return nil, err
}

Check warning on line 783 in client/http/interface.go

Codecov / codecov/patch

client/http/interface.go#L782-L783

Added lines #L782 - L783 were not covered by tests
return config, nil
}

// CreateSchedulerWithInput creates a scheduler with the specified input.
func (c *client) CreateSchedulerWithInput(ctx context.Context, name string, input map[string]any) error {
input["name"] = name
inputJSON, err := json.Marshal(input)
if err != nil {
return errors.Trace(err)
}

Check warning on line 793 in client/http/interface.go

Codecov / codecov/patch

client/http/interface.go#L792-L793

Added lines #L792 - L793 were not covered by tests
return c.request(ctx, newRequestInfo().
WithName(createSchedulerName).
WithURI(Schedulers).
WithMethod(http.MethodPost).
WithBody(inputJSON))
}

// CreateScheduler creates a scheduler to PD cluster.
func (c *client) CreateScheduler(ctx context.Context, name string, storeID uint64) error {
inputJSON, err := json.Marshal(map[string]any{
1 change: 1 addition & 0 deletions client/http/request_info.go
Original file line number Diff line number Diff line change
@@ -54,6 +54,7 @@ const (
getStatusName = "GetStatus"
getReplicateConfigName = "GetReplicateConfig"
getSchedulersName = "GetSchedulers"
getSchedulerConfig = "GetSchedulerConfig"
createSchedulerName = "CreateScheduler"
deleteSchedulerName = "DeleteScheduler"
setSchedulerDelayName = "SetSchedulerDelay"
20 changes: 17 additions & 3 deletions tests/integrations/client/http_client_test.go
Original file line number Diff line number Diff line change
@@ -568,9 +568,16 @@ func (suite *httpClientTestSuite) TestSchedulers() {

err = client.CreateScheduler(ctx, schedulerName, 1)
re.NoError(err)
schedulers, err = client.GetSchedulers(ctx)
re.NoError(err)
re.Contains(schedulers, schedulerName)
checkScheduler := func() {
schedulers, err = client.GetSchedulers(ctx)
re.NoError(err)
re.Contains(schedulers, schedulerName)
config, err := client.GetSchedulerConfig(ctx, schedulerName)
re.NoError(err)
re.Contains(config, "store-id-ranges")
re.Contains(config, "batch")
}
checkScheduler()
err = client.SetSchedulerDelay(ctx, schedulerName, 100)
re.NoError(err)
err = client.SetSchedulerDelay(ctx, "not-exist", 100)
@@ -580,6 +587,13 @@ func (suite *httpClientTestSuite) TestSchedulers() {
schedulers, err = client.GetSchedulers(ctx)
re.NoError(err)
re.NotContains(schedulers, schedulerName)

input := map[string]any{
"store_id": 1,
}
re.NoError(client.CreateSchedulerWithInput(ctx, schedulerName, input))
checkScheduler()
re.NoError(client.DeleteScheduler(ctx, schedulerName))
}

func (suite *httpClientTestSuite) TestStoreLabels() {