diff --git a/api/src/com/cloud/resource/ResourceService.java b/api/src/com/cloud/resource/ResourceService.java index 7050b97e0feb..8f163864d72d 100644 --- a/api/src/com/cloud/resource/ResourceService.java +++ b/api/src/com/cloud/resource/ResourceService.java @@ -18,6 +18,8 @@ import java.util.List; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.dc.DataCenter; import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd; import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd; @@ -50,7 +52,7 @@ public interface ResourceService { Host cancelMaintenance(CancelMaintenanceCmd cmd); - Host reconnectHost(ReconnectHostCmd cmd); + Host reconnectHost(ReconnectHostCmd cmd) throws CloudRuntimeException, AgentUnavailableException; /** * We will automatically create a cloud.com cluster to attach to the external cluster and return a hyper host to perform diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java index 5e1563726813..0fd834206cf4 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/host/ReconnectHostCmd.java @@ -16,6 +16,9 @@ // under the License. package org.apache.cloudstack.api.command.admin.host; +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.utils.exception.CloudRuntimeException; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -100,17 +103,18 @@ public Long getInstanceId() { @Override public void execute() { try { - Host result = _resourceService.reconnectHost(this); - if (result != null) { - HostResponse response = _responseGenerator.createHostResponse(result); - response.setResponseName(getCommandName()); - this.setResponseObject(response); - } else { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to reconnect host"); - } - } catch (Exception ex) { - s_logger.warn("Exception: ", ex); - throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage()); + Host result =_resourceService.reconnectHost(this); + HostResponse response = _responseGenerator.createHostResponse(result); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + }catch (InvalidParameterValueException e) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, e.getMessage()); + } + catch (CloudRuntimeException e) { + s_logger.warn("Exception: ", e); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage()); + }catch (AgentUnavailableException e) { + throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, e.getMessage()); } } } diff --git a/engine/components-api/src/com/cloud/agent/AgentManager.java b/engine/components-api/src/com/cloud/agent/AgentManager.java index 244772d67d05..8024210909fb 100644 --- a/engine/components-api/src/com/cloud/agent/AgentManager.java +++ b/engine/components-api/src/com/cloud/agent/AgentManager.java @@ -16,6 +16,7 @@ // under the License. package com.cloud.agent; +import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.framework.config.ConfigKey; import com.cloud.agent.api.Answer; @@ -141,7 +142,7 @@ public enum TapAgentsAction { public void pullAgentOutMaintenance(long hostId); - boolean reconnect(long hostId); + void reconnect(long hostId) throws CloudRuntimeException, AgentUnavailableException; void rescan(); diff --git a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java index aa7068af533b..2a37ee2cd662 100644 --- a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -986,33 +986,28 @@ public Answer[] send(final Long hostId, final Commands cmds) throws AgentUnavail } @Override - public boolean reconnect(final long hostId) { + public void reconnect(final long hostId) throws CloudRuntimeException, AgentUnavailableException{ HostVO host; host = _hostDao.findById(hostId); if (host == null || host.getRemoved() != null) { - s_logger.warn("Unable to find host " + hostId); - return false; + throw new CloudRuntimeException("Unable to find host " + hostId); } if (host.getStatus() == Status.Disconnected) { - s_logger.info("Host is already disconnected, no work to be done"); - return true; + throw new CloudRuntimeException("Host is already disconnected, no work to be done"); } if (host.getStatus() != Status.Up && host.getStatus() != Status.Alert && host.getStatus() != Status.Rebalancing) { - s_logger.info("Unable to disconnect host because it is not in the correct state: host=" + hostId + "; Status=" + host.getStatus()); - return false; + throw new CloudRuntimeException("Unable to disconnect host because it is not in the correct state: host=" + hostId + "; Status=" + host.getStatus()); } final AgentAttache attache = findAttache(hostId); if (attache == null) { - s_logger.info("Unable to disconnect host because it is not connected to this server: " + hostId); - return false; + throw new CloudRuntimeException("Unable to disconnect host because it is not connected to this server: " + hostId); } disconnectWithoutInvestigation(attache, Event.ShutdownRequested); - return true; } @Override @@ -1049,7 +1044,13 @@ public boolean executeUserRequest(final long hostId, final Event event) throws A } return true; } else if (event == Event.ShutdownRequested) { - return reconnect(hostId); + //should throw a exception here as well.instead of eating this up. + try { + reconnect(hostId); + } catch (CloudRuntimeException e) { + return false; + } + return true; } return false; } diff --git a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 9239adc0911f..340e0f7bbd56 100644 --- a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -357,19 +357,12 @@ public boolean executeUserRequest(final long hostId, final Event event) throws A } @Override - public boolean reconnect(final long hostId) { - Boolean result; - try { - result = propagateAgentEvent(hostId, Event.ShutdownRequested); - if (result != null) { - return result; - } - } catch (final AgentUnavailableException e) { - s_logger.debug("cannot propagate agent reconnect because agent is not available", e); - return false; + public void reconnect(final long hostId) throws CloudRuntimeException, AgentUnavailableException { + Boolean result = propagateAgentEvent(hostId, Event.ShutdownRequested); + if (result!=null && !result) { + throw new CloudRuntimeException("Failed to propagating agent change request event:" + Event.ShutdownRequested + " to host:" + hostId); } - - return super.reconnect(hostId); + super.reconnect(hostId); } public void notifyNodesInCluster(final AgentAttache attache) { diff --git a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java index 99db9ee8158c..c65a50d3fb5c 100644 --- a/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java +++ b/plugins/network-elements/netscaler/src/com/cloud/network/element/NetscalerElement.java @@ -512,7 +512,11 @@ public void doInTransactionWithoutResult(TransactionStatus status) { }); HostVO host = _hostDao.findById(lbDeviceVo.getHostId()); - _agentMgr.reconnect(host.getId()); + try { + _agentMgr.reconnect(host.getId()); + } catch (Exception e ) { + s_logger.debug("failed to reconnect host "+host); + } return lbDeviceVo; } diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java index e18d231e1732..4e8eae43d748 100644 --- a/server/src/com/cloud/alert/AlertManagerImpl.java +++ b/server/src/com/cloud/alert/AlertManagerImpl.java @@ -767,7 +767,9 @@ public void sendAlert(AlertType alertType, long dataCenterId, Long podId, Long c // set up a new alert AlertVO newAlert = new AlertVO(); newAlert.setType(alertType.getType()); - newAlert.setSubject(subject); + //do not have a seperate column for content. + //appending the message to the subject for now. + newAlert.setSubject(subject+content); newAlert.setClusterId(clusterId); newAlert.setPodId(podId); newAlert.setDataCenterId(dataCenterId); diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 2bb1596ed1c7..7ccafc031e1c 100644 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -1157,15 +1157,16 @@ public Host cancelMaintenance(final CancelMaintenanceCmd cmd) { } @Override - public Host reconnectHost(final ReconnectHostCmd cmd) { - final Long hostId = cmd.getId(); + public Host reconnectHost(ReconnectHostCmd cmd) throws CloudRuntimeException, AgentUnavailableException{ + Long hostId = cmd.getId(); final HostVO host = _hostDao.findById(hostId); if (host == null) { throw new InvalidParameterValueException("Host with id " + hostId.toString() + " doesn't exist"); } - return _agentMgr.reconnect(hostId) ? host : null; + _agentMgr.reconnect(hostId); + return host; } @Override