diff --git a/api/src/com/cloud/host/Status.java b/api/src/com/cloud/host/Status.java index 6383b32a97a..c571ea0b1d6 100755 --- a/api/src/com/cloud/host/Status.java +++ b/api/src/com/cloud/host/Status.java @@ -25,6 +25,7 @@ import com.cloud.utils.fsm.StateMachine; import com.cloud.utils.fsm.StateMachine2; public enum Status { + Creating(true, false, false), Connecting(true, false, false), Up(true, false, false), Down(true, true, true), @@ -119,6 +120,7 @@ public enum Status { protected static final StateMachine2 s_fsm = new StateMachine2(); static { s_fsm.addTransition(null, Event.AgentConnected, Status.Connecting); + s_fsm.addTransition(Status.Creating, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Connecting, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Connecting, Event.Ready, Status.Up); s_fsm.addTransition(Status.Connecting, Event.PingTimeout, Status.Alert); diff --git a/core/src/com/cloud/host/HostVO.java b/core/src/com/cloud/host/HostVO.java index 1962b297d3b..b5b626f7f55 100755 --- a/core/src/com/cloud/host/HostVO.java +++ b/core/src/com/cloud/host/HostVO.java @@ -361,7 +361,7 @@ public class HostVO implements Host { public HostVO(String guid) { this.guid = guid; - this.status = Status.Up; + this.status = Status.Creating; this.totalMemory = 0; this.dom0MinMemory = 0; this.hostAllocationState = Host.HostAllocationState.Enabled; @@ -712,6 +712,10 @@ public class HostVO implements Host { return resourceState; } + public void setResourceState(ResourceState state) { + resourceState = state; + } + @Override public boolean isInMaintenanceStates() { return (getResourceState() == ResourceState.Maintenance || getResourceState() == ResourceState.ErrorInMaintenance diff --git a/ovm/src/com/cloud/ovm/hypervisor/OvmDiscoverer.java b/ovm/src/com/cloud/ovm/hypervisor/OvmDiscoverer.java index f7830e43cbb..7de803542aa 100755 --- a/ovm/src/com/cloud/ovm/hypervisor/OvmDiscoverer.java +++ b/ovm/src/com/cloud/ovm/hypervisor/OvmDiscoverer.java @@ -45,6 +45,18 @@ public class OvmDiscoverer extends DiscovererBase implements Discoverer, Resourc } + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); + return super.configure(name, params); + } + + @Override + public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); + return super.stop(); + } + @Override public Map> find(long dcId, Long podId, Long clusterId, URI url, String username, diff --git a/server/src/com/cloud/baremetal/BareMetalDiscoverer.java b/server/src/com/cloud/baremetal/BareMetalDiscoverer.java index 860149192e0..19eec54bf4b 100755 --- a/server/src/com/cloud/baremetal/BareMetalDiscoverer.java +++ b/server/src/com/cloud/baremetal/BareMetalDiscoverer.java @@ -27,6 +27,7 @@ import java.util.Map; import java.util.UUID; import javax.ejb.Local; +import javax.naming.ConfigurationException; import org.apache.log4j.Logger; @@ -44,6 +45,7 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; import com.cloud.resource.Discoverer; import com.cloud.resource.DiscovererBase; +import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; @@ -61,7 +63,20 @@ public class BareMetalDiscoverer extends DiscovererBase implements Discoverer, R @Inject protected HostDao _hostDao; @Inject DataCenterDao _dcDao; @Inject VMInstanceDao _vmDao = null; + @Inject ResourceManager _resourceMgr; + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); + return super.configure(name, params); + } + + @Override + public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); + return super.stop(); + } + @Override public Map> find(long dcId, Long podId, Long clusterId, URI url, String username, String password, List hostTags) throws DiscoveryException { diff --git a/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java b/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java index b882547551b..0dcade6643b 100755 --- a/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java +++ b/server/src/com/cloud/baremetal/ExternalDhcpManagerImpl.java @@ -89,6 +89,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager, ResourceSta @Override public boolean configure(String name, Map params) throws ConfigurationException { + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } @@ -99,6 +100,7 @@ public class ExternalDhcpManagerImpl implements ExternalDhcpManager, ResourceSta @Override public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); return true; } diff --git a/server/src/com/cloud/baremetal/PxeServerManagerImpl.java b/server/src/com/cloud/baremetal/PxeServerManagerImpl.java index 80a58a5f52d..1a6a498deeb 100755 --- a/server/src/com/cloud/baremetal/PxeServerManagerImpl.java +++ b/server/src/com/cloud/baremetal/PxeServerManagerImpl.java @@ -36,6 +36,7 @@ import com.cloud.deploy.DeployDestination; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; +import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; @@ -56,13 +57,14 @@ public class PxeServerManagerImpl implements PxeServerManager, ResourceStateAdap @Inject HostDao _hostDao; @Inject AgentManager _agentMgr; @Inject ExternalDhcpManager exDhcpMgr; - + @Inject ResourceManager _resourceMgr; @Inject(adapter=PxeServerService.class) protected Adapters _services; @Override public boolean configure(String name, Map params) throws ConfigurationException { _name = name; + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } @@ -73,6 +75,7 @@ public class PxeServerManagerImpl implements PxeServerManager, ResourceStateAdap @Override public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); return true; } diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index dc099c07654..42ee7f062ac 100755 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -88,6 +88,7 @@ import com.cloud.network.NetworkVO; import com.cloud.network.Networks.TrafficType; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; +import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; @@ -202,6 +203,8 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx StoragePoolDao _storagePoolDao; @Inject UserVmDetailsDao _vmDetailsDao; + @Inject + ResourceManager _resourceMgr; private ConsoleProxyListener _listener; @@ -1003,6 +1006,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx this._loadScanner.stop(); _allocProxyLock.releaseRef(); + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); return true; } @@ -1270,6 +1274,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx _loadScanner = new SystemVmLoadScanner(this); _loadScanner.initScan(STARTUP_DELAY, _capacityScanInterval); + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); if (s_logger.isInfoEnabled()) { s_logger.info("Console Proxy Manager is configured."); diff --git a/server/src/com/cloud/host/dao/HostDaoImpl.java b/server/src/com/cloud/host/dao/HostDaoImpl.java index 79539921db9..6b72bbec11c 100755 --- a/server/src/com/cloud/host/dao/HostDaoImpl.java +++ b/server/src/com/cloud/host/dao/HostDaoImpl.java @@ -925,62 +925,70 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao } @Override - public boolean updateState(Status oldStatus, Event event, - Status newStatus, Host vo, Long id) { - HostVO host = (HostVO)vo; - long oldPingTime = host.getLastPinged(); + public boolean updateState(Status oldStatus, Event event, Status newStatus, Host vo, Long id) { + HostVO host = (HostVO) vo; + long oldPingTime = host.getLastPinged(); - SearchBuilder sb = createSearchBuilder(); - sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); - sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); - if (newStatus.checkManagementServer()) { - sb.and("ping", sb.entity().getLastPinged(), SearchCriteria.Op.EQ); - sb.and().op("nullmsid", sb.entity().getManagementServerId(), SearchCriteria.Op.NULL); - sb.or("msid", sb.entity().getManagementServerId(), SearchCriteria.Op.EQ); - sb.closeParen(); - } - sb.done(); + SearchBuilder sb = createSearchBuilder(); + sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + if (newStatus.checkManagementServer()) { + sb.and("ping", sb.entity().getLastPinged(), SearchCriteria.Op.EQ); + sb.and().op("nullmsid", sb.entity().getManagementServerId(), SearchCriteria.Op.NULL); + sb.or("msid", sb.entity().getManagementServerId(), SearchCriteria.Op.EQ); + sb.closeParen(); + } + sb.done(); - SearchCriteria sc = sb.create(); + SearchCriteria sc = sb.create(); - sc.setParameters("status", oldStatus); - sc.setParameters("id", host.getId()); - if (newStatus.checkManagementServer()) { - sc.setParameters("ping", oldPingTime); - sc.setParameters("msid", host.getManagementServerId()); - } + sc.setParameters("status", oldStatus); + sc.setParameters("id", host.getId()); + if (newStatus.checkManagementServer()) { + sc.setParameters("ping", oldPingTime); + sc.setParameters("msid", host.getManagementServerId()); + } - UpdateBuilder ub = getUpdateBuilder(host); - ub.set(host, _statusAttr, newStatus); - if (newStatus.updateManagementServer()) { - if (newStatus.lostConnection()) { - ub.set(host, _msIdAttr, null); - } else { - ub.set(host, _msIdAttr, host.getManagementServerId()); - } - 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? "; + UpdateBuilder ub = getUpdateBuilder(host); + ub.set(host, _statusAttr, newStatus); + if (newStatus.updateManagementServer()) { + if (newStatus.lostConnection()) { + ub.set(host, _msIdAttr, null); + } else { + ub.set(host, _msIdAttr, host.getManagementServerId()); + } + 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 ho = findById(host.getId()); - assert ho != null : "How how how? : " + host.getId(); + if (s_logger.isDebugEnabled() && result == 0) { + HostVO ho = findById(host.getId()); + assert ho != 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" : host.getManagementServerId()).append(":lastpinged=").append(host.getLastPinged()) - .append("]"); - str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(host.getManagementServerId()).append(":lastpinged=").append(oldPingTime).append("]"); - str.append("; DB=[status=").append(vo.getStatus().toString()).append(":msid=").append(vo.getManagementServerId()).append(":lastpinged=").append(vo.getLastPinged()).append("]"); - s_logger.debug(str.toString()); - } - - return result > 0; + 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" : host.getManagementServerId()).append(":lastpinged=").append(host.getLastPinged()).append("]"); + str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(host.getManagementServerId()).append(":lastpinged=") + .append(oldPingTime).append("]"); + str.append("; DB=[status=").append(vo.getStatus().toString()).append(":msid=").append(vo.getManagementServerId()).append(":lastpinged=") + .append(vo.getLastPinged()).append("]"); + s_logger.debug(str.toString()); + } + + StringBuilder msg = new StringBuilder("Agent status update: ["); + msg.append("hostId = " + host.getId()); + msg.append("; old status = " + oldStatus); + msg.append("; event = " + event); + msg.append("; new status = " + newStatus + "]"); + s_logger.debug(msg.toString()); + + return result > 0; } @Override @@ -1009,6 +1017,13 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao /*TODO: add defbug info*/ } + StringBuilder msg = new StringBuilder("Resource state update: ["); + msg.append("hostId = " + host.getId()); + msg.append("; old state = " + oldState); + msg.append("; event = " + event); + msg.append("; new status = " + newState + "]"); + s_logger.debug(msg.toString()); + return result > 0; } diff --git a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java index 756c8bb4c7a..cfdf93f0e2e 100755 --- a/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/kvm/discoverer/KvmServerDiscoverer.java @@ -274,6 +274,7 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, if (_hostIp == null) { throw new ConfigurationException("Can't get host IP"); } + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } @@ -354,5 +355,12 @@ public class KvmServerDiscoverer extends DiscovererBase implements Discoverer, return new DeleteHostAnswer(true); } + + @Override + public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); + return super.stop(); + } + } diff --git a/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java b/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java index ac6cd2727de..1fc3f55ce85 100755 --- a/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/vmware/VmwareServerDiscoverer.java @@ -230,8 +230,10 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer createVmwareToolsIso(); - if(s_logger.isInfoEnabled()) - s_logger.info("VmwareServerDiscoverer has been successfully configured"); + if(s_logger.isInfoEnabled()) { + s_logger.info("VmwareServerDiscoverer has been successfully configured"); + } + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } @@ -279,6 +281,12 @@ public class VmwareServerDiscoverer extends DiscovererBase implements Discoverer public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException { // TODO Auto-generated method stub return null; + } + + @Override + public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); + return super.stop(); } } diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index 9f6407dc95b..ea52f9791f3 100755 --- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -456,6 +456,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L _agentMgr.registerForHostEvents(this, true, false, true); createXsToolsISO(); + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } @@ -651,5 +652,11 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L public DeleteHostAnswer deleteHost(HostVO host, boolean isForced, boolean isForceDeleteStorage) throws UnableDeleteHostException { // TODO Auto-generated method stub return null; - } + } + + @Override + public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); + return super.stop(); + } } diff --git a/server/src/com/cloud/network/ExternalNetworkManagerImpl.java b/server/src/com/cloud/network/ExternalNetworkManagerImpl.java index 1ebde0dd1f4..fe5eaf9a21c 100755 --- a/server/src/com/cloud/network/ExternalNetworkManagerImpl.java +++ b/server/src/com/cloud/network/ExternalNetworkManagerImpl.java @@ -168,6 +168,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager, Resou if (_externalNetworkStatsInterval > 0){ _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("ExternalNetworkMonitor")); } + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } @@ -181,6 +182,7 @@ public class ExternalNetworkManagerImpl implements ExternalNetworkManager, Resou @Override public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); return true; } diff --git a/server/src/com/cloud/network/NetworkUsageManagerImpl.java b/server/src/com/cloud/network/NetworkUsageManagerImpl.java index 021397c9d4a..f9235c9fdc8 100755 --- a/server/src/com/cloud/network/NetworkUsageManagerImpl.java +++ b/server/src/com/cloud/network/NetworkUsageManagerImpl.java @@ -226,6 +226,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta _networkStatsInterval = NumbersUtil.parseInt(_configDao.getValue(Config.DirectNetworkStatsInterval.key()), 86400); _agentMgr.registerForHostEvents(new DirectNetworkStatsListener( _networkStatsInterval), true, false, false); + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } @@ -236,6 +237,7 @@ public class NetworkUsageManagerImpl implements NetworkUsageManager, ResourceSta @Override public boolean stop() { + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); return true; } diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index c0704773aaa..ef068d67e5a 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -981,7 +981,6 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma throw new NoTransitionException("No next resource state found for current state =" + currentState + " event =" + event); } - /*TODO: adding debug trace*/ return _hostDao.updateResourceState(currentState, event, nextState, host); } @@ -1184,41 +1183,46 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma } } - private Object dispatchToStateAdapters(ResourceStateAdapter.Event event, boolean singleTaker, Object...args) { - synchronized (_resourceStateAdapters) { - Iterator it = _resourceStateAdapters.entrySet().iterator(); - Object result = null; - while (it.hasNext()) { - Map.Entry>> item = (Map.Entry>>)it.next(); - ResourceStateAdapter adapter = item.getValue().first(); - if (event == ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_CONNECTED) { - result = adapter.createHostVOForConnectedAgent((HostVO)args[0], (StartupCommand[])args[1]); - if (result != null && singleTaker) { - break; - } - } else if (event == ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_DIRECT_CONNECT) { - result = adapter.createHostVOForDirectConnectAgent((HostVO)args[0], (StartupCommand[])args[1], (ServerResource)args[2], (Map)args[3], (List)args[4]); - if (result != null && singleTaker) { - break; - } - } else if (event == ResourceStateAdapter.Event.DELETE_HOST) { - try { - result = adapter.deleteHost((HostVO) args[0], (Boolean) args[1], (Boolean) args[2]); - if (result != null) { - break; - } - } catch (UnableDeleteHostException e) { - s_logger.debug("Adapter " + adapter.getName() + " says unable to delete host", e); - result = new ResourceStateAdapter.DeleteHostAnswer(false, true); - } - } else { - throw new CloudRuntimeException("Unknown resource state event:" + event); - } - } - - return result; - } - } + private Object dispatchToStateAdapters(ResourceStateAdapter.Event event, boolean singleTaker, Object... args) { + synchronized (_resourceStateAdapters) { + Iterator it = _resourceStateAdapters.entrySet().iterator(); + Object result = null; + while (it.hasNext()) { + Map.Entry>> item = (Map.Entry>>) it.next(); + ResourceStateAdapter adapter = item.getValue().first(); + + String msg = new String("Dispatching resource state event " + event + " to " + item.getKey()); + s_logger.debug(msg); + + if (event == ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_CONNECTED) { + result = adapter.createHostVOForConnectedAgent((HostVO) args[0], (StartupCommand[]) args[1]); + if (result != null && singleTaker) { + break; + } + } else if (event == ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_DIRECT_CONNECT) { + result = adapter.createHostVOForDirectConnectAgent((HostVO) args[0], (StartupCommand[]) args[1], (ServerResource) args[2], + (Map) args[3], (List) args[4]); + if (result != null && singleTaker) { + break; + } + } else if (event == ResourceStateAdapter.Event.DELETE_HOST) { + try { + result = adapter.deleteHost((HostVO) args[0], (Boolean) args[1], (Boolean) args[2]); + if (result != null) { + break; + } + } catch (UnableDeleteHostException e) { + s_logger.debug("Adapter " + adapter.getName() + " says unable to delete host", e); + result = new ResourceStateAdapter.DeleteHostAnswer(false, true); + } + } else { + throw new CloudRuntimeException("Unknown resource state event:" + event); + } + } + + return result; + } + } @Override public void checkCIDR(HostPodVO pod, DataCenterVO dc, String serverPrivateIP, String serverPrivateNetmask) throws IllegalArgumentException { @@ -1283,13 +1287,13 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma ResourceStateAdapter.Event stateEvent) { StartupCommand startup = cmds[0]; HostVO host = _hostDao.findByGuid(startup.getGuid()); + boolean isNew = false; if (host == null) { host = _hostDao.findByGuid(startup.getGuidWithoutResource()); } if (host == null) { host = new HostVO(startup.getGuid()); - host.setResource(resource.getClass().getName()); - host = _hostDao.persist(host); + isNew = true; } // TODO: we don't allow to set ResourceState here? @@ -1375,9 +1379,19 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma host.setStorageMacAddressDeux(startup.getStorageMacAddressDeux()); host.setStorageNetmaskDeux(startup.getStorageNetmaskDeux()); } + if (resource != null) { + /* null when agent is connected agent */ + host.setResource(resource.getClass().getName()); + } host = (HostVO) dispatchToStateAdapters(stateEvent, true, host, cmds, resource, details, hostTags); - _hostDao.update(host.getId(), host); + assert host != null : "No resource state adapter response"; + + if (isNew) { + _hostDao.persist(host); + } else { + _hostDao.update(host.getId(), host); + } /* Agent goes to Connecting status */ _agentMgr.agentStatusTransitTo(host, Status.Event.AgentConnected, _nodeId); try { diff --git a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java old mode 100644 new mode 100755 index 3a3d7d4fde6..6eba822c0a7 --- a/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/secstorage/PremiumSecondaryStorageManagerImpl.java @@ -68,7 +68,7 @@ public class PremiumSecondaryStorageManagerImpl extends SecondaryStorageManagerI HostSearch.done(); ActiveCommandSearch.done(); - + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index af079260011..ecce1acac33 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -72,6 +72,7 @@ import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; import com.cloud.network.Networks.TrafficType; import com.cloud.offerings.NetworkOfferingVO; +import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceStateAdapter; import com.cloud.resource.ServerResource; import com.cloud.resource.UnableDeleteHostException; @@ -197,6 +198,8 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V protected CapacityDao _capacityDao; @Inject UserVmDetailsDao _vmDetailsDao; + @Inject + protected ResourceManager _resourceMgr; private long _capacityScanInterval = DEFAULT_CAPACITY_SCAN_INTERVAL; @@ -738,6 +741,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V public boolean stop() { _loadScanner.stop(); _allocLock.releaseRef(); + _resourceMgr.unregisterResourceStateAdapter(this.getClass().getSimpleName()); return true; } @@ -813,6 +817,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V if (s_logger.isInfoEnabled()) { s_logger.info("Secondary storage vm Manager is configured."); } + _resourceMgr.registerResourceStateAdapter(this.getClass().getSimpleName(), this); return true; } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index b368f595e37..a909fb8d983 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -699,6 +699,7 @@ CREATE TABLE `cloud`.`host` ( `created` datetime COMMENT 'date the host first signed on', `removed` datetime COMMENT 'date removed if not null', `allocation_state` varchar(32) NOT NULL DEFAULT 'Enabled' COMMENT 'Is this host enabled for allocation for new resources', + `resource_state` varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'Is this host enabled for allocation for new resources', PRIMARY KEY (`id`), INDEX `i_host__removed`(`removed`), INDEX `i_host__last_ping`(`last_ping`),