CLOUDSTACK-1325: add password in response of RestoreVM

Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a5723992
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a5723992
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a5723992

Branch: refs/heads/4.0
Commit: a5723992a0eeea9fc383c656b0d61dfc9e541ff9
Parents: 6fa9527
Author: Wei Zhou <[email protected]>
Authored: Mon May 27 21:32:56 2013 +0200
Committer: Wei Zhou <[email protected]>
Committed: Mon May 27 21:32:56 2013 +0200

----------------------------------------------------------------------
 api/src/com/cloud/vm/UserVmService.java        |    2 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java |   59 ++++++++++--------
 2 files changed, 34 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5723992/api/src/com/cloud/vm/UserVmService.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/UserVmService.java 
b/api/src/com/cloud/vm/UserVmService.java
index 6635657..804d223 100755
--- a/api/src/com/cloud/vm/UserVmService.java
+++ b/api/src/com/cloud/vm/UserVmService.java
@@ -416,5 +416,5 @@ public interface UserVmService {
 
     VirtualMachine vmStorageMigration(Long vmId, StoragePool destPool);
 
-    UserVm restoreVM(RestoreVMCmd cmd);
+    UserVm restoreVM(RestoreVMCmd cmd) throws ResourceUnavailableException, 
InsufficientCapacityException;
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a5723992/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java 
b/server/src/com/cloud/vm/UserVmManagerImpl.java
index dbcbeb8..b5ac80d 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -409,22 +409,11 @@ public class UserVmManagerImpl implements UserVmManager, 
UserVmService, Manager
 
         _accountMgr.checkAccess(caller, null, true, userVm);
 
-        boolean result = resetVMPasswordInternal(cmd, password);
+        boolean result = resetVMPasswordInternal(vmId, password);
 
         if (result) {
             userVm.setPassword(password);
-            //update the password in vm_details table too 
-            // Check if an SSH key pair was selected for the instance and if 
so use it to encrypt & save the vm password
-            String sshPublicKey = userVm.getDetail("SSH.PublicKey");
-            if (sshPublicKey != null && !sshPublicKey.equals("") && password 
!= null && !password.equals("saved_password")) {
-                String encryptedPasswd = 
RSAHelper.encryptWithSSHPublicKey(sshPublicKey, password);
-                if (encryptedPasswd == null) {
-                    throw new CloudRuntimeException("Error encrypting 
password");
-                }
-
-                userVm.setDetail("Encrypted.Password", encryptedPasswd);
-                _vmDao.saveDetails(userVm);
-            }
+            savePasswordToDB(userVm, password);
         } else {
             throw new CloudRuntimeException("Failed to reset password for the 
virtual machine ");
         }
@@ -432,8 +421,22 @@ public class UserVmManagerImpl implements UserVmManager, 
UserVmService, Manager
         return userVm;
     }
 
-    private boolean resetVMPasswordInternal(ResetVMPasswordCmd cmd, String 
password) throws ResourceUnavailableException, InsufficientCapacityException {
-        Long vmId = cmd.getId();
+    private void savePasswordToDB(UserVmVO vm, String password) {
+        // update the password in vm_details table too
+        // Check if an SSH key pair was selected for the instance and if so 
use it to encrypt & save the vm password
+        String sshPublicKey = vm.getDetail("SSH.PublicKey");
+        if (sshPublicKey != null && !sshPublicKey.equals("") && password != 
null && !password.equals("saved_password")) {
+            String encryptedPasswd = 
RSAHelper.encryptWithSSHPublicKey(sshPublicKey, password);
+            if (encryptedPasswd == null) {
+                throw new CloudRuntimeException("Error encrypting password");
+            }
+
+            vm.setDetail("Encrypted.Password", encryptedPasswd);
+            _vmDao.saveDetails(vm);
+        }
+    }
+
+    private boolean resetVMPasswordInternal(Long vmId, String password) throws 
ResourceUnavailableException, InsufficientCapacityException {
         Long userId = UserContext.current().getCallerUserId();
         VMInstanceVO vmInstance = _vmDao.findById(vmId);
 
@@ -2908,16 +2911,7 @@ public class UserVmManagerImpl implements UserVmManager, 
UserVmService, Manager
             }
 
             // Check if an SSH key pair was selected for the instance and if 
so use it to encrypt & save the vm password
-            String sshPublicKey = vm.getDetail("SSH.PublicKey");
-            if (sshPublicKey != null && !sshPublicKey.equals("") && password 
!= null && !password.equals("saved_password")) {
-                String encryptedPasswd = 
RSAHelper.encryptWithSSHPublicKey(sshPublicKey, password);
-                if (encryptedPasswd == null) {
-                    throw new CloudRuntimeException("Error encrypting 
password");
-                }
-
-                vm.setDetail("Encrypted.Password", encryptedPasswd);
-                _vmDao.saveDetails(vm);
-            }
+            savePasswordToDB(vm, password);
 
             params = new HashMap<VirtualMachineProfile.Param, Object>();
             if (additionalParams != null) {
@@ -3709,7 +3703,7 @@ public class UserVmManagerImpl implements UserVmManager, 
UserVmService, Manager
     }
 
     @Override
-    public UserVm restoreVM(RestoreVMCmd cmd) {
+    public UserVm restoreVM(RestoreVMCmd cmd) throws 
ResourceUnavailableException, InsufficientCapacityException {
         // Input validation
         Account caller = UserContext.current().getCaller();
         Long userId = UserContext.current().getCallerUserId();
@@ -3781,6 +3775,19 @@ public class UserVmManagerImpl implements UserVmManager, 
UserVmService, Manager
             s_logger.debug("Unable to delete old root volume " + root.getId() 
+ ", user may manually delete it", e);
         }
 
+        if (template.getEnablePassword()) {
+            String password = generateRandomPassword();
+            boolean result = resetVMPasswordInternal(vmId, password);
+
+            if (result) {
+                vm.setPassword(password);
+                _vmDao.loadDetails(vm);
+                savePasswordToDB(vm, password);
+            } else {
+                s_logger.debug("Failed to reset password when restore the 
virtual machine " + vmId + ", user need to reset the password later");
+            }
+        }
+
         if (needRestart) {
             try {
                 _itMgr.start(vm, null, user, caller);

Reply via email to