diff --git a/server/src/com/cloud/storage/VolumeManager.java b/engine/components-api/src/com/cloud/storage/VolumeManager.java similarity index 100% rename from server/src/com/cloud/storage/VolumeManager.java rename to engine/components-api/src/com/cloud/storage/VolumeManager.java diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/vm/VirtualMachineOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/vm/VirtualMachineOrchestrator.java index 5f1e3d0f65e..63d45a3a6ef 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/vm/VirtualMachineOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/vm/VirtualMachineOrchestrator.java @@ -33,7 +33,6 @@ import org.apache.cloudstack.config.ConfigRepo; import org.apache.cloudstack.config.ConfigValue; import org.apache.cloudstack.engine.cloud.entity.VMEntityVO; import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntity; -import org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl; import org.apache.cloudstack.engine.config.Configs; import org.apache.cloudstack.engine.subsystem.api.storage.StorageOrchestrator; import org.apache.cloudstack.network.NetworkOrchestrator; @@ -50,28 +49,34 @@ import com.cloud.cluster.ManagementServerNode; import com.cloud.dao.EntityManager; import com.cloud.deploy.DeploymentPlan; import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConnectionException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.HostVO; import com.cloud.host.Status; -import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.network.NetworkManager; import com.cloud.network.dao.NetworkVO; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.Volume.Type; +import com.cloud.storage.VolumeManager; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.user.AccountVO; import com.cloud.user.dao.AccountDao; import com.cloud.user.dao.UserDao; import com.cloud.utils.DateUtil; import com.cloud.utils.Pair; -import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.NicProfile; -import com.cloud.vm.UserVmVO; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineProfileImpl; @@ -95,7 +100,7 @@ public class VirtualMachineOrchestrator extends ManagerBase { @Inject VmWorkJobDao _workJobDao; @Inject - VirtualMachineManager _itMgr; + VolumeManager _volMgr; protected ConfigValue _retry; protected ConfigValue _cancelWait; @@ -117,7 +122,11 @@ public class VirtualMachineOrchestrator extends ManagerBase { ServiceOfferingDao _offeringDao; @Inject VMTemplateDao _templateDao; - // FIXME: Hopefull we can remove the above stuff. + @Inject + VirtualMachineManager _itMgr; + @Inject + NetworkManager _networkMgr; + // FIXME: Hopefully we can remove the above stuff. long _nodeId; @@ -129,7 +138,7 @@ public class VirtualMachineOrchestrator extends ManagerBase { String templateId, String hostName, String displayName, - String hypervisor, + Hypervisor.HypervisorType hypervisor, int cpu, int speed, long memory, @@ -147,13 +156,8 @@ public class VirtualMachineOrchestrator extends ManagerBase { } } - VirtualMachineEntityImpl vmEntity = ComponentContext.inject(VirtualMachineEntityImpl.class); - vmEntity.init(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, new ArrayList(networkNicMap.keySet())); - - HypervisorType hypervisorType = HypervisorType.valueOf(hypervisor); - //load vm instance and offerings and call virtualMachineManagerImpl - VMInstanceVO vm = _entityMgr.findByUuid(VMInstanceVO.class, id); + VMEntityVO vm = _entityMgr.findByUuid(VMEntityVO.class, id); // If the template represents an ISO, a disk offering must be passed in, and will be used to create the root disk // Else, a disk offering is optional, and if present will be used to create the data disk @@ -181,20 +185,14 @@ public class VirtualMachineOrchestrator extends ManagerBase { dataDiskOfferings.add(new Pair(diskOffering, size)); } - if (_itMgr.allocate(_entityMgr.findById(UserVmVO.class, vm.getId()), - _entityMgr.findById(VMTemplateVO.class, templateId), - offering, - rootDiskOffering, - dataDiskOfferings, - networkIpMap, - null, - plan, - hypervisorType, - _entityMgr.findById(AccountVO.class, new Long(owner))) == null) { + VMTemplateVO template = _entityMgr.findByUuid(VMTemplateVO.class, templateId); + + vm = createDbEntities(vm, plan, template, offering, rootDiskOffering, dataDiskOfferings, networkIpMap, hypervisor, owner); + if (vm == null) { return null; } - return vmEntity; + return new VirtualMachineEntityImpl2(vm); } public VirtualMachineEntity createFromScratch( @@ -203,7 +201,7 @@ public class VirtualMachineOrchestrator extends ManagerBase { String isoId, String hostName, String displayName, - String hypervisor, + Hypervisor.HypervisorType hypervisorType, String os, int cpu, int speed, @@ -214,12 +212,7 @@ public class VirtualMachineOrchestrator extends ManagerBase { Map networkNicMap, DeploymentPlan plan) throws InsufficientCapacityException { - // VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager); - VirtualMachineEntityImpl vmEntity = ComponentContext.inject(VirtualMachineEntityImpl.class); - vmEntity.init(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, new ArrayList(networkNicMap.keySet())); - - //load vm instance and offerings and call virtualMachineManagerImpl - VMInstanceVO vm = _entityMgr.findByUuid(VMInstanceVO.class, id); + VMEntityVO vm = _entityMgr.findByUuid(VMEntityVO.class, id); Pair rootDiskOffering = new Pair(null, null); ServiceOfferingVO offering = _entityMgr.findById(ServiceOfferingVO.class, vm.getServiceOfferingId()); @@ -227,9 +220,6 @@ public class VirtualMachineOrchestrator extends ManagerBase { List> dataDiskOfferings = new ArrayList>(); Long diskOfferingId = vm.getDiskOfferingId(); - if (diskOfferingId == null) { - throw new InvalidParameterValueException("Installing from ISO requires a disk offering to be specified for the root disk."); - } DiskOfferingVO diskOffering = _entityMgr.findById(DiskOfferingVO.class, diskOfferingId); if (diskOffering == null) { throw new InvalidParameterValueException("Unable to find disk offering " + diskOfferingId); @@ -252,17 +242,78 @@ public class VirtualMachineOrchestrator extends ManagerBase { } } - HypervisorType hypervisorType = HypervisorType.valueOf(hypervisor); + VMTemplateVO template = _entityMgr.findByUuid(VMTemplateVO.class, isoId); - if (_itMgr.allocate(_entityMgr.findById(UserVmVO.class, vm.getId()), - _entityMgr.findById(VMTemplateVO.class, new Long(isoId)), - offering, rootDiskOffering, dataDiskOfferings, networkIpMap, - null, plan, hypervisorType, - _entityMgr.findById(AccountVO.class, new Long(owner))) == null) { + vm = createDbEntities(vm, plan, template, offering, rootDiskOffering, dataDiskOfferings, networkIpMap, hypervisorType, owner); + if (vm == null) { return null; } - return vmEntity; + return new VirtualMachineEntityImpl2(vm); + } + + @DB + protected VMEntityVO createDbEntities(VMEntityVO vm1, DeploymentPlan plan, VMTemplateVO template, ServiceOfferingVO serviceOffering, + Pair rootDiskOffering, + List> dataDiskOfferings, List> networks, + Hypervisor.HypervisorType hyperType, String ownerRef) throws InsufficientCapacityException { + assert (plan.getClusterId() == null && plan.getPoolId() == null) : "We currently don't support cluster and pool preset yet"; + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocating entries for VM: " + vm1); + } + + AccountVO owner = _entityMgr.findById(AccountVO.class, new Long(ownerRef)); + + VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, vm1.getId()); + VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm); + + Transaction txn = Transaction.currentTxn(); + txn.start(); + + try { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocating nics for " + vm); + } + + _networkMgr.allocate(vmProfile, networks); + } catch (ConcurrentOperationException e) { + throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e); + } + + if (dataDiskOfferings == null) { + dataDiskOfferings = new ArrayList>(0); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocaing disks for " + vm); + } + + if (template.getFormat() == ImageFormat.ISO) { + _volMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, owner); + } else if (template.getFormat() == ImageFormat.BAREMETAL) { + // Do nothing + } else { + _volMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner); + } + + for (Pair offering : dataDiskOfferings) { + _volMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner); + } + + vm1.setDataCenterId(plan.getDataCenterId()); + if (plan.getPodId() != null) { + vm1.setPodId(plan.getPodId()); + } + + vm1 = _entityMgr.persist(vm1); + txn.commit(); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Allocation completed for VM: " + vm); + } + + return vm1; } public VirtualMachineEntity get(String uuid) { diff --git a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java index a958d3aa320..0a3a44b1d0c 100755 --- a/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/platform/orchestration/CloudOrchestrator.java @@ -128,7 +128,7 @@ public class CloudOrchestrator implements OrchestrationService { templateId, hostName, displayName, - hypervisor, + Hypervisor.HypervisorType.valueOf(hypervisor), cpu, speed, memory, @@ -149,7 +149,7 @@ public class CloudOrchestrator implements OrchestrationService { isoId, hostName, displayName, - hypervisor, + Hypervisor.HypervisorType.valueOf(hypervisor), os, cpu, speed,