@@ -30,7 +30,10 @@ import (
30
30
"github.com/opencurve/curveadm/internal/configure/topology"
31
31
"github.com/opencurve/curveadm/internal/errno"
32
32
"github.com/opencurve/curveadm/internal/playbook"
33
- tui "github.com/opencurve/curveadm/internal/tui/common"
33
+ "github.com/opencurve/curveadm/internal/task/task/common"
34
+ tui "github.com/opencurve/curveadm/internal/tui"
35
+ tuicomm "github.com/opencurve/curveadm/internal/tui/common"
36
+
34
37
cliutil "github.com/opencurve/curveadm/internal/utils"
35
38
"github.com/spf13/cobra"
36
39
)
@@ -71,14 +74,12 @@ var (
71
74
// chunkserevr (curvebs)
72
75
MIGRATE_CHUNKSERVER_STEPS = []int {
73
76
playbook .BACKUP_ETCD_DATA ,
74
- playbook .STOP_SERVICE ,
75
- playbook .CLEAN_SERVICE , // only container
77
+ playbook .CREATE_PHYSICAL_POOL , // add machine that migrate to
76
78
playbook .PULL_IMAGE ,
77
79
playbook .CREATE_CONTAINER ,
78
80
playbook .SYNC_CONFIG ,
79
- playbook .CREATE_PHYSICAL_POOL ,
80
81
playbook .START_CHUNKSERVER ,
81
- playbook .CREATE_LOGICAL_POOL ,
82
+ playbook .MARK_SERVER_PENGDDING ,
82
83
}
83
84
84
85
// metaserver (curvefs)
@@ -100,12 +101,25 @@ var (
100
101
topology .ROLE_SNAPSHOTCLONE : MIGRATE_SNAPSHOTCLONE_STEPS ,
101
102
topology .ROLE_METASERVER : MIGRATE_METASERVER_STEPS ,
102
103
}
104
+
105
+ MIGRATE_POST_CLEAN_STEPS = []int {
106
+ playbook .STOP_SERVICE ,
107
+ playbook .CLEAN_SERVICE , // only container
108
+ playbook .CREATE_PHYSICAL_POOL , // remove machine that migrate from, only for chunkserver or metaserver
109
+ playbook .UPDATE_TOPOLOGY ,
110
+ }
111
+
112
+ GET_MIGRATE_STATUS = []int {
113
+ playbook .GET_MIGRATE_STATUS ,
114
+ }
103
115
)
104
116
105
117
type migrateOptions struct {
106
118
filename string
107
119
poolset string
108
120
poolsetDiskType string
121
+ showStatus bool
122
+ clean bool
109
123
}
110
124
111
125
func NewMigrateCommand (curveadm * cli.CurveAdm ) * cobra.Command {
@@ -125,7 +139,8 @@ func NewMigrateCommand(curveadm *cli.CurveAdm) *cobra.Command {
125
139
flags := cmd .Flags ()
126
140
flags .StringVar (& options .poolset , "poolset" , "default" , "Specify the poolset" )
127
141
flags .StringVar (& options .poolsetDiskType , "poolset-disktype" , "ssd" , "Specify the disk type of physical pool" )
128
-
142
+ flags .BoolVar (& options .showStatus , "status" , false , "Show copyset transferring status" )
143
+ flags .BoolVar (& options .clean , "clean" , false , "Clean migrated environment for chunkserver or metaserver" )
129
144
return cmd
130
145
}
131
146
@@ -191,8 +206,21 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
191
206
migrates := getMigrates (curveadm , data )
192
207
role := migrates [0 ].From .GetRole ()
193
208
steps := MIGRATE_ROLE_STEPS [role ]
194
- poolset := options .poolset
195
- poolsetDiskType := options .poolsetDiskType
209
+
210
+ // show status
211
+ if options .showStatus {
212
+ steps = GET_MIGRATE_STATUS
213
+ }
214
+
215
+ // post clean
216
+ if options .clean {
217
+ steps = MIGRATE_POST_CLEAN_STEPS
218
+ }
219
+
220
+ poolset := configure.Poolset {
221
+ Name : options .poolset ,
222
+ Type : options .poolsetDiskType ,
223
+ }
196
224
197
225
pb := playbook .NewPlaybook (curveadm )
198
226
for _ , step := range steps {
@@ -204,36 +232,40 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
204
232
config = dcs2del
205
233
case playbook .BACKUP_ETCD_DATA :
206
234
config = curveadm .FilterDeployConfigByRole (dcs , topology .ROLE_ETCD )
207
- case CREATE_PHYSICAL_POOL ,
208
- CREATE_LOGICAL_POOL :
235
+ case
236
+ playbook .CREATE_PHYSICAL_POOL ,
237
+ playbook .CREATE_LOGICAL_POOL ,
238
+ playbook .MARK_SERVER_PENGDDING ,
239
+ playbook .GET_MIGRATE_STATUS :
209
240
config = curveadm .FilterDeployConfigByRole (dcs , topology .ROLE_MDS )[:1 ]
210
241
}
211
242
212
243
// options
213
- options := map [string ]interface {}{}
244
+ optionsKV := map [string ]interface {}{}
214
245
switch step {
215
246
case playbook .CLEAN_SERVICE :
216
- options [comm .KEY_CLEAN_ITEMS ] = []string {comm .CLEAN_ITEM_CONTAINER }
217
- options [comm .KEY_CLEAN_BY_RECYCLE ] = true
247
+ optionsKV [comm .KEY_CLEAN_ITEMS ] = []string {comm .CLEAN_ITEM_CONTAINER }
248
+ optionsKV [comm .KEY_CLEAN_BY_RECYCLE ] = true
249
+ optionsKV [comm .KEY_REMOVE_MIGRATED_SERVER ] = true
218
250
case playbook .CREATE_PHYSICAL_POOL :
219
- options [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_PHYSICAL
220
- options [comm .KEY_MIGRATE_SERVERS ] = migrates
221
- options [comm .POOLSET ] = poolset
222
- options [comm .POOLSET_DISK_TYPE ] = poolsetDiskType
251
+ optionsKV [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_PHYSICAL
252
+ optionsKV [comm .KEY_MIGRATE_SERVERS ] = migrates
253
+ optionsKV [comm .KEY_POOLSET ] = poolset
223
254
case playbook .CREATE_LOGICAL_POOL :
224
- options [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_LOGICAL
225
- options [comm .KEY_MIGRATE_SERVERS ] = migrates
226
- options [comm .KEY_NEW_TOPOLOGY_DATA ] = data
227
- options [comm .POOLSET ] = poolset
228
- options [comm .POOLSET_DISK_TYPE ] = poolsetDiskType
255
+ optionsKV [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_LOGICAL
256
+ optionsKV [comm .KEY_MIGRATE_SERVERS ] = migrates
257
+ optionsKV [comm .KEY_NEW_TOPOLOGY_DATA ] = data
258
+ optionsKV [comm .KEY_POOLSET ] = poolset
229
259
case playbook .UPDATE_TOPOLOGY :
230
- options [comm .KEY_NEW_TOPOLOGY_DATA ] = data
260
+ optionsKV [comm .KEY_NEW_TOPOLOGY_DATA ] = data
261
+ case playbook .GET_MIGRATE_STATUS :
262
+ optionsKV [comm .KEY_MIGRATE_SERVERS ] = migrates
231
263
}
232
264
233
265
pb .AddStep (& playbook.PlaybookStep {
234
266
Type : step ,
235
267
Configs : config ,
236
- Options : options ,
268
+ Options : optionsKV ,
237
269
ExecOptions : playbook.ExecOptions {
238
270
SilentSubBar : step == playbook .UPDATE_TOPOLOGY ,
239
271
},
@@ -252,6 +284,23 @@ func displayMigrateTitle(curveadm *cli.CurveAdm, data string) {
252
284
curveadm .WriteOutln (color .YellowString (" - Migrate host: from %s to %s" , from .GetHost (), to .GetHost ()))
253
285
}
254
286
287
+ func displayMigrateStatus (curveadm * cli.CurveAdm ) {
288
+ var output string
289
+ statuses := []common.MigrateStatus {}
290
+ v := curveadm .MemStorage ().Get (comm .KEY_MIGRATE_STATUS )
291
+ if v != nil {
292
+ m := v .(map [string ]common.MigrateStatus )
293
+ for _ , status := range m {
294
+ statuses = append (statuses , status )
295
+ }
296
+ }
297
+
298
+ output = tui .FormatMigrateStatus (statuses )
299
+
300
+ curveadm .WriteOutln ("" )
301
+ curveadm .WriteOut ("%s" , output )
302
+ }
303
+
255
304
func runMigrate (curveadm * cli.CurveAdm , options migrateOptions ) error {
256
305
// TODO(P0): added prechek for target host
257
306
// 1) parse cluster topology
@@ -261,7 +310,11 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
261
310
}
262
311
263
312
// 2) read topology from file
264
- data , err := readTopology (curveadm , options .filename )
313
+ data , err := readTopology (curveadm ,
314
+ options .filename ,
315
+ options .showStatus ,
316
+ options .clean ,
317
+ )
265
318
if err != nil {
266
319
return err
267
320
}
@@ -272,13 +325,15 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
272
325
return err
273
326
}
274
327
275
- // 4) display title
276
- displayMigrateTitle (curveadm , data )
328
+ if ! options .showStatus && ! options .clean {
329
+ // 4) display title
330
+ displayMigrateTitle (curveadm , data )
277
331
278
- // 5) confirm by user
279
- if pass := tui .ConfirmYes (tui .DEFAULT_CONFIRM_PROMPT ); ! pass {
280
- curveadm .WriteOutln (tui .PromptCancelOpetation ("migrate service" ))
281
- return errno .ERR_CANCEL_OPERATION
332
+ // 5) confirm by user
333
+ if pass := tuicomm .ConfirmYes (tuicomm .DEFAULT_CONFIRM_PROMPT ); ! pass {
334
+ curveadm .WriteOutln (tuicomm .PromptCancelOpetation ("migrate service" ))
335
+ return errno .ERR_CANCEL_OPERATION
336
+ }
282
337
}
283
338
284
339
// 6) generate migrate playbook
@@ -294,6 +349,13 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
294
349
}
295
350
296
351
// 9) print success prompt
352
+ if options .showStatus {
353
+ displayMigrateStatus (curveadm )
354
+ return nil
355
+ }
356
+ if options .clean {
357
+ return nil
358
+ }
297
359
curveadm .WriteOutln ("" )
298
360
curveadm .WriteOutln (color .GreenString ("Services successfully migrateed ^_^." ))
299
361
// TODO(P1): warning iff there is changed configs
0 commit comments