From 0677232e0688d8a25f8042c05612c4967e6ef3b6 Mon Sep 17 00:00:00 2001 From: frank Date: Thu, 22 Sep 2011 11:55:23 -0700 Subject: [PATCH] Bug 11522 - New agent manager complete ResourceAdapter relevant interface --- .../resource/UnableDeleteHostException.java | 11 ++++ .../com/cloud/resource/ResourceManager.java | 11 ++++ .../cloud/resource/ResourceManagerImpl.java | 59 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100755 core/src/com/cloud/resource/UnableDeleteHostException.java diff --git a/core/src/com/cloud/resource/UnableDeleteHostException.java b/core/src/com/cloud/resource/UnableDeleteHostException.java new file mode 100755 index 00000000000..9445cc746df --- /dev/null +++ b/core/src/com/cloud/resource/UnableDeleteHostException.java @@ -0,0 +1,11 @@ +package com.cloud.resource; + +import com.cloud.utils.SerialVersionUID; + +public class UnableDeleteHostException extends Exception { + private static final long serialVersionUID = SerialVersionUID.UnableDeleteHostException; + + public UnableDeleteHostException(String msg) { + super(msg); + } +} diff --git a/server/src/com/cloud/resource/ResourceManager.java b/server/src/com/cloud/resource/ResourceManager.java index 526c22bb642..3ef2f17348d 100755 --- a/server/src/com/cloud/resource/ResourceManager.java +++ b/server/src/com/cloud/resource/ResourceManager.java @@ -34,4 +34,15 @@ public interface ResourceManager { public void registerResourceEvent(Integer event, ResourceListener listener); public void unregisterResourceEvent(ResourceListener listener); + + /** + * + * @param name of adapter + * @param adapter + * @param hates, a list of names which will be eliminated by this adapter. Especially for the case where + * can be only one adapter responds to an event, e.g. startupCommand + */ + public void registerResourceStateAdapter(String name, ResourceStateAdapter adapter); + + public void unregisterResourceStateAdapter(String name); } diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 64dd5e1a924..8ee661d5449 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -33,6 +33,7 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; +import com.cloud.agent.api.StartupCommand; import com.cloud.agent.manager.AgentAttache; import com.cloud.api.commands.AddClusterCmd; import com.cloud.api.commands.AddHostCmd; @@ -76,6 +77,7 @@ import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.User; import com.cloud.user.UserContext; +import com.cloud.utils.Pair; import com.cloud.utils.UriUtils; import com.cloud.utils.component.Adapters; import com.cloud.utils.component.Inject; @@ -120,6 +122,8 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma protected Adapters _discoverers; protected long _nodeId = ManagementServerNode.getManagementServerId(); + + protected HashMap _resourceStateAdapters = new HashMap(); protected HashMap> _lifeCycleListeners = new HashMap>(); @@ -973,4 +977,59 @@ public class ResourceManagerImpl implements ResourceManager, ResourceService, Ma return _name; } + @Override + public void registerResourceStateAdapter(String name, ResourceStateAdapter adapter) { + if (_resourceStateAdapters.get(name) != null) { + throw new CloudRuntimeException(name + " has registered"); + } + + synchronized (_resourceStateAdapters) { + _resourceStateAdapters.put(name, adapter); + } + } + + @Override + public void unregisterResourceStateAdapter(String name) { + synchronized (_resourceStateAdapters) { + _resourceStateAdapters.remove(name); + } + } + + 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.createHostVO((HostVO)args[0], (StartupCommand[])args[1]); + if (result != null && singleTaker) { + break; + } + } else if (event == ResourceStateAdapter.Event.CREATE_HOST_VO_FOR_DIRECT_CONNECT) { + result = adapter.createHostVO((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; + } + } + + }