diff --git a/server/conf/migration-components.xml b/server/conf/migration-components.xml
index 1a24e58eb0d..12736375c7d 100644
--- a/server/conf/migration-components.xml
+++ b/server/conf/migration-components.xml
@@ -1,28 +1,28 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
index a274803872b..0ff3d666856 100755
--- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
+++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
@@ -10,435 +10,435 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.agent.manager;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.nio.channels.SocketChannel;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.Executors;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import javax.ejb.Local;
-import javax.naming.ConfigurationException;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLEngine;
-
-import org.apache.log4j.Logger;
-
-import com.cloud.agent.AgentManager;
-import com.cloud.agent.api.Answer;
-import com.cloud.agent.api.CancelCommand;
-import com.cloud.agent.api.ChangeAgentCommand;
-import com.cloud.agent.api.Command;
-import com.cloud.agent.api.TransferAgentCommand;
-import com.cloud.agent.transport.Request;
-import com.cloud.agent.transport.Request.Version;
-import com.cloud.agent.transport.Response;
-import com.cloud.cluster.ClusterManager;
-import com.cloud.cluster.ClusterManagerListener;
-import com.cloud.cluster.ClusteredAgentRebalanceService;
-import com.cloud.cluster.ManagementServerHost;
-import com.cloud.cluster.ManagementServerHostVO;
-import com.cloud.cluster.StackMaid;
-import com.cloud.cluster.agentlb.AgentLoadBalancerPlanner;
-import com.cloud.cluster.agentlb.HostTransferMapVO;
-import com.cloud.cluster.agentlb.HostTransferMapVO.HostTransferState;
-import com.cloud.cluster.agentlb.dao.HostTransferMapDao;
-import com.cloud.cluster.dao.ManagementServerHostDao;
-import com.cloud.configuration.Config;
-import com.cloud.configuration.dao.ConfigurationDao;
-import com.cloud.exception.AgentUnavailableException;
-import com.cloud.exception.OperationTimedoutException;
-import com.cloud.host.Host;
-import com.cloud.host.HostVO;
-import com.cloud.host.Status;
-import com.cloud.host.Status.Event;
-import com.cloud.resource.ServerResource;
-import com.cloud.storage.resource.DummySecondaryStorageResource;
-import com.cloud.utils.DateUtil;
-import com.cloud.utils.NumbersUtil;
-import com.cloud.utils.component.Adapters;
-import com.cloud.utils.component.ComponentLocator;
-import com.cloud.utils.component.Inject;
-import com.cloud.utils.concurrency.NamedThreadFactory;
-import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.SearchCriteria2;
-import com.cloud.utils.db.SearchCriteriaService;
-import com.cloud.utils.db.Transaction;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.nio.Link;
-import com.cloud.utils.nio.Task;
-
-@Local(value = { AgentManager.class, ClusteredAgentRebalanceService.class })
-public class ClusteredAgentManagerImpl extends AgentManagerImpl implements ClusterManagerListener, ClusteredAgentRebalanceService {
- final static Logger s_logger = Logger.getLogger(ClusteredAgentManagerImpl.class);
- private static final ScheduledExecutorService s_transferExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Cluster-AgentTransferExecutor"));
- private final long rebalanceTimeOut = 300000; // 5 mins - after this time remove the agent from the transfer list
-
- public final static long STARTUP_DELAY = 5000;
- public final static long SCAN_INTERVAL = 90000; // 90 seconds, it takes 60 sec for xenserver to fail login
- public final static int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5 seconds
- public long _loadSize = 100;
- protected Set _agentToTransferIds = new HashSet();
-
- @Inject
- protected ClusterManager _clusterMgr = null;
-
- protected HashMap _peers;
- protected HashMap _sslEngines;
- private final Timer _timer = new Timer("ClusteredAgentManager Timer");
-
- @Inject
- protected ManagementServerHostDao _mshostDao;
- @Inject
- protected HostTransferMapDao _hostTransferDao;
-
- @Inject(adapter = AgentLoadBalancerPlanner.class)
- protected Adapters _lbPlanners;
-
- @Inject
- protected AgentManager _agentMgr;
-
- protected ClusteredAgentManagerImpl() {
- super();
- }
-
- @Override
- public boolean configure(String name, Map xmlParams) throws ConfigurationException {
- _peers = new HashMap(7);
- _sslEngines = new HashMap(7);
- _nodeId = _clusterMgr.getManagementNodeId();
-
- s_logger.info("Configuring ClusterAgentManagerImpl. management server node id(msid): " + _nodeId);
-
- ConfigurationDao configDao = ComponentLocator.getCurrentLocator().getDao(ConfigurationDao.class);
- Map params = configDao.getConfiguration(xmlParams);
- String value = params.get(Config.DirectAgentLoadSize.key());
- _loadSize = NumbersUtil.parseInt(value, 16);
-
- ClusteredAgentAttache.initialize(this);
-
- _clusterMgr.registerListener(this);
-
- return super.configure(name, xmlParams);
- }
-
- @Override
- public boolean start() {
- if (!super.start()) {
- return false;
- }
- _timer.schedule(new DirectAgentScanTimerTask(), STARTUP_DELAY, SCAN_INTERVAL);
-
- // schedule transfer scan executor - if agent LB is enabled
- if (_clusterMgr.isAgentRebalanceEnabled()) {
- s_transferExecutor.scheduleAtFixedRate(getTransferScanTask(), 60000, ClusteredAgentRebalanceService.DEFAULT_TRANSFER_CHECK_INTERVAL,
- TimeUnit.MILLISECONDS);
- }
-
- return true;
- }
-
- private void runDirectAgentScanTimerTask() {
- scanDirectAgentToLoad();
- }
-
- private void scanDirectAgentToLoad() {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Begin scanning directly connected hosts");
- }
-
- // for agents that are self-managed, threshold to be considered as disconnected is 3 ping intervals
- long cutSeconds = (System.currentTimeMillis() >> 10) - (_pingInterval * 3);
- List hosts = _hostDao.findAndUpdateDirectAgentToLoad(cutSeconds, _loadSize, _nodeId);
- List appliances = _hostDao.findAndUpdateApplianceToLoad(cutSeconds, _nodeId);
- hosts.addAll(appliances);
-
- if (hosts != null && hosts.size() > 0) {
- s_logger.debug("Found " + hosts.size() + " unmanaged direct hosts, processing connect for them...");
- for (HostVO host : hosts) {
- try {
- AgentAttache agentattache = findAttache(host.getId());
- if (agentattache != null) {
- // already loaded, skip
- if (agentattache.forForward()) {
- if (s_logger.isInfoEnabled()) {
- s_logger.info(host + " is detected down, but we have a forward attache running, disconnect this one before launching the host");
- }
- removeAgent(agentattache, Status.Disconnected);
- } else {
- continue;
- }
- }
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Loading directly connected host " + host.getId() + "(" + host.getName() + ")");
- }
- loadDirectlyConnectedHost(host, false);
- } catch (Throwable e) {
- s_logger.warn(" can not load directly connected host " + host.getId() + "(" + host.getName() + ") due to ",e);
- }
- }
- }
-
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("End scanning directly connected hosts");
- }
- }
-
- private class DirectAgentScanTimerTask extends TimerTask {
- @Override
- public void run() {
- try {
- runDirectAgentScanTimerTask();
- } catch (Throwable e) {
- s_logger.error("Unexpected exception " + e.getMessage(), e);
- }
- }
- }
-
- @Override
- public Task create(Task.Type type, Link link, byte[] data) {
- return new ClusteredAgentHandler(type, link, data);
- }
-
- protected AgentAttache createAttache(long id) {
- s_logger.debug("create forwarding ClusteredAgentAttache for " + id);
- final AgentAttache attache = new ClusteredAgentAttache(this, id);
- AgentAttache old = null;
- synchronized (_agents) {
- old = _agents.get(id);
- _agents.put(id, attache);
- }
- if (old != null) {
- old.disconnect(Status.Removed);
- }
- return attache;
- }
-
- @Override
- protected AgentAttache createAttacheForConnect(HostVO host, Link link) {
- s_logger.debug("create ClusteredAgentAttache for " + host.getId());
- final AgentAttache attache = new ClusteredAgentAttache(this, host.getId(), link, host.isInMaintenanceStates());
- link.attach(attache);
- AgentAttache old = null;
- synchronized (_agents) {
- old = _agents.get(host.getId());
- _agents.put(host.getId(), attache);
- }
- if (old != null) {
- old.disconnect(Status.Removed);
- }
- return attache;
- }
-
- @Override
- protected AgentAttache createAttacheForDirectConnect(HostVO host, ServerResource resource) {
- if (resource instanceof DummySecondaryStorageResource) {
- return new DummyAttache(this, host.getId(), false);
- }
- s_logger.debug("create ClusteredDirectAgentAttache for " + host.getId());
- final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, host.getId(), _nodeId, resource, host.isInMaintenanceStates(), this);
- AgentAttache old = null;
- synchronized (_agents) {
- old = _agents.get(host.getId());
- _agents.put(host.getId(), attache);
- }
- if (old != null) {
- old.disconnect(Status.Removed);
- }
- return attache;
- }
-
- @Override
- protected boolean handleDisconnectWithoutInvestigation(AgentAttache attache, Status.Event event) {
- return handleDisconnect(attache, event, false, true);
- }
-
- @Override
- protected boolean handleDisconnectWithInvestigation(AgentAttache attache, Status.Event event) {
- return handleDisconnect(attache, event, true, true);
- }
-
- protected boolean handleDisconnect(AgentAttache agent, Status.Event event, boolean investigate, boolean broadcast) {
- boolean res;
- if (!investigate) {
- res = super.handleDisconnectWithoutInvestigation(agent, event);
- } else {
- res = super.handleDisconnectWithInvestigation(agent, event);
- }
-
- if (res) {
- if (broadcast) {
- notifyNodesInCluster(agent);
- }
- return true;
- } else {
- return false;
- }
- }
-
- @Override
- public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException {
- if (event == Event.AgentDisconnected) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Received agent disconnect event for host " + hostId);
- }
- AgentAttache attache = findAttache(hostId);
- if (attache != null) {
- handleDisconnect(attache, Event.AgentDisconnected, false, false);
- }
-
- return true;
- } else {
- return super.executeUserRequest(hostId, event);
- }
- }
-
- @Override
- public boolean reconnect(final long hostId) {
- Boolean result;
- try {
- result = _clusterMgr.propagateAgentEvent(hostId, Event.ShutdownRequested);
- if (result != null) {
- return result;
- }
- } catch (AgentUnavailableException e) {
- s_logger.debug("cannot propagate agent reconnect because agent is not available", e);
- return false;
- }
-
- return super.reconnect(hostId);
- }
-
- public void notifyNodesInCluster(AgentAttache attache) {
- s_logger.debug("Notifying other nodes of to disconnect");
- Command[] cmds = new Command[] { new ChangeAgentCommand(attache.getId(), Event.AgentDisconnected) };
- _clusterMgr.broadcast(attache.getId(), cmds);
- }
-
- protected static void logT(byte[] bytes, final String msg) {
- s_logger.trace("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": "
- + (Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
- }
-
- protected static void logD(byte[] bytes, final String msg) {
- s_logger.debug("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": "
- + (Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
- }
-
- protected static void logI(byte[] bytes, final String msg) {
- s_logger.info("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": "
- + (Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
- }
-
- public boolean routeToPeer(String peer, byte[] bytes) {
- int i = 0;
- SocketChannel ch = null;
- SSLEngine sslEngine = null;
- while (i++ < 5) {
- ch = connectToPeer(peer, ch);
- if (ch == null) {
- try {
- logD(bytes, "Unable to route to peer: " + Request.parse(bytes).toString());
- } catch (Exception e) {
- }
- return false;
- }
- sslEngine = getSSLEngine(peer);
- if (sslEngine == null) {
- logD(bytes, "Unable to get SSLEngine of peer: " + peer);
- return false;
- }
- try {
- if (s_logger.isDebugEnabled()) {
- logD(bytes, "Routing to peer");
- }
- Link.write(ch, new ByteBuffer[] { ByteBuffer.wrap(bytes) }, sslEngine);
- return true;
- } catch (IOException e) {
- try {
- logI(bytes, "Unable to route to peer: " + Request.parse(bytes).toString() + " due to " + e.getMessage());
- } catch (Exception ex) {
- }
- }
- }
- return false;
- }
-
- public String findPeer(long hostId) {
- return _clusterMgr.getPeerName(hostId);
- }
-
- public SSLEngine getSSLEngine(String peerName) {
- return _sslEngines.get(peerName);
- }
-
- public void cancel(String peerName, long hostId, long sequence, String reason) {
- CancelCommand cancel = new CancelCommand(sequence, reason);
- Request req = new Request(hostId, _nodeId, cancel, true);
- req.setControl(true);
- routeToPeer(peerName, req.getBytes());
- }
-
- public void closePeer(String peerName) {
- synchronized (_peers) {
- SocketChannel ch = _peers.get(peerName);
- if (ch != null) {
- try {
- ch.close();
- } catch (IOException e) {
- s_logger.warn("Unable to close peer socket connection to " + peerName);
- }
- }
- _peers.remove(peerName);
- _sslEngines.remove(peerName);
- }
- }
-
- public SocketChannel connectToPeer(String peerName, SocketChannel prevCh) {
- synchronized (_peers) {
- SocketChannel ch = _peers.get(peerName);
- SSLEngine sslEngine = null;
- if (prevCh != null) {
- try {
- prevCh.close();
- } catch (Exception e) {
- }
- }
- if (ch == null || ch == prevCh) {
- ManagementServerHostVO ms = _clusterMgr.getPeer(peerName);
- if (ms == null) {
- s_logger.info("Unable to find peer: " + peerName);
- return null;
- }
- String ip = ms.getServiceIP();
- InetAddress addr;
- try {
- addr = InetAddress.getByName(ip);
- } catch (UnknownHostException e) {
- throw new CloudRuntimeException("Unable to resolve " + ip);
- }
- try {
- ch = SocketChannel.open(new InetSocketAddress(addr, _port));
- ch.configureBlocking(true); // make sure we are working at blocking mode
- ch.socket().setKeepAlive(true);
- ch.socket().setSoTimeout(60 * 1000);
+package com.cloud.agent.manager;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.Executors;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.agent.AgentManager;
+import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.CancelCommand;
+import com.cloud.agent.api.ChangeAgentCommand;
+import com.cloud.agent.api.Command;
+import com.cloud.agent.api.TransferAgentCommand;
+import com.cloud.agent.transport.Request;
+import com.cloud.agent.transport.Request.Version;
+import com.cloud.agent.transport.Response;
+import com.cloud.cluster.ClusterManager;
+import com.cloud.cluster.ClusterManagerListener;
+import com.cloud.cluster.ClusteredAgentRebalanceService;
+import com.cloud.cluster.ManagementServerHost;
+import com.cloud.cluster.ManagementServerHostVO;
+import com.cloud.cluster.StackMaid;
+import com.cloud.cluster.agentlb.AgentLoadBalancerPlanner;
+import com.cloud.cluster.agentlb.HostTransferMapVO;
+import com.cloud.cluster.agentlb.HostTransferMapVO.HostTransferState;
+import com.cloud.cluster.agentlb.dao.HostTransferMapDao;
+import com.cloud.cluster.dao.ManagementServerHostDao;
+import com.cloud.configuration.Config;
+import com.cloud.configuration.dao.ConfigurationDao;
+import com.cloud.exception.AgentUnavailableException;
+import com.cloud.exception.OperationTimedoutException;
+import com.cloud.host.Host;
+import com.cloud.host.HostVO;
+import com.cloud.host.Status;
+import com.cloud.host.Status.Event;
+import com.cloud.resource.ServerResource;
+import com.cloud.storage.resource.DummySecondaryStorageResource;
+import com.cloud.utils.DateUtil;
+import com.cloud.utils.NumbersUtil;
+import com.cloud.utils.component.Adapters;
+import com.cloud.utils.component.ComponentLocator;
+import com.cloud.utils.component.Inject;
+import com.cloud.utils.concurrency.NamedThreadFactory;
+import com.cloud.utils.db.SearchCriteria.Op;
+import com.cloud.utils.db.SearchCriteria2;
+import com.cloud.utils.db.SearchCriteriaService;
+import com.cloud.utils.db.Transaction;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.nio.Link;
+import com.cloud.utils.nio.Task;
+
+@Local(value = { AgentManager.class, ClusteredAgentRebalanceService.class })
+public class ClusteredAgentManagerImpl extends AgentManagerImpl implements ClusterManagerListener, ClusteredAgentRebalanceService {
+ final static Logger s_logger = Logger.getLogger(ClusteredAgentManagerImpl.class);
+ private static final ScheduledExecutorService s_transferExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Cluster-AgentTransferExecutor"));
+ private final long rebalanceTimeOut = 300000; // 5 mins - after this time remove the agent from the transfer list
+
+ public final static long STARTUP_DELAY = 5000;
+ public final static long SCAN_INTERVAL = 90000; // 90 seconds, it takes 60 sec for xenserver to fail login
+ public final static int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5 seconds
+ public long _loadSize = 100;
+ protected Set _agentToTransferIds = new HashSet();
+
+ @Inject
+ protected ClusterManager _clusterMgr = null;
+
+ protected HashMap _peers;
+ protected HashMap _sslEngines;
+ private final Timer _timer = new Timer("ClusteredAgentManager Timer");
+
+ @Inject
+ protected ManagementServerHostDao _mshostDao;
+ @Inject
+ protected HostTransferMapDao _hostTransferDao;
+
+ @Inject(adapter = AgentLoadBalancerPlanner.class)
+ protected Adapters _lbPlanners;
+
+ @Inject
+ protected AgentManager _agentMgr;
+
+ protected ClusteredAgentManagerImpl() {
+ super();
+ }
+
+ @Override
+ public boolean configure(String name, Map xmlParams) throws ConfigurationException {
+ _peers = new HashMap(7);
+ _sslEngines = new HashMap(7);
+ _nodeId = _clusterMgr.getManagementNodeId();
+
+ s_logger.info("Configuring ClusterAgentManagerImpl. management server node id(msid): " + _nodeId);
+
+ ConfigurationDao configDao = ComponentLocator.getCurrentLocator().getDao(ConfigurationDao.class);
+ Map params = configDao.getConfiguration(xmlParams);
+ String value = params.get(Config.DirectAgentLoadSize.key());
+ _loadSize = NumbersUtil.parseInt(value, 16);
+
+ ClusteredAgentAttache.initialize(this);
+
+ _clusterMgr.registerListener(this);
+
+ return super.configure(name, xmlParams);
+ }
+
+ @Override
+ public boolean start() {
+ if (!super.start()) {
+ return false;
+ }
+ _timer.schedule(new DirectAgentScanTimerTask(), STARTUP_DELAY, SCAN_INTERVAL);
+
+ // schedule transfer scan executor - if agent LB is enabled
+ if (_clusterMgr.isAgentRebalanceEnabled()) {
+ s_transferExecutor.scheduleAtFixedRate(getTransferScanTask(), 60000, ClusteredAgentRebalanceService.DEFAULT_TRANSFER_CHECK_INTERVAL,
+ TimeUnit.MILLISECONDS);
+ }
+
+ return true;
+ }
+
+ private void runDirectAgentScanTimerTask() {
+ scanDirectAgentToLoad();
+ }
+
+ private void scanDirectAgentToLoad() {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Begin scanning directly connected hosts");
+ }
+
+ // for agents that are self-managed, threshold to be considered as disconnected is 3 ping intervals
+ long cutSeconds = (System.currentTimeMillis() >> 10) - (_pingInterval * 3);
+ List hosts = _hostDao.findAndUpdateDirectAgentToLoad(cutSeconds, _loadSize, _nodeId);
+ List appliances = _hostDao.findAndUpdateApplianceToLoad(cutSeconds, _nodeId);
+ hosts.addAll(appliances);
+
+ if (hosts != null && hosts.size() > 0) {
+ s_logger.debug("Found " + hosts.size() + " unmanaged direct hosts, processing connect for them...");
+ for (HostVO host : hosts) {
+ try {
+ AgentAttache agentattache = findAttache(host.getId());
+ if (agentattache != null) {
+ // already loaded, skip
+ if (agentattache.forForward()) {
+ if (s_logger.isInfoEnabled()) {
+ s_logger.info(host + " is detected down, but we have a forward attache running, disconnect this one before launching the host");
+ }
+ removeAgent(agentattache, Status.Disconnected);
+ } else {
+ continue;
+ }
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Loading directly connected host " + host.getId() + "(" + host.getName() + ")");
+ }
+ loadDirectlyConnectedHost(host, false);
+ } catch (Throwable e) {
+ s_logger.warn(" can not load directly connected host " + host.getId() + "(" + host.getName() + ") due to ",e);
+ }
+ }
+ }
+
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("End scanning directly connected hosts");
+ }
+ }
+
+ private class DirectAgentScanTimerTask extends TimerTask {
+ @Override
+ public void run() {
+ try {
+ runDirectAgentScanTimerTask();
+ } catch (Throwable e) {
+ s_logger.error("Unexpected exception " + e.getMessage(), e);
+ }
+ }
+ }
+
+ @Override
+ public Task create(Task.Type type, Link link, byte[] data) {
+ return new ClusteredAgentHandler(type, link, data);
+ }
+
+ protected AgentAttache createAttache(long id) {
+ s_logger.debug("create forwarding ClusteredAgentAttache for " + id);
+ final AgentAttache attache = new ClusteredAgentAttache(this, id);
+ AgentAttache old = null;
+ synchronized (_agents) {
+ old = _agents.get(id);
+ _agents.put(id, attache);
+ }
+ if (old != null) {
+ old.disconnect(Status.Removed);
+ }
+ return attache;
+ }
+
+ @Override
+ protected AgentAttache createAttacheForConnect(HostVO host, Link link) {
+ s_logger.debug("create ClusteredAgentAttache for " + host.getId());
+ final AgentAttache attache = new ClusteredAgentAttache(this, host.getId(), link, host.isInMaintenanceStates());
+ link.attach(attache);
+ AgentAttache old = null;
+ synchronized (_agents) {
+ old = _agents.get(host.getId());
+ _agents.put(host.getId(), attache);
+ }
+ if (old != null) {
+ old.disconnect(Status.Removed);
+ }
+ return attache;
+ }
+
+ @Override
+ protected AgentAttache createAttacheForDirectConnect(HostVO host, ServerResource resource) {
+ if (resource instanceof DummySecondaryStorageResource) {
+ return new DummyAttache(this, host.getId(), false);
+ }
+ s_logger.debug("create ClusteredDirectAgentAttache for " + host.getId());
+ final DirectAgentAttache attache = new ClusteredDirectAgentAttache(this, host.getId(), _nodeId, resource, host.isInMaintenanceStates(), this);
+ AgentAttache old = null;
+ synchronized (_agents) {
+ old = _agents.get(host.getId());
+ _agents.put(host.getId(), attache);
+ }
+ if (old != null) {
+ old.disconnect(Status.Removed);
+ }
+ return attache;
+ }
+
+ @Override
+ protected boolean handleDisconnectWithoutInvestigation(AgentAttache attache, Status.Event event) {
+ return handleDisconnect(attache, event, false, true);
+ }
+
+ @Override
+ protected boolean handleDisconnectWithInvestigation(AgentAttache attache, Status.Event event) {
+ return handleDisconnect(attache, event, true, true);
+ }
+
+ protected boolean handleDisconnect(AgentAttache agent, Status.Event event, boolean investigate, boolean broadcast) {
+ boolean res;
+ if (!investigate) {
+ res = super.handleDisconnectWithoutInvestigation(agent, event);
+ } else {
+ res = super.handleDisconnectWithInvestigation(agent, event);
+ }
+
+ if (res) {
+ if (broadcast) {
+ notifyNodesInCluster(agent);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException {
+ if (event == Event.AgentDisconnected) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Received agent disconnect event for host " + hostId);
+ }
+ AgentAttache attache = findAttache(hostId);
+ if (attache != null) {
+ handleDisconnect(attache, Event.AgentDisconnected, false, false);
+ }
+
+ return true;
+ } else {
+ return super.executeUserRequest(hostId, event);
+ }
+ }
+
+ @Override
+ public boolean reconnect(final long hostId) {
+ Boolean result;
+ try {
+ result = _clusterMgr.propagateAgentEvent(hostId, Event.ShutdownRequested);
+ if (result != null) {
+ return result;
+ }
+ } catch (AgentUnavailableException e) {
+ s_logger.debug("cannot propagate agent reconnect because agent is not available", e);
+ return false;
+ }
+
+ return super.reconnect(hostId);
+ }
+
+ public void notifyNodesInCluster(AgentAttache attache) {
+ s_logger.debug("Notifying other nodes of to disconnect");
+ Command[] cmds = new Command[] { new ChangeAgentCommand(attache.getId(), Event.AgentDisconnected) };
+ _clusterMgr.broadcast(attache.getId(), cmds);
+ }
+
+ protected static void logT(byte[] bytes, final String msg) {
+ s_logger.trace("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": "
+ + (Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
+ }
+
+ protected static void logD(byte[] bytes, final String msg) {
+ s_logger.debug("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": "
+ + (Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
+ }
+
+ protected static void logI(byte[] bytes, final String msg) {
+ s_logger.info("Seq " + Request.getAgentId(bytes) + "-" + Request.getSequence(bytes) + ": MgmtId " + Request.getManagementServerId(bytes) + ": "
+ + (Request.isRequest(bytes) ? "Req: " : "Resp: ") + msg);
+ }
+
+ public boolean routeToPeer(String peer, byte[] bytes) {
+ int i = 0;
+ SocketChannel ch = null;
+ SSLEngine sslEngine = null;
+ while (i++ < 5) {
+ ch = connectToPeer(peer, ch);
+ if (ch == null) {
+ try {
+ logD(bytes, "Unable to route to peer: " + Request.parse(bytes).toString());
+ } catch (Exception e) {
+ }
+ return false;
+ }
+ sslEngine = getSSLEngine(peer);
+ if (sslEngine == null) {
+ logD(bytes, "Unable to get SSLEngine of peer: " + peer);
+ return false;
+ }
+ try {
+ if (s_logger.isDebugEnabled()) {
+ logD(bytes, "Routing to peer");
+ }
+ Link.write(ch, new ByteBuffer[] { ByteBuffer.wrap(bytes) }, sslEngine);
+ return true;
+ } catch (IOException e) {
+ try {
+ logI(bytes, "Unable to route to peer: " + Request.parse(bytes).toString() + " due to " + e.getMessage());
+ } catch (Exception ex) {
+ }
+ }
+ }
+ return false;
+ }
+
+ public String findPeer(long hostId) {
+ return _clusterMgr.getPeerName(hostId);
+ }
+
+ public SSLEngine getSSLEngine(String peerName) {
+ return _sslEngines.get(peerName);
+ }
+
+ public void cancel(String peerName, long hostId, long sequence, String reason) {
+ CancelCommand cancel = new CancelCommand(sequence, reason);
+ Request req = new Request(hostId, _nodeId, cancel, true);
+ req.setControl(true);
+ routeToPeer(peerName, req.getBytes());
+ }
+
+ public void closePeer(String peerName) {
+ synchronized (_peers) {
+ SocketChannel ch = _peers.get(peerName);
+ if (ch != null) {
+ try {
+ ch.close();
+ } catch (IOException e) {
+ s_logger.warn("Unable to close peer socket connection to " + peerName);
+ }
+ }
+ _peers.remove(peerName);
+ _sslEngines.remove(peerName);
+ }
+ }
+
+ public SocketChannel connectToPeer(String peerName, SocketChannel prevCh) {
+ synchronized (_peers) {
+ SocketChannel ch = _peers.get(peerName);
+ SSLEngine sslEngine = null;
+ if (prevCh != null) {
+ try {
+ prevCh.close();
+ } catch (Exception e) {
+ }
+ }
+ if (ch == null || ch == prevCh) {
+ ManagementServerHostVO ms = _clusterMgr.getPeer(peerName);
+ if (ms == null) {
+ s_logger.info("Unable to find peer: " + peerName);
+ return null;
+ }
+ String ip = ms.getServiceIP();
+ InetAddress addr;
+ try {
+ addr = InetAddress.getByName(ip);
+ } catch (UnknownHostException e) {
+ throw new CloudRuntimeException("Unable to resolve " + ip);
+ }
+ try {
+ ch = SocketChannel.open(new InetSocketAddress(addr, _port));
+ ch.configureBlocking(true); // make sure we are working at blocking mode
+ ch.socket().setKeepAlive(true);
+ ch.socket().setSoTimeout(60 * 1000);
try {
SSLContext sslContext = Link.initSSLContext(true);
sslEngine = sslContext.createSSLEngine(ip, _port);
@@ -449,633 +449,633 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
} catch (Exception e) {
throw new IOException("SSL: Fail to init SSL! " + e);
}
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Connection to peer opened: " + peerName + ", ip: " + ip);
- }
- _peers.put(peerName, ch);
- _sslEngines.put(peerName, sslEngine);
- } catch (IOException e) {
- s_logger.warn("Unable to connect to peer management server: " + peerName + ", ip: " + ip + " due to " + e.getMessage(), e);
- return null;
- }
- }
-
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Found open channel for peer: " + peerName);
- }
- return ch;
- }
- }
-
- public SocketChannel connectToPeer(long hostId, SocketChannel prevCh) {
- String peerName = _clusterMgr.getPeerName(hostId);
- if (peerName == null) {
- return null;
- }
-
- return connectToPeer(peerName, prevCh);
- }
-
- @Override
- protected AgentAttache getAttache(final Long hostId) throws AgentUnavailableException {
- assert (hostId != null) : "Who didn't check their id value?";
- HostVO host = _hostDao.findById(hostId);
- if (host == null) {
- throw new AgentUnavailableException("Can't find the host ", hostId);
- }
-
- AgentAttache agent = findAttache(hostId);
- if (agent == null) {
- if (host.getStatus() == Status.Up && (host.getManagementServerId() != null && host.getManagementServerId() != _nodeId)) {
- agent = createAttache(hostId);
- }
- }
- if (agent == null) {
- AgentUnavailableException ex = new AgentUnavailableException("Host with specified id is not in the right state: " + host.getStatus(), hostId);
- ex.addProxyObject(host, hostId, "hostId");
- throw ex;
- }
-
- return agent;
- }
-
- @Override
- public boolean stop() {
- if (_peers != null) {
- for (SocketChannel ch : _peers.values()) {
- try {
- s_logger.info("Closing: " + ch.toString());
- ch.close();
- } catch (IOException e) {
- }
- }
- }
- _timer.cancel();
-
- //cancel all transfer tasks
- s_transferExecutor.shutdownNow();
- cleanupTransferMap(_nodeId);
-
- return super.stop();
- }
-
- @Override
- public void startDirectlyConnectedHosts() {
- // override and let it be dummy for purpose, we will scan and load direct agents periodically.
- // We may also pickup agents that have been left over from other crashed management server
- }
-
- public class ClusteredAgentHandler extends AgentHandler {
-
- public ClusteredAgentHandler(Task.Type type, Link link, byte[] data) {
- super(type, link, data);
- }
-
- @Override
- protected void doTask(final Task task) throws Exception {
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
- try {
- if (task.getType() != Task.Type.DATA) {
- super.doTask(task);
- return;
- }
-
- final byte[] data = task.getData();
- Version ver = Request.getVersion(data);
- if (ver.ordinal() != Version.v1.ordinal() && ver.ordinal() != Version.v3.ordinal()) {
- s_logger.warn("Wrong version for clustered agent request");
- super.doTask(task);
- return;
- }
-
- long hostId = Request.getAgentId(data);
- Link link = task.getLink();
-
- if (Request.fromServer(data)) {
-
- AgentAttache agent = findAttache(hostId);
-
- if (Request.isControl(data)) {
- if (agent == null) {
- logD(data, "No attache to process cancellation");
- return;
- }
- Request req = Request.parse(data);
- Command[] cmds = req.getCommands();
- CancelCommand cancel = (CancelCommand) cmds[0];
- if (s_logger.isDebugEnabled()) {
- logD(data, "Cancel request received");
- }
- agent.cancel(cancel.getSequence());
- return;
- }
-
- try {
- if (agent == null || agent.isClosed()) {
- throw new AgentUnavailableException("Unable to route to agent ", hostId);
- }
-
- if (Request.isRequest(data) && Request.requiresSequentialExecution(data)) {
- // route it to the agent.
- // But we have the serialize the control commands here so we have
- // to deserialize this and send it through the agent attache.
- Request req = Request.parse(data);
- agent.send(req, null);
- return;
- } else {
- if (agent instanceof Routable) {
- Routable cluster = (Routable) agent;
- cluster.routeToAgent(data);
- } else {
- agent.send(Request.parse(data));
- }
- return;
- }
- } catch (AgentUnavailableException e) {
- logD(data, e.getMessage());
- cancel(Long.toString(Request.getManagementServerId(data)), hostId, Request.getSequence(data), e.getMessage());
- }
- } else {
-
- long mgmtId = Request.getManagementServerId(data);
- if (mgmtId != -1 && mgmtId != _nodeId) {
- routeToPeer(Long.toString(mgmtId), data);
- if (Request.requiresSequentialExecution(data)) {
- AgentAttache attache = (AgentAttache) link.attachment();
- if (attache != null) {
- attache.sendNext(Request.getSequence(data));
- } else if (s_logger.isDebugEnabled()) {
- logD(data, "No attache to process " + Request.parse(data).toString());
- }
- }
- return;
- } else {
- if (Request.isRequest(data)) {
- super.doTask(task);
- } else {
- // received an answer.
- final Response response = Response.parse(data);
- AgentAttache attache = findAttache(response.getAgentId());
- if (attache == null) {
- s_logger.info("SeqA " + response.getAgentId() + "-" + response.getSequence() + "Unable to find attache to forward " + response.toString());
- return;
- }
- if (!attache.processAnswers(response.getSequence(), response)) {
- s_logger.info("SeqA " + attache.getId() + "-" + response.getSequence() + ": Response is not processed: " + response.toString());
- }
- }
- return;
- }
- }
- } finally {
- txn.close();
- }
- }
- }
-
- @Override
- public void onManagementNodeJoined(List nodeList, long selfNodeId) {
- }
-
- @Override
- public void onManagementNodeLeft(List nodeList, long selfNodeId) {
- for (ManagementServerHostVO vo : nodeList) {
- s_logger.info("Marking hosts as disconnected on Management server" + vo.getMsid());
- long lastPing = (System.currentTimeMillis() >> 10) - _pingTimeout;
- _hostDao.markHostsAsDisconnected(vo.getMsid(), lastPing);
- s_logger.info("Deleting entries from op_host_transfer table for Management server " + vo.getMsid());
- cleanupTransferMap(vo.getMsid());
- }
- }
-
- @Override
- public void onManagementNodeIsolated() {
- }
-
- @Override
- public void removeAgent(AgentAttache attache, Status nextState) {
- if (attache == null) {
- return;
- }
-
- super.removeAgent(attache, nextState);
- }
-
- @Override
- public boolean executeRebalanceRequest(long agentId, long currentOwnerId, long futureOwnerId, Event event) throws AgentUnavailableException, OperationTimedoutException {
- boolean result = false;
- if (event == Event.RequestAgentRebalance) {
- return setToWaitForRebalance(agentId, currentOwnerId, futureOwnerId);
- } else if (event == Event.StartAgentRebalance) {
- try {
- result = rebalanceHost(agentId, currentOwnerId, futureOwnerId);
- } catch (Exception e) {
- s_logger.warn("Unable to rebalance host id=" + agentId, e);
- }
- }
- return result;
- }
-
- @Override
- public void scheduleRebalanceAgents() {
- _timer.schedule(new AgentLoadBalancerTask(), 30000);
- }
-
- public class AgentLoadBalancerTask extends TimerTask {
- protected volatile boolean cancelled = false;
-
- public AgentLoadBalancerTask() {
- s_logger.debug("Agent load balancer task created");
- }
-
- @Override
- public synchronized boolean cancel() {
- if (!cancelled) {
- cancelled = true;
- s_logger.debug("Agent load balancer task cancelled");
- return super.cancel();
- }
- return true;
- }
-
- @Override
- public synchronized void run() {
- try {
- if (!cancelled) {
- startRebalanceAgents();
- if (s_logger.isInfoEnabled()) {
- s_logger.info("The agent load balancer task is now being cancelled");
- }
- cancelled = true;
- }
- } catch(Throwable e) {
- s_logger.error("Unexpected exception " + e.toString(), e);
- }
- }
- }
-
- public void startRebalanceAgents() {
- s_logger.debug("Management server " + _nodeId + " is asking other peers to rebalance their agents");
- List allMS = _mshostDao.listBy(ManagementServerHost.State.Up);
- SearchCriteriaService sc = SearchCriteria2.create(HostVO.class);
- sc.addAnd(sc.getEntity().getManagementServerId(), Op.NNULL);
- sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing);
- List allManagedAgents = sc.list();
-
- int avLoad = 0;
-
- if (!allManagedAgents.isEmpty() && !allMS.isEmpty()) {
- avLoad = allManagedAgents.size() / allMS.size();
- } else {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("There are no hosts to rebalance in the system. Current number of active management server nodes in the system is " + allMS.size() + "; number of managed agents is " + allManagedAgents.size());
- }
- return;
- }
-
- if (avLoad == 0L) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("As calculated average load is less than 1, rounding it to 1");
- }
- avLoad = 1;
- }
-
- for (ManagementServerHostVO node : allMS) {
- if (node.getMsid() != _nodeId) {
-
- List hostsToRebalance = new ArrayList();
- for (AgentLoadBalancerPlanner lbPlanner : _lbPlanners) {
- hostsToRebalance = lbPlanner.getHostsToRebalance(node.getMsid(), avLoad);
- if (hostsToRebalance != null && !hostsToRebalance.isEmpty()) {
- break;
- } else {
- s_logger.debug("Agent load balancer planner " + lbPlanner.getName() + " found no hosts to be rebalanced from management server " + node.getMsid());
- }
- }
-
-
- if (hostsToRebalance != null && !hostsToRebalance.isEmpty()) {
- s_logger.debug("Found " + hostsToRebalance.size() + " hosts to rebalance from management server " + node.getMsid());
- for (HostVO host : hostsToRebalance) {
- long hostId = host.getId();
- s_logger.debug("Asking management server " + node.getMsid() + " to give away host id=" + hostId);
- boolean result = true;
-
- if (_hostTransferDao.findById(hostId) != null) {
- s_logger.warn("Somebody else is already rebalancing host id: " + hostId);
- continue;
- }
-
- HostTransferMapVO transfer = null;
- try {
- transfer = _hostTransferDao.startAgentTransfering(hostId, node.getMsid(), _nodeId);
- Answer[] answer = sendRebalanceCommand(node.getMsid(), hostId, node.getMsid(), _nodeId, Event.RequestAgentRebalance);
- if (answer == null) {
- s_logger.warn("Failed to get host id=" + hostId + " from management server " + node.getMsid());
- result = false;
- }
- } catch (Exception ex) {
- s_logger.warn("Failed to get host id=" + hostId + " from management server " + node.getMsid(), ex);
- result = false;
- } finally {
- if (transfer != null) {
- HostTransferMapVO transferState = _hostTransferDao.findByIdAndFutureOwnerId(transfer.getId(), _nodeId);
- if (!result && transferState != null && transferState.getState() == HostTransferState.TransferRequested) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Removing mapping from op_host_transfer as it failed to be set to transfer mode");
- }
- //just remove the mapping (if exists) as nothing was done on the peer management server yet
- _hostTransferDao.remove(transfer.getId());
- }
- }
- }
- }
- } else {
- s_logger.debug("Found no hosts to rebalance from the management server " + node.getMsid());
- }
- }
- }
- }
-
- private Answer[] sendRebalanceCommand(long peer, long agentId, long currentOwnerId, long futureOwnerId, Event event) {
- TransferAgentCommand transfer = new TransferAgentCommand(agentId, currentOwnerId, futureOwnerId, event);
- Commands commands = new Commands(OnError.Stop);
- commands.addCommand(transfer);
-
- Command[] cmds = commands.toCommands();
-
- try {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Forwarding " + cmds[0].toString() + " to " + peer);
- }
- String peerName = Long.toString(peer);
- Answer[] answers = _clusterMgr.execute(peerName, agentId, cmds, true);
- return answers;
- } catch (Exception e) {
- s_logger.warn("Caught exception while talking to " + currentOwnerId, e);
- return null;
- }
- }
-
- private Runnable getTransferScanTask() {
- return new Runnable() {
- @Override
- public void run() {
- try {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Clustered agent transfer scan check, management server id:" + _nodeId);
- }
- synchronized (_agentToTransferIds) {
- if (_agentToTransferIds.size() > 0) {
- s_logger.debug("Found " + _agentToTransferIds.size() + " agents to transfer");
- //for (Long hostId : _agentToTransferIds) {
- for (Iterator iterator = _agentToTransferIds.iterator(); iterator.hasNext();) {
- Long hostId = iterator.next();
- AgentAttache attache = findAttache(hostId);
-
- // if the thread:
- // 1) timed out waiting for the host to reconnect
- // 2) recipient management server is not active any more
- // 3) if the management server doesn't own the host any more
- // remove the host from re-balance list and delete from op_host_transfer DB
- // no need to do anything with the real attache as we haven't modified it yet
- Date cutTime = DateUtil.currentGMTTime();
- HostTransferMapVO transferMap = _hostTransferDao.findActiveHostTransferMapByHostId(hostId, new Date(cutTime.getTime() - rebalanceTimeOut));
-
- if (transferMap == null) {
- s_logger.debug("Timed out waiting for the host id=" + hostId + " to be ready to transfer, skipping rebalance for the host");
- iterator.remove();
- _hostTransferDao.completeAgentTransfer(hostId);
- continue;
- }
-
- if (transferMap.getInitialOwner() != _nodeId || attache.forForward()) {
- s_logger.debug("Management server " + _nodeId + " doesn't own host id=" + hostId + " any more, skipping rebalance for the host");
- iterator.remove();
- _hostTransferDao.completeAgentTransfer(hostId);
- continue;
- }
-
- ManagementServerHostVO ms = _mshostDao.findByMsid(transferMap.getFutureOwner());
- if (ms != null && ms.getState() != ManagementServerHost.State.Up) {
- s_logger.debug("Can't transfer host " + hostId + " as it's future owner is not in UP state: " + ms + ", skipping rebalance for the host");
- iterator.remove();
- _hostTransferDao.completeAgentTransfer(hostId);
- continue;
- }
-
- if (attache.getQueueSize() == 0 && attache.getNonRecurringListenersSize() == 0) {
- iterator.remove();
- try {
- _executor.execute(new RebalanceTask(hostId, transferMap.getInitialOwner(), transferMap.getFutureOwner()));
- } catch (RejectedExecutionException ex) {
- s_logger.warn("Failed to submit rebalance task for host id=" + hostId + "; postponing the execution");
- continue;
- }
-
- } else {
- s_logger.debug("Agent " + hostId + " can't be transfered yet as its request queue size is " + attache.getQueueSize() + " and listener queue size is " + attache.getNonRecurringListenersSize());
- }
- }
- } else {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Found no agents to be transfered by the management server " + _nodeId);
- }
- }
- }
-
- } catch (Throwable e) {
- s_logger.error("Problem with the clustered agent transfer scan check!", e);
- }
- }
- };
- }
-
-
- private boolean setToWaitForRebalance(final long hostId, long currentOwnerId, long futureOwnerId) {
- s_logger.debug("Adding agent " + hostId + " to the list of agents to transfer");
- synchronized (_agentToTransferIds) {
- return _agentToTransferIds.add(hostId);
- }
- }
-
-
- protected boolean rebalanceHost(final long hostId, long currentOwnerId, long futureOwnerId) throws AgentUnavailableException{
-
- boolean result = true;
- if (currentOwnerId == _nodeId) {
- if (!startRebalance(hostId)) {
- s_logger.debug("Failed to start agent rebalancing");
- finishRebalance(hostId, futureOwnerId, Event.RebalanceFailed);
- return false;
- }
- try {
- Answer[] answer = sendRebalanceCommand(futureOwnerId, hostId, currentOwnerId, futureOwnerId, Event.StartAgentRebalance);
- if (answer == null || !answer[0].getResult()) {
- result = false;
- }
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Connection to peer opened: " + peerName + ", ip: " + ip);
+ }
+ _peers.put(peerName, ch);
+ _sslEngines.put(peerName, sslEngine);
+ } catch (IOException e) {
+ s_logger.warn("Unable to connect to peer management server: " + peerName + ", ip: " + ip + " due to " + e.getMessage(), e);
+ return null;
+ }
+ }
- } catch (Exception ex) {
- s_logger.warn("Host " + hostId + " failed to connect to the management server " + futureOwnerId + " as a part of rebalance process", ex);
- result = false;
- }
-
- if (result) {
- s_logger.debug("Successfully transfered host id=" + hostId + " to management server " + futureOwnerId);
- finishRebalance(hostId, futureOwnerId, Event.RebalanceCompleted);
- } else {
- s_logger.warn("Failed to transfer host id=" + hostId + " to management server " + futureOwnerId);
- finishRebalance(hostId, futureOwnerId, Event.RebalanceFailed);
- }
-
- } else if (futureOwnerId == _nodeId) {
- HostVO host = _hostDao.findById(hostId);
- try {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Loading directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process");
- }
- result = loadDirectlyConnectedHost(host, true);
- } catch (Exception ex) {
- s_logger.warn("Failed to load directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process due to:", ex);
- result = false;
- }
-
- if (result) {
- s_logger.debug("Successfully loaded directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process");
- } else {
- s_logger.warn("Failed to load directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process");
- }
- }
-
- return result;
- }
-
-
- protected void finishRebalance(final long hostId, long futureOwnerId, Event event){
-
- boolean success = (event == Event.RebalanceCompleted) ? true : false;
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Finishing rebalancing for the agent " + hostId + " with event " + event);
- }
-
- AgentAttache attache = findAttache(hostId);
- if (attache == null || !(attache instanceof ClusteredAgentAttache)) {
- s_logger.debug("Unable to find forward attache for the host id=" + hostId + ", assuming that the agent disconnected already");
- _hostTransferDao.completeAgentTransfer(hostId);
- return;
- }
-
- ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache)attache;
-
- if (success) {
-
- //1) Set transfer mode to false - so the agent can start processing requests normally
- forwardAttache.setTransferMode(false);
-
- //2) Get all transfer requests and route them to peer
- Request requestToTransfer = forwardAttache.getRequestToTransfer();
- while (requestToTransfer != null) {
- s_logger.debug("Forwarding request " + requestToTransfer.getSequence() + " held in transfer attache " + hostId + " from the management server " + _nodeId + " to " + futureOwnerId);
- boolean routeResult = routeToPeer(Long.toString(futureOwnerId), requestToTransfer.getBytes());
- if (!routeResult) {
- logD(requestToTransfer.getBytes(), "Failed to route request to peer");
- }
-
- requestToTransfer = forwardAttache.getRequestToTransfer();
- }
-
- s_logger.debug("Management server " + _nodeId + " completed agent " + hostId + " rebalance to " + futureOwnerId);
-
- } else {
- failRebalance(hostId);
- }
-
- s_logger.debug("Management server " + _nodeId + " completed agent " + hostId + " rebalance");
- _hostTransferDao.completeAgentTransfer(hostId);
- }
-
- protected void failRebalance(final long hostId){
- try {
- s_logger.debug("Management server " + _nodeId + " failed to rebalance agent " + hostId);
- _hostTransferDao.completeAgentTransfer(hostId);
- handleDisconnectWithoutInvestigation(findAttache(hostId), Event.RebalanceFailed);
- } catch (Exception ex) {
- s_logger.warn("Failed to reconnect host id=" + hostId + " as a part of failed rebalance task cleanup");
- }
- }
-
- protected boolean startRebalance(final long hostId) {
- HostVO host = _hostDao.findById(hostId);
-
- if (host == null || host.getRemoved() != null) {
- s_logger.warn("Unable to find host record, fail start rebalancing process");
- return false;
- }
-
- synchronized (_agents) {
- ClusteredDirectAgentAttache attache = (ClusteredDirectAgentAttache)_agents.get(hostId);
- if (attache != null && attache.getQueueSize() == 0 && attache.getNonRecurringListenersSize() == 0) {
- handleDisconnectWithoutInvestigation(attache, Event.StartAgentRebalance);
- ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache)createAttache(hostId);
- if (forwardAttache == null) {
- s_logger.warn("Unable to create a forward attache for the host " + hostId + " as a part of rebalance process");
- return false;
- }
- s_logger.debug("Putting agent id=" + hostId + " to transfer mode");
- forwardAttache.setTransferMode(true);
- _agents.put(hostId, forwardAttache);
- } else {
- if (attache == null) {
- s_logger.warn("Attache for the agent " + hostId + " no longer exists on management server " + _nodeId + ", can't start host rebalancing");
- } else {
- s_logger.warn("Attache for the agent " + hostId + " has request queue size= " + attache.getQueueSize() + " and listener queue size " + attache.getNonRecurringListenersSize() + ", can't start host rebalancing");
- }
- return false;
- }
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Found open channel for peer: " + peerName);
+ }
+ return ch;
}
- _hostTransferDao.startAgentTransfer(hostId);
- return true;
- }
-
- protected void cleanupTransferMap(long msId) {
- List hostsJoingingCluster = _hostTransferDao.listHostsJoiningCluster(msId);
-
- for (HostTransferMapVO hostJoingingCluster : hostsJoingingCluster) {
- _hostTransferDao.remove(hostJoingingCluster.getId());
- }
-
- List hostsLeavingCluster = _hostTransferDao.listHostsLeavingCluster(msId);
- for (HostTransferMapVO hostLeavingCluster : hostsLeavingCluster) {
- _hostTransferDao.remove(hostLeavingCluster.getId());
- }
- }
-
-
- protected class RebalanceTask implements Runnable {
- Long hostId = null;
- Long currentOwnerId = null;
- Long futureOwnerId = null;
-
-
- public RebalanceTask(long hostId, long currentOwnerId, long futureOwnerId) {
- this.hostId = hostId;
- this.currentOwnerId = currentOwnerId;
- this.futureOwnerId = futureOwnerId;
- }
-
- @Override
- public void run() {
- try {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Rebalancing host id=" + hostId);
- }
- rebalanceHost(hostId, currentOwnerId, futureOwnerId);
- } catch (Exception e) {
- s_logger.warn("Unable to rebalance host id=" + hostId, e);
- } finally {
- StackMaid.current().exitCleanup();
- }
- }
- }
-
-}
+ }
+
+ public SocketChannel connectToPeer(long hostId, SocketChannel prevCh) {
+ String peerName = _clusterMgr.getPeerName(hostId);
+ if (peerName == null) {
+ return null;
+ }
+
+ return connectToPeer(peerName, prevCh);
+ }
+
+ @Override
+ protected AgentAttache getAttache(final Long hostId) throws AgentUnavailableException {
+ assert (hostId != null) : "Who didn't check their id value?";
+ HostVO host = _hostDao.findById(hostId);
+ if (host == null) {
+ throw new AgentUnavailableException("Can't find the host ", hostId);
+ }
+
+ AgentAttache agent = findAttache(hostId);
+ if (agent == null) {
+ if (host.getStatus() == Status.Up && (host.getManagementServerId() != null && host.getManagementServerId() != _nodeId)) {
+ agent = createAttache(hostId);
+ }
+ }
+ if (agent == null) {
+ AgentUnavailableException ex = new AgentUnavailableException("Host with specified id is not in the right state: " + host.getStatus(), hostId);
+ ex.addProxyObject(host, hostId, "hostId");
+ throw ex;
+ }
+
+ return agent;
+ }
+
+ @Override
+ public boolean stop() {
+ if (_peers != null) {
+ for (SocketChannel ch : _peers.values()) {
+ try {
+ s_logger.info("Closing: " + ch.toString());
+ ch.close();
+ } catch (IOException e) {
+ }
+ }
+ }
+ _timer.cancel();
+
+ //cancel all transfer tasks
+ s_transferExecutor.shutdownNow();
+ cleanupTransferMap(_nodeId);
+
+ return super.stop();
+ }
+
+ @Override
+ public void startDirectlyConnectedHosts() {
+ // override and let it be dummy for purpose, we will scan and load direct agents periodically.
+ // We may also pickup agents that have been left over from other crashed management server
+ }
+
+ public class ClusteredAgentHandler extends AgentHandler {
+
+ public ClusteredAgentHandler(Task.Type type, Link link, byte[] data) {
+ super(type, link, data);
+ }
+
+ @Override
+ protected void doTask(final Task task) throws Exception {
+ Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ try {
+ if (task.getType() != Task.Type.DATA) {
+ super.doTask(task);
+ return;
+ }
+
+ final byte[] data = task.getData();
+ Version ver = Request.getVersion(data);
+ if (ver.ordinal() != Version.v1.ordinal() && ver.ordinal() != Version.v3.ordinal()) {
+ s_logger.warn("Wrong version for clustered agent request");
+ super.doTask(task);
+ return;
+ }
+
+ long hostId = Request.getAgentId(data);
+ Link link = task.getLink();
+
+ if (Request.fromServer(data)) {
+
+ AgentAttache agent = findAttache(hostId);
+
+ if (Request.isControl(data)) {
+ if (agent == null) {
+ logD(data, "No attache to process cancellation");
+ return;
+ }
+ Request req = Request.parse(data);
+ Command[] cmds = req.getCommands();
+ CancelCommand cancel = (CancelCommand) cmds[0];
+ if (s_logger.isDebugEnabled()) {
+ logD(data, "Cancel request received");
+ }
+ agent.cancel(cancel.getSequence());
+ return;
+ }
+
+ try {
+ if (agent == null || agent.isClosed()) {
+ throw new AgentUnavailableException("Unable to route to agent ", hostId);
+ }
+
+ if (Request.isRequest(data) && Request.requiresSequentialExecution(data)) {
+ // route it to the agent.
+ // But we have the serialize the control commands here so we have
+ // to deserialize this and send it through the agent attache.
+ Request req = Request.parse(data);
+ agent.send(req, null);
+ return;
+ } else {
+ if (agent instanceof Routable) {
+ Routable cluster = (Routable) agent;
+ cluster.routeToAgent(data);
+ } else {
+ agent.send(Request.parse(data));
+ }
+ return;
+ }
+ } catch (AgentUnavailableException e) {
+ logD(data, e.getMessage());
+ cancel(Long.toString(Request.getManagementServerId(data)), hostId, Request.getSequence(data), e.getMessage());
+ }
+ } else {
+
+ long mgmtId = Request.getManagementServerId(data);
+ if (mgmtId != -1 && mgmtId != _nodeId) {
+ routeToPeer(Long.toString(mgmtId), data);
+ if (Request.requiresSequentialExecution(data)) {
+ AgentAttache attache = (AgentAttache) link.attachment();
+ if (attache != null) {
+ attache.sendNext(Request.getSequence(data));
+ } else if (s_logger.isDebugEnabled()) {
+ logD(data, "No attache to process " + Request.parse(data).toString());
+ }
+ }
+ return;
+ } else {
+ if (Request.isRequest(data)) {
+ super.doTask(task);
+ } else {
+ // received an answer.
+ final Response response = Response.parse(data);
+ AgentAttache attache = findAttache(response.getAgentId());
+ if (attache == null) {
+ s_logger.info("SeqA " + response.getAgentId() + "-" + response.getSequence() + "Unable to find attache to forward " + response.toString());
+ return;
+ }
+ if (!attache.processAnswers(response.getSequence(), response)) {
+ s_logger.info("SeqA " + attache.getId() + "-" + response.getSequence() + ": Response is not processed: " + response.toString());
+ }
+ }
+ return;
+ }
+ }
+ } finally {
+ txn.close();
+ }
+ }
+ }
+
+ @Override
+ public void onManagementNodeJoined(List nodeList, long selfNodeId) {
+ }
+
+ @Override
+ public void onManagementNodeLeft(List nodeList, long selfNodeId) {
+ for (ManagementServerHostVO vo : nodeList) {
+ s_logger.info("Marking hosts as disconnected on Management server" + vo.getMsid());
+ long lastPing = (System.currentTimeMillis() >> 10) - _pingTimeout;
+ _hostDao.markHostsAsDisconnected(vo.getMsid(), lastPing);
+ s_logger.info("Deleting entries from op_host_transfer table for Management server " + vo.getMsid());
+ cleanupTransferMap(vo.getMsid());
+ }
+ }
+
+ @Override
+ public void onManagementNodeIsolated() {
+ }
+
+ @Override
+ public void removeAgent(AgentAttache attache, Status nextState) {
+ if (attache == null) {
+ return;
+ }
+
+ super.removeAgent(attache, nextState);
+ }
+
+ @Override
+ public boolean executeRebalanceRequest(long agentId, long currentOwnerId, long futureOwnerId, Event event) throws AgentUnavailableException, OperationTimedoutException {
+ boolean result = false;
+ if (event == Event.RequestAgentRebalance) {
+ return setToWaitForRebalance(agentId, currentOwnerId, futureOwnerId);
+ } else if (event == Event.StartAgentRebalance) {
+ try {
+ result = rebalanceHost(agentId, currentOwnerId, futureOwnerId);
+ } catch (Exception e) {
+ s_logger.warn("Unable to rebalance host id=" + agentId, e);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public void scheduleRebalanceAgents() {
+ _timer.schedule(new AgentLoadBalancerTask(), 30000);
+ }
+
+ public class AgentLoadBalancerTask extends TimerTask {
+ protected volatile boolean cancelled = false;
+
+ public AgentLoadBalancerTask() {
+ s_logger.debug("Agent load balancer task created");
+ }
+
+ @Override
+ public synchronized boolean cancel() {
+ if (!cancelled) {
+ cancelled = true;
+ s_logger.debug("Agent load balancer task cancelled");
+ return super.cancel();
+ }
+ return true;
+ }
+
+ @Override
+ public synchronized void run() {
+ try {
+ if (!cancelled) {
+ startRebalanceAgents();
+ if (s_logger.isInfoEnabled()) {
+ s_logger.info("The agent load balancer task is now being cancelled");
+ }
+ cancelled = true;
+ }
+ } catch(Throwable e) {
+ s_logger.error("Unexpected exception " + e.toString(), e);
+ }
+ }
+ }
+
+ public void startRebalanceAgents() {
+ s_logger.debug("Management server " + _nodeId + " is asking other peers to rebalance their agents");
+ List allMS = _mshostDao.listBy(ManagementServerHost.State.Up);
+ SearchCriteriaService sc = SearchCriteria2.create(HostVO.class);
+ sc.addAnd(sc.getEntity().getManagementServerId(), Op.NNULL);
+ sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing);
+ List allManagedAgents = sc.list();
+
+ int avLoad = 0;
+
+ if (!allManagedAgents.isEmpty() && !allMS.isEmpty()) {
+ avLoad = allManagedAgents.size() / allMS.size();
+ } else {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("There are no hosts to rebalance in the system. Current number of active management server nodes in the system is " + allMS.size() + "; number of managed agents is " + allManagedAgents.size());
+ }
+ return;
+ }
+
+ if (avLoad == 0L) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("As calculated average load is less than 1, rounding it to 1");
+ }
+ avLoad = 1;
+ }
+
+ for (ManagementServerHostVO node : allMS) {
+ if (node.getMsid() != _nodeId) {
+
+ List hostsToRebalance = new ArrayList();
+ for (AgentLoadBalancerPlanner lbPlanner : _lbPlanners) {
+ hostsToRebalance = lbPlanner.getHostsToRebalance(node.getMsid(), avLoad);
+ if (hostsToRebalance != null && !hostsToRebalance.isEmpty()) {
+ break;
+ } else {
+ s_logger.debug("Agent load balancer planner " + lbPlanner.getName() + " found no hosts to be rebalanced from management server " + node.getMsid());
+ }
+ }
+
+
+ if (hostsToRebalance != null && !hostsToRebalance.isEmpty()) {
+ s_logger.debug("Found " + hostsToRebalance.size() + " hosts to rebalance from management server " + node.getMsid());
+ for (HostVO host : hostsToRebalance) {
+ long hostId = host.getId();
+ s_logger.debug("Asking management server " + node.getMsid() + " to give away host id=" + hostId);
+ boolean result = true;
+
+ if (_hostTransferDao.findById(hostId) != null) {
+ s_logger.warn("Somebody else is already rebalancing host id: " + hostId);
+ continue;
+ }
+
+ HostTransferMapVO transfer = null;
+ try {
+ transfer = _hostTransferDao.startAgentTransfering(hostId, node.getMsid(), _nodeId);
+ Answer[] answer = sendRebalanceCommand(node.getMsid(), hostId, node.getMsid(), _nodeId, Event.RequestAgentRebalance);
+ if (answer == null) {
+ s_logger.warn("Failed to get host id=" + hostId + " from management server " + node.getMsid());
+ result = false;
+ }
+ } catch (Exception ex) {
+ s_logger.warn("Failed to get host id=" + hostId + " from management server " + node.getMsid(), ex);
+ result = false;
+ } finally {
+ if (transfer != null) {
+ HostTransferMapVO transferState = _hostTransferDao.findByIdAndFutureOwnerId(transfer.getId(), _nodeId);
+ if (!result && transferState != null && transferState.getState() == HostTransferState.TransferRequested) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Removing mapping from op_host_transfer as it failed to be set to transfer mode");
+ }
+ //just remove the mapping (if exists) as nothing was done on the peer management server yet
+ _hostTransferDao.remove(transfer.getId());
+ }
+ }
+ }
+ }
+ } else {
+ s_logger.debug("Found no hosts to rebalance from the management server " + node.getMsid());
+ }
+ }
+ }
+ }
+
+ private Answer[] sendRebalanceCommand(long peer, long agentId, long currentOwnerId, long futureOwnerId, Event event) {
+ TransferAgentCommand transfer = new TransferAgentCommand(agentId, currentOwnerId, futureOwnerId, event);
+ Commands commands = new Commands(OnError.Stop);
+ commands.addCommand(transfer);
+
+ Command[] cmds = commands.toCommands();
+
+ try {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Forwarding " + cmds[0].toString() + " to " + peer);
+ }
+ String peerName = Long.toString(peer);
+ Answer[] answers = _clusterMgr.execute(peerName, agentId, cmds, true);
+ return answers;
+ } catch (Exception e) {
+ s_logger.warn("Caught exception while talking to " + currentOwnerId, e);
+ return null;
+ }
+ }
+
+ private Runnable getTransferScanTask() {
+ return new Runnable() {
+ @Override
+ public void run() {
+ try {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Clustered agent transfer scan check, management server id:" + _nodeId);
+ }
+ synchronized (_agentToTransferIds) {
+ if (_agentToTransferIds.size() > 0) {
+ s_logger.debug("Found " + _agentToTransferIds.size() + " agents to transfer");
+ //for (Long hostId : _agentToTransferIds) {
+ for (Iterator iterator = _agentToTransferIds.iterator(); iterator.hasNext();) {
+ Long hostId = iterator.next();
+ AgentAttache attache = findAttache(hostId);
+
+ // if the thread:
+ // 1) timed out waiting for the host to reconnect
+ // 2) recipient management server is not active any more
+ // 3) if the management server doesn't own the host any more
+ // remove the host from re-balance list and delete from op_host_transfer DB
+ // no need to do anything with the real attache as we haven't modified it yet
+ Date cutTime = DateUtil.currentGMTTime();
+ HostTransferMapVO transferMap = _hostTransferDao.findActiveHostTransferMapByHostId(hostId, new Date(cutTime.getTime() - rebalanceTimeOut));
+
+ if (transferMap == null) {
+ s_logger.debug("Timed out waiting for the host id=" + hostId + " to be ready to transfer, skipping rebalance for the host");
+ iterator.remove();
+ _hostTransferDao.completeAgentTransfer(hostId);
+ continue;
+ }
+
+ if (transferMap.getInitialOwner() != _nodeId || attache.forForward()) {
+ s_logger.debug("Management server " + _nodeId + " doesn't own host id=" + hostId + " any more, skipping rebalance for the host");
+ iterator.remove();
+ _hostTransferDao.completeAgentTransfer(hostId);
+ continue;
+ }
+
+ ManagementServerHostVO ms = _mshostDao.findByMsid(transferMap.getFutureOwner());
+ if (ms != null && ms.getState() != ManagementServerHost.State.Up) {
+ s_logger.debug("Can't transfer host " + hostId + " as it's future owner is not in UP state: " + ms + ", skipping rebalance for the host");
+ iterator.remove();
+ _hostTransferDao.completeAgentTransfer(hostId);
+ continue;
+ }
+
+ if (attache.getQueueSize() == 0 && attache.getNonRecurringListenersSize() == 0) {
+ iterator.remove();
+ try {
+ _executor.execute(new RebalanceTask(hostId, transferMap.getInitialOwner(), transferMap.getFutureOwner()));
+ } catch (RejectedExecutionException ex) {
+ s_logger.warn("Failed to submit rebalance task for host id=" + hostId + "; postponing the execution");
+ continue;
+ }
+
+ } else {
+ s_logger.debug("Agent " + hostId + " can't be transfered yet as its request queue size is " + attache.getQueueSize() + " and listener queue size is " + attache.getNonRecurringListenersSize());
+ }
+ }
+ } else {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Found no agents to be transfered by the management server " + _nodeId);
+ }
+ }
+ }
+
+ } catch (Throwable e) {
+ s_logger.error("Problem with the clustered agent transfer scan check!", e);
+ }
+ }
+ };
+ }
+
+
+ private boolean setToWaitForRebalance(final long hostId, long currentOwnerId, long futureOwnerId) {
+ s_logger.debug("Adding agent " + hostId + " to the list of agents to transfer");
+ synchronized (_agentToTransferIds) {
+ return _agentToTransferIds.add(hostId);
+ }
+ }
+
+
+ protected boolean rebalanceHost(final long hostId, long currentOwnerId, long futureOwnerId) throws AgentUnavailableException{
+
+ boolean result = true;
+ if (currentOwnerId == _nodeId) {
+ if (!startRebalance(hostId)) {
+ s_logger.debug("Failed to start agent rebalancing");
+ finishRebalance(hostId, futureOwnerId, Event.RebalanceFailed);
+ return false;
+ }
+ try {
+ Answer[] answer = sendRebalanceCommand(futureOwnerId, hostId, currentOwnerId, futureOwnerId, Event.StartAgentRebalance);
+ if (answer == null || !answer[0].getResult()) {
+ result = false;
+ }
+
+ } catch (Exception ex) {
+ s_logger.warn("Host " + hostId + " failed to connect to the management server " + futureOwnerId + " as a part of rebalance process", ex);
+ result = false;
+ }
+
+ if (result) {
+ s_logger.debug("Successfully transfered host id=" + hostId + " to management server " + futureOwnerId);
+ finishRebalance(hostId, futureOwnerId, Event.RebalanceCompleted);
+ } else {
+ s_logger.warn("Failed to transfer host id=" + hostId + " to management server " + futureOwnerId);
+ finishRebalance(hostId, futureOwnerId, Event.RebalanceFailed);
+ }
+
+ } else if (futureOwnerId == _nodeId) {
+ HostVO host = _hostDao.findById(hostId);
+ try {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Loading directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process");
+ }
+ result = loadDirectlyConnectedHost(host, true);
+ } catch (Exception ex) {
+ s_logger.warn("Failed to load directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process due to:", ex);
+ result = false;
+ }
+
+ if (result) {
+ s_logger.debug("Successfully loaded directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process");
+ } else {
+ s_logger.warn("Failed to load directly connected host " + host.getId() + "(" + host.getName() + ") to the management server " + _nodeId + " as a part of rebalance process");
+ }
+ }
+
+ return result;
+ }
+
+
+ protected void finishRebalance(final long hostId, long futureOwnerId, Event event){
+
+ boolean success = (event == Event.RebalanceCompleted) ? true : false;
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Finishing rebalancing for the agent " + hostId + " with event " + event);
+ }
+
+ AgentAttache attache = findAttache(hostId);
+ if (attache == null || !(attache instanceof ClusteredAgentAttache)) {
+ s_logger.debug("Unable to find forward attache for the host id=" + hostId + ", assuming that the agent disconnected already");
+ _hostTransferDao.completeAgentTransfer(hostId);
+ return;
+ }
+
+ ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache)attache;
+
+ if (success) {
+
+ //1) Set transfer mode to false - so the agent can start processing requests normally
+ forwardAttache.setTransferMode(false);
+
+ //2) Get all transfer requests and route them to peer
+ Request requestToTransfer = forwardAttache.getRequestToTransfer();
+ while (requestToTransfer != null) {
+ s_logger.debug("Forwarding request " + requestToTransfer.getSequence() + " held in transfer attache " + hostId + " from the management server " + _nodeId + " to " + futureOwnerId);
+ boolean routeResult = routeToPeer(Long.toString(futureOwnerId), requestToTransfer.getBytes());
+ if (!routeResult) {
+ logD(requestToTransfer.getBytes(), "Failed to route request to peer");
+ }
+
+ requestToTransfer = forwardAttache.getRequestToTransfer();
+ }
+
+ s_logger.debug("Management server " + _nodeId + " completed agent " + hostId + " rebalance to " + futureOwnerId);
+
+ } else {
+ failRebalance(hostId);
+ }
+
+ s_logger.debug("Management server " + _nodeId + " completed agent " + hostId + " rebalance");
+ _hostTransferDao.completeAgentTransfer(hostId);
+ }
+
+ protected void failRebalance(final long hostId){
+ try {
+ s_logger.debug("Management server " + _nodeId + " failed to rebalance agent " + hostId);
+ _hostTransferDao.completeAgentTransfer(hostId);
+ handleDisconnectWithoutInvestigation(findAttache(hostId), Event.RebalanceFailed);
+ } catch (Exception ex) {
+ s_logger.warn("Failed to reconnect host id=" + hostId + " as a part of failed rebalance task cleanup");
+ }
+ }
+
+ protected boolean startRebalance(final long hostId) {
+ HostVO host = _hostDao.findById(hostId);
+
+ if (host == null || host.getRemoved() != null) {
+ s_logger.warn("Unable to find host record, fail start rebalancing process");
+ return false;
+ }
+
+ synchronized (_agents) {
+ ClusteredDirectAgentAttache attache = (ClusteredDirectAgentAttache)_agents.get(hostId);
+ if (attache != null && attache.getQueueSize() == 0 && attache.getNonRecurringListenersSize() == 0) {
+ handleDisconnectWithoutInvestigation(attache, Event.StartAgentRebalance);
+ ClusteredAgentAttache forwardAttache = (ClusteredAgentAttache)createAttache(hostId);
+ if (forwardAttache == null) {
+ s_logger.warn("Unable to create a forward attache for the host " + hostId + " as a part of rebalance process");
+ return false;
+ }
+ s_logger.debug("Putting agent id=" + hostId + " to transfer mode");
+ forwardAttache.setTransferMode(true);
+ _agents.put(hostId, forwardAttache);
+ } else {
+ if (attache == null) {
+ s_logger.warn("Attache for the agent " + hostId + " no longer exists on management server " + _nodeId + ", can't start host rebalancing");
+ } else {
+ s_logger.warn("Attache for the agent " + hostId + " has request queue size= " + attache.getQueueSize() + " and listener queue size " + attache.getNonRecurringListenersSize() + ", can't start host rebalancing");
+ }
+ return false;
+ }
+ }
+ _hostTransferDao.startAgentTransfer(hostId);
+ return true;
+ }
+
+ protected void cleanupTransferMap(long msId) {
+ List hostsJoingingCluster = _hostTransferDao.listHostsJoiningCluster(msId);
+
+ for (HostTransferMapVO hostJoingingCluster : hostsJoingingCluster) {
+ _hostTransferDao.remove(hostJoingingCluster.getId());
+ }
+
+ List hostsLeavingCluster = _hostTransferDao.listHostsLeavingCluster(msId);
+ for (HostTransferMapVO hostLeavingCluster : hostsLeavingCluster) {
+ _hostTransferDao.remove(hostLeavingCluster.getId());
+ }
+ }
+
+
+ protected class RebalanceTask implements Runnable {
+ Long hostId = null;
+ Long currentOwnerId = null;
+ Long futureOwnerId = null;
+
+
+ public RebalanceTask(long hostId, long currentOwnerId, long futureOwnerId) {
+ this.hostId = hostId;
+ this.currentOwnerId = currentOwnerId;
+ this.futureOwnerId = futureOwnerId;
+ }
+
+ @Override
+ public void run() {
+ try {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Rebalancing host id=" + hostId);
+ }
+ rebalanceHost(hostId, currentOwnerId, futureOwnerId);
+ } catch (Exception e) {
+ s_logger.warn("Unable to rebalance host id=" + hostId, e);
+ } finally {
+ StackMaid.current().exitCleanup();
+ }
+ }
+ }
+
+}
diff --git a/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java b/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java
index ebd1f9b9221..63a631531f5 100755
--- a/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java
+++ b/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java
@@ -10,8 +10,8 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.agent.manager;
-
+package com.cloud.agent.manager;
+
import java.nio.channels.ClosedChannelException;
import org.apache.log4j.Logger;
@@ -22,57 +22,57 @@ import com.cloud.agent.transport.Request;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.host.Status;
import com.cloud.utils.nio.Link;
-
-/**
- * ConnectedAgentAttache implements an direct connection to this management server.
- */
-public class ConnectedAgentAttache extends AgentAttache {
- private static final Logger s_logger = Logger.getLogger(ConnectedAgentAttache.class);
-
- protected Link _link;
-
- public ConnectedAgentAttache(AgentManagerImpl agentMgr, final long id, final Link link, boolean maintenance) {
- super(agentMgr, id, maintenance);
- _link = link;
- }
-
- @Override
- public synchronized void send(Request req) throws AgentUnavailableException {
- try {
- _link.send(req.toBytes());
- } catch (ClosedChannelException e) {
- throw new AgentUnavailableException("Channel is closed", _id);
- }
- }
-
- @Override
- public synchronized boolean isClosed() {
- return _link == null;
- }
-
- @Override
- public void disconnect(final Status state) {
- synchronized (this) {
- s_logger.debug("Processing Disconnect.");
- if (_link != null) {
- _link.close();
- _link.terminated();
- }
- _link = null;
- }
- cancelAllCommands(state, true);
- _requests.clear();
- }
-
- @Override
- public boolean equals(Object obj) {
- try {
- ConnectedAgentAttache that = (ConnectedAgentAttache) obj;
- return super.equals(obj) && this._link == that._link && this._link != null;
- } catch (ClassCastException e) {
+
+/**
+ * ConnectedAgentAttache implements an direct connection to this management server.
+ */
+public class ConnectedAgentAttache extends AgentAttache {
+ private static final Logger s_logger = Logger.getLogger(ConnectedAgentAttache.class);
+
+ protected Link _link;
+
+ public ConnectedAgentAttache(AgentManagerImpl agentMgr, final long id, final Link link, boolean maintenance) {
+ super(agentMgr, id, maintenance);
+ _link = link;
+ }
+
+ @Override
+ public synchronized void send(Request req) throws AgentUnavailableException {
+ try {
+ _link.send(req.toBytes());
+ } catch (ClosedChannelException e) {
+ throw new AgentUnavailableException("Channel is closed", _id);
+ }
+ }
+
+ @Override
+ public synchronized boolean isClosed() {
+ return _link == null;
+ }
+
+ @Override
+ public void disconnect(final Status state) {
+ synchronized (this) {
+ s_logger.debug("Processing Disconnect.");
+ if (_link != null) {
+ _link.close();
+ _link.terminated();
+ }
+ _link = null;
+ }
+ cancelAllCommands(state, true);
+ _requests.clear();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ try {
+ ConnectedAgentAttache that = (ConnectedAgentAttache) obj;
+ return super.equals(obj) && this._link == that._link && this._link != null;
+ } catch (ClassCastException e) {
assert false : "Who's sending an " + obj.getClass().getSimpleName() + " to " + this.getClass().getSimpleName() + ".equals()? ";
- return false;
- }
+ return false;
+ }
}
@Override
@@ -94,4 +94,4 @@ public class ConnectedAgentAttache extends AgentAttache {
public void updatePassword(Command newPassword) {
throw new IllegalStateException("Should not have come here ");
}
-}
+}
diff --git a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java
index ee60681a432..0be21f0b2c5 100644
--- a/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java
+++ b/server/src/com/cloud/agent/manager/allocator/impl/FirstFitRoutingAllocator.java
@@ -10,8 +10,8 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.agent.manager.allocator.impl;
-
+package com.cloud.agent.manager.allocator.impl;
+
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Local;
@@ -23,22 +23,22 @@ import com.cloud.host.Host;
import com.cloud.host.Host.Type;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
-
-@Local(value={HostAllocator.class})
-public class FirstFitRoutingAllocator extends FirstFitAllocator {
- @Override
+
+@Local(value={HostAllocator.class})
+public class FirstFitRoutingAllocator extends FirstFitAllocator {
+ @Override
public List allocateTo(VirtualMachineProfile extends VirtualMachine> vmProfile, DeploymentPlan plan, Type type,
ExcludeList avoid, int returnUpTo) {
- try {
- NDC.push("FirstFitRoutingAllocator");
- if (type != Host.Type.Routing) {
- // FirstFitRoutingAllocator is to find space on routing capable hosts only
- return new ArrayList();
- }
- //all hosts should be of type routing anyway.
- return super.allocateTo(vmProfile, plan, type, avoid, returnUpTo);
- } finally {
- NDC.pop();
- }
- }
-}
+ try {
+ NDC.push("FirstFitRoutingAllocator");
+ if (type != Host.Type.Routing) {
+ // FirstFitRoutingAllocator is to find space on routing capable hosts only
+ return new ArrayList();
+ }
+ //all hosts should be of type routing anyway.
+ return super.allocateTo(vmProfile, plan, type, avoid, returnUpTo);
+ } finally {
+ NDC.pop();
+ }
+ }
+}
diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java
index 612078d963f..5b19b9d9fa1 100755
--- a/server/src/com/cloud/alert/AlertManagerImpl.java
+++ b/server/src/com/cloud/alert/AlertManagerImpl.java
@@ -10,8 +10,8 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.alert;
-
+package com.cloud.alert;
+
import java.io.UnsupportedEncodingException;
import java.text.DecimalFormat;
import java.util.ArrayList;
@@ -71,112 +71,112 @@ import com.cloud.utils.db.SearchCriteria;
import com.sun.mail.smtp.SMTPMessage;
import com.sun.mail.smtp.SMTPSSLTransport;
import com.sun.mail.smtp.SMTPTransport;
-
-@Local(value={AlertManager.class})
-public class AlertManagerImpl implements AlertManager {
- private static final Logger s_logger = Logger.getLogger(AlertManagerImpl.class.getName());
-
- private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds
-
- private static final DecimalFormat _dfPct = new DecimalFormat("###.##");
- private static final DecimalFormat _dfWhole = new DecimalFormat("########");
-
- private String _name = null;
- private EmailAlert _emailAlert;
- @Inject private AlertDao _alertDao;
+
+@Local(value={AlertManager.class})
+public class AlertManagerImpl implements AlertManager {
+ private static final Logger s_logger = Logger.getLogger(AlertManagerImpl.class.getName());
+
+ private static final long INITIAL_CAPACITY_CHECK_DELAY = 30L * 1000L; // thirty seconds expressed in milliseconds
+
+ private static final DecimalFormat _dfPct = new DecimalFormat("###.##");
+ private static final DecimalFormat _dfWhole = new DecimalFormat("########");
+
+ private String _name = null;
+ private EmailAlert _emailAlert;
+ @Inject private AlertDao _alertDao;
@Inject private HostDao _hostDao;
@Inject protected StorageManager _storageMgr;
- @Inject protected CapacityManager _capacityMgr;
- @Inject private CapacityDao _capacityDao;
- @Inject private DataCenterDao _dcDao;
+ @Inject protected CapacityManager _capacityMgr;
+ @Inject private CapacityDao _capacityDao;
+ @Inject private DataCenterDao _dcDao;
@Inject private HostPodDao _podDao;
- @Inject private ClusterDao _clusterDao;
- @Inject private VolumeDao _volumeDao;
- @Inject private IPAddressDao _publicIPAddressDao;
- @Inject private DataCenterIpAddressDao _privateIPAddressDao;
+ @Inject private ClusterDao _clusterDao;
+ @Inject private VolumeDao _volumeDao;
+ @Inject private IPAddressDao _publicIPAddressDao;
+ @Inject private DataCenterIpAddressDao _privateIPAddressDao;
@Inject private StoragePoolDao _storagePoolDao;
@Inject private ConfigurationDao _configDao;
- @Inject private ResourceManager _resourceMgr;
-
- private Timer _timer = null;
- private float _cpuOverProvisioningFactor = 1;
- private long _capacityCheckPeriod = 60L * 60L * 1000L; // one hour by default
- private double _memoryCapacityThreshold = 0.75;
- private double _cpuCapacityThreshold = 0.75;
- private double _storageCapacityThreshold = 0.75;
- private double _storageAllocCapacityThreshold = 0.75;
- private double _publicIPCapacityThreshold = 0.75;
+ @Inject private ResourceManager _resourceMgr;
+
+ private Timer _timer = null;
+ private float _cpuOverProvisioningFactor = 1;
+ private long _capacityCheckPeriod = 60L * 60L * 1000L; // one hour by default
+ private double _memoryCapacityThreshold = 0.75;
+ private double _cpuCapacityThreshold = 0.75;
+ private double _storageCapacityThreshold = 0.75;
+ private double _storageAllocCapacityThreshold = 0.75;
+ private double _publicIPCapacityThreshold = 0.75;
private double _privateIPCapacityThreshold = 0.75;
private double _secondaryStorageCapacityThreshold = 0.75;
private double _vlanCapacityThreshold = 0.75;
private double _directNetworkPublicIpCapacityThreshold = 0.75;
private double _localStorageCapacityThreshold = 0.75;
- Map _capacityTypeThresholdMap = new HashMap();
-
- @Override
- public boolean configure(String name, Map params) throws ConfigurationException {
- _name = name;
-
- ComponentLocator locator = ComponentLocator.getCurrentLocator();
- ConfigurationDao configDao = locator.getDao(ConfigurationDao.class);
- if (configDao == null) {
- s_logger.error("Unable to get the configuration dao.");
- return false;
- }
-
- Map configs = configDao.getConfiguration("management-server", params);
-
- // set up the email system for alerts
- String emailAddressList = configs.get("alert.email.addresses");
- String[] emailAddresses = null;
- if (emailAddressList != null) {
- emailAddresses = emailAddressList.split(",");
- }
-
- String smtpHost = configs.get("alert.smtp.host");
- int smtpPort = NumbersUtil.parseInt(configs.get("alert.smtp.port"), 25);
- String useAuthStr = configs.get("alert.smtp.useAuth");
- boolean useAuth = ((useAuthStr == null) ? false : Boolean.parseBoolean(useAuthStr));
- String smtpUsername = configs.get("alert.smtp.username");
- String smtpPassword = configs.get("alert.smtp.password");
- String emailSender = configs.get("alert.email.sender");
- String smtpDebugStr = configs.get("alert.smtp.debug");
- boolean smtpDebug = false;
- if (smtpDebugStr != null) {
- smtpDebug = Boolean.parseBoolean(smtpDebugStr);
- }
-
- _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
+ Map _capacityTypeThresholdMap = new HashMap();
+
+ @Override
+ public boolean configure(String name, Map params) throws ConfigurationException {
+ _name = name;
+
+ ComponentLocator locator = ComponentLocator.getCurrentLocator();
+ ConfigurationDao configDao = locator.getDao(ConfigurationDao.class);
+ if (configDao == null) {
+ s_logger.error("Unable to get the configuration dao.");
+ return false;
+ }
+
+ Map configs = configDao.getConfiguration("management-server", params);
+
+ // set up the email system for alerts
+ String emailAddressList = configs.get("alert.email.addresses");
+ String[] emailAddresses = null;
+ if (emailAddressList != null) {
+ emailAddresses = emailAddressList.split(",");
+ }
+
+ String smtpHost = configs.get("alert.smtp.host");
+ int smtpPort = NumbersUtil.parseInt(configs.get("alert.smtp.port"), 25);
+ String useAuthStr = configs.get("alert.smtp.useAuth");
+ boolean useAuth = ((useAuthStr == null) ? false : Boolean.parseBoolean(useAuthStr));
+ String smtpUsername = configs.get("alert.smtp.username");
+ String smtpPassword = configs.get("alert.smtp.password");
+ String emailSender = configs.get("alert.email.sender");
+ String smtpDebugStr = configs.get("alert.smtp.debug");
+ boolean smtpDebug = false;
+ if (smtpDebugStr != null) {
+ smtpDebug = Boolean.parseBoolean(smtpDebugStr);
+ }
+
+ _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
- String storageCapacityThreshold = _configDao.getValue(Config.StorageCapacityThreshold.key());
- String cpuCapacityThreshold = _configDao.getValue(Config.CPUCapacityThreshold.key());
- String memoryCapacityThreshold = _configDao.getValue(Config.MemoryCapacityThreshold.key());
- String storageAllocCapacityThreshold = _configDao.getValue(Config.StorageAllocatedCapacityThreshold.key());
- String publicIPCapacityThreshold = _configDao.getValue(Config.PublicIpCapacityThreshold.key());
+ String storageCapacityThreshold = _configDao.getValue(Config.StorageCapacityThreshold.key());
+ String cpuCapacityThreshold = _configDao.getValue(Config.CPUCapacityThreshold.key());
+ String memoryCapacityThreshold = _configDao.getValue(Config.MemoryCapacityThreshold.key());
+ String storageAllocCapacityThreshold = _configDao.getValue(Config.StorageAllocatedCapacityThreshold.key());
+ String publicIPCapacityThreshold = _configDao.getValue(Config.PublicIpCapacityThreshold.key());
String privateIPCapacityThreshold = _configDao.getValue(Config.PrivateIpCapacityThreshold.key());
String secondaryStorageCapacityThreshold = _configDao.getValue(Config.SecondaryStorageCapacityThreshold.key());
String vlanCapacityThreshold = _configDao.getValue(Config.VlanCapacityThreshold.key());
String directNetworkPublicIpCapacityThreshold = _configDao.getValue(Config.DirectNetworkPublicIpCapacityThreshold.key());
- String localStorageCapacityThreshold = _configDao.getValue(Config.LocalStorageCapacityThreshold.key());
-
- if (storageCapacityThreshold != null) {
- _storageCapacityThreshold = Double.parseDouble(storageCapacityThreshold);
- }
- if (storageAllocCapacityThreshold != null) {
- _storageAllocCapacityThreshold = Double.parseDouble(storageAllocCapacityThreshold);
- }
- if (cpuCapacityThreshold != null) {
- _cpuCapacityThreshold = Double.parseDouble(cpuCapacityThreshold);
- }
- if (memoryCapacityThreshold != null) {
- _memoryCapacityThreshold = Double.parseDouble(memoryCapacityThreshold);
- }
- if (publicIPCapacityThreshold != null) {
- _publicIPCapacityThreshold = Double.parseDouble(publicIPCapacityThreshold);
- }
- if (privateIPCapacityThreshold != null) {
- _privateIPCapacityThreshold = Double.parseDouble(privateIPCapacityThreshold);
+ String localStorageCapacityThreshold = _configDao.getValue(Config.LocalStorageCapacityThreshold.key());
+
+ if (storageCapacityThreshold != null) {
+ _storageCapacityThreshold = Double.parseDouble(storageCapacityThreshold);
+ }
+ if (storageAllocCapacityThreshold != null) {
+ _storageAllocCapacityThreshold = Double.parseDouble(storageAllocCapacityThreshold);
+ }
+ if (cpuCapacityThreshold != null) {
+ _cpuCapacityThreshold = Double.parseDouble(cpuCapacityThreshold);
+ }
+ if (memoryCapacityThreshold != null) {
+ _memoryCapacityThreshold = Double.parseDouble(memoryCapacityThreshold);
+ }
+ if (publicIPCapacityThreshold != null) {
+ _publicIPCapacityThreshold = Double.parseDouble(publicIPCapacityThreshold);
+ }
+ if (privateIPCapacityThreshold != null) {
+ _privateIPCapacityThreshold = Double.parseDouble(privateIPCapacityThreshold);
}
if (secondaryStorageCapacityThreshold != null) {
_secondaryStorageCapacityThreshold = Double.parseDouble(secondaryStorageCapacityThreshold);
@@ -192,7 +192,7 @@ public class AlertManagerImpl implements AlertManager {
}
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_STORAGE, _storageCapacityThreshold);
- _capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED, _storageAllocCapacityThreshold);
+ _capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED, _storageAllocCapacityThreshold);
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_CPU, _cpuCapacityThreshold);
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_MEMORY, _memoryCapacityThreshold);
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP, _publicIPCapacityThreshold);
@@ -202,75 +202,75 @@ public class AlertManagerImpl implements AlertManager {
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP, _directNetworkPublicIpCapacityThreshold);
_capacityTypeThresholdMap.put(Capacity.CAPACITY_TYPE_LOCAL_STORAGE, _localStorageCapacityThreshold);
-
- String capacityCheckPeriodStr = configs.get("capacity.check.period");
- if (capacityCheckPeriodStr != null) {
+
+ String capacityCheckPeriodStr = configs.get("capacity.check.period");
+ if (capacityCheckPeriodStr != null) {
_capacityCheckPeriod = Long.parseLong(capacityCheckPeriodStr);
if(_capacityCheckPeriod <= 0)
_capacityCheckPeriod = Long.parseLong(Config.CapacityCheckPeriod.getDefaultValue());
- }
-
- String cpuOverProvisioningFactorStr = configs.get("cpu.overprovisioning.factor");
- if (cpuOverProvisioningFactorStr != null) {
- _cpuOverProvisioningFactor = NumbersUtil.parseFloat(cpuOverProvisioningFactorStr,1);
- if(_cpuOverProvisioningFactor < 1){
- _cpuOverProvisioningFactor = 1;
- }
}
-
- _timer = new Timer("CapacityChecker");
-
- return true;
- }
-
- @Override
- public String getName() {
- return _name;
- }
-
- @Override
- public boolean start() {
- _timer.schedule(new CapacityChecker(), INITIAL_CAPACITY_CHECK_DELAY, _capacityCheckPeriod);
- return true;
- }
-
- @Override
- public boolean stop() {
- _timer.cancel();
- return true;
- }
-
- @Override
- public void clearAlert(short alertType, long dataCenterId, long podId) {
- try {
- if (_emailAlert != null) {
- _emailAlert.clearAlert(alertType, dataCenterId, podId);
- }
- } catch (Exception ex) {
- s_logger.error("Problem clearing email alert", ex);
- }
- }
-
- @Override
- public void sendAlert(short alertType, long dataCenterId, Long podId, String subject, String body) {
- // TODO: queue up these messages and send them as one set of issues once a certain number of issues is reached? If that's the case,
- // shouldn't we have a type/severity as part of the API so that severe errors get sent right away?
- try {
- if (_emailAlert != null) {
- _emailAlert.sendAlert(alertType, dataCenterId, podId, null, subject, body);
- }
- } catch (Exception ex) {
- s_logger.error("Problem sending email alert", ex);
- }
- }
-
- @Override @DB
- public void recalculateCapacity() {
- // FIXME: the right way to do this is to register a listener (see RouterStatsListener, VMSyncListener)
- // for the vm sync state. The listener model has connects/disconnects to keep things in sync much better
- // than this model right now, so when a VM is started, we update the amount allocated, and when a VM
- // is stopped we updated the amount allocated, and when VM sync reports a changed state, we update
- // the amount allocated. Hopefully it's limited to 3 entry points and will keep the amount allocated
+
+ String cpuOverProvisioningFactorStr = configs.get("cpu.overprovisioning.factor");
+ if (cpuOverProvisioningFactorStr != null) {
+ _cpuOverProvisioningFactor = NumbersUtil.parseFloat(cpuOverProvisioningFactorStr,1);
+ if(_cpuOverProvisioningFactor < 1){
+ _cpuOverProvisioningFactor = 1;
+ }
+ }
+
+ _timer = new Timer("CapacityChecker");
+
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public boolean start() {
+ _timer.schedule(new CapacityChecker(), INITIAL_CAPACITY_CHECK_DELAY, _capacityCheckPeriod);
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ _timer.cancel();
+ return true;
+ }
+
+ @Override
+ public void clearAlert(short alertType, long dataCenterId, long podId) {
+ try {
+ if (_emailAlert != null) {
+ _emailAlert.clearAlert(alertType, dataCenterId, podId);
+ }
+ } catch (Exception ex) {
+ s_logger.error("Problem clearing email alert", ex);
+ }
+ }
+
+ @Override
+ public void sendAlert(short alertType, long dataCenterId, Long podId, String subject, String body) {
+ // TODO: queue up these messages and send them as one set of issues once a certain number of issues is reached? If that's the case,
+ // shouldn't we have a type/severity as part of the API so that severe errors get sent right away?
+ try {
+ if (_emailAlert != null) {
+ _emailAlert.sendAlert(alertType, dataCenterId, podId, null, subject, body);
+ }
+ } catch (Exception ex) {
+ s_logger.error("Problem sending email alert", ex);
+ }
+ }
+
+ @Override @DB
+ public void recalculateCapacity() {
+ // FIXME: the right way to do this is to register a listener (see RouterStatsListener, VMSyncListener)
+ // for the vm sync state. The listener model has connects/disconnects to keep things in sync much better
+ // than this model right now, so when a VM is started, we update the amount allocated, and when a VM
+ // is stopped we updated the amount allocated, and when VM sync reports a changed state, we update
+ // the amount allocated. Hopefully it's limited to 3 entry points and will keep the amount allocated
// per host accurate.
try {
@@ -279,8 +279,8 @@ public class AlertManagerImpl implements AlertManager {
s_logger.debug("recalculating system capacity");
s_logger.debug("Executing cpu/ram capacity update");
}
-
- // Calculate CPU and RAM capacities
+
+ // Calculate CPU and RAM capacities
// get all hosts...even if they are not in 'UP' state
List hosts = _resourceMgr.listAllNotInMaintenanceHostsInOneZone(Host.Type.Routing, null);
for (HostVO host : hosts) {
@@ -291,9 +291,9 @@ public class AlertManagerImpl implements AlertManager {
s_logger.debug("Done executing cpu/ram capacity update");
s_logger.debug("Executing storage capacity update");
}
- // Calculate storage pool capacity
- List storagePools = _storagePoolDao.listAll();
- for (StoragePoolVO pool : storagePools) {
+ // Calculate storage pool capacity
+ List storagePools = _storagePoolDao.listAll();
+ for (StoragePoolVO pool : storagePools) {
long disk = _capacityMgr.getAllocatedPoolCapacity(pool, null);
if (pool.isShared()){
_storageMgr.createCapacityEntry(pool, Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED, disk);
@@ -305,18 +305,18 @@ public class AlertManagerImpl implements AlertManager {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Done executing storage capacity update");
s_logger.debug("Executing capacity updates for public ip and Vlans");
- }
-
- List datacenters = _dcDao.listAll();
- for (DataCenterVO datacenter : datacenters) {
- long dcId = datacenter.getId();
+ }
+
+ List datacenters = _dcDao.listAll();
+ for (DataCenterVO datacenter : datacenters) {
+ long dcId = datacenter.getId();
//NOTE
//What happens if we have multiple vlans? Dashboard currently shows stats
//with no filter based on a vlan
//ideal way would be to remove out the vlan param, and filter only on dcId
//implementing the same
-
+
// Calculate new Public IP capacity for Virtual Network
if (datacenter.getNetworkType() == NetworkType.Advanced){
createOrUpdateIpCapacity(dcId, null, CapacityVO.CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP);
@@ -328,7 +328,7 @@ public class AlertManagerImpl implements AlertManager {
if (datacenter.getNetworkType() == NetworkType.Advanced){
//Calculate VLAN's capacity
createOrUpdateVlanCapacity(dcId);
- }
+ }
}
if (s_logger.isDebugEnabled()) {
@@ -336,23 +336,23 @@ public class AlertManagerImpl implements AlertManager {
s_logger.debug("Executing capacity updates for private ip");
}
- // Calculate new Private IP capacity
- List pods = _podDao.listAll();
- for (HostPodVO pod : pods) {
- long podId = pod.getId();
- long dcId = pod.getDataCenterId();
+ // Calculate new Private IP capacity
+ List pods = _podDao.listAll();
+ for (HostPodVO pod : pods) {
+ long podId = pod.getId();
+ long dcId = pod.getDataCenterId();
- createOrUpdateIpCapacity(dcId, podId, CapacityVO.CAPACITY_TYPE_PRIVATE_IP);
+ createOrUpdateIpCapacity(dcId, podId, CapacityVO.CAPACITY_TYPE_PRIVATE_IP);
}
if (s_logger.isDebugEnabled()) {
s_logger.debug("Done executing capacity updates for private ip");
s_logger.debug("Done recalculating system capacity");
- }
+ }
} catch (Throwable t) {
s_logger.error("Caught exception in recalculating capacity", t);
- }
+ }
}
private void createOrUpdateVlanCapacity(long dcId) {
@@ -416,19 +416,19 @@ public class AlertManagerImpl implements AlertManager {
_capacityDao.update(capacity.getId(), capacity);
}
- }
-
- class CapacityChecker extends TimerTask {
- @Override
- public void run() {
+ }
+
+ class CapacityChecker extends TimerTask {
+ @Override
+ public void run() {
try {
s_logger.debug("Running Capacity Checker ... ");
checkForAlerts();
- s_logger.debug("Done running Capacity Checker ... ");
- } catch (Throwable t) {
- s_logger.error("Exception in CapacityChecker", t);
- }
- }
+ s_logger.debug("Done running Capacity Checker ... ");
+ } catch (Throwable t) {
+ s_logger.error("Exception in CapacityChecker", t);
+ }
+ }
}
@@ -659,142 +659,142 @@ public class AlertManagerImpl implements AlertManager {
clusterCapacityTypes.add(Capacity.CAPACITY_TYPE_LOCAL_STORAGE);
return clusterCapacityTypes;
- }
-
- class EmailAlert {
- private Session _smtpSession;
- private InternetAddress[] _recipientList;
- private final String _smtpHost;
- private int _smtpPort = -1;
- private boolean _smtpUseAuth = false;
- private final String _smtpUsername;
- private final String _smtpPassword;
- private final String _emailSender;
-
- public EmailAlert(String[] recipientList, String smtpHost, int smtpPort, boolean smtpUseAuth, final String smtpUsername, final String smtpPassword, String emailSender, boolean smtpDebug) {
- if (recipientList != null) {
- _recipientList = new InternetAddress[recipientList.length];
- for (int i = 0; i < recipientList.length; i++) {
- try {
- _recipientList[i] = new InternetAddress(recipientList[i], recipientList[i]);
- } catch (Exception ex) {
- s_logger.error("Exception creating address for: " + recipientList[i], ex);
- }
- }
- }
-
- _smtpHost = smtpHost;
- _smtpPort = smtpPort;
- _smtpUseAuth = smtpUseAuth;
- _smtpUsername = smtpUsername;
- _smtpPassword = smtpPassword;
- _emailSender = emailSender;
-
- if (_smtpHost != null) {
- Properties smtpProps = new Properties();
- smtpProps.put("mail.smtp.host", smtpHost);
- smtpProps.put("mail.smtp.port", smtpPort);
- smtpProps.put("mail.smtp.auth", ""+smtpUseAuth);
- if (smtpUsername != null) {
- smtpProps.put("mail.smtp.user", smtpUsername);
- }
-
- smtpProps.put("mail.smtps.host", smtpHost);
- smtpProps.put("mail.smtps.port", smtpPort);
- smtpProps.put("mail.smtps.auth", ""+smtpUseAuth);
- if (smtpUsername != null) {
- smtpProps.put("mail.smtps.user", smtpUsername);
- }
-
- if ((smtpUsername != null) && (smtpPassword != null)) {
- _smtpSession = Session.getInstance(smtpProps, new Authenticator() {
- @Override
- protected PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(smtpUsername, smtpPassword);
- }
- });
- } else {
- _smtpSession = Session.getInstance(smtpProps);
- }
- _smtpSession.setDebug(smtpDebug);
- } else {
- _smtpSession = null;
- }
- }
-
- // TODO: make sure this handles SSL transport (useAuth is true) and regular
- public void sendAlert(short alertType, long dataCenterId, Long podId, Long clusterId, String subject, String content) throws MessagingException, UnsupportedEncodingException {
- AlertVO alert = null;
- if ((alertType != AlertManager.ALERT_TYPE_HOST) &&
- (alertType != AlertManager.ALERT_TYPE_USERVM) &&
- (alertType != AlertManager.ALERT_TYPE_DOMAIN_ROUTER) &&
+ }
+
+ class EmailAlert {
+ private Session _smtpSession;
+ private InternetAddress[] _recipientList;
+ private final String _smtpHost;
+ private int _smtpPort = -1;
+ private boolean _smtpUseAuth = false;
+ private final String _smtpUsername;
+ private final String _smtpPassword;
+ private final String _emailSender;
+
+ public EmailAlert(String[] recipientList, String smtpHost, int smtpPort, boolean smtpUseAuth, final String smtpUsername, final String smtpPassword, String emailSender, boolean smtpDebug) {
+ if (recipientList != null) {
+ _recipientList = new InternetAddress[recipientList.length];
+ for (int i = 0; i < recipientList.length; i++) {
+ try {
+ _recipientList[i] = new InternetAddress(recipientList[i], recipientList[i]);
+ } catch (Exception ex) {
+ s_logger.error("Exception creating address for: " + recipientList[i], ex);
+ }
+ }
+ }
+
+ _smtpHost = smtpHost;
+ _smtpPort = smtpPort;
+ _smtpUseAuth = smtpUseAuth;
+ _smtpUsername = smtpUsername;
+ _smtpPassword = smtpPassword;
+ _emailSender = emailSender;
+
+ if (_smtpHost != null) {
+ Properties smtpProps = new Properties();
+ smtpProps.put("mail.smtp.host", smtpHost);
+ smtpProps.put("mail.smtp.port", smtpPort);
+ smtpProps.put("mail.smtp.auth", ""+smtpUseAuth);
+ if (smtpUsername != null) {
+ smtpProps.put("mail.smtp.user", smtpUsername);
+ }
+
+ smtpProps.put("mail.smtps.host", smtpHost);
+ smtpProps.put("mail.smtps.port", smtpPort);
+ smtpProps.put("mail.smtps.auth", ""+smtpUseAuth);
+ if (smtpUsername != null) {
+ smtpProps.put("mail.smtps.user", smtpUsername);
+ }
+
+ if ((smtpUsername != null) && (smtpPassword != null)) {
+ _smtpSession = Session.getInstance(smtpProps, new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(smtpUsername, smtpPassword);
+ }
+ });
+ } else {
+ _smtpSession = Session.getInstance(smtpProps);
+ }
+ _smtpSession.setDebug(smtpDebug);
+ } else {
+ _smtpSession = null;
+ }
+ }
+
+ // TODO: make sure this handles SSL transport (useAuth is true) and regular
+ public void sendAlert(short alertType, long dataCenterId, Long podId, Long clusterId, String subject, String content) throws MessagingException, UnsupportedEncodingException {
+ AlertVO alert = null;
+ if ((alertType != AlertManager.ALERT_TYPE_HOST) &&
+ (alertType != AlertManager.ALERT_TYPE_USERVM) &&
+ (alertType != AlertManager.ALERT_TYPE_DOMAIN_ROUTER) &&
(alertType != AlertManager.ALERT_TYPE_CONSOLE_PROXY) &&
- (alertType != AlertManager.ALERT_TYPE_SSVM) &&
- (alertType != AlertManager.ALERT_TYPE_STORAGE_MISC) &&
- (alertType != AlertManager.ALERT_TYPE_MANAGMENT_NODE)) {
- alert = _alertDao.getLastAlert(alertType, dataCenterId, podId, clusterId);
- }
-
- if (alert == null) {
- // set up a new alert
- AlertVO newAlert = new AlertVO();
- newAlert.setType(alertType);
+ (alertType != AlertManager.ALERT_TYPE_SSVM) &&
+ (alertType != AlertManager.ALERT_TYPE_STORAGE_MISC) &&
+ (alertType != AlertManager.ALERT_TYPE_MANAGMENT_NODE)) {
+ alert = _alertDao.getLastAlert(alertType, dataCenterId, podId, clusterId);
+ }
+
+ if (alert == null) {
+ // set up a new alert
+ AlertVO newAlert = new AlertVO();
+ newAlert.setType(alertType);
newAlert.setSubject(subject);
- newAlert.setClusterId(clusterId);
- newAlert.setPodId(podId);
- newAlert.setDataCenterId(dataCenterId);
- newAlert.setSentCount(1); // initialize sent count to 1 since we are now sending an alert
- newAlert.setLastSent(new Date());
- _alertDao.persist(newAlert);
- } else {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Have already sent: " + alert.getSentCount() + " emails for alert type '" + alertType + "' -- skipping send email");
- }
- return;
- }
-
- if (_smtpSession != null) {
- SMTPMessage msg = new SMTPMessage(_smtpSession);
- msg.setSender(new InternetAddress(_emailSender, _emailSender));
- msg.setFrom(new InternetAddress(_emailSender, _emailSender));
- for (InternetAddress address : _recipientList) {
- msg.addRecipient(RecipientType.TO, address);
- }
- msg.setSubject(subject);
- msg.setSentDate(new Date());
- msg.setContent(content, "text/plain");
- msg.saveChanges();
-
- SMTPTransport smtpTrans = null;
- if (_smtpUseAuth) {
- smtpTrans = new SMTPSSLTransport(_smtpSession, new URLName("smtp", _smtpHost, _smtpPort, null, _smtpUsername, _smtpPassword));
- } else {
- smtpTrans = new SMTPTransport(_smtpSession, new URLName("smtp", _smtpHost, _smtpPort, null, _smtpUsername, _smtpPassword));
- }
- smtpTrans.connect();
- smtpTrans.sendMessage(msg, msg.getAllRecipients());
- smtpTrans.close();
- }
- }
-
- public void clearAlert(short alertType, long dataCenterId, Long podId) {
- if (alertType != -1) {
- AlertVO alert = _alertDao.getLastAlert(alertType, dataCenterId, podId, null);
- if (alert != null) {
- AlertVO updatedAlert = _alertDao.createForUpdate();
- updatedAlert.setResolved(new Date());
- _alertDao.update(alert.getId(), updatedAlert);
- }
- }
- }
- }
-
- private static String formatPercent(double percentage) {
- return _dfPct.format(percentage*100);
- }
-
- private static String formatBytesToMegabytes(double bytes) {
- double megaBytes = (bytes / (1024 * 1024));
- return _dfWhole.format(megaBytes);
- }
-}
+ newAlert.setClusterId(clusterId);
+ newAlert.setPodId(podId);
+ newAlert.setDataCenterId(dataCenterId);
+ newAlert.setSentCount(1); // initialize sent count to 1 since we are now sending an alert
+ newAlert.setLastSent(new Date());
+ _alertDao.persist(newAlert);
+ } else {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Have already sent: " + alert.getSentCount() + " emails for alert type '" + alertType + "' -- skipping send email");
+ }
+ return;
+ }
+
+ if (_smtpSession != null) {
+ SMTPMessage msg = new SMTPMessage(_smtpSession);
+ msg.setSender(new InternetAddress(_emailSender, _emailSender));
+ msg.setFrom(new InternetAddress(_emailSender, _emailSender));
+ for (InternetAddress address : _recipientList) {
+ msg.addRecipient(RecipientType.TO, address);
+ }
+ msg.setSubject(subject);
+ msg.setSentDate(new Date());
+ msg.setContent(content, "text/plain");
+ msg.saveChanges();
+
+ SMTPTransport smtpTrans = null;
+ if (_smtpUseAuth) {
+ smtpTrans = new SMTPSSLTransport(_smtpSession, new URLName("smtp", _smtpHost, _smtpPort, null, _smtpUsername, _smtpPassword));
+ } else {
+ smtpTrans = new SMTPTransport(_smtpSession, new URLName("smtp", _smtpHost, _smtpPort, null, _smtpUsername, _smtpPassword));
+ }
+ smtpTrans.connect();
+ smtpTrans.sendMessage(msg, msg.getAllRecipients());
+ smtpTrans.close();
+ }
+ }
+
+ public void clearAlert(short alertType, long dataCenterId, Long podId) {
+ if (alertType != -1) {
+ AlertVO alert = _alertDao.getLastAlert(alertType, dataCenterId, podId, null);
+ if (alert != null) {
+ AlertVO updatedAlert = _alertDao.createForUpdate();
+ updatedAlert.setResolved(new Date());
+ _alertDao.update(alert.getId(), updatedAlert);
+ }
+ }
+ }
+ }
+
+ private static String formatPercent(double percentage) {
+ return _dfPct.format(percentage*100);
+ }
+
+ private static String formatBytesToMegabytes(double bytes) {
+ double megaBytes = (bytes / (1024 * 1024));
+ return _dfWhole.format(megaBytes);
+ }
+}
diff --git a/server/src/com/cloud/alert/ConsoleProxyAlertAdapter.java b/server/src/com/cloud/alert/ConsoleProxyAlertAdapter.java
index e93a1f5f8b8..49dfbbc609e 100644
--- a/server/src/com/cloud/alert/ConsoleProxyAlertAdapter.java
+++ b/server/src/com/cloud/alert/ConsoleProxyAlertAdapter.java
@@ -10,217 +10,217 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.alert;
-
-import java.util.Map;
-
-import javax.ejb.Local;
-import javax.naming.ConfigurationException;
-
-import org.apache.log4j.Logger;
-
-import com.cloud.alert.AlertAdapter;
-import com.cloud.alert.AlertManager;
-import com.cloud.consoleproxy.ConsoleProxyAlertEventArgs;
-import com.cloud.consoleproxy.ConsoleProxyManager;
-import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.utils.component.ComponentLocator;
-import com.cloud.utils.events.SubscriptionMgr;
-import com.cloud.vm.ConsoleProxyVO;
-import com.cloud.vm.dao.ConsoleProxyDao;
-
-@Local(value=AlertAdapter.class)
-public class ConsoleProxyAlertAdapter implements AlertAdapter {
-
- private static final Logger s_logger = Logger.getLogger(ConsoleProxyAlertAdapter.class);
-
- private AlertManager _alertMgr;
- private String _name;
-
- private DataCenterDao _dcDao;
- private ConsoleProxyDao _consoleProxyDao;
-
- public void onProxyAlert(Object sender, ConsoleProxyAlertEventArgs args) {
- if(s_logger.isDebugEnabled())
- s_logger.debug("received console proxy alert");
-
- DataCenterVO dc = _dcDao.findById(args.getZoneId());
- ConsoleProxyVO proxy = args.getProxy();
- if(proxy == null)
- proxy = _consoleProxyDao.findById(args.getProxyId());
-
- switch(args.getType()) {
- case ConsoleProxyAlertEventArgs.PROXY_CREATED :
- if(s_logger.isDebugEnabled())
- s_logger.debug("New console proxy created, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- proxy.getPrivateIpAddress());
- break;
-
- case ConsoleProxyAlertEventArgs.PROXY_UP :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Console proxy is up, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- proxy.getPrivateIpAddress());
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_CONSOLE_PROXY,
- args.getZoneId(),
- proxy.getPodIdToDeployIn(),
- "Console proxy up in zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
- + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
- "Console proxy up (zone " + dc.getName() + ")"
- );
- break;
-
- case ConsoleProxyAlertEventArgs.PROXY_DOWN :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Console proxy is down, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_CONSOLE_PROXY,
- args.getZoneId(),
- proxy.getPodIdToDeployIn(),
- "Console proxy down in zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
- + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
- "Console proxy down (zone " + dc.getName() + ")"
- );
- break;
-
- case ConsoleProxyAlertEventArgs.PROXY_REBOOTED :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Console proxy is rebooted, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_CONSOLE_PROXY,
- args.getZoneId(),
- proxy.getPodIdToDeployIn(),
- "Console proxy rebooted in zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
- + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
- "Console proxy rebooted (zone " + dc.getName() + ")"
- );
- break;
-
- case ConsoleProxyAlertEventArgs.PROXY_CREATE_FAILURE :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Console proxy creation failure, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_CONSOLE_PROXY,
- args.getZoneId(),
- proxy.getPodIdToDeployIn(),
- "Console proxy creation failure. zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
- + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress())
- + ", error details: " + args.getMessage(),
- "Console proxy creation failure (zone " + dc.getName() + ")"
- );
- break;
-
- case ConsoleProxyAlertEventArgs.PROXY_START_FAILURE :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Console proxy startup failure, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_CONSOLE_PROXY,
- args.getZoneId(),
- proxy.getPodIdToDeployIn(),
- "Console proxy startup failure. zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
- + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress())
- + ", error details: " + args.getMessage(),
- "Console proxy startup failure (zone " + dc.getName() + ")"
- );
- break;
-
- case ConsoleProxyAlertEventArgs.PROXY_FIREWALL_ALERT :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Console proxy firewall alert, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_CONSOLE_PROXY,
- args.getZoneId(),
- proxy.getPodIdToDeployIn(),
- "Failed to open console proxy firewall port. zone: " + dc.getName() + ", proxy: " + proxy.getHostName()
- + ", public IP: " + proxy.getPublicIpAddress()
- + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
- "Console proxy alert (zone " + dc.getName() + ")"
- );
- break;
-
- case ConsoleProxyAlertEventArgs.PROXY_STORAGE_ALERT :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Console proxy storage alert, zone: " + dc.getName() + ", proxy: " +
- proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
- proxy.getPrivateIpAddress() + ", message: " + args.getMessage());
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_STORAGE_MISC,
- args.getZoneId(),
- proxy.getPodIdToDeployIn(),
- "Console proxy storage issue. zone: " + dc.getName() + ", message: " + args.getMessage(),
- "Console proxy alert (zone " + dc.getName() + ")"
- );
- break;
- }
- }
-
- @Override
- public boolean configure(String name, Map params)
- throws ConfigurationException {
-
- if (s_logger.isInfoEnabled())
- s_logger.info("Start configuring console proxy alert manager : " + name);
-
- ComponentLocator locator = ComponentLocator.getCurrentLocator();
-
- _dcDao = locator.getDao(DataCenterDao.class);
- if (_dcDao == null) {
- throw new ConfigurationException("Unable to get " + DataCenterDao.class.getName());
- }
-
- _consoleProxyDao = locator.getDao(ConsoleProxyDao.class);
- if (_consoleProxyDao == null) {
- throw new ConfigurationException("Unable to get " + ConsoleProxyDao.class.getName());
- }
-
- _alertMgr = locator.getManager(AlertManager.class);
- if (_alertMgr == null) {
- throw new ConfigurationException("Unable to get " + AlertManager.class.getName());
- }
-
- try {
- SubscriptionMgr.getInstance().subscribe(ConsoleProxyManager.ALERT_SUBJECT, this, "onProxyAlert");
- } catch (SecurityException e) {
- throw new ConfigurationException("Unable to register console proxy event subscription, exception: " + e);
- } catch (NoSuchMethodException e) {
- throw new ConfigurationException("Unable to register console proxy event subscription, exception: " + e);
- }
-
- return true;
- }
-
- @Override
- public String getName() {
- return _name;
- }
-
- @Override
- public boolean start() {
- return true;
- }
-
- @Override
- public boolean stop() {
- return true;
- }
-}
+package com.cloud.alert;
+
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.alert.AlertAdapter;
+import com.cloud.alert.AlertManager;
+import com.cloud.consoleproxy.ConsoleProxyAlertEventArgs;
+import com.cloud.consoleproxy.ConsoleProxyManager;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.utils.component.ComponentLocator;
+import com.cloud.utils.events.SubscriptionMgr;
+import com.cloud.vm.ConsoleProxyVO;
+import com.cloud.vm.dao.ConsoleProxyDao;
+
+@Local(value=AlertAdapter.class)
+public class ConsoleProxyAlertAdapter implements AlertAdapter {
+
+ private static final Logger s_logger = Logger.getLogger(ConsoleProxyAlertAdapter.class);
+
+ private AlertManager _alertMgr;
+ private String _name;
+
+ private DataCenterDao _dcDao;
+ private ConsoleProxyDao _consoleProxyDao;
+
+ public void onProxyAlert(Object sender, ConsoleProxyAlertEventArgs args) {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("received console proxy alert");
+
+ DataCenterVO dc = _dcDao.findById(args.getZoneId());
+ ConsoleProxyVO proxy = args.getProxy();
+ if(proxy == null)
+ proxy = _consoleProxyDao.findById(args.getProxyId());
+
+ switch(args.getType()) {
+ case ConsoleProxyAlertEventArgs.PROXY_CREATED :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("New console proxy created, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ proxy.getPrivateIpAddress());
+ break;
+
+ case ConsoleProxyAlertEventArgs.PROXY_UP :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Console proxy is up, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ proxy.getPrivateIpAddress());
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_CONSOLE_PROXY,
+ args.getZoneId(),
+ proxy.getPodIdToDeployIn(),
+ "Console proxy up in zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
+ + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
+ "Console proxy up (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case ConsoleProxyAlertEventArgs.PROXY_DOWN :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Console proxy is down, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_CONSOLE_PROXY,
+ args.getZoneId(),
+ proxy.getPodIdToDeployIn(),
+ "Console proxy down in zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
+ + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
+ "Console proxy down (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case ConsoleProxyAlertEventArgs.PROXY_REBOOTED :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Console proxy is rebooted, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_CONSOLE_PROXY,
+ args.getZoneId(),
+ proxy.getPodIdToDeployIn(),
+ "Console proxy rebooted in zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
+ + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
+ "Console proxy rebooted (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case ConsoleProxyAlertEventArgs.PROXY_CREATE_FAILURE :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Console proxy creation failure, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_CONSOLE_PROXY,
+ args.getZoneId(),
+ proxy.getPodIdToDeployIn(),
+ "Console proxy creation failure. zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
+ + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress())
+ + ", error details: " + args.getMessage(),
+ "Console proxy creation failure (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case ConsoleProxyAlertEventArgs.PROXY_START_FAILURE :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Console proxy startup failure, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_CONSOLE_PROXY,
+ args.getZoneId(),
+ proxy.getPodIdToDeployIn(),
+ "Console proxy startup failure. zone: " + dc.getName() + ", proxy: " + proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress()
+ + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress())
+ + ", error details: " + args.getMessage(),
+ "Console proxy startup failure (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case ConsoleProxyAlertEventArgs.PROXY_FIREWALL_ALERT :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Console proxy firewall alert, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_CONSOLE_PROXY,
+ args.getZoneId(),
+ proxy.getPodIdToDeployIn(),
+ "Failed to open console proxy firewall port. zone: " + dc.getName() + ", proxy: " + proxy.getHostName()
+ + ", public IP: " + proxy.getPublicIpAddress()
+ + ", private IP: " + (proxy.getPrivateIpAddress() == null ? "N/A" : proxy.getPrivateIpAddress()),
+ "Console proxy alert (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case ConsoleProxyAlertEventArgs.PROXY_STORAGE_ALERT :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Console proxy storage alert, zone: " + dc.getName() + ", proxy: " +
+ proxy.getHostName() + ", public IP: " + proxy.getPublicIpAddress() + ", private IP: " +
+ proxy.getPrivateIpAddress() + ", message: " + args.getMessage());
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_STORAGE_MISC,
+ args.getZoneId(),
+ proxy.getPodIdToDeployIn(),
+ "Console proxy storage issue. zone: " + dc.getName() + ", message: " + args.getMessage(),
+ "Console proxy alert (zone " + dc.getName() + ")"
+ );
+ break;
+ }
+ }
+
+ @Override
+ public boolean configure(String name, Map params)
+ throws ConfigurationException {
+
+ if (s_logger.isInfoEnabled())
+ s_logger.info("Start configuring console proxy alert manager : " + name);
+
+ ComponentLocator locator = ComponentLocator.getCurrentLocator();
+
+ _dcDao = locator.getDao(DataCenterDao.class);
+ if (_dcDao == null) {
+ throw new ConfigurationException("Unable to get " + DataCenterDao.class.getName());
+ }
+
+ _consoleProxyDao = locator.getDao(ConsoleProxyDao.class);
+ if (_consoleProxyDao == null) {
+ throw new ConfigurationException("Unable to get " + ConsoleProxyDao.class.getName());
+ }
+
+ _alertMgr = locator.getManager(AlertManager.class);
+ if (_alertMgr == null) {
+ throw new ConfigurationException("Unable to get " + AlertManager.class.getName());
+ }
+
+ try {
+ SubscriptionMgr.getInstance().subscribe(ConsoleProxyManager.ALERT_SUBJECT, this, "onProxyAlert");
+ } catch (SecurityException e) {
+ throw new ConfigurationException("Unable to register console proxy event subscription, exception: " + e);
+ } catch (NoSuchMethodException e) {
+ throw new ConfigurationException("Unable to register console proxy event subscription, exception: " + e);
+ }
+
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+}
diff --git a/server/src/com/cloud/alert/SecondaryStorageVmAlertAdapter.java b/server/src/com/cloud/alert/SecondaryStorageVmAlertAdapter.java
index 6119bc25cb9..9b1e33da8c8 100644
--- a/server/src/com/cloud/alert/SecondaryStorageVmAlertAdapter.java
+++ b/server/src/com/cloud/alert/SecondaryStorageVmAlertAdapter.java
@@ -10,200 +10,200 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.alert;
-
-import java.util.Map;
-
-import javax.ejb.Local;
-import javax.naming.ConfigurationException;
-
-import org.apache.log4j.Logger;
-
-import com.cloud.alert.AlertAdapter;
-import com.cloud.alert.AlertManager;
-import com.cloud.consoleproxy.ConsoleProxyManager;
-import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.dao.DataCenterDao;
-import com.cloud.storage.secondary.SecStorageVmAlertEventArgs;
-import com.cloud.storage.secondary.SecondaryStorageVmManager;
-import com.cloud.utils.component.Inject;
-import com.cloud.utils.events.SubscriptionMgr;
-import com.cloud.vm.SecondaryStorageVmVO;
-import com.cloud.vm.dao.SecondaryStorageVmDao;
-
-@Local(value=AlertAdapter.class)
-public class SecondaryStorageVmAlertAdapter implements AlertAdapter {
-
- private static final Logger s_logger = Logger.getLogger(SecondaryStorageVmAlertAdapter.class);
- private String _name;
-
- @Inject private AlertManager _alertMgr;
- @Inject private DataCenterDao _dcDao;
- @Inject private SecondaryStorageVmDao _ssvmDao;
-
- public void onSSVMAlert(Object sender, SecStorageVmAlertEventArgs args) {
- if(s_logger.isDebugEnabled())
- s_logger.debug("received secondary storage vm alert");
-
- DataCenterVO dc = _dcDao.findById(args.getZoneId());
- SecondaryStorageVmVO secStorageVm = args.getSecStorageVm();
- if(secStorageVm == null)
- secStorageVm = _ssvmDao.findById(args.getSecStorageVmId());
-
- switch(args.getType()) {
- case SecStorageVmAlertEventArgs.SSVM_CREATED :
- if(s_logger.isDebugEnabled())
- s_logger.debug("New secondary storage vm created, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- secStorageVm.getPrivateIpAddress());
- break;
-
- case SecStorageVmAlertEventArgs.SSVM_UP :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Secondary Storage Vm is up, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- secStorageVm.getPrivateIpAddress());
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_SSVM,
- args.getZoneId(),
- secStorageVm.getPodIdToDeployIn(),
- "Secondary Storage Vm up in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
- + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
- "Secondary Storage Vm up (zone " + dc.getName() + ")"
- );
- break;
-
- case SecStorageVmAlertEventArgs.SSVM_DOWN :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Secondary Storage Vm is down, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_SSVM,
- args.getZoneId(),
- secStorageVm.getPodIdToDeployIn(),
- "Secondary Storage Vm down in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
- + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
- "Secondary Storage Vm down (zone " + dc.getName() + ")"
- );
- break;
-
- case SecStorageVmAlertEventArgs.SSVM_REBOOTED :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Secondary Storage Vm is rebooted, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_SSVM,
- args.getZoneId(),
- secStorageVm.getPodIdToDeployIn(),
- "Secondary Storage Vm rebooted in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
- + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
- "Secondary Storage Vm rebooted (zone " + dc.getName() + ")"
- );
- break;
-
- case SecStorageVmAlertEventArgs.SSVM_CREATE_FAILURE :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Secondary Storage Vm creation failure, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_SSVM,
- args.getZoneId(),
- secStorageVm.getPodIdToDeployIn(),
- "Secondary Storage Vm creation failure. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
- + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress())
- + ", error details: " + args.getMessage(),
- "Secondary Storage Vm creation failure (zone " + dc.getName() + ")"
- );
- break;
-
- case SecStorageVmAlertEventArgs.SSVM_START_FAILURE :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Secondary Storage Vm startup failure, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_SSVM,
- args.getZoneId(),
- secStorageVm.getPodIdToDeployIn(),
- "Secondary Storage Vm startup failure. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
- + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress())
- + ", error details: " + args.getMessage(),
- "Secondary Storage Vm startup failure (zone " + dc.getName() + ")"
- );
- break;
-
- case SecStorageVmAlertEventArgs.SSVM_FIREWALL_ALERT :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Secondary Storage Vm firewall alert, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_SSVM,
- args.getZoneId(),
- secStorageVm.getPodIdToDeployIn(),
- "Failed to open secondary storage vm firewall port. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName()
- + ", public IP: " + secStorageVm.getPublicIpAddress()
- + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
- "Secondary Storage Vm alert (zone " + dc.getName() + ")"
- );
- break;
-
- case SecStorageVmAlertEventArgs.SSVM_STORAGE_ALERT :
- if(s_logger.isDebugEnabled())
- s_logger.debug("Secondary Storage Vm storage alert, zone: " + dc.getName() + ", secStorageVm: " +
- secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
- secStorageVm.getPrivateIpAddress() + ", message: " + args.getMessage());
-
- _alertMgr.sendAlert(
- AlertManager.ALERT_TYPE_STORAGE_MISC,
- args.getZoneId(),
- secStorageVm.getPodIdToDeployIn(),
- "Secondary Storage Vm storage issue. zone: " + dc.getName() + ", message: " + args.getMessage(),
- "Secondary Storage Vm alert (zone " + dc.getName() + ")"
- );
- break;
- }
- }
-
- @Override
- public boolean configure(String name, Map params)
- throws ConfigurationException {
-
- if (s_logger.isInfoEnabled())
- s_logger.info("Start configuring secondary storage vm alert manager : " + name);
-
- try {
- SubscriptionMgr.getInstance().subscribe(SecondaryStorageVmManager.ALERT_SUBJECT, this, "onSSVMAlert");
- } catch (SecurityException e) {
- throw new ConfigurationException("Unable to register secondary storage vm event subscription, exception: " + e);
- } catch (NoSuchMethodException e) {
- throw new ConfigurationException("Unable to register secondary storage vm event subscription, exception: " + e);
- }
-
- return true;
- }
-
- @Override
- public String getName() {
- return _name;
- }
-
- @Override
- public boolean start() {
- return true;
- }
-
- @Override
- public boolean stop() {
- return true;
- }
-}
+package com.cloud.alert;
+
+import java.util.Map;
+
+import javax.ejb.Local;
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.alert.AlertAdapter;
+import com.cloud.alert.AlertManager;
+import com.cloud.consoleproxy.ConsoleProxyManager;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.dao.DataCenterDao;
+import com.cloud.storage.secondary.SecStorageVmAlertEventArgs;
+import com.cloud.storage.secondary.SecondaryStorageVmManager;
+import com.cloud.utils.component.Inject;
+import com.cloud.utils.events.SubscriptionMgr;
+import com.cloud.vm.SecondaryStorageVmVO;
+import com.cloud.vm.dao.SecondaryStorageVmDao;
+
+@Local(value=AlertAdapter.class)
+public class SecondaryStorageVmAlertAdapter implements AlertAdapter {
+
+ private static final Logger s_logger = Logger.getLogger(SecondaryStorageVmAlertAdapter.class);
+ private String _name;
+
+ @Inject private AlertManager _alertMgr;
+ @Inject private DataCenterDao _dcDao;
+ @Inject private SecondaryStorageVmDao _ssvmDao;
+
+ public void onSSVMAlert(Object sender, SecStorageVmAlertEventArgs args) {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("received secondary storage vm alert");
+
+ DataCenterVO dc = _dcDao.findById(args.getZoneId());
+ SecondaryStorageVmVO secStorageVm = args.getSecStorageVm();
+ if(secStorageVm == null)
+ secStorageVm = _ssvmDao.findById(args.getSecStorageVmId());
+
+ switch(args.getType()) {
+ case SecStorageVmAlertEventArgs.SSVM_CREATED :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("New secondary storage vm created, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ secStorageVm.getPrivateIpAddress());
+ break;
+
+ case SecStorageVmAlertEventArgs.SSVM_UP :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Secondary Storage Vm is up, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ secStorageVm.getPrivateIpAddress());
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_SSVM,
+ args.getZoneId(),
+ secStorageVm.getPodIdToDeployIn(),
+ "Secondary Storage Vm up in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
+ + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
+ "Secondary Storage Vm up (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case SecStorageVmAlertEventArgs.SSVM_DOWN :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Secondary Storage Vm is down, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_SSVM,
+ args.getZoneId(),
+ secStorageVm.getPodIdToDeployIn(),
+ "Secondary Storage Vm down in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
+ + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
+ "Secondary Storage Vm down (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case SecStorageVmAlertEventArgs.SSVM_REBOOTED :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Secondary Storage Vm is rebooted, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_SSVM,
+ args.getZoneId(),
+ secStorageVm.getPodIdToDeployIn(),
+ "Secondary Storage Vm rebooted in zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
+ + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
+ "Secondary Storage Vm rebooted (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case SecStorageVmAlertEventArgs.SSVM_CREATE_FAILURE :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Secondary Storage Vm creation failure, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_SSVM,
+ args.getZoneId(),
+ secStorageVm.getPodIdToDeployIn(),
+ "Secondary Storage Vm creation failure. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
+ + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress())
+ + ", error details: " + args.getMessage(),
+ "Secondary Storage Vm creation failure (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case SecStorageVmAlertEventArgs.SSVM_START_FAILURE :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Secondary Storage Vm startup failure, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_SSVM,
+ args.getZoneId(),
+ secStorageVm.getPodIdToDeployIn(),
+ "Secondary Storage Vm startup failure. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress()
+ + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress())
+ + ", error details: " + args.getMessage(),
+ "Secondary Storage Vm startup failure (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case SecStorageVmAlertEventArgs.SSVM_FIREWALL_ALERT :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Secondary Storage Vm firewall alert, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()));
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_SSVM,
+ args.getZoneId(),
+ secStorageVm.getPodIdToDeployIn(),
+ "Failed to open secondary storage vm firewall port. zone: " + dc.getName() + ", secStorageVm: " + secStorageVm.getHostName()
+ + ", public IP: " + secStorageVm.getPublicIpAddress()
+ + ", private IP: " + (secStorageVm.getPrivateIpAddress() == null ? "N/A" : secStorageVm.getPrivateIpAddress()),
+ "Secondary Storage Vm alert (zone " + dc.getName() + ")"
+ );
+ break;
+
+ case SecStorageVmAlertEventArgs.SSVM_STORAGE_ALERT :
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Secondary Storage Vm storage alert, zone: " + dc.getName() + ", secStorageVm: " +
+ secStorageVm.getHostName() + ", public IP: " + secStorageVm.getPublicIpAddress() + ", private IP: " +
+ secStorageVm.getPrivateIpAddress() + ", message: " + args.getMessage());
+
+ _alertMgr.sendAlert(
+ AlertManager.ALERT_TYPE_STORAGE_MISC,
+ args.getZoneId(),
+ secStorageVm.getPodIdToDeployIn(),
+ "Secondary Storage Vm storage issue. zone: " + dc.getName() + ", message: " + args.getMessage(),
+ "Secondary Storage Vm alert (zone " + dc.getName() + ")"
+ );
+ break;
+ }
+ }
+
+ @Override
+ public boolean configure(String name, Map params)
+ throws ConfigurationException {
+
+ if (s_logger.isInfoEnabled())
+ s_logger.info("Start configuring secondary storage vm alert manager : " + name);
+
+ try {
+ SubscriptionMgr.getInstance().subscribe(SecondaryStorageVmManager.ALERT_SUBJECT, this, "onSSVMAlert");
+ } catch (SecurityException e) {
+ throw new ConfigurationException("Unable to register secondary storage vm event subscription, exception: " + e);
+ } catch (NoSuchMethodException e) {
+ throw new ConfigurationException("Unable to register secondary storage vm event subscription, exception: " + e);
+ }
+
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+}
diff --git a/server/src/com/cloud/alert/dao/AlertDao.java b/server/src/com/cloud/alert/dao/AlertDao.java
index 2280fcf49c0..8fd21090fb1 100755
--- a/server/src/com/cloud/alert/dao/AlertDao.java
+++ b/server/src/com/cloud/alert/dao/AlertDao.java
@@ -10,13 +10,13 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.alert.dao;
-
+package com.cloud.alert.dao;
+
import com.cloud.alert.AlertVO;
import com.cloud.utils.db.GenericDao;
-
-public interface AlertDao extends GenericDao {
+
+public interface AlertDao extends GenericDao {
AlertVO getLastAlert(short type, long dataCenterId, Long podId, Long clusterId);
// This is for backward compatibility
- AlertVO getLastAlert(short type, long dataCenterId, Long podId);
-}
+ AlertVO getLastAlert(short type, long dataCenterId, Long podId);
+}
diff --git a/server/src/com/cloud/alert/dao/AlertDaoImpl.java b/server/src/com/cloud/alert/dao/AlertDaoImpl.java
index 2134ba495a2..ad3c1f13cb1 100755
--- a/server/src/com/cloud/alert/dao/AlertDaoImpl.java
+++ b/server/src/com/cloud/alert/dao/AlertDaoImpl.java
@@ -10,8 +10,8 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.alert.dao;
-
+package com.cloud.alert.dao;
+
import java.util.List;
import javax.ejb.Local;
@@ -20,28 +20,28 @@ import com.cloud.alert.AlertVO;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchCriteria;
-
-@Local(value = { AlertDao.class })
-public class AlertDaoImpl extends GenericDaoBase implements AlertDao {
- @Override
- public AlertVO getLastAlert(short type, long dataCenterId, Long podId, Long clusterId) {
- Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(0), Long.valueOf(1));
- SearchCriteria sc = createSearchCriteria();
-
- sc.addAnd("type", SearchCriteria.Op.EQ, Short.valueOf(type));
- sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, Long.valueOf(dataCenterId));
- if (podId != null) {
- sc.addAnd("podId", SearchCriteria.Op.EQ, podId);
+
+@Local(value = { AlertDao.class })
+public class AlertDaoImpl extends GenericDaoBase implements AlertDao {
+ @Override
+ public AlertVO getLastAlert(short type, long dataCenterId, Long podId, Long clusterId) {
+ Filter searchFilter = new Filter(AlertVO.class, "createdDate", Boolean.FALSE, Long.valueOf(0), Long.valueOf(1));
+ SearchCriteria sc = createSearchCriteria();
+
+ sc.addAnd("type", SearchCriteria.Op.EQ, Short.valueOf(type));
+ sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, Long.valueOf(dataCenterId));
+ if (podId != null) {
+ sc.addAnd("podId", SearchCriteria.Op.EQ, podId);
}
if (clusterId != null) {
sc.addAnd("clusterId", SearchCriteria.Op.EQ, clusterId);
- }
-
- List alerts = listBy(sc, searchFilter);
- if ((alerts != null) && !alerts.isEmpty()) {
- return alerts.get(0);
- }
- return null;
+ }
+
+ List alerts = listBy(sc, searchFilter);
+ if ((alerts != null) && !alerts.isEmpty()) {
+ return alerts.get(0);
+ }
+ return null;
}
@Override
@@ -60,5 +60,5 @@ public class AlertDaoImpl extends GenericDaoBase implements Alert
return alerts.get(0);
}
return null;
- }
-}
+ }
+}
diff --git a/server/src/com/cloud/api/ApiGsonHelper.java b/server/src/com/cloud/api/ApiGsonHelper.java
index fa4b690f34d..22afb79f3d3 100644
--- a/server/src/com/cloud/api/ApiGsonHelper.java
+++ b/server/src/com/cloud/api/ApiGsonHelper.java
@@ -10,23 +10,23 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.api;
-
+package com.cloud.api;
+
import com.google.gson.GsonBuilder;
import com.cloud.utils.IdentityProxy;
import java.util.Map;
-public class ApiGsonHelper {
- private static final GsonBuilder s_gBuilder;
- static {
- s_gBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
- s_gBuilder.setVersion(1.3);
+public class ApiGsonHelper {
+ private static final GsonBuilder s_gBuilder;
+ static {
+ s_gBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
+ s_gBuilder.setVersion(1.3);
s_gBuilder.registerTypeAdapter(ResponseObject.class, new ResponseObjectTypeAdapter());
s_gBuilder.registerTypeAdapter(IdentityProxy.class, new IdentityTypeAdapter());
s_gBuilder.registerTypeAdapter(Map.class, new StringMapTypeAdapter());
- }
-
- public static GsonBuilder getBuilder() {
- return s_gBuilder;
- }
-}
+ }
+
+ public static GsonBuilder getBuilder() {
+ return s_gBuilder;
+ }
+}
diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java
index ec018c967b5..31678d84d88 100755
--- a/server/src/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/com/cloud/api/ApiResponseHelper.java
@@ -10,3346 +10,3346 @@
// limitations under the License.
//
// Automatically generated by addcopyright.py at 04/03/2012
-package com.cloud.api;
-
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Hashtable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.apache.log4j.Logger;
-
-import com.cloud.acl.ControlledEntity;
-import com.cloud.acl.ControlledEntity.ACLType;
-import com.cloud.api.ApiConstants.HostDetails;
-import com.cloud.api.ApiConstants.VMDetails;
-import com.cloud.api.commands.QueryAsyncJobResultCmd;
-import com.cloud.api.response.AccountResponse;
-import com.cloud.api.response.ApiResponseSerializer;
-import com.cloud.api.response.AsyncJobResponse;
-import com.cloud.api.response.CapabilityResponse;
-import com.cloud.api.response.CapacityResponse;
-import com.cloud.api.response.ClusterResponse;
-import com.cloud.api.response.ConfigurationResponse;
-import com.cloud.api.response.ControlledEntityResponse;
-import com.cloud.api.response.CreateCmdResponse;
-import com.cloud.api.response.DiskOfferingResponse;
-import com.cloud.api.response.DomainResponse;
-import com.cloud.api.response.DomainRouterResponse;
-import com.cloud.api.response.EventResponse;
-import com.cloud.api.response.ExtractResponse;
-import com.cloud.api.response.FirewallResponse;
-import com.cloud.api.response.FirewallRuleResponse;
-import com.cloud.api.response.HostResponse;
-import com.cloud.api.response.HypervisorCapabilitiesResponse;
-import com.cloud.api.response.IPAddressResponse;
-import com.cloud.api.response.InstanceGroupResponse;
-import com.cloud.api.response.IpForwardingRuleResponse;
-import com.cloud.api.response.LBStickinessPolicyResponse;
-import com.cloud.api.response.LBStickinessResponse;
-import com.cloud.api.response.LDAPConfigResponse;
-import com.cloud.api.response.ListResponse;
-import com.cloud.api.response.LoadBalancerResponse;
-import com.cloud.api.response.NetworkOfferingResponse;
-import com.cloud.api.response.NetworkResponse;
-import com.cloud.api.response.NicResponse;
-import com.cloud.api.response.PhysicalNetworkResponse;
-import com.cloud.api.response.PodResponse;
-import com.cloud.api.response.ProjectAccountResponse;
-import com.cloud.api.response.ProjectInvitationResponse;
-import com.cloud.api.response.ProjectResponse;
-import com.cloud.api.response.ProviderResponse;
-import com.cloud.api.response.RemoteAccessVpnResponse;
-import com.cloud.api.response.ResourceCountResponse;
-import com.cloud.api.response.ResourceLimitResponse;
-import com.cloud.api.response.SecurityGroupResponse;
-import com.cloud.api.response.SecurityGroupResultObject;
-import com.cloud.api.response.SecurityGroupRuleResponse;
-import com.cloud.api.response.SecurityGroupRuleResultObject;
-import com.cloud.api.response.ServiceOfferingResponse;
-import com.cloud.api.response.ServiceResponse;
-import com.cloud.api.response.SnapshotPolicyResponse;
-import com.cloud.api.response.SnapshotResponse;
-import com.cloud.api.response.StorageNetworkIpRangeResponse;
-import com.cloud.api.response.StoragePoolResponse;
-import com.cloud.api.response.SwiftResponse;
-import com.cloud.api.response.SystemVmInstanceResponse;
-import com.cloud.api.response.SystemVmResponse;
-import com.cloud.api.response.TemplatePermissionsResponse;
-import com.cloud.api.response.TemplateResponse;
-import com.cloud.api.response.TrafficTypeResponse;
-import com.cloud.api.response.UserResponse;
-import com.cloud.api.response.UserVmResponse;
-import com.cloud.api.response.VirtualRouterProviderResponse;
-import com.cloud.api.response.VlanIpRangeResponse;
-import com.cloud.api.response.VolumeResponse;
-import com.cloud.api.response.VpnUsersResponse;
-import com.cloud.api.response.ZoneResponse;
-import com.cloud.async.AsyncJob;
-import com.cloud.capacity.Capacity;
-import com.cloud.capacity.CapacityVO;
-import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
-import com.cloud.configuration.Configuration;
-import com.cloud.configuration.Resource.ResourceOwnerType;
-import com.cloud.configuration.Resource.ResourceType;
-import com.cloud.configuration.ResourceCount;
-import com.cloud.configuration.ResourceLimit;
-import com.cloud.dc.ClusterVO;
-import com.cloud.dc.DataCenter;
-import com.cloud.dc.DataCenterVO;
-import com.cloud.dc.HostPodVO;
-import com.cloud.dc.Pod;
-import com.cloud.dc.StorageNetworkIpRange;
-import com.cloud.dc.Vlan;
-import com.cloud.dc.Vlan.VlanType;
-import com.cloud.dc.VlanVO;
-import com.cloud.domain.Domain;
-import com.cloud.event.Event;
-import com.cloud.exception.InvalidParameterValueException;
-import com.cloud.host.Host;
-import com.cloud.host.HostStats;
-import com.cloud.host.HostVO;
-import com.cloud.hypervisor.HypervisorCapabilities;
-import com.cloud.network.IPAddressVO;
-import com.cloud.network.IpAddress;
-import com.cloud.network.Network;
-import com.cloud.network.Network.Capability;
-import com.cloud.network.Network.Provider;
-import com.cloud.network.Network.Service;
-import com.cloud.network.NetworkProfile;
-import com.cloud.network.Networks.TrafficType;
-import com.cloud.network.PhysicalNetwork;
-import com.cloud.network.PhysicalNetworkServiceProvider;
-import com.cloud.network.PhysicalNetworkTrafficType;
-import com.cloud.network.RemoteAccessVpn;
-import com.cloud.network.VirtualRouterProvider;
-import com.cloud.network.VpnUser;
-import com.cloud.network.router.VirtualRouter;
-import com.cloud.network.rules.FirewallRule;
-import com.cloud.network.rules.LoadBalancer;
-import com.cloud.network.rules.PortForwardingRule;
-import com.cloud.network.rules.StaticNatRule;
-import com.cloud.network.rules.StickinessPolicy;
-import com.cloud.network.security.SecurityGroup;
-import com.cloud.network.security.SecurityGroupRules;
-import com.cloud.network.security.SecurityGroupVO;
-import com.cloud.network.security.SecurityRule;
-import com.cloud.network.security.SecurityRule.SecurityRuleType;
-import com.cloud.offering.DiskOffering;
-import com.cloud.offering.NetworkOffering;
-import com.cloud.offering.ServiceOffering;
-import com.cloud.org.Cluster;
-import com.cloud.projects.Project;
-import com.cloud.projects.ProjectAccount;
-import com.cloud.projects.ProjectInvitation;
-import com.cloud.server.Criteria;
-import com.cloud.storage.DiskOfferingVO;
-import com.cloud.storage.GuestOS;
-import com.cloud.storage.GuestOSCategoryVO;
-import com.cloud.storage.Snapshot;
-import com.cloud.storage.Storage.ImageFormat;
-import com.cloud.storage.Storage.StoragePoolType;
-import com.cloud.storage.Storage.TemplateType;
-import com.cloud.storage.StoragePool;
-import com.cloud.storage.StoragePoolVO;
-import com.cloud.storage.StorageStats;
-import com.cloud.storage.Swift;
-import com.cloud.storage.UploadVO;
-import com.cloud.storage.VMTemplateHostVO;
-import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
-import com.cloud.storage.VMTemplateSwiftVO;
-import com.cloud.storage.VMTemplateVO;
-import com.cloud.storage.Volume;
-import com.cloud.storage.VolumeVO;
-import com.cloud.storage.snapshot.SnapshotPolicy;
-import com.cloud.template.VirtualMachineTemplate;
-import com.cloud.test.PodZoneConfig;
-import com.cloud.user.Account;
-import com.cloud.user.User;
-import com.cloud.user.UserAccount;
-import com.cloud.user.UserContext;
-import com.cloud.user.UserStatisticsVO;
-import com.cloud.user.UserVO;
-import com.cloud.uservm.UserVm;
-import com.cloud.utils.Pair;
-import com.cloud.utils.StringUtils;
-import com.cloud.utils.net.NetUtils;
-import com.cloud.vm.ConsoleProxyVO;
-import com.cloud.vm.InstanceGroup;
-import com.cloud.vm.InstanceGroupVO;
-import com.cloud.vm.NicProfile;
-import com.cloud.vm.VMInstanceVO;
-import com.cloud.vm.VirtualMachine;
-import com.cloud.vm.VirtualMachine.State;
-import com.cloud.vm.VirtualMachine.Type;
-import com.cloud.vm.VmStats;
-import com.cloud.vm.dao.UserVmData;
-import com.cloud.vm.dao.UserVmData.NicData;
-import com.cloud.vm.dao.UserVmData.SecurityGroupData;
-
-public class ApiResponseHelper implements ResponseGenerator {
-
- public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class);
- private static final DecimalFormat s_percentFormat = new DecimalFormat("##.##");
-
- @Override
- public UserResponse createUserResponse(User user) {
- UserResponse userResponse = new UserResponse();
- Account account = ApiDBUtils.findAccountById(user.getAccountId());
- userResponse.setAccountName(account.getAccountName());
- userResponse.setAccountType(account.getType());
- userResponse.setCreated(user.getCreated());
- userResponse.setDomainId(account.getDomainId());
- userResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName());
- userResponse.setEmail(user.getEmail());
- userResponse.setFirstname(user.getFirstname());
- userResponse.setId(user.getId());
- userResponse.setLastname(user.getLastname());
- userResponse.setState(user.getState().toString());
- userResponse.setTimezone(user.getTimezone());
- userResponse.setUsername(user.getUsername());
- userResponse.setApiKey(user.getApiKey());
- userResponse.setSecretKey(user.getSecretKey());
- userResponse.setObjectName("user");
-
- return userResponse;
- }
-
- // this method is used for response generation via createAccount (which creates an account + user)
- @Override
- public AccountResponse createUserAccountResponse(UserAccount user) {
- return createAccountResponse(ApiDBUtils.findAccountById(user.getAccountId()));
- }
-
- @Override
- public AccountResponse createAccountResponse(Account account) {
- boolean accountIsAdmin = (account.getType() == Account.ACCOUNT_TYPE_ADMIN);
- AccountResponse accountResponse = new AccountResponse();
- accountResponse.setId(account.getId());
- accountResponse.setName(account.getAccountName());
- accountResponse.setAccountType(account.getType());
- accountResponse.setDomainId(account.getDomainId());
- accountResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName());
- accountResponse.setState(account.getState().toString());
- accountResponse.setNetworkDomain(account.getNetworkDomain());
-
- // get network stat
- List stats = ApiDBUtils.listUserStatsBy(account.getId());
- if (stats == null) {
- throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching for user stats");
- }
-
- Long bytesSent = 0L;
- Long bytesReceived = 0L;
- for (UserStatisticsVO stat : stats) {
- Long rx = stat.getNetBytesReceived() + stat.getCurrentBytesReceived();
- Long tx = stat.getNetBytesSent() + stat.getCurrentBytesSent();
- bytesReceived = bytesReceived + Long.valueOf(rx);
- bytesSent = bytesSent + Long.valueOf(tx);
- }
- accountResponse.setBytesReceived(bytesReceived);
- accountResponse.setBytesSent(bytesSent);
-
- // Get resource limits and counts
-
- Long vmLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.user_vm, account.getId());
- String vmLimitDisplay = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit);
- Long vmTotal = ApiDBUtils.getResourceCount(ResourceType.user_vm, account.getId());
- String vmAvail = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit - vmTotal);
- accountResponse.setVmLimit(vmLimitDisplay);
- accountResponse.setVmTotal(vmTotal);
- accountResponse.setVmAvailable(vmAvail);
-
- Long ipLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.public_ip, account.getId());
- String ipLimitDisplay = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit);
- Long ipTotal = ApiDBUtils.getResourceCount(ResourceType.public_ip, account.getId());
-
- Long ips = ipLimit - ipTotal;
- // check how many free ips are left, and if it's less than max allowed number of ips from account - use this
- // value
- Long ipsLeft = ApiDBUtils.countFreePublicIps();
- boolean unlimited = true;
- if (ips.longValue() > ipsLeft.longValue()) {
- ips = ipsLeft;
- unlimited = false;
- }
-
- String ipAvail = ((accountIsAdmin || ipLimit == -1) && unlimited) ? "Unlimited" : String.valueOf(ips);
-
- accountResponse.setIpLimit(ipLimitDisplay);
- accountResponse.setIpTotal(ipTotal);
- accountResponse.setIpAvailable(ipAvail);
-
- Long volumeLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.volume, account.getId());
- String volumeLimitDisplay = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit);
- Long volumeTotal = ApiDBUtils.getResourceCount(ResourceType.volume, account.getId());
- String volumeAvail = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit - volumeTotal);
- accountResponse.setVolumeLimit(volumeLimitDisplay);
- accountResponse.setVolumeTotal(volumeTotal);
- accountResponse.setVolumeAvailable(volumeAvail);
-
- Long snapshotLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.snapshot, account.getId());
- String snapshotLimitDisplay = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit);
- Long snapshotTotal = ApiDBUtils.getResourceCount(ResourceType.snapshot, account.getId());
- String snapshotAvail = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit - snapshotTotal);
- accountResponse.setSnapshotLimit(snapshotLimitDisplay);
- accountResponse.setSnapshotTotal(snapshotTotal);
- accountResponse.setSnapshotAvailable(snapshotAvail);
-
- Long templateLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.template, account.getId());
- String templateLimitDisplay = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit);
- Long templateTotal = ApiDBUtils.getResourceCount(ResourceType.template, account.getId());
- String templateAvail = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit - templateTotal);
- accountResponse.setTemplateLimit(templateLimitDisplay);
- accountResponse.setTemplateTotal(templateTotal);
- accountResponse.setTemplateAvailable(templateAvail);
-
- // Get stopped and running VMs
- int vmStopped = 0;
- int vmRunning = 0;
-
- List permittedAccounts = new ArrayList();
- permittedAccounts.add(account.getId());
-
- List extends UserVm> virtualMachines = ApiDBUtils.searchForUserVMs(new Criteria(), permittedAccounts);
-
- // get Running/Stopped VMs
- for (Iterator extends UserVm> iter = virtualMachines.iterator(); iter.hasNext();) {
- // count how many stopped/running vms we have
- UserVm vm = iter.next();
-
- if (vm.getState() == State.Stopped) {
- vmStopped++;
- } else if (vm.getState() == State.Running) {
- vmRunning++;
- }
- }
-
- accountResponse.setVmStopped(vmStopped);
- accountResponse.setVmRunning(vmRunning);
- accountResponse.setObjectName("account");
-
- //get resource limits for projects
- Long projectLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.project, account.getId());
- String projectLimitDisplay = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit);
- Long projectTotal = ApiDBUtils.getResourceCount(ResourceType.project, account.getId());
- String projectAvail = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit - projectTotal);
- accountResponse.setProjectLimit(projectLimitDisplay);
- accountResponse.setProjectTotal(projectTotal);
- accountResponse.setProjectAvailable(projectAvail);
-
- //get resource limits for networks
- Long networkLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.network, account.getId());
- String networkLimitDisplay = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit);
- Long networkTotal = ApiDBUtils.getResourceCount(ResourceType.network, account.getId());
- String networkAvail = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit - networkTotal);
- accountResponse.setNetworkLimit(networkLimitDisplay);
- accountResponse.setNetworkTotal(networkTotal);
- accountResponse.setNetworkAvailable(networkAvail);
-
- // adding all the users for an account as part of the response obj
- List usersForAccount = ApiDBUtils.listUsersByAccount(account.getAccountId());
- List userResponseList = new ArrayList();
- for (UserVO user : usersForAccount) {
- UserResponse userResponse = createUserResponse(user);
- userResponseList.add(userResponse);
- }
-
- accountResponse.setUsers(userResponseList);
- accountResponse.setDetails(ApiDBUtils.getAccountDetails(account.getId()));
- return accountResponse;
- }
-
- @Override
- public UserResponse createUserResponse(UserAccount user) {
- UserResponse userResponse = new UserResponse();
- userResponse.setAccountName(user.getAccountName());
- userResponse.setAccountType(user.getType());
- userResponse.setCreated(user.getCreated());
- userResponse.setDomainId(user.getDomainId());
- userResponse.setDomainName(ApiDBUtils.findDomainById(user.getDomainId()).getName());
- userResponse.setEmail(user.getEmail());
- userResponse.setFirstname(user.getFirstname());
- userResponse.setId(user.getId());
- userResponse.setLastname(user.getLastname());
- userResponse.setState(user.getState());
- userResponse.setTimezone(user.getTimezone());
- userResponse.setUsername(user.getUsername());
- userResponse.setApiKey(user.getApiKey());
- userResponse.setSecretKey(user.getSecretKey());
- userResponse.setAccountId((user.getAccountId()));
- userResponse.setObjectName("user");
-
- return userResponse;
- }
-
- @Override
- public DomainResponse createDomainResponse(Domain domain) {
- DomainResponse domainResponse = new DomainResponse();
- domainResponse.setDomainName(domain.getName());
- domainResponse.setId(domain.getId());
- domainResponse.setLevel(domain.getLevel());
- domainResponse.setNetworkDomain(domain.getNetworkDomain());
- domainResponse.setParentDomainId(domain.getParent());
- StringBuilder domainPath = new StringBuilder("ROOT");
- (domainPath.append(domain.getPath())).deleteCharAt(domainPath.length() - 1);
- domainResponse.setPath(domainPath.toString());
- if (domain.getParent() != null) {
- domainResponse.setParentDomainName(ApiDBUtils.findDomainById(domain.getParent()).getName());
- }
- if (domain.getChildCount() > 0) {
- domainResponse.setHasChild(true);
- }
- domainResponse.setObjectName("domain");
- return domainResponse;
- }
-
- @Override
- public DiskOfferingResponse createDiskOfferingResponse(DiskOffering offering) {
- DiskOfferingResponse diskOfferingResponse = new DiskOfferingResponse();
- diskOfferingResponse.setId(offering.getId());
- diskOfferingResponse.setName(offering.getName());
- diskOfferingResponse.setDisplayText(offering.getDisplayText());
- diskOfferingResponse.setCreated(offering.getCreated());
- diskOfferingResponse.setDiskSize(offering.getDiskSize() / (1024 * 1024 * 1024));
- if (offering.getDomainId() != null) {
- diskOfferingResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName());
- diskOfferingResponse.setDomainId(offering.getDomainId());
- }
- diskOfferingResponse.setTags(offering.getTags());
- diskOfferingResponse.setCustomized(offering.isCustomized());
- diskOfferingResponse.setObjectName("diskoffering");
- return diskOfferingResponse;
- }
-
- @Override
- public ResourceLimitResponse createResourceLimitResponse(ResourceLimit limit) {
- ResourceLimitResponse resourceLimitResponse = new ResourceLimitResponse();
- if (limit.getResourceOwnerType() == ResourceOwnerType.Domain) {
- populateDomain(resourceLimitResponse, limit.getOwnerId());
- } else if (limit.getResourceOwnerType() == ResourceOwnerType.Account) {
- Account accountTemp = ApiDBUtils.findAccountById(limit.getOwnerId());
- populateAccount(resourceLimitResponse, limit.getOwnerId());
- populateDomain(resourceLimitResponse, accountTemp.getDomainId());
- }
- resourceLimitResponse.setResourceType(Integer.valueOf(limit.getType().getOrdinal()).toString());
- resourceLimitResponse.setMax(limit.getMax());
- resourceLimitResponse.setObjectName("resourcelimit");
-
- return resourceLimitResponse;
- }
-
- @Override
- public ResourceCountResponse createResourceCountResponse(ResourceCount resourceCount) {
- ResourceCountResponse resourceCountResponse = new ResourceCountResponse();
-
- if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Account) {
- Account accountTemp = ApiDBUtils.findAccountById(resourceCount.getOwnerId());
- if (accountTemp != null) {
- populateAccount(resourceCountResponse, accountTemp.getId());
- populateDomain(resourceCountResponse, accountTemp.getDomainId());
- }
- } else if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Domain) {
- populateDomain(resourceCountResponse, resourceCount.getOwnerId());
- }
-
- resourceCountResponse.setResourceType(Integer.valueOf(resourceCount.getType().getOrdinal()).toString());
- resourceCountResponse.setResourceCount(resourceCount.getCount());
- resourceCountResponse.setObjectName("resourcecount");
- return resourceCountResponse;
- }
-
- @Override
- public ServiceOfferingResponse createServiceOfferingResponse(ServiceOffering offering) {
- ServiceOfferingResponse offeringResponse = new ServiceOfferingResponse();
- offeringResponse.setId(offering.getId());
- offeringResponse.setName(offering.getName());
- offeringResponse.setIsSystemOffering(offering.getSystemUse());
- offeringResponse.setDefaultUse(offering.getDefaultUse());
- offeringResponse.setSystemVmType(offering.getSystemVmType());
- offeringResponse.setDisplayText(offering.getDisplayText());
- offeringResponse.setCpuNumber(offering.getCpu());
- offeringResponse.setCpuSpeed(offering.getSpeed());
- offeringResponse.setMemory(offering.getRamSize());
- offeringResponse.setCreated(offering.getCreated());
- offeringResponse.setStorageType(offering.getUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString());
- offeringResponse.setOfferHa(offering.getOfferHA());
- offeringResponse.setLimitCpuUse(offering.getLimitCpuUse());
- offeringResponse.setTags(offering.getTags());
- if (offering.getDomainId() != null) {
- offeringResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName());
- offeringResponse.setDomainId(offering.getDomainId());
- }
- offeringResponse.setNetworkRate(offering.getRateMbps());
- offeringResponse.setHostTag(offering.getHostTag());
- offeringResponse.setObjectName("serviceoffering");
-
- return offeringResponse;
- }
-
- @Override
- public ConfigurationResponse createConfigurationResponse(Configuration cfg) {
- ConfigurationResponse cfgResponse = new ConfigurationResponse();
- cfgResponse.setCategory(cfg.getCategory());
- cfgResponse.setDescription(cfg.getDescription());
- cfgResponse.setName(cfg.getName());
- cfgResponse.setValue(cfg.getValue());
- cfgResponse.setObjectName("configuration");
-
- return cfgResponse;
- }
-
- @Override
- public SnapshotResponse createSnapshotResponse(Snapshot snapshot) {
- SnapshotResponse snapshotResponse = new SnapshotResponse();
- snapshotResponse.setId(snapshot.getId());
-
- populateOwner(snapshotResponse, snapshot);
-
- VolumeVO volume = findVolumeById(snapshot.getVolumeId());
- String snapshotTypeStr = snapshot.getType().name();
- snapshotResponse.setSnapshotType(snapshotTypeStr);
- snapshotResponse.setVolumeId(snapshot.getVolumeId());
- if (volume != null) {
- snapshotResponse.setVolumeName(volume.getName());
- snapshotResponse.setVolumeType(volume.getVolumeType().name());
- }
- snapshotResponse.setCreated(snapshot.getCreated());
- snapshotResponse.setName(snapshot.getName());
- snapshotResponse.setIntervalType(ApiDBUtils.getSnapshotIntervalTypes(snapshot.getId()));
- snapshotResponse.setState(snapshot.getStatus());
- snapshotResponse.setObjectName("snapshot");
- return snapshotResponse;
- }
-
- @Override
- public SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy) {
- SnapshotPolicyResponse policyResponse = new SnapshotPolicyResponse();
- policyResponse.setId(policy.getId());
- policyResponse.setVolumeId(policy.getVolumeId());
- policyResponse.setSchedule(policy.getSchedule());
- policyResponse.setIntervalType(policy.getInterval());
- policyResponse.setMaxSnaps(policy.getMaxSnaps());
- policyResponse.setTimezone(policy.getTimezone());
- policyResponse.setObjectName("snapshotpolicy");
-
- return policyResponse;
- }
-
- @Override
- public HostResponse createHostResponse(Host host) {
- return createHostResponse(host, EnumSet.of(HostDetails.all));
- }
-
- @Override
- public HostResponse createHostResponse(Host host, EnumSet details) {
- HostResponse hostResponse = new HostResponse();
- hostResponse.setId(host.getId());
- hostResponse.setCapabilities(host.getCapabilities());
- hostResponse.setClusterId(host.getClusterId());
- hostResponse.setCpuNumber(host.getCpus());
- hostResponse.setZoneId(host.getDataCenterId());
- hostResponse.setDisconnectedOn(host.getDisconnectedOn());
- hostResponse.setHypervisor(host.getHypervisorType());
- hostResponse.setHostType(host.getType());
- hostResponse.setLastPinged(new Date(host.getLastPinged()));
- hostResponse.setManagementServerId(host.getManagementServerId());
- hostResponse.setName(host.getName());
- hostResponse.setPodId(host.getPodId());
- hostResponse.setRemoved(host.getRemoved());
- hostResponse.setCpuSpeed(host.getSpeed());
- hostResponse.setState(host.getStatus());
- hostResponse.setIpAddress(host.getPrivateIpAddress());
- hostResponse.setVersion(host.getVersion());
- hostResponse.setCreated(host.getCreated());
-
- if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity)
- || details.contains(HostDetails.stats) || details.contains(HostDetails.events)) {
-
- GuestOSCategoryVO guestOSCategory = ApiDBUtils.getHostGuestOSCategory(host.getId());
- if (guestOSCategory != null) {
- hostResponse.setOsCategoryId(guestOSCategory.getId());
- hostResponse.setOsCategoryName(guestOSCategory.getName());
- }
- hostResponse.setZoneName(ApiDBUtils.findZoneById(host.getDataCenterId()).getName());
-
- if (host.getPodId() != null) {
- HostPodVO pod = ApiDBUtils.findPodById(host.getPodId());
- if (pod != null) {
- hostResponse.setPodName(pod.getName());
- }
- }
-
- if (host.getClusterId() != null) {
- ClusterVO cluster = ApiDBUtils.findClusterById(host.getClusterId());
- hostResponse.setClusterName(cluster.getName());
- hostResponse.setClusterType(cluster.getClusterType().toString());
- }
- }
-
- DecimalFormat decimalFormat = new DecimalFormat("#.##");
- if (host.getType() == Host.Type.Routing) {
-
- if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity)) {
- // set allocated capacities
- Long mem = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_MEMORY);
- Long cpu = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_CPU);
-
- hostResponse.setMemoryAllocated(mem);
- hostResponse.setMemoryTotal(host.getTotalMemory());
- hostResponse.setHostTags(ApiDBUtils.getHostTags(host.getId()));
- hostResponse.setHypervisorVersion(host.getHypervisorVersion());
-
- String cpuAlloc = decimalFormat.format(((float) cpu / (float) (host.getCpus() * host.getSpeed())) * 100f) + "%";
- hostResponse.setCpuAllocated(cpuAlloc);
- String cpuWithOverprovisioning = new Float(host.getCpus() * host.getSpeed() * ApiDBUtils.getCpuOverprovisioningFactor()).toString();
- hostResponse.setCpuWithOverprovisioning(cpuWithOverprovisioning);
- }
-
- if (details.contains(HostDetails.all) || details.contains(HostDetails.stats)) {
- // set CPU/RAM/Network stats
- String cpuUsed = null;
- HostStats hostStats = ApiDBUtils.getHostStatistics(host.getId());
- if (hostStats != null) {
- float cpuUtil = (float) hostStats.getCpuUtilization();
- cpuUsed = decimalFormat.format(cpuUtil) + "%";
- hostResponse.setCpuUsed(cpuUsed);
- hostResponse.setMemoryUsed((new Double(hostStats.getUsedMemory())).longValue());
- hostResponse.setNetworkKbsRead((new Double(hostStats.getNetworkReadKBs())).longValue());
- hostResponse.setNetworkKbsWrite((new Double(hostStats.getNetworkWriteKBs())).longValue());
-
- }
- }
-
- } else if (host.getType() == Host.Type.SecondaryStorage) {
- StorageStats secStorageStats = ApiDBUtils.getSecondaryStorageStatistics(host.getId());
- if (secStorageStats != null) {
- hostResponse.setDiskSizeTotal(secStorageStats.getCapacityBytes());
- hostResponse.setDiskSizeAllocated(secStorageStats.getByteUsed());
- }
- }
-
- hostResponse.setLocalStorageActive(ApiDBUtils.isLocalStorageActiveOnHost(host));
-
- if (details.contains(HostDetails.all) || details.contains(HostDetails.events)) {
- Set possibleEvents = host.getStatus().getPossibleEvents();
- if ((possibleEvents != null) && !possibleEvents.isEmpty()) {
- String events = "";
- Iterator iter = possibleEvents.iterator();
- while (iter.hasNext()) {
- com.cloud.host.Status.Event event = iter.next();
- events += event.toString();
- if (iter.hasNext()) {
- events += "; ";
- }
- }
- hostResponse.setEvents(events);
- }
- }
-
- hostResponse.setResourceState(host.getResourceState().toString());
-
- hostResponse.setObjectName("host");
-
- return hostResponse;
- }
-
- @Override
- public SwiftResponse createSwiftResponse(Swift swift) {
- SwiftResponse swiftResponse = new SwiftResponse();
- swiftResponse.setId(swift.getId());
- swiftResponse.setUrl(swift.getUrl());
- swiftResponse.setAccount(swift.getAccount());
- swiftResponse.setUsername(swift.getUserName());
- swiftResponse.setObjectName("swift");
- return swiftResponse;
- }
-
- @Override
- public VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan) {
- Long podId = ApiDBUtils.getPodIdForVlan(vlan.getId());
-
- VlanIpRangeResponse vlanResponse = new VlanIpRangeResponse();
- vlanResponse.setId(vlan.getId());
- vlanResponse.setForVirtualNetwork(vlan.getVlanType().equals(VlanType.VirtualNetwork));
- vlanResponse.setVlan(vlan.getVlanTag());
- vlanResponse.setZoneId(vlan.getDataCenterId());
-
- if (podId != null) {
- HostPodVO pod = ApiDBUtils.findPodById(podId);
- vlanResponse.setPodId(podId);
- if (pod != null) {
- vlanResponse.setPodName(pod.getName());
- }
- }
-
- vlanResponse.setGateway(vlan.getVlanGateway());
- vlanResponse.setNetmask(vlan.getVlanNetmask());
-
- // get start ip and end ip of corresponding vlan
- String ipRange = vlan.getIpRange();
- String[] range = ipRange.split("-");
- vlanResponse.setStartIp(range[0]);
- vlanResponse.setEndIp(range[1]);
-
- vlanResponse.setNetworkId(vlan.getNetworkId());
- Account owner = ApiDBUtils.getVlanAccount(vlan.getId());
- if (owner != null) {
- populateAccount(vlanResponse, owner.getId());
- populateDomain(vlanResponse, owner.getDomainId());
- }
-
- vlanResponse.setPhysicalNetworkId(vlan.getPhysicalNetworkId());
-
- vlanResponse.setObjectName("vlan");
- return vlanResponse;
- }
-
- @Override
- public IPAddressResponse createIPAddressResponse(IpAddress ipAddress) {
- VlanVO vlan = ApiDBUtils.findVlanById(ipAddress.getVlanId());
- boolean forVirtualNetworks = vlan.getVlanType().equals(VlanType.VirtualNetwork);
- long zoneId = ipAddress.getDataCenterId();
-
- IPAddressResponse ipResponse = new IPAddressResponse();
- ipResponse.setId(ipAddress.getId());
- ipResponse.setIpAddress(ipAddress.getAddress().toString());
- if (ipAddress.getAllocatedTime() != null) {
- ipResponse.setAllocated(ipAddress.getAllocatedTime());
- }
- ipResponse.setZoneId(zoneId);
- ipResponse.setZoneName(ApiDBUtils.findZoneById(ipAddress.getDataCenterId()).getName());
- ipResponse.setSourceNat(ipAddress.isSourceNat());
- ipResponse.setIsSystem(ipAddress.getSystem());
-
- // get account information
- populateOwner(ipResponse, ipAddress);
-
- ipResponse.setForVirtualNetwork(forVirtualNetworks);
- ipResponse.setStaticNat(ipAddress.isOneToOneNat());
-
- if (ipAddress.getAssociatedWithVmId() != null) {
- UserVm vm = ApiDBUtils.findUserVmById(ipAddress.getAssociatedWithVmId());
- ipResponse.setVirtualMachineId(vm.getId());
- ipResponse.setVirtualMachineName(vm.getHostName());
- if (vm.getDisplayName() != null) {
- ipResponse.setVirtualMachineDisplayName(vm.getDisplayName());
- } else {
- ipResponse.setVirtualMachineDisplayName(vm.getHostName());
- }
- }
-
- ipResponse.setAssociatedNetworkId(ipAddress.getAssociatedWithNetworkId());
-
- // Network id the ip is associated withif associated networkId is null, try to get this information from vlan
- Long associatedNetworkId = ipAddress.getAssociatedWithNetworkId();
- Long vlanNetworkId = ApiDBUtils.getVlanNetworkId(ipAddress.getVlanId());
- if (associatedNetworkId == null) {
- associatedNetworkId = vlanNetworkId;
- }
-
- ipResponse.setAssociatedNetworkId(associatedNetworkId);
-
- // Network id the ip belongs to
- Long networkId;
- if (vlanNetworkId != null) {
- networkId = vlanNetworkId;
- } else {
- networkId = ApiDBUtils.getPublicNetworkIdByZone(zoneId);
- }
-
- ipResponse.setNetworkId(networkId);
- ipResponse.setState(ipAddress.getState().toString());
- ipResponse.setPhysicalNetworkId(ipAddress.getPhysicalNetworkId());
-
- // show this info to admin only
- Account account = UserContext.current().getCaller();
- if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) {
- ipResponse.setVlanId(ipAddress.getVlanId());
- ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddress.getVlanId()).getVlanTag());
- }
-
- if (ipAddress.getSystem()) {
- if (ipAddress.isOneToOneNat()) {
- ipResponse.setPurpose(IpAddress.Purpose.StaticNat.toString());
- } else {
- ipResponse.setPurpose(IpAddress.Purpose.Lb.toString());
- }
- }
-
- ipResponse.setObjectName("ipaddress");
- return ipResponse;
- }
-
- @Override
- public LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer) {
- LoadBalancerResponse lbResponse = new LoadBalancerResponse();
- lbResponse.setId(loadBalancer.getId());
- lbResponse.setName(loadBalancer.getName());
- lbResponse.setDescription(loadBalancer.getDescription());
- List cidrs = ApiDBUtils.findFirewallSourceCidrs(loadBalancer.getId());
- lbResponse.setCidrList(StringUtils.join(cidrs, ","));
-
- IPAddressVO publicIp = ApiDBUtils.findIpAddressById(loadBalancer.getSourceIpAddressId());
- lbResponse.setPublicIpId(publicIp.getId());
- lbResponse.setPublicIp(publicIp.getAddress().addr());
- lbResponse.setPublicPort(Integer.toString(loadBalancer.getSourcePortStart()));
- lbResponse.setPrivatePort(Integer.toString(loadBalancer.getDefaultPortStart()));
- lbResponse.setAlgorithm(loadBalancer.getAlgorithm());
- FirewallRule.State state = loadBalancer.getState();
- String stateToSet = state.toString();
- if (state.equals(FirewallRule.State.Revoke)) {
- stateToSet = "Deleting";
- }
- lbResponse.setState(stateToSet);
- populateOwner(lbResponse, loadBalancer);
- lbResponse.setZoneId(publicIp.getDataCenterId());
-
- lbResponse.setObjectName("loadbalancer");
- return lbResponse;
- }
-
- @Override
- public PodResponse createPodResponse(Pod pod, Boolean showCapacities) {
- String[] ipRange = new String[2];
- if (pod.getDescription() != null && pod.getDescription().length() > 0) {
- ipRange = pod.getDescription().split("-");
- } else {
- ipRange[0] = pod.getDescription();
- }
-
- PodResponse podResponse = new PodResponse();
- podResponse.setId(pod.getId());
- podResponse.setName(pod.getName());
- podResponse.setZoneId(pod.getDataCenterId());
- podResponse.setZoneName(PodZoneConfig.getZoneName(pod.getDataCenterId()));
- podResponse.setNetmask(NetUtils.getCidrNetmask(pod.getCidrSize()));
- podResponse.setStartIp(ipRange[0]);
- podResponse.setEndIp(((ipRange.length > 1) && (ipRange[1] != null)) ? ipRange[1] : "");
- podResponse.setGateway(pod.getGateway());
- podResponse.setAllocationState(pod.getAllocationState().toString());
- if (showCapacities != null && showCapacities) {
- List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, pod.getId(), null);
- Set capacityResponses = new HashSet();
- float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor();
-
- for (SummedCapacity capacity : capacities) {
- CapacityResponse capacityResponse = new CapacityResponse();
- capacityResponse.setCapacityType(capacity.getCapacityType());
- capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
- if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) {
- capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor)));
- } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) {
- List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, pod.getId(), null);
- capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity());
- capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity());
- } else {
- capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
- }
- if (capacityResponse.getCapacityTotal() != 0) {
- capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
- } else {
- capacityResponse.setPercentUsed(s_percentFormat.format(0L));
- }
- capacityResponses.add(capacityResponse);
- }
- // Do it for stats as well.
- capacityResponses.addAll(getStatsCapacityresponse(null, null, pod.getId(), pod.getDataCenterId()));
- podResponse.setCapacitites(new ArrayList(capacityResponses));
- }
- podResponse.setObjectName("pod");
- return podResponse;
- }
-
- @Override
- public ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities) {
- Account account = UserContext.current().getCaller();
- ZoneResponse zoneResponse = new ZoneResponse();
- zoneResponse.setId(dataCenter.getId());
- zoneResponse.setName(dataCenter.getName());
- zoneResponse.setSecurityGroupsEnabled(ApiDBUtils.isSecurityGroupEnabledInZone(dataCenter.getId()));
-
- if ((dataCenter.getDescription() != null) && !dataCenter.getDescription().equalsIgnoreCase("null")) {
- zoneResponse.setDescription(dataCenter.getDescription());
- }
-
- if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN)) {
- zoneResponse.setDns1(dataCenter.getDns1());
- zoneResponse.setDns2(dataCenter.getDns2());
- zoneResponse.setInternalDns1(dataCenter.getInternalDns1());
- zoneResponse.setInternalDns2(dataCenter.getInternalDns2());
- // FIXME zoneResponse.setVlan(dataCenter.get.getVnet());
- zoneResponse.setGuestCidrAddress(dataCenter.getGuestNetworkCidr());
- }
-
- if (showCapacities != null && showCapacities) {
- List capacities = ApiDBUtils.getCapacityByClusterPodZone(dataCenter.getId(), null, null);
- Set capacityResponses = new HashSet();
- float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor();
-
- for (SummedCapacity capacity : capacities) {
- CapacityResponse capacityResponse = new CapacityResponse();
- capacityResponse.setCapacityType(capacity.getCapacityType());
- capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
- if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) {
- capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor)));
- } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) {
- List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(dataCenter.getId(), null, null);
- capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity());
- capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity());
- } else {
- capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
- }
- if (capacityResponse.getCapacityTotal() != 0) {
- capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
- } else {
- capacityResponse.setPercentUsed(s_percentFormat.format(0L));
- }
- capacityResponses.add(capacityResponse);
- }
- // Do it for stats as well.
- capacityResponses.addAll(getStatsCapacityresponse(null, null, null, dataCenter.getId()));
-
- zoneResponse.setCapacitites(new ArrayList(capacityResponses));
- }
-
- // set network domain info
- zoneResponse.setDomain(dataCenter.getDomain());
-
- // set domain info
- Long domainId = dataCenter.getDomainId();
- if (domainId != null) {
- Domain domain = ApiDBUtils.findDomainById(domainId);
- zoneResponse.setDomainId(domain.getId());
- zoneResponse.setDomainName(domain.getName());
- }
-
- zoneResponse.setType(dataCenter.getNetworkType().toString());
- zoneResponse.setAllocationState(dataCenter.getAllocationState().toString());
- zoneResponse.setZoneToken(dataCenter.getZoneToken());
- zoneResponse.setDhcpProvider(dataCenter.getDhcpProvider());
- zoneResponse.setObjectName("zone");
- return zoneResponse;
- }
-
- private List getStatsCapacityresponse(Long poolId, Long clusterId, Long podId, Long zoneId) {
- List capacities = new ArrayList();
- capacities.add(ApiDBUtils.getStoragePoolUsedStats(poolId, clusterId, podId, zoneId));
- if (clusterId == null && podId == null) {
- capacities.add(ApiDBUtils.getSecondaryStorageUsedStats(poolId, zoneId));
- }
-
- List capacityResponses = new ArrayList();
- for (CapacityVO capacity : capacities) {
- CapacityResponse capacityResponse = new CapacityResponse();
- capacityResponse.setCapacityType(capacity.getCapacityType());
- capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
- capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
- if (capacityResponse.getCapacityTotal() != 0) {
- capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
- } else {
- capacityResponse.setPercentUsed(s_percentFormat.format(0L));
- }
- capacityResponses.add(capacityResponse);
- }
-
- return capacityResponses;
- }
-
- @Override
- public VolumeResponse createVolumeResponse(Volume volume) {
- VolumeResponse volResponse = new VolumeResponse();
- volResponse.setId(volume.getId());
-
- if (volume.getName() != null) {
- volResponse.setName(volume.getName());
- } else {
- volResponse.setName("");
- }
-
- volResponse.setZoneId(volume.getDataCenterId());
- volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName());
-
- volResponse.setVolumeType(volume.getVolumeType().toString());
- volResponse.setDeviceId(volume.getDeviceId());
-
- Long instanceId = volume.getInstanceId();
- if (instanceId != null && volume.getState() != Volume.State.Destroy) {
- VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId);
- if (vm != null) {
- volResponse.setVirtualMachineId(vm.getId());
- volResponse.setVirtualMachineName(vm.getHostName());
- UserVm userVm = ApiDBUtils.findUserVmById(vm.getId());
- if (userVm != null) {
- if (userVm.getDisplayName() != null) {
- volResponse.setVirtualMachineDisplayName(userVm.getDisplayName());
- } else {
- volResponse.setVirtualMachineDisplayName(userVm.getHostName());
- }
- volResponse.setVirtualMachineState(vm.getState().toString());
- } else {
- s_logger.error("User Vm with Id: " + instanceId + " does not exist for volume " + volume.getId());
- }
- } else {
- s_logger.error("Vm with Id: " + instanceId + " does not exist for volume " + volume.getId());
- }
- }
-
- // Show the virtual size of the volume
- volResponse.setSize(volume.getSize());
-
- volResponse.setCreated(volume.getCreated());
- volResponse.setState(volume.getState().toString());
-
- populateOwner(volResponse, volume);
-
- String storageType;
- try {
- if (volume.getPoolId() == null) {
- if (volume.getState() == Volume.State.Allocated) {
- /* set it as shared, so the UI can attach it to VM */
- storageType = "shared";
- } else {
- storageType = "unknown";
- }
- } else {
- storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? ServiceOffering.StorageType.shared.toString() : ServiceOffering.StorageType.local.toString();
- }
- } catch (InvalidParameterValueException e) {
- s_logger.error(e.getMessage(), e);
- throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID");
- }
-
- volResponse.setStorageType(storageType);
- if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
- volResponse.setServiceOfferingId(volume.getDiskOfferingId());
- } else {
- volResponse.setDiskOfferingId(volume.getDiskOfferingId());
- }
-
- DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId());
- if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
- volResponse.setServiceOfferingName(diskOffering.getName());
- volResponse.setServiceOfferingDisplayText(diskOffering.getDisplayText());
- } else {
- volResponse.setDiskOfferingName(diskOffering.getName());
- volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText());
- }
-
- Long poolId = volume.getPoolId();
- String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName();
- volResponse.setStoragePoolName(poolName);
- // volResponse.setSourceId(volume.getSourceId());
- // if (volume.getSourceType() != null) {
- // volResponse.setSourceType(volume.getSourceType().toString());
- // }
-
- // return hypervisor for ROOT and Resource domain only
- Account caller = UserContext.current().getCaller();
- if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
- volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString());
- }
-
- volResponse.setAttached(volume.getAttached());
- volResponse.setDestroyed(volume.getState() == Volume.State.Destroy);
- VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
- boolean isExtractable = template != null && template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM);
- volResponse.setExtractable(isExtractable);
- volResponse.setObjectName("volume");
- return volResponse;
- }
-
- @Override
- public InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group) {
- InstanceGroupResponse groupResponse = new InstanceGroupResponse();
- groupResponse.setId(group.getId());
- groupResponse.setName(group.getName());
- groupResponse.setCreated(group.getCreated());
-
- populateOwner(groupResponse, group);
-
- groupResponse.setObjectName("instancegroup");
- return groupResponse;
- }
-
- @Override
- public StoragePoolResponse createStoragePoolResponse(StoragePool pool) {
- StoragePoolResponse poolResponse = new StoragePoolResponse();
- poolResponse.setId(pool.getId());
- poolResponse.setName(pool.getName());
- poolResponse.setState(pool.getStatus());
- poolResponse.setPath(pool.getPath());
- poolResponse.setIpAddress(pool.getHostAddress());
- poolResponse.setZoneId(pool.getDataCenterId());
- poolResponse.setZoneName(ApiDBUtils.findZoneById(pool.getDataCenterId()).getName());
- if (pool.getPoolType() != null) {
- poolResponse.setType(pool.getPoolType().toString());
- }
- if (pool.getPodId() != null) {
- poolResponse.setPodId(pool.getPodId());
- HostPodVO pod = ApiDBUtils.findPodById(pool.getPodId());
- if (pod != null) {
- poolResponse.setPodName(pod.getName());
- }
- }
- if (pool.getCreated() != null) {
- poolResponse.setCreated(pool.getCreated());
- }
-
- StorageStats stats = ApiDBUtils.getStoragePoolStatistics(pool.getId());
- long allocatedSize = ApiDBUtils.getStorageCapacitybyPool(pool.getId(), Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED);
- poolResponse.setDiskSizeTotal(pool.getCapacityBytes());
- poolResponse.setDiskSizeAllocated(allocatedSize);
-
- if (stats != null) {
- Long used = stats.getByteUsed();
- poolResponse.setDiskSizeUsed(used);
- }
-
- if (pool.getClusterId() != null) {
- ClusterVO cluster = ApiDBUtils.findClusterById(pool.getClusterId());
- poolResponse.setClusterId(cluster.getId());
- poolResponse.setClusterName(cluster.getName());
- }
- poolResponse.setTags(ApiDBUtils.getStoragePoolTags(pool.getId()));
- poolResponse.setObjectName("storagepool");
- return poolResponse;
- }
-
- @Override
- public ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities) {
- ClusterResponse clusterResponse = new ClusterResponse();
- clusterResponse.setId(cluster.getId());
- clusterResponse.setName(cluster.getName());
- clusterResponse.setPodId(cluster.getPodId());
- clusterResponse.setZoneId(cluster.getDataCenterId());
- clusterResponse.setHypervisorType(cluster.getHypervisorType().toString());
- clusterResponse.setClusterType(cluster.getClusterType().toString());
- clusterResponse.setAllocationState(cluster.getAllocationState().toString());
- clusterResponse.setManagedState(cluster.getManagedState().toString());
- HostPodVO pod = ApiDBUtils.findPodById(cluster.getPodId());
- if (pod != null) {
- clusterResponse.setPodName(pod.getName());
- }
- DataCenterVO zone = ApiDBUtils.findZoneById(cluster.getDataCenterId());
- clusterResponse.setZoneName(zone.getName());
- if (showCapacities != null && showCapacities) {
- List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, null, cluster.getId());
- Set capacityResponses = new HashSet();
- float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor();
-
- for (SummedCapacity capacity : capacities) {
- CapacityResponse capacityResponse = new CapacityResponse();
- capacityResponse.setCapacityType(capacity.getCapacityType());
- capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
-
- if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) {
- capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor)));
- } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) {
- List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, null, cluster.getId());
- capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity());
- capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity());
- } else {
- capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
- }
- if (capacityResponse.getCapacityTotal() != 0) {
- capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
- } else {
- capacityResponse.setPercentUsed(s_percentFormat.format(0L));
- }
- capacityResponses.add(capacityResponse);
- }
- // Do it for stats as well.
- capacityResponses.addAll(getStatsCapacityresponse(null, cluster.getId(), pod.getId(), pod.getDataCenterId()));
- clusterResponse.setCapacitites(new ArrayList(capacityResponses));
- }
- clusterResponse.setObjectName("cluster");
- return clusterResponse;
- }
-
- @Override
- public FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule) {
- FirewallRuleResponse response = new FirewallRuleResponse();
- response.setId(fwRule.getId());
- response.setPrivateStartPort(Integer.toString(fwRule.getDestinationPortStart()));
- response.setPrivateEndPort(Integer.toString(fwRule.getDestinationPortEnd()));
- response.setProtocol(fwRule.getProtocol());
- response.setPublicStartPort(Integer.toString(fwRule.getSourcePortStart()));
- response.setPublicEndPort(Integer.toString(fwRule.getSourcePortEnd()));
- List cidrs = ApiDBUtils.findFirewallSourceCidrs(fwRule.getId());
- response.setCidrList(StringUtils.join(cidrs, ","));
-
- IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId());
- response.setPublicIpAddressId(ip.getId());
- response.setPublicIpAddress(ip.getAddress().addr());
-
- if (ip != null && fwRule.getDestinationIpAddress() != null) {
- UserVm vm = ApiDBUtils.findUserVmById(fwRule.getVirtualMachineId());
- if (vm != null) {
- response.setVirtualMachineId(vm.getId());
- response.setVirtualMachineName(vm.getHostName());
-
- if (vm.getDisplayName() != null) {
- response.setVirtualMachineDisplayName(vm.getDisplayName());
- } else {
- response.setVirtualMachineDisplayName(vm.getHostName());
- }
- }
- }
- FirewallRule.State state = fwRule.getState();
- String stateToSet = state.toString();
- if (state.equals(FirewallRule.State.Revoke)) {
- stateToSet = "Deleting";
- }
- response.setState(stateToSet);
- response.setObjectName("portforwardingrule");
- return response;
- }
-
- @Override
- public IpForwardingRuleResponse createIpForwardingRuleResponse(StaticNatRule fwRule) {
- IpForwardingRuleResponse response = new IpForwardingRuleResponse();
- response.setId(fwRule.getId());
- response.setProtocol(fwRule.getProtocol());
-
- IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId());
- response.setPublicIpAddressId(ip.getId());
- response.setPublicIpAddress(ip.getAddress().addr());
-
- if (ip != null && fwRule.getDestIpAddress() != null) {
- UserVm vm = ApiDBUtils.findUserVmById(ip.getAssociatedWithVmId());
- if (vm != null) {// vm might be destroyed
- response.setVirtualMachineId(vm.getId());
- response.setVirtualMachineName(vm.getHostName());
- if (vm.getDisplayName() != null) {
- response.setVirtualMachineDisplayName(vm.getDisplayName());
- } else {
- response.setVirtualMachineDisplayName(vm.getHostName());
- }
- }
- }
- FirewallRule.State state = fwRule.getState();
- String stateToSet = state.toString();
- if (state.equals(FirewallRule.State.Revoke)) {
- stateToSet = "Deleting";
- }
-
- response.setStartPort(fwRule.getSourcePortStart());
- response.setEndPort(fwRule.getSourcePortEnd());
- response.setProtocol(fwRule.getProtocol());
- response.setState(stateToSet);
- response.setObjectName("ipforwardingrule");
- return response;
- }
-
- @Override
- public List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms) {
- Account caller = UserContext.current().getCaller();
- Map dataCenters = new HashMap();
- Map hosts = new HashMap();
- Map templates = new HashMap();
- Map serviceOfferings = new HashMap();
- Map networks = new HashMap();
-
- List vmResponses = new ArrayList();
-
- for (UserVm userVm : userVms) {
- UserVmResponse userVmResponse = new UserVmResponse();
- Account acct = ApiDBUtils.findAccountById(Long.valueOf(userVm.getAccountId()));
- if (acct != null) {
- userVmResponse.setAccountName(acct.getAccountName());
- userVmResponse.setDomainId(acct.getDomainId());
- userVmResponse.setDomainName(ApiDBUtils.findDomainById(acct.getDomainId()).getName());
- }
-
- userVmResponse.setId(userVm.getId());
- userVmResponse.setName(userVm.getHostName());
- userVmResponse.setCreated(userVm.getCreated());
-
- userVmResponse.setHaEnable(userVm.isHaEnabled());
-
- if (userVm.getDisplayName() != null) {
- userVmResponse.setDisplayName(userVm.getDisplayName());
- } else {
- userVmResponse.setDisplayName(userVm.getHostName());
- }
-
- if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN) {
- userVmResponse.setInstanceName(userVm.getInstanceName());
- }
-
-
- if (userVm.getPassword() != null) {
- userVmResponse.setPassword(userVm.getPassword());
- }
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.group)) {
- InstanceGroupVO group = ApiDBUtils.findInstanceGroupForVM(userVm.getId());
- if (group != null) {
- userVmResponse.setGroup(group.getName());
- userVmResponse.setGroupId(group.getId());
- }
-
- }
-
- // Data Center Info
- DataCenter zone = dataCenters.get(userVm.getDataCenterIdToDeployIn());
- if (zone == null) {
- zone = ApiDBUtils.findZoneById(userVm.getDataCenterIdToDeployIn());
- dataCenters.put(zone.getId(), zone);
- }
-
- userVmResponse.setZoneId(zone.getId());
- userVmResponse.setZoneName(zone.getName());
-
- // if user is an admin, display host id
- if (((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN)) && (userVm.getHostId() != null)) {
- Host host = hosts.get(userVm.getHostId());
-
- if (host == null) {
- host = ApiDBUtils.findHostById(userVm.getHostId());
- hosts.put(host.getId(), host);
- }
-
- userVmResponse.setHostId(host.getId());
- userVmResponse.setHostName(host.getName());
- }
-
- if (userVm.getState() != null) {
- if (userVm.getHostId() != null) {
- Host host = hosts.get(userVm.getHostId());
-
- if (host == null) {
- host = ApiDBUtils.findHostById(userVm.getHostId());
- hosts.put(host.getId(), host);
- }
- if (host.getStatus() != com.cloud.host.Status.Up) {
- userVmResponse.setState(VirtualMachine.State.Unknown.toString());
- } else {
- userVmResponse.setState(userVm.getState().toString());
- }
- } else {
- userVmResponse.setState(userVm.getState().toString());
- }
- }
-
- if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
- if (userVm.getHypervisorType() != null) {
- userVmResponse.setHypervisor(userVm.getHypervisorType().toString());
- }
- }
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.tmpl)) {
- // Template Info
- VMTemplateVO template = templates.get(userVm.getTemplateId());
- if (template == null) {
- template = ApiDBUtils.findTemplateById(userVm.getTemplateId());
- if (template != null) {
- templates.put(template.getId(), template);
- }
- }
-
- if (template != null) {
- userVmResponse.setTemplateId(userVm.getTemplateId());
- userVmResponse.setTemplateName(template.getName());
- userVmResponse.setTemplateDisplayText(template.getDisplayText());
- userVmResponse.setPasswordEnabled(template.getEnablePassword());
- } else {
- userVmResponse.setTemplateId(-1L);
- userVmResponse.setTemplateName("ISO Boot");
- userVmResponse.setTemplateDisplayText("ISO Boot");
- userVmResponse.setPasswordEnabled(false);
- }
- }
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.iso)) {
- // ISO Info
- VMTemplateVO iso = templates.get(userVm.getIsoId());
- if (iso == null) {
- iso = ApiDBUtils.findTemplateById(userVm.getIsoId());
- if (iso != null) {
- templates.put(iso.getId(), iso);
- }
- }
-
- if (iso != null) {
- userVmResponse.setIsoId(iso.getId());
- userVmResponse.setIsoName(iso.getName());
- }
- }
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.servoff)) {
- // Service Offering Info
- ServiceOffering offering = serviceOfferings.get(userVm.getServiceOfferingId());
-
- if (offering == null) {
- offering = ApiDBUtils.findServiceOfferingById(userVm.getServiceOfferingId());
- serviceOfferings.put(offering.getId(), offering);
- }
-
- userVmResponse.setServiceOfferingId(offering.getId());
- userVmResponse.setServiceOfferingName(offering.getName());
- userVmResponse.setCpuNumber(offering.getCpu());
- userVmResponse.setCpuSpeed(offering.getSpeed());
- userVmResponse.setMemory(offering.getRamSize());
- }
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.volume)) {
- VolumeVO rootVolume = ApiDBUtils.findRootVolume(userVm.getId());
- if (rootVolume != null) {
- userVmResponse.setRootDeviceId(rootVolume.getDeviceId());
- String rootDeviceType = "Not created";
- if (rootVolume.getPoolId() != null) {
- StoragePoolVO storagePool = ApiDBUtils.findStoragePoolById(rootVolume.getPoolId());
- rootDeviceType = storagePool.getPoolType().toString();
- }
- userVmResponse.setRootDeviceType(rootDeviceType);
- }
- }
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.stats)) {
- // stats calculation
- DecimalFormat decimalFormat = new DecimalFormat("#.##");
- String cpuUsed = null;
- VmStats vmStats = ApiDBUtils.getVmStatistics(userVm.getId());
- if (vmStats != null) {
- float cpuUtil = (float) vmStats.getCPUUtilization();
- cpuUsed = decimalFormat.format(cpuUtil) + "%";
- userVmResponse.setCpuUsed(cpuUsed);
-
- Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs());
- userVmResponse.setNetworkKbsRead(networkKbRead.longValue());
-
- Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs());
- userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue());
- }
- }
-
- userVmResponse.setGuestOsId(userVm.getGuestOSId());
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.secgrp)) {
- // security groups - list only when zone is security group enabled
- if (zone.isSecurityGroupEnabled()) {
- List securityGroups = ApiDBUtils.getSecurityGroupsForVm(userVm.getId());
- List securityGroupResponse = new ArrayList();
- for (SecurityGroupVO grp : securityGroups) {
- SecurityGroupResponse resp = new SecurityGroupResponse();
- resp.setId(grp.getId());
- resp.setName(grp.getName());
- resp.setDescription(grp.getDescription());
- resp.setObjectName("securitygroup");
- securityGroupResponse.add(resp);
- }
- userVmResponse.setSecurityGroupList(securityGroupResponse);
- }
- }
-
- if (details.contains(VMDetails.all) || details.contains(VMDetails.nics)) {
- List nicProfiles = ApiDBUtils.getNics(userVm);
- List nicResponses = new ArrayList();
- for (NicProfile singleNicProfile : nicProfiles) {
- NicResponse nicResponse = new NicResponse();
- nicResponse.setId(singleNicProfile.getId());
- nicResponse.setIpaddress(singleNicProfile.getIp4Address());
- nicResponse.setGateway(singleNicProfile.getGateway());
- nicResponse.setNetmask(singleNicProfile.getNetmask());
- nicResponse.setNetworkid(singleNicProfile.getNetworkId());
- if (acct.getType() == Account.ACCOUNT_TYPE_ADMIN) {
- if (singleNicProfile.getBroadCastUri() != null) {
- nicResponse.setBroadcastUri(singleNicProfile.getBroadCastUri().toString());
- }
- if (singleNicProfile.getIsolationUri() != null) {
- nicResponse.setIsolationUri(singleNicProfile.getIsolationUri().toString());
- }
- }
-
- // Long networkId = singleNicProfile.getNetworkId();
- Network network = networks.get(singleNicProfile.getNetworkId());
- if (network == null) {
- network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId());
- networks.put(singleNicProfile.getNetworkId(), network);
- }
-
- nicResponse.setTrafficType(network.getTrafficType().toString());
- nicResponse.setType(network.getGuestType().toString());
- nicResponse.setIsDefault(singleNicProfile.isDefaultNic());
- nicResponse.setObjectName("nic");
- nicResponses.add(nicResponse);
- }
- userVmResponse.setNics(nicResponses);
- }
-
- IpAddress ip = ApiDBUtils.findIpByAssociatedVmId(userVm.getId());
- if (ip != null) {
- userVmResponse.setPublicIpId(ip.getId());
- userVmResponse.setPublicIp(ip.getAddress().addr());
- }
-
- userVmResponse.setObjectName(objectName);
- vmResponses.add(userVmResponse);
- }
-
- return vmResponses;
- }
-
- @Override
- public List createUserVmResponse(String objectName, UserVm... userVms) {
- Account caller = UserContext.current().getCaller();
- boolean caller_is_admin = ((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN));
-
- Hashtable vmDataList = new Hashtable();
- // Initialise the vmdatalist with the input data
- for (UserVm userVm : userVms) {
- UserVmData userVmData = newUserVmData(userVm);
- vmDataList.put(userVm.getId(), userVmData);
- }
-
- vmDataList = ApiDBUtils.listVmDetails(vmDataList);
-
- // initialize vmresponse from vmdatalist
- List vmResponses = new ArrayList();
- DecimalFormat decimalFormat = new DecimalFormat("#.##");
- for (UserVmData uvd : vmDataList.values()) {
- UserVmResponse userVmResponse = newUserVmResponse(uvd, caller_is_admin);
-
- // stats calculation
- String cpuUsed = null;
- // VmStats vmStats = ApiDBUtils.getVmStatistics(userVmResponse.getId());
- VmStats vmStats = ApiDBUtils.getVmStatistics(uvd.getId());
- if (vmStats != null) {
- float cpuUtil = (float) vmStats.getCPUUtilization();
- cpuUsed = decimalFormat.format(cpuUtil) + "%";
- userVmResponse.setCpuUsed(cpuUsed);
-
- Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs());
- userVmResponse.setNetworkKbsRead(networkKbRead.longValue());
-
- Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs());
- userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue());
- }
- userVmResponse.setObjectName(objectName);
-
- vmResponses.add(userVmResponse);
- }
- return vmResponses;
- }
-
- @Override
- public DomainRouterResponse createDomainRouterResponse(VirtualRouter router) {
- Account caller = UserContext.current().getCaller();
- Map serviceOfferings = new HashMap();
-
- DomainRouterResponse routerResponse = new DomainRouterResponse();
- routerResponse.setId(router.getId());
- routerResponse.setZoneId(router.getDataCenterIdToDeployIn());
- routerResponse.setName(router.getHostName());
- routerResponse.setTemplateId(router.getTemplateId());
- routerResponse.setCreated(router.getCreated());
- routerResponse.setState(router.getState());
- routerResponse.setIsRedundantRouter(router.getIsRedundantRouter());
- routerResponse.setRedundantState(router.getRedundantState().toString());
-
- if (caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_ADMIN) {
- if (router.getHostId() != null) {
- routerResponse.setHostId(router.getHostId());
- routerResponse.setHostName(ApiDBUtils.findHostById(router.getHostId()).getName());
- }
- routerResponse.setPodId(router.getPodIdToDeployIn());
- List nicProfiles = ApiDBUtils.getNics(router);
- for (NicProfile singleNicProfile : nicProfiles) {
- Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId());
- if (network != null) {
- if (network.getTrafficType() == TrafficType.Public) {
- routerResponse.setPublicIp(singleNicProfile.getIp4Address());
- routerResponse.setPublicMacAddress(singleNicProfile.getMacAddress());
- routerResponse.setPublicNetmask(singleNicProfile.getNetmask());
- routerResponse.setGateway(singleNicProfile.getGateway());
- routerResponse.setPublicNetworkId(singleNicProfile.getNetworkId());
- } else if (network.getTrafficType() == TrafficType.Control) {
- routerResponse.setLinkLocalIp(singleNicProfile.getIp4Address());
- routerResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress());
- routerResponse.setLinkLocalNetmask(singleNicProfile.getNetmask());
- routerResponse.setLinkLocalNetworkId(singleNicProfile.getNetworkId());
- } else if (network.getTrafficType() == TrafficType.Guest) {
- routerResponse.setGuestIpAddress(singleNicProfile.getIp4Address());
- routerResponse.setGuestMacAddress(singleNicProfile.getMacAddress());
- routerResponse.setGuestNetmask(singleNicProfile.getNetmask());
- routerResponse.setGuestNetworkId(singleNicProfile.getNetworkId());
- routerResponse.setNetworkDomain(network.getNetworkDomain());
- }
- }
- }
- }
-
- // Service Offering Info
- ServiceOffering offering = serviceOfferings.get(router.getServiceOfferingId());
-
- if (offering == null) {
- offering = ApiDBUtils.findServiceOfferingById(router.getServiceOfferingId());
- serviceOfferings.put(offering.getId(), offering);
- }
- routerResponse.setServiceOfferingId(offering.getId());
- routerResponse.setServiceOfferingName(offering.getName());
-
- populateOwner(routerResponse, router);
-
- DataCenter zone = ApiDBUtils.findZoneById(router.getDataCenterIdToDeployIn());
- if (zone != null) {
- routerResponse.setZoneName(zone.getName());
- routerResponse.setDns1(zone.getDns1());
- routerResponse.setDns2(zone.getDns2());
- }
-
- routerResponse.setObjectName("domainrouter");
- return routerResponse;
- }
-
- @Override
- public SystemVmResponse createSystemVmResponse(VirtualMachine vm) {
- SystemVmResponse vmResponse = new SystemVmResponse();
- if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) {
- // SystemVm vm = (SystemVm) systemVM;
- vmResponse.setId(vm.getId());
- vmResponse.setObjectId(vm.getId());
- vmResponse.setSystemVmType(vm.getType().toString().toLowerCase());
- vmResponse.setZoneId(vm.getDataCenterIdToDeployIn());
-
- vmResponse.setName(vm.getHostName());
- vmResponse.setPodId(vm.getPodIdToDeployIn());
- vmResponse.setTemplateId(vm.getTemplateId());
- vmResponse.setCreated(vm.getCreated());
-
- if (vm.getHostId() != null) {
- vmResponse.setHostId(vm.getHostId());
- vmResponse.setHostName(ApiDBUtils.findHostById(vm.getHostId()).getName());
- }
-
- if (vm.getState() != null) {
- vmResponse.setState(vm.getState().toString());
- }
-
- // for console proxies, add the active sessions
- if (vm.getType() == Type.ConsoleProxy) {
- ConsoleProxyVO proxy = ApiDBUtils.findConsoleProxy(vm.getId());
- // proxy can be already destroyed
- if (proxy != null) {
- vmResponse.setActiveViewerSessions(proxy.getActiveSession());
- }
- }
-
- DataCenter zone = ApiDBUtils.findZoneById(vm.getDataCenterIdToDeployIn());
- if (zone != null) {
- vmResponse.setZoneName(zone.getName());
- vmResponse.setDns1(zone.getDns1());
- vmResponse.setDns2(zone.getDns2());
- }
-
- List nicProfiles = ApiDBUtils.getNics(vm);
- for (NicProfile singleNicProfile : nicProfiles) {
- Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId());
- if (network != null) {
- if (network.getTrafficType() == TrafficType.Management) {
- vmResponse.setPrivateIp(singleNicProfile.getIp4Address());
- vmResponse.setPrivateMacAddress(singleNicProfile.getMacAddress());
- vmResponse.setPrivateNetmask(singleNicProfile.getNetmask());
- } else if (network.getTrafficType() == TrafficType.Control) {
- vmResponse.setLinkLocalIp(singleNicProfile.getIp4Address());
- vmResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress());
+package com.cloud.api;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.acl.ControlledEntity;
+import com.cloud.acl.ControlledEntity.ACLType;
+import com.cloud.api.ApiConstants.HostDetails;
+import com.cloud.api.ApiConstants.VMDetails;
+import com.cloud.api.commands.QueryAsyncJobResultCmd;
+import com.cloud.api.response.AccountResponse;
+import com.cloud.api.response.ApiResponseSerializer;
+import com.cloud.api.response.AsyncJobResponse;
+import com.cloud.api.response.CapabilityResponse;
+import com.cloud.api.response.CapacityResponse;
+import com.cloud.api.response.ClusterResponse;
+import com.cloud.api.response.ConfigurationResponse;
+import com.cloud.api.response.ControlledEntityResponse;
+import com.cloud.api.response.CreateCmdResponse;
+import com.cloud.api.response.DiskOfferingResponse;
+import com.cloud.api.response.DomainResponse;
+import com.cloud.api.response.DomainRouterResponse;
+import com.cloud.api.response.EventResponse;
+import com.cloud.api.response.ExtractResponse;
+import com.cloud.api.response.FirewallResponse;
+import com.cloud.api.response.FirewallRuleResponse;
+import com.cloud.api.response.HostResponse;
+import com.cloud.api.response.HypervisorCapabilitiesResponse;
+import com.cloud.api.response.IPAddressResponse;
+import com.cloud.api.response.InstanceGroupResponse;
+import com.cloud.api.response.IpForwardingRuleResponse;
+import com.cloud.api.response.LBStickinessPolicyResponse;
+import com.cloud.api.response.LBStickinessResponse;
+import com.cloud.api.response.LDAPConfigResponse;
+import com.cloud.api.response.ListResponse;
+import com.cloud.api.response.LoadBalancerResponse;
+import com.cloud.api.response.NetworkOfferingResponse;
+import com.cloud.api.response.NetworkResponse;
+import com.cloud.api.response.NicResponse;
+import com.cloud.api.response.PhysicalNetworkResponse;
+import com.cloud.api.response.PodResponse;
+import com.cloud.api.response.ProjectAccountResponse;
+import com.cloud.api.response.ProjectInvitationResponse;
+import com.cloud.api.response.ProjectResponse;
+import com.cloud.api.response.ProviderResponse;
+import com.cloud.api.response.RemoteAccessVpnResponse;
+import com.cloud.api.response.ResourceCountResponse;
+import com.cloud.api.response.ResourceLimitResponse;
+import com.cloud.api.response.SecurityGroupResponse;
+import com.cloud.api.response.SecurityGroupResultObject;
+import com.cloud.api.response.SecurityGroupRuleResponse;
+import com.cloud.api.response.SecurityGroupRuleResultObject;
+import com.cloud.api.response.ServiceOfferingResponse;
+import com.cloud.api.response.ServiceResponse;
+import com.cloud.api.response.SnapshotPolicyResponse;
+import com.cloud.api.response.SnapshotResponse;
+import com.cloud.api.response.StorageNetworkIpRangeResponse;
+import com.cloud.api.response.StoragePoolResponse;
+import com.cloud.api.response.SwiftResponse;
+import com.cloud.api.response.SystemVmInstanceResponse;
+import com.cloud.api.response.SystemVmResponse;
+import com.cloud.api.response.TemplatePermissionsResponse;
+import com.cloud.api.response.TemplateResponse;
+import com.cloud.api.response.TrafficTypeResponse;
+import com.cloud.api.response.UserResponse;
+import com.cloud.api.response.UserVmResponse;
+import com.cloud.api.response.VirtualRouterProviderResponse;
+import com.cloud.api.response.VlanIpRangeResponse;
+import com.cloud.api.response.VolumeResponse;
+import com.cloud.api.response.VpnUsersResponse;
+import com.cloud.api.response.ZoneResponse;
+import com.cloud.async.AsyncJob;
+import com.cloud.capacity.Capacity;
+import com.cloud.capacity.CapacityVO;
+import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity;
+import com.cloud.configuration.Configuration;
+import com.cloud.configuration.Resource.ResourceOwnerType;
+import com.cloud.configuration.Resource.ResourceType;
+import com.cloud.configuration.ResourceCount;
+import com.cloud.configuration.ResourceLimit;
+import com.cloud.dc.ClusterVO;
+import com.cloud.dc.DataCenter;
+import com.cloud.dc.DataCenterVO;
+import com.cloud.dc.HostPodVO;
+import com.cloud.dc.Pod;
+import com.cloud.dc.StorageNetworkIpRange;
+import com.cloud.dc.Vlan;
+import com.cloud.dc.Vlan.VlanType;
+import com.cloud.dc.VlanVO;
+import com.cloud.domain.Domain;
+import com.cloud.event.Event;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.host.Host;
+import com.cloud.host.HostStats;
+import com.cloud.host.HostVO;
+import com.cloud.hypervisor.HypervisorCapabilities;
+import com.cloud.network.IPAddressVO;
+import com.cloud.network.IpAddress;
+import com.cloud.network.Network;
+import com.cloud.network.Network.Capability;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
+import com.cloud.network.NetworkProfile;
+import com.cloud.network.Networks.TrafficType;
+import com.cloud.network.PhysicalNetwork;
+import com.cloud.network.PhysicalNetworkServiceProvider;
+import com.cloud.network.PhysicalNetworkTrafficType;
+import com.cloud.network.RemoteAccessVpn;
+import com.cloud.network.VirtualRouterProvider;
+import com.cloud.network.VpnUser;
+import com.cloud.network.router.VirtualRouter;
+import com.cloud.network.rules.FirewallRule;
+import com.cloud.network.rules.LoadBalancer;
+import com.cloud.network.rules.PortForwardingRule;
+import com.cloud.network.rules.StaticNatRule;
+import com.cloud.network.rules.StickinessPolicy;
+import com.cloud.network.security.SecurityGroup;
+import com.cloud.network.security.SecurityGroupRules;
+import com.cloud.network.security.SecurityGroupVO;
+import com.cloud.network.security.SecurityRule;
+import com.cloud.network.security.SecurityRule.SecurityRuleType;
+import com.cloud.offering.DiskOffering;
+import com.cloud.offering.NetworkOffering;
+import com.cloud.offering.ServiceOffering;
+import com.cloud.org.Cluster;
+import com.cloud.projects.Project;
+import com.cloud.projects.ProjectAccount;
+import com.cloud.projects.ProjectInvitation;
+import com.cloud.server.Criteria;
+import com.cloud.storage.DiskOfferingVO;
+import com.cloud.storage.GuestOS;
+import com.cloud.storage.GuestOSCategoryVO;
+import com.cloud.storage.Snapshot;
+import com.cloud.storage.Storage.ImageFormat;
+import com.cloud.storage.Storage.StoragePoolType;
+import com.cloud.storage.Storage.TemplateType;
+import com.cloud.storage.StoragePool;
+import com.cloud.storage.StoragePoolVO;
+import com.cloud.storage.StorageStats;
+import com.cloud.storage.Swift;
+import com.cloud.storage.UploadVO;
+import com.cloud.storage.VMTemplateHostVO;
+import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
+import com.cloud.storage.VMTemplateSwiftVO;
+import com.cloud.storage.VMTemplateVO;
+import com.cloud.storage.Volume;
+import com.cloud.storage.VolumeVO;
+import com.cloud.storage.snapshot.SnapshotPolicy;
+import com.cloud.template.VirtualMachineTemplate;
+import com.cloud.test.PodZoneConfig;
+import com.cloud.user.Account;
+import com.cloud.user.User;
+import com.cloud.user.UserAccount;
+import com.cloud.user.UserContext;
+import com.cloud.user.UserStatisticsVO;
+import com.cloud.user.UserVO;
+import com.cloud.uservm.UserVm;
+import com.cloud.utils.Pair;
+import com.cloud.utils.StringUtils;
+import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.ConsoleProxyVO;
+import com.cloud.vm.InstanceGroup;
+import com.cloud.vm.InstanceGroupVO;
+import com.cloud.vm.NicProfile;
+import com.cloud.vm.VMInstanceVO;
+import com.cloud.vm.VirtualMachine;
+import com.cloud.vm.VirtualMachine.State;
+import com.cloud.vm.VirtualMachine.Type;
+import com.cloud.vm.VmStats;
+import com.cloud.vm.dao.UserVmData;
+import com.cloud.vm.dao.UserVmData.NicData;
+import com.cloud.vm.dao.UserVmData.SecurityGroupData;
+
+public class ApiResponseHelper implements ResponseGenerator {
+
+ public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class);
+ private static final DecimalFormat s_percentFormat = new DecimalFormat("##.##");
+
+ @Override
+ public UserResponse createUserResponse(User user) {
+ UserResponse userResponse = new UserResponse();
+ Account account = ApiDBUtils.findAccountById(user.getAccountId());
+ userResponse.setAccountName(account.getAccountName());
+ userResponse.setAccountType(account.getType());
+ userResponse.setCreated(user.getCreated());
+ userResponse.setDomainId(account.getDomainId());
+ userResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName());
+ userResponse.setEmail(user.getEmail());
+ userResponse.setFirstname(user.getFirstname());
+ userResponse.setId(user.getId());
+ userResponse.setLastname(user.getLastname());
+ userResponse.setState(user.getState().toString());
+ userResponse.setTimezone(user.getTimezone());
+ userResponse.setUsername(user.getUsername());
+ userResponse.setApiKey(user.getApiKey());
+ userResponse.setSecretKey(user.getSecretKey());
+ userResponse.setObjectName("user");
+
+ return userResponse;
+ }
+
+ // this method is used for response generation via createAccount (which creates an account + user)
+ @Override
+ public AccountResponse createUserAccountResponse(UserAccount user) {
+ return createAccountResponse(ApiDBUtils.findAccountById(user.getAccountId()));
+ }
+
+ @Override
+ public AccountResponse createAccountResponse(Account account) {
+ boolean accountIsAdmin = (account.getType() == Account.ACCOUNT_TYPE_ADMIN);
+ AccountResponse accountResponse = new AccountResponse();
+ accountResponse.setId(account.getId());
+ accountResponse.setName(account.getAccountName());
+ accountResponse.setAccountType(account.getType());
+ accountResponse.setDomainId(account.getDomainId());
+ accountResponse.setDomainName(ApiDBUtils.findDomainById(account.getDomainId()).getName());
+ accountResponse.setState(account.getState().toString());
+ accountResponse.setNetworkDomain(account.getNetworkDomain());
+
+ // get network stat
+ List stats = ApiDBUtils.listUserStatsBy(account.getId());
+ if (stats == null) {
+ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching for user stats");
+ }
+
+ Long bytesSent = 0L;
+ Long bytesReceived = 0L;
+ for (UserStatisticsVO stat : stats) {
+ Long rx = stat.getNetBytesReceived() + stat.getCurrentBytesReceived();
+ Long tx = stat.getNetBytesSent() + stat.getCurrentBytesSent();
+ bytesReceived = bytesReceived + Long.valueOf(rx);
+ bytesSent = bytesSent + Long.valueOf(tx);
+ }
+ accountResponse.setBytesReceived(bytesReceived);
+ accountResponse.setBytesSent(bytesSent);
+
+ // Get resource limits and counts
+
+ Long vmLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.user_vm, account.getId());
+ String vmLimitDisplay = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit);
+ Long vmTotal = ApiDBUtils.getResourceCount(ResourceType.user_vm, account.getId());
+ String vmAvail = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit - vmTotal);
+ accountResponse.setVmLimit(vmLimitDisplay);
+ accountResponse.setVmTotal(vmTotal);
+ accountResponse.setVmAvailable(vmAvail);
+
+ Long ipLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.public_ip, account.getId());
+ String ipLimitDisplay = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit);
+ Long ipTotal = ApiDBUtils.getResourceCount(ResourceType.public_ip, account.getId());
+
+ Long ips = ipLimit - ipTotal;
+ // check how many free ips are left, and if it's less than max allowed number of ips from account - use this
+ // value
+ Long ipsLeft = ApiDBUtils.countFreePublicIps();
+ boolean unlimited = true;
+ if (ips.longValue() > ipsLeft.longValue()) {
+ ips = ipsLeft;
+ unlimited = false;
+ }
+
+ String ipAvail = ((accountIsAdmin || ipLimit == -1) && unlimited) ? "Unlimited" : String.valueOf(ips);
+
+ accountResponse.setIpLimit(ipLimitDisplay);
+ accountResponse.setIpTotal(ipTotal);
+ accountResponse.setIpAvailable(ipAvail);
+
+ Long volumeLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.volume, account.getId());
+ String volumeLimitDisplay = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit);
+ Long volumeTotal = ApiDBUtils.getResourceCount(ResourceType.volume, account.getId());
+ String volumeAvail = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit - volumeTotal);
+ accountResponse.setVolumeLimit(volumeLimitDisplay);
+ accountResponse.setVolumeTotal(volumeTotal);
+ accountResponse.setVolumeAvailable(volumeAvail);
+
+ Long snapshotLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.snapshot, account.getId());
+ String snapshotLimitDisplay = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit);
+ Long snapshotTotal = ApiDBUtils.getResourceCount(ResourceType.snapshot, account.getId());
+ String snapshotAvail = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit - snapshotTotal);
+ accountResponse.setSnapshotLimit(snapshotLimitDisplay);
+ accountResponse.setSnapshotTotal(snapshotTotal);
+ accountResponse.setSnapshotAvailable(snapshotAvail);
+
+ Long templateLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.template, account.getId());
+ String templateLimitDisplay = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit);
+ Long templateTotal = ApiDBUtils.getResourceCount(ResourceType.template, account.getId());
+ String templateAvail = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit - templateTotal);
+ accountResponse.setTemplateLimit(templateLimitDisplay);
+ accountResponse.setTemplateTotal(templateTotal);
+ accountResponse.setTemplateAvailable(templateAvail);
+
+ // Get stopped and running VMs
+ int vmStopped = 0;
+ int vmRunning = 0;
+
+ List permittedAccounts = new ArrayList();
+ permittedAccounts.add(account.getId());
+
+ List extends UserVm> virtualMachines = ApiDBUtils.searchForUserVMs(new Criteria(), permittedAccounts);
+
+ // get Running/Stopped VMs
+ for (Iterator extends UserVm> iter = virtualMachines.iterator(); iter.hasNext();) {
+ // count how many stopped/running vms we have
+ UserVm vm = iter.next();
+
+ if (vm.getState() == State.Stopped) {
+ vmStopped++;
+ } else if (vm.getState() == State.Running) {
+ vmRunning++;
+ }
+ }
+
+ accountResponse.setVmStopped(vmStopped);
+ accountResponse.setVmRunning(vmRunning);
+ accountResponse.setObjectName("account");
+
+ //get resource limits for projects
+ Long projectLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.project, account.getId());
+ String projectLimitDisplay = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit);
+ Long projectTotal = ApiDBUtils.getResourceCount(ResourceType.project, account.getId());
+ String projectAvail = (accountIsAdmin || projectLimit == -1) ? "Unlimited" : String.valueOf(projectLimit - projectTotal);
+ accountResponse.setProjectLimit(projectLimitDisplay);
+ accountResponse.setProjectTotal(projectTotal);
+ accountResponse.setProjectAvailable(projectAvail);
+
+ //get resource limits for networks
+ Long networkLimit = ApiDBUtils.findCorrectResourceLimit(ResourceType.network, account.getId());
+ String networkLimitDisplay = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit);
+ Long networkTotal = ApiDBUtils.getResourceCount(ResourceType.network, account.getId());
+ String networkAvail = (accountIsAdmin || networkLimit == -1) ? "Unlimited" : String.valueOf(networkLimit - networkTotal);
+ accountResponse.setNetworkLimit(networkLimitDisplay);
+ accountResponse.setNetworkTotal(networkTotal);
+ accountResponse.setNetworkAvailable(networkAvail);
+
+ // adding all the users for an account as part of the response obj
+ List usersForAccount = ApiDBUtils.listUsersByAccount(account.getAccountId());
+ List userResponseList = new ArrayList();
+ for (UserVO user : usersForAccount) {
+ UserResponse userResponse = createUserResponse(user);
+ userResponseList.add(userResponse);
+ }
+
+ accountResponse.setUsers(userResponseList);
+ accountResponse.setDetails(ApiDBUtils.getAccountDetails(account.getId()));
+ return accountResponse;
+ }
+
+ @Override
+ public UserResponse createUserResponse(UserAccount user) {
+ UserResponse userResponse = new UserResponse();
+ userResponse.setAccountName(user.getAccountName());
+ userResponse.setAccountType(user.getType());
+ userResponse.setCreated(user.getCreated());
+ userResponse.setDomainId(user.getDomainId());
+ userResponse.setDomainName(ApiDBUtils.findDomainById(user.getDomainId()).getName());
+ userResponse.setEmail(user.getEmail());
+ userResponse.setFirstname(user.getFirstname());
+ userResponse.setId(user.getId());
+ userResponse.setLastname(user.getLastname());
+ userResponse.setState(user.getState());
+ userResponse.setTimezone(user.getTimezone());
+ userResponse.setUsername(user.getUsername());
+ userResponse.setApiKey(user.getApiKey());
+ userResponse.setSecretKey(user.getSecretKey());
+ userResponse.setAccountId((user.getAccountId()));
+ userResponse.setObjectName("user");
+
+ return userResponse;
+ }
+
+ @Override
+ public DomainResponse createDomainResponse(Domain domain) {
+ DomainResponse domainResponse = new DomainResponse();
+ domainResponse.setDomainName(domain.getName());
+ domainResponse.setId(domain.getId());
+ domainResponse.setLevel(domain.getLevel());
+ domainResponse.setNetworkDomain(domain.getNetworkDomain());
+ domainResponse.setParentDomainId(domain.getParent());
+ StringBuilder domainPath = new StringBuilder("ROOT");
+ (domainPath.append(domain.getPath())).deleteCharAt(domainPath.length() - 1);
+ domainResponse.setPath(domainPath.toString());
+ if (domain.getParent() != null) {
+ domainResponse.setParentDomainName(ApiDBUtils.findDomainById(domain.getParent()).getName());
+ }
+ if (domain.getChildCount() > 0) {
+ domainResponse.setHasChild(true);
+ }
+ domainResponse.setObjectName("domain");
+ return domainResponse;
+ }
+
+ @Override
+ public DiskOfferingResponse createDiskOfferingResponse(DiskOffering offering) {
+ DiskOfferingResponse diskOfferingResponse = new DiskOfferingResponse();
+ diskOfferingResponse.setId(offering.getId());
+ diskOfferingResponse.setName(offering.getName());
+ diskOfferingResponse.setDisplayText(offering.getDisplayText());
+ diskOfferingResponse.setCreated(offering.getCreated());
+ diskOfferingResponse.setDiskSize(offering.getDiskSize() / (1024 * 1024 * 1024));
+ if (offering.getDomainId() != null) {
+ diskOfferingResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName());
+ diskOfferingResponse.setDomainId(offering.getDomainId());
+ }
+ diskOfferingResponse.setTags(offering.getTags());
+ diskOfferingResponse.setCustomized(offering.isCustomized());
+ diskOfferingResponse.setObjectName("diskoffering");
+ return diskOfferingResponse;
+ }
+
+ @Override
+ public ResourceLimitResponse createResourceLimitResponse(ResourceLimit limit) {
+ ResourceLimitResponse resourceLimitResponse = new ResourceLimitResponse();
+ if (limit.getResourceOwnerType() == ResourceOwnerType.Domain) {
+ populateDomain(resourceLimitResponse, limit.getOwnerId());
+ } else if (limit.getResourceOwnerType() == ResourceOwnerType.Account) {
+ Account accountTemp = ApiDBUtils.findAccountById(limit.getOwnerId());
+ populateAccount(resourceLimitResponse, limit.getOwnerId());
+ populateDomain(resourceLimitResponse, accountTemp.getDomainId());
+ }
+ resourceLimitResponse.setResourceType(Integer.valueOf(limit.getType().getOrdinal()).toString());
+ resourceLimitResponse.setMax(limit.getMax());
+ resourceLimitResponse.setObjectName("resourcelimit");
+
+ return resourceLimitResponse;
+ }
+
+ @Override
+ public ResourceCountResponse createResourceCountResponse(ResourceCount resourceCount) {
+ ResourceCountResponse resourceCountResponse = new ResourceCountResponse();
+
+ if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Account) {
+ Account accountTemp = ApiDBUtils.findAccountById(resourceCount.getOwnerId());
+ if (accountTemp != null) {
+ populateAccount(resourceCountResponse, accountTemp.getId());
+ populateDomain(resourceCountResponse, accountTemp.getDomainId());
+ }
+ } else if (resourceCount.getResourceOwnerType() == ResourceOwnerType.Domain) {
+ populateDomain(resourceCountResponse, resourceCount.getOwnerId());
+ }
+
+ resourceCountResponse.setResourceType(Integer.valueOf(resourceCount.getType().getOrdinal()).toString());
+ resourceCountResponse.setResourceCount(resourceCount.getCount());
+ resourceCountResponse.setObjectName("resourcecount");
+ return resourceCountResponse;
+ }
+
+ @Override
+ public ServiceOfferingResponse createServiceOfferingResponse(ServiceOffering offering) {
+ ServiceOfferingResponse offeringResponse = new ServiceOfferingResponse();
+ offeringResponse.setId(offering.getId());
+ offeringResponse.setName(offering.getName());
+ offeringResponse.setIsSystemOffering(offering.getSystemUse());
+ offeringResponse.setDefaultUse(offering.getDefaultUse());
+ offeringResponse.setSystemVmType(offering.getSystemVmType());
+ offeringResponse.setDisplayText(offering.getDisplayText());
+ offeringResponse.setCpuNumber(offering.getCpu());
+ offeringResponse.setCpuSpeed(offering.getSpeed());
+ offeringResponse.setMemory(offering.getRamSize());
+ offeringResponse.setCreated(offering.getCreated());
+ offeringResponse.setStorageType(offering.getUseLocalStorage() ? ServiceOffering.StorageType.local.toString() : ServiceOffering.StorageType.shared.toString());
+ offeringResponse.setOfferHa(offering.getOfferHA());
+ offeringResponse.setLimitCpuUse(offering.getLimitCpuUse());
+ offeringResponse.setTags(offering.getTags());
+ if (offering.getDomainId() != null) {
+ offeringResponse.setDomain(ApiDBUtils.findDomainById(offering.getDomainId()).getName());
+ offeringResponse.setDomainId(offering.getDomainId());
+ }
+ offeringResponse.setNetworkRate(offering.getRateMbps());
+ offeringResponse.setHostTag(offering.getHostTag());
+ offeringResponse.setObjectName("serviceoffering");
+
+ return offeringResponse;
+ }
+
+ @Override
+ public ConfigurationResponse createConfigurationResponse(Configuration cfg) {
+ ConfigurationResponse cfgResponse = new ConfigurationResponse();
+ cfgResponse.setCategory(cfg.getCategory());
+ cfgResponse.setDescription(cfg.getDescription());
+ cfgResponse.setName(cfg.getName());
+ cfgResponse.setValue(cfg.getValue());
+ cfgResponse.setObjectName("configuration");
+
+ return cfgResponse;
+ }
+
+ @Override
+ public SnapshotResponse createSnapshotResponse(Snapshot snapshot) {
+ SnapshotResponse snapshotResponse = new SnapshotResponse();
+ snapshotResponse.setId(snapshot.getId());
+
+ populateOwner(snapshotResponse, snapshot);
+
+ VolumeVO volume = findVolumeById(snapshot.getVolumeId());
+ String snapshotTypeStr = snapshot.getType().name();
+ snapshotResponse.setSnapshotType(snapshotTypeStr);
+ snapshotResponse.setVolumeId(snapshot.getVolumeId());
+ if (volume != null) {
+ snapshotResponse.setVolumeName(volume.getName());
+ snapshotResponse.setVolumeType(volume.getVolumeType().name());
+ }
+ snapshotResponse.setCreated(snapshot.getCreated());
+ snapshotResponse.setName(snapshot.getName());
+ snapshotResponse.setIntervalType(ApiDBUtils.getSnapshotIntervalTypes(snapshot.getId()));
+ snapshotResponse.setState(snapshot.getStatus());
+ snapshotResponse.setObjectName("snapshot");
+ return snapshotResponse;
+ }
+
+ @Override
+ public SnapshotPolicyResponse createSnapshotPolicyResponse(SnapshotPolicy policy) {
+ SnapshotPolicyResponse policyResponse = new SnapshotPolicyResponse();
+ policyResponse.setId(policy.getId());
+ policyResponse.setVolumeId(policy.getVolumeId());
+ policyResponse.setSchedule(policy.getSchedule());
+ policyResponse.setIntervalType(policy.getInterval());
+ policyResponse.setMaxSnaps(policy.getMaxSnaps());
+ policyResponse.setTimezone(policy.getTimezone());
+ policyResponse.setObjectName("snapshotpolicy");
+
+ return policyResponse;
+ }
+
+ @Override
+ public HostResponse createHostResponse(Host host) {
+ return createHostResponse(host, EnumSet.of(HostDetails.all));
+ }
+
+ @Override
+ public HostResponse createHostResponse(Host host, EnumSet details) {
+ HostResponse hostResponse = new HostResponse();
+ hostResponse.setId(host.getId());
+ hostResponse.setCapabilities(host.getCapabilities());
+ hostResponse.setClusterId(host.getClusterId());
+ hostResponse.setCpuNumber(host.getCpus());
+ hostResponse.setZoneId(host.getDataCenterId());
+ hostResponse.setDisconnectedOn(host.getDisconnectedOn());
+ hostResponse.setHypervisor(host.getHypervisorType());
+ hostResponse.setHostType(host.getType());
+ hostResponse.setLastPinged(new Date(host.getLastPinged()));
+ hostResponse.setManagementServerId(host.getManagementServerId());
+ hostResponse.setName(host.getName());
+ hostResponse.setPodId(host.getPodId());
+ hostResponse.setRemoved(host.getRemoved());
+ hostResponse.setCpuSpeed(host.getSpeed());
+ hostResponse.setState(host.getStatus());
+ hostResponse.setIpAddress(host.getPrivateIpAddress());
+ hostResponse.setVersion(host.getVersion());
+ hostResponse.setCreated(host.getCreated());
+
+ if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity)
+ || details.contains(HostDetails.stats) || details.contains(HostDetails.events)) {
+
+ GuestOSCategoryVO guestOSCategory = ApiDBUtils.getHostGuestOSCategory(host.getId());
+ if (guestOSCategory != null) {
+ hostResponse.setOsCategoryId(guestOSCategory.getId());
+ hostResponse.setOsCategoryName(guestOSCategory.getName());
+ }
+ hostResponse.setZoneName(ApiDBUtils.findZoneById(host.getDataCenterId()).getName());
+
+ if (host.getPodId() != null) {
+ HostPodVO pod = ApiDBUtils.findPodById(host.getPodId());
+ if (pod != null) {
+ hostResponse.setPodName(pod.getName());
+ }
+ }
+
+ if (host.getClusterId() != null) {
+ ClusterVO cluster = ApiDBUtils.findClusterById(host.getClusterId());
+ hostResponse.setClusterName(cluster.getName());
+ hostResponse.setClusterType(cluster.getClusterType().toString());
+ }
+ }
+
+ DecimalFormat decimalFormat = new DecimalFormat("#.##");
+ if (host.getType() == Host.Type.Routing) {
+
+ if (details.contains(HostDetails.all) || details.contains(HostDetails.capacity)) {
+ // set allocated capacities
+ Long mem = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_MEMORY);
+ Long cpu = ApiDBUtils.getMemoryOrCpuCapacitybyHost(host.getId(), Capacity.CAPACITY_TYPE_CPU);
+
+ hostResponse.setMemoryAllocated(mem);
+ hostResponse.setMemoryTotal(host.getTotalMemory());
+ hostResponse.setHostTags(ApiDBUtils.getHostTags(host.getId()));
+ hostResponse.setHypervisorVersion(host.getHypervisorVersion());
+
+ String cpuAlloc = decimalFormat.format(((float) cpu / (float) (host.getCpus() * host.getSpeed())) * 100f) + "%";
+ hostResponse.setCpuAllocated(cpuAlloc);
+ String cpuWithOverprovisioning = new Float(host.getCpus() * host.getSpeed() * ApiDBUtils.getCpuOverprovisioningFactor()).toString();
+ hostResponse.setCpuWithOverprovisioning(cpuWithOverprovisioning);
+ }
+
+ if (details.contains(HostDetails.all) || details.contains(HostDetails.stats)) {
+ // set CPU/RAM/Network stats
+ String cpuUsed = null;
+ HostStats hostStats = ApiDBUtils.getHostStatistics(host.getId());
+ if (hostStats != null) {
+ float cpuUtil = (float) hostStats.getCpuUtilization();
+ cpuUsed = decimalFormat.format(cpuUtil) + "%";
+ hostResponse.setCpuUsed(cpuUsed);
+ hostResponse.setMemoryUsed((new Double(hostStats.getUsedMemory())).longValue());
+ hostResponse.setNetworkKbsRead((new Double(hostStats.getNetworkReadKBs())).longValue());
+ hostResponse.setNetworkKbsWrite((new Double(hostStats.getNetworkWriteKBs())).longValue());
+
+ }
+ }
+
+ } else if (host.getType() == Host.Type.SecondaryStorage) {
+ StorageStats secStorageStats = ApiDBUtils.getSecondaryStorageStatistics(host.getId());
+ if (secStorageStats != null) {
+ hostResponse.setDiskSizeTotal(secStorageStats.getCapacityBytes());
+ hostResponse.setDiskSizeAllocated(secStorageStats.getByteUsed());
+ }
+ }
+
+ hostResponse.setLocalStorageActive(ApiDBUtils.isLocalStorageActiveOnHost(host));
+
+ if (details.contains(HostDetails.all) || details.contains(HostDetails.events)) {
+ Set possibleEvents = host.getStatus().getPossibleEvents();
+ if ((possibleEvents != null) && !possibleEvents.isEmpty()) {
+ String events = "";
+ Iterator iter = possibleEvents.iterator();
+ while (iter.hasNext()) {
+ com.cloud.host.Status.Event event = iter.next();
+ events += event.toString();
+ if (iter.hasNext()) {
+ events += "; ";
+ }
+ }
+ hostResponse.setEvents(events);
+ }
+ }
+
+ hostResponse.setResourceState(host.getResourceState().toString());
+
+ hostResponse.setObjectName("host");
+
+ return hostResponse;
+ }
+
+ @Override
+ public SwiftResponse createSwiftResponse(Swift swift) {
+ SwiftResponse swiftResponse = new SwiftResponse();
+ swiftResponse.setId(swift.getId());
+ swiftResponse.setUrl(swift.getUrl());
+ swiftResponse.setAccount(swift.getAccount());
+ swiftResponse.setUsername(swift.getUserName());
+ swiftResponse.setObjectName("swift");
+ return swiftResponse;
+ }
+
+ @Override
+ public VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan) {
+ Long podId = ApiDBUtils.getPodIdForVlan(vlan.getId());
+
+ VlanIpRangeResponse vlanResponse = new VlanIpRangeResponse();
+ vlanResponse.setId(vlan.getId());
+ vlanResponse.setForVirtualNetwork(vlan.getVlanType().equals(VlanType.VirtualNetwork));
+ vlanResponse.setVlan(vlan.getVlanTag());
+ vlanResponse.setZoneId(vlan.getDataCenterId());
+
+ if (podId != null) {
+ HostPodVO pod = ApiDBUtils.findPodById(podId);
+ vlanResponse.setPodId(podId);
+ if (pod != null) {
+ vlanResponse.setPodName(pod.getName());
+ }
+ }
+
+ vlanResponse.setGateway(vlan.getVlanGateway());
+ vlanResponse.setNetmask(vlan.getVlanNetmask());
+
+ // get start ip and end ip of corresponding vlan
+ String ipRange = vlan.getIpRange();
+ String[] range = ipRange.split("-");
+ vlanResponse.setStartIp(range[0]);
+ vlanResponse.setEndIp(range[1]);
+
+ vlanResponse.setNetworkId(vlan.getNetworkId());
+ Account owner = ApiDBUtils.getVlanAccount(vlan.getId());
+ if (owner != null) {
+ populateAccount(vlanResponse, owner.getId());
+ populateDomain(vlanResponse, owner.getDomainId());
+ }
+
+ vlanResponse.setPhysicalNetworkId(vlan.getPhysicalNetworkId());
+
+ vlanResponse.setObjectName("vlan");
+ return vlanResponse;
+ }
+
+ @Override
+ public IPAddressResponse createIPAddressResponse(IpAddress ipAddress) {
+ VlanVO vlan = ApiDBUtils.findVlanById(ipAddress.getVlanId());
+ boolean forVirtualNetworks = vlan.getVlanType().equals(VlanType.VirtualNetwork);
+ long zoneId = ipAddress.getDataCenterId();
+
+ IPAddressResponse ipResponse = new IPAddressResponse();
+ ipResponse.setId(ipAddress.getId());
+ ipResponse.setIpAddress(ipAddress.getAddress().toString());
+ if (ipAddress.getAllocatedTime() != null) {
+ ipResponse.setAllocated(ipAddress.getAllocatedTime());
+ }
+ ipResponse.setZoneId(zoneId);
+ ipResponse.setZoneName(ApiDBUtils.findZoneById(ipAddress.getDataCenterId()).getName());
+ ipResponse.setSourceNat(ipAddress.isSourceNat());
+ ipResponse.setIsSystem(ipAddress.getSystem());
+
+ // get account information
+ populateOwner(ipResponse, ipAddress);
+
+ ipResponse.setForVirtualNetwork(forVirtualNetworks);
+ ipResponse.setStaticNat(ipAddress.isOneToOneNat());
+
+ if (ipAddress.getAssociatedWithVmId() != null) {
+ UserVm vm = ApiDBUtils.findUserVmById(ipAddress.getAssociatedWithVmId());
+ ipResponse.setVirtualMachineId(vm.getId());
+ ipResponse.setVirtualMachineName(vm.getHostName());
+ if (vm.getDisplayName() != null) {
+ ipResponse.setVirtualMachineDisplayName(vm.getDisplayName());
+ } else {
+ ipResponse.setVirtualMachineDisplayName(vm.getHostName());
+ }
+ }
+
+ ipResponse.setAssociatedNetworkId(ipAddress.getAssociatedWithNetworkId());
+
+ // Network id the ip is associated withif associated networkId is null, try to get this information from vlan
+ Long associatedNetworkId = ipAddress.getAssociatedWithNetworkId();
+ Long vlanNetworkId = ApiDBUtils.getVlanNetworkId(ipAddress.getVlanId());
+ if (associatedNetworkId == null) {
+ associatedNetworkId = vlanNetworkId;
+ }
+
+ ipResponse.setAssociatedNetworkId(associatedNetworkId);
+
+ // Network id the ip belongs to
+ Long networkId;
+ if (vlanNetworkId != null) {
+ networkId = vlanNetworkId;
+ } else {
+ networkId = ApiDBUtils.getPublicNetworkIdByZone(zoneId);
+ }
+
+ ipResponse.setNetworkId(networkId);
+ ipResponse.setState(ipAddress.getState().toString());
+ ipResponse.setPhysicalNetworkId(ipAddress.getPhysicalNetworkId());
+
+ // show this info to admin only
+ Account account = UserContext.current().getCaller();
+ if ((account == null) || account.getType() == Account.ACCOUNT_TYPE_ADMIN) {
+ ipResponse.setVlanId(ipAddress.getVlanId());
+ ipResponse.setVlanName(ApiDBUtils.findVlanById(ipAddress.getVlanId()).getVlanTag());
+ }
+
+ if (ipAddress.getSystem()) {
+ if (ipAddress.isOneToOneNat()) {
+ ipResponse.setPurpose(IpAddress.Purpose.StaticNat.toString());
+ } else {
+ ipResponse.setPurpose(IpAddress.Purpose.Lb.toString());
+ }
+ }
+
+ ipResponse.setObjectName("ipaddress");
+ return ipResponse;
+ }
+
+ @Override
+ public LoadBalancerResponse createLoadBalancerResponse(LoadBalancer loadBalancer) {
+ LoadBalancerResponse lbResponse = new LoadBalancerResponse();
+ lbResponse.setId(loadBalancer.getId());
+ lbResponse.setName(loadBalancer.getName());
+ lbResponse.setDescription(loadBalancer.getDescription());
+ List cidrs = ApiDBUtils.findFirewallSourceCidrs(loadBalancer.getId());
+ lbResponse.setCidrList(StringUtils.join(cidrs, ","));
+
+ IPAddressVO publicIp = ApiDBUtils.findIpAddressById(loadBalancer.getSourceIpAddressId());
+ lbResponse.setPublicIpId(publicIp.getId());
+ lbResponse.setPublicIp(publicIp.getAddress().addr());
+ lbResponse.setPublicPort(Integer.toString(loadBalancer.getSourcePortStart()));
+ lbResponse.setPrivatePort(Integer.toString(loadBalancer.getDefaultPortStart()));
+ lbResponse.setAlgorithm(loadBalancer.getAlgorithm());
+ FirewallRule.State state = loadBalancer.getState();
+ String stateToSet = state.toString();
+ if (state.equals(FirewallRule.State.Revoke)) {
+ stateToSet = "Deleting";
+ }
+ lbResponse.setState(stateToSet);
+ populateOwner(lbResponse, loadBalancer);
+ lbResponse.setZoneId(publicIp.getDataCenterId());
+
+ lbResponse.setObjectName("loadbalancer");
+ return lbResponse;
+ }
+
+ @Override
+ public PodResponse createPodResponse(Pod pod, Boolean showCapacities) {
+ String[] ipRange = new String[2];
+ if (pod.getDescription() != null && pod.getDescription().length() > 0) {
+ ipRange = pod.getDescription().split("-");
+ } else {
+ ipRange[0] = pod.getDescription();
+ }
+
+ PodResponse podResponse = new PodResponse();
+ podResponse.setId(pod.getId());
+ podResponse.setName(pod.getName());
+ podResponse.setZoneId(pod.getDataCenterId());
+ podResponse.setZoneName(PodZoneConfig.getZoneName(pod.getDataCenterId()));
+ podResponse.setNetmask(NetUtils.getCidrNetmask(pod.getCidrSize()));
+ podResponse.setStartIp(ipRange[0]);
+ podResponse.setEndIp(((ipRange.length > 1) && (ipRange[1] != null)) ? ipRange[1] : "");
+ podResponse.setGateway(pod.getGateway());
+ podResponse.setAllocationState(pod.getAllocationState().toString());
+ if (showCapacities != null && showCapacities) {
+ List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, pod.getId(), null);
+ Set capacityResponses = new HashSet();
+ float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor();
+
+ for (SummedCapacity capacity : capacities) {
+ CapacityResponse capacityResponse = new CapacityResponse();
+ capacityResponse.setCapacityType(capacity.getCapacityType());
+ capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
+ if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) {
+ capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor)));
+ } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) {
+ List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, pod.getId(), null);
+ capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity());
+ capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity());
+ } else {
+ capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
+ }
+ if (capacityResponse.getCapacityTotal() != 0) {
+ capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
+ } else {
+ capacityResponse.setPercentUsed(s_percentFormat.format(0L));
+ }
+ capacityResponses.add(capacityResponse);
+ }
+ // Do it for stats as well.
+ capacityResponses.addAll(getStatsCapacityresponse(null, null, pod.getId(), pod.getDataCenterId()));
+ podResponse.setCapacitites(new ArrayList(capacityResponses));
+ }
+ podResponse.setObjectName("pod");
+ return podResponse;
+ }
+
+ @Override
+ public ZoneResponse createZoneResponse(DataCenter dataCenter, Boolean showCapacities) {
+ Account account = UserContext.current().getCaller();
+ ZoneResponse zoneResponse = new ZoneResponse();
+ zoneResponse.setId(dataCenter.getId());
+ zoneResponse.setName(dataCenter.getName());
+ zoneResponse.setSecurityGroupsEnabled(ApiDBUtils.isSecurityGroupEnabledInZone(dataCenter.getId()));
+
+ if ((dataCenter.getDescription() != null) && !dataCenter.getDescription().equalsIgnoreCase("null")) {
+ zoneResponse.setDescription(dataCenter.getDescription());
+ }
+
+ if ((account == null) || (account.getType() == Account.ACCOUNT_TYPE_ADMIN)) {
+ zoneResponse.setDns1(dataCenter.getDns1());
+ zoneResponse.setDns2(dataCenter.getDns2());
+ zoneResponse.setInternalDns1(dataCenter.getInternalDns1());
+ zoneResponse.setInternalDns2(dataCenter.getInternalDns2());
+ // FIXME zoneResponse.setVlan(dataCenter.get.getVnet());
+ zoneResponse.setGuestCidrAddress(dataCenter.getGuestNetworkCidr());
+ }
+
+ if (showCapacities != null && showCapacities) {
+ List capacities = ApiDBUtils.getCapacityByClusterPodZone(dataCenter.getId(), null, null);
+ Set capacityResponses = new HashSet();
+ float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor();
+
+ for (SummedCapacity capacity : capacities) {
+ CapacityResponse capacityResponse = new CapacityResponse();
+ capacityResponse.setCapacityType(capacity.getCapacityType());
+ capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
+ if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) {
+ capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor)));
+ } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) {
+ List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(dataCenter.getId(), null, null);
+ capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity());
+ capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity());
+ } else {
+ capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
+ }
+ if (capacityResponse.getCapacityTotal() != 0) {
+ capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
+ } else {
+ capacityResponse.setPercentUsed(s_percentFormat.format(0L));
+ }
+ capacityResponses.add(capacityResponse);
+ }
+ // Do it for stats as well.
+ capacityResponses.addAll(getStatsCapacityresponse(null, null, null, dataCenter.getId()));
+
+ zoneResponse.setCapacitites(new ArrayList(capacityResponses));
+ }
+
+ // set network domain info
+ zoneResponse.setDomain(dataCenter.getDomain());
+
+ // set domain info
+ Long domainId = dataCenter.getDomainId();
+ if (domainId != null) {
+ Domain domain = ApiDBUtils.findDomainById(domainId);
+ zoneResponse.setDomainId(domain.getId());
+ zoneResponse.setDomainName(domain.getName());
+ }
+
+ zoneResponse.setType(dataCenter.getNetworkType().toString());
+ zoneResponse.setAllocationState(dataCenter.getAllocationState().toString());
+ zoneResponse.setZoneToken(dataCenter.getZoneToken());
+ zoneResponse.setDhcpProvider(dataCenter.getDhcpProvider());
+ zoneResponse.setObjectName("zone");
+ return zoneResponse;
+ }
+
+ private List getStatsCapacityresponse(Long poolId, Long clusterId, Long podId, Long zoneId) {
+ List capacities = new ArrayList();
+ capacities.add(ApiDBUtils.getStoragePoolUsedStats(poolId, clusterId, podId, zoneId));
+ if (clusterId == null && podId == null) {
+ capacities.add(ApiDBUtils.getSecondaryStorageUsedStats(poolId, zoneId));
+ }
+
+ List capacityResponses = new ArrayList();
+ for (CapacityVO capacity : capacities) {
+ CapacityResponse capacityResponse = new CapacityResponse();
+ capacityResponse.setCapacityType(capacity.getCapacityType());
+ capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
+ capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
+ if (capacityResponse.getCapacityTotal() != 0) {
+ capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
+ } else {
+ capacityResponse.setPercentUsed(s_percentFormat.format(0L));
+ }
+ capacityResponses.add(capacityResponse);
+ }
+
+ return capacityResponses;
+ }
+
+ @Override
+ public VolumeResponse createVolumeResponse(Volume volume) {
+ VolumeResponse volResponse = new VolumeResponse();
+ volResponse.setId(volume.getId());
+
+ if (volume.getName() != null) {
+ volResponse.setName(volume.getName());
+ } else {
+ volResponse.setName("");
+ }
+
+ volResponse.setZoneId(volume.getDataCenterId());
+ volResponse.setZoneName(ApiDBUtils.findZoneById(volume.getDataCenterId()).getName());
+
+ volResponse.setVolumeType(volume.getVolumeType().toString());
+ volResponse.setDeviceId(volume.getDeviceId());
+
+ Long instanceId = volume.getInstanceId();
+ if (instanceId != null && volume.getState() != Volume.State.Destroy) {
+ VMInstanceVO vm = ApiDBUtils.findVMInstanceById(instanceId);
+ if (vm != null) {
+ volResponse.setVirtualMachineId(vm.getId());
+ volResponse.setVirtualMachineName(vm.getHostName());
+ UserVm userVm = ApiDBUtils.findUserVmById(vm.getId());
+ if (userVm != null) {
+ if (userVm.getDisplayName() != null) {
+ volResponse.setVirtualMachineDisplayName(userVm.getDisplayName());
+ } else {
+ volResponse.setVirtualMachineDisplayName(userVm.getHostName());
+ }
+ volResponse.setVirtualMachineState(vm.getState().toString());
+ } else {
+ s_logger.error("User Vm with Id: " + instanceId + " does not exist for volume " + volume.getId());
+ }
+ } else {
+ s_logger.error("Vm with Id: " + instanceId + " does not exist for volume " + volume.getId());
+ }
+ }
+
+ // Show the virtual size of the volume
+ volResponse.setSize(volume.getSize());
+
+ volResponse.setCreated(volume.getCreated());
+ volResponse.setState(volume.getState().toString());
+
+ populateOwner(volResponse, volume);
+
+ String storageType;
+ try {
+ if (volume.getPoolId() == null) {
+ if (volume.getState() == Volume.State.Allocated) {
+ /* set it as shared, so the UI can attach it to VM */
+ storageType = "shared";
+ } else {
+ storageType = "unknown";
+ }
+ } else {
+ storageType = ApiDBUtils.volumeIsOnSharedStorage(volume.getId()) ? ServiceOffering.StorageType.shared.toString() : ServiceOffering.StorageType.local.toString();
+ }
+ } catch (InvalidParameterValueException e) {
+ s_logger.error(e.getMessage(), e);
+ throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Volume " + volume.getName() + " does not have a valid ID");
+ }
+
+ volResponse.setStorageType(storageType);
+ if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
+ volResponse.setServiceOfferingId(volume.getDiskOfferingId());
+ } else {
+ volResponse.setDiskOfferingId(volume.getDiskOfferingId());
+ }
+
+ DiskOfferingVO diskOffering = ApiDBUtils.findDiskOfferingById(volume.getDiskOfferingId());
+ if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
+ volResponse.setServiceOfferingName(diskOffering.getName());
+ volResponse.setServiceOfferingDisplayText(diskOffering.getDisplayText());
+ } else {
+ volResponse.setDiskOfferingName(diskOffering.getName());
+ volResponse.setDiskOfferingDisplayText(diskOffering.getDisplayText());
+ }
+
+ Long poolId = volume.getPoolId();
+ String poolName = (poolId == null) ? "none" : ApiDBUtils.findStoragePoolById(poolId).getName();
+ volResponse.setStoragePoolName(poolName);
+ // volResponse.setSourceId(volume.getSourceId());
+ // if (volume.getSourceType() != null) {
+ // volResponse.setSourceType(volume.getSourceType().toString());
+ // }
+
+ // return hypervisor for ROOT and Resource domain only
+ Account caller = UserContext.current().getCaller();
+ if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+ volResponse.setHypervisor(ApiDBUtils.getVolumeHyperType(volume.getId()).toString());
+ }
+
+ volResponse.setAttached(volume.getAttached());
+ volResponse.setDestroyed(volume.getState() == Volume.State.Destroy);
+ VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
+ boolean isExtractable = template != null && template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM);
+ volResponse.setExtractable(isExtractable);
+ volResponse.setObjectName("volume");
+ return volResponse;
+ }
+
+ @Override
+ public InstanceGroupResponse createInstanceGroupResponse(InstanceGroup group) {
+ InstanceGroupResponse groupResponse = new InstanceGroupResponse();
+ groupResponse.setId(group.getId());
+ groupResponse.setName(group.getName());
+ groupResponse.setCreated(group.getCreated());
+
+ populateOwner(groupResponse, group);
+
+ groupResponse.setObjectName("instancegroup");
+ return groupResponse;
+ }
+
+ @Override
+ public StoragePoolResponse createStoragePoolResponse(StoragePool pool) {
+ StoragePoolResponse poolResponse = new StoragePoolResponse();
+ poolResponse.setId(pool.getId());
+ poolResponse.setName(pool.getName());
+ poolResponse.setState(pool.getStatus());
+ poolResponse.setPath(pool.getPath());
+ poolResponse.setIpAddress(pool.getHostAddress());
+ poolResponse.setZoneId(pool.getDataCenterId());
+ poolResponse.setZoneName(ApiDBUtils.findZoneById(pool.getDataCenterId()).getName());
+ if (pool.getPoolType() != null) {
+ poolResponse.setType(pool.getPoolType().toString());
+ }
+ if (pool.getPodId() != null) {
+ poolResponse.setPodId(pool.getPodId());
+ HostPodVO pod = ApiDBUtils.findPodById(pool.getPodId());
+ if (pod != null) {
+ poolResponse.setPodName(pod.getName());
+ }
+ }
+ if (pool.getCreated() != null) {
+ poolResponse.setCreated(pool.getCreated());
+ }
+
+ StorageStats stats = ApiDBUtils.getStoragePoolStatistics(pool.getId());
+ long allocatedSize = ApiDBUtils.getStorageCapacitybyPool(pool.getId(), Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED);
+ poolResponse.setDiskSizeTotal(pool.getCapacityBytes());
+ poolResponse.setDiskSizeAllocated(allocatedSize);
+
+ if (stats != null) {
+ Long used = stats.getByteUsed();
+ poolResponse.setDiskSizeUsed(used);
+ }
+
+ if (pool.getClusterId() != null) {
+ ClusterVO cluster = ApiDBUtils.findClusterById(pool.getClusterId());
+ poolResponse.setClusterId(cluster.getId());
+ poolResponse.setClusterName(cluster.getName());
+ }
+ poolResponse.setTags(ApiDBUtils.getStoragePoolTags(pool.getId()));
+ poolResponse.setObjectName("storagepool");
+ return poolResponse;
+ }
+
+ @Override
+ public ClusterResponse createClusterResponse(Cluster cluster, Boolean showCapacities) {
+ ClusterResponse clusterResponse = new ClusterResponse();
+ clusterResponse.setId(cluster.getId());
+ clusterResponse.setName(cluster.getName());
+ clusterResponse.setPodId(cluster.getPodId());
+ clusterResponse.setZoneId(cluster.getDataCenterId());
+ clusterResponse.setHypervisorType(cluster.getHypervisorType().toString());
+ clusterResponse.setClusterType(cluster.getClusterType().toString());
+ clusterResponse.setAllocationState(cluster.getAllocationState().toString());
+ clusterResponse.setManagedState(cluster.getManagedState().toString());
+ HostPodVO pod = ApiDBUtils.findPodById(cluster.getPodId());
+ if (pod != null) {
+ clusterResponse.setPodName(pod.getName());
+ }
+ DataCenterVO zone = ApiDBUtils.findZoneById(cluster.getDataCenterId());
+ clusterResponse.setZoneName(zone.getName());
+ if (showCapacities != null && showCapacities) {
+ List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, null, cluster.getId());
+ Set capacityResponses = new HashSet();
+ float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor();
+
+ for (SummedCapacity capacity : capacities) {
+ CapacityResponse capacityResponse = new CapacityResponse();
+ capacityResponse.setCapacityType(capacity.getCapacityType());
+ capacityResponse.setCapacityUsed(capacity.getUsedCapacity());
+
+ if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) {
+ capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * cpuOverprovisioningFactor)));
+ } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) {
+ List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, null, cluster.getId());
+ capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity());
+ capacityResponse.setCapacityUsed(capacity.getUsedCapacity() - c.get(0).getUsedCapacity());
+ } else {
+ capacityResponse.setCapacityTotal(capacity.getTotalCapacity());
+ }
+ if (capacityResponse.getCapacityTotal() != 0) {
+ capacityResponse.setPercentUsed(s_percentFormat.format((float) capacityResponse.getCapacityUsed() / (float) capacityResponse.getCapacityTotal() * 100f));
+ } else {
+ capacityResponse.setPercentUsed(s_percentFormat.format(0L));
+ }
+ capacityResponses.add(capacityResponse);
+ }
+ // Do it for stats as well.
+ capacityResponses.addAll(getStatsCapacityresponse(null, cluster.getId(), pod.getId(), pod.getDataCenterId()));
+ clusterResponse.setCapacitites(new ArrayList(capacityResponses));
+ }
+ clusterResponse.setObjectName("cluster");
+ return clusterResponse;
+ }
+
+ @Override
+ public FirewallRuleResponse createPortForwardingRuleResponse(PortForwardingRule fwRule) {
+ FirewallRuleResponse response = new FirewallRuleResponse();
+ response.setId(fwRule.getId());
+ response.setPrivateStartPort(Integer.toString(fwRule.getDestinationPortStart()));
+ response.setPrivateEndPort(Integer.toString(fwRule.getDestinationPortEnd()));
+ response.setProtocol(fwRule.getProtocol());
+ response.setPublicStartPort(Integer.toString(fwRule.getSourcePortStart()));
+ response.setPublicEndPort(Integer.toString(fwRule.getSourcePortEnd()));
+ List cidrs = ApiDBUtils.findFirewallSourceCidrs(fwRule.getId());
+ response.setCidrList(StringUtils.join(cidrs, ","));
+
+ IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId());
+ response.setPublicIpAddressId(ip.getId());
+ response.setPublicIpAddress(ip.getAddress().addr());
+
+ if (ip != null && fwRule.getDestinationIpAddress() != null) {
+ UserVm vm = ApiDBUtils.findUserVmById(fwRule.getVirtualMachineId());
+ if (vm != null) {
+ response.setVirtualMachineId(vm.getId());
+ response.setVirtualMachineName(vm.getHostName());
+
+ if (vm.getDisplayName() != null) {
+ response.setVirtualMachineDisplayName(vm.getDisplayName());
+ } else {
+ response.setVirtualMachineDisplayName(vm.getHostName());
+ }
+ }
+ }
+ FirewallRule.State state = fwRule.getState();
+ String stateToSet = state.toString();
+ if (state.equals(FirewallRule.State.Revoke)) {
+ stateToSet = "Deleting";
+ }
+ response.setState(stateToSet);
+ response.setObjectName("portforwardingrule");
+ return response;
+ }
+
+ @Override
+ public IpForwardingRuleResponse createIpForwardingRuleResponse(StaticNatRule fwRule) {
+ IpForwardingRuleResponse response = new IpForwardingRuleResponse();
+ response.setId(fwRule.getId());
+ response.setProtocol(fwRule.getProtocol());
+
+ IpAddress ip = ApiDBUtils.findIpAddressById(fwRule.getSourceIpAddressId());
+ response.setPublicIpAddressId(ip.getId());
+ response.setPublicIpAddress(ip.getAddress().addr());
+
+ if (ip != null && fwRule.getDestIpAddress() != null) {
+ UserVm vm = ApiDBUtils.findUserVmById(ip.getAssociatedWithVmId());
+ if (vm != null) {// vm might be destroyed
+ response.setVirtualMachineId(vm.getId());
+ response.setVirtualMachineName(vm.getHostName());
+ if (vm.getDisplayName() != null) {
+ response.setVirtualMachineDisplayName(vm.getDisplayName());
+ } else {
+ response.setVirtualMachineDisplayName(vm.getHostName());
+ }
+ }
+ }
+ FirewallRule.State state = fwRule.getState();
+ String stateToSet = state.toString();
+ if (state.equals(FirewallRule.State.Revoke)) {
+ stateToSet = "Deleting";
+ }
+
+ response.setStartPort(fwRule.getSourcePortStart());
+ response.setEndPort(fwRule.getSourcePortEnd());
+ response.setProtocol(fwRule.getProtocol());
+ response.setState(stateToSet);
+ response.setObjectName("ipforwardingrule");
+ return response;
+ }
+
+ @Override
+ public List createUserVmResponse(String objectName, EnumSet details, UserVm... userVms) {
+ Account caller = UserContext.current().getCaller();
+ Map dataCenters = new HashMap();
+ Map hosts = new HashMap();
+ Map templates = new HashMap();
+ Map serviceOfferings = new HashMap();
+ Map networks = new HashMap();
+
+ List vmResponses = new ArrayList();
+
+ for (UserVm userVm : userVms) {
+ UserVmResponse userVmResponse = new UserVmResponse();
+ Account acct = ApiDBUtils.findAccountById(Long.valueOf(userVm.getAccountId()));
+ if (acct != null) {
+ userVmResponse.setAccountName(acct.getAccountName());
+ userVmResponse.setDomainId(acct.getDomainId());
+ userVmResponse.setDomainName(ApiDBUtils.findDomainById(acct.getDomainId()).getName());
+ }
+
+ userVmResponse.setId(userVm.getId());
+ userVmResponse.setName(userVm.getHostName());
+ userVmResponse.setCreated(userVm.getCreated());
+
+ userVmResponse.setHaEnable(userVm.isHaEnabled());
+
+ if (userVm.getDisplayName() != null) {
+ userVmResponse.setDisplayName(userVm.getDisplayName());
+ } else {
+ userVmResponse.setDisplayName(userVm.getHostName());
+ }
+
+ if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN) {
+ userVmResponse.setInstanceName(userVm.getInstanceName());
+ }
+
+
+ if (userVm.getPassword() != null) {
+ userVmResponse.setPassword(userVm.getPassword());
+ }
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.group)) {
+ InstanceGroupVO group = ApiDBUtils.findInstanceGroupForVM(userVm.getId());
+ if (group != null) {
+ userVmResponse.setGroup(group.getName());
+ userVmResponse.setGroupId(group.getId());
+ }
+
+ }
+
+ // Data Center Info
+ DataCenter zone = dataCenters.get(userVm.getDataCenterIdToDeployIn());
+ if (zone == null) {
+ zone = ApiDBUtils.findZoneById(userVm.getDataCenterIdToDeployIn());
+ dataCenters.put(zone.getId(), zone);
+ }
+
+ userVmResponse.setZoneId(zone.getId());
+ userVmResponse.setZoneName(zone.getName());
+
+ // if user is an admin, display host id
+ if (((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN)) && (userVm.getHostId() != null)) {
+ Host host = hosts.get(userVm.getHostId());
+
+ if (host == null) {
+ host = ApiDBUtils.findHostById(userVm.getHostId());
+ hosts.put(host.getId(), host);
+ }
+
+ userVmResponse.setHostId(host.getId());
+ userVmResponse.setHostName(host.getName());
+ }
+
+ if (userVm.getState() != null) {
+ if (userVm.getHostId() != null) {
+ Host host = hosts.get(userVm.getHostId());
+
+ if (host == null) {
+ host = ApiDBUtils.findHostById(userVm.getHostId());
+ hosts.put(host.getId(), host);
+ }
+ if (host.getStatus() != com.cloud.host.Status.Up) {
+ userVmResponse.setState(VirtualMachine.State.Unknown.toString());
+ } else {
+ userVmResponse.setState(userVm.getState().toString());
+ }
+ } else {
+ userVmResponse.setState(userVm.getState().toString());
+ }
+ }
+
+ if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+ if (userVm.getHypervisorType() != null) {
+ userVmResponse.setHypervisor(userVm.getHypervisorType().toString());
+ }
+ }
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.tmpl)) {
+ // Template Info
+ VMTemplateVO template = templates.get(userVm.getTemplateId());
+ if (template == null) {
+ template = ApiDBUtils.findTemplateById(userVm.getTemplateId());
+ if (template != null) {
+ templates.put(template.getId(), template);
+ }
+ }
+
+ if (template != null) {
+ userVmResponse.setTemplateId(userVm.getTemplateId());
+ userVmResponse.setTemplateName(template.getName());
+ userVmResponse.setTemplateDisplayText(template.getDisplayText());
+ userVmResponse.setPasswordEnabled(template.getEnablePassword());
+ } else {
+ userVmResponse.setTemplateId(-1L);
+ userVmResponse.setTemplateName("ISO Boot");
+ userVmResponse.setTemplateDisplayText("ISO Boot");
+ userVmResponse.setPasswordEnabled(false);
+ }
+ }
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.iso)) {
+ // ISO Info
+ VMTemplateVO iso = templates.get(userVm.getIsoId());
+ if (iso == null) {
+ iso = ApiDBUtils.findTemplateById(userVm.getIsoId());
+ if (iso != null) {
+ templates.put(iso.getId(), iso);
+ }
+ }
+
+ if (iso != null) {
+ userVmResponse.setIsoId(iso.getId());
+ userVmResponse.setIsoName(iso.getName());
+ }
+ }
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.servoff)) {
+ // Service Offering Info
+ ServiceOffering offering = serviceOfferings.get(userVm.getServiceOfferingId());
+
+ if (offering == null) {
+ offering = ApiDBUtils.findServiceOfferingById(userVm.getServiceOfferingId());
+ serviceOfferings.put(offering.getId(), offering);
+ }
+
+ userVmResponse.setServiceOfferingId(offering.getId());
+ userVmResponse.setServiceOfferingName(offering.getName());
+ userVmResponse.setCpuNumber(offering.getCpu());
+ userVmResponse.setCpuSpeed(offering.getSpeed());
+ userVmResponse.setMemory(offering.getRamSize());
+ }
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.volume)) {
+ VolumeVO rootVolume = ApiDBUtils.findRootVolume(userVm.getId());
+ if (rootVolume != null) {
+ userVmResponse.setRootDeviceId(rootVolume.getDeviceId());
+ String rootDeviceType = "Not created";
+ if (rootVolume.getPoolId() != null) {
+ StoragePoolVO storagePool = ApiDBUtils.findStoragePoolById(rootVolume.getPoolId());
+ rootDeviceType = storagePool.getPoolType().toString();
+ }
+ userVmResponse.setRootDeviceType(rootDeviceType);
+ }
+ }
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.stats)) {
+ // stats calculation
+ DecimalFormat decimalFormat = new DecimalFormat("#.##");
+ String cpuUsed = null;
+ VmStats vmStats = ApiDBUtils.getVmStatistics(userVm.getId());
+ if (vmStats != null) {
+ float cpuUtil = (float) vmStats.getCPUUtilization();
+ cpuUsed = decimalFormat.format(cpuUtil) + "%";
+ userVmResponse.setCpuUsed(cpuUsed);
+
+ Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs());
+ userVmResponse.setNetworkKbsRead(networkKbRead.longValue());
+
+ Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs());
+ userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue());
+ }
+ }
+
+ userVmResponse.setGuestOsId(userVm.getGuestOSId());
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.secgrp)) {
+ // security groups - list only when zone is security group enabled
+ if (zone.isSecurityGroupEnabled()) {
+ List securityGroups = ApiDBUtils.getSecurityGroupsForVm(userVm.getId());
+ List securityGroupResponse = new ArrayList();
+ for (SecurityGroupVO grp : securityGroups) {
+ SecurityGroupResponse resp = new SecurityGroupResponse();
+ resp.setId(grp.getId());
+ resp.setName(grp.getName());
+ resp.setDescription(grp.getDescription());
+ resp.setObjectName("securitygroup");
+ securityGroupResponse.add(resp);
+ }
+ userVmResponse.setSecurityGroupList(securityGroupResponse);
+ }
+ }
+
+ if (details.contains(VMDetails.all) || details.contains(VMDetails.nics)) {
+ List nicProfiles = ApiDBUtils.getNics(userVm);
+ List nicResponses = new ArrayList();
+ for (NicProfile singleNicProfile : nicProfiles) {
+ NicResponse nicResponse = new NicResponse();
+ nicResponse.setId(singleNicProfile.getId());
+ nicResponse.setIpaddress(singleNicProfile.getIp4Address());
+ nicResponse.setGateway(singleNicProfile.getGateway());
+ nicResponse.setNetmask(singleNicProfile.getNetmask());
+ nicResponse.setNetworkid(singleNicProfile.getNetworkId());
+ if (acct.getType() == Account.ACCOUNT_TYPE_ADMIN) {
+ if (singleNicProfile.getBroadCastUri() != null) {
+ nicResponse.setBroadcastUri(singleNicProfile.getBroadCastUri().toString());
+ }
+ if (singleNicProfile.getIsolationUri() != null) {
+ nicResponse.setIsolationUri(singleNicProfile.getIsolationUri().toString());
+ }
+ }
+
+ // Long networkId = singleNicProfile.getNetworkId();
+ Network network = networks.get(singleNicProfile.getNetworkId());
+ if (network == null) {
+ network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId());
+ networks.put(singleNicProfile.getNetworkId(), network);
+ }
+
+ nicResponse.setTrafficType(network.getTrafficType().toString());
+ nicResponse.setType(network.getGuestType().toString());
+ nicResponse.setIsDefault(singleNicProfile.isDefaultNic());
+ nicResponse.setObjectName("nic");
+ nicResponses.add(nicResponse);
+ }
+ userVmResponse.setNics(nicResponses);
+ }
+
+ IpAddress ip = ApiDBUtils.findIpByAssociatedVmId(userVm.getId());
+ if (ip != null) {
+ userVmResponse.setPublicIpId(ip.getId());
+ userVmResponse.setPublicIp(ip.getAddress().addr());
+ }
+
+ userVmResponse.setObjectName(objectName);
+ vmResponses.add(userVmResponse);
+ }
+
+ return vmResponses;
+ }
+
+ @Override
+ public List createUserVmResponse(String objectName, UserVm... userVms) {
+ Account caller = UserContext.current().getCaller();
+ boolean caller_is_admin = ((caller == null) || (caller.getType() == Account.ACCOUNT_TYPE_ADMIN));
+
+ Hashtable vmDataList = new Hashtable();
+ // Initialise the vmdatalist with the input data
+ for (UserVm userVm : userVms) {
+ UserVmData userVmData = newUserVmData(userVm);
+ vmDataList.put(userVm.getId(), userVmData);
+ }
+
+ vmDataList = ApiDBUtils.listVmDetails(vmDataList);
+
+ // initialize vmresponse from vmdatalist
+ List vmResponses = new ArrayList();
+ DecimalFormat decimalFormat = new DecimalFormat("#.##");
+ for (UserVmData uvd : vmDataList.values()) {
+ UserVmResponse userVmResponse = newUserVmResponse(uvd, caller_is_admin);
+
+ // stats calculation
+ String cpuUsed = null;
+ // VmStats vmStats = ApiDBUtils.getVmStatistics(userVmResponse.getId());
+ VmStats vmStats = ApiDBUtils.getVmStatistics(uvd.getId());
+ if (vmStats != null) {
+ float cpuUtil = (float) vmStats.getCPUUtilization();
+ cpuUsed = decimalFormat.format(cpuUtil) + "%";
+ userVmResponse.setCpuUsed(cpuUsed);
+
+ Double networkKbRead = Double.valueOf(vmStats.getNetworkReadKBs());
+ userVmResponse.setNetworkKbsRead(networkKbRead.longValue());
+
+ Double networkKbWrite = Double.valueOf(vmStats.getNetworkWriteKBs());
+ userVmResponse.setNetworkKbsWrite(networkKbWrite.longValue());
+ }
+ userVmResponse.setObjectName(objectName);
+
+ vmResponses.add(userVmResponse);
+ }
+ return vmResponses;
+ }
+
+ @Override
+ public DomainRouterResponse createDomainRouterResponse(VirtualRouter router) {
+ Account caller = UserContext.current().getCaller();
+ Map serviceOfferings = new HashMap();
+
+ DomainRouterResponse routerResponse = new DomainRouterResponse();
+ routerResponse.setId(router.getId());
+ routerResponse.setZoneId(router.getDataCenterIdToDeployIn());
+ routerResponse.setName(router.getHostName());
+ routerResponse.setTemplateId(router.getTemplateId());
+ routerResponse.setCreated(router.getCreated());
+ routerResponse.setState(router.getState());
+ routerResponse.setIsRedundantRouter(router.getIsRedundantRouter());
+ routerResponse.setRedundantState(router.getRedundantState().toString());
+
+ if (caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_ADMIN) {
+ if (router.getHostId() != null) {
+ routerResponse.setHostId(router.getHostId());
+ routerResponse.setHostName(ApiDBUtils.findHostById(router.getHostId()).getName());
+ }
+ routerResponse.setPodId(router.getPodIdToDeployIn());
+ List nicProfiles = ApiDBUtils.getNics(router);
+ for (NicProfile singleNicProfile : nicProfiles) {
+ Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId());
+ if (network != null) {
+ if (network.getTrafficType() == TrafficType.Public) {
+ routerResponse.setPublicIp(singleNicProfile.getIp4Address());
+ routerResponse.setPublicMacAddress(singleNicProfile.getMacAddress());
+ routerResponse.setPublicNetmask(singleNicProfile.getNetmask());
+ routerResponse.setGateway(singleNicProfile.getGateway());
+ routerResponse.setPublicNetworkId(singleNicProfile.getNetworkId());
+ } else if (network.getTrafficType() == TrafficType.Control) {
+ routerResponse.setLinkLocalIp(singleNicProfile.getIp4Address());
+ routerResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress());
+ routerResponse.setLinkLocalNetmask(singleNicProfile.getNetmask());
+ routerResponse.setLinkLocalNetworkId(singleNicProfile.getNetworkId());
+ } else if (network.getTrafficType() == TrafficType.Guest) {
+ routerResponse.setGuestIpAddress(singleNicProfile.getIp4Address());
+ routerResponse.setGuestMacAddress(singleNicProfile.getMacAddress());
+ routerResponse.setGuestNetmask(singleNicProfile.getNetmask());
+ routerResponse.setGuestNetworkId(singleNicProfile.getNetworkId());
+ routerResponse.setNetworkDomain(network.getNetworkDomain());
+ }
+ }
+ }
+ }
+
+ // Service Offering Info
+ ServiceOffering offering = serviceOfferings.get(router.getServiceOfferingId());
+
+ if (offering == null) {
+ offering = ApiDBUtils.findServiceOfferingById(router.getServiceOfferingId());
+ serviceOfferings.put(offering.getId(), offering);
+ }
+ routerResponse.setServiceOfferingId(offering.getId());
+ routerResponse.setServiceOfferingName(offering.getName());
+
+ populateOwner(routerResponse, router);
+
+ DataCenter zone = ApiDBUtils.findZoneById(router.getDataCenterIdToDeployIn());
+ if (zone != null) {
+ routerResponse.setZoneName(zone.getName());
+ routerResponse.setDns1(zone.getDns1());
+ routerResponse.setDns2(zone.getDns2());
+ }
+
+ routerResponse.setObjectName("domainrouter");
+ return routerResponse;
+ }
+
+ @Override
+ public SystemVmResponse createSystemVmResponse(VirtualMachine vm) {
+ SystemVmResponse vmResponse = new SystemVmResponse();
+ if (vm.getType() == Type.SecondaryStorageVm || vm.getType() == Type.ConsoleProxy) {
+ // SystemVm vm = (SystemVm) systemVM;
+ vmResponse.setId(vm.getId());
+ vmResponse.setObjectId(vm.getId());
+ vmResponse.setSystemVmType(vm.getType().toString().toLowerCase());
+ vmResponse.setZoneId(vm.getDataCenterIdToDeployIn());
+
+ vmResponse.setName(vm.getHostName());
+ vmResponse.setPodId(vm.getPodIdToDeployIn());
+ vmResponse.setTemplateId(vm.getTemplateId());
+ vmResponse.setCreated(vm.getCreated());
+
+ if (vm.getHostId() != null) {
+ vmResponse.setHostId(vm.getHostId());
+ vmResponse.setHostName(ApiDBUtils.findHostById(vm.getHostId()).getName());
+ }
+
+ if (vm.getState() != null) {
+ vmResponse.setState(vm.getState().toString());
+ }
+
+ // for console proxies, add the active sessions
+ if (vm.getType() == Type.ConsoleProxy) {
+ ConsoleProxyVO proxy = ApiDBUtils.findConsoleProxy(vm.getId());
+ // proxy can be already destroyed
+ if (proxy != null) {
+ vmResponse.setActiveViewerSessions(proxy.getActiveSession());
+ }
+ }
+
+ DataCenter zone = ApiDBUtils.findZoneById(vm.getDataCenterIdToDeployIn());
+ if (zone != null) {
+ vmResponse.setZoneName(zone.getName());
+ vmResponse.setDns1(zone.getDns1());
+ vmResponse.setDns2(zone.getDns2());
+ }
+
+ List nicProfiles = ApiDBUtils.getNics(vm);
+ for (NicProfile singleNicProfile : nicProfiles) {
+ Network network = ApiDBUtils.findNetworkById(singleNicProfile.getNetworkId());
+ if (network != null) {
+ if (network.getTrafficType() == TrafficType.Management) {
+ vmResponse.setPrivateIp(singleNicProfile.getIp4Address());
+ vmResponse.setPrivateMacAddress(singleNicProfile.getMacAddress());
+ vmResponse.setPrivateNetmask(singleNicProfile.getNetmask());
+ } else if (network.getTrafficType() == TrafficType.Control) {
+ vmResponse.setLinkLocalIp(singleNicProfile.getIp4Address());
+ vmResponse.setLinkLocalMacAddress(singleNicProfile.getMacAddress());
vmResponse.setLinkLocalNetmask(singleNicProfile.getNetmask());
} else if (network.getTrafficType() == TrafficType.Public || network.getTrafficType() == TrafficType.Guest) {
- /*In basic zone, public ip has TrafficType.Guest*/
- vmResponse.setPublicIp(singleNicProfile.getIp4Address());
- vmResponse.setPublicMacAddress(singleNicProfile.getMacAddress());
- vmResponse.setPublicNetmask(singleNicProfile.getNetmask());
- vmResponse.setGateway(singleNicProfile.getGateway());
- }
- }
- }
- }
- vmResponse.setObjectName("systemvm");
- return vmResponse;
- }
-
- @Override
- public Host findHostById(Long hostId) {
- return ApiDBUtils.findHostById(hostId);
- }
-
- @Override
- public User findUserById(Long userId) {
- return ApiDBUtils.findUserById(userId);
- }
-
- @Override
- public UserVm findUserVmById(Long vmId) {
- return ApiDBUtils.findUserVmById(vmId);
-
- }
-
- @Override
- public VolumeVO findVolumeById(Long volumeId) {
- return ApiDBUtils.findVolumeById(volumeId);
- }
-
- @Override
- public Account findAccountByNameDomain(String accountName, Long domainId) {
- return ApiDBUtils.findAccountByNameDomain(accountName, domainId);
- }
-
- @Override
- public VirtualMachineTemplate findTemplateById(Long templateId) {
- return ApiDBUtils.findTemplateById(templateId);
- }
-
- @Override
- public VpnUsersResponse createVpnUserResponse(VpnUser vpnUser) {
- VpnUsersResponse vpnResponse = new VpnUsersResponse();
- vpnResponse.setId(vpnUser.getId());
- vpnResponse.setUserName(vpnUser.getUsername());
-
- populateOwner(vpnResponse, vpnUser);
-
- vpnResponse.setObjectName("vpnuser");
- return vpnResponse;
- }
-
- @Override
- public RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn) {
- RemoteAccessVpnResponse vpnResponse = new RemoteAccessVpnResponse();
- vpnResponse.setPublicIpId(vpn.getServerAddressId());
- vpnResponse.setPublicIp(ApiDBUtils.findIpAddressById(vpn.getServerAddressId()).getAddress().addr());
- vpnResponse.setIpRange(vpn.getIpRange());
- vpnResponse.setPresharedKey(vpn.getIpsecPresharedKey());
- vpnResponse.setDomainId(vpn.getDomainId());
-
- populateOwner(vpnResponse, vpn);
-
- vpnResponse.setState(vpn.getState().toString());
- vpnResponse.setObjectName("remoteaccessvpn");
-
- return vpnResponse;
- }
-
- @Override
- public TemplateResponse createIsoResponse(VirtualMachineTemplate result) {
- TemplateResponse response = new TemplateResponse();
- response.setId(result.getId());
- response.setName(result.getName());
- response.setDisplayText(result.getDisplayText());
- response.setPublic(result.isPublicTemplate());
- response.setCreated(result.getCreated());
- response.setFormat(result.getFormat());
- response.setOsTypeId(result.getGuestOSId());
- response.setOsTypeName(ApiDBUtils.findGuestOSById(result.getGuestOSId()).getDisplayName());
- response.setDetails(result.getDetails());
- Account caller = UserContext.current().getCaller();
-
- if (result.getFormat() == ImageFormat.ISO) { // Templates are always bootable
- response.setBootable(result.isBootable());
- } else if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
- response.setHypervisor(result.getHypervisorType().toString());// hypervisors are associated with templates
- }
-
- // add account ID and name
- Account owner = ApiDBUtils.findAccountById(result.getAccountId());
- populateAccount(response, owner.getId());
- populateDomain(response, owner.getDomainId());
-
- response.setObjectName("iso");
- return response;
- }
-
- @Override
- public List createTemplateResponses(long templateId, Long zoneId, boolean readyOnly) {
- if (zoneId == null || zoneId == -1) {
- List responses = new ArrayList();
- List dcs = new ArrayList();
- responses = createSwiftTemplateResponses(templateId);
- if (!responses.isEmpty()) {
- return responses;
- }
- dcs.addAll(ApiDBUtils.listZones());
- for (DataCenterVO dc : dcs) {
- responses.addAll(createTemplateResponses(templateId, dc.getId(), readyOnly));
- }
- return responses;
- } else {
- return createTemplateResponses(templateId, zoneId.longValue(), readyOnly);
- }
- }
-
- private List createSwiftTemplateResponses(long templateId) {
- VirtualMachineTemplate template = findTemplateById(templateId);
- List responses = new ArrayList();
- VMTemplateSwiftVO templateSwiftRef = ApiDBUtils.findTemplateSwiftRef(templateId);
- if (templateSwiftRef == null) {
- return responses;
- }
-
- TemplateResponse templateResponse = new TemplateResponse();
- templateResponse.setId(template.getId());
- templateResponse.setName(template.getName());
- templateResponse.setDisplayText(template.getDisplayText());
- templateResponse.setPublic(template.isPublicTemplate());
- templateResponse.setCreated(templateSwiftRef.getCreated());
-
- templateResponse.setReady(true);
- templateResponse.setFeatured(template.isFeatured());
- templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM));
- templateResponse.setPasswordEnabled(template.getEnablePassword());
- templateResponse.setCrossZones(template.isCrossZones());
- templateResponse.setFormat(template.getFormat());
- templateResponse.setDetails(template.getDetails());
- if (template.getTemplateType() != null) {
- templateResponse.setTemplateType(template.getTemplateType().toString());
- }
-
- Account caller = UserContext.current().getCaller();
- if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
- templateResponse.setHypervisor(template.getHypervisorType().toString());
- }
-
- GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId());
- if (os != null) {
- templateResponse.setOsTypeId(os.getId());
- templateResponse.setOsTypeName(os.getDisplayName());
- } else {
- templateResponse.setOsTypeId(-1L);
- templateResponse.setOsTypeName("");
- }
-
- Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId());
- populateAccount(templateResponse, account.getId());
- populateDomain(templateResponse, account.getDomainId());
-
- boolean isAdmin = false;
- if (BaseCmd.isAdmin(caller.getType())) {
- isAdmin = true;
- }
-
- // If the user is an Admin, add the template download status
- if (isAdmin || caller.getId() == template.getAccountId()) {
- // add download status
- templateResponse.setStatus("Successfully Installed");
- }
-
- Long templateSize = templateSwiftRef.getSize();
- if (templateSize > 0) {
- templateResponse.setSize(templateSize);
- }
-
- templateResponse.setChecksum(template.getChecksum());
- templateResponse.setSourceTemplateId(template.getSourceTemplateId());
-
- templateResponse.setChecksum(template.getChecksum());
-
- templateResponse.setTemplateTag(template.getTemplateTag());
-
- templateResponse.setObjectName("template");
- responses.add(templateResponse);
- return responses;
- }
-
- @Override
- public List createTemplateResponses(long templateId, long zoneId, boolean readyOnly) {
- VirtualMachineTemplate template = findTemplateById(templateId);
- List responses = new ArrayList();
- VMTemplateHostVO templateHostRef = ApiDBUtils.findTemplateHostRef(templateId, zoneId, readyOnly);
- if (templateHostRef == null) {
- return responses;
- }
-
- HostVO host = ApiDBUtils.findHostById(templateHostRef.getHostId());
- if (host.getType() == Host.Type.LocalSecondaryStorage && host.getStatus() != com.cloud.host.Status.Up) {
- return responses;
- }
-
- TemplateResponse templateResponse = new TemplateResponse();
- templateResponse.setId(template.getId());
- templateResponse.setName(template.getName());
- templateResponse.setDisplayText(template.getDisplayText());
- templateResponse.setPublic(template.isPublicTemplate());
- templateResponse.setCreated(templateHostRef.getCreated());
-
- templateResponse.setReady(templateHostRef.getDownloadState() == Status.DOWNLOADED);
- templateResponse.setFeatured(template.isFeatured());
- templateResponse.setExtractable(template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM));
- templateResponse.setPasswordEnabled(template.getEnablePassword());
- templateResponse.setCrossZones(template.isCrossZones());
- templateResponse.setFormat(template.getFormat());
- if (template.getTemplateType() != null) {
- templateResponse.setTemplateType(template.getTemplateType().toString());
- }
-
- Account caller = UserContext.current().getCaller();
- if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN || caller.getType() == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
- templateResponse.setHypervisor(template.getHypervisorType().toString());
- }
-
- templateResponse.setDetails(template.getDetails());
-
- GuestOS os = ApiDBUtils.findGuestOSById(template.getGuestOSId());
- if (os != null) {
- templateResponse.setOsTypeId(os.getId());
- templateResponse.setOsTypeName(os.getDisplayName());
- } else {
- templateResponse.setOsTypeId(-1L);
- templateResponse.setOsTypeName("");
- }
-
- Account account = ApiDBUtils.findAccountByIdIncludingRemoved(template.getAccountId());
- populateAccount(templateResponse, account.getId());
- populateDomain(templateResponse, account.getDomainId());
-
- DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId);
-
- // Add the zone ID
- templateResponse.setZoneId(zoneId);
- templateResponse.setZoneName(datacenter.getName());
-
- boolean isAdmin = false;
- if ((caller == null) || BaseCmd.isAdmin(caller.getType())) {
- isAdmin = true;
- }
-
- // If the user is an Admin, add the template download status
- if (isAdmin || caller.getId() == template.getAccountId()) {
- // add download status
- if (templateHostRef.getDownloadState() != Status.DOWNLOADED) {
- String templateStatus = "Processing";
- if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) {
- if (templateHostRef.getDownloadPercent() == 100) {
- templateStatus = "Installing Template";
- } else {
- templateStatus = templateHostRef.getDownloadPercent() + "% Downloaded";
- }
- } else {
- templateStatus = templateHostRef.getErrorString();
- }
- templateResponse.setStatus(templateStatus);
- } else if (templateHostRef.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) {
- templateResponse.setStatus("Download Complete");
- } else {
- templateResponse.setStatus("Successfully Installed");
- }
- }
-
- Long templateSize = templateHostRef.getSize();
- if (templateSize > 0) {
- templateResponse.setSize(templateSize);
- }
-
- templateResponse.setChecksum(template.getChecksum());
- templateResponse.setSourceTemplateId(template.getSourceTemplateId());
-
- templateResponse.setChecksum(template.getChecksum());
-
- templateResponse.setTemplateTag(template.getTemplateTag());
-
- templateResponse.setObjectName("template");
- responses.add(templateResponse);
- return responses;
- }
-
- @Override
- public List createIsoResponses(long isoId, Long zoneId, boolean readyOnly) {
-
- List isoResponses = new ArrayList();
- VirtualMachineTemplate iso = findTemplateById(isoId);
- if (iso.getTemplateType() == TemplateType.PERHOST) {
- TemplateResponse isoResponse = new TemplateResponse();
- isoResponse.setId(iso.getId());
- isoResponse.setName(iso.getName());
- isoResponse.setDisplayText(iso.getDisplayText());
- isoResponse.setPublic(iso.isPublicTemplate());
- isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST));
- isoResponse.setReady(true);
- isoResponse.setBootable(iso.isBootable());
- isoResponse.setFeatured(iso.isFeatured());
- isoResponse.setCrossZones(iso.isCrossZones());
- isoResponse.setPublic(iso.isPublicTemplate());
- isoResponse.setCreated(iso.getCreated());
- isoResponse.setChecksum(iso.getChecksum());
- isoResponse.setPasswordEnabled(false);
- isoResponse.setDetails(iso.getDetails());
-
- // add account ID and name
- Account owner = ApiDBUtils.findAccountById(iso.getAccountId());
- populateAccount(isoResponse, owner.getId());
- populateDomain(isoResponse, owner.getDomainId());
-
- isoResponse.setObjectName("iso");
- isoResponses.add(isoResponse);
- return isoResponses;
- } else {
- if (zoneId == null || zoneId == -1) {
- isoResponses = createSwiftIsoResponses(iso);
- if (!isoResponses.isEmpty()) {
- return isoResponses;
- }
- List dcs = new ArrayList();
- dcs.addAll(ApiDBUtils.listZones());
- for (DataCenterVO dc : dcs) {
- isoResponses.addAll(createIsoResponses(iso, dc.getId(), readyOnly));
- }
- return isoResponses;
- } else {
- return createIsoResponses(iso, zoneId, readyOnly);
- }
- }
- }
-
- private List createSwiftIsoResponses(VirtualMachineTemplate iso) {
- long isoId = iso.getId();
- List isoResponses = new ArrayList();
- VMTemplateSwiftVO isoSwift = ApiDBUtils.findTemplateSwiftRef(isoId);
- if (isoSwift == null) {
- return isoResponses;
- }
- TemplateResponse isoResponse = new TemplateResponse();
- isoResponse.setId(iso.getId());
- isoResponse.setName(iso.getName());
- isoResponse.setDisplayText(iso.getDisplayText());
- isoResponse.setPublic(iso.isPublicTemplate());
- isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST));
- isoResponse.setCreated(isoSwift.getCreated());
- isoResponse.setReady(true);
- isoResponse.setBootable(iso.isBootable());
- isoResponse.setFeatured(iso.isFeatured());
- isoResponse.setCrossZones(iso.isCrossZones());
- isoResponse.setPublic(iso.isPublicTemplate());
- isoResponse.setChecksum(iso.getChecksum());
- isoResponse.setDetails(iso.getDetails());
-
- // TODO: implement
- GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId());
- if (os != null) {
- isoResponse.setOsTypeId(os.getId());
- isoResponse.setOsTypeName(os.getDisplayName());
- } else {
- isoResponse.setOsTypeId(-1L);
- isoResponse.setOsTypeName("");
- }
- Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId());
- populateAccount(isoResponse, account.getId());
- populateDomain(isoResponse, account.getDomainId());
- boolean isAdmin = false;
- if ((account == null) || BaseCmd.isAdmin(account.getType())) {
- isAdmin = true;
- }
-
- // If the user is an admin, add the template download status
- if (isAdmin || account.getId() == iso.getAccountId()) {
- // add download status
- isoResponse.setStatus("Successfully Installed");
- }
- Long isoSize = isoSwift.getSize();
- if (isoSize > 0) {
- isoResponse.setSize(isoSize);
- }
- isoResponse.setObjectName("iso");
- isoResponses.add(isoResponse);
- return isoResponses;
- }
-
- @Override
- public List createIsoResponses(VirtualMachineTemplate iso, long zoneId, boolean readyOnly) {
- long isoId = iso.getId();
- List isoResponses = new ArrayList();
- VMTemplateHostVO isoHost = ApiDBUtils.findTemplateHostRef(isoId, zoneId, readyOnly);
- if (isoHost == null) {
- return isoResponses;
- }
- TemplateResponse isoResponse = new TemplateResponse();
- isoResponse.setId(iso.getId());
- isoResponse.setName(iso.getName());
- isoResponse.setDisplayText(iso.getDisplayText());
- isoResponse.setPublic(iso.isPublicTemplate());
- isoResponse.setExtractable(iso.isExtractable() && !(iso.getTemplateType() == TemplateType.PERHOST));
- isoResponse.setCreated(isoHost.getCreated());
- isoResponse.setReady(isoHost.getDownloadState() == Status.DOWNLOADED);
- isoResponse.setBootable(iso.isBootable());
- isoResponse.setFeatured(iso.isFeatured());
- isoResponse.setCrossZones(iso.isCrossZones());
- isoResponse.setPublic(iso.isPublicTemplate());
- isoResponse.setChecksum(iso.getChecksum());
- isoResponse.setDetails(iso.getDetails());
-
- // TODO: implement
- GuestOS os = ApiDBUtils.findGuestOSById(iso.getGuestOSId());
- if (os != null) {
- isoResponse.setOsTypeId(os.getId());
- isoResponse.setOsTypeName(os.getDisplayName());
- } else {
- isoResponse.setOsTypeId(-1L);
- isoResponse.setOsTypeName("");
- }
-
- Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId());
- populateAccount(isoResponse, account.getId());
- populateDomain(isoResponse, account.getDomainId());
-
- Account caller = UserContext.current().getCaller();
- boolean isAdmin = false;
- if ((caller == null) || BaseCmd.isAdmin(caller.getType())) {
- isAdmin = true;
- }
- // Add the zone ID
- DataCenterVO datacenter = ApiDBUtils.findZoneById(zoneId);
- isoResponse.setZoneId(zoneId);
- isoResponse.setZoneName(datacenter.getName());
-
- // If the user is an admin, add the template download status
- if (isAdmin || caller.getId() == iso.getAccountId()) {
- // add download status
- if (isoHost.getDownloadState() != Status.DOWNLOADED) {
- String isoStatus = "Processing";
- if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOADED) {
- isoStatus = "Download Complete";
- } else if (isoHost.getDownloadState() == VMTemplateHostVO.Status.DOWNLOAD_IN_PROGRESS) {
- if (isoHost.getDownloadPercent() == 100) {
- isoStatus = "Installing ISO";
- } else {
- isoStatus = isoHost.getDownloadPercent() + "% Downloaded";
- }
- } else {
- isoStatus = isoHost.getErrorString();
- }
- isoResponse.setStatus(isoStatus);
- } else {
- isoResponse.setStatus("Successfully Installed");
- }
- }
-
- Long isoSize = isoHost.getSize();
- if (isoSize > 0) {
- isoResponse.setSize(isoSize);
- }
-
- isoResponse.setObjectName("iso");
- isoResponses.add(isoResponse);
- return isoResponses;
- }
-
- @Override
- public ListResponse createSecurityGroupResponses(
- List extends SecurityGroupRules> networkGroups) {
- List groupResultObjs = SecurityGroupResultObject
- .transposeNetworkGroups(networkGroups);
-
- ListResponse response = new ListResponse();
- List netGrpResponses = new ArrayList();
- for (SecurityGroupResultObject networkGroup : groupResultObjs) {
- SecurityGroupResponse netGrpResponse = new SecurityGroupResponse();
- netGrpResponse.setId(networkGroup.getId());
- netGrpResponse.setName(networkGroup.getName());
- netGrpResponse.setDescription(networkGroup.getDescription());
-
- populateOwner(netGrpResponse, networkGroup);
-
- List securityGroupRules = networkGroup
- .getSecurityGroupRules();
- if ((securityGroupRules != null) && !securityGroupRules.isEmpty()) {
- List ingressRulesResponse = new ArrayList();
- List egressRulesResponse = new ArrayList();
- for (SecurityGroupRuleResultObject securityGroupRule : securityGroupRules) {
- SecurityGroupRuleResponse ruleData = new SecurityGroupRuleResponse();
- ruleData.setRuleId(securityGroupRule.getId());
- ruleData.setProtocol(securityGroupRule.getProtocol());
-
- if ("icmp".equalsIgnoreCase(securityGroupRule.getProtocol())) {
- ruleData.setIcmpType(securityGroupRule.getStartPort());
- ruleData.setIcmpCode(securityGroupRule.getEndPort());
- } else {
- ruleData.setStartPort(securityGroupRule.getStartPort());
- ruleData.setEndPort(securityGroupRule.getEndPort());
- }
-
- if (securityGroupRule.getAllowedSecurityGroup() != null) {
- ruleData.setSecurityGroupName(securityGroupRule
- .getAllowedSecurityGroup());
- ruleData.setAccountName(securityGroupRule
- .getAllowedSecGroupAcct());
- } else {
- ruleData.setCidr(securityGroupRule
- .getAllowedSourceIpCidr());
- }
-
- if (securityGroupRule.getRuleType() == SecurityRuleType.IngressRule) {
- ruleData.setObjectName("ingressrule");
- ingressRulesResponse.add(ruleData);
- } else {
- ruleData.setObjectName("egressrule");
- egressRulesResponse.add(ruleData);
- }
- }
- netGrpResponse
- .setSecurityGroupIngressRules(ingressRulesResponse);
- netGrpResponse.setSecurityGroupEgressRules(egressRulesResponse);
- }
- netGrpResponse.setObjectName("securitygroup");
- netGrpResponses.add(netGrpResponse);
- }
-
- response.setResponses(netGrpResponses);
- return response;
- }
-
- @Override
- public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) {
- SecurityGroupResponse response = new SecurityGroupResponse();
-
- populateOwner(response, group);
-
- response.setDescription(group.getDescription());
- response.setId(group.getId());
- response.setName(group.getName());
-
- response.setObjectName("securitygroup");
- return response;
-
- }
-
- @Override
- public ExtractResponse createExtractResponse(Long uploadId, Long id, Long zoneId, Long accountId, String mode) {
- UploadVO uploadInfo = ApiDBUtils.findUploadById(uploadId);
- ExtractResponse response = new ExtractResponse();
- response.setObjectName("template");
- response.setId(id);
- response.setName(ApiDBUtils.findTemplateById(id).getName());
- if (zoneId != null) {
- response.setZoneId(zoneId);
- response.setZoneName(ApiDBUtils.findZoneById(zoneId).getName());
- }
- response.setMode(mode);
- response.setUploadId(uploadId);
- response.setState(uploadInfo.getUploadState().toString());
- response.setAccountId(accountId);
- response.setUrl(uploadInfo.getUploadUrl());
- return response;
-
- }
-
- @Override
- public String toSerializedString(CreateCmdResponse response, String responseType) {
- return ApiResponseSerializer.toSerializedString(response, responseType);
- }
-
- @Override
- public AsyncJobResponse createAsyncJobResponse(AsyncJob job) {
- AsyncJobResponse jobResponse = new AsyncJobResponse();
- jobResponse.setAccountId(job.getAccountId());
- jobResponse.setUserId(job.getUserId());
- jobResponse.setCmd(job.getCmd());
- jobResponse.setCreated(job.getCreated());
- jobResponse.setJobId(job.getId());
- jobResponse.setJobStatus(job.getStatus());
- jobResponse.setJobProcStatus(job.getProcessStatus());
-
- if (job.getInstanceType() != null && job.getInstanceId() != null) {
- jobResponse.setJobInstanceType(job.getInstanceType().toString());
- jobResponse.setJobInstanceId(job.getInstanceId());
- }
- jobResponse.setJobResultCode(job.getResultCode());
-
- boolean savedValue = SerializationContext.current().getUuidTranslation();
- SerializationContext.current().setUuidTranslation(false);
- jobResponse.setJobResult((ResponseObject) ApiSerializerHelper.fromSerializedString(job.getResult()));
- SerializationContext.current().setUuidTranslation(savedValue);
-
- Object resultObject = ApiSerializerHelper.fromSerializedString(job.getResult());
- if (resultObject != null) {
- Class> clz = resultObject.getClass();
- if (clz.isPrimitive() || clz.getSuperclass() == Number.class || clz == String.class || clz == Date.class) {
- jobResponse.setJobResultType("text");
- } else {
- jobResponse.setJobResultType("object");
- }
- }
-
- jobResponse.setObjectName("asyncjobs");
- return jobResponse;
- }
-
- @Override
- public List createTemplateResponses(long templateId, Long snapshotId, Long volumeId, boolean readyOnly) {
- VolumeVO volume = null;
- if (snapshotId != null) {
- Snapshot snapshot = ApiDBUtils.findSnapshotById(snapshotId);
- volume = findVolumeById(snapshot.getVolumeId());
- } else {
- volume = findVolumeById(volumeId);
- }
- return createTemplateResponses(templateId, volume.getDataCenterId(), readyOnly);
- }
-
- @Override
- public List createTemplateResponses(long templateId, Long vmId) {
- UserVm vm = findUserVmById(vmId);
- Long hostId = (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId());
- Host host = findHostById(hostId);
- return createTemplateResponses(templateId, host.getDataCenterId(), true);
- }
-
- @Override
- public EventResponse createEventResponse(Event event) {
- EventResponse responseEvent = new EventResponse();
- responseEvent.setCreated(event.getCreateDate());
- responseEvent.setDescription(event.getDescription());
- responseEvent.setEventType(event.getType());
- responseEvent.setId(event.getId());
- responseEvent.setLevel(event.getLevel());
- responseEvent.setParentId(event.getStartId());
- responseEvent.setState(event.getState());
-
- populateOwner(responseEvent, event);
-
- User user = ApiDBUtils.findUserById(event.getUserId());
- if (user != null) {
- responseEvent.setUsername(user.getUsername());
- }
-
- responseEvent.setObjectName("event");
- return responseEvent;
- }
-
- private List sumCapacities(List extends Capacity> hostCapacities) {
- Map totalCapacityMap = new HashMap();
- Map usedCapacityMap = new HashMap();
-
- Set poolIdsToIgnore = new HashSet();
- Criteria c = new Criteria();
- // TODO: implement
- List extends StoragePoolVO> allStoragePools = ApiDBUtils.searchForStoragePools(c);
- for (StoragePoolVO pool : allStoragePools) {
- StoragePoolType poolType = pool.getPoolType();
- if (!(poolType.isShared())) {// All the non shared storages shouldn't show up in the capacity calculation
- poolIdsToIgnore.add(pool.getId());
- }
- }
-
- float cpuOverprovisioningFactor = ApiDBUtils.getCpuOverprovisioningFactor();
-
- // collect all the capacity types, sum allocated/used and sum total...get one capacity number for each
- for (Capacity capacity : hostCapacities) {
-
- // check if zone exist
- DataCenter zone = ApiDBUtils.findZoneById(capacity.getDataCenterId());
- if (zone == null) {
- continue;
- }
-
- short capacityType = capacity.getCapacityType();
-
- // If local storage then ignore
- if ((capacityType == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED || capacityType == Capacity.CAPACITY_TYPE_STORAGE)
- && poolIdsToIgnore.contains(capacity.getHostOrPoolId())) {
- continue;
- }
-
- String key = capacity.getCapacityType() + "_" + capacity.getDataCenterId();
- String keyForPodTotal = key + "_-1";
-
- boolean sumPodCapacity = false;
- if (capacity.getPodId() != null) {
- key += "_" + capacity.getPodId();
- sumPodCapacity = true;
- }
-
- Long totalCapacity = totalCapacityMap.get(key);
- Long usedCapacity = usedCapacityMap.get(key);
-
- // reset overprovisioning factor to 1
- float overprovisioningFactor = 1;
- if (capacityType == Capacity.CAPACITY_TYPE_CPU) {
- overprovisioningFactor = cpuOverprovisioningFactor;
- }
-
- if (totalCapacity == null) {
- totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor));
- } else {
- totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)) + totalCapacity;
- }
-
- if (usedCapacity == null) {
- usedCapacity = new Long(capacity.getUsedCapacity());
- } else {
- usedCapacity = new Long(capacity.getUsedCapacity() + usedCapacity);
- }
-
- if (capacityType == Capacity.CAPACITY_TYPE_CPU || capacityType == Capacity.CAPACITY_TYPE_MEMORY) { // Reserved
- // Capacity
- // accounts
-// for
- // stopped
-// vms
- // that
-// have been
- // stopped
-// within
- // an
-// interval
- usedCapacity += capacity.getReservedCapacity();
- }
-
- totalCapacityMap.put(key, totalCapacity);
- usedCapacityMap.put(key, usedCapacity);
-
- if (sumPodCapacity) {
- totalCapacity = totalCapacityMap.get(keyForPodTotal);
- usedCapacity = usedCapacityMap.get(keyForPodTotal);
-
- overprovisioningFactor = 1;
- if (capacityType == Capacity.CAPACITY_TYPE_CPU) {
- overprovisioningFactor = cpuOverprovisioningFactor;
- }
-
- if (totalCapacity == null) {
- totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor));
- } else {
- totalCapacity = new Long((long) (capacity.getTotalCapacity() * overprovisioningFactor)) + totalCapacity;
- }
-
- if (usedCapacity == null) {
- usedCapacity = new Long(capacity.getUsedCapacity());
- } else {
- usedCapacity = new Long(capacity.getUsedCapacity() + usedCapacity);
- }
-
- if (capacityType == Capacity.CAPACITY_TYPE_CPU || capacityType == Capacity.CAPACITY_TYPE_MEMORY) { // Reserved
- // Capacity
- // accounts
- // for
- // stopped
- // vms
-// that
- // have
-// been
- // stopped
- // within
-// an
- // interval
- usedCapacity += capacity.getReservedCapacity();
- }
-
- totalCapacityMap.put(keyForPodTotal, totalCapacity);
- usedCapacityMap.put(keyForPodTotal, usedCapacity);
- }
- }
-
- List summedCapacities = new ArrayList();
- for (String key : totalCapacityMap.keySet()) {
- CapacityVO summedCapacity = new CapacityVO();
-
- StringTokenizer st = new StringTokenizer(key, "_");
- summedCapacity.setCapacityType(Short.parseShort(st.nextToken()));
- summedCapacity.setDataCenterId(Long.parseLong(st.nextToken()));
- if (st.hasMoreTokens()) {
- summedCapacity.setPodId(Long.parseLong(st.nextToken()));
- }
-
- summedCapacity.setTotalCapacity(totalCapacityMap.get(key));
- summedCapacity.setUsedCapacity(usedCapacityMap.get(key));
-
- summedCapacities.add(summedCapacity);
- }
- return summedCapacities;
- }
-
- @Override
- public List createCapacityResponse(List extends Capacity> result, DecimalFormat format) {
- List capacityResponses = new ArrayList();
-
- for (Capacity summedCapacity : result) {
- CapacityResponse capacityResponse = new CapacityResponse();
- capacityResponse.setCapacityTotal(summedCapacity.getTotalCapacity());
- capacityResponse.setCapacityType(summedCapacity.getCapacityType());
- capacityResponse.setCapacityUsed(summedCapacity.getUsedCapacity());
- if (summedCapacity.getPodId() != null) {
- capacityResponse.setPodId(summedCapacity.getPodId());
- HostPodVO pod = ApiDBUtils.findPodById(summedCapacity.getPodId());
- if (pod != null) {
- capacityResponse.setPodName(pod.getName());
- }
- }
- if (summedCapacity.getClusterId() != null) {
- capacityResponse.setClusterId(summedCapacity.getClusterId());
- ClusterVO cluster = ApiDBUtils.findClusterById(summedCapacity.getClusterId());
- if (cluster != null) {
- capacityResponse.setClusterName(cluster.getName());
- if (summedCapacity.getPodId() == null) {
- long podId = cluster.getPodId();
- capacityResponse.setPodId(podId);
- capacityResponse.setPodName(ApiDBUtils.findPodById(podId).getName());
- }
- }
- }
- capacityResponse.setZoneId(summedCapacity.getDataCenterId());
- capacityResponse.setZoneName(ApiDBUtils.findZoneById(summedCapacity.getDataCenterId()).getName());
- if (summedCapacity.getUsedPercentage() != null){
- capacityResponse.setPercentUsed(format.format(summedCapacity.getUsedPercentage() * 100f));
- } else if (summedCapacity.getTotalCapacity() != 0) {
- capacityResponse.setPercentUsed(format.format((float) summedCapacity.getUsedCapacity() / (float) summedCapacity.getTotalCapacity() * 100f));
- } else {
- capacityResponse.setPercentUsed(format.format(0L));
- }
-
- capacityResponse.setObjectName("capacity");
- capacityResponses.add(capacityResponse);
- }
-
- return capacityResponses;
- }
-
- @Override
- public TemplatePermissionsResponse createTemplatePermissionsResponse(List accountNames, Long id, boolean isAdmin) {
- Long templateOwnerDomain = null;
- VirtualMachineTemplate template = ApiDBUtils.findTemplateById(id);
- Account templateOwner = ApiDBUtils.findAccountById(template.getAccountId());
- if (isAdmin) {
- // FIXME: we have just template id and need to get template owner from that
- if (templateOwner != null) {
- templateOwnerDomain = templateOwner.getDomainId();
- }
- }
-
- TemplatePermissionsResponse response = new TemplatePermissionsResponse();
- response.setId(template.getId());
- response.setPublicTemplate(template.isPublicTemplate());
- if (isAdmin && (templateOwnerDomain != null)) {
- response.setDomainId(templateOwnerDomain);
- }
-
- // Set accounts
- List projectIds = new ArrayList();
- List regularAccounts = new ArrayList();
- for (String accountName : accountNames) {
- Account account = ApiDBUtils.findAccountByNameDomain(accountName, templateOwner.getDomainId());
- if (account.getType() != Account.ACCOUNT_TYPE_PROJECT) {
- regularAccounts.add(accountName);
- } else {
- // convert account to projectIds
- Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId());
-
- if (project.getUuid() != null && !project.getUuid().isEmpty())
- projectIds.add(project.getUuid());
- else
- projectIds.add(String.valueOf(project.getId()));
- }
- }
-
- if (!projectIds.isEmpty()) {
- response.setProjectIds(projectIds);
- }
-
- if (!regularAccounts.isEmpty()) {
- response.setAccountNames(regularAccounts);
- }
-
- response.setObjectName("templatepermission");
- return response;
- }
-
- @Override
- public AsyncJobResponse queryJobResult(QueryAsyncJobResultCmd cmd) {
- AsyncJob result = ApiDBUtils._asyncMgr.queryAsyncJobResult(cmd);
- return createAsyncJobResponse(result);
- }
-
- @Override
- public SecurityGroupResponse createSecurityGroupResponseFromSecurityGroupRule(List extends SecurityRule> securityRules) {
- SecurityGroupResponse response = new SecurityGroupResponse();
- Map securiytGroupAccounts = new HashMap();
- Map allowedSecurityGroups = new HashMap();
- Map allowedSecuriytGroupAccounts = new HashMap();
-
- if ((securityRules != null) && !securityRules.isEmpty()) {
- SecurityGroup securityGroup = ApiDBUtils.findSecurityGroupById(securityRules.get(0).getSecurityGroupId());
- response.setId(securityGroup.getId());
- response.setName(securityGroup.getName());
- response.setDescription(securityGroup.getDescription());
-
- Account account = securiytGroupAccounts.get(securityGroup.getAccountId());
-
- if (account == null) {
- account = ApiDBUtils.findAccountById(securityGroup.getAccountId());
- securiytGroupAccounts.put(securityGroup.getAccountId(), account);
- }
-
- populateAccount(response, account.getId());
- populateDomain(response, account.getDomainId());
-
- List egressResponses = new ArrayList();
- List ingressResponses = new ArrayList