@@ -30,7 +30,10 @@ import (
3030 "github.com/opencurve/curveadm/internal/configure/topology"
3131 "github.com/opencurve/curveadm/internal/errno"
3232 "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+
3437 cliutil "github.com/opencurve/curveadm/internal/utils"
3538 "github.com/spf13/cobra"
3639)
@@ -71,14 +74,12 @@ var (
7174 // chunkserevr (curvebs)
7275 MIGRATE_CHUNKSERVER_STEPS = []int {
7376 playbook .BACKUP_ETCD_DATA ,
74- playbook .STOP_SERVICE ,
75- playbook .CLEAN_SERVICE , // only container
77+ playbook .CREATE_PHYSICAL_POOL , // add machine that migrate to
7678 playbook .PULL_IMAGE ,
7779 playbook .CREATE_CONTAINER ,
7880 playbook .SYNC_CONFIG ,
79- playbook .CREATE_PHYSICAL_POOL ,
8081 playbook .START_CHUNKSERVER ,
81- playbook .CREATE_LOGICAL_POOL ,
82+ playbook .MARK_SERVER_PENGDDING ,
8283 }
8384
8485 // metaserver (curvefs)
@@ -100,12 +101,25 @@ var (
100101 topology .ROLE_SNAPSHOTCLONE : MIGRATE_SNAPSHOTCLONE_STEPS ,
101102 topology .ROLE_METASERVER : MIGRATE_METASERVER_STEPS ,
102103 }
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+ }
103115)
104116
105117type migrateOptions struct {
106118 filename string
107119 poolset string
108120 poolsetDiskType string
121+ showStatus bool
122+ clean bool
109123}
110124
111125func NewMigrateCommand (curveadm * cli.CurveAdm ) * cobra.Command {
@@ -125,7 +139,8 @@ func NewMigrateCommand(curveadm *cli.CurveAdm) *cobra.Command {
125139 flags := cmd .Flags ()
126140 flags .StringVar (& options .poolset , "poolset" , "default" , "Specify the poolset" )
127141 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" )
129144 return cmd
130145}
131146
@@ -191,8 +206,21 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
191206 migrates := getMigrates (curveadm , data )
192207 role := migrates [0 ].From .GetRole ()
193208 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+ }
196224
197225 pb := playbook .NewPlaybook (curveadm )
198226 for _ , step := range steps {
@@ -204,36 +232,40 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
204232 config = dcs2del
205233 case playbook .BACKUP_ETCD_DATA :
206234 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 :
209240 config = curveadm .FilterDeployConfigByRole (dcs , topology .ROLE_MDS )[:1 ]
210241 }
211242
212243 // options
213- options := map [string ]interface {}{}
244+ optionsKV := map [string ]interface {}{}
214245 switch step {
215246 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
218250 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
223254 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
229259 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
231263 }
232264
233265 pb .AddStep (& playbook.PlaybookStep {
234266 Type : step ,
235267 Configs : config ,
236- Options : options ,
268+ Options : optionsKV ,
237269 ExecOptions : playbook.ExecOptions {
238270 SilentSubBar : step == playbook .UPDATE_TOPOLOGY ,
239271 },
@@ -252,6 +284,23 @@ func displayMigrateTitle(curveadm *cli.CurveAdm, data string) {
252284 curveadm .WriteOutln (color .YellowString (" - Migrate host: from %s to %s" , from .GetHost (), to .GetHost ()))
253285}
254286
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+
255304func runMigrate (curveadm * cli.CurveAdm , options migrateOptions ) error {
256305 // TODO(P0): added prechek for target host
257306 // 1) parse cluster topology
@@ -261,7 +310,11 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
261310 }
262311
263312 // 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+ )
265318 if err != nil {
266319 return err
267320 }
@@ -272,13 +325,15 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
272325 return err
273326 }
274327
275- // 4) display title
276- displayMigrateTitle (curveadm , data )
328+ if ! options .showStatus && ! options .clean {
329+ // 4) display title
330+ displayMigrateTitle (curveadm , data )
277331
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+ }
282337 }
283338
284339 // 6) generate migrate playbook
@@ -294,6 +349,13 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
294349 }
295350
296351 // 9) print success prompt
352+ if options .showStatus {
353+ displayMigrateStatus (curveadm )
354+ return nil
355+ }
356+ if options .clean {
357+ return nil
358+ }
297359 curveadm .WriteOutln ("" )
298360 curveadm .WriteOutln (color .GreenString ("Services successfully migrateed ^_^." ))
299361 // TODO(P1): warning iff there is changed configs
0 commit comments