Updated Branches:
refs/heads/master-6-17-stable 7d72966e4 -> 4dcb0fb4f
CLOUDSTACK-2385: template download fails with Unexpected failure in Vmware.
Description:
Putting in fix to allow download of guest VM templates that are available
across zones.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4dcb0fb4
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4dcb0fb4
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4dcb0fb4
Branch: refs/heads/master-6-17-stable
Commit: 4dcb0fb4f47441d7b496d1f12f2c0966b722d739
Parents: 7d72966
Author: Vijayendra Bhamidipati <[email protected]>
Authored: Fri Jun 28 11:31:24 2013 -0700
Committer: Devdeep Singh <[email protected]>
Committed: Mon Jul 1 22:48:45 2013 +0530
----------------------------------------------------------------------
.../template/HypervisorTemplateAdapter.java | 141 ++++++++++---------
1 file changed, 75 insertions(+), 66 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4dcb0fb4/server/src/com/cloud/template/HypervisorTemplateAdapter.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java
b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
index 322f32e..95fefe2 100755
--- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java
+++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java
@@ -197,74 +197,83 @@ public class HypervisorTemplateAdapter extends
TemplateAdapterBase implements Te
@Override
public TemplateProfile prepareExtractTemplate(ExtractTemplateCmd
extractcmd) {
- TemplateProfile profile =
super.prepareExtractTemplate(extractcmd);
- VMTemplateVO template = (VMTemplateVO)profile.getTemplate();
- Long zoneId = profile.getZoneId();
- Long templateId = template.getId();
-
- if (template.getHypervisorType() == HypervisorType.VMware) {
- PrepareOVAPackingCommand cmd = null;
- String zoneName="";
- List<HostVO> secondaryStorageHosts;
- if (!template.isCrossZones() && zoneId != null) {
- DataCenterVO zone = _dcDao.findById(zoneId);
- zoneName = zone.getName();
- secondaryStorageHosts =
_ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
-
- s_logger.debug("Attempting to mark template host refs for
template: " + template.getName() + " as destroyed in zone: " + zoneName);
-
- // Make sure the template is downloaded to all the necessary
secondary storage hosts
-
- for (HostVO secondaryStorageHost : secondaryStorageHosts) {
- long hostId = secondaryStorageHost.getId();
- List<VMTemplateHostVO> templateHostVOs =
_tmpltHostDao.listByHostTemplate(hostId, templateId);
- for (VMTemplateHostVO templateHostVO :
templateHostVOs) {
- if (templateHostVO.getDownloadState() ==
Status.DOWNLOAD_IN_PROGRESS) {
- String errorMsg = "Please specify a template
that is not currently being downloaded.";
- s_logger.debug("Template: " +
template.getName() + " is currently being downloaded to secondary storage host:
" + secondaryStorageHost.getName() + ".");
- throw new CloudRuntimeException(errorMsg);
+ TemplateProfile profile = super.prepareExtractTemplate(extractcmd);
+ VMTemplateVO template = (VMTemplateVO)profile.getTemplate();
+ Long zoneId = profile.getZoneId();
+ Long templateId = template.getId();
+
+ // Simply return profile if non-ESX hypervisor.
+ if (template.getHypervisorType() == HypervisorType.VMware) {
+ PrepareOVAPackingCommand cmd = null;
+ String zoneName="";
+ List<HostVO> secondaryStorageHosts;
+
+ if (!template.isCrossZones()) {
+ if (zoneId == null) {
+ throw new CloudRuntimeException("ZoneId cannot be null for
a template that is not available across zones");
+ }
+ // Else get the list of secondary hosts in this zone's scope.
+ DataCenterVO zone = _dcDao.findById(zoneId);
+ zoneName = zone.getName();
+ secondaryStorageHosts =
_ssvmMgr.listSecondaryStorageHostsInOneZone(zoneId);
+ } else {
+ // template is available across zones. Get a list of all image
stores.
+ secondaryStorageHosts =
_ssvmMgr.listSecondaryStorageHostsInAllZones();
+ }
+
+ if (secondaryStorageHosts == null || secondaryStorageHosts.size()
== 0) {
+ throw new CloudRuntimeException("Unable to find a secondary
host when trying to download template " + profile.getTemplate());
+ }
+
+ s_logger.debug("Attempting to mark template host refs for
template: " + template.getName() + " as destroyed in zone: " + zoneName);
+
+ // Make sure the template is downloaded to all the necessary
secondary storage hosts
+
+ for (HostVO secondaryStorageHost : secondaryStorageHosts) {
+ long hostId = secondaryStorageHost.getId();
+ List<VMTemplateHostVO> templateHostVOs =
_tmpltHostDao.listByHostTemplate(hostId, templateId);
+ for (VMTemplateHostVO templateHostVO : templateHostVOs) {
+ if (templateHostVO.getDownloadState() ==
Status.DOWNLOAD_IN_PROGRESS) {
+ String errorMsg = "Please specify a template that is
not currently being downloaded.";
+ s_logger.debug("Template: " + template.getName() + "
is currently being downloaded to secondary storage host: " +
secondaryStorageHost.getName() + ".");
+ throw new CloudRuntimeException(errorMsg);
+ }
+ String installPath = templateHostVO.getInstallPath();
+ if (installPath != null) {
+ HostVO ssvmhost =
_ssvmMgr.pickSsvmHost(secondaryStorageHost);
+ if( ssvmhost == null ) {
+ s_logger.warn("prepareOVAPacking
(hyervisorTemplateAdapter): There is no secondary storage VM for secondary
storage host " + secondaryStorageHost.getName());
+ throw new
CloudRuntimeException("PrepareExtractTemplate: can't locate ssvm for SecStorage
Host.");
}
- String installPath = templateHostVO.getInstallPath();
- if (installPath != null) {
- HostVO ssvmhost =
_ssvmMgr.pickSsvmHost(secondaryStorageHost);
- if( ssvmhost == null ) {
- s_logger.warn("prepareOVAPacking
(hyervisorTemplateAdapter): There is no secondary storage VM for secondary
storage host " + secondaryStorageHost.getName());
- throw new
CloudRuntimeException("PrepareExtractTemplate: can't locate ssvm for SecStorage
Host.");
- }
- //Answer answer =
_agentMgr.sendToSecStorage(secondaryStorageHost, new
PrepareOVAPackingCommand(secondaryStorageHost.getStorageUrl(), installPath));
- cmd = new
PrepareOVAPackingCommand(secondaryStorageHost.getStorageUrl(), installPath);
-
- if (cmd == null) {
- s_logger.debug("Fang: PrepareOVAPacking
cmd can't created. cmd is null .");
- throw new
CloudRuntimeException("PrepareExtractTemplate: can't create a new cmd to
packing ova.");
- } else {
- cmd.setContextParam("hypervisor",
HypervisorType.VMware.toString());
- }
- Answer answer = null;
- s_logger.debug("Fang: PrepareOVAPAcking cmd,
before send out. cmd: " + cmd.toString());
- try {
- answer = _agentMgr.send(ssvmhost.getId(),
cmd);
- } catch (AgentUnavailableException e) {
- s_logger.warn("Unable to packOVA for
template: id: " + templateId + ", name " + ssvmhost.getName(), e);
- } catch (OperationTimedoutException e) {
- s_logger.warn("Unable to packOVA for
template timeout. template id: " + templateId);
- e.printStackTrace();
- }
-
- if (answer == null || !answer.getResult()) {
- s_logger.debug("Failed to create OVA for
template " + templateHostVO + " due to " + ((answer == null) ? "answer is null"
: answer.getDetails()));
- throw new
CloudRuntimeException("PrepareExtractTemplate: Failed to create OVA for
template extraction. ");
- }
- }
- }
- }
- } else {
- s_logger.debug("Failed to create OVA for template " +
template + " due to zone non-existing.");
- throw new
CloudRuntimeException("PrepareExtractTemplate: Failed to create OVA for
template extraction. ");
- }
- }
- return profile;
+ cmd = new
PrepareOVAPackingCommand(secondaryStorageHost.getStorageUrl(), installPath);
+
+ if (cmd == null) {
+ s_logger.debug("PrepareOVAPacking cmd can't
created. cmd is null .");
+ throw new
CloudRuntimeException("PrepareExtractTemplate: can't create a new cmd to
packing ova.");
+ } else {
+ cmd.setContextParam("hypervisor",
HypervisorType.VMware.toString());
+ }
+ Answer answer = null;
+ s_logger.debug("PrepareOVAPAcking cmd, before send
out. cmd: " + cmd.toString());
+ try {
+ answer = _agentMgr.send(ssvmhost.getId(), cmd);
+ } catch (AgentUnavailableException e) {
+ s_logger.warn("Unable to packOVA for template: id:
" + templateId + ", name " + ssvmhost.getName(), e);
+ } catch (OperationTimedoutException e) {
+ s_logger.warn("Unable to packOVA for template
timeout. template id: " + templateId);
+ e.printStackTrace();
+ }
+
+ if (answer == null || !answer.getResult()) {
+ s_logger.debug("Failed to create OVA for template
" + templateHostVO + " due to " + ((answer == null) ? "answer is null" :
answer.getDetails()));
+ throw new
CloudRuntimeException("PrepareExtractTemplate: Failed to create OVA for
template extraction. ");
+ }
+ }
+ }
+ }
}
+ return profile;
+ }
@Override @DB
public boolean delete(TemplateProfile profile) {