diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index 6e1ec2c77f2..5784329afc9 100755 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -311,7 +311,8 @@ public class EventTypes { public static final String EVENT_HOST_RECONNECT = "HOST.RECONNECT"; // Host Out-of-band management - public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE = "HOST.OOBM.ENABLEDISABLE"; + public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE = "HOST.OOBM.ENABLE"; + public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE = "HOST.OOBM.DISABLE"; public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_CONFIGURE = "HOST.OOBM.CONFIGURE"; public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_ACTION = "HOST.OOBM.ACTION"; public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD = "HOST.OOBM.CHANGEPASSWORD"; @@ -746,7 +747,8 @@ public class EventTypes { entityEventDetails.put(EVENT_HOST_RECONNECT, Host.class); // Host Out-of-band management - entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE, Host.class); + entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE, Host.class); + entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE, Host.class); entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_CONFIGURE, Host.class); entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_ACTION, Host.class); entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD, Host.class); diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForClusterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForClusterCmd.java index d0ffebe86ee..67d84d50966 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForClusterCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForClusterCmd.java @@ -68,10 +68,11 @@ public class DisableOutOfBandManagementForClusterCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find cluster by ID: " + getClusterId()); } + OutOfBandManagementResponse response = outOfBandManagementService.disableOutOfBandManagement(cluster); + CallContext.current().setEventDetails("Cluster Id:" + cluster.getId() + " out-of-band management enabled: false"); CallContext.current().putContextParameter(Cluster.class, cluster.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.enableDisableOutOfBandManagement(cluster, false); response.setResponseName(getCommandName()); setResponseObject(response); } @@ -92,7 +93,7 @@ public class DisableOutOfBandManagementForClusterCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE; + return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE; } @Override diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForHostCmd.java index 12b5236afdc..009d0d3fd16 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForHostCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForHostCmd.java @@ -68,10 +68,11 @@ public class DisableOutOfBandManagementForHostCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); } + OutOfBandManagementResponse response = outOfBandManagementService.disableOutOfBandManagement(host); + CallContext.current().setEventDetails("Host Id:" + host.getId() + " out-of-band management enabled: false"); CallContext.current().putContextParameter(Host.class, host.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.enableDisableOutOfBandManagement(host, false); response.setId(host.getUuid()); response.setResponseName(getCommandName()); setResponseObject(response); @@ -93,7 +94,7 @@ public class DisableOutOfBandManagementForHostCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE; + return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE; } @Override diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForZoneCmd.java index db1d4232e42..82e92a75ea6 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForZoneCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/DisableOutOfBandManagementForZoneCmd.java @@ -68,10 +68,11 @@ public class DisableOutOfBandManagementForZoneCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find zone by ID: " + getZoneId()); } + OutOfBandManagementResponse response = outOfBandManagementService.disableOutOfBandManagement(zone); + CallContext.current().setEventDetails("Zone Id:" + zone.getId() + " out-of-band management enabled: false"); CallContext.current().putContextParameter(DataCenter.class, zone.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.enableDisableOutOfBandManagement(zone, false); response.setResponseName(getCommandName()); setResponseObject(response); } @@ -92,7 +93,7 @@ public class DisableOutOfBandManagementForZoneCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE; + return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE; } @Override diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForClusterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForClusterCmd.java index 6b23203974f..64279c3a6db 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForClusterCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForClusterCmd.java @@ -68,10 +68,11 @@ public class EnableOutOfBandManagementForClusterCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find cluster by ID: " + getClusterId()); } + OutOfBandManagementResponse response = outOfBandManagementService.enableOutOfBandManagement(cluster); + CallContext.current().setEventDetails("Cluster Id:" + cluster.getId() + " out-of-band management enabled: true"); CallContext.current().putContextParameter(Cluster.class, cluster.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.enableDisableOutOfBandManagement(cluster, true); response.setResponseName(getCommandName()); setResponseObject(response); } @@ -92,7 +93,7 @@ public class EnableOutOfBandManagementForClusterCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE; + return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE; } @Override diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForHostCmd.java index 3905ad26f43..746725602dd 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForHostCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForHostCmd.java @@ -68,10 +68,11 @@ public class EnableOutOfBandManagementForHostCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); } + OutOfBandManagementResponse response = outOfBandManagementService.enableOutOfBandManagement(host); + CallContext.current().setEventDetails("Host Id:" + host.getId() + " out-of-band management enabled: true"); CallContext.current().putContextParameter(Host.class, host.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.enableDisableOutOfBandManagement(host, true); response.setId(host.getUuid()); response.setResponseName(getCommandName()); setResponseObject(response); @@ -93,7 +94,7 @@ public class EnableOutOfBandManagementForHostCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE; + return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE; } @Override diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForZoneCmd.java index 359f5f239fc..cae21813303 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForZoneCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/EnableOutOfBandManagementForZoneCmd.java @@ -68,10 +68,11 @@ public class EnableOutOfBandManagementForZoneCmd extends BaseAsyncCmd { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find zone by ID: " + getZoneId()); } + OutOfBandManagementResponse response = outOfBandManagementService.enableOutOfBandManagement(zone); + CallContext.current().setEventDetails("Zone Id:" + zone.getId() + " out-of-band management enabled: true"); CallContext.current().putContextParameter(DataCenter.class, zone.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.enableDisableOutOfBandManagement(zone, true); response.setResponseName(getCommandName()); setResponseObject(response); } @@ -92,7 +93,7 @@ public class EnableOutOfBandManagementForZoneCmd extends BaseAsyncCmd { @Override public String getEventType() { - return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE; + return EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE; } @Override diff --git a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java index 0507d78545d..699b2c6a99b 100644 --- a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java +++ b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementService.java @@ -27,13 +27,13 @@ import java.util.List; public interface OutOfBandManagementService { - ConfigKey OutOfBandManagementActionTimeout = new ConfigKey("Advanced", Long.class, "outofbandmanagement.action.timeout", "60", + ConfigKey ActionTimeout = new ConfigKey("Advanced", Long.class, "outofbandmanagement.action.timeout", "60", "The out of band management action timeout in seconds, configurable by cluster", true, ConfigKey.Scope.Cluster); - ConfigKey OutOfBandManagementSyncThreadInterval = new ConfigKey("Advanced", Long.class, "outofbandmanagement.sync.interval", "300000", + ConfigKey SyncThreadInterval = new ConfigKey("Advanced", Long.class, "outofbandmanagement.sync.interval", "300000", "The interval (in milliseconds) when the out-of-band management background sync are retrieved", true, ConfigKey.Scope.Global); - ConfigKey OutOfBandManagementSyncThreadPoolSize = new ConfigKey("Advanced", Integer.class, "outofbandmanagement.sync.poolsize", "50", + ConfigKey SyncThreadPoolSize = new ConfigKey("Advanced", Integer.class, "outofbandmanagement.sync.poolsize", "50", "The out of band management background sync thread pool size", true, ConfigKey.Scope.Global); long getId(); @@ -41,11 +41,15 @@ public interface OutOfBandManagementService { void submitBackgroundPowerSyncTask(Host host); boolean transitionPowerStateToDisabled(List hosts); - OutOfBandManagementResponse enableDisableOutOfBandManagement(DataCenter zone, boolean enabled); - OutOfBandManagementResponse enableDisableOutOfBandManagement(Cluster cluster, boolean enabled); - OutOfBandManagementResponse enableDisableOutOfBandManagement(Host host, boolean enabled); + OutOfBandManagementResponse enableOutOfBandManagement(DataCenter zone); + OutOfBandManagementResponse enableOutOfBandManagement(Cluster cluster); + OutOfBandManagementResponse enableOutOfBandManagement(Host host); + + OutOfBandManagementResponse disableOutOfBandManagement(DataCenter zone); + OutOfBandManagementResponse disableOutOfBandManagement(Cluster cluster); + OutOfBandManagementResponse disableOutOfBandManagement(Host host); OutOfBandManagementResponse configureOutOfBandManagement(Host host, ImmutableMap options); - OutOfBandManagementResponse changeOutOfBandManagementPassword(Host host, String password); OutOfBandManagementResponse executeOutOfBandManagementPowerOperation(Host host, OutOfBandManagement.PowerOperation operation, Long timeout); + OutOfBandManagementResponse changeOutOfBandManagementPassword(Host host, String password); } diff --git a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java index d687ae7a61a..5985b816256 100644 --- a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java +++ b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java @@ -27,6 +27,5 @@ import java.util.List; public interface OutOfBandManagementDao extends GenericDao, StateDao { OutOfBandManagement findByHost(long hostId); List findAllByManagementServer(long serverId); - void expireOutOfBandManagementOwnershipByHours(long hours); void expireOutOfBandManagementOwnershipByServer(long serverId); } diff --git a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java index c7056aa46cf..b914b6b702d 100644 --- a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java +++ b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java @@ -24,22 +24,22 @@ import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; import com.cloud.utils.db.TransactionLegacy; +import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.db.UpdateBuilder; -import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.outofbandmanagement.OutOfBandManagement; import org.apache.cloudstack.outofbandmanagement.OutOfBandManagementVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import javax.ejb.Local; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; @DB @Component -@Local(value = {OutOfBandManagementDao.class}) public class OutOfBandManagementDaoImpl extends GenericDaoBase implements OutOfBandManagementDao { private static final Logger LOG = Logger.getLogger(OutOfBandManagementDaoImpl.class); @@ -93,24 +93,20 @@ public class OutOfBandManagementDaoImpl extends GenericDaoBase configs) { _executor = Executors.newScheduledThreadPool(6, new NamedThreadFactory("StatsCollector")); - hostOutOfBandManagementStatsInterval = OutOfBandManagementService.OutOfBandManagementSyncThreadInterval.value(); + hostOutOfBandManagementStatsInterval = OutOfBandManagementService.SyncThreadInterval.value(); hostStatsInterval = NumbersUtil.parseLong(configs.get("host.stats.interval"), 60000L); hostAndVmStatsInterval = NumbersUtil.parseLong(configs.get("vm.stats.interval"), 60000L); storageStatsInterval = NumbersUtil.parseLong(configs.get("storage.stats.interval"), 60000L); diff --git a/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementBackgroundTask.java b/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementBackgroundTask.java index eb64f8f3084..38e139ec610 100644 --- a/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementBackgroundTask.java +++ b/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementBackgroundTask.java @@ -18,8 +18,11 @@ package org.apache.cloudstack.outofbandmanagement; import com.cloud.host.Host; +import org.apache.log4j.Logger; public class OutOfBandManagementBackgroundTask implements Runnable { + public static final Logger LOG = Logger.getLogger(OutOfBandManagementBackgroundTask.class); + final private OutOfBandManagementService service; final private Host host; final private OutOfBandManagement.PowerOperation powerOperation; @@ -39,7 +42,9 @@ public class OutOfBandManagementBackgroundTask implements Runnable { public void run() { try { service.executeOutOfBandManagementPowerOperation(host, powerOperation, null); - } catch (Exception ignored) { + } catch (Exception e) { + LOG.warn(String.format("Out-of-band management background task operation=%s for host id=%d failed with: %s", + powerOperation.name(), host.getId(), e.getMessage())); } } } diff --git a/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java b/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java index 035bc6cfc56..bb099c89085 100644 --- a/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java +++ b/server/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementServiceImpl.java @@ -53,7 +53,6 @@ import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; import java.util.ArrayList; @@ -67,7 +66,6 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @Component -@Local(value = {OutOfBandManagementService.class}) public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOfBandManagementService, Manager, Configurable { public static final Logger LOG = Logger.getLogger(OutOfBandManagementServiceImpl.class); @@ -86,13 +84,13 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf private long serviceId; private List outOfBandManagementDrivers = new ArrayList<>(); - private Map outOfBandManagementDriversMap = new HashMap(); + private final Map outOfBandManagementDriversMap = new HashMap(); private static final String OOBM_ENABLED_DETAIL = "outOfBandManagementEnabled"; private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_HOST = 120; - private Cache hostAlertCache; - private static ExecutorService backgroundSyncExecutor; + private static Cache hostAlertCache; + private static ExecutorService backgroundSyncBlockingExecutor; private String getOutOfBandManagementHostLock(long id) { return "oobm.host." + id; @@ -282,8 +280,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf public void submitBackgroundPowerSyncTask(final Host host) { if (host != null) { - // Note: This is a blocking queue based executor - backgroundSyncExecutor.submit(new OutOfBandManagementBackgroundTask(this, host, OutOfBandManagement.PowerOperation.STATUS)); + backgroundSyncBlockingExecutor.submit(new OutOfBandManagementBackgroundTask(this, host, OutOfBandManagement.PowerOperation.STATUS)); } } @@ -295,42 +292,68 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf } @Override - @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE, eventDescription = "enabling/disabling out-of-band management on a zone") - public OutOfBandManagementResponse enableDisableOutOfBandManagement(final DataCenter zone, final boolean enabled) { - dataCenterDetailsDao.persist(zone.getId(), OOBM_ENABLED_DETAIL, String.valueOf(enabled)); - if (!enabled) { - transitionPowerStateToDisabled(hostDao.findByDataCenterId(zone.getId())); - } - return buildEnableDisableResponse(enabled); + @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE, eventDescription = "enabling out-of-band management on a zone") + public OutOfBandManagementResponse enableOutOfBandManagement(final DataCenter zone) { + dataCenterDetailsDao.persist(zone.getId(), OOBM_ENABLED_DETAIL, String.valueOf(true)); + return buildEnableDisableResponse(true); } @Override - @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE, eventDescription = "enabling/disabling out-of-band management on a cluster") - public OutOfBandManagementResponse enableDisableOutOfBandManagement(final Cluster cluster, final boolean enabled) { - clusterDetailsDao.persist(cluster.getId(), OOBM_ENABLED_DETAIL, String.valueOf(enabled)); - if (!enabled) { - transitionPowerStateToDisabled(hostDao.findByClusterId(cluster.getId())); - } - return buildEnableDisableResponse(enabled); + @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE, eventDescription = "disabling out-of-band management on a zone") + public OutOfBandManagementResponse disableOutOfBandManagement(final DataCenter zone) { + dataCenterDetailsDao.persist(zone.getId(), OOBM_ENABLED_DETAIL, String.valueOf(false)); + transitionPowerStateToDisabled(hostDao.findByDataCenterId(zone.getId())); + + return buildEnableDisableResponse(false); } @Override - @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLEDISABLE, eventDescription = "enabling/disabling out-of-band management on a host") - public OutOfBandManagementResponse enableDisableOutOfBandManagement(final Host host, final boolean enabled) { + @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE, eventDescription = "enabling out-of-band management on a cluster") + public OutOfBandManagementResponse enableOutOfBandManagement(final Cluster cluster) { + clusterDetailsDao.persist(cluster.getId(), OOBM_ENABLED_DETAIL, String.valueOf(true)); + return buildEnableDisableResponse(true); + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE, eventDescription = "disabling out-of-band management on a cluster") + public OutOfBandManagementResponse disableOutOfBandManagement(final Cluster cluster) { + clusterDetailsDao.persist(cluster.getId(), OOBM_ENABLED_DETAIL, String.valueOf(false)); + transitionPowerStateToDisabled(hostDao.findByClusterId(cluster.getId())); + return buildEnableDisableResponse(false); + } + + private OutOfBandManagement getConfigForHost(final Host host) { final OutOfBandManagement outOfBandManagementConfig = outOfBandManagementDao.findByHost(host.getId()); if (outOfBandManagementConfig == null) { - final OutOfBandManagementResponse response = new OutOfBandManagementResponse(null); - response.setSuccess(false); - response.setResultDescription("Out-of-band management is not configured for the host. Please configure the host before enabling/disabling it."); - return response; + throw new CloudRuntimeException("Out-of-band management is not configured for the host. Please configure the host before enabling/disabling it."); } + return outOfBandManagementConfig; + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ENABLE, eventDescription = "enabling out-of-band management on a host") + public OutOfBandManagementResponse enableOutOfBandManagement(final Host host) { + final OutOfBandManagement outOfBandManagementConfig = getConfigForHost(host); hostAlertCache.invalidate(host.getId()); - outOfBandManagementConfig.setEnabled(enabled); + outOfBandManagementConfig.setEnabled(true); boolean updateResult = outOfBandManagementDao.update(outOfBandManagementConfig.getId(), (OutOfBandManagementVO) outOfBandManagementConfig); - if (updateResult && !enabled) { + if (updateResult) { transitionPowerStateToDisabled(Collections.singletonList(host)); } - return buildEnableDisableResponse(enabled && updateResult); + return buildEnableDisableResponse(true); + } + + @Override + @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_DISABLE, eventDescription = "disabling out-of-band management on a host") + public OutOfBandManagementResponse disableOutOfBandManagement(final Host host) { + final OutOfBandManagement outOfBandManagementConfig = getConfigForHost(host); + hostAlertCache.invalidate(host.getId()); + outOfBandManagementConfig.setEnabled(false); + boolean updateResult = outOfBandManagementDao.update(outOfBandManagementConfig.getId(), (OutOfBandManagementVO) outOfBandManagementConfig); + if (updateResult) { + transitionPowerStateToDisabled(Collections.singletonList(host)); + } + return buildEnableDisableResponse(false); } @Override @@ -362,16 +385,16 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf } @Override - @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ACTION, eventDescription = "issuing Host out-of-band management action", async = true) + @ActionEvent(eventType = EventTypes.EVENT_HOST_OUTOFBAND_MANAGEMENT_ACTION, eventDescription = "issuing host out-of-band management action", async = true) public OutOfBandManagementResponse executeOutOfBandManagementPowerOperation(final Host host, final OutOfBandManagement.PowerOperation powerOperation, final Long timeout) { checkOutOfBandManagementEnabledByZoneClusterHost(host); - final OutOfBandManagement outOfBandManagementConfig = outOfBandManagementDao.findByHost(host.getId()); + final OutOfBandManagement outOfBandManagementConfig = getConfigForHost(host); final ImmutableMap options = getOptions(outOfBandManagementConfig); final OutOfBandManagementDriver driver = getDriver(outOfBandManagementConfig); Long actionTimeOut = timeout; if (actionTimeOut == null) { - actionTimeOut = OutOfBandManagementActionTimeout.valueIn(host.getClusterId()); + actionTimeOut = ActionTimeout.valueIn(host.getClusterId()); } final OutOfBandManagementDriverPowerCommand cmd = new OutOfBandManagementDriverPowerCommand(options, actionTimeOut, powerOperation); @@ -424,7 +447,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf } final OutOfBandManagementDriver driver = getDriver(outOfBandManagementConfig); - final OutOfBandManagementDriverChangePasswordCommand cmd = new OutOfBandManagementDriverChangePasswordCommand(options, OutOfBandManagementActionTimeout.valueIn(host.getClusterId()), newPassword); + final OutOfBandManagementDriverChangePasswordCommand cmd = new OutOfBandManagementDriverChangePasswordCommand(options, ActionTimeout.valueIn(host.getClusterId()), newPassword); final OutOfBandManagementDriverResponse driverResponse; try { driverResponse = driver.execute(cmd); @@ -482,7 +505,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf this.name = name; this.serviceId = ManagementServerNode.getManagementServerId(); - final int poolSize = OutOfBandManagementSyncThreadPoolSize.value(); + final int poolSize = SyncThreadPoolSize.value(); hostAlertCache = CacheBuilder.newBuilder() .concurrencyLevel(4) @@ -491,11 +514,11 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf .expireAfterWrite(1, TimeUnit.DAYS) .build(); - backgroundSyncExecutor = new ThreadPoolExecutor(poolSize, poolSize, + backgroundSyncBlockingExecutor = new ThreadPoolExecutor(poolSize, poolSize, 0L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10 * poolSize, true), new ThreadPoolExecutor.CallerRunsPolicy()); - LOG.info("Starting out-of-band management background sync executor with thread pool-size=" + poolSize + " and background sync thread interval=" + OutOfBandManagementSyncThreadInterval.value() + "s"); + LOG.info("Starting out-of-band management background sync executor with thread pool-size=" + poolSize + " and background sync thread interval=" + SyncThreadInterval.value() + "s"); return true; } @@ -507,7 +530,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf @Override public boolean stop() { - backgroundSyncExecutor.shutdown(); + backgroundSyncBlockingExecutor.shutdown(); outOfBandManagementDao.expireOutOfBandManagementOwnershipByServer(getId()); return true; } @@ -519,7 +542,7 @@ public class OutOfBandManagementServiceImpl extends ManagerBase implements OutOf @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {OutOfBandManagementActionTimeout, OutOfBandManagementSyncThreadInterval, OutOfBandManagementSyncThreadPoolSize}; + return new ConfigKey[] {ActionTimeout, SyncThreadInterval, SyncThreadPoolSize}; } public List getOutOfBandManagementDrivers() {