diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl2.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl2.java index b513fc0a835..166243e5558 100644 --- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl2.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl2.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; +import java.util.concurrent.ConcurrentHashMap; import javax.ejb.Local; import javax.naming.ConfigurationException; @@ -36,6 +37,8 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.mgmt.JmxUtil; import com.cloud.vm.VirtualMachine.State; +import edu.emory.mathcs.backport.java.util.Collections; + /** * Same as the base class -- except it uses the abstracted security group work queue * @@ -46,6 +49,7 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl{ SecurityManagerMBeanImpl _mBean; WorkerThread[] _workers; + private Set _disabledVms = Collections.newSetFromMap(new ConcurrentHashMap()); protected class WorkerThread extends Thread { @@ -82,6 +86,7 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl{ } Set workItems = new TreeSet(); workItems.addAll(affectedVms); + workItems.removeAll(_disabledVms); if (s_logger.isTraceEnabled()) { s_logger.trace("Security Group Mgr v2: scheduling ruleset updates for " + affectedVms.size() + " vms " + " (unique=" + workItems.size() + "), current queue size=" + _workQueue.size()); @@ -254,4 +259,22 @@ public class SecurityGroupManagerImpl2 extends SecurityGroupManagerImpl{ return super.configure(name, params); } + public void disableSchedulerForVm(Long vmId, boolean disable) { + if (disable) { + _disabledVms.add(vmId); + } else { + _disabledVms.remove(vmId); + } + + } + + public Long[] getDisabledVmsForScheduler() { + Long [] result = new Long[_disabledVms.size()]; + return _disabledVms.toArray(result ); + } + + public void enableAllVmsForScheduler() { + _disabledVms.clear(); + } + } diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerMBean.java b/server/src/com/cloud/network/security/SecurityGroupManagerMBean.java index 5cd1a1f8c23..9d5a6f5a412 100644 --- a/server/src/com/cloud/network/security/SecurityGroupManagerMBean.java +++ b/server/src/com/cloud/network/security/SecurityGroupManagerMBean.java @@ -28,6 +28,14 @@ import java.util.Date; public interface SecurityGroupManagerMBean { void enableUpdateMonitor(boolean enable); + void disableSchedulerForVm(Long vmId); + + void enableSchedulerForVm(Long vmId); + + Long[] getDisabledVmsForScheduler(); + + void enableSchedulerForAllVms(); + Map getScheduledTimestamps(); Map getLastUpdateSentTimestamps(); @@ -35,5 +43,6 @@ public interface SecurityGroupManagerMBean { int getQueueSize(); List getVmsInQueue(); + } diff --git a/server/src/com/cloud/network/security/SecurityManagerMBeanImpl.java b/server/src/com/cloud/network/security/SecurityManagerMBeanImpl.java index 699f43fae7e..b20908ab062 100644 --- a/server/src/com/cloud/network/security/SecurityManagerMBeanImpl.java +++ b/server/src/com/cloud/network/security/SecurityManagerMBeanImpl.java @@ -72,4 +72,33 @@ public class SecurityManagerMBeanImpl extends StandardMBean implements SecurityG return _sgMgr.getWorkQueue().getVmsInQueue(); } + + + + @Override + public void disableSchedulerForVm(Long vmId) { + _sgMgr.disableSchedulerForVm(vmId, true); + + } + + @Override + public void enableSchedulerForVm(Long vmId) { + _sgMgr.disableSchedulerForVm(vmId, false); + + } + + @Override + public Long[] getDisabledVmsForScheduler() { + return _sgMgr.getDisabledVmsForScheduler(); + } + + + + + @Override + public void enableSchedulerForAllVms() { + _sgMgr.enableAllVmsForScheduler(); + + } + }