Agent command to analyze template
diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java
index 8ab2463..5c3e5d8 100755
--- a/api/src/com/cloud/storage/Storage.java
+++ b/api/src/com/cloud/storage/Storage.java
@@ -81,7 +81,8 @@
SYSTEM, /* routing, system vm template */
BUILTIN, /* buildin template */
PERHOST, /* every host has this template, don't need to install it in secondary storage */
- USER /* User supplied template/iso */
+ USER, /* User supplied template/iso */
+ DATADISK
}
public static enum StoragePoolType {
diff --git a/core/src/com/cloud/agent/api/storage/AnalyzeTemplateCommand.java b/core/src/com/cloud/agent/api/storage/AnalyzeTemplateCommand.java
index 214d968..918a62b 100644
--- a/core/src/com/cloud/agent/api/storage/AnalyzeTemplateCommand.java
+++ b/core/src/com/cloud/agent/api/storage/AnalyzeTemplateCommand.java
@@ -16,10 +16,9 @@
// under the License.
package com.cloud.agent.api.storage;
-import com.cloud.agent.api.Command;
import com.cloud.agent.api.to.DataTO;
-public final class AnalyzeTemplateCommand extends Command {
+public final class AnalyzeTemplateCommand extends AbstractDownloadCommand {
private DataTO data;
public AnalyzeTemplateCommand(DataTO data) {
@@ -37,7 +36,7 @@
}
public DataTO getData() {
- return this.data;
+ return data;
}
}
diff --git a/core/src/com/cloud/storage/resource/StoragePoolResource.java b/core/src/com/cloud/storage/resource/StoragePoolResource.java
index 5ec8f0e..86eed44 100644
--- a/core/src/com/cloud/storage/resource/StoragePoolResource.java
+++ b/core/src/com/cloud/storage/resource/StoragePoolResource.java
@@ -17,6 +17,8 @@
package com.cloud.storage.resource;
import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.AnalyzeTemplateAnswer;
+import com.cloud.agent.api.storage.AnalyzeTemplateCommand;
import com.cloud.agent.api.storage.CopyVolumeAnswer;
import com.cloud.agent.api.storage.CopyVolumeCommand;
import com.cloud.agent.api.storage.CreateAnswer;
@@ -35,4 +37,6 @@
CopyVolumeAnswer execute(CopyVolumeCommand cmd);
CreateAnswer execute(CreateCommand cmd);
+
+ AnalyzeTemplateAnswer execute(AnalyzeTemplateCommand cmd);
}
diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java
index 8da7eb7..ba4cc00 100644
--- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java
+++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java
@@ -188,6 +188,7 @@
primaryTO.setRole(getRole());
primaryTO.setType(getProtocol());
primaryTO.setUri(getUri());
+ primaryTO.setUuid(getUuid());
return primaryTO;
}
return to;
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
index 7401fdb..89a4d12 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java
@@ -20,7 +20,9 @@
import java.net.URI;
import java.net.URISyntaxException;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
import java.util.Map;
import javax.inject.Inject;
@@ -44,17 +46,23 @@
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao;
import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO;
+import org.apache.cloudstack.storage.endpoint.DefaultEndPointSelector;
+import org.apache.cloudstack.storage.to.TemplateObjectTO;
import com.cloud.agent.api.Answer;
+import com.cloud.agent.api.storage.AnalyzeTemplateAnswer;
import com.cloud.agent.api.storage.DownloadAnswer;
import com.cloud.agent.api.storage.AnalyzeTemplateCommand;
import com.cloud.agent.api.storage.Proxy;
import com.cloud.agent.api.to.DataObjectType;
import com.cloud.agent.api.to.DataTO;
+import com.cloud.storage.Storage.TemplateType;
+import com.cloud.storage.VMTemplateDetailVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.dao.VMTemplateDao;
+import com.cloud.storage.dao.VMTemplateDetailsDao;
import com.cloud.storage.dao.VolumeDao;
import com.cloud.storage.download.DownloadMonitor;
@@ -71,9 +79,13 @@
@Inject
TemplateDataStoreDao _templateStoreDao;
@Inject
+ VMTemplateDetailsDao _templateDetailsDao;
+ @Inject
EndPointSelector _epSelector;
@Inject
- ConfigurationDao configDao;
+ ConfigurationDao configDao;;
+ @Inject
+ DefaultEndPointSelector _defaultEpSelector;
protected String _proxy = null;
protected Proxy getHttpProxy() {
@@ -184,7 +196,55 @@
templateDaoBuilder.setChecksum(answer.getCheckSum());
_templateDao.update(obj.getId(), templateDaoBuilder);
}
- analyseTemplate(obj);
+ AnalyzeTemplateCommand cmd = new AnalyzeTemplateCommand(obj.getTO());
+ EndPoint ep = _defaultEpSelector.selectHypervisorHost(store.getScope());
+ Answer tempAnswer = null;
+ if (ep == null) {
+ String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
+ s_logger.error(errMsg);
+ tempAnswer = new Answer(cmd, false, errMsg);
+ } else {
+ tempAnswer = ep.sendMessage(cmd);
+ }
+ if (tempAnswer != null && tempAnswer.getResult()) {
+ AnalyzeTemplateAnswer tanswer = (AnalyzeTemplateAnswer)tempAnswer;
+ // Registered template may have data disks - Creating DataDisk template entries for each of these disks
+ if (tanswer.getNewDataList() != null && !tanswer.getNewDataList().isEmpty()) {
+ List<TemplateObjectTO> dataDiskTemplates = tanswer.getNewDataList();
+ VMTemplateVO rootTemplate = _templateDao.findById(obj.getId());
+ int diskNumber = 1;
+ for (TemplateObjectTO dataDiskTemplate : dataDiskTemplates) {
+ if (dataDiskTemplate.isBootable()) // Root disk
+ continue;
+ long id = _templateDao.getNextInSequence(Long.class, "id");
+ VMTemplateVO template = new VMTemplateVO(id, rootTemplate.getName() + "-DataDiskTemplate-" + diskNumber, rootTemplate.getFormat(), false,
+ false, rootTemplate.isExtractable(), TemplateType.DATADISK, rootTemplate.getUrl(), rootTemplate.requiresHvm(), rootTemplate.getBits(),
+ rootTemplate.getAccountId(), rootTemplate.getChecksum(), rootTemplate.getDisplayText() + "-DataDiskTemplate", false, 0, false,
+ rootTemplate.getHypervisorType(), null, null, false, false);
+ template = _templateDao.persist(template);
+ template.setSize(dataDiskTemplate.getSize());
+ _templateDao.update(template.getId(), template);
+
+ TemplateDataStoreVO templateStore = new TemplateDataStoreVO(store.getId(), template.getId(), null, 100, VMTemplateStorageResourceAssoc.Status.DOWNLOADED,
+ null, null, null, dataDiskTemplate.getPath(), tmpltStoreVO.getDownloadUrl());
+ templateStore.setSize(dataDiskTemplate.getSize());
+ templateStore.setDataStoreRole(tmpltStoreVO.getDataStoreRole());
+ templateStore.setPhysicalSize(dataDiskTemplate.getPhysicalSize());
+ _templateStoreDao.persist(templateStore);
+
+ List<VMTemplateDetailVO> details = new ArrayList<VMTemplateDetailVO>();
+ details.add(new VMTemplateDetailVO(rootTemplate.getId(), "child-datadisk-template", template.getUuid(), true));
+ details.add(new VMTemplateDetailVO(template.getId(), "parent-vm-template", rootTemplate.getUuid(), true));
+ _templateDetailsDao.saveDetails(details);
+ diskNumber++;
+ }
+ }
+ } else {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Cannot analyze template " + store.getId());
+ }
+ }
+
CreateCmdResult result = new CreateCmdResult(null, null);
caller.complete(result);
}
@@ -273,59 +333,4 @@
@Override
public void resize(DataObject data, AsyncCompletionCallback<CreateCmdResult> callback) {
}
-
- private void analyseTemplate(DataObject data) {
- CommandResult result = new CommandResult();
- DataStore store = data.getDataStore();
- TemplateDataStoreVO tmpltStoreVO = _templateStoreDao.findByStoreTemplate(store.getId(), data.getId());
- try {
- AnalyzeTemplateCommand cmd = new AnalyzeTemplateCommand(data.getTO());
- EndPoint ep = _epSelector.select(data);
- Answer answer = null;
- if (ep == null) {
- String errMsg = "No remote endpoint to send command, check if host or ssvm is down?";
- s_logger.error(errMsg);
- answer = new Answer(cmd, false, errMsg);
- } else {/*
- (AnalyzeTemplateAnswer)answer = ep.sendMessage(cmd);
- if (answer != null && !answer.getResult()) {
- result.setResult(answer.getDetails());
- // Registered template may have data disks - Creating DataDisk template entries for each of these disks
- if (answer.getNewDataList() != null && !answer.getNewDataList().isEmpty()) {
- List<TemplateObjectTO> dataDiskTemplates = answer.getNewDataList();
- VMTemplateVO rootTemplate = _templateDao.findById(data.getId());
- int diskNumber = 1;
- for (TemplateObjectTO dataDiskTemplate : dataDiskTemplates) {
- if (dataDiskTemplate.isBootable()) // Root disk
- continue;
- long id = _templateDao.getNextInSequence(Long.class, "id");
- VMTemplateVO template = new VMTemplateVO(id, rootTemplate.getName() + "-DataDiskTemplate-" + diskNumber, rootTemplate.getFormat(), false,
- false, rootTemplate.isExtractable(), TemplateType.DATADISK, rootTemplate.getUrl(), rootTemplate.requiresHvm(), rootTemplate.getBits(),
- rootTemplate.getAccountId(), rootTemplate.getChecksum(), rootTemplate.getDisplayText() + "-DataDiskTemplate", false, 0, false,
- rootTemplate.getHypervisorType(), null, null, false, false);
- template = _templateDao.persist(template);
- template.setSize(dataDiskTemplate.getSize());
- _templateDao.update(template.getId(), template);
-
- TemplateDataStoreVO templateStore = new TemplateDataStoreVO(store.getId(), template.getId(), null, 100, VMTemplateStorageResourceAssoc.Status.DOWNLOADED,
- null, null, null, dataDiskTemplate.getInstallPath(), tmpltStoreVO.getDownloadUrl());
- templateStore.setSize(dataDiskTemplate.getSize());
- templateStore.setDataStoreRole(tmpltStoreVO.getDataStoreRole());
- templateStore.setPhysicalSize(dataDiskTemplate.getPhysicalSize());
- _templateStoreDao.persist(templateStore);
-
- List<VMTemplateDetailVO> details = new ArrayList<VMTemplateDetailVO>();
- details.add(new VMTemplateDetailVO(rootTemplate.getId(), "child-datadisk-template", template.getUuid(), true));
- details.add(new VMTemplateDetailVO(template.getId(), "parent-vm-template", rootTemplate.getUuid(), true));
- _templateDetailsDao.saveDetails(details);
- diskNumber++;
- }
- }
- }
- */}
- } catch (Exception ex) {
- s_logger.debug("Unable to analyze " + data.getType().toString() + ": " + data.getId(), ex);
- result.setResult(ex.toString());
- }
- }
}
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 9cb37f5..b4ea89a 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java
@@ -41,6 +41,7 @@
import com.cloud.agent.api.CreatePrivateTemplateFromVolumeCommand;
import com.cloud.agent.api.CreateVolumeFromSnapshotCommand;
import com.cloud.agent.api.UnregisterNicCommand;
+import com.cloud.agent.api.storage.AnalyzeTemplateCommand;
import com.cloud.agent.api.storage.CopyVolumeCommand;
import com.cloud.agent.api.storage.CreateEntityDownloadURLCommand;
import com.cloud.agent.api.storage.CreateVolumeOVACommand;
@@ -375,6 +376,11 @@
needDelegation = true;
}
}
+ } else if (cmd instanceof AnalyzeTemplateCommand) {
+ DataTO srcData = ((AnalyzeTemplateCommand)cmd).getData();
+ if ((HypervisorType.VMware == srcData.getHypervisorType())) {
+ needDelegation = true;
+ }
}
if (!needDelegation) {
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
index 0b7bf67..e5b6432 100644
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareStorageManagerImpl.java
@@ -55,23 +55,25 @@
import com.cloud.agent.api.DeleteVMSnapshotCommand;
import com.cloud.agent.api.RevertToVMSnapshotAnswer;
import com.cloud.agent.api.RevertToVMSnapshotCommand;
+import com.cloud.agent.api.storage.AnalyzeTemplateAnswer;
+import com.cloud.agent.api.storage.AnalyzeTemplateCommand;
import com.cloud.agent.api.storage.CopyVolumeAnswer;
import com.cloud.agent.api.storage.CopyVolumeCommand;
import com.cloud.agent.api.storage.CreateEntityDownloadURLCommand;
import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer;
import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
-import com.cloud.agent.api.storage.AnalyzeTemplateAnswer;
-import com.cloud.agent.api.storage.AnalyzeTemplateCommand;
import com.cloud.agent.api.to.DataObjectType;
import com.cloud.agent.api.to.DataStoreTO;
import com.cloud.agent.api.to.DataTO;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.StorageFilerTO;
+import com.cloud.hypervisor.vmware.mo.ClusterMO;
import com.cloud.hypervisor.vmware.mo.CustomFieldConstants;
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
import com.cloud.hypervisor.vmware.mo.DatastoreMO;
import com.cloud.hypervisor.vmware.mo.HostDatastoreBrowserMO;
+import com.cloud.hypervisor.vmware.mo.HostDatastoreSystemMO;
import com.cloud.hypervisor.vmware.mo.HostMO;
import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
import com.cloud.hypervisor.vmware.mo.VirtualMachineMO;
@@ -128,6 +130,20 @@
command.execute();
}
+ public void createOvaAnalyze(String path, String ovfName, String diskName) {
+ Script commandSync = new Script(true, "sync", 0, s_logger);
+ commandSync.execute();
+
+ Script command = new Script(false, "tar", 0, s_logger);
+ command.setWorkDir(path);
+ command.add("-cf", ovfName + ".ova");
+ command.add(ovfName + ".ovf");
+ command.add(diskName + ".vmdk");
+
+ s_logger.info("Package OVA with commmand: " + command.toString());
+ command.execute();
+ }
+
private static final Logger s_logger = Logger.getLogger(VmwareStorageManagerImpl.class);
private final VmwareStorageMount _mountService;
@@ -1518,9 +1534,15 @@
try {
VmwareHypervisorHost hyperHost = hostService.getHyperHost(context, cmd);
ManagedObjectReference morRp = hyperHost.getHyperHostOwnerResourcePool();
- ManagedObjectReference morDs = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, srcStore.getUuid());
- assert (morDs != null);
+ ManagedObjectReference morCluster = hyperHost.getHyperHostCluster();
+ ClusterMO cluster = new ClusterMO(context, morCluster);
+ List<Pair<ManagedObjectReference, String>> lstHosts = cluster.getClusterHosts();
+ HostMO host = new HostMO(context, lstHosts.get(0).first());
+ HostDatastoreSystemMO hostDatastoreSystem = host.getHostDatastoreSystemMO();
+ List<ManagedObjectReference> morDsList = hostDatastoreSystem.getDatastores();
+ ManagedObjectReference morDs = hostDatastoreSystem.getDatastores().get(0);
DatastoreMO datastoreMo = new DatastoreMO(context, morDs);
+
String secondaryMountPoint = _mountService.getMountPoint(secondaryStorageUrl);
s_logger.info("Secondary storage mount point: " + secondaryMountPoint);
@@ -1549,14 +1571,52 @@
throw new Exception(msg);
}
- // readOVF(hyperHost, srcFileName, datastoreMo, morRp, hyperHost.getMor());
+ List<Ternary<String, Long, Boolean>> templateDetails = HypervisorHostHelper.readOVF(hyperHost, srcFileName, datastoreMo, morRp, hyperHost.getMor());
+ int diskCount = 1;
+ for (Ternary<String, Long, Boolean> templateDetail : templateDetails) {
+ if(templateDetail.third())
+ continue;
+ String installPath = templateInfo.first() + diskCount;
+ String installFullPathVMDK = secondaryMountPoint + "/" + installPath;
+ synchronized (installPath.intern()) {
+ Script command = new Script(false, "mkdir", _timeout, s_logger);
+ command.add("-p");
+ command.add(installFullPathVMDK);
+ String result = command.execute();
+ if (result != null) {
+ String msg = "unable to prepare template directory: " + installPath + ", storage: " + secondaryStorageUrl + ", error msg: " + result;
+ s_logger.error(msg);
+ throw new Exception(msg);
+ }
+ }
- // Temp answer
- TemplateObjectTO dataDiskTemplate = new TemplateObjectTO();
- dataDiskTemplate.setPath("temp-path");
- dataDiskTemplate.setPhysicalSize(1L);
- dataDiskTemplate.setIsBootable(false);
- templateList.add(dataDiskTemplate);
+ synchronized (installPath.intern()) {
+ Script command = new Script(false, "mv", _timeout, s_logger);
+ command.add(templateDetail.first());
+ command.add(installFullPathVMDK);
+ String result = command.execute();
+ if (result != null) {
+ String msg = "unable to move vmdk" + ", error msg: " + result;
+ s_logger.error(msg);
+ throw new Exception(msg);
+ }
+ }
+
+ int index = templateDetail.first().lastIndexOf(File.separator);
+ String vmdkName = templateDetail.first().substring(index+1);
+ int vmdkIndex = vmdkName.indexOf(".");
+ String ovfName = vmdkName.substring(0, vmdkIndex);
+
+ HypervisorHostHelper.createOvfFile(hyperHost, vmdkName, ovfName, installFullPathVMDK, templateDetail.second(), morDs);
+ createOvaAnalyze(installFullPathVMDK, templateDetail.first().substring(0, index+1), templateDetail.first());
+
+ TemplateObjectTO dataDiskTemplate = new TemplateObjectTO();
+ dataDiskTemplate.setPath(templateDetail.first());
+ dataDiskTemplate.setPhysicalSize(templateDetail.second());
+ dataDiskTemplate.setIsBootable(templateDetail.third());
+ templateList.add(dataDiskTemplate);
+ diskCount++;
+ }
} catch (Exception e) {
String msg = "Analyze template failed due to " + e.getMessage();
s_logger.error(msg);
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 9e12105..10b8ea2 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -202,6 +202,8 @@
import com.cloud.agent.api.routing.NetworkElementCommand;
import com.cloud.agent.api.routing.SetNetworkACLCommand;
import com.cloud.agent.api.routing.SetSourceNatCommand;
+import com.cloud.agent.api.storage.AnalyzeTemplateAnswer;
+import com.cloud.agent.api.storage.AnalyzeTemplateCommand;
import com.cloud.agent.api.storage.CopyVolumeAnswer;
import com.cloud.agent.api.storage.CopyVolumeCommand;
import com.cloud.agent.api.storage.CreateAnswer;
@@ -454,6 +456,8 @@
answer = execute((GetStorageStatsCommand)cmd);
} else if (clz == PrimaryStorageDownloadCommand.class) {
answer = execute((PrimaryStorageDownloadCommand)cmd);
+ } else if (clz == AnalyzeTemplateCommand.class) {
+ answer = execute((AnalyzeTemplateCommand)cmd);
} else if (clz == GetVncPortCommand.class) {
answer = execute((GetVncPortCommand)cmd);
} else if (clz == SetupCommand.class) {
@@ -4158,6 +4162,28 @@
}
}
+ @Override
+ public AnalyzeTemplateAnswer execute(AnalyzeTemplateCommand cmd) {
+ if (s_logger.isInfoEnabled()) {
+ s_logger.info("Executing resource AnalyzeTemplateCommand: " + _gson.toJson(cmd));
+ }
+
+ try {
+ VmwareContext context = getServiceContext();
+ VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
+ return (AnalyzeTemplateAnswer)mgr.getStorageManager().execute(this, cmd);
+ } catch (Throwable e) {
+ if (e instanceof RemoteException) {
+ s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
+ invalidateServiceContext();
+ }
+
+ String msg = "AnalyzeTemplateCommand failed due to " + VmwareHelper.getExceptionMessage(e);
+ s_logger.error(msg, e);
+ return new AnalyzeTemplateAnswer(msg);
+ }
+ }
+
protected Answer execute(PvlanSetupCommand cmd) {
// Pvlan related operations are performed in the start/stop command paths
// for vmware. This function is implemented to support mgmt layer code
diff --git a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
index d6e1a01..2114aca 100644
--- a/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
+++ b/plugins/storage/image/default/src/org/apache/cloudstack/storage/datastore/driver/CloudStackImageStoreDriverImpl.java
@@ -55,6 +55,7 @@
NfsTO nfsTO = new NfsTO();
nfsTO.setRole(store.getRole());
nfsTO.setUrl(nfsStore.getUri());
+ nfsTO.setUuid(nfsStore.getUuid());
return nfsTO;
}
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
index 8f64a03..989aae4 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -51,7 +51,6 @@
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.MethodFault;
import com.vmware.vim25.ObjectContent;
-import com.vmware.vim25.OptionValue;
import com.vmware.vim25.OvfCreateDescriptorParams;
import com.vmware.vim25.OvfCreateDescriptorResult;
import com.vmware.vim25.OvfCreateImportSpecParams;
@@ -66,14 +65,12 @@
import com.vmware.vim25.VirtualDeviceConfigSpec;
import com.vmware.vim25.VirtualDeviceConfigSpecOperation;
import com.vmware.vim25.VirtualDisk;
-import com.vmware.vim25.VirtualIDEController;
import com.vmware.vim25.VirtualLsiLogicController;
import com.vmware.vim25.VirtualMachineConfigSpec;
import com.vmware.vim25.VirtualMachineFileInfo;
import com.vmware.vim25.VirtualMachineGuestOsIdentifier;
import com.vmware.vim25.VirtualMachineImportSpec;
import com.vmware.vim25.VirtualMachineVideoCard;
-import com.vmware.vim25.VirtualSCSIController;
import com.vmware.vim25.VirtualSCSISharing;
import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec;
import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec;
@@ -105,7 +102,6 @@
// make vmware-base loosely coupled with cloud-specific stuff, duplicate VLAN.UNTAGGED constant here
private static final String UNTAGGED_VLAN_NAME = "untagged";
private static final String VMDK_PACK_DIR = "ova";
- private static final String OVA_OPTION_KEY_BOOTDISK = "cloud.ova.bootdisk";
public static VirtualMachineMO findVmFromObjectContent(VmwareContext context, ObjectContent[] ocs, String name, String instanceNameCustomField) {
@@ -1245,27 +1241,17 @@
files.add(absFile);
}
- int osDiskSeqNumber = 0;
- VirtualMachineConfigSpec config = importSpec.getConfigSpec();
- String paramVal = getOVFParamValue(config);
- if (paramVal != null && !paramVal.isEmpty()) {
- try {
- osDiskSeqNumber = getOsDiskFromOvfConf(config, paramVal);
- } catch (Exception e) {
- osDiskSeqNumber = 0;
- }
- }
-
- Boolean osDisk = true;
- List<VirtualDeviceConfigSpec> deviceConfigList = config.getDeviceChange();
+ boolean lookForFirstDisk = true;
+ List<VirtualDeviceConfigSpec> deviceConfigList = importSpec.getConfigSpec().getDeviceChange();
for (VirtualDeviceConfigSpec deviceSpec : deviceConfigList) {
+ Boolean osDisk = false;
VirtualDevice device = deviceSpec.getDevice();
if (device instanceof VirtualDisk) {
sizeKb = ((VirtualDisk)device).getCapacityInKB();
- if (diskCount == osDiskSeqNumber) {
+ if (lookForFirstDisk && diskCount == 0) {
osDisk = true;
+ diskCount++;
}
- diskCount++;
ovfVolumeInfo = new Ternary<String, Long, Boolean>(files.get(diskCount), sizeKb, osDisk);
ovfVolumeInfos.add(ovfVolumeInfo);
}
@@ -1273,71 +1259,6 @@
return ovfVolumeInfos;
}
- public static int getOsDiskFromOvfConf(VirtualMachineConfigSpec config, String deviceLocation) {
- List<VirtualDeviceConfigSpec> deviceConfigList = config.getDeviceChange();
- int controllerKey = 0;
- int deviceSeqNumber = 0;
- int controllerNumber = 0;
- int deviceNodeNumber = 0;
- int controllerCount = 0;
- String[] virtualNodeInfo = deviceLocation.split(":");
- if (deviceLocation.startsWith("scsi")) {
-
- controllerNumber = Integer.parseInt(virtualNodeInfo[0].substring(4)); // get substring excluding prefix scsi
- deviceNodeNumber = Integer.parseInt(virtualNodeInfo[1]);
-
- for (VirtualDeviceConfigSpec deviceConfig : deviceConfigList) {
- VirtualDevice device = deviceConfig.getDevice();
- if (device instanceof VirtualSCSIController) {
- if (controllerNumber == controllerCount) { //((VirtualSCSIController)device).getBusNumber()) {
- controllerKey = device.getKey();
- break;
- }
- controllerCount++;
- }
- }
- } else {
- controllerNumber = Integer.parseInt(virtualNodeInfo[0].substring(3)); // get substring excluding prefix ide
- deviceNodeNumber = Integer.parseInt(virtualNodeInfo[1]);
- controllerCount = 0;
-
- for (VirtualDeviceConfigSpec deviceConfig : deviceConfigList) {
- VirtualDevice device = deviceConfig.getDevice();
- if (device instanceof VirtualIDEController) {
- if (controllerNumber == controllerCount) { //((VirtualIDEController)device).getBusNumber()) {
- // Only 2 IDE controllers supported and they will have bus numbers 0 and 1
- controllerKey = device.getKey();
- break;
- }
- controllerCount++;
- }
- }
- }
- // Get devices on this controller at specific device node.
- for (VirtualDeviceConfigSpec deviceConfig : deviceConfigList) {
- VirtualDevice device = deviceConfig.getDevice();
- if (device instanceof VirtualDisk) {
- if (controllerKey == device.getControllerKey() && deviceNodeNumber == device.getUnitNumber()) {
- break;
- }
- deviceSeqNumber++;
- }
- }
- return deviceSeqNumber;
- }
-
- public static String getOVFParamValue(VirtualMachineConfigSpec config) {
- String paramVal = "";
- List<OptionValue> options = config.getExtraConfig();
- for (OptionValue option : options) {
- if (OVA_OPTION_KEY_BOOTDISK.equalsIgnoreCase(option.getKey())) {
- paramVal = (String)option.getValue();
- break;
- }
- }
- return paramVal;
- }
-
public static void createOvfFile(VmwareHypervisorHost host, String diskFileName, String ovfName, String dir, long size, ManagedObjectReference morDs) throws Exception {
VmwareContext context = host.getContext();
VirtualMachineMO workerVmMo = HypervisorHostHelper.createWorkerVM(host, new DatastoreMO(context, morDs), ovfName);