Skip to content

Commit

Permalink
upgrade code according to the new serverless api
Browse files Browse the repository at this point in the history
  • Loading branch information
shiyuhang0 committed Dec 8, 2023
1 parent b94e3fa commit 42b0c68
Show file tree
Hide file tree
Showing 14 changed files with 102 additions and 111 deletions.
4 changes: 2 additions & 2 deletions internal/cli/cluster/cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ import (

func ClusterCmd(h *internal.Helper) *cobra.Command {
var clusterCmd = &cobra.Command{
Use: "cluster",
Short: "Manage your clusters",
Use: "serverless",
Short: "Manage your TiDB Serverless clusters",
}

clusterCmd.AddCommand(CreateCmd(h))
Expand Down
6 changes: 3 additions & 3 deletions internal/cli/cluster/connectinfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,12 +211,12 @@ func ConnectInfoCmd(h *internal.Helper) *cobra.Command {

cmd := &cobra.Command{
Use: "connect-info",
Short: "Get connection string for the specified cluster",
Short: "Get connection string for the specified serverless cluster",
Example: fmt.Sprintf(` Get connection string in interactive mode:
$ %[1]s cluster connect-info
$ %[1]s serverless connect-info
Get connection string in non-interactive mode:
$ %[1]s cluster connect-info --cluster-id <cluster-id> --client <client-name> --operating-system <operating-system>
$ %[1]s serverless connect-info --cluster-id <cluster-id> --client <client-name> --operating-system <operating-system>
`, config.CliName),
PreRunE: func(cmd *cobra.Command, args []string) error {
flags := opts.NonInteractiveFlags()
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/cluster/connectinfo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ func (suite *ConnectInfoSuite) TestConnectInfoArgs() {
suite.mockClient.On("GetConnectInfo", connectInfoService.NewGetInfoParams()).
Return(getConnectInfoResult, nil)

clusterBody := &serverlessModel.V1Cluster{}
clusterBody := &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{}
err = json.Unmarshal([]byte(getClusterResultStr), clusterBody)
assert.Nil(err)
getClusterResult := &serverlessApi.ServerlessServiceGetClusterOK{
Expand Down
67 changes: 21 additions & 46 deletions internal/cli/cluster/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ const (
)

type CreateOpts struct {
serverlessProviders []*serverlessModel.TidbCloudApiserverlessv1Region
serverlessProviders []*serverlessModel.TidbCloudOpenApiserverlessv1beta1Region
interactive bool
}

Expand All @@ -72,7 +72,6 @@ func (c CreateOpts) NonInteractiveFlags() []string {
func (c CreateOpts) RequiredFlags() []string {
return []string{
flag.ClusterName,
flag.ClusterType,
flag.CloudProvider,
flag.Region,
}
Expand All @@ -85,16 +84,16 @@ func CreateCmd(h *internal.Helper) *cobra.Command {

var createCmd = &cobra.Command{
Use: "create",
Short: "Create one cluster",
Short: "Create one serverless cluster",
Annotations: make(map[string]string),
Example: fmt.Sprintf(` Create a cluster in interactive mode:
$ %[1]s cluster create
Example: fmt.Sprintf(` Create a serverless cluster in interactive mode:
$ %[1]s serverless create
Create a cluster of the default ptoject in non-interactive mode:
$ %[1]s cluster create --cluster-name <cluster-name> --cloud-provider <cloud-provider> -r <region> --cluster-type <cluster-type>
Create a serverless cluster of the default ptoject in non-interactive mode:
$ %[1]s serverless create --cluster-name <cluster-name> --cloud-provider <cloud-provider> -r <region>
Create a cluster in non-interactive mode:
$ %[1]s cluster create --project-id <project-id> --cluster-name <cluster-name> --cloud-provider <cloud-provider> -r <region> --cluster-type <cluster-type>`,
Create a serverless cluster in non-interactive mode:
$ %[1]s serverless create --project-id <project-id> --cluster-name <cluster-name> --cloud-provider <cloud-provider> -r <region>`,
config.CliName),
PreRunE: func(cmd *cobra.Command, args []string) error {
flags := opts.NonInteractiveFlags()
Expand Down Expand Up @@ -124,7 +123,6 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
}

var clusterName string
var clusterType string
var cloudProvider string
var region string
var projectID string
Expand All @@ -142,30 +140,16 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
}
opts.serverlessProviders = regions.Payload.Regions

model, err := ui.InitialSelectModel([]interface{}{serverlessType}, "Choose the cluster type:")
if err != nil {
return err
}
p := tea.NewProgram(model)
typeModel, err := p.StartReturningModel()
if err != nil {
return errors.Trace(err)
}
if m, _ := typeModel.(ui.SelectModel); m.Interrupted {
return util.InterruptError
}
clusterType = typeModel.(ui.SelectModel).Choices[typeModel.(ui.SelectModel).Selected].(string)

// distinct cloud providers
set := hashset.New()
providers := hashset.New()
for _, provider := range opts.serverlessProviders {
set.Add(string(*provider.Provider))
providers.Add(string(*provider.Provider))
}
model, err = ui.InitialSelectModel(set.Values(), "Choose the cloud provider:")
model, err := ui.InitialSelectModel(providers.Values(), "Choose the cloud provider:")
if err != nil {
return err
}
p = tea.NewProgram(model)
p := tea.NewProgram(model)
providerModel, err := p.StartReturningModel()
if err != nil {
return errors.Trace(err)
Expand All @@ -176,17 +160,17 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
cloudProvider = providerModel.(ui.SelectModel).Choices[providerModel.(ui.SelectModel).Selected].(string)

// filter out regions for the selected cloud provider
set = hashset.New()
regionSet := hashset.New()
for _, provider := range opts.serverlessProviders {
if string(*provider.Provider) == cloudProvider {
set.Add(cloud.Region{
regionSet.Add(cloud.Region{
Name: *provider.Name,
DisplayName: provider.DisplayName,
Provider: string(*provider.Provider),
})
}
}
model, err = ui.InitialSelectModel(set.Values(), "Choose the cloud region:")
model, err = ui.InitialSelectModel(regionSet.Values(), "Choose the cloud region:")
if err != nil {
return err
}
Expand Down Expand Up @@ -240,10 +224,6 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
if err != nil {
return errors.Trace(err)
}
clusterType, err = cmd.Flags().GetString(flag.ClusterType)
if err != nil {
return errors.Trace(err)
}
cloudProvider, err = cmd.Flags().GetString(flag.CloudProvider)
if err != nil {
return errors.Trace(err)
Expand All @@ -267,13 +247,9 @@ func CreateCmd(h *internal.Helper) *cobra.Command {

cmd.Annotations[telemetry.ProjectID] = projectID

if clusterType != serverlessType {
return errors.New("Currently only \"SERVERLESS\" cluster are supported to create in CLI")
}

v1Cluster := &serverlessModel.V1Cluster{
v1Cluster := &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{
DisplayName: &clusterName,
Region: &serverlessModel.TidbCloudApiserverlessv1Region{
Region: &serverlessModel.TidbCloudOpenApiserverlessv1beta1Region{
Name: &region,
},
}
Expand All @@ -288,12 +264,12 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
}

if h.IOStreams.CanPrompt {
err := CreateAndSpinnerWait(ctx, d, projectID, v1Cluster, h)
err := CreateAndSpinnerWait(ctx, d, v1Cluster, h)
if err != nil {
return errors.Trace(err)
}
} else {
err := CreateAndWaitReady(h, d, projectID, v1Cluster)
err := CreateAndWaitReady(h, d, v1Cluster)
if err != nil {
return err
}
Expand All @@ -304,15 +280,14 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
}

createCmd.Flags().String(flag.ClusterName, "", "Name of the cluster to de created")
createCmd.Flags().String(flag.ClusterType, "", "Cluster type, only support \"SERVERLESS\" now")
createCmd.Flags().String(flag.CloudProvider, "", "Cloud provider, one of [\"AWS\"]")
createCmd.Flags().StringP(flag.Region, flag.RegionShort, "", "Cloud region")
createCmd.Flags().StringP(flag.ProjectID, flag.ProjectIDShort, "", "The ID of the project, in which the cluster will be created (optional: default \"default project\")")
createCmd.Flags().Int32(flag.SpendingLimitMonthly, 0, "The monthly spending limit of the cluster (optional)")
return createCmd
}

func CreateAndWaitReady(h *internal.Helper, d cloud.TiDBCloudClient, projectID string, v1Cluster *serverlessModel.V1Cluster) error {
func CreateAndWaitReady(h *internal.Helper, d cloud.TiDBCloudClient, v1Cluster *serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster) error {
createClusterResult, err := d.CreateCluster(serverlessApi.NewServerlessServiceCreateClusterParams().WithCluster(v1Cluster))
if err != nil {
return errors.Trace(err)
Expand Down Expand Up @@ -342,7 +317,7 @@ func CreateAndWaitReady(h *internal.Helper, d cloud.TiDBCloudClient, projectID s
}
}

func CreateAndSpinnerWait(ctx context.Context, d cloud.TiDBCloudClient, projectID string, v1Cluster *serverlessModel.V1Cluster, h *internal.Helper) error {
func CreateAndSpinnerWait(ctx context.Context, d cloud.TiDBCloudClient, v1Cluster *serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster, h *internal.Helper) error {
// use spinner to indicate that the cluster is being created
task := func() tea.Msg {
createClusterResult, err := d.CreateCluster(serverlessApi.NewServerlessServiceCreateClusterParams().WithCluster(v1Cluster))
Expand Down
16 changes: 8 additions & 8 deletions internal/cli/cluster/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@ func (suite *CreateClusterSuite) TestCreateClusterArgs() {
cloudProvider := "AWS"
region := "us-west-1"
clusterType := "SERVERLESS"
v1Cluster := &serverlessModel.V1Cluster{
v1Cluster := &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{
DisplayName: &clusterName,
Region: &serverlessModel.TidbCloudApiserverlessv1Region{
Region: &serverlessModel.TidbCloudOpenApiserverlessv1beta1Region{
Name: &regionName,
},
Labels: map[string]string{"tidb.cloud/project": projectID},
}

body := &serverlessModel.V1Cluster{}
body := &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{}
err := json.Unmarshal([]byte(getClusterResultStr), body)
assert.Nil(err)
res := &serverlessApi.ServerlessServiceGetClusterOK{
Expand All @@ -82,7 +82,7 @@ func (suite *CreateClusterSuite) TestCreateClusterArgs() {
suite.mockClient.On("CreateCluster", serverlessApi.NewServerlessServiceCreateClusterParams().
WithCluster(v1Cluster)).
Return(&serverlessApi.ServerlessServiceCreateClusterOK{
Payload: &serverlessModel.V1Cluster{
Payload: &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{
ClusterID: clusterID,
},
}, nil)
Expand Down Expand Up @@ -137,14 +137,14 @@ func (suite *CreateClusterSuite) TestCreateClusterWithoutProject() {
region := "us-west-1"
clusterType := "SERVERLESS"

v1ClusterWithoutProject := &serverlessModel.V1Cluster{
v1ClusterWithoutProject := &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{
DisplayName: &clusterName,
Region: &serverlessModel.TidbCloudApiserverlessv1Region{
Region: &serverlessModel.TidbCloudOpenApiserverlessv1beta1Region{
Name: &regionName,
},
}

body := &serverlessModel.V1Cluster{}
body := &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{}
err := json.Unmarshal([]byte(getClusterResultStr), body)
assert.Nil(err)
res := &serverlessApi.ServerlessServiceGetClusterOK{
Expand All @@ -154,7 +154,7 @@ func (suite *CreateClusterSuite) TestCreateClusterWithoutProject() {
suite.mockClient.On("CreateCluster", serverlessApi.NewServerlessServiceCreateClusterParams().
WithCluster(v1ClusterWithoutProject)).
Return(&serverlessApi.ServerlessServiceCreateClusterOK{
Payload: &serverlessModel.V1Cluster{
Payload: &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{
ClusterID: clusterID,
},
}, nil)
Expand Down
10 changes: 5 additions & 5 deletions internal/cli/cluster/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ func DeleteCmd(h *internal.Helper) *cobra.Command {
var force bool
var deleteCmd = &cobra.Command{
Use: "delete",
Short: "Delete a cluster",
Short: "Delete a serverless cluster",
Annotations: make(map[string]string),
Example: fmt.Sprintf(` Delete a cluster in interactive mode:
$ %[1]s cluster delete
Example: fmt.Sprintf(` Delete a serverless cluster in interactive mode:
$ %[1]s serverless delete
Delete a cluster in non-interactive mode:
$ %[1]s cluster delete -c <cluster-id>`, config.CliName),
Delete a serverless cluster in non-interactive mode:
$ %[1]s serverless delete -c <cluster-id>`, config.CliName),
Aliases: []string{"rm"},
PreRunE: func(cmd *cobra.Command, args []string) error {
flags := opts.NonInteractiveFlags()
Expand Down
4 changes: 2 additions & 2 deletions internal/cli/cluster/delete_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ func (suite *DeleteClusterSuite) TestDeleteClusterArgs() {
suite.mockClient.On("DeleteCluster", serverlessApi.NewServerlessServiceDeleteClusterParams().
WithClusterID(clusterID)).
Return(&serverlessApi.ServerlessServiceDeleteClusterOK{
Payload: &serverlessModel.V1Cluster{
State: (*serverlessModel.ClusterState)(&state),
Payload: &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{
State: (*serverlessModel.TidbCloudOpenApiserverlessv1beta1ClusterState)(&state),
},
}, nil)

Expand Down
18 changes: 9 additions & 9 deletions internal/cli/cluster/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,20 +47,20 @@ func DescribeCmd(h *internal.Helper) *cobra.Command {

var describeCmd = &cobra.Command{
Use: "describe",
Short: "Describe a cluster",
Short: "Describe a serverless cluster",
Aliases: []string{"get"},
Annotations: make(map[string]string),
Example: fmt.Sprintf(` Get the cluster info in interactive mode:
$ %[1]s cluster describe
Example: fmt.Sprintf(` Get the serverless cluster info in interactive mode:
$ %[1]s serverless describe
Get the Basic cluster info in interactive mode:
$ %[1]s cluster describe -v BASIC
Get the Basic serverless cluster info in interactive mode:
$ %[1]s serverless describe -v BASIC
Get the cluster info in non-interactive mode:
$ %[1]s cluster describe -c <cluster-id>
Get the serverless cluster info in non-interactive mode:
$ %[1]s serverless describe -c <cluster-id>
Get the Basic cluster info in non-interactive mode:
$ %[1]s cluster describe -c <cluster-id> -v BASIC`, config.CliName),
Get the Basic serverless cluster info in non-interactive mode:
$ %[1]s serverless describe -c <cluster-id> -v BASIC`, config.CliName),
PreRunE: func(cmd *cobra.Command, args []string) error {
flags := opts.NonInteractiveFlags()
for _, fn := range flags {
Expand Down
2 changes: 1 addition & 1 deletion internal/cli/cluster/describe_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ func (suite *DescribeClusterSuite) SetupTest() {
func (suite *DescribeClusterSuite) TestDescribeClusterArgs() {
assert := require.New(suite.T())

body := &serverlessModel.V1Cluster{}
body := &serverlessModel.TidbCloudOpenApiserverlessv1beta1Cluster{}
err := json.Unmarshal([]byte(getClusterResultStr), body)
assert.Nil(err)
result := &serverlessApi.ServerlessServiceGetClusterOK{
Expand Down
Loading

0 comments on commit 42b0c68

Please sign in to comment.