[VMware][Deploy-as-is] OVF properties not importing when template is uploaded from local (#5861)

* Fix ova upload missing details

* Refactor and cleanup

* Unused import
This commit is contained in:
Nicolas Vazquez 2022-01-26 02:58:52 -03:00 committed by GitHub
parent 1ed0830bc4
commit 84f5768e64
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 70 additions and 95 deletions

View File

@ -20,7 +20,7 @@
package org.apache.cloudstack.storage.command;
import com.cloud.agent.api.Answer;
import com.cloud.utils.Pair;
import com.cloud.agent.api.to.OVFInformationTO;
public class UploadStatusAnswer extends Answer {
public static enum UploadStatus {
@ -32,8 +32,7 @@ public class UploadStatusAnswer extends Answer {
private long physicalSize = 0;
private String installPath = null;
private int downloadPercent = 0;
private Pair<String, String> guestOsInfo;
private String minimumHardwareVersion;
private OVFInformationTO ovfInformationTO;
protected UploadStatusAnswer() {
}
@ -89,19 +88,11 @@ public class UploadStatusAnswer extends Answer {
this.downloadPercent = downloadPercent;
}
public Pair<String, String> getGuestOsInfo() {
return guestOsInfo;
public OVFInformationTO getOvfInformationTO() {
return ovfInformationTO;
}
public void setGuestOsInfo(Pair<String, String> guestOsInfo) {
this.guestOsInfo = guestOsInfo;
}
public void setMinimumHardwareVersion(String minimumHardwareVersion) {
this.minimumHardwareVersion = minimumHardwareVersion;
}
public String getMinimumHardwareVersion() {
return minimumHardwareVersion;
public void setOvfInformationTO(OVFInformationTO ovfInformationTO) {
this.ovfInformationTO = ovfInformationTO;
}
}

View File

@ -33,6 +33,7 @@ import java.util.stream.Collectors;
import javax.inject.Inject;
import com.cloud.agent.api.to.NfsTO;
import com.cloud.agent.api.to.OVFInformationTO;
import com.cloud.storage.DataStoreRole;
import com.cloud.storage.Upload;
import org.apache.cloudstack.storage.image.deployasis.DeployAsIsHelper;
@ -207,8 +208,9 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver {
TemplateDataStoreVO tmpltStoreVO = _templateStoreDao.findByStoreTemplate(store.getId(), obj.getId());
if (tmpltStoreVO != null) {
if (tmpltStoreVO.getDownloadState() == VMTemplateStorageResourceAssoc.Status.DOWNLOADED) {
if (template.isDeployAsIs()) {
boolean persistDeployAsIs = deployAsIsHelper.persistTemplateDeployAsIsDetails(template.getId(), answer, tmpltStoreVO);
if (template.isDeployAsIs() && answer != null) {
OVFInformationTO ovfInformationTO = answer.getOvfInformationTO();
boolean persistDeployAsIs = deployAsIsHelper.persistTemplateOVFInformationAndUpdateGuestOS(template.getId(), ovfInformationTO, tmpltStoreVO);
if (!persistDeployAsIs) {
LOGGER.info("Failed persisting deploy-as-is template details for template " + template.getName());
return null;

View File

@ -18,7 +18,6 @@
*/
package org.apache.cloudstack.storage.image.deployasis;
import com.cloud.agent.api.storage.DownloadAnswer;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.OVFInformationTO;
import com.cloud.agent.api.to.deployasis.OVFConfigurationTO;
@ -100,41 +99,44 @@ public class DeployAsIsHelperImpl implements DeployAsIsHelper {
gson = builder.create();
}
public boolean persistTemplateDeployAsIsDetails(long templateId, DownloadAnswer answer, TemplateDataStoreVO tmpltStoreVO) {
try {
OVFInformationTO ovfInformationTO = answer.getOvfInformationTO();
if (ovfInformationTO != null) {
List<OVFPropertyTO> ovfProperties = ovfInformationTO.getProperties();
List<OVFNetworkTO> networkRequirements = ovfInformationTO.getNetworks();
OVFVirtualHardwareSectionTO ovfHardwareSection = ovfInformationTO.getHardwareSection();
List<OVFEulaSectionTO> eulaSections = ovfInformationTO.getEulaSections();
Pair<String, String> guestOsInfo = ovfInformationTO.getGuestOsInfo();
private void persistTemplateOVFInformation(long templateId, OVFInformationTO ovfInformationTO) {
List<OVFPropertyTO> ovfProperties = ovfInformationTO.getProperties();
List<OVFNetworkTO> networkRequirements = ovfInformationTO.getNetworks();
OVFVirtualHardwareSectionTO ovfHardwareSection = ovfInformationTO.getHardwareSection();
List<OVFEulaSectionTO> eulaSections = ovfInformationTO.getEulaSections();
Pair<String, String> guestOsInfo = ovfInformationTO.getGuestOsInfo();
if (CollectionUtils.isNotEmpty(ovfProperties)) {
persistTemplateDeployAsIsInformationTOList(templateId, ovfProperties);
}
if (CollectionUtils.isNotEmpty(networkRequirements)) {
persistTemplateDeployAsIsInformationTOList(templateId, networkRequirements);
}
if (CollectionUtils.isNotEmpty(eulaSections)) {
persistTemplateDeployAsIsInformationTOList(templateId, eulaSections);
}
String minimumHardwareVersion = null;
if (ovfHardwareSection != null) {
if (CollectionUtils.isNotEmpty(ovfHardwareSection.getConfigurations())) {
persistTemplateDeployAsIsInformationTOList(templateId, ovfHardwareSection.getConfigurations());
}
if (CollectionUtils.isNotEmpty(ovfHardwareSection.getCommonHardwareItems())) {
persistTemplateDeployAsIsInformationTOList(templateId, ovfHardwareSection.getCommonHardwareItems());
}
minimumHardwareVersion = ovfHardwareSection.getMinimiumHardwareVersion();
}
if (guestOsInfo != null) {
String osType = guestOsInfo.first();
String osDescription = guestOsInfo.second();
LOGGER.info("Guest OS information retrieved from the template: " + osType + " - " + osDescription);
handleGuestOsFromOVFDescriptor(templateId, osType, osDescription, minimumHardwareVersion);
}
if (CollectionUtils.isNotEmpty(ovfProperties)) {
persistTemplateDeployAsIsInformationTOList(templateId, ovfProperties);
}
if (CollectionUtils.isNotEmpty(networkRequirements)) {
persistTemplateDeployAsIsInformationTOList(templateId, networkRequirements);
}
if (CollectionUtils.isNotEmpty(eulaSections)) {
persistTemplateDeployAsIsInformationTOList(templateId, eulaSections);
}
String minimumHardwareVersion = null;
if (ovfHardwareSection != null) {
if (CollectionUtils.isNotEmpty(ovfHardwareSection.getConfigurations())) {
persistTemplateDeployAsIsInformationTOList(templateId, ovfHardwareSection.getConfigurations());
}
if (CollectionUtils.isNotEmpty(ovfHardwareSection.getCommonHardwareItems())) {
persistTemplateDeployAsIsInformationTOList(templateId, ovfHardwareSection.getCommonHardwareItems());
}
minimumHardwareVersion = ovfHardwareSection.getMinimiumHardwareVersion();
}
if (guestOsInfo != null) {
String osType = guestOsInfo.first();
String osDescription = guestOsInfo.second();
LOGGER.info("Guest OS information retrieved from the template: " + osType + " - " + osDescription);
handleGuestOsFromOVFDescriptor(templateId, osType, osDescription, minimumHardwareVersion);
}
}
public boolean persistTemplateOVFInformationAndUpdateGuestOS(long templateId, OVFInformationTO ovfInformationTO, TemplateDataStoreVO tmpltStoreVO) {
try {
if (ovfInformationTO != null) {
persistTemplateOVFInformation(templateId, ovfInformationTO);
}
} catch (Exception e) {
LOGGER.error("Error persisting deploy-as-is details for template " + templateId, e);
@ -151,7 +153,7 @@ public class DeployAsIsHelperImpl implements DeployAsIsHelper {
/**
* Returns the mapped guest OS from the OVF file of the template to the CloudStack database OS ID
*/
public Long retrieveTemplateGuestOsIdFromGuestOsInfo(long templateId, String guestOsType, String guestOsDescription,
private Long retrieveTemplateGuestOsIdFromGuestOsInfo(long templateId, String guestOsType, String guestOsDescription,
String minimumHardwareVersion) {
VMTemplateVO template = templateDao.findById(templateId);
Hypervisor.HypervisorType hypervisor = template.getHypervisorType();
@ -337,7 +339,7 @@ public class DeployAsIsHelperImpl implements DeployAsIsHelper {
return map;
}
private void persistTemplateDeployAsIsInformationTOList(long templateId,
public void persistTemplateDeployAsIsInformationTOList(long templateId,
List<? extends TemplateDeployAsIsInformationTO> informationTOList) {
for (TemplateDeployAsIsInformationTO informationTO : informationTOList) {
String propKey = getKeyFromInformationTO(informationTO);

View File

@ -25,8 +25,7 @@ import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
import com.cloud.hypervisor.Hypervisor;
import com.cloud.utils.Pair;
import com.cloud.agent.api.to.OVFInformationTO;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint;
@ -412,18 +411,14 @@ public class ImageStoreUploadMonitorImpl extends ManagerBase implements ImageSto
VMTemplateVO templateUpdate = _templateDao.createForUpdate();
templateUpdate.setSize(answer.getVirtualSize());
if (template.getHypervisorType() == Hypervisor.HypervisorType.VMware) {
Pair<String, String> guestOsInfo = answer.getGuestOsInfo();
String minimumHardwareVersion = answer.getMinimumHardwareVersion();
String osType = guestOsInfo.first();
String osDescription = guestOsInfo.second();
s_logger.info("Guest OS information retrieved from the template: " + osType + " - " + osDescription);
try {
Long guestOsId = deployAsIsHelper.retrieveTemplateGuestOsIdFromGuestOsInfo(template.getId(),
osType, osDescription, minimumHardwareVersion);
templateUpdate.setGuestOSId(guestOsId);
} catch (CloudRuntimeException e) {
s_logger.error("Could not map the guest OS to a CloudStack guest OS", e);
OVFInformationTO ovfInformationTO = answer.getOvfInformationTO();
if (template.isDeployAsIs() && ovfInformationTO != null) {
s_logger.debug("Received OVF information from the uploaded template");
boolean persistDeployAsIs = deployAsIsHelper.persistTemplateOVFInformationAndUpdateGuestOS(tmpTemplate.getId(), ovfInformationTO, tmpTemplateDataStore);
if (!persistDeployAsIs) {
s_logger.info("Failed persisting deploy-as-is template details for template " + template.getName());
break;
}
}
_templateDao.update(tmpTemplate.getId(), templateUpdate);

View File

@ -16,8 +16,8 @@
// under the License.
package org.apache.cloudstack.storage.image.deployasis;
import com.cloud.agent.api.storage.DownloadAnswer;
import com.cloud.agent.api.to.NicTO;
import com.cloud.agent.api.to.OVFInformationTO;
import com.cloud.vm.VirtualMachineProfile;
import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO;
@ -25,9 +25,7 @@ import java.util.Map;
public interface DeployAsIsHelper {
boolean persistTemplateDeployAsIsDetails(long templateId, DownloadAnswer answer, TemplateDataStoreVO tmpltStoreVO);
boolean persistTemplateOVFInformationAndUpdateGuestOS(long templateId, OVFInformationTO ovfInformationTO, TemplateDataStoreVO tmpltStoreVO);
Map<String, String> getVirtualMachineDeployAsIsProperties(VirtualMachineProfile vmId);
Map<Integer, String> getAllocatedVirtualMachineNicsAdapterMapping(VirtualMachineProfile vm, NicTO[] nics);
Long retrieveTemplateGuestOsIdFromGuestOsInfo(long templateId, String guestOsType, String guestOsDescription,
String minimumHardwareVersion);
}

View File

@ -2280,8 +2280,9 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
answer.setInstallPath(uploadEntity.getTmpltPath());
answer.setPhysicalSize(uploadEntity.getPhysicalSize());
answer.setDownloadPercent(100);
answer.setGuestOsInfo(uploadEntity.getGuestOsInfo());
answer.setMinimumHardwareVersion(uploadEntity.getMinimumHardwareVersion());
if (uploadEntity.getOvfInformationTO() != null) {
answer.setOvfInformationTO(uploadEntity.getOvfInformationTO());
}
uploadEntityStateMap.remove(entityUuid);
return answer;
} else if (uploadEntity.getUploadState() == UploadEntity.Status.IN_PROGRESS) {
@ -3424,12 +3425,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S
uploadEntity.setVirtualSize(info.virtualSize);
uploadEntity.setPhysicalSize(info.size);
if (info.ovfInformationTO != null) {
if (info.ovfInformationTO.getGuestOsInfo() != null) {
uploadEntity.setGuestOsInfo(info.ovfInformationTO.getGuestOsInfo());
}
if (info.ovfInformationTO.getHardwareSection() != null) {
uploadEntity.setMinimumHardwareVersion(info.ovfInformationTO.getHardwareSection().getMinimiumHardwareVersion());
}
uploadEntity.setOvfInformationTO(info.ovfInformationTO);
}
break;
}

View File

@ -18,8 +18,8 @@
package org.apache.cloudstack.storage.template;
import com.cloud.agent.api.to.OVFInformationTO;
import com.cloud.storage.Storage;
import com.cloud.utils.Pair;
public class UploadEntity {
private long downloadedsize;
@ -36,8 +36,7 @@ public class UploadEntity {
private String description;
private long contentLength;
private long processTimeout;
private Pair<String, String> guestOsInfo;
private String minimumHardwareVersion;
private OVFInformationTO ovfInformationTO;
public static enum ResourceType {
VOLUME, TEMPLATE
@ -211,19 +210,11 @@ public class UploadEntity {
this.contentLength = contentLength;
}
public Pair<String, String> getGuestOsInfo() {
return guestOsInfo;
public OVFInformationTO getOvfInformationTO() {
return ovfInformationTO;
}
public void setGuestOsInfo(Pair<String, String> guestOsInfo) {
this.guestOsInfo = guestOsInfo;
}
public void setMinimumHardwareVersion(String minimumHardwareVersion) {
this.minimumHardwareVersion = minimumHardwareVersion;
}
public String getMinimumHardwareVersion() {
return minimumHardwareVersion;
public void setOvfInformationTO(OVFInformationTO ovfInformationTO) {
this.ovfInformationTO = ovfInformationTO;
}
}