diff --git a/core/src/com/cloud/event/dao/UsageEventDaoImpl.java b/core/src/com/cloud/event/dao/UsageEventDaoImpl.java index f0eb5db8dd2..0582ec962e5 100644 --- a/core/src/com/cloud/event/dao/UsageEventDaoImpl.java +++ b/core/src/com/cloud/event/dao/UsageEventDaoImpl.java @@ -1,8 +1,8 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * + * * This software is licensed under the GNU General Public License v3 or later. - * + * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. @@ -10,14 +10,14 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -package com.cloud.event.dao; - +package com.cloud.event.dao; + import java.sql.PreparedStatement; import java.util.Date; import java.util.List; @@ -36,9 +36,9 @@ import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; - -@Local(value={UsageEventDao.class}) -public class UsageEventDaoImpl extends GenericDaoBase implements UsageEventDao { + +@Local(value={UsageEventDao.class}) +public class UsageEventDaoImpl extends GenericDaoBase implements UsageEventDao { public static final Logger s_logger = Logger.getLogger(UsageEventDaoImpl.class.getName()); private final SearchBuilder latestEventsSearch; @@ -46,14 +46,14 @@ public class UsageEventDaoImpl extends GenericDaoBase implem "SELECT id, type, account_id, created, zone_id, resource_id, resource_name, offering_id, template_id, size, resource_type FROM cloud.usage_event vmevt WHERE vmevt.id > ? and vmevt.created <= ? "; private static final String COPY_ALL_EVENTS = "INSERT INTO cloud_usage.usage_event (id, type, account_id, created, zone_id, resource_id, resource_name, offering_id, template_id, size, resource_type) " + "SELECT id, type, account_id, created, zone_id, resource_id, resource_name, offering_id, template_id, size, resource_type FROM cloud.usage_event where id <= ? "; - - + + public UsageEventDaoImpl () { latestEventsSearch = createSearchBuilder(); latestEventsSearch.and("processed", latestEventsSearch.entity().isProcessed(), SearchCriteria.Op.EQ); latestEventsSearch.and("enddate", latestEventsSearch.entity().getCreateDate(), SearchCriteria.Op.LTEQ); latestEventsSearch.done(); - } + } @Override public List listLatestEvents(Date endDate) { @@ -70,6 +70,7 @@ public class UsageEventDaoImpl extends GenericDaoBase implem return listAll(filter); } + @Override @DB public synchronized List getRecentEvents(Date endDate) throws UsageServerException { Transaction txn = Transaction.open(Transaction.USAGE_DB); @@ -135,5 +136,5 @@ public class UsageEventDaoImpl extends GenericDaoBase implem txn.close(); } } - -} + +} diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index ef98d40e11f..44575f514af 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -1,8 +1,8 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * + * * This software is licensed under the GNU General Public License v3 or later. - * + * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. @@ -10,10 +10,10 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ package com.cloud.agent.manager; @@ -186,7 +186,7 @@ import com.cloud.vm.dao.VMInstanceDao; /** * Implementation of the Agent Manager. This class controls the connection to the agents. - * + * * @config {@table || Param Name | Description | Values | Default || || port | port to listen on for agent connection. | Integer * | 8250 || || workers | # of worker threads | Integer | 5 || || router.template.id | default id for template | Integer * | 1 || || router.ram.size | default ram for router vm in mb | Integer | 128 || || router.ip.address | ip address for @@ -1536,7 +1536,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS } removeAgent(attache, nextState); _hostDao.disconnect(host, event, _nodeId); - + host = _hostDao.findById(host.getId()); if (host.getStatus() == Status.Alert || host.getStatus() == Status.Down) { _haMgr.scheduleRestartForVmsOnHost(host); @@ -1695,20 +1695,25 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS HostVO host = null; if (id != null) { host = _hostDao.findById(id); - if (host.getManagementServerId() != null) { + if (!_hostDao.directConnect(host, _nodeId, false)) { s_logger.info("MS " + host.getManagementServerId() + " is loading " + host); return null; } } - + StartupCommand[] cmds = resource.initialize(); if (cmds == null) { + s_logger.info("Unable to fully initialize the agent because no StartupCommands are returned"); + if (id != null) { + _hostDao.updateStatus(host, Event.AgentDisconnected, _nodeId); + } return null; } - + if (host != null) { - if (!_hostDao.directConnect(host, _nodeId)) { - s_logger.info("Someone else is loading " + host); + if (!_hostDao.directConnect(host, _nodeId, true)) { + host = _hostDao.findById(id); + s_logger.info("MS " + host.getManagementServerId() + " is loading " + host + " after it has been initialized."); resource.disconnected(); return null; } @@ -2311,7 +2316,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS * !"0.0.0.0".equals(startup.getStorageIpAddress())) { if (_hostDao.findByPrivateIpAddressInDataCenter * (server.getDataCenterId(), startup.getPrivateIpAddress()) != null) { throw newIllegalArgumentException( * "The private ip address is already in used: " + startup.getPrivateIpAddress()); } - * + * * if (_hostDao.findByPrivateIpAddressInDataCenter(server.getDataCenterId (), startup.getStorageIpAddress()) != * null) { throw new IllegalArgumentException ("The private ip address is already in used: " + * startup.getStorageIpAddress()); } } diff --git a/server/src/com/cloud/ha/XenServerFencer.java b/server/src/com/cloud/ha/XenServerFencer.java index 6986da5cb57..d38e5de261d 100644 --- a/server/src/com/cloud/ha/XenServerFencer.java +++ b/server/src/com/cloud/ha/XenServerFencer.java @@ -1,8 +1,8 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * + * * This software is licensed under the GNU General Public License v3 or later. - * + * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. @@ -10,10 +10,10 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ package com.cloud.ha; @@ -26,6 +26,7 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; import com.cloud.agent.api.FenceAnswer; import com.cloud.agent.api.FenceCommand; import com.cloud.exception.AgentUnavailableException; @@ -41,20 +42,20 @@ import com.cloud.vm.VMInstanceVO; public class XenServerFencer implements FenceBuilder { private static final Logger s_logger = Logger.getLogger(XenServerFencer.class); String _name; - + @Inject HostDao _hostDao; @Inject AgentManager _agentMgr; - + @Override public Boolean fenceOff(VMInstanceVO vm, HostVO host) { if (host.getHypervisorType() != HypervisorType.XenServer) { s_logger.debug("Don't know how to fence non XenServer hosts " + host.getHypervisorType()); return null; } - + List hosts = _hostDao.listByCluster(host.getClusterId()); FenceCommand fence = new FenceCommand(vm, host); - + for (HostVO h : hosts) { if (h.getHypervisorType() == HypervisorType.XenServer) { if( h.getStatus() != Status.Up ) { @@ -65,7 +66,12 @@ public class XenServerFencer implements FenceBuilder { } FenceAnswer answer; try { - answer = (FenceAnswer)_agentMgr.send(h.getId(), fence); + Answer ans = _agentMgr.send(h.getId(), fence); + if (!(ans instanceof FenceAnswer)) { + s_logger.debug("Answer is not fenceanswer. Result = " + ans.getResult() + "; Details = " + ans.getDetails()); + continue; + } + answer = (FenceAnswer) ans; } catch (AgentUnavailableException e) { if (s_logger.isDebugEnabled()) { s_logger.debug("Moving on to the next host because " + h.toString() + " is unavailable"); @@ -82,14 +88,14 @@ public class XenServerFencer implements FenceBuilder { } } } - + if (s_logger.isDebugEnabled()) { s_logger.debug("Unable to fence off " + vm.toString() + " on " + host.toString()); } - + return false; } - + public XenServerFencer() { super(); } diff --git a/server/src/com/cloud/host/dao/HostDao.java b/server/src/com/cloud/host/dao/HostDao.java index 96685454aaf..5f12bd2868b 100644 --- a/server/src/com/cloud/host/dao/HostDao.java +++ b/server/src/com/cloud/host/dao/HostDao.java @@ -1,8 +1,8 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * + * * This software is licensed under the GNU General Public License v3 or later. - * + * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. @@ -10,10 +10,10 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ package com.cloud.host.dao; @@ -31,13 +31,13 @@ import com.cloud.utils.db.GenericDao; /** * Data Access Object for server - * + * */ public interface HostDao extends GenericDao { List listBy(Host.Type type, Long clusterId, Long podId, long dcId); - + long countBy(long clusterId, Status... statuses); - + List listByDataCenter(long dcId); List listByHostPod(long podId); List listByStatus(Status... status); @@ -50,25 +50,25 @@ public interface HostDao extends GenericDao { * @return list of Hosts */ List listSecondaryStorageHosts(); - + /** * Mark all hosts in Up or Orphaned state as disconnected. This method * is used at AgentManager startup to reset all of the connections. - * + * * @param msId management server id. * @param statuses states of the host. */ void markHostsAsDisconnected(long msId, Status... states); - + List findLostHosts(long timeout); - + List findHostsLike(String hostName); /** * Find hosts that are directly connected. */ List findDirectlyConnectedHosts(); - + List findDirectAgentToLoad(long msid, long lastPingSecondsAfter, Long limit); /** @@ -77,16 +77,16 @@ public interface HostDao extends GenericDao { * The lastPinged timestamp is set to current. * The state is set to the state passed in. * The disconnectedOn timestamp is set to current. - * + * * @param host host to be marked * @param state state to be set to. * @param ifStates only if it is one of these states. * @return true if it's updated; false if not. */ boolean disconnect(HostVO host, Event event, long msId); - + boolean connect(HostVO host, long msId); - + HostVO findByStorageIpAddressInDataCenter(long dcId, String privateIpAddress); HostVO findByPrivateIpAddressInDataCenter(long dcId, String privateIpAddress); @@ -96,7 +96,7 @@ public interface HostDao extends GenericDao { * @return HostVO or null if not found. */ public HostVO findByGuid(String macAddress); - + /** * find all hosts of a certain type in a data center @@ -121,7 +121,7 @@ public interface HostDao extends GenericDao { * @return */ List findLostHosts2(long timeout, Type type); - + /** * update the host and changes the status depending on the Event and * the current status. If the status changed between @@ -131,11 +131,11 @@ public interface HostDao extends GenericDao { * @return true if updated; false if not. */ boolean updateStatus(HostVO host, Event event, long msId); - + List getRunningHostCounts(Date cutTime); - + long getNextSequence(long hostId); - + void loadDetails(HostVO host); HostVO findConsoleProxyHost(String name, Type type); @@ -154,11 +154,11 @@ public interface HostDao extends GenericDao { List listBy(Long dataCenterId, Long podId, Long clusterId, Type hostType, Status... statuses); List listBy(Long clusterId, Long podId, long dcId); - + void loadHostTags(HostVO host); - + List listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag); - boolean directConnect(HostVO host, long msId); - + boolean directConnect(HostVO host, long msId, boolean secondConnect); + } diff --git a/server/src/com/cloud/host/dao/HostDaoImpl.java b/server/src/com/cloud/host/dao/HostDaoImpl.java index 07b4125fdc8..4c03099f1f4 100644 --- a/server/src/com/cloud/host/dao/HostDaoImpl.java +++ b/server/src/com/cloud/host/dao/HostDaoImpl.java @@ -1,8 +1,8 @@ /** * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. - * + * * This software is licensed under the GNU General Public License v3 or later. - * + * * It is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or any later version. @@ -10,10 +10,10 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ package com.cloud.host.dao; @@ -84,25 +84,25 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao protected final SearchBuilder ClusterSearch; protected final SearchBuilder ConsoleProxyHostSearch; protected final SearchBuilder AvailHypevisorInZone; - + protected final SearchBuilder DirectConnectSearch; - + protected final GenericSearchBuilder HostsInStatusSearch; - + protected final Attribute _statusAttr; protected final Attribute _msIdAttr; protected final Attribute _pingTimeAttr; - + protected final DetailsDaoImpl _detailsDao = ComponentLocator.inject(DetailsDaoImpl.class); protected final HostTagsDaoImpl _hostTagsDao = ComponentLocator.inject(HostTagsDaoImpl.class); public HostDaoImpl() { - + MaintenanceCountSearch = createSearchBuilder(); MaintenanceCountSearch.and("cluster", MaintenanceCountSearch.entity().getClusterId(), SearchCriteria.Op.EQ); MaintenanceCountSearch.and("status", MaintenanceCountSearch.entity().getStatus(), SearchCriteria.Op.IN); MaintenanceCountSearch.done(); - + TypePodDcStatusSearch = createSearchBuilder(); HostVO entity = TypePodDcStatusSearch.entity(); TypePodDcStatusSearch.and("type", entity.getType(), SearchCriteria.Op.EQ); @@ -116,38 +116,38 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao LastPingedSearch.and("ping", LastPingedSearch.entity().getLastPinged(), SearchCriteria.Op.LT); LastPingedSearch.and("state", LastPingedSearch.entity().getStatus(), SearchCriteria.Op.IN); LastPingedSearch.done(); - + LastPingedSearch2 = createSearchBuilder(); LastPingedSearch2.and("ping", LastPingedSearch2.entity().getLastPinged(), SearchCriteria.Op.LT); LastPingedSearch2.and("type", LastPingedSearch2.entity().getType(), SearchCriteria.Op.EQ); LastPingedSearch2.done(); - + MsStatusSearch = createSearchBuilder(); MsStatusSearch.and("ms", MsStatusSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ); MsStatusSearch.and("statuses", MsStatusSearch.entity().getStatus(), SearchCriteria.Op.IN); MsStatusSearch.done(); - + TypeDcSearch = createSearchBuilder(); TypeDcSearch.and("type", TypeDcSearch.entity().getType(), SearchCriteria.Op.EQ); TypeDcSearch.and("dc", TypeDcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); TypeDcSearch.done(); - + TypeDcStatusSearch = createSearchBuilder(); TypeDcStatusSearch.and("type", TypeDcStatusSearch.entity().getType(), SearchCriteria.Op.EQ); TypeDcStatusSearch.and("dc", TypeDcStatusSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); TypeDcStatusSearch.and("status", TypeDcStatusSearch.entity().getStatus(), SearchCriteria.Op.EQ); TypeDcStatusSearch.done(); - + IdStatusSearch = createSearchBuilder(); IdStatusSearch.and("id", IdStatusSearch.entity().getId(), SearchCriteria.Op.EQ); IdStatusSearch.and("states", IdStatusSearch.entity().getStatus(), SearchCriteria.Op.IN); IdStatusSearch.done(); - + DcPrivateIpAddressSearch = createSearchBuilder(); DcPrivateIpAddressSearch.and("privateIpAddress", DcPrivateIpAddressSearch.entity().getPrivateIpAddress(), SearchCriteria.Op.EQ); DcPrivateIpAddressSearch.and("dc", DcPrivateIpAddressSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); DcPrivateIpAddressSearch.done(); - + DcStorageIpAddressSearch = createSearchBuilder(); DcStorageIpAddressSearch.and("storageIpAddress", DcStorageIpAddressSearch.entity().getStorageIpAddress(), SearchCriteria.Op.EQ); DcStorageIpAddressSearch.and("dc", DcStorageIpAddressSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); @@ -156,11 +156,11 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao GuidSearch = createSearchBuilder(); GuidSearch.and("guid", GuidSearch.entity().getGuid(), SearchCriteria.Op.EQ); GuidSearch.done(); - + DcSearch = createSearchBuilder(); DcSearch.and("dc", DcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); DcSearch.done(); - + ClusterSearch = createSearchBuilder(); ClusterSearch.and("cluster", ClusterSearch.entity().getClusterId(), SearchCriteria.Op.EQ); ClusterSearch.done(); @@ -169,32 +169,32 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao ConsoleProxyHostSearch.and("name", ConsoleProxyHostSearch.entity().getName(), SearchCriteria.Op.EQ); ConsoleProxyHostSearch.and("type", ConsoleProxyHostSearch.entity().getType(), SearchCriteria.Op.EQ); ConsoleProxyHostSearch.done(); - + PodSearch = createSearchBuilder(); PodSearch.and("pod", PodSearch.entity().getPodId(), SearchCriteria.Op.EQ); PodSearch.done(); - + TypeSearch = createSearchBuilder(); TypeSearch.and("type", TypeSearch.entity().getType(), SearchCriteria.Op.EQ); TypeSearch.done(); - + StatusSearch =createSearchBuilder(); StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN); StatusSearch.done(); - + NameLikeSearch = createSearchBuilder(); NameLikeSearch.and("name", NameLikeSearch.entity().getName(), SearchCriteria.Op.LIKE); NameLikeSearch.done(); - + SequenceSearch = createSearchBuilder(); SequenceSearch.and("id", SequenceSearch.entity().getId(), SearchCriteria.Op.EQ); // SequenceSearch.addRetrieve("sequence", SequenceSearch.entity().getSequence()); SequenceSearch.done(); - + DirectlyConnectedSearch = createSearchBuilder(); DirectlyConnectedSearch.and("resource", DirectlyConnectedSearch.entity().getResource(), SearchCriteria.Op.NNULL); DirectlyConnectedSearch.done(); - + UnmanagedDirectConnectSearch = createSearchBuilder(); UnmanagedDirectConnectSearch.and("resource", UnmanagedDirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL); UnmanagedDirectConnectSearch.and("server", UnmanagedDirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); @@ -208,25 +208,27 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao UnmanagedDirectConnectSearch.done(); DirectConnectSearch = createSearchBuilder(); - DirectConnectSearch.and("server", DirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); DirectConnectSearch.and("resource", DirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL); DirectConnectSearch.and("id", DirectConnectSearch.entity().getId(), SearchCriteria.Op.EQ); + DirectConnectSearch.op("nullserver", DirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); + DirectConnectSearch.or("server", DirectConnectSearch.entity().getManagementServerId(), SearchCriteria.Op.EQ); + DirectConnectSearch.cp(); DirectConnectSearch.done(); - + UnmanagedExternalNetworkApplianceSearch = createSearchBuilder(); UnmanagedExternalNetworkApplianceSearch.and("resource", UnmanagedExternalNetworkApplianceSearch.entity().getResource(), SearchCriteria.Op.NNULL); - UnmanagedExternalNetworkApplianceSearch.and("server", UnmanagedExternalNetworkApplianceSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); + UnmanagedExternalNetworkApplianceSearch.and("server", UnmanagedExternalNetworkApplianceSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); UnmanagedExternalNetworkApplianceSearch.and("types", UnmanagedExternalNetworkApplianceSearch.entity().getType(), SearchCriteria.Op.IN); UnmanagedExternalNetworkApplianceSearch.and("lastPinged", UnmanagedExternalNetworkApplianceSearch.entity().getLastPinged(), SearchCriteria.Op.LTEQ); UnmanagedExternalNetworkApplianceSearch.done(); - + AvailHypevisorInZone = createSearchBuilder(); AvailHypevisorInZone.and("zoneId", AvailHypevisorInZone.entity().getDataCenterId(), SearchCriteria.Op.EQ); AvailHypevisorInZone.and("hostId", AvailHypevisorInZone.entity().getId(), SearchCriteria.Op.NEQ); AvailHypevisorInZone.and("type", AvailHypevisorInZone.entity().getType(), SearchCriteria.Op.EQ); AvailHypevisorInZone.groupBy(AvailHypevisorInZone.entity().getHypervisorType()); AvailHypevisorInZone.done(); - + HostsInStatusSearch = createSearchBuilder(Long.class); HostsInStatusSearch.selectField(HostsInStatusSearch.entity().getId()); HostsInStatusSearch.and("dc", HostsInStatusSearch.entity().getDataCenterId(), Op.EQ); @@ -235,75 +237,75 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao HostsInStatusSearch.and("type", HostsInStatusSearch.entity().getType(), Op.EQ); HostsInStatusSearch.and("statuses", HostsInStatusSearch.entity().getStatus(), Op.IN); HostsInStatusSearch.done(); - + _statusAttr = _allAttributes.get("status"); _msIdAttr = _allAttributes.get("managementServerId"); _pingTimeAttr = _allAttributes.get("lastPinged"); - + assert (_statusAttr != null && _msIdAttr != null && _pingTimeAttr != null) : "Couldn't find one of these attributes"; } - + @Override public long countBy(long clusterId, Status... statuses) { SearchCriteria sc = MaintenanceCountSearch.create(); - + sc.setParameters("status", (Object[])statuses); sc.setParameters("cluster", clusterId); List hosts = listBy(sc); return hosts.size(); } - + @Override public HostVO findSecondaryStorageHost(long dcId) { SearchCriteria sc = TypeDcSearch.create(); sc.setParameters("type", Host.Type.SecondaryStorage); sc.setParameters("dc", dcId); List storageHosts = listBy(sc); - + if (storageHosts == null || storageHosts.size() != 1) { return null; } else { return storageHosts.get(0); } } - + @Override public List listSecondaryStorageHosts() { SearchCriteria sc = TypeSearch.create(); sc.setParameters("type", Host.Type.SecondaryStorage); List secondaryStorageHosts = listIncludingRemovedBy(sc); - + return secondaryStorageHosts; } - + @Override public List findDirectlyConnectedHosts() { SearchCriteria sc = DirectlyConnectedSearch.create(); return search(sc, null); } - + @Override public List findDirectAgentToLoad(long msid, long lastPingSecondsAfter, Long limit) { SearchCriteria sc = UnmanagedDirectConnectSearch.create(); sc.setParameters("lastPinged", lastPingSecondsAfter); return search(sc, new Filter(HostVO.class, "clusterId", true, 0L, limit)); } - + @Override public void markHostsAsDisconnected(long msId, Status... states) { SearchCriteria sc = MsStatusSearch.create(); sc.setParameters("ms", msId); sc.setParameters("statuses", (Object[])states); - + HostVO host = createForUpdate(); host.setManagementServerId(null); host.setLastPinged((System.currentTimeMillis() >> 10) - ( 10 * 60 )); host.setDisconnectedOn(new Date()); - + UpdateBuilder ub = getUpdateBuilder(host); ub.set(host, "status", Status.Disconnected); - + update(ub, sc, null); } @@ -324,7 +326,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return listBy(sc); } - + @Override public List listBy(Long clusterId, Long podId, long dcId) { SearchCriteria sc = TypePodDcStatusSearch.create(); @@ -340,21 +342,21 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao @Override public List listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag) { - + SearchBuilder hostTagSearch = _hostTagsDao.createSearchBuilder(); HostTagVO tagEntity = hostTagSearch.entity(); hostTagSearch.and("tag",tagEntity.getTag(), SearchCriteria.Op.EQ); - + SearchBuilder hostSearch = createSearchBuilder(); HostVO entity = hostSearch.entity(); hostSearch.and("type", entity.getType(), SearchCriteria.Op.EQ); hostSearch.and("pod", entity.getPodId(), SearchCriteria.Op.EQ); hostSearch.and("dc", entity.getDataCenterId(), SearchCriteria.Op.EQ); hostSearch.and("cluster", entity.getClusterId(), SearchCriteria.Op.EQ); - hostSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ); + hostSearch.and("status", entity.getStatus(), SearchCriteria.Op.EQ); hostSearch.join("hostTagSearch", hostTagSearch, entity.getId(), tagEntity.getHostId(), JoinBuilder.JoinType.INNER); - - + + SearchCriteria sc = hostSearch.create(); sc.setJoinParameters("hostTagSearch", "tag", hostTag); sc.setParameters("type", type.toString()); @@ -366,19 +368,19 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao } sc.setParameters("dc", dcId); sc.setParameters("status", Status.Up.toString()); - + return listBy(sc); - } + } @Override public List listByCluster(long clusterId) { SearchCriteria sc = ClusterSearch.create(); - + sc.setParameters("cluster", clusterId); - + return listBy(sc); } - + @Override public List listBy(Host.Type type, long dcId) { SearchCriteria sc = TypeDcStatusSearch.create(); @@ -388,7 +390,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return listBy(sc); } - + @Override public List listAllBy(Host.Type type, long dcId) { SearchCriteria sc = TypeDcSearch.create(); @@ -397,25 +399,25 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return listBy(sc); } - + @Override public HostVO findByPrivateIpAddressInDataCenter(long dcId, String privateIpAddress) { SearchCriteria sc = DcPrivateIpAddressSearch.create(); sc.setParameters("dc", dcId); sc.setParameters("privateIpAddress", privateIpAddress); - + return findOneBy(sc); } - + @Override public HostVO findByStorageIpAddressInDataCenter(long dcId, String privateIpAddress) { SearchCriteria sc = DcStorageIpAddressSearch.create(); sc.setParameters("dc", dcId); sc.setParameters("storageIpAddress", privateIpAddress); - + return findOneBy(sc); } - + @Override public void loadDetails(HostVO host) { Map details =_detailsDao.findDetails(host.getId()); @@ -427,17 +429,20 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao List hostTags = _hostTagsDao.gethostTags(host.getId()); host.setHostTags(hostTags); } - + @Override - public boolean directConnect(HostVO host, long msId) { + public boolean directConnect(HostVO host, long msId, boolean secondConnect) { SearchCriteria sc = DirectConnectSearch.create(); sc.setParameters("id", host.getId()); - + if (secondConnect) { + sc.setParameters("server", msId); + } + host.setManagementServerId(msId); host.setLastPinged(System.currentTimeMillis() >> 10); UpdateBuilder ub = getUpdateBuilder(host); ub.set(host, _statusAttr, Status.Connecting); - + return update(host, sc) > 0; } @@ -449,11 +454,11 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao if ( host == null ) { return false; } - + if (newStatus == null) { return false; } - + SearchBuilder sb = createSearchBuilder(); sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); @@ -464,16 +469,16 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sb.closeParen(); } sb.done(); - + SearchCriteria sc = sb.create(); - + sc.setParameters("status", oldStatus); sc.setParameters("id", host.getId()); if (newStatus.checkManagementServer()) { sc.setParameters("ping", oldPingTime); sc.setParameters("msid", msId); } - + UpdateBuilder ub = getUpdateBuilder(host); ub.set(host, _statusAttr, newStatus); if (newStatus.updateManagementServer()) { @@ -485,17 +490,17 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao if( event.equals(Event.Ping) || event.equals(Event.AgentConnected)) { ub.set(host, _pingTimeAttr, System.currentTimeMillis() >> 10); } - } + } if ( event.equals(Event.ManagementServerDown)) { ub.set(host, _pingTimeAttr, (( System.currentTimeMillis() >> 10) - ( 10 * 60 ))); } int result = update(ub, sc, null); assert result <= 1 : "How can this update " + result + " rows? "; - + if (s_logger.isDebugEnabled() && result == 0) { HostVO vo = findById(host.getId()); assert vo != null : "How how how? : " + host.getId(); - + StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString()); str.append(". New=[status=").append(newStatus.toString()).append(":msid=").append(newStatus.lostConnection() ? "null" : msId).append(":lastpinged=").append(host.getLastPinged()).append("]"); str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(msId).append(":lastpinged=").append(oldPingTime).append("]"); @@ -504,7 +509,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao } return result > 0; } - + @Override public boolean disconnect(HostVO host, Event event, long msId) { host.setDisconnectedOn(new Date()); @@ -520,11 +525,11 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao Transaction txn = Transaction.currentTxn(); long id = host.getId(); txn.start(); - + if (!updateStatus(host, Event.AgentConnected, msId)) { return false; } - + txn.commit(); return true; } @@ -542,7 +547,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("state", Status.Up, Status.Updating, Status.Disconnected, Status.Connecting); return listBy(sc); } - + @Override public List findHostsLike(String hostName) { SearchCriteria sc = NameLikeSearch.create(); @@ -570,20 +575,20 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sc.setParameters("name", name); sc.setParameters("type", type); ListhostList = listBy(sc); - + if(hostList==null || hostList.size() == 0) { return null; } else { return hostList.get(0); } } - + @Override public List listByHostPod(long podId) { SearchCriteria sc = PodSearch.create("pod", podId); return listBy(sc); } - + @Override public List listByStatus(Status... status) { SearchCriteria sc = StatusSearch.create(); @@ -621,17 +626,17 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return; } _hostTagsDao.persist(host.getId(), hostTags); - } - + } + @Override @DB public HostVO persist(HostVO host) { final String InsertSequenceSql = "INSERT INTO op_host(id) VALUES(?)"; - + Transaction txn = Transaction.currentTxn(); txn.start(); - + HostVO dbHost = super.persist(host); - + try { PreparedStatement pstmt = txn.prepareAutoCloseStatement(InsertSequenceSql); pstmt.setLong(1, dbHost.getId()); @@ -639,32 +644,32 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao } catch (SQLException e) { throw new CloudRuntimeException("Unable to persist the sequence number for this host"); } - + saveDetails(host); loadDetails(dbHost); saveHostTags(host); loadHostTags(dbHost); - + txn.commit(); - + return dbHost; } - + @Override @DB public boolean update(Long hostId, HostVO host) { Transaction txn = Transaction.currentTxn(); txn.start(); - + boolean persisted = super.update(hostId, host); if (!persisted) { return persisted; } - + saveDetails(host); saveHostTags(host); - + txn.commit(); - + return persisted; } @@ -681,7 +686,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao "ORDER by t.data_center_id, t.type"; ArrayList l = new ArrayList(); - + Transaction txn = Transaction.currentTxn();; PreparedStatement pstmt = null; try { @@ -689,14 +694,14 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao String gmtCutTime = DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), cutTime); pstmt.setString(1, gmtCutTime); pstmt.setString(2, gmtCutTime); - + ResultSet rs = pstmt.executeQuery(); while(rs.next()) { RunningHostCountInfo info = new RunningHostCountInfo(); info.setDcId(rs.getLong(1)); info.setHostType(rs.getString(2)); info.setCount(rs.getInt(3)); - + l.add(info); } } catch (SQLException e) { @@ -710,13 +715,13 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao if (s_logger.isTraceEnabled()) { s_logger.trace("getNextSequence(), hostId: " + hostId); } - + TableGenerator tg = _tgs.get("host_req_sq"); assert tg != null : "how can this be wrong!"; - + return s_seqFetcher.getNextSequence(Long.class, tg, hostId); } - + @Override public List getAvailHypervisorInZone(long hostId, long zoneId) { SearchCriteria sc = AvailHypevisorInZone.create(); @@ -730,28 +735,28 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao } return hypers; } - + @Override public List listBy(Long dataCenterId, Long podId, Long clusterId, Type hostType, Status... statuses) { SearchCriteria sc = HostsInStatusSearch.create(); if (dataCenterId != null) { sc.setParameters("dc", dataCenterId); } - + if (podId != null) { sc.setParameters("pod", podId); } - + if (clusterId != null) { sc.setParameters("cluster", clusterId); } - + if (hostType != null) { sc.setParameters("type", hostType); } - + sc.setParameters("statuses", (Object[])statuses); - + return customSearch(sc, null); } }