From 46e644e134f474c5eaa65df18c5bb1eee0ad37a5 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Mon, 29 Jul 2013 11:43:53 -0700 Subject: [PATCH] Separate agentmanager from server code. Moved out ssvm. Remove methods that shouldn't be used --- .../test/DirectAgentManagerSimpleImpl.java | 24 +-- server/src/com/cloud/agent/AgentManager.java | 10 +- .../com/cloud/agent/manager/AgentAttache.java | 8 +- .../cloud/agent/manager/AgentManagerImpl.java | 33 +-- .../com/cloud/agent/manager/AgentMonitor.java | 19 +- .../agent/manager/ConnectedAgentAttache.java | 8 +- .../agent/manager/DirectAgentAttache.java | 5 - .../com/cloud/agent/manager/DummyAttache.java | 8 - .../cloud/resource/ResourceManagerImpl.java | 12 +- .../com/cloud/agent/MockAgentManagerImpl.java | 189 ------------------ 10 files changed, 23 insertions(+), 293 deletions(-) delete mode 100755 server/test/com/cloud/agent/MockAgentManagerImpl.java diff --git a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java index ac50e9bde95..a88d2086210 100644 --- a/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java +++ b/engine/storage/integration-test/test/org/apache/cloudstack/storage/test/DirectAgentManagerSimpleImpl.java @@ -58,7 +58,7 @@ import com.cloud.utils.exception.CloudRuntimeException; public class DirectAgentManagerSimpleImpl extends ManagerBase implements AgentManager { private static final Logger logger = Logger.getLogger(DirectAgentManagerSimpleImpl.class); - private Map hostResourcesMap = new HashMap(); + private final Map hostResourcesMap = new HashMap(); @Inject HostDao hostDao; @Inject @@ -222,12 +222,6 @@ public class DirectAgentManagerSimpleImpl extends ManagerBase implements AgentMa } - @Override - public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException { - // TODO Auto-generated method stub - return false; - } - @Override public Answer sendTo(Long dcId, HypervisorType type, Command cmd) { // TODO Auto-generated method stub @@ -253,12 +247,6 @@ public class DirectAgentManagerSimpleImpl extends ManagerBase implements AgentMa return false; } - @Override - public AgentAttache findAttache(long hostId) { - // TODO Auto-generated method stub - return null; - } - @Override public void disconnectWithoutInvestigation(long hostId, Event event) { // TODO Auto-generated method stub @@ -284,15 +272,9 @@ public class DirectAgentManagerSimpleImpl extends ManagerBase implements AgentMa } @Override - public Answer sendToSSVM(Long dcId, Command cmd) { + public boolean isAgentAttached(long hostId) { // TODO Auto-generated method stub - return null; - } - - @Override - public void disconnectWithInvestigation(long hostId, Event event) { - // TODO Auto-generated method stub - + return false; } } diff --git a/server/src/com/cloud/agent/AgentManager.java b/server/src/com/cloud/agent/AgentManager.java index 02dd10d810f..de9be96cd94 100755 --- a/server/src/com/cloud/agent/AgentManager.java +++ b/server/src/com/cloud/agent/AgentManager.java @@ -16,8 +16,6 @@ // under the License. package com.cloud.agent; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; - import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; @@ -28,7 +26,6 @@ import com.cloud.exception.ConnectionException; import com.cloud.exception.OperationTimedoutException; import com.cloud.host.HostVO; import com.cloud.host.Status; -import com.cloud.host.Status.Event; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ServerResource; import com.cloud.utils.component.Manager; @@ -133,8 +130,6 @@ public interface AgentManager extends Manager { */ void unregisterForHostEvents(int id); - public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException; - Answer sendTo(Long dcId, HypervisorType type, Command cmd); @@ -145,7 +140,7 @@ public interface AgentManager extends Manager { public boolean agentStatusTransitTo(HostVO host, Status.Event e, long msId); - public AgentAttache findAttache(long hostId); + boolean isAgentAttached(long hostId); void disconnectWithoutInvestigation(long hostId, Status.Event event); @@ -154,7 +149,4 @@ public interface AgentManager extends Manager { public void pullAgentOutMaintenance(long hostId); boolean reconnect(long hostId); - Answer sendToSSVM(Long dcId, final Command cmd); - - void disconnectWithInvestigation(final long hostId, final Status.Event event); } diff --git a/server/src/com/cloud/agent/manager/AgentAttache.java b/server/src/com/cloud/agent/manager/AgentAttache.java index 1785bcf7870..67deba0d648 100755 --- a/server/src/com/cloud/agent/manager/AgentAttache.java +++ b/server/src/com/cloud/agent/manager/AgentAttache.java @@ -329,7 +329,7 @@ public abstract class AgentAttache { public boolean equals(Object obj) { try { AgentAttache that = (AgentAttache) obj; - return this._id == that._id; + return _id == that._id; } catch (ClassCastException e) { assert false : "Who's sending an " + obj.getClass().getSimpleName() + " to AgentAttache.equals()? "; return false; @@ -485,12 +485,6 @@ public abstract class AgentAttache { */ public abstract void send(Request req) throws AgentUnavailableException; - /** - * Update password. - * @param new/changed password. - */ - public abstract void updatePassword(Command new_password); - /** * Process disconnect. * @param state state of the agent. diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index 46b864485fe..f49fca60c90 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -123,8 +123,6 @@ import com.cloud.utils.nio.Task; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.dao.VMInstanceDao; -import edu.emory.mathcs.backport.java.util.Collections; - /** * Implementation of the Agent Manager. This class controls the connection to the agents. * @@ -372,7 +370,6 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl } } - @Override public AgentAttache findAttache(long hostId) { AgentAttache attache = null; synchronized (_agents) { @@ -381,29 +378,6 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl return attache; } - - - private void sendToSSVM(final long dcId, final Command cmd, final Listener listener) throws AgentUnavailableException { - List ssAHosts = _ssvmMgr.listUpAndConnectingSecondaryStorageVmHost(dcId); - if (ssAHosts == null || ssAHosts.isEmpty() ) { - throw new AgentUnavailableException("No ssvm host found", -1); - } - Collections.shuffle(ssAHosts); - HostVO ssAhost = ssAHosts.get(0); - send(ssAhost.getId(), new Commands(cmd), listener); - } - - @Override - public Answer sendToSSVM(final Long dcId, final Command cmd) { - List ssAHosts = _ssvmMgr.listUpAndConnectingSecondaryStorageVmHost(dcId); - if (ssAHosts == null || ssAHosts.isEmpty() ) { - return new Answer(cmd, false, "can not find secondary storage VM agent for data center " + dcId); - } - Collections.shuffle(ssAHosts); - HostVO ssAhost = ssAHosts.get(0); - return easySend(ssAhost.getId(), cmd); - } - @Override public Answer sendTo(Long dcId, HypervisorType type, Command cmd) { List clusters = _clusterDao.listByDcHyType(dcId, type.toString()); @@ -1044,7 +1018,6 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl return true; } - @Override public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException { if (event == Event.AgentDisconnected) { if (s_logger.isDebugEnabled()) { @@ -1062,6 +1035,11 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl return false; } + @Override + public boolean isAgentAttached(long hostId) { + return findAttache(hostId) != null; + } + protected AgentAttache createAttacheForConnect(HostVO host, Link link) throws ConnectionException { s_logger.debug("create ConnectedAgentAttache for " + host.getId()); AgentAttache attache = new ConnectedAgentAttache(this, host.getId(), link, host.isInMaintenanceStates()); @@ -1462,7 +1440,6 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl } } - @Override public void disconnectWithInvestigation(final long hostId, final Status.Event event) { disconnectInternal(hostId, event, true); } diff --git a/server/src/com/cloud/agent/manager/AgentMonitor.java b/server/src/com/cloud/agent/manager/AgentMonitor.java index 2c0266e6689..be850318967 100755 --- a/server/src/com/cloud/agent/manager/AgentMonitor.java +++ b/server/src/com/cloud/agent/manager/AgentMonitor.java @@ -26,8 +26,6 @@ import javax.inject.Inject; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import com.cloud.agent.AgentManager; -import com.cloud.agent.Listener; import com.cloud.agent.api.AgentControlAnswer; import com.cloud.agent.api.AgentControlCommand; import com.cloud.agent.api.Answer; @@ -35,7 +33,6 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.PingCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.alert.AlertManager; -import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.ClusterDao; @@ -48,10 +45,9 @@ import com.cloud.host.Status.Event; import com.cloud.host.dao.HostDao; import com.cloud.resource.ResourceManager; import com.cloud.resource.ResourceState; -import com.cloud.utils.db.ConnectionConcierge; import com.cloud.utils.db.DB; -import com.cloud.utils.db.SearchCriteria2; import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.SearchCriteria2; import com.cloud.utils.db.SearchCriteriaService; import com.cloud.utils.time.InaccurateClock; import com.cloud.vm.VMInstanceVO; @@ -64,17 +60,18 @@ public class AgentMonitor extends Thread implements AgentMonitorService { private long _pingTimeout = 120; // Default set to 120 seconds @Inject private HostDao _hostDao; private boolean _stop; - @Inject private AgentManager _agentMgr; + @Inject + private AgentManagerImpl _agentMgr; @Inject private VMInstanceDao _vmDao; - @Inject private DataCenterDao _dcDao = null; - @Inject private HostPodDao _podDao = null; + @Inject private final DataCenterDao _dcDao = null; + @Inject private final HostPodDao _podDao = null; @Inject private AlertManager _alertMgr; private long _msId; @Inject ClusterDao _clusterDao; @Inject ResourceManager _resourceMgr; // private ConnectionConcierge _concierge; - private Map _pingMap; + private final Map _pingMap; public AgentMonitor() { _pingMap = new ConcurrentHashMap(10007); @@ -87,6 +84,7 @@ public class AgentMonitor extends Thread implements AgentMonitorService { * agent or host id. * @return null if the agent is not kept here. true if behind; false if not. */ + @Override public Boolean isAgentBehindOnPing(long agentId) { Long pingTime = _pingMap.get(agentId); if (pingTime == null) { @@ -95,10 +93,12 @@ public class AgentMonitor extends Thread implements AgentMonitorService { return pingTime < (InaccurateClock.getTimeInSeconds() - _pingTimeout); } + @Override public Long getAgentPingTime(long agentId) { return _pingMap.get(agentId); } + @Override public void pingBy(long agentId) { _pingMap.put(agentId, InaccurateClock.getTimeInSeconds()); } @@ -168,6 +168,7 @@ public class AgentMonitor extends Thread implements AgentMonitorService { s_logger.info("Agent Monitor is leaving the building!"); } + @Override public void signalStop() { _stop = true; interrupt(); diff --git a/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java b/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java index c98307ba25d..e5d2867b96d 100755 --- a/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java +++ b/server/src/com/cloud/agent/manager/ConnectedAgentAttache.java @@ -20,8 +20,6 @@ import java.nio.channels.ClosedChannelException; import org.apache.log4j.Logger; -import com.cloud.agent.AgentManager; -import com.cloud.agent.api.Command; import com.cloud.agent.transport.Request; import com.cloud.exception.AgentUnavailableException; import com.cloud.host.Status; @@ -72,7 +70,7 @@ public class ConnectedAgentAttache extends AgentAttache { public boolean equals(Object obj) { try { ConnectedAgentAttache that = (ConnectedAgentAttache) obj; - return super.equals(obj) && this._link == that._link && this._link != null; + return super.equals(obj) && _link == that._link && _link != null; } catch (ClassCastException e) { assert false : "Who's sending an " + obj.getClass().getSimpleName() + " to " + this.getClass().getSimpleName() + ".equals()? "; return false; @@ -94,8 +92,4 @@ public class ConnectedAgentAttache extends AgentAttache { } } - @Override - public void updatePassword(Command newPassword) { - throw new IllegalStateException("Should not have come here "); - } } diff --git a/server/src/com/cloud/agent/manager/DirectAgentAttache.java b/server/src/com/cloud/agent/manager/DirectAgentAttache.java index 9b7d69f1aba..7a3699838fb 100755 --- a/server/src/com/cloud/agent/manager/DirectAgentAttache.java +++ b/server/src/com/cloud/agent/manager/DirectAgentAttache.java @@ -212,9 +212,4 @@ public class DirectAgentAttache extends AgentAttache { } } - - @Override - public void updatePassword(Command new_password) { - _resource.executeRequest(new_password); - } } diff --git a/server/src/com/cloud/agent/manager/DummyAttache.java b/server/src/com/cloud/agent/manager/DummyAttache.java index 14286d25d06..182c1b85d59 100755 --- a/server/src/com/cloud/agent/manager/DummyAttache.java +++ b/server/src/com/cloud/agent/manager/DummyAttache.java @@ -16,8 +16,6 @@ // under the License. package com.cloud.agent.manager; -import com.cloud.agent.AgentManager; -import com.cloud.agent.api.Command; import com.cloud.agent.transport.Request; import com.cloud.exception.AgentUnavailableException; import com.cloud.host.Status; @@ -47,10 +45,4 @@ public class DummyAttache extends AgentAttache { } - - @Override - public void updatePassword(Command newPassword) { - throw new IllegalStateException("Should not have come here "); - } - } diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index d0c5aa6a5b8..a177b320688 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -819,13 +819,6 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (!isForced && host.getResourceState() != ResourceState.Maintenance) { throw new CloudRuntimeException("Host " + host.getUuid() + " cannot be deleted as it is not in maintenance mode. Either put the host into maintenance or perform a forced deletion."); } - /* - * TODO: check current agent status and updateAgentStatus to removed. If - * it was already removed, that means someone is deleting host - * concurrently, return. And consider the situation of CloudStack - * shutdown during delete. A global lock? - */ - AgentAttache attache = _agentMgr.findAttache(hostId); // Get storage pool host mappings here because they can be removed as a // part of handleDisconnect later // TODO: find out the bad boy, what's a buggy logic! @@ -2204,8 +2197,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } private boolean doUpdateHostPassword(long hostId) { - AgentAttache attache = _agentMgr.findAttache(hostId); - if (attache == null) { + if (_agentMgr.isAgentAttached(hostId)) { return false; } @@ -2214,7 +2206,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, nv = _hostDetailsDao.findDetail(hostId, ApiConstants.PASSWORD); String password = nv.getValue(); UpdateHostPasswordCommand cmd = new UpdateHostPasswordCommand(username, password); - attache.updatePassword(cmd); + _agentMgr.easySend(hostId, cmd); return true; } diff --git a/server/test/com/cloud/agent/MockAgentManagerImpl.java b/server/test/com/cloud/agent/MockAgentManagerImpl.java deleted file mode 100755 index 01f4e9cb071..00000000000 --- a/server/test/com/cloud/agent/MockAgentManagerImpl.java +++ /dev/null @@ -1,189 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// with the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package com.cloud.agent; - -import java.util.Map; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.springframework.stereotype.Component; - -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; -import com.cloud.agent.api.StartupCommand; -import com.cloud.agent.manager.AgentAttache; -import com.cloud.agent.manager.Commands; -import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.ConnectionException; -import com.cloud.exception.OperationTimedoutException; -import com.cloud.host.HostVO; -import com.cloud.host.Status.Event; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.resource.ServerResource; -import com.cloud.utils.component.ManagerBase; - -@Component -@Local(value = { AgentManager.class }) -public class MockAgentManagerImpl extends ManagerBase implements AgentManager { - - @Override - public boolean configure(String name, Map params) throws ConfigurationException { - // TODO Auto-generated method stub - return true; - } - - @Override - public boolean start() { - return true; - } - - @Override - public boolean stop() { - // TODO Auto-generated method stub - return false; - } - - @Override - public String getName() { - // TODO Auto-generated method stub - return null; - } - - @Override - public Answer easySend(Long hostId, Command cmd) { - // TODO Auto-generated method stub - return null; - } - - @Override - public Answer send(Long hostId, Command cmd) throws AgentUnavailableException, OperationTimedoutException { - // TODO Auto-generated method stub - return null; - } - - @Override - public Answer[] send(Long hostId, Commands cmds) throws AgentUnavailableException, OperationTimedoutException { - // TODO Auto-generated method stub - return null; - } - - @Override - public Answer[] send(Long hostId, Commands cmds, int timeout) throws AgentUnavailableException, OperationTimedoutException { - // TODO Auto-generated method stub - return null; - } - - @Override - public long send(Long hostId, Commands cmds, Listener listener) throws AgentUnavailableException { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int registerForHostEvents(Listener listener, boolean connections, boolean commands, boolean priority) { - // TODO Auto-generated method stub - return 0; - } - - @Override - public int registerForInitialConnects(StartupCommandProcessor creator, boolean priority) { - // TODO Auto-generated method stub - return 0; - } - - @Override - public void unregisterForHostEvents(int id) { - // TODO Auto-generated method stub - - } - - @Override - public boolean executeUserRequest(long hostId, Event event) throws AgentUnavailableException { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean reconnect(long hostId) { - // TODO Auto-generated method stub - return false; - } - - @Override - public Answer sendTo(Long dcId, HypervisorType type, Command cmd) { - // TODO Auto-generated method stub - return null; - } - - - @Override - public boolean tapLoadingAgents(Long hostId, TapAgentsAction action) { - // TODO Auto-generated method stub - return false; - } - - @Override - public AgentAttache handleDirectConnectAgent(HostVO host, StartupCommand[] cmds, ServerResource resource, boolean forRebalance) throws ConnectionException { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean agentStatusTransitTo(HostVO host, Event e, long msId) { - // TODO Auto-generated method stub - return false; - } - - @Override - public AgentAttache findAttache(long hostId) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void pullAgentToMaintenance(long hostId) { - // TODO Auto-generated method stub - - } - - @Override - public void disconnectWithoutInvestigation(long hostId, Event event) { - // TODO Auto-generated method stub - - } - - @Override - public void pullAgentOutMaintenance(long hostId) { - // TODO Auto-generated method stub - - } - - @Override - public Answer sendToSSVM(Long dcId, Command cmd) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void disconnectWithInvestigation(long hostId, Event event) { - // TODO Auto-generated method stub - - } - -}