@@ -86,7 +86,7 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
8686 }
8787 definitionStr := string (definitionBytes )
8888
89- sources , target , mode , err := parseMigrationDefinition (definitionStr )
89+ sources , target , mode , shardMode , err := parseMigrationDefinition (definitionStr )
9090 if err != nil {
9191 return err
9292 }
@@ -97,6 +97,7 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
9797 Sources : sources ,
9898 Target : target ,
9999 Mode : mode ,
100+ ShardMode : shardMode ,
100101 }
101102 return runMigrationPrecheck (ctx , d , clusterID , precheckBody , h )
102103 }
@@ -106,6 +107,7 @@ func CreateCmd(h *internal.Helper) *cobra.Command {
106107 Sources : sources ,
107108 Target : target ,
108109 Mode : mode ,
110+ ShardMode : shardMode ,
109111 }
110112
111113 resp , err := d .CreateMigration (ctx , clusterID , createBody )
@@ -247,34 +249,39 @@ func shouldPrintPrecheckItem(status *pkgmigration.PrecheckItemStatus) bool {
247249 }
248250}
249251
250- func parseMigrationDefinition (value string ) ([]pkgmigration.Source , pkgmigration.Target , pkgmigration.TaskMode , error ) {
252+ func parseMigrationDefinition (value string ) ([]pkgmigration.Source , pkgmigration.Target , pkgmigration.TaskMode , * pkgmigration. TaskShardMode , error ) {
251253 trimmed := strings .TrimSpace (value )
252254 if trimmed == "" {
253- return nil , pkgmigration.Target {}, "" , errors .New ("migration config is required; use --config-file" )
255+ return nil , pkgmigration.Target {}, "" , nil , errors .New ("migration config is required; use --config-file" )
254256 }
255257 var payload struct {
256- Sources []pkgmigration.Source `json:"sources"`
257- Target * pkgmigration.Target `json:"target"`
258- Mode string `json:"mode"`
258+ Sources []pkgmigration.Source `json:"sources"`
259+ Target * pkgmigration.Target `json:"target"`
260+ Mode string `json:"mode"`
261+ ShardMode * string `json:"shardMode,omitempty"`
259262 }
260263 stdJson , err := standardizeJSON ([]byte (trimmed ))
261264 if err != nil {
262- return nil , pkgmigration.Target {}, "" , errors .Annotate (err , "invalid migration definition JSON" )
265+ return nil , pkgmigration.Target {}, "" , nil , errors .Annotate (err , "invalid migration definition JSON" )
263266 }
264267 if err := json .Unmarshal (stdJson , & payload ); err != nil {
265- return nil , pkgmigration.Target {}, "" , errors .Annotate (err , "invalid migration definition JSON" )
268+ return nil , pkgmigration.Target {}, "" , nil , errors .Annotate (err , "invalid migration definition JSON" )
266269 }
267270 if len (payload .Sources ) == 0 {
268- return nil , pkgmigration.Target {}, "" , errors .New ("migration definition must include at least one source" )
271+ return nil , pkgmigration.Target {}, "" , nil , errors .New ("migration definition must include at least one source" )
269272 }
270273 if payload .Target == nil {
271- return nil , pkgmigration.Target {}, "" , errors .New ("migration definition must include the target block" )
274+ return nil , pkgmigration.Target {}, "" , nil , errors .New ("migration definition must include the target block" )
272275 }
273276 mode , err := parseMigrationMode (payload .Mode )
274277 if err != nil {
275- return nil , pkgmigration.Target {}, "" , err
278+ return nil , pkgmigration.Target {}, "" , nil , err
276279 }
277- return payload .Sources , * payload .Target , mode , nil
280+ shardMode , err := parseMigrationShardMode (payload .ShardMode )
281+ if err != nil {
282+ return nil , pkgmigration.Target {}, "" , nil , err
283+ }
284+ return payload .Sources , * payload .Target , mode , shardMode , nil
278285}
279286
280287func parseMigrationMode (value string ) (pkgmigration.TaskMode , error ) {
@@ -290,6 +297,22 @@ func parseMigrationMode(value string) (pkgmigration.TaskMode, error) {
290297 return "" , errors .Errorf ("invalid mode %q, allowed values: %s" , value , pkgmigration .AllowedTaskModeEnumValues )
291298}
292299
300+ func parseMigrationShardMode (value * string ) (* pkgmigration.TaskShardMode , error ) {
301+ if value == nil {
302+ return nil , nil
303+ }
304+ trimmed := strings .TrimSpace (* value )
305+ if trimmed == "" {
306+ return nil , errors .Errorf ("invalid shardMode %q, allowed values: %s" , * value , pkgmigration .AllowedTaskShardModeEnumValues )
307+ }
308+ normalized := strings .ToUpper (trimmed )
309+ mode := pkgmigration .TaskShardMode (normalized )
310+ if slices .Contains (pkgmigration .AllowedTaskShardModeEnumValues , mode ) {
311+ return & mode , nil
312+ }
313+ return nil , errors .Errorf ("invalid shardMode %q, allowed values: %s" , * value , pkgmigration .AllowedTaskShardModeEnumValues )
314+ }
315+
293316// standardizeJSON accepts JSON With Commas and Comments(JWCC) see
294317// https://nigeltao.github.io/blog/2021/json-with-commas-comments.html) and
295318// returns a standard JSON byte slice ready for json.Unmarshal.
0 commit comments