@@ -1163,6 +1163,109 @@ func (d *Deployer) UnpauseNode(ctx context.Context, clusterID string, nodeID str
11631163 return nil
11641164}
11651165
1166+ func (d * Deployer ) RebalanceCluster (ctx context.Context , clusterID string , nodeIDsToEject []string ) error {
1167+ controller , err := d .getController (ctx , clusterID )
1168+ if err != nil {
1169+ return errors .Wrap (err , "failed to get controller for cluster" )
1170+ }
1171+
1172+ var OTPs []string
1173+ for _ , nodeID := range nodeIDsToEject {
1174+ otp , err := d .getNodeOTP (ctx , clusterID , nodeID )
1175+ if err != nil {
1176+ return errors .Wrap (err , "failed to get OTP for node" )
1177+ }
1178+ OTPs = append (OTPs , otp )
1179+ }
1180+
1181+ return controller .Rebalance (ctx , OTPs )
1182+ }
1183+
1184+ func (d * Deployer ) FailOverNode (ctx context.Context , clusterID string , nodeID string , failOverType deployment.FailOverType , allowUnsafe bool ) error {
1185+ node , err := d .getNode (ctx , clusterID , nodeID )
1186+ if err != nil {
1187+ return errors .Wrap (err , "failed to get node" )
1188+ }
1189+ controller , err := d .getController (ctx , clusterID )
1190+ if err != nil {
1191+ return errors .Wrap (err , "failed to get controller for cluster" )
1192+ }
1193+
1194+ otp , err := d .getNodeOTP (ctx , clusterID , node .NodeID )
1195+ if err != nil {
1196+ return errors .Wrap (err , "failed to get OTP for node" )
1197+ }
1198+
1199+ if failOverType == deployment .HardFailOver {
1200+ opts := & clustercontrol.HardFailOverOptions {
1201+ NodeOTPs : []string {otp },
1202+ AllowUnsafe : allowUnsafe ,
1203+ }
1204+ err := controller .Controller ().HardFailOver (ctx , opts )
1205+ if err != nil {
1206+ return errors .Wrap (err , "hard failover failed" )
1207+ }
1208+ } else if failOverType == deployment .GracefulFailOver {
1209+ err := controller .Controller ().GracefulFailOver (ctx , []string {otp })
1210+ if err != nil {
1211+ return errors .Wrap (err , "graceful failover start failed" )
1212+ }
1213+
1214+ d .logger .Info ("waiting for rebalance completion started by graceful failover" )
1215+
1216+ err = controller .WaitForNoRunningTasks (ctx )
1217+ if err != nil {
1218+ return errors .Wrap (err , "failed to wait for tasks to complete" )
1219+ }
1220+ }
1221+ return nil
1222+ }
1223+
1224+ func (d * Deployer ) RecoverNode (ctx context.Context , clusterID string , nodeID string , recoveryType deployment.RecoveryType ) error {
1225+ node , err := d .getNode (ctx , clusterID , nodeID )
1226+ if err != nil {
1227+ return errors .Wrap (err , "failed to get node" )
1228+ }
1229+ controller , err := d .getController (ctx , clusterID )
1230+ if err != nil {
1231+ return errors .Wrap (err , "failed to get cluster info" )
1232+ }
1233+
1234+ otp , err := d .getNodeOTP (ctx , clusterID , node .NodeID )
1235+ if err != nil {
1236+ return errors .Wrap (err , "failed to get OTP for node" )
1237+ }
1238+
1239+ opts := & clustercontrol.FailOverRecoveryType {
1240+ NodeOTPs : []string {otp },
1241+ RecoveryType : string (recoveryType ),
1242+ }
1243+
1244+ err = controller .Controller ().SetRecovery (ctx , opts )
1245+ if err != nil {
1246+ return errors .Wrap (err , "set recovery failed" )
1247+ }
1248+ return nil
1249+ }
1250+
1251+ func (d * Deployer ) getNodeOTP (ctx context.Context , clusterID string , nodeId string ) (string , error ) {
1252+ clusterInfo , err := d .getCluster (ctx , clusterID )
1253+ if err != nil {
1254+ return "" , errors .Wrap (err , "failed to get cluster info" )
1255+ }
1256+ clusterInfoEx , err := d .getClusterInfoEx (ctx , clusterInfo )
1257+ if err != nil {
1258+ return "" , errors .Wrap (err , "failed to get extended cluster info" )
1259+ }
1260+
1261+ for _ , nodeEx := range clusterInfoEx .NodesEx {
1262+ if nodeId == nodeEx .NodeID {
1263+ return nodeEx .OTPNode , nil
1264+ }
1265+ }
1266+ return "" , nil
1267+ }
1268+
11661269func (d * Deployer ) RedeployCluster (ctx context.Context , clusterID string ) error {
11671270 return errors .New ("docker deploy does not support redeploy cluster" )
11681271}
0 commit comments