2323package command
2424
2525import (
26+ "fmt"
27+
2628 "github.com/fatih/color"
2729 "github.com/opencurve/curveadm/cli/cli"
2830 comm "github.com/opencurve/curveadm/internal/common"
2931 "github.com/opencurve/curveadm/internal/configure"
3032 "github.com/opencurve/curveadm/internal/configure/topology"
3133 "github.com/opencurve/curveadm/internal/errno"
3234 "github.com/opencurve/curveadm/internal/playbook"
33- tui "github.com/opencurve/curveadm/internal/tui/common"
35+ "github.com/opencurve/curveadm/internal/task/task/common"
36+ tui "github.com/opencurve/curveadm/internal/tui"
37+ tuicomm "github.com/opencurve/curveadm/internal/tui/common"
38+
3439 cliutil "github.com/opencurve/curveadm/internal/utils"
3540 "github.com/spf13/cobra"
3641)
@@ -71,14 +76,12 @@ var (
7176 // chunkserevr (curvebs)
7277 MIGRATE_CHUNKSERVER_STEPS = []int {
7378 playbook .BACKUP_ETCD_DATA ,
74- playbook .STOP_SERVICE ,
75- playbook .CLEAN_SERVICE , // only container
79+ playbook .CREATE_PHYSICAL_POOL , // add machine that migrate to
7680 playbook .PULL_IMAGE ,
7781 playbook .CREATE_CONTAINER ,
7882 playbook .SYNC_CONFIG ,
79- playbook .CREATE_PHYSICAL_POOL ,
8083 playbook .START_CHUNKSERVER ,
81- playbook .CREATE_LOGICAL_POOL ,
84+ playbook .MARK_CHUNKSERVER_PENGDDING ,
8285 }
8386
8487 // metaserver (curvefs)
@@ -100,12 +103,23 @@ var (
100103 topology .ROLE_SNAPSHOTCLONE : MIGRATE_SNAPSHOTCLONE_STEPS ,
101104 topology .ROLE_METASERVER : MIGRATE_METASERVER_STEPS ,
102105 }
106+ GET_MIGRATE_STATUS = []int {
107+ playbook .GET_MIGRATE_STATUS ,
108+ }
109+ MIGRATE_POST_CLEAN_STEPS = []int {
110+ playbook .STOP_SERVICE ,
111+ playbook .CLEAN_SERVICE , // only container
112+ playbook .CREATE_PHYSICAL_POOL , // remove machine that migrate from
113+ playbook .UPDATE_TOPOLOGY ,
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 , "show copyset transferring status" )
129144 return cmd
130145}
131146
@@ -189,10 +204,21 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
189204 dcs2add := diffs [topology .DIFF_ADD ]
190205 dcs2del := diffs [topology .DIFF_DELETE ]
191206 migrates := getMigrates (curveadm , data )
207+ if len (migrates ) <= 0 {
208+ return nil , fmt .Errorf ("no service will be migrated" )
209+ }
192210 role := migrates [0 ].From .GetRole ()
193211 steps := MIGRATE_ROLE_STEPS [role ]
194- poolset := options .poolset
195- poolsetDiskType := options .poolsetDiskType
212+ if options .showStatus {
213+ steps = GET_MIGRATE_STATUS
214+ }
215+ if options .clean {
216+ steps = MIGRATE_POST_CLEAN_STEPS
217+ }
218+ poolset := configure.Poolset {
219+ Name : options .poolset ,
220+ Type : options .poolsetDiskType ,
221+ }
196222
197223 pb := playbook .NewPlaybook (curveadm )
198224 for _ , step := range steps {
@@ -204,8 +230,11 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
204230 config = dcs2del
205231 case playbook .BACKUP_ETCD_DATA :
206232 config = curveadm .FilterDeployConfigByRole (dcs , topology .ROLE_ETCD )
207- case CREATE_PHYSICAL_POOL ,
208- CREATE_LOGICAL_POOL :
233+ case
234+ playbook .CREATE_PHYSICAL_POOL ,
235+ playbook .CREATE_LOGICAL_POOL ,
236+ playbook .MARK_CHUNKSERVER_PENGDDING ,
237+ playbook .GET_MIGRATE_STATUS :
209238 config = curveadm .FilterDeployConfigByRole (dcs , topology .ROLE_MDS )[:1 ]
210239 }
211240
@@ -215,19 +244,20 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
215244 case playbook .CLEAN_SERVICE :
216245 options [comm .KEY_CLEAN_ITEMS ] = []string {comm .CLEAN_ITEM_CONTAINER }
217246 options [comm .KEY_CLEAN_BY_RECYCLE ] = true
247+ options [comm .KEY_REMOVE_MIGRATED_SERVER ] = true
218248 case playbook .CREATE_PHYSICAL_POOL :
219249 options [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_PHYSICAL
220250 options [comm .KEY_MIGRATE_SERVERS ] = migrates
221- options [comm .POOLSET ] = poolset
222- options [comm .POOLSET_DISK_TYPE ] = poolsetDiskType
251+ options [comm .KEY_POOLSET ] = poolset
223252 case playbook .CREATE_LOGICAL_POOL :
224253 options [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_LOGICAL
225254 options [comm .KEY_MIGRATE_SERVERS ] = migrates
226255 options [comm .KEY_NEW_TOPOLOGY_DATA ] = data
227- options [comm .POOLSET ] = poolset
228- options [comm .POOLSET_DISK_TYPE ] = poolsetDiskType
256+ options [comm .KEY_POOLSET ] = poolset
229257 case playbook .UPDATE_TOPOLOGY :
230258 options [comm .KEY_NEW_TOPOLOGY_DATA ] = data
259+ case playbook .GET_MIGRATE_STATUS :
260+ options [comm .KEY_MIGRATE_SERVERS ] = migrates
231261 }
232262
233263 pb .AddStep (& playbook.PlaybookStep {
@@ -252,6 +282,36 @@ func displayMigrateTitle(curveadm *cli.CurveAdm, data string) {
252282 curveadm .WriteOutln (color .YellowString (" - Migrate host: from %s to %s" , from .GetHost (), to .GetHost ()))
253283}
254284
285+ func displayMigrateStatus (curveadm * cli.CurveAdm , role string ) {
286+ var output string
287+ if role == topology .ROLE_CHUNKSERVER {
288+ statuses := []common.MigrateStatus {}
289+ v := curveadm .MemStorage ().Get (comm .KEY_MIGRATE_STATUS )
290+ if v != nil {
291+ m := v .(map [string ]common.MigrateStatus )
292+ for _ , status := range m {
293+ statuses = append (statuses , status )
294+ }
295+ }
296+
297+ output = tui .FormatMigrateStatus (statuses )
298+ } else {
299+ statuses := []common.MigrateCommonStatus {}
300+ v := curveadm .MemStorage ().Get (comm .KEY_MIGRATE_COMMON_STATUS )
301+ if v != nil {
302+ m := v .(map [string ]common.MigrateCommonStatus )
303+ for _ , status := range m {
304+ statuses = append (statuses , status )
305+ }
306+ }
307+
308+ output = tui .FormatMigrateCommonStatus (statuses )
309+ }
310+
311+ curveadm .WriteOutln ("" )
312+ curveadm .WriteOut ("%s" , output )
313+ }
314+
255315func runMigrate (curveadm * cli.CurveAdm , options migrateOptions ) error {
256316 // TODO(P0): added prechek for target host
257317 // 1) parse cluster topology
@@ -261,7 +321,7 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
261321 }
262322
263323 // 2) read topology from file
264- data , err := readTopology (curveadm , options .filename )
324+ data , err := readTopology (curveadm , options .filename , options . showStatus )
265325 if err != nil {
266326 return err
267327 }
@@ -272,13 +332,15 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
272332 return err
273333 }
274334
275- // 4) display title
276- displayMigrateTitle (curveadm , data )
335+ if ! options .showStatus {
336+ // 4) display title
337+ displayMigrateTitle (curveadm , data )
277338
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
339+ // 5) confirm by user
340+ if pass := tuicomm .ConfirmYes (tuicomm .DEFAULT_CONFIRM_PROMPT ); ! pass {
341+ curveadm .WriteOutln (tuicomm .PromptCancelOpetation ("migrate service" ))
342+ return errno .ERR_CANCEL_OPERATION
343+ }
282344 }
283345
284346 // 6) generate migrate playbook
@@ -294,6 +356,10 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
294356 }
295357
296358 // 9) print success prompt
359+ if options .showStatus {
360+ displayMigrateStatus (curveadm , getMigrates (curveadm , data )[0 ].From .GetRole ())
361+ return nil
362+ }
297363 curveadm .WriteOutln ("" )
298364 curveadm .WriteOutln (color .GreenString ("Services successfully migrateed ^_^." ))
299365 // TODO(P1): warning iff there is changed configs
0 commit comments