| /* |
| * 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 org.apache.cloudstack.storage.test; |
| |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import javax.inject.Inject; |
| import javax.naming.ConfigurationException; |
| |
| import org.apache.log4j.Logger; |
| |
| import com.cloud.agent.AgentManager; |
| import com.cloud.agent.Listener; |
| import com.cloud.agent.StartupCommandProcessor; |
| import com.cloud.agent.api.Answer; |
| import com.cloud.agent.api.Command; |
| import com.cloud.agent.api.SetupCommand; |
| import com.cloud.agent.api.StartupCommand; |
| import com.cloud.agent.manager.Commands; |
| import com.cloud.dc.ClusterDetailsDao; |
| import com.cloud.dc.ClusterVO; |
| import com.cloud.dc.dao.ClusterDao; |
| import com.cloud.exception.AgentUnavailableException; |
| import com.cloud.exception.ConnectionException; |
| import com.cloud.exception.DiscoveryException; |
| import com.cloud.exception.OperationTimedoutException; |
| import com.cloud.host.Host; |
| import com.cloud.host.HostEnvironment; |
| import com.cloud.host.HostVO; |
| import com.cloud.host.Status; |
| import com.cloud.host.Status.Event; |
| import com.cloud.host.dao.HostDao; |
| import com.cloud.hypervisor.Hypervisor.HypervisorType; |
| import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; |
| import com.cloud.hypervisor.vmware.VmwareServerDiscoverer; |
| import com.cloud.hypervisor.xenserver.resource.XcpOssResource; |
| import com.cloud.resource.ServerResource; |
| import com.cloud.utils.component.ManagerBase; |
| import com.cloud.utils.exception.CloudRuntimeException; |
| import com.cloud.utils.fsm.NoTransitionException; |
| import com.cloud.utils.fsm.StateMachine2; |
| |
| public class DirectAgentManagerSimpleImpl extends ManagerBase implements AgentManager { |
| private static final Logger logger = Logger.getLogger(DirectAgentManagerSimpleImpl.class); |
| private final Map<Long, ServerResource> hostResourcesMap = new HashMap<Long, ServerResource>(); |
| @Inject |
| HostDao hostDao; |
| @Inject |
| ClusterDao clusterDao; |
| @Inject |
| ClusterDetailsDao clusterDetailsDao; |
| @Inject |
| HostDao _hostDao; |
| protected StateMachine2<Status, Event, Host> _statusStateMachine = Status.getStateMachine(); |
| |
| @Override |
| public boolean configure(String name, Map<String, Object> params) throws ConfigurationException { |
| // TODO Auto-generated method stub |
| return false; |
| } |
| |
| @Override |
| public void rescan() { |
| } |
| |
| @Override |
| public boolean start() { |
| // TODO Auto-generated method stub |
| return false; |
| } |
| |
| @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) { |
| try { |
| return this.send(hostId, cmd); |
| } catch (AgentUnavailableException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (OperationTimedoutException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| return null; |
| } |
| |
| protected void loadResource(Long hostId) { |
| HostVO host = hostDao.findById(hostId); |
| Map<String, Object> params = new HashMap<String, Object>(); |
| params.put("guid", host.getGuid()); |
| params.put("ipaddress", host.getPrivateIpAddress()); |
| params.put("username", "root"); |
| params.put("password", "password"); |
| params.put("zone", String.valueOf(host.getDataCenterId())); |
| params.put("pod", String.valueOf(host.getPodId())); |
| |
| ServerResource resource = null; |
| if (host.getHypervisorType() == HypervisorType.XenServer) { |
| resource = new XcpOssResource(); |
| try { |
| resource.configure(host.getName(), params); |
| |
| } catch (ConfigurationException e) { |
| logger.debug("Failed to load resource:" + e.toString()); |
| } |
| } else if (host.getHypervisorType() == HypervisorType.KVM) { |
| resource = new LibvirtComputingResource(); |
| try { |
| params.put("public.network.device", "cloudbr0"); |
| params.put("private.network.device", "cloudbr0"); |
| resource.configure(host.getName(), params); |
| } catch (ConfigurationException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| } else if (host.getHypervisorType() == HypervisorType.VMware) { |
| ClusterVO cluster = clusterDao.findById(host.getClusterId()); |
| String url = clusterDetailsDao.findDetail(cluster.getId(), "url").getValue(); |
| URI uri; |
| try { |
| uri = new URI(url); |
| String userName = clusterDetailsDao.findDetail(cluster.getId(), "username").getValue(); |
| String password = clusterDetailsDao.findDetail(cluster.getId(), "password").getValue(); |
| VmwareServerDiscoverer discover = new VmwareServerDiscoverer(); |
| |
| Map<? extends ServerResource, Map<String, String>> resources = |
| discover.find(host.getDataCenterId(), host.getPodId(), host.getClusterId(), uri, userName, password, null); |
| for (Map.Entry<? extends ServerResource, Map<String, String>> entry : resources.entrySet()) { |
| resource = entry.getKey(); |
| } |
| if (resource == null) { |
| throw new CloudRuntimeException("can't find resource"); |
| } |
| } catch (DiscoveryException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } catch (URISyntaxException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| } |
| } |
| |
| hostResourcesMap.put(hostId, resource); |
| HostEnvironment env = new HostEnvironment(); |
| SetupCommand cmd = new SetupCommand(env); |
| cmd.setNeedSetup(true); |
| |
| resource.executeRequest(cmd); |
| } |
| |
| @Override |
| public synchronized Answer send(Long hostId, Command cmd) throws AgentUnavailableException, OperationTimedoutException { |
| ServerResource resource = hostResourcesMap.get(hostId); |
| if (resource == null) { |
| loadResource(hostId); |
| resource = hostResourcesMap.get(hostId); |
| } |
| |
| if (resource == null) { |
| return null; |
| } |
| |
| Answer answer = resource.executeRequest(cmd); |
| return answer; |
| } |
| |
| @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 Answer sendTo(Long dcId, HypervisorType type, Command cmd) { |
| // TODO Auto-generated method stub |
| return null; |
| } |
| |
| @Override |
| public boolean agentStatusTransitTo(HostVO host, Event e, long msId) { |
| try { |
| return _statusStateMachine.transitTo(host, e, host.getId(), _hostDao); |
| } catch (NoTransitionException e1) { |
| e1.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. |
| } |
| return true; |
| |
| } |
| |
| @Override |
| public void disconnectWithoutInvestigation(long hostId, Event event) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| @Override |
| public void pullAgentToMaintenance(long hostId) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| @Override |
| public void pullAgentOutMaintenance(long hostId) { |
| // TODO Auto-generated method stub |
| |
| } |
| |
| @Override |
| public boolean reconnect(long hostId) { |
| // TODO Auto-generated method stub |
| return false; |
| } |
| |
| @Override |
| public boolean isAgentAttached(long hostId) { |
| // TODO Auto-generated method stub |
| return false; |
| } |
| |
| @Override |
| public boolean handleDirectConnectAgent(Host host, StartupCommand[] cmds, ServerResource resource, boolean forRebalance, boolean newHost) throws ConnectionException { |
| // TODO Auto-generated method stub |
| return false; |
| } |
| |
| @Override |
| public void notifyMonitorsOfHostAboutToBeRemoved(long hostId) { |
| } |
| |
| @Override |
| public void notifyMonitorsOfRemovedHost(long hostId, long clusterId) { |
| } |
| } |