diff --git a/engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java b/engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
index 0ae2bc78132..e8bc1766857 100644
--- a/engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
+++ b/engine/api/src/org/apache/cloudstack/storage/to/VolumeObjectTO.java
@@ -57,6 +57,7 @@ public class VolumeObjectTO implements DataTO {
this.setVolumeId(volume.getId());
this.chainInfo = volume.getChainInfo();
this.volumeType = volume.getVolumeType();
+ this.name = volume.getName();
this.setId(volume.getId());
}
diff --git a/engine/storage/integration-test/pom.xml b/engine/storage/integration-test/pom.xml
index b5aa7eec6fa..56d36ad3a53 100644
--- a/engine/storage/integration-test/pom.xml
+++ b/engine/storage/integration-test/pom.xml
@@ -61,6 +61,12 @@
cloud-plugin-hypervisor-xen
${project.version}
test
+
+
+ org.apache.cloudstack
+ cloud-plugin-hypervisor-vmware
+ ${project.version}
+ test
org.apache.cloudstack
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 127c0e30a91..ac5a69d413e 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
@@ -18,6 +18,8 @@
*/
package org.apache.cloudstack.storage.test;
+import java.net.URI;
+import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
@@ -36,23 +38,33 @@ import com.cloud.agent.api.SetupCommand;
import com.cloud.agent.api.StartupCommand;
import com.cloud.agent.manager.AgentAttache;
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.HostEnvironment;
import com.cloud.host.HostVO;
import com.cloud.host.Status.Event;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
+import com.cloud.hypervisor.vmware.VmwareServerDiscoverer;
import com.cloud.hypervisor.xen.resource.XcpOssResource;
import com.cloud.resource.ServerResource;
import com.cloud.utils.component.ManagerBase;
+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();
@Inject
HostDao hostDao;
+ @Inject
+ ClusterDao clusterDao;
+ @Inject
+ ClusterDetailsDao clusterDetailsDao;
@Override
public boolean configure(String name, Map params) throws ConfigurationException {
// TODO Auto-generated method stub
@@ -104,14 +116,39 @@ public class DirectAgentManagerSimpleImpl extends ManagerBase implements AgentMa
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.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> resources = discover.find(host.getDataCenterId(), host.getPodId(), host.getClusterId(), uri, userName, password, null);
+ for (Map.Entry extends ServerResource, Map> 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();
+ }
}
- try {
- resource.configure(host.getName(), params);
- hostResourcesMap.put(hostId, resource);
- } catch (ConfigurationException e) {
- logger.debug("Failed to load resource:" + e.toString());
- }
+ hostResourcesMap.put(hostId, resource);
HostEnvironment env = new HostEnvironment();
SetupCommand cmd = new SetupCommand(env);
cmd.setNeedSetup(true);
diff --git a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java
index 8e96bffae9d..7a651c009e0 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java
@@ -41,6 +41,7 @@ import com.cloud.exception.ConnectionException;
import com.cloud.exception.OperationTimedoutException;
import com.cloud.host.Host;
import com.cloud.host.Status;
+import com.cloud.hypervisor.HypervisorGuruManager;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -52,6 +53,8 @@ public class RemoteHostEndPoint implements EndPoint {
AgentManager agentMgr;
@Inject
HostEndpointRpcServer rpcServer;
+ @Inject
+ protected HypervisorGuruManager _hvGuruMgr;
private ScheduledExecutorService executor;
public RemoteHostEndPoint() {
@@ -83,7 +86,8 @@ public class RemoteHostEndPoint implements EndPoint {
public Answer sendMessage(Command cmd) {
String errMsg = null;
try {
- return agentMgr.send(getId(), cmd);
+ long newHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(hostId, cmd);
+ return agentMgr.send(newHostId, cmd);
} catch (AgentUnavailableException e) {
errMsg = e.toString();
s_logger.debug("Failed to send command, due to Agent:" + getId() + ", " + e.toString());
@@ -160,7 +164,8 @@ public class RemoteHostEndPoint implements EndPoint {
@Override
public void sendMessageAsync(Command cmd, AsyncCompletionCallback callback) {
try {
- agentMgr.send(this.hostId, new Commands(cmd), new CmdRunner(callback));
+ long newHostId = _hvGuruMgr.getGuruProcessedCommandTargetHost(this.hostId, cmd);
+ agentMgr.send(newHostId, new Commands(cmd), new CmdRunner(callback));
} catch (AgentUnavailableException e) {
throw new CloudRuntimeException("Unable to send message", e);
}
diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index 54059f28a59..de57dd7f2fe 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -58,7 +58,7 @@ public class DefaultEndPointSelector implements EndPointSelector {
@Inject
HostDao hostDao;
private String findOneHostInaScope = "select id from host where "
- + " status = 'Up' and hypervisor_type != 'VMware' and type in ('Routing', 'SecondaryStorageVM') ";
+ + " status = 'Up' and type in ('Routing', 'SecondaryStorageVM') ";
private String findOneHostOnPrimaryStorage = "select id from host where "
+ "status = 'Up' and type = 'Routing' ";
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java
index 55bb1e98366..3388fc7b1a4 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java
@@ -28,6 +28,7 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.cloudstack.api.ApiConstants.VMDetails;
+import org.apache.cloudstack.storage.command.CopyCommand;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -286,7 +287,8 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru {
cmd instanceof CopyVolumeCommand ||
cmd instanceof CreateVolumeOVACommand ||
cmd instanceof PrepareOVAPackingCommand ||
- cmd instanceof CreateVolumeFromSnapshotCommand) {
+ cmd instanceof CreateVolumeFromSnapshotCommand ||
+ cmd instanceof CopyCommand) {
needDelegation = true;
}
/* Fang: remove this before checking in */
diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
index 92c555a16f7..240c62f5a4a 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java
@@ -328,14 +328,11 @@ public class VmwareStorageProcessor implements StorageProcessor {
public Answer cloneVolumeFromBaseTemplate(CopyCommand cmd) {
DataTO srcData = cmd.getSrcTO();
TemplateObjectTO template = (TemplateObjectTO)srcData;
- DataStoreTO imageStore = template.getDataStore();
DataTO destData = cmd.getDestTO();
VolumeObjectTO volume = (VolumeObjectTO)destData;
PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)volume.getDataStore();
- if (imageStore != null && !(imageStore instanceof NfsTO)) {
- return new CopyCmdAnswer("unsupported protocol");
- }
- NfsTO nfsImageStore = (NfsTO)imageStore;
+ PrimaryDataStoreTO srcStore = (PrimaryDataStoreTO)template.getDataStore();
+
try {
VmwareContext context = this.hostService.getServiceContext(null);
@@ -351,7 +348,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
// attach volume id to make the name unique
String vmdkName = volume.getName() + "-" + volume.getId();
- if (nfsImageStore == null) {
+ if (srcStore == null) {
// create a root volume for blank VM
String dummyVmName = this.hostService.getWorkerName(context, cmd, 0);
@@ -379,8 +376,8 @@ public class VmwareStorageProcessor implements StorageProcessor {
vmMo.destroy();
}
} else {
- String templateUrl = nfsImageStore.getUrl() + File.separator + template.getPath();
- VirtualMachineMO vmTemplate = VmwareHelper.pickOneVmOnRunningHost(dcMo.findVmByNameAndLabel(templateUrl), true);
+ String templatePath = template.getPath();
+ VirtualMachineMO vmTemplate = VmwareHelper.pickOneVmOnRunningHost(dcMo.findVmByNameAndLabel(templatePath), true);
if (vmTemplate == null) {
s_logger.warn("Template host in vSphere is not in connected state, request template reload");
return new CopyCmdAnswer("Template host in vSphere is not in connected state, request template reload");