Skip to content

Commit 8d5186a

Browse files
committed
polish
1 parent f5adb76 commit 8d5186a

File tree

12 files changed

+109
-142
lines changed

12 files changed

+109
-142
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ require (
4444

4545
require (
4646
filippo.io/edwards25519 v1.1.0 // indirect
47+
github.com/AlekSi/pointer v1.2.0 // indirect
4748
github.com/alecthomas/chroma v0.10.0 // indirect
4849
github.com/alecthomas/chroma/v2 v2.14.0 // indirect
4950
github.com/alessio/shellescape v1.4.1 // indirect

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XB
2727
github.com/99designs/keyring v1.2.2/go.mod h1:wes/FrByc8j7lFOAGLGSNEg8f/PaI3cgTBqhFkHUrPk=
2828
github.com/AlecAivazis/survey/v2 v2.3.6 h1:NvTuVHISgTHEHeBFqt6BHOe4Ny/NwGZr7w+F8S9ziyw=
2929
github.com/AlecAivazis/survey/v2 v2.3.6/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI=
30+
github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w=
31+
github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0=
3032
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1 h1:E+OJmp2tPvt1W+amx48v1eqbjDYsgN+RzP4q16yV5eM=
3133
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.11.1/go.mod h1:a6xsAQUZg+VsS3TJ05SRp524Hs4pZ/AeFSr5ENf0Yjo=
3234
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.2 h1:FDif4R1+UUR+00q6wquyX90K7A8dN+R5E8GEadoP7sU=

internal/cli/serverless/migration/create.go

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"encoding/json"
2020
"fmt"
2121
"os"
22+
"slices"
2223
"strings"
2324
"time"
2425

@@ -42,8 +43,8 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
4243
Short: "Create a migration",
4344
Args: cobra.NoArgs,
4445
Example: fmt.Sprintf(` Create a migration:
45-
$ %[1]s serverless migration create -c <cluster-id> --display-name <name> --config-file <file-path> --dry-run
46-
$ %[1]s serverless migration create -c <cluster-id> --display-name <name> --config-file <file-path>
46+
$ %[1]s serverless migration create -c <cluster-id> --display-name <name> --config-file <file-path> --dry-run
47+
$ %[1]s serverless migration create -c <cluster-id> --display-name <name> --config-file <file-path>
4748
`, config.CliName),
4849
PreRunE: func(cmd *cobra.Command, args []string) error {
4950
return markCreateMigrationRequiredFlags(cmd)
@@ -67,6 +68,9 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
6768
if err != nil {
6869
return errors.Trace(err)
6970
}
71+
if strings.TrimSpace(name) == "" {
72+
return errors.New("display name is required")
73+
}
7074
configPath, err := cmd.Flags().GetString(flag.MigrationConfigFile)
7175
if err != nil {
7276
return errors.Trace(err)
@@ -81,9 +85,6 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
8185
}
8286
definitionStr := string(definitionBytes)
8387

84-
if strings.TrimSpace(name) == "" {
85-
return errors.New("display name is required")
86-
}
8788
sources, target, mode, err := parseMigrationDefinition(definitionStr)
8889
if err != nil {
8990
return err
@@ -111,16 +112,16 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
111112
return errors.Trace(err)
112113
}
113114

114-
taskID := aws.ToString(resp.MigrationId)
115-
fmt.Fprintln(h.IOStreams.Out, color.GreenString("migration %s(%s) created", name, taskID))
115+
migrationID := aws.ToString(resp.MigrationId)
116+
fmt.Fprintln(h.IOStreams.Out, color.GreenString("migration %s(%s) created", name, migrationID))
116117
return nil
117118
},
118119
}
119120

120121
cmd.Flags().StringP(flag.ClusterID, flag.ClusterIDShort, "", "The ID of the target cluster.")
121122
cmd.Flags().StringP(flag.DisplayName, flag.DisplayNameShort, "", "Display name for the migration.")
122123
cmd.Flags().String(flag.MigrationConfigFile, "", "Path to a migration config JSON file. Use \"ticloud serverless migration template --mode <mode>\" to print templates.")
123-
cmd.Flags().Bool(flag.MigrationDryRun, false, "Run a migration precheck (dry run) with the provided inputs without creating a task.")
124+
cmd.Flags().Bool(flag.MigrationDryRun, false, "Run a migration precheck (dry run) with the provided inputs without creating a migration.")
124125

125126
return cmd
126127
}
@@ -168,7 +169,7 @@ func runMigrationPrecheck(ctx context.Context, client cloud.TiDBCloudClient, clu
168169
if err != nil {
169170
return errors.Trace(err)
170171
}
171-
finished, err := printPrecheckSummary(precheckID, result.GetStatus(), result, h)
172+
finished, err := printPrecheckSummary(result, h)
172173
if err != nil {
173174
return err
174175
}
@@ -195,15 +196,15 @@ func isPrecheckUnfinished(status pkgmigration.MigrationPrecheckStatus) bool {
195196
}
196197
}
197198

198-
func printPrecheckSummary(id string, status pkgmigration.MigrationPrecheckStatus, result *pkgmigration.MigrationPrecheck, h *internal.Helper) (bool, error) {
199-
if isPrecheckUnfinished(status) {
200-
fmt.Fprintf(h.IOStreams.Out, "precheck %s summary (status %s)\n", id, status)
199+
func printPrecheckSummary(result *pkgmigration.MigrationPrecheck, h *internal.Helper) (bool, error) {
200+
if isPrecheckUnfinished(result.GetStatus()) {
201+
fmt.Fprintf(h.IOStreams.Out, "precheck %s summary (status %s)\n", result.GetPrecheckId(), result.GetStatus())
201202
fmt.Fprintf(h.IOStreams.Out, "Total: %d, Success: %d, Warn: %d, Failed: %d\n",
202203
aws.ToInt32(result.Total), aws.ToInt32(result.SuccessCnt), aws.ToInt32(result.WarnCnt), aws.ToInt32(result.FailedCnt))
203204
return false, nil
204205
}
205206

206-
fmt.Fprintf(h.IOStreams.Out, "precheck %s finished with status %s\n", id, status)
207+
fmt.Fprintf(h.IOStreams.Out, "precheck %s finished with status %s\n", result.GetPrecheckId(), result.GetStatus())
207208
fmt.Fprintf(h.IOStreams.Out, "Total: %d, Success: %d, Warn: %d, Failed: %d\n",
208209
aws.ToInt32(result.Total), aws.ToInt32(result.SuccessCnt), aws.ToInt32(result.WarnCnt), aws.ToInt32(result.FailedCnt))
209210
if len(result.Items) == 0 {
@@ -289,24 +290,14 @@ func parseMigrationDefinition(value string) ([]pkgmigration.Source, pkgmigration
289290
func parseMigrationMode(value string) (pkgmigration.TaskMode, error) {
290291
trimmed := strings.TrimSpace(value)
291292
if trimmed == "" {
292-
return "", errors.New("mode is required in the migration definition")
293+
return "", errors.New("empty config file")
293294
}
294295
normalized := strings.ToUpper(trimmed)
295296
mode := pkgmigration.TaskMode(normalized)
296-
for _, allowed := range pkgmigration.AllowedTaskModeEnumValues {
297-
if mode == allowed {
298-
return mode, nil
299-
}
300-
}
301-
return "", errors.Errorf("invalid mode %q, allowed values: %s", value, strings.Join(taskModeValues(), ", "))
302-
}
303-
304-
func taskModeValues() []string {
305-
values := make([]string, 0, len(pkgmigration.AllowedTaskModeEnumValues))
306-
for _, mode := range pkgmigration.AllowedTaskModeEnumValues {
307-
values = append(values, string(mode))
297+
if slices.Contains(pkgmigration.AllowedTaskModeEnumValues, mode) {
298+
return mode, nil
308299
}
309-
return values
300+
return "", errors.Errorf("invalid mode %q, allowed values: %s", value, pkgmigration.AllowedTaskModeEnumValues)
310301
}
311302

312303
// standardizeJSON accepts JSON With Commas and Comments(JWCC) see

internal/cli/serverless/migration/delete.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ type DeleteOpts struct {
3737
func (c DeleteOpts) NonInteractiveFlags() []string {
3838
return []string{
3939
flag.ClusterID,
40-
flag.MigrationTaskID,
40+
flag.MigrationID,
4141
}
4242
}
4343

@@ -65,14 +65,14 @@ func DeleteCmd(h *internal.Helper) *cobra.Command {
6565

6666
var cmd = &cobra.Command{
6767
Use: "delete",
68-
Short: "Delete a migration task",
68+
Short: "Delete a migration",
6969
Aliases: []string{"rm"},
7070
Args: cobra.NoArgs,
71-
Example: fmt.Sprintf(` Delete a migration task in interactive mode:
72-
$ %[1]s serverless migration delete
71+
Example: fmt.Sprintf(` Delete a migration in interactive mode:
72+
$ %[1]s serverless migration delete
7373
74-
Delete a migration task in non-interactive mode:
75-
$ %[1]s serverless migration delete -c <cluster-id> --migration-id <task-id>`, config.CliName),
74+
Delete a migration in non-interactive mode:
75+
$ %[1]s serverless migration delete -c <cluster-id> --migration-id <migration-id>`, config.CliName),
7676
PreRunE: func(cmd *cobra.Command, args []string) error {
7777
return opts.MarkInteractive(cmd)
7878
},
@@ -83,7 +83,7 @@ func DeleteCmd(h *internal.Helper) *cobra.Command {
8383
}
8484
ctx := cmd.Context()
8585

86-
var clusterID, taskID string
86+
var clusterID, migrationID string
8787
if opts.interactive {
8888
if !h.IOStreams.CanPrompt {
8989
return errors.New("The terminal doesn't support interactive mode, please use non-interactive mode")
@@ -97,26 +97,26 @@ func DeleteCmd(h *internal.Helper) *cobra.Command {
9797
return err
9898
}
9999
clusterID = cluster.ID
100-
task, err := cloud.GetSelectedMigrationTask(ctx, clusterID, h.QueryPageSize, d)
100+
migration, err := cloud.GetSelectedMigration(ctx, clusterID, h.QueryPageSize, d)
101101
if err != nil {
102102
return err
103103
}
104-
taskID = task.ID
104+
migrationID = migration.ID
105105
} else {
106106
var err error
107107
clusterID, err = cmd.Flags().GetString(flag.ClusterID)
108108
if err != nil {
109109
return errors.Trace(err)
110110
}
111-
taskID, err = cmd.Flags().GetString(flag.MigrationTaskID)
111+
migrationID, err = cmd.Flags().GetString(flag.MigrationID)
112112
if err != nil {
113113
return errors.Trace(err)
114114
}
115115
}
116116

117117
if !force {
118118
if !h.IOStreams.CanPrompt {
119-
return errors.New("The terminal doesn't support prompt, please run with --force to delete the migration task")
119+
return errors.New("The terminal doesn't support prompt, please run with --force to delete the migration")
120120
}
121121
prompt := &survey.Input{
122122
Message: fmt.Sprintf("%s %s %s", color.BlueString("Please type"), color.HiBlueString("yes"), color.BlueString("to confirm:")),
@@ -129,21 +129,21 @@ func DeleteCmd(h *internal.Helper) *cobra.Command {
129129
return err
130130
}
131131
if confirmation != "yes" {
132-
return errors.New("Incorrect confirm string entered, skipping migration task deletion")
132+
return errors.New("Incorrect confirm string entered, skipping migration deletion")
133133
}
134134
}
135135

136-
if _, err := d.DeleteMigration(ctx, clusterID, taskID); err != nil {
136+
if _, err := d.DeleteMigration(ctx, clusterID, migrationID); err != nil {
137137
return errors.Trace(err)
138138
}
139139

140-
fmt.Fprintln(h.IOStreams.Out, color.GreenString("migration task %s deleted", taskID))
140+
fmt.Fprintln(h.IOStreams.Out, color.GreenString("migration %s deleted", migrationID))
141141
return nil
142142
},
143143
}
144144

145145
cmd.Flags().BoolVar(&force, flag.Force, false, "Delete without confirmation.")
146-
cmd.Flags().StringP(flag.ClusterID, flag.ClusterIDShort, "", "Cluster ID that owns the migration task.")
147-
cmd.Flags().StringP(flag.MigrationTaskID, flag.MigrationTaskIDShort, "", "ID of the migration task to delete.")
146+
cmd.Flags().StringP(flag.ClusterID, flag.ClusterIDShort, "", "Cluster ID that owns the migration.")
147+
cmd.Flags().StringP(flag.MigrationID, flag.MigrationIDShort, "", "ID of the migration to delete.")
148148
return cmd
149149
}

internal/cli/serverless/migration/describe.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type DescribeOpts struct {
3434
func (c DescribeOpts) NonInteractiveFlags() []string {
3535
return []string{
3636
flag.ClusterID,
37-
flag.MigrationTaskID,
37+
flag.MigrationID,
3838
}
3939
}
4040

@@ -61,14 +61,14 @@ func DescribeCmd(h *internal.Helper) *cobra.Command {
6161

6262
var cmd = &cobra.Command{
6363
Use: "describe",
64-
Short: "Describe a migration task",
64+
Short: "Describe a migration",
6565
Aliases: []string{"get"},
6666
Args: cobra.NoArgs,
67-
Example: fmt.Sprintf(` Describe a migration task in interactive mode:
67+
Example: fmt.Sprintf(` Describe a migration in interactive mode:
6868
$ %[1]s serverless migration describe
6969
70-
Describe a migration task in non-interactive mode:
71-
$ %[1]s serverless migration describe -c <cluster-id> --migration-id <task-id>`, config.CliName),
70+
Describe a migration in non-interactive mode:
71+
$ %[1]s serverless migration describe -c <cluster-id> --migration-id <migration-id>`, config.CliName),
7272
PreRunE: func(cmd *cobra.Command, args []string) error {
7373
return opts.MarkInteractive(cmd)
7474
},
@@ -79,7 +79,7 @@ func DescribeCmd(h *internal.Helper) *cobra.Command {
7979
}
8080
ctx := cmd.Context()
8181

82-
var clusterID, taskID string
82+
var clusterID, migrationID string
8383
if opts.interactive {
8484
if !h.IOStreams.CanPrompt {
8585
return errors.New("The terminal doesn't support interactive mode, please use non-interactive mode")
@@ -94,24 +94,24 @@ func DescribeCmd(h *internal.Helper) *cobra.Command {
9494
}
9595
clusterID = cluster.ID
9696

97-
task, err := cloud.GetSelectedMigrationTask(ctx, clusterID, h.QueryPageSize, d)
97+
migration, err := cloud.GetSelectedMigration(ctx, clusterID, h.QueryPageSize, d)
9898
if err != nil {
9999
return err
100100
}
101-
taskID = task.ID
101+
migrationID = migration.ID
102102
} else {
103103
var err error
104104
clusterID, err = cmd.Flags().GetString(flag.ClusterID)
105105
if err != nil {
106106
return errors.Trace(err)
107107
}
108-
taskID, err = cmd.Flags().GetString(flag.MigrationTaskID)
108+
migrationID, err = cmd.Flags().GetString(flag.MigrationID)
109109
if err != nil {
110110
return errors.Trace(err)
111111
}
112112
}
113113

114-
resp, err := d.GetMigration(ctx, clusterID, taskID)
114+
resp, err := d.GetMigration(ctx, clusterID, migrationID)
115115
if err != nil {
116116
return errors.Trace(err)
117117
}
@@ -120,7 +120,7 @@ func DescribeCmd(h *internal.Helper) *cobra.Command {
120120
},
121121
}
122122

123-
cmd.Flags().StringP(flag.ClusterID, flag.ClusterIDShort, "", "Cluster ID that owns the migration task.")
124-
cmd.Flags().StringP(flag.MigrationTaskID, flag.MigrationTaskIDShort, "", "ID of the migration task to describe.")
123+
cmd.Flags().StringP(flag.ClusterID, flag.ClusterIDShort, "", "Cluster ID that owns the migration.")
124+
cmd.Flags().StringP(flag.MigrationID, flag.MigrationIDShort, "", "ID of the migration to describe.")
125125
return cmd
126126
}

internal/cli/serverless/migration/list.go

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ package migration
1616

1717
import (
1818
"fmt"
19-
"time"
2019

20+
"github.com/AlekSi/pointer"
2121
"github.com/juju/errors"
2222
"github.com/spf13/cobra"
2323

@@ -121,21 +121,11 @@ func ListCmd(h *internal.Helper) *cobra.Command {
121121
columns := []output.Column{"ID", "Name", "Mode", "State", "CreatedAt"}
122122
var rows []output.Row
123123
for _, task := range resp.Migrations {
124-
id := safeString(task.MigrationId)
125-
name := safeString(task.DisplayName)
126-
if name == "" {
127-
name = id
128-
}
129-
mode := ""
130-
if task.Mode != nil {
131-
mode = string(*task.Mode)
132-
}
133-
state := ""
134-
if task.State != nil {
135-
state = string(*task.State)
136-
}
137-
created := formatTime(task.CreateTime)
138-
rows = append(rows, output.Row{id, name, mode, state, created})
124+
id := pointer.Get(task.MigrationId)
125+
name := pointer.Get(task.DisplayName)
126+
mode := string(pointer.Get(task.Mode))
127+
state := string(pointer.Get(task.State))
128+
rows = append(rows, output.Row{id, name, mode, state, task.CreateTime.String()})
139129
}
140130
return errors.Trace(output.PrintHumanTable(h.IOStreams.Out, columns, rows))
141131
},
@@ -145,17 +135,3 @@ func ListCmd(h *internal.Helper) *cobra.Command {
145135
cmd.Flags().StringP(flag.Output, flag.OutputShort, output.HumanFormat, flag.OutputHelp)
146136
return cmd
147137
}
148-
149-
func safeString(value *string) string {
150-
if value == nil {
151-
return ""
152-
}
153-
return *value
154-
}
155-
156-
func formatTime(value *time.Time) string {
157-
if value == nil {
158-
return ""
159-
}
160-
return value.Format(time.RFC3339)
161-
}

0 commit comments

Comments
 (0)