use of com.cloud.model.enumeration.DiskControllerType in project cosmic by MissionCriticalCloud.
the class VirtualMachineManagerImpl method allocate.
@Override
@DB
public void allocate(final String vmInstanceName, final VirtualMachineTemplate template, final ServiceOffering serviceOffering, final DiskOfferingInfo rootDiskOfferingInfo, final List<DiskOfferingInfo> dataDiskOfferings, final LinkedHashMap<? extends Network, List<? extends NicProfile>> auxiliaryNetworks, final DeploymentPlan plan, final HypervisorType hyperType, final DiskControllerType diskControllerType) throws InsufficientCapacityException {
final VMInstanceVO vm = _vmDao.findVMByInstanceName(vmInstanceName);
final Account owner = _entityMgr.findById(Account.class, vm.getAccountId());
s_logger.debug("Allocating entries for VM: " + vm);
vm.setDataCenterId(plan.getDataCenterId());
if (plan.getPodId() != null) {
vm.setPodIdToDeployIn(plan.getPodId());
}
// Set date and version we start this VM
vm.setLastStartDateTime(getCurrentLocalDateTimeStamp());
vm.setLastStartVersion(VirtualMachineManagerImpl.class.getPackage().getImplementationVersion());
// Reset VM compliance state
if (vm.getComplianceStatus() == ComplianceStatus.VMNeedsRestart) {
vm.setComplianceStatus(ComplianceStatus.Compliant);
}
assert plan.getClusterId() == null && plan.getPoolId() == null : "We currently don't support cluster and pool preset yet";
final VMInstanceVO vmFinal = _vmDao.persist(vm);
final VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmFinal, template, serviceOffering, null, null);
Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
@Override
public void doInTransactionWithoutResult(final TransactionStatus status) throws InsufficientCapacityException {
s_logger.debug(" nics Allocatingfor " + vmFinal);
try {
_networkMgr.allocate(vmProfile, auxiliaryNetworks);
} catch (final ConcurrentOperationException e) {
throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e);
}
s_logger.debug("Allocating disks for " + vmFinal);
DiskControllerType diskController = diskControllerType;
if (diskController == null) {
final GuestOS guestOs = _guestOSDao.findById(vm.getGuestOSId());
diskController = DiskControllerType.getGuestDiskModel(guestOs.getDisplayName());
}
if (template.getFormat() == ImageFormat.ISO) {
volumeMgr.allocateRawVolume(VolumeType.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOfferingInfo.getDiskOffering(), rootDiskOfferingInfo.getSize(), rootDiskOfferingInfo.getMinIops(), rootDiskOfferingInfo.getMaxIops(), vmFinal, template, owner, diskController);
} else {
volumeMgr.allocateTemplatedVolume(VolumeType.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOfferingInfo.getDiskOffering(), rootDiskOfferingInfo.getSize(), rootDiskOfferingInfo.getMinIops(), rootDiskOfferingInfo.getMaxIops(), template, vmFinal, owner, diskController);
}
if (dataDiskOfferings != null) {
for (final DiskOfferingInfo dataDiskOfferingInfo : dataDiskOfferings) {
volumeMgr.allocateRawVolume(VolumeType.DATADISK, "DATA-" + vmFinal.getId(), dataDiskOfferingInfo.getDiskOffering(), dataDiskOfferingInfo.getSize(), dataDiskOfferingInfo.getMinIops(), dataDiskOfferingInfo.getMaxIops(), vmFinal, template, owner, diskController);
}
}
}
});
s_logger.debug("Allocation completed for VM: " + vmFinal);
}
use of com.cloud.model.enumeration.DiskControllerType in project cosmic by MissionCriticalCloud.
the class LibvirtVMDefTest method testDiskDef.
public void testDiskDef() {
final String filePath = "/var/lib/libvirt/images/disk.qcow2";
final String diskLabel = "sda";
final int deviceId = 1;
final LibvirtDiskDef disk = new LibvirtDiskDef();
final DiskControllerType bus = DiskControllerType.SCSI;
final ImageFormat imageFormat = ImageFormat.QCOW2;
final LibvirtDiskDef.DiskCacheMode cacheMode = LibvirtDiskDef.DiskCacheMode.WRITEBACK;
disk.defFileBasedDisk(filePath, diskLabel, bus, imageFormat);
disk.setCacheMode(cacheMode);
disk.setDeviceId(deviceId);
assertEquals(filePath, disk.getDiskPath());
assertEquals(diskLabel, disk.getDiskLabel());
assertEquals(bus.toString().toLowerCase(), disk.getBusType().toString().toLowerCase());
assertEquals(LibvirtDiskDef.DeviceType.DISK, disk.getDeviceType());
final String xmlDef = disk.toString();
final String expectedXml = "<disk device='disk' type='file'>\n<driver name='qemu' type='" + imageFormat.toString().toLowerCase() + "' cache='" + cacheMode.toString() + "' />\n" + "<source file='" + filePath + "'/>\n<target dev='" + diskLabel + "' bus='" + bus.toString().toLowerCase() + "'/>\n" + "<address type='drive' controller='0' bus='0' target='0' unit='1'/></disk>\n";
assertEquals(xmlDef, expectedXml);
}
use of com.cloud.model.enumeration.DiskControllerType in project cosmic by MissionCriticalCloud.
the class VolumeApiServiceImpl method createVolume.
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_VOLUME_CREATE, eventDescription = "creating volume", async = true)
public VolumeVO createVolume(final CreateVolumeCmd cmd) {
VolumeVO volume = this._volsDao.findById(cmd.getEntityId());
boolean created = true;
try {
if (cmd.getSnapshotId() != null) {
volume = createVolumeFromSnapshot(volume, cmd.getSnapshotId(), cmd.getVirtualMachineId());
if (volume.getState() != Volume.State.Ready) {
created = false;
}
DiskControllerType diskController = getDiskControllerType();
if (cmd.getDiskController() != null) {
diskController = DiskControllerType.valueOf(cmd.getDiskController().toUpperCase());
}
// if VM Id is provided, attach the volume to the VM
if (cmd.getVirtualMachineId() != null) {
try {
attachVolumeToVM(cmd.getVirtualMachineId(), volume.getId(), volume.getDeviceId());
} catch (final Exception ex) {
final StringBuilder message = new StringBuilder("Volume: ");
message.append(volume.getUuid());
message.append(" created successfully, but failed to attach the newly created volume to VM: ");
message.append(cmd.getVirtualMachineId());
message.append(" due to error: ");
message.append(ex.getMessage());
if (s_logger.isDebugEnabled()) {
s_logger.debug(message.toString());
}
throw new CloudRuntimeException(message.toString());
}
}
}
return volume;
} catch (final Exception e) {
created = false;
final VolumeInfo vol = this.volFactory.getVolume(cmd.getEntityId());
vol.stateTransit(Volume.Event.DestroyRequested);
throw new CloudRuntimeException("Failed to create volume: " + volume.getId(), e);
} finally {
if (!created) {
s_logger.trace("Decrementing volume resource count for account id=" + volume.getAccountId() + " as volume failed to create on the backend");
this._resourceLimitMgr.decrementResourceCount(volume.getAccountId(), ResourceType.volume, cmd.getDisplayVolume());
this._resourceLimitMgr.recalculateResourceCount(volume.getAccountId(), volume.getDomainId(), ResourceType.primary_storage.getOrdinal());
}
}
}
use of com.cloud.model.enumeration.DiskControllerType in project cosmic by MissionCriticalCloud.
the class LibvirtDomainXMLParserTest method testDomainXMLParser.
public void testDomainXMLParser() {
final int vncPort = 5900;
final DiskControllerType diskBus = DiskControllerType.SCSI;
final LibvirtDiskDef.DiskType diskType = LibvirtDiskDef.DiskType.FILE;
final LibvirtDiskDef.DeviceType deviceType = LibvirtDiskDef.DeviceType.DISK;
final ImageFormat imageFormat = ImageFormat.QCOW2;
final LibvirtDiskDef.DiskCacheMode diskCache = LibvirtDiskDef.DiskCacheMode.NONE;
final NicModel ifModel = NicModel.VIRTIO;
final GuestNetType ifType = GuestNetType.BRIDGE;
final String diskLabel = "vda";
final String diskPath = "/var/lib/libvirt/images/my-test-image.qcow2";
final String xml = "<domain type='kvm' id='10'>" + "<name>s-2970-VM</name>" + "<uuid>4d2c1526-865d-4fc9-a1ac-dbd1801a22d0</uuid>" + "<description>Debian GNU/Linux 6(64-bit)</description>" + "<memory unit='KiB'>262144</memory>" + "<currentMemory unit='KiB'>262144</currentMemory>" + "<vcpu placement='static'>1</vcpu>" + "<cputune>" + "<shares>250</shares>" + "</cputune>" + "<resource>" + "<partition>/machine</partition>" + "</resource>" + "<os>" + "<type arch='x86_64' machine='pc-i440fx-1.5'>hvm</type>" + "<boot dev='cdrom'/>" + "<boot dev='hd'/>" + "</os>" + "<features>" + "<acpi/>" + "<apic/>" + "<pae/>" + "</features>" + "<clock offset='utc'/>" + "<on_poweroff>destroy</on_poweroff>" + "<on_reboot>restart</on_reboot>" + "<on_crash>destroy</on_crash>" + "<devices>" + "<emulator>/usr/bin/kvm-spice</emulator>" + "<disk type='" + diskType.toString() + "' device='" + deviceType.toString() + "'>" + "<driver name='qemu' type='" + imageFormat.toString() + "' cache='" + diskCache.toString() + "'/>" + "<source file='" + diskPath + "'/>" + "<target dev='" + diskLabel + "' bus='" + diskBus.toString() + "'/>" + "<alias name='virtio-disk0'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>" + "</disk>" + "<disk type='file' device='cdrom'>" + "<driver name='qemu' type='raw' cache='none'/>" + "<source file='/opt/cosmic/agent/vms/systemvm.iso'/>" + "<target dev='hdc' bus='ide'/>" + "<readonly/>" + "<alias name='ide0-1-0'/>" + "<address type='drive' controller='0' bus='1' target='0' unit='0'/>" + "</disk>" + "<controller type='usb' index='0'>" + "<alias name='usb0'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>" + "</controller>" + "<controller type='pci' index='0' model='pci-root'>" + "<alias name='pci0'/>" + "</controller>" + "<controller type='ide' index='0'>" + "<alias name='ide0'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>" + "</controller>" + "<controller type='virtio-serial' index='0'>" + "<alias name='virtio-serial0'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>" + "</controller>" + "<interface type='" + ifType.toString() + "'>" + "<mac address='0e:00:a9:fe:02:00'/>" + "<source bridge='cloud0'/>" + "<target dev='vnet0'/>" + "<model type='" + ifModel.toString() + "'/>" + "<alias name='net0'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>" + "</interface>" + "<interface type='" + ifType.toString() + "'>" + "<mac address='06:c5:94:00:05:65'/>" + "<source bridge='cloudbr1'/>" + "<target dev='vnet1'/>" + "<model type='" + ifModel.toString() + "'/>" + "<alias name='net1'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>" + "</interface>" + "<interface type='" + ifType.toString() + "'>" + "<mac address='06:c9:f4:00:04:40'/>" + "<source bridge='cloudbr0'/>" + "<target dev='vnet2'/>" + "<model type='" + ifModel.toString() + "'/>" + "<alias name='net2'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>" + "</interface>" + "<interface type='" + ifType.toString() + "'>" + "<mac address='06:7e:c6:00:05:68'/>" + "<source bridge='cloudbr1'/>" + "<target dev='vnet3'/>" + "<model type='" + ifModel.toString() + "'/>" + "<alias name='net3'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>" + "</interface>" + "<serial type='pty'>" + "<source path='/dev/pts/3'/>" + "<target port='0'/>" + "<alias name='serial0'/>" + "</serial>" + "<console type='pty' tty='/dev/pts/3'>" + "<source path='/dev/pts/3'/>" + "<target type='serial' port='0'/>" + "<alias name='serial0'/>" + "</console>" + "<channel type='unix'>" + "<source mode='bind' path='/var/lib/libvirt/qemu/s-2970-VM.agent'/>" + "<target type='virtio' name='s-2970-VM.vport'/>" + "<alias name='channel0'/>" + "<address type='virtio-serial' controller='0' bus='0' port='1'/>" + "</channel>" + "<input type='tablet' bus='usb'>" + "<alias name='input0'/>" + "</input>" + "<input type='mouse' bus='ps2'/>" + "<graphics type='vnc' port='" + vncPort + "' autoport='yes' listen='0.0.0.0'>" + "<listen type='address' address='0.0.0.0'/>" + "</graphics>" + "<video>" + "<model type='cirrus' vram='9216' heads='1'/>" + "<alias name='video0'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>" + "</video>" + "<memballoon model='virtio'>" + "<alias name='balloon0'/>" + "<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>" + "</memballoon>" + "<rng model='virtio'>" + "<backend model='random'>/dev/random</backend>" + "</rng>" + "<watchdog model='i6300esb' action='reset'/>" + "<watchdog model='ib700' action='poweroff'/>" + "</devices>" + "<seclabel type='none'/>" + "</domain>";
final LibvirtDomainXmlParser parser = new LibvirtDomainXmlParser();
parser.parseDomainXml(xml);
assertEquals(vncPort - 5900, (int) parser.getVncPort());
final List<LibvirtDiskDef> disks = parser.getDisks();
/* Disk 0 is the first disk, the QCOW2 file backed virto disk */
final int diskId = 0;
assertEquals(diskLabel, disks.get(diskId).getDiskLabel());
assertEquals(diskPath, disks.get(diskId).getDiskPath());
assertEquals(diskCache, disks.get(diskId).getCacheMode());
assertEquals(diskBus, disks.get(diskId).getBusType());
assertEquals(diskType, disks.get(diskId).getDiskType());
assertEquals(deviceType, disks.get(diskId).getDeviceType());
assertEquals(imageFormat, disks.get(diskId).getDiskFormatType());
final List<InterfaceDef> ifs = parser.getInterfaces();
for (int i = 0; i < ifs.size(); i++) {
assertEquals(ifModel, ifs.get(i).getModel());
assertEquals(ifType, ifs.get(i).getNetType());
}
final List<RngDef> rngs = parser.getRngs();
assertEquals("/dev/random", rngs.get(0).getPath());
assertEquals(RngBackendModel.RANDOM, rngs.get(0).getRngBackendModel());
final List<WatchDogDef> watchDogs = parser.getWatchDogs();
assertEquals(WatchDogModel.I6300ESB, watchDogs.get(0).getModel());
assertEquals(WatchDogAction.RESET, watchDogs.get(0).getAction());
assertEquals(WatchDogModel.IB700, watchDogs.get(1).getModel());
assertEquals(WatchDogAction.POWEROFF, watchDogs.get(1).getAction());
}
use of com.cloud.model.enumeration.DiskControllerType in project cosmic by MissionCriticalCloud.
the class KvmStorageProcessor method attachOrDetachDisk.
private synchronized String attachOrDetachDisk(final Connect conn, final boolean attach, final String vmName, final KvmPhysicalDisk attachingDisk, final int devId, final DiskControllerType diskControllerType, final ImageFormat diskFormat, final String serial, final VolumeObjectTO volumeObjectTO) throws LibvirtException, InternalErrorException {
final List<LibvirtDiskDef> disks;
Domain dm = null;
LibvirtDiskDef diskdef = null;
final KvmStoragePool attachingPool = attachingDisk.getPool();
try {
dm = conn.domainLookupByName(vmName);
final LibvirtDomainXmlParser parser = new LibvirtDomainXmlParser();
final String domXml = dm.getXMLDesc(0);
parser.parseDomainXml(domXml);
disks = parser.getDisks();
if (!attach) {
for (final LibvirtDiskDef disk : disks) {
final String file = disk.getDiskPath();
if (file != null && file.equalsIgnoreCase(attachingDisk.getPath())) {
diskdef = disk;
break;
}
}
if (diskdef == null) {
throw new InternalErrorException("disk: " + attachingDisk.getPath() + " is not attached before");
}
} else {
diskdef = new LibvirtDiskDef();
if (diskControllerType == DiskControllerType.SCSI) {
diskdef.setQemuDriver(true);
diskdef.setDiscard(LibvirtDiskDef.DiscardType.UNMAP);
}
diskdef.setSerial(serial);
diskdef.setDeviceId(devId);
Optional.ofNullable(volumeObjectTO.getBytesReadRate()).filter(bps -> bps > 0).ifPresent(diskdef::setBytesReadRate);
Optional.ofNullable(volumeObjectTO.getBytesWriteRate()).filter(bps -> bps > 0).ifPresent(diskdef::setBytesWriteRate);
if (volumeObjectTO.getIopsTotalRate() == null) {
Optional.ofNullable(volumeObjectTO.getIopsReadRate()).filter(iops -> iops > 0).ifPresent(diskdef::setIopsReadRate);
Optional.ofNullable(volumeObjectTO.getIopsWriteRate()).filter(iops -> iops > 0).ifPresent(diskdef::setIopsWriteRate);
} else {
Optional.ofNullable(volumeObjectTO.getIopsTotalRate()).filter(iops -> iops > 0).ifPresent(diskdef::setIopsTotalRate);
}
if (attachingPool.getType() == StoragePoolType.RBD) {
diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), attachingPool.getAuthUserName(), attachingPool.getUuid(), devId, diskControllerType, LibvirtDiskDef.DiskProtocol.RBD, ImageFormat.RAW);
} else if (attachingPool.getType() == StoragePoolType.Gluster) {
final String mountpoint = attachingPool.getLocalPath();
final String path = attachingDisk.getPath();
final String glusterVolume = attachingPool.getSourceDir().replace("/", "");
diskdef.defNetworkBasedDisk(glusterVolume + path.replace(mountpoint, ""), attachingPool.getSourceHost(), attachingPool.getSourcePort(), null, null, devId, diskControllerType, LibvirtDiskDef.DiskProtocol.GLUSTER, ImageFormat.QCOW2);
} else if (attachingPool.getType() == StoragePoolType.NetworkFilesystem) {
diskdef.defFileBasedDisk(attachingDisk.getPath(), devId, diskControllerType, diskFormat);
} else if (attachingPool.getType() == StoragePoolType.LVM) {
diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, diskControllerType);
}
}
final String xml = diskdef.toString();
return attachOrDetachDevice(conn, attach, vmName, xml);
} finally {
if (dm != null) {
dm.free();
}
}
}
Aggregations