You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ed...@apache.org on 2012/08/21 03:16:44 UTC
[3/3] refactor attach/detach iso
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d6938ba/server/src/com/cloud/template/TemplateManager.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManager.java b/server/src/com/cloud/template/TemplateManager.java
index ee4a07a..9212c59 100755
--- a/server/src/com/cloud/template/TemplateManager.java
+++ b/server/src/com/cloud/template/TemplateManager.java
@@ -17,6 +17,7 @@
package com.cloud.template;
import java.util.List;
+import java.util.Map;
import com.cloud.dc.DataCenterVO;
import com.cloud.exception.InternalErrorException;
@@ -93,4 +94,8 @@ public interface TemplateManager extends TemplateService{
String prepareTemplateOnPool(VMTemplateVO template, StoragePool pool);
+ Map<String, String> getAbsoluteIsoPath(VMTemplateVO iso, long dataCenterId);
+
+ boolean isTemplateReady(VMTemplateVO template, long dataCenterId);
+
}
http://git-wip-us.apache.org/repos/asf/incubator-cloudstack/blob/7d6938ba/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index 82c9e7e..9d99911 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -24,6 +24,7 @@ import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@@ -88,6 +89,7 @@ import com.cloud.hypervisor.HypervisorGuruManager;
import com.cloud.org.Grouping;
import com.cloud.projects.Project;
import com.cloud.projects.ProjectManager;
+import com.cloud.resource.ResourceManager;
import com.cloud.storage.LaunchPermissionVO;
import com.cloud.storage.SnapshotVO;
import com.cloud.storage.StoragePoolHostVO;
@@ -158,13 +160,14 @@ import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.VMInstanceDao;
+import com.cloud.host.Host;
@Local(value={TemplateManager.class, TemplateService.class})
public class TemplateManagerImpl implements TemplateManager, Manager, TemplateService {
private final static Logger s_logger = Logger.getLogger(TemplateManagerImpl.class);
String _name;
- @Inject VMTemplateDao _tmpltDao;
+ @Inject VMTemplateDao _templateDao;
@Inject VMTemplateHostDao _tmpltHostDao;
@Inject VMTemplatePoolDao _tmpltPoolDao;
@Inject VMTemplateZoneDao _tmpltZoneDao;
@@ -205,6 +208,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Inject SecondaryStorageVmManager _ssvmMgr;
@Inject LaunchPermissionDao _launchPermissionDao;
@Inject ProjectManager _projectMgr;
+ @Inject ResourceManager _resourceMgr;
int _primaryStorageDownloadWait;
@@ -310,7 +314,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override
public VirtualMachineTemplate prepareTemplate(long templateId, long zoneId) {
- VMTemplateVO vmTemplate = _tmpltDao.findById(templateId);
+ VMTemplateVO vmTemplate = _templateDao.findById(templateId);
if(vmTemplate == null)
throw new InvalidParameterValueException("Unable to find template id=" + templateId);
@@ -331,7 +335,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
throw new PermissionDeniedException("Extraction has been disabled by admin");
}
- VMTemplateVO template = _tmpltDao.findById(templateId);
+ VMTemplateVO template = _templateDao.findById(templateId);
if (template == null || template.getRemoved() != null) {
throw new InvalidParameterValueException("Unable to find " +desc+ " with id " + templateId);
}
@@ -466,7 +470,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
}
String downloadTemplateFromSwiftToSecondaryStorage(long dcId, long templateId){
- VMTemplateVO template = _tmpltDao.findById(templateId);
+ VMTemplateVO template = _templateDao.findById(templateId);
if ( template == null ) {
String errMsg = " Can not find template " + templateId;
s_logger.warn(errMsg);
@@ -516,7 +520,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
String uploadTemplateToSwiftFromSecondaryStorage(VMTemplateHostVO templateHostRef) {
Long templateId = templateHostRef.getTemplateId();
- VMTemplateVO template = _tmpltDao.findById(templateId);
+ VMTemplateVO template = _templateDao.findById(templateId);
if (template == null) {
String errMsg = " Can not find template " + templateId;
s_logger.warn(errMsg);
@@ -570,7 +574,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override @DB
public VMTemplateStoragePoolVO prepareTemplateForCreate(VMTemplateVO template, StoragePool pool) {
- template = _tmpltDao.findById(template.getId(), true);
+ template = _templateDao.findById(template.getId(), true);
long poolId = pool.getId();
long templateId = template.getId();
@@ -698,7 +702,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override
@DB
public VMTemplateHostVO prepareISOForCreate(VMTemplateVO template, StoragePool pool) {
- template = _tmpltDao.findById(template.getId(), true);
+ template = _templateDao.findById(template.getId(), true);
long poolId = pool.getId();
long templateId = template.getId();
@@ -806,7 +810,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
}
if(_downloadMonitor.copyTemplate(template, srcSecHost, dstSecHost) ) {
- _tmpltDao.addTemplateToZone(template, dstZoneId);
+ _templateDao.addTemplateToZone(template, dstZoneId);
if(account.getId() != Account.ACCOUNT_ID_SYSTEM){
UsageEventVO usageEvent = new UsageEventVO(copyEventType, account.getId(), dstZoneId, tmpltId, null, null, null, srcTmpltHost.getSize());
@@ -846,7 +850,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
throw new InvalidParameterValueException("Please specify a valid destination zone.");
}
- VMTemplateVO template = _tmpltDao.findById(templateId);
+ VMTemplateVO template = _templateDao.findById(templateId);
if (template == null || template.getRemoved() != null) {
throw new InvalidParameterValueException("Unable to find template with id");
}
@@ -875,7 +879,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override
public boolean delete(long userId, long templateId, Long zoneId) {
- VMTemplateVO template = _tmpltDao.findById(templateId);
+ VMTemplateVO template = _templateDao.findById(templateId);
if (template == null || template.getRemoved() != null) {
throw new InvalidParameterValueException("Please specify a valid template.");
}
@@ -890,7 +894,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
List<VMTemplateStoragePoolVO> allTemplatesInPool = _tmpltPoolDao.listByPoolId(pool.getId());
for (VMTemplateStoragePoolVO templatePoolVO : allTemplatesInPool) {
- VMTemplateVO template = _tmpltDao.findByIdIncludingRemoved(templatePoolVO.getTemplateId());
+ VMTemplateVO template = _templateDao.findByIdIncludingRemoved(templatePoolVO.getTemplateId());
// If this is a routing template, consider it in use
if (template.getTemplateType() == TemplateType.SYSTEM) {
@@ -913,7 +917,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override
public void evictTemplateFromStoragePool(VMTemplateStoragePoolVO templatePoolVO) {
StoragePoolVO pool = _poolDao.findById(templatePoolVO.getPoolId());
- VMTemplateVO template = _tmpltDao.findByIdIncludingRemoved(templatePoolVO.getTemplateId());
+ VMTemplateVO template = _templateDao.findByIdIncludingRemoved(templatePoolVO.getTemplateId());
if (s_logger.isDebugEnabled()) {
@@ -945,7 +949,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
return;
}
List<HypervisorType> hypers = _clusterDao.getAvailableHypervisorInZone(null);
- List<VMTemplateVO> templates = _tmpltDao.listByHypervisorType(hypers);
+ List<VMTemplateVO> templates = _templateDao.listByHypervisorType(hypers);
List<Long> templateIds = new ArrayList<Long>();
for (VMTemplateVO template : templates) {
if (template.getTemplateType() != TemplateType.PERHOST) {
@@ -1057,7 +1061,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override
public boolean templateIsDeleteable(VMTemplateHostVO templateHostRef) {
- VMTemplateVO template = _tmpltDao.findByIdIncludingRemoved(templateHostRef.getTemplateId());
+ VMTemplateVO template = _templateDao.findByIdIncludingRemoved(templateHostRef.getTemplateId());
long templateId = template.getId();
HostVO secondaryStorageHost = _hostDao.findById(templateHostRef.getHostId());
long zoneId = secondaryStorageHost.getDataCenterId();
@@ -1083,105 +1087,34 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
return true;
}
-
- @Override
- @ActionEvent(eventType = EventTypes.EVENT_ISO_DETACH, eventDescription = "detaching ISO", async = true)
- public boolean detachIso(long vmId) {
- Account caller = UserContext.current().getCaller();
- Long userId = UserContext.current().getCallerUserId();
-
- // Verify input parameters
- UserVmVO vmInstanceCheck = _userVmDao.findById(vmId);
- if (vmInstanceCheck == null) {
- throw new InvalidParameterValueException ("Unable to find a virtual machine with id " + vmId);
- }
-
- UserVm userVM = _userVmDao.findById(vmId);
- if (userVM == null) {
- throw new InvalidParameterValueException("Please specify a valid VM.");
- }
-
- _accountMgr.checkAccess(caller, null, true, userVM);
-
- Long isoId = userVM.getIsoId();
- if (isoId == null) {
- throw new InvalidParameterValueException("The specified VM has no ISO attached to it.");
- }
- UserContext.current().setEventDetails("Vm Id: " +vmId+ " ISO Id: "+isoId);
-
- State vmState = userVM.getState();
- if (vmState != State.Running && vmState != State.Stopped) {
- throw new InvalidParameterValueException("Please specify a VM that is either Stopped or Running.");
- }
-
- boolean result = attachISOToVM(vmId, userId, isoId, false); //attach=false => detach
- if (result){
- return result;
- }else {
- throw new CloudRuntimeException("Failed to detach iso");
- }
- }
@Override
- @ActionEvent(eventType = EventTypes.EVENT_ISO_ATTACH, eventDescription = "attaching ISO", async = true)
- public boolean attachIso(long isoId, long vmId) {
- Account caller = UserContext.current().getCaller();
- Long userId = UserContext.current().getCallerUserId();
-
- // Verify input parameters
- UserVmVO vm = _userVmDao.findById(vmId);
- if (vm == null) {
- throw new InvalidParameterValueException("Unable to find a virtual machine with id " + vmId);
- }
-
- VMTemplateVO iso = _tmpltDao.findById(isoId);
- if (iso == null || iso.getRemoved() != null) {
- throw new InvalidParameterValueException("Unable to find an ISO with id " + isoId);
- }
-
- //check permissions
- //check if caller has access to VM and ISO
- //and also check if the VM's owner has access to the ISO.
-
- _accountMgr.checkAccess(caller, null, false, iso, vm);
-
- Account vmOwner = _accountDao.findById(vm.getAccountId());
- _accountMgr.checkAccess(vmOwner, null, false, iso, vm);
-
- State vmState = vm.getState();
- if (vmState != State.Running && vmState != State.Stopped) {
- throw new InvalidParameterValueException("Please specify a VM that is either Stopped or Running.");
- }
-
- if ("xen-pv-drv-iso".equals(iso.getDisplayText()) && vm.getHypervisorType() != Hypervisor.HypervisorType.XenServer){
- throw new InvalidParameterValueException("Cannot attach Xenserver PV drivers to incompatible hypervisor " + vm.getHypervisorType());
- }
-
- if("vmware-tools.iso".equals(iso.getName()) && vm.getHypervisorType() != Hypervisor.HypervisorType.VMware) {
- throw new InvalidParameterValueException("Cannot attach VMware tools drivers to incompatible hypervisor " + vm.getHypervisorType());
- }
- boolean result = attachISOToVM(vmId, userId, isoId, true);
- if (result){
- return result;
- }else {
- throw new CloudRuntimeException("Failed to attach iso");
- }
+ public boolean isTemplateReady(VMTemplateVO template, long dataCenterId) {
+ if (template.getTemplateType() == TemplateType.PERHOST) {
+ return true;
+ }
+ List<VMTemplateHostVO> templateHosts = _tmpltHostDao.listByZoneTemplate(dataCenterId, template.getId(), true);
+ return (templateHosts.size() > 0) ? true : false;
}
- private boolean attachISOToVM(long vmId, long userId, long isoId, boolean attach) {
- UserVmVO vm = _userVmDao.findById(vmId);
- VMTemplateVO iso = _tmpltDao.findById(isoId);
-
- boolean success = _vmMgr.attachISOToVM(vmId, isoId, attach);
- if ( success && attach) {
- vm.setIsoId(iso.getId());
- _userVmDao.update(vmId, vm);
- }
- if ( success && !attach ) {
- vm.setIsoId(null);
- _userVmDao.update(vmId, vm);
- }
- return success;
+ @Override
+ public Map<String, String> getAbsoluteIsoPath(VMTemplateVO iso, long dataCenterId) {
+ Map<String, String> paths = new HashMap<String, String>();
+
+ //for pv driver iso
+ if (iso.getTemplateType() == TemplateType.PERHOST) {
+ paths.put("isoPath", iso.getName());
+ } else {
+ List<VMTemplateHostVO> templateHosts = _tmpltHostDao.listByZoneTemplate(dataCenterId, iso.getId(), true);
+ if (templateHosts.size() > 0) {
+ VMTemplateHostVO templateHost = templateHosts.get(0);
+ HostVO storageHost = _hostDao.findById(templateHost.getHostId());
+ String isoPath = storageHost.getStorageUrl() + "/" + templateHost.getInstallPath();
+ paths.put("isoPath", isoPath);
+ paths.put("secPath", storageHost.getStorageUrl());
+ }
+ }
+ return paths;
}
@Override
@@ -1265,7 +1198,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
@Override
public VirtualMachineTemplate getTemplate(long templateId) {
- VMTemplateVO template = _tmpltDao.findById(templateId);
+ VMTemplateVO template = _templateDao.findById(templateId);
if (template != null && template.getRemoved() == null) {
return template;
}
@@ -1328,7 +1261,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
String operation = cmd.getOperation();
String mediaType = "";
- VMTemplateVO template = _tmpltDao.findById(id);
+ VMTemplateVO template = _templateDao.findById(id);
if (template == null) {
throw new InvalidParameterValueException("unable to find " + mediaType + " with id " + id);
@@ -1394,7 +1327,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
throw new InvalidParameterValueException("Update template permissions is an invalid operation on template " + template.getName());
}
- VMTemplateVO updatedTemplate = _tmpltDao.createForUpdate();
+ VMTemplateVO updatedTemplate = _templateDao.createForUpdate();
if (isPublic != null) {
updatedTemplate.setPublicTemplate(isPublic.booleanValue());
@@ -1410,7 +1343,7 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
throw new InvalidParameterValueException("Only ROOT admins are allowed to modify this attribute.");
}
- _tmpltDao.update(template.getId(), updatedTemplate);
+ _templateDao.update(template.getId(), updatedTemplate);
Long domainId = caller.getDomainId();
if ("add".equalsIgnoreCase(operation)) {
@@ -1445,10 +1378,10 @@ public class TemplateManagerImpl implements TemplateManager, Manager, TemplateSe
} else if ("reset".equalsIgnoreCase(operation)) {
// do we care whether the owning account is an admin? if the
// owner is an admin, will we still set public to false?
- updatedTemplate = _tmpltDao.createForUpdate();
+ updatedTemplate = _templateDao.createForUpdate();
updatedTemplate.setPublicTemplate(false);
updatedTemplate.setFeatured(false);
- _tmpltDao.update(template.getId(), updatedTemplate);
+ _templateDao.update(template.getId(), updatedTemplate);
_launchPermissionDao.removeAllPermissions(id);
}
return true;