From cec3ac5e3863923a8a48b6d960b032eda9193d37 Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Tue, 3 Jan 2012 17:21:05 +0530 Subject: [PATCH] bug 12782 When host is put in maintenance remove the capacity entries in DB. When maintenance is cancelled repopulate the capacity entries in the DB. This is done to not account for the capacity of hosts in maintenance in the dashboard. Also for the capacity checker thread do not calaculate capacities for the hosts in maintenance. Reviewed by : Kishan. --- .../src/com/cloud/alert/AlertManagerImpl.java | 2 +- .../cloud/capacity/CapacityManagerImpl.java | 57 ++++++++++++++++++- .../com/cloud/resource/ResourceManager.java | 2 + .../cloud/resource/ResourceManagerImpl.java | 13 ++++- 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java index 4f58ef415b5..0368e27b709 100755 --- a/server/src/com/cloud/alert/AlertManagerImpl.java +++ b/server/src/com/cloud/alert/AlertManagerImpl.java @@ -289,7 +289,7 @@ public class AlertManagerImpl implements AlertManager { // Calculate CPU and RAM capacities // get all hosts...even if they are not in 'UP' state - List hosts = _resourceMgr.listAllHostsInAllZonesByType(Host.Type.Routing); + List hosts = _resourceMgr.listAllNotInMaintenanceHostsInOneZone(Host.Type.Routing, null); for (HostVO host : hosts) { _capacityMgr.updateCapacityForHost(host); } diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java index 24465df0278..f13503c7ce7 100755 --- a/server/src/com/cloud/capacity/CapacityManagerImpl.java +++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java @@ -17,6 +17,7 @@ */ package com.cloud.capacity; +import java.net.URI; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,7 +45,9 @@ import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.dao.HostDao; import com.cloud.offering.ServiceOffering; +import com.cloud.resource.ResourceListener; import com.cloud.resource.ResourceManager; +import com.cloud.resource.ServerResource; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.utils.DateUtil; @@ -63,7 +66,7 @@ import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.VMInstanceDao; @Local(value = CapacityManager.class) -public class CapacityManagerImpl implements CapacityManager, StateListener, Listener { +public class CapacityManagerImpl implements CapacityManager, StateListener, Listener, ResourceListener { private static final Logger s_logger = Logger.getLogger(CapacityManagerImpl.class); String _name; @Inject @@ -107,6 +110,8 @@ public class CapacityManagerImpl implements CapacityManager, StateListener> resources) { + // TODO Auto-generated method stub + + } + + @Override + public void processDiscoverEventBefore(Long dcid, Long podId, + Long clusterId, URI uri, String username, String password, + List hostTags) { + // TODO Auto-generated method stub + + } + + @Override + public void processPrepareMaintenaceEventAfter(Long hostId) { + _capacityDao.removeBy(Capacity.CAPACITY_TYPE_MEMORY, null, null, null, hostId); + _capacityDao.removeBy(Capacity.CAPACITY_TYPE_CPU, null, null, null, hostId); + } + + @Override + public void processPrepareMaintenaceEventBefore(Long hostId) { + // TODO Auto-generated method stub + + } + } diff --git a/server/src/com/cloud/resource/ResourceManager.java b/server/src/com/cloud/resource/ResourceManager.java index e9c79f71ad2..f54b5d7c802 100755 --- a/server/src/com/cloud/resource/ResourceManager.java +++ b/server/src/com/cloud/resource/ResourceManager.java @@ -131,4 +131,6 @@ public interface ResourceManager extends ResourceService{ String getHostTags(long hostId); List listByDataCenter(long dcId); + + List listAllNotInMaintenanceHostsInOneZone(Type type, Long dcId); } diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 85928d7c2ff..a4e86c87b02 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -1100,7 +1100,7 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma try { processResourceEvent(ResourceListener.EVENT_PREPARE_MAINTENANCE_BEFORE, hostId); if (maintain(hostId)) { - processResourceEvent(ResourceListener.EVENT_CANCEL_MAINTENANCE_AFTER, hostId); + processResourceEvent(ResourceListener.EVENT_PREPARE_MAINTENANCE_AFTER, hostId); return _hostDao.findById(hostId); } else { throw new CloudRuntimeException("Unable to prepare for maintenance host " + hostId); @@ -1926,6 +1926,17 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma return sc.list(); } + @Override + public List listAllNotInMaintenanceHostsInOneZone(Type type, Long dcId) { + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); + if (dcId != null){ + sc.addAnd(sc.getEntity().getDataCenterId(), Op.EQ, dcId); + } + sc.addAnd(sc.getEntity().getType(), Op.EQ, type); + sc.addAnd(sc.getEntity().getResourceState(), Op.NIN, ResourceState.Maintenance, ResourceState.ErrorInMaintenance, ResourceState.PrepareForMaintenance, ResourceState.Error); + return sc.list(); + } + @Override public List listAllHostsInOneZoneByType(Type type, long dcId) { SearchCriteriaService sc = SearchCriteria2.create(HostVO.class);