23
23
package command
24
24
25
25
import (
26
+ "fmt"
27
+
26
28
"github.com/fatih/color"
27
29
"github.com/opencurve/curveadm/cli/cli"
28
30
comm "github.com/opencurve/curveadm/internal/common"
29
31
"github.com/opencurve/curveadm/internal/configure"
30
32
"github.com/opencurve/curveadm/internal/configure/topology"
31
33
"github.com/opencurve/curveadm/internal/errno"
32
34
"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
+
34
39
cliutil "github.com/opencurve/curveadm/internal/utils"
35
40
"github.com/spf13/cobra"
36
41
)
@@ -71,14 +76,12 @@ var (
71
76
// chunkserevr (curvebs)
72
77
MIGRATE_CHUNKSERVER_STEPS = []int {
73
78
playbook .BACKUP_ETCD_DATA ,
74
- playbook .STOP_SERVICE ,
75
- playbook .CLEAN_SERVICE , // only container
79
+ playbook .CREATE_PHYSICAL_POOL , // add machine that migrate to
76
80
playbook .PULL_IMAGE ,
77
81
playbook .CREATE_CONTAINER ,
78
82
playbook .SYNC_CONFIG ,
79
- playbook .CREATE_PHYSICAL_POOL ,
80
83
playbook .START_CHUNKSERVER ,
81
- playbook .CREATE_LOGICAL_POOL ,
84
+ playbook .MARK_CHUNKSERVER_PENGDDING ,
82
85
}
83
86
84
87
// metaserver (curvefs)
@@ -100,12 +103,23 @@ var (
100
103
topology .ROLE_SNAPSHOTCLONE : MIGRATE_SNAPSHOTCLONE_STEPS ,
101
104
topology .ROLE_METASERVER : MIGRATE_METASERVER_STEPS ,
102
105
}
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
+ }
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 , "show copyset transferring status" )
129
144
return cmd
130
145
}
131
146
@@ -189,10 +204,21 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
189
204
dcs2add := diffs [topology .DIFF_ADD ]
190
205
dcs2del := diffs [topology .DIFF_DELETE ]
191
206
migrates := getMigrates (curveadm , data )
207
+ if len (migrates ) <= 0 {
208
+ return nil , fmt .Errorf ("no service will be migrated" )
209
+ }
192
210
role := migrates [0 ].From .GetRole ()
193
211
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
+ }
196
222
197
223
pb := playbook .NewPlaybook (curveadm )
198
224
for _ , step := range steps {
@@ -204,8 +230,11 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
204
230
config = dcs2del
205
231
case playbook .BACKUP_ETCD_DATA :
206
232
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 :
209
238
config = curveadm .FilterDeployConfigByRole (dcs , topology .ROLE_MDS )[:1 ]
210
239
}
211
240
@@ -215,19 +244,20 @@ func genMigratePlaybook(curveadm *cli.CurveAdm,
215
244
case playbook .CLEAN_SERVICE :
216
245
options [comm .KEY_CLEAN_ITEMS ] = []string {comm .CLEAN_ITEM_CONTAINER }
217
246
options [comm .KEY_CLEAN_BY_RECYCLE ] = true
247
+ options [comm .KEY_REMOVE_MIGRATED_SERVER ] = true
218
248
case playbook .CREATE_PHYSICAL_POOL :
219
249
options [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_PHYSICAL
220
250
options [comm .KEY_MIGRATE_SERVERS ] = migrates
221
- options [comm .POOLSET ] = poolset
222
- options [comm .POOLSET_DISK_TYPE ] = poolsetDiskType
251
+ options [comm .KEY_POOLSET ] = poolset
223
252
case playbook .CREATE_LOGICAL_POOL :
224
253
options [comm .KEY_CREATE_POOL_TYPE ] = comm .POOL_TYPE_LOGICAL
225
254
options [comm .KEY_MIGRATE_SERVERS ] = migrates
226
255
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
229
257
case playbook .UPDATE_TOPOLOGY :
230
258
options [comm .KEY_NEW_TOPOLOGY_DATA ] = data
259
+ case playbook .GET_MIGRATE_STATUS :
260
+ options [comm .KEY_MIGRATE_SERVERS ] = migrates
231
261
}
232
262
233
263
pb .AddStep (& playbook.PlaybookStep {
@@ -252,6 +282,36 @@ func displayMigrateTitle(curveadm *cli.CurveAdm, data string) {
252
282
curveadm .WriteOutln (color .YellowString (" - Migrate host: from %s to %s" , from .GetHost (), to .GetHost ()))
253
283
}
254
284
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
+
255
315
func runMigrate (curveadm * cli.CurveAdm , options migrateOptions ) error {
256
316
// TODO(P0): added prechek for target host
257
317
// 1) parse cluster topology
@@ -261,7 +321,7 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
261
321
}
262
322
263
323
// 2) read topology from file
264
- data , err := readTopology (curveadm , options .filename )
324
+ data , err := readTopology (curveadm , options .filename , options . showStatus )
265
325
if err != nil {
266
326
return err
267
327
}
@@ -272,13 +332,15 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
272
332
return err
273
333
}
274
334
275
- // 4) display title
276
- displayMigrateTitle (curveadm , data )
335
+ if ! options .showStatus {
336
+ // 4) display title
337
+ displayMigrateTitle (curveadm , data )
277
338
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
+ }
282
344
}
283
345
284
346
// 6) generate migrate playbook
@@ -294,6 +356,10 @@ func runMigrate(curveadm *cli.CurveAdm, options migrateOptions) error {
294
356
}
295
357
296
358
// 9) print success prompt
359
+ if options .showStatus {
360
+ displayMigrateStatus (curveadm , getMigrates (curveadm , data )[0 ].From .GetRole ())
361
+ return nil
362
+ }
297
363
curveadm .WriteOutln ("" )
298
364
curveadm .WriteOutln (color .GreenString ("Services successfully migrateed ^_^." ))
299
365
// TODO(P1): warning iff there is changed configs
0 commit comments