|
33 | 33 |
|
34 | 34 | import javax.inject.Inject; |
35 | 35 |
|
| 36 | +import com.cloud.utils.fsm.NoTransitionException; |
| 37 | +import com.cloud.utils.fsm.StateMachine2; |
36 | 38 | import org.apache.cloudstack.api.command.admin.backup.CreateImageTransferCmd; |
37 | 39 | import org.apache.cloudstack.api.command.admin.backup.DeleteVmCheckpointCmd; |
38 | 40 | import org.apache.cloudstack.api.command.admin.backup.FinalizeBackupCmd; |
@@ -639,6 +641,14 @@ private ImageTransferVO createUploadImageTransfer(VolumeVO volume, ImageTransfer |
639 | 641 | imageTransfer.setTransferUrl(transferAnswer.getTransferUrl()); |
640 | 642 | imageTransfer.setSignedTicketId(transferAnswer.getImageTransferId()); |
641 | 643 | imageTransfer = imageTransferDao.persist(imageTransfer); |
| 644 | + |
| 645 | + try { |
| 646 | + final StateMachine2<Volume.State, Volume.Event, Volume> stateMachine = Volume.State.getStateMachine(); |
| 647 | + stateMachine.transitTo(volume, Volume.Event.RestoreRequested, null, volumeDao); |
| 648 | + } catch (NoTransitionException e) { |
| 649 | + throw new CloudRuntimeException("Failed to transition volume " + volume.getUuid(), e); |
| 650 | + } |
| 651 | + |
642 | 652 | return imageTransfer; |
643 | 653 |
|
644 | 654 | } |
@@ -742,24 +752,41 @@ private boolean stopNBDServer(ImageTransferVO imageTransfer) { |
742 | 752 | return answer.getResult(); |
743 | 753 | } |
744 | 754 |
|
745 | | - private void finalizeUploadImageTransfer(ImageTransferVO imageTransfer) { |
| 755 | + private String finalizeUploadImageTransferWithResult(ImageTransferVO imageTransfer) { |
746 | 756 | String transferId = imageTransfer.getUuid(); |
747 | | - |
748 | 757 | boolean stopNbdServerResult = stopNBDServer(imageTransfer); |
749 | 758 | if (!stopNbdServerResult) { |
750 | | - throw new CloudRuntimeException("Failed to stop the nbd server"); |
| 759 | + return "Failed to stop the nbd server"; |
751 | 760 | } |
752 | 761 |
|
753 | 762 | FinalizeImageTransferCommand finalizeCmd = new FinalizeImageTransferCommand(transferId); |
754 | 763 | Answer answer; |
755 | 764 | try { |
756 | 765 | answer = agentManager.send(imageTransfer.getHostId(), finalizeCmd); |
757 | 766 | } catch (AgentUnavailableException | OperationTimedoutException e) { |
758 | | - throw new CloudRuntimeException("Failed to communicate with agent", e); |
| 767 | + return "Failed to communicate with agent"; |
759 | 768 | } |
760 | 769 |
|
761 | 770 | if (!answer.getResult()) { |
762 | | - throw new CloudRuntimeException("Failed to finalize image transfer: " + answer.getDetails()); |
| 771 | + return "Failed to finalize image transfer: " + answer.getDetails(); |
| 772 | + } |
| 773 | + return null; |
| 774 | + } |
| 775 | + |
| 776 | + private void finalizeUploadImageTransfer(ImageTransferVO imageTransfer) { |
| 777 | + String failureReason = finalizeUploadImageTransferWithResult(imageTransfer); |
| 778 | + Volume.Event event = failureReason == null ? Volume.Event.RestoreSucceeded : Volume.Event.RestoreFailed; |
| 779 | + |
| 780 | + VolumeVO volume = volumeDao.findById(imageTransfer.getVolumeId()); |
| 781 | + try { |
| 782 | + final StateMachine2<Volume.State, Volume.Event, Volume> stateMachine = Volume.State.getStateMachine(); |
| 783 | + stateMachine.transitTo(volume, event, null, volumeDao); |
| 784 | + } catch (NoTransitionException e) { |
| 785 | + throw new CloudRuntimeException("Failed to transition state during upload finalize image transfer for volume " + volume.getUuid(), e); |
| 786 | + } |
| 787 | + |
| 788 | + if (failureReason != null) { |
| 789 | + throw new CloudRuntimeException(failureReason); |
763 | 790 | } |
764 | 791 | } |
765 | 792 |
|
|
0 commit comments