Repository: cloudstack
Updated Branches:
  refs/heads/4.9 b7f1ba944 -> 1060dc47e


oobm: simply change password transactional logic

- Simplifies change password transactional logic without using pessmistic locks
- Adds a re-enter password field in the UI to valid ipmi/oobm password

Signed-off-by: Rohit Yadav <[email protected]>


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

Branch: refs/heads/4.9
Commit: 8ac3c883cd61fa0e18498aaae4e4f519743295c4
Parents: 227ff38
Author: Rohit Yadav <[email protected]>
Authored: Mon Jul 11 17:06:09 2016 +0530
Committer: Rohit Yadav <[email protected]>
Committed: Tue Aug 2 12:47:15 2016 +0530

----------------------------------------------------------------------
 .../classes/resources/messages.properties       |  1 +
 .../OutOfBandManagementServiceImpl.java         | 83 ++++++++------------
 ui/dictionary.jsp                               |  1 +
 ui/scripts/system.js                            | 11 +++
 4 files changed, 47 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8ac3c883/client/WEB-INF/classes/resources/messages.properties
----------------------------------------------------------------------
diff --git a/client/WEB-INF/classes/resources/messages.properties 
b/client/WEB-INF/classes/resources/messages.properties
index 8b8ad1a..289e04f 100644
--- a/client/WEB-INF/classes/resources/messages.properties
+++ b/client/WEB-INF/classes/resources/messages.properties
@@ -1016,6 +1016,7 @@ label.outofbandmanagement.driver=Driver
 label.outofbandmanagement.disable=Disable Out-of-band Management
 label.outofbandmanagement.enable=Enable Out-of-band Management
 label.outofbandmanagement.password=Password
+label.outofbandmanagement.reenterpassword=Re-enter Password
 label.outofbandmanagement.port=Port
 label.outofbandmanagement.username=Username
 message.outofbandmanagement.changepassword=Change Out-of-band Management 
password

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8ac3c883/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java
 
b/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java
index bb099c8..ca65ef7 100644
--- 
a/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java
+++ 
b/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java
@@ -31,7 +31,6 @@ import com.cloud.host.dao.HostDao;
 import com.cloud.org.Cluster;
 import com.cloud.utils.component.Manager;
 import com.cloud.utils.component.ManagerBase;
-import com.cloud.utils.db.GlobalLock;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionStatus;
@@ -87,7 +86,6 @@ public class OutOfBandManagementServiceImpl extends 
ManagerBase implements OutOf
     private final Map<String, OutOfBandManagementDriver> 
outOfBandManagementDriversMap = new HashMap<String, 
OutOfBandManagementDriver>();
 
     private static final String OOBM_ENABLED_DETAIL = 
"outOfBandManagementEnabled";
-    private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_HOST = 120;
 
     private static Cache<Long, Long> hostAlertCache;
     private static ExecutorService backgroundSyncBlockingExecutor;
@@ -435,59 +433,46 @@ public class OutOfBandManagementServiceImpl extends 
ManagerBase implements OutOf
         if (Strings.isNullOrEmpty(newPassword)) {
             throw new CloudRuntimeException(String.format("Cannot change 
out-of-band management password as provided new-password is null or empty for 
the host %s.", host.getUuid()));
         }
-        GlobalLock outOfBandManagementHostLock = 
GlobalLock.getInternLock(getOutOfBandManagementHostLock(host.getId()));
-        try {
-            if 
(outOfBandManagementHostLock.lock(ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_HOST)) {
-                try {
-                    final OutOfBandManagement outOfBandManagementConfig = 
outOfBandManagementDao.findByHost(host.getId());
 
-                    final ImmutableMap<OutOfBandManagement.Option, String> 
options = getOptions(outOfBandManagementConfig);
-                    if 
(!(options.containsKey(OutOfBandManagement.Option.PASSWORD) && 
!Strings.isNullOrEmpty(options.get(OutOfBandManagement.Option.PASSWORD)))) {
-                        throw new CloudRuntimeException(String.format("Cannot 
change out-of-band management password as we've no previously configured 
password for the host %s.", host.getUuid()));
-                    }
-                    final OutOfBandManagementDriver driver = 
getDriver(outOfBandManagementConfig);
-
-                    final OutOfBandManagementDriverChangePasswordCommand cmd = 
new OutOfBandManagementDriverChangePasswordCommand(options, 
ActionTimeout.valueIn(host.getClusterId()), newPassword);
-                    final OutOfBandManagementDriverResponse driverResponse;
-                    try {
-                        driverResponse = driver.execute(cmd);
-                    } catch (Exception e) {
-                        LOG.error("Out-of-band management change password 
failed due to driver error: " + e.getMessage());
-                        throw new CloudRuntimeException(String.format("Failed 
to change out-of-band management password for host (%s) due to driver error: 
%s", host.getUuid(), e.getMessage()));
-                    }
+        final OutOfBandManagement outOfBandManagementConfig = 
outOfBandManagementDao.findByHost(host.getId());
+        final ImmutableMap<OutOfBandManagement.Option, String> options = 
getOptions(outOfBandManagementConfig);
+        if (!(options.containsKey(OutOfBandManagement.Option.PASSWORD) && 
!Strings.isNullOrEmpty(options.get(OutOfBandManagement.Option.PASSWORD)))) {
+            throw new CloudRuntimeException(String.format("Cannot change 
out-of-band management password as we've no previously configured password for 
the host %s.", host.getUuid()));
+        }
+        final OutOfBandManagementDriver driver = 
getDriver(outOfBandManagementConfig);
+        final OutOfBandManagementDriverChangePasswordCommand changePasswordCmd 
= new OutOfBandManagementDriverChangePasswordCommand(options, 
ActionTimeout.valueIn(host.getClusterId()), newPassword);
 
-                    if (!driverResponse.isSuccess()) {
-                        throw new CloudRuntimeException(String.format("Failed 
to change out-of-band management password for host (%s) with error: %s", 
host.getUuid(), driverResponse.getError()));
-                    }
+        final boolean changePasswordResult = Transaction.execute(new 
TransactionCallback<Boolean>() {
+            @Override
+            public Boolean doInTransaction(TransactionStatus status) {
+                final OutOfBandManagement updatedOutOfBandManagementConfig = 
outOfBandManagementDao.findByHost(host.getId());
+                updatedOutOfBandManagementConfig.setPassword(newPassword);
+                boolean result = 
outOfBandManagementDao.update(updatedOutOfBandManagementConfig.getId(), 
(OutOfBandManagementVO) updatedOutOfBandManagementConfig);
 
-                    final boolean updatedConfigResult = 
Transaction.execute(new TransactionCallback<Boolean>() {
-                        @Override
-                        public Boolean doInTransaction(TransactionStatus 
status) {
-                            OutOfBandManagement 
updatedOutOfBandManagementConfig = 
outOfBandManagementDao.findByHost(host.getId());
-                            
updatedOutOfBandManagementConfig.setPassword(newPassword);
-                            return 
outOfBandManagementDao.update(updatedOutOfBandManagementConfig.getId(), 
(OutOfBandManagementVO) updatedOutOfBandManagementConfig);
-                        }
-                    });
-
-                    if (!updatedConfigResult) {
-                        LOG.error(String.format("Succeeded to change 
out-of-band management password but failed to updated in database the new 
password:%s for the host id:%d", newPassword, host.getId()));
-                    }
+                if (!result) {
+                    throw new CloudRuntimeException(String.format("Failed to 
change out-of-band management password for host (%s) in the database.", 
host.getUuid()));
+                }
 
-                    final OutOfBandManagementResponse response = new 
OutOfBandManagementResponse();
-                    response.setSuccess(updatedConfigResult && 
driverResponse.isSuccess());
-                    response.setResultDescription(driverResponse.getResult());
-                    response.setId(host.getUuid());
-                    return response;
-                } finally {
-                    outOfBandManagementHostLock.unlock();
+                final OutOfBandManagementDriverResponse driverResponse;
+                try {
+                    driverResponse = driver.execute(changePasswordCmd);
+                } catch (Exception e) {
+                    LOG.error("Out-of-band management change password failed 
due to driver error: " + e.getMessage());
+                    throw new CloudRuntimeException(String.format("Failed to 
change out-of-band management password for host (%s) due to driver error: %s", 
host.getUuid(), e.getMessage()));
                 }
-            } else {
-                LOG.error("Unable to acquire synchronization lock to change 
out-of-band management password for host id: " + host.getId());
-                throw new CloudRuntimeException(String.format("Unable to 
acquire lock to change out-of-band management password for host (%s), please 
try after some time.", host.getUuid()));
+
+                if (!driverResponse.isSuccess()) {
+                    throw new CloudRuntimeException(String.format("Failed to 
change out-of-band management password for host (%s) with error: %s", 
host.getUuid(), driverResponse.getError()));
+                }
+
+                return result && driverResponse.isSuccess();
             }
-        } finally {
-            outOfBandManagementHostLock.releaseRef();
-        }
+        });
+
+        final OutOfBandManagementResponse response = new 
OutOfBandManagementResponse();
+        response.setSuccess(changePasswordResult );
+        response.setId(host.getUuid());
+        return response;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8ac3c883/ui/dictionary.jsp
----------------------------------------------------------------------
diff --git a/ui/dictionary.jsp b/ui/dictionary.jsp
index b064299..c15dae2 100644
--- a/ui/dictionary.jsp
+++ b/ui/dictionary.jsp
@@ -999,6 +999,7 @@ dictionary = {
 'label.outofbandmanagement.disable': '<fmt:message 
key="label.outofbandmanagement.disable" />',
 'label.outofbandmanagement.enable': '<fmt:message 
key="label.outofbandmanagement.enable" />',
 'label.outofbandmanagement.password': '<fmt:message 
key="label.outofbandmanagement.password" />',
+'label.outofbandmanagement.reenterpassword': '<fmt:message 
key="label.outofbandmanagement.reenterpassword" />',
 'label.outofbandmanagement.port': '<fmt:message 
key="label.outofbandmanagement.port" />',
 'label.outofbandmanagement.timeout': '<fmt:message 
key="label.outofbandmanagement.timeout" />',
 'label.outofbandmanagement.username': '<fmt:message 
key="label.outofbandmanagement.username" />',

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/8ac3c883/ui/scripts/system.js
----------------------------------------------------------------------
diff --git a/ui/scripts/system.js b/ui/scripts/system.js
index 2eef6b1..7ffacd0 100644
--- a/ui/scripts/system.js
+++ b/ui/scripts/system.js
@@ -16814,10 +16814,21 @@
                                                 required: false
                                             },
                                         },
+                                        reenterpassword: {
+                                            label: 
'label.outofbandmanagement.reenterpassword',
+                                            isPassword: true,
+                                            validation: {
+                                                required: false
+                                            }
+                                        },
                                     }
                                 },
                                 action: function (args) {
                                     var data = args.data;
+                                    if (data.password != data.reenterpassword) 
{
+                                        args.response.error("Passwords do not 
match");
+                                        return;
+                                    }
                                     data.hostid = args.context.hosts[0].id;
                                     $.ajax({
                                         url: 
createURL('changeOutOfBandManagementPassword'),

Reply via email to