| // 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.resource; |
| |
| import java.io.File; |
| import java.io.PrintWriter; |
| import java.io.StringWriter; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Date; |
| import java.util.LinkedList; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.concurrent.atomic.AtomicReference; |
| |
| import javax.inject.Inject; |
| import javax.naming.ConfigurationException; |
| |
| import org.apache.cloudstack.managed.context.ManagedContextRunnable; |
| import org.apache.log4j.Logger; |
| |
| import com.cloud.agent.IAgentControl; |
| import com.cloud.agent.api.Answer; |
| import com.cloud.agent.api.Command; |
| import com.cloud.agent.api.PingCommand; |
| import com.cloud.agent.api.StartupCommand; |
| import com.cloud.agent.manager.MockAgentManager; |
| import com.cloud.agent.manager.MockStorageManager; |
| import com.cloud.agent.manager.MockVmManager; |
| import com.cloud.agent.manager.SimulatorManager; |
| import com.cloud.agent.manager.SimulatorManager.AgentType; |
| import com.cloud.agent.manager.SimulatorManagerImpl; |
| import com.cloud.host.Host; |
| import com.cloud.host.Host.Type; |
| import com.cloud.simulator.MockHost; |
| import com.cloud.utils.component.ComponentContext; |
| |
| public class AgentResourceBase implements ServerResource { |
| private static final Logger s_logger = Logger.getLogger(AgentResourceBase.class); |
| |
| protected String _name; |
| private List<String> _warnings = new LinkedList<String>(); |
| private List<String> _errors = new LinkedList<String>(); |
| |
| private transient IAgentControl _agentControl; |
| |
| protected long _instanceId; |
| |
| private Type _type; |
| |
| @Inject |
| protected SimulatorManager _simMgr; |
| protected MockHost agentHost = null; |
| protected boolean stopped = false; |
| protected String hostGuid = null; |
| |
| public AgentResourceBase(long instanceId, AgentType agentType, SimulatorManager simMgr, String hostGuid) { |
| _instanceId = instanceId; |
| |
| if (s_logger.isDebugEnabled()) { |
| s_logger.info("New Routing host instantiated with guid:" + hostGuid); |
| } |
| |
| if (agentType == AgentType.Routing) { |
| _type = Host.Type.Routing; |
| } else { |
| _type = Host.Type.Storage; |
| } |
| |
| this.hostGuid = hostGuid; |
| } |
| |
| protected MockVmManager getVmMgr() { |
| return _simMgr.getVmMgr(); |
| } |
| |
| protected MockStorageManager getStorageMgr() { |
| return _simMgr.getStorageMgr(); |
| } |
| |
| protected MockAgentManager getAgentMgr() { |
| return _simMgr.getAgentMgr(); |
| } |
| |
| protected long getInstanceId() { |
| return _instanceId; |
| } |
| |
| public AgentResourceBase() { |
| if (s_logger.isDebugEnabled()) { |
| s_logger.debug("Deserializing simulated agent on reconnect"); |
| } |
| |
| } |
| |
| @Override |
| public String getName() { |
| return _name; |
| } |
| |
| @Override |
| public void setName(String name) { |
| _name = name; |
| } |
| |
| @Override |
| public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { |
| hostGuid = (String)params.get("guid"); |
| |
| _simMgr = ComponentContext.inject(SimulatorManagerImpl.class); |
| _simMgr.configure(name, params); |
| |
| agentHost = getAgentMgr().getHost(hostGuid); |
| return true; |
| } |
| |
| private void reconnect(MockHost host) { |
| if (s_logger.isDebugEnabled()) { |
| s_logger.debug("Reconfiguring existing simulated host w/ name: " + host.getName() + " and guid: " + host.getGuid()); |
| } |
| this.agentHost = host; |
| } |
| |
| @Override |
| public void disconnected() { |
| this.stopped = true; |
| } |
| |
| protected void recordWarning(String msg, Throwable th) { |
| String str = getLogStr(msg, th); |
| synchronized (_warnings) { |
| _warnings.add(str); |
| } |
| } |
| |
| protected void recordWarning(String msg) { |
| recordWarning(msg, null); |
| } |
| |
| protected List<String> getWarnings() { |
| synchronized (this) { |
| List<String> results = _warnings; |
| _warnings = new ArrayList<String>(); |
| return results; |
| } |
| } |
| |
| protected List<String> getErrors() { |
| synchronized (this) { |
| List<String> result = _errors; |
| _errors = new ArrayList<String>(); |
| return result; |
| } |
| } |
| |
| protected void recordError(String msg, Throwable th) { |
| String str = getLogStr(msg, th); |
| synchronized (_errors) { |
| _errors.add(str); |
| } |
| } |
| |
| protected void recordError(String msg) { |
| recordError(msg, null); |
| } |
| |
| protected Answer createErrorAnswer(Command cmd, String msg, Throwable th) { |
| StringWriter writer = new StringWriter(); |
| if (msg != null) { |
| writer.append(msg); |
| } |
| writer.append("===>Stack<==="); |
| th.printStackTrace(new PrintWriter(writer)); |
| return new Answer(cmd, false, writer.toString()); |
| } |
| |
| protected String createErrorDetail(String msg, Throwable th) { |
| StringWriter writer = new StringWriter(); |
| if (msg != null) { |
| writer.append(msg); |
| } |
| writer.append("===>Stack<==="); |
| th.printStackTrace(new PrintWriter(writer)); |
| return writer.toString(); |
| } |
| |
| protected String getLogStr(String msg, Throwable th) { |
| StringWriter writer = new StringWriter(); |
| writer.append(new Date().toString()).append(": ").append(msg); |
| if (th != null) { |
| writer.append("\n Exception: "); |
| th.printStackTrace(new PrintWriter(writer)); |
| } |
| return writer.toString(); |
| } |
| |
| @Override |
| public boolean start() { |
| return true; |
| } |
| |
| @Override |
| public boolean stop() { |
| this.stopped = true; |
| return true; |
| } |
| |
| @Override |
| public IAgentControl getAgentControl() { |
| return _agentControl; |
| } |
| |
| @Override |
| public void setAgentControl(IAgentControl agentControl) { |
| _agentControl = agentControl; |
| } |
| |
| protected String findScript(String script) { |
| s_logger.debug("Looking for " + script + " in the classpath"); |
| URL url = ClassLoader.getSystemResource(script); |
| File file = null; |
| if (url == null) { |
| file = new File("./" + script); |
| s_logger.debug("Looking for " + script + " in " + file.getAbsolutePath()); |
| if (!file.exists()) { |
| return null; |
| } |
| } else { |
| file = new File(url.getFile()); |
| } |
| return file.getAbsolutePath(); |
| } |
| |
| @Override |
| public final Answer executeRequest(final Command cmd) { |
| final AtomicReference<Answer> result = new AtomicReference<Answer>(); |
| new ManagedContextRunnable() { |
| @Override |
| protected void runInContext() { |
| result.set(executeRequestInContext(cmd)); |
| } |
| }.run(); |
| |
| return result.get(); |
| } |
| |
| public Answer executeRequestInContext(Command cmd) { |
| return null; |
| } |
| |
| @Override |
| public PingCommand getCurrentStatus(long id) { |
| return null; |
| } |
| |
| @Override |
| public Type getType() { |
| return _type; |
| } |
| |
| public void setType(Host.Type type) { |
| this._type = type; |
| } |
| |
| @Override |
| public StartupCommand[] initialize() { |
| return null; |
| } |
| |
| public SimulatorManager getSimulatorManager() { |
| return _simMgr; |
| } |
| |
| public void setSimulatorManager(SimulatorManager simMgr) { |
| _simMgr = simMgr; |
| } |
| |
| public boolean isStopped() { |
| return this.stopped; |
| } |
| |
| @Override |
| public void setConfigParams(Map<String, Object> params) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| @Override |
| public Map<String, Object> getConfigParams() { |
| // TODO Auto-generated method stub |
| return null; |
| } |
| |
| @Override |
| public int getRunLevel() { |
| // TODO Auto-generated method stub |
| return 0; |
| } |
| |
| @Override |
| public void setRunLevel(int level) { |
| // TODO Auto-generated method stub |
| |
| } |
| } |