use of org.ovirt.engine.core.common.businessentities.storage.Disk in project ovirt-engine by oVirt.
the class LibvirtVmXmlBuilder method writeDisks.
private void writeDisks(List<VmDevice> devices) {
Map<VmDeviceId, VmDevice> deviceIdToDevice = devices.stream().collect(Collectors.toMap(VmDevice::getId, dev -> dev));
Map<Integer, Map<VmDevice, Integer>> vmDeviceSpaprVscsiUnitMap = vmInfoBuildUtils.getVmDeviceUnitMapForSpaprScsiDisks(vm);
Map<Integer, Map<VmDevice, Integer>> vmDeviceVirtioScsiUnitMap = vmInfoBuildUtils.getVmDeviceUnitMapForVirtioScsiDisks(vm);
int hdIndex = -1;
int sdIndex = -1;
int vdIndex = -1;
int pinnedDriveIndex = 0;
Map<Disk, VmDevice> vmDisksToDevices = vm.getDiskMap().values().stream().map(d -> new Pair<>(d, deviceIdToDevice.get(new VmDeviceId(d.getId(), vm.getId())))).filter(p -> p.getSecond() != null && p.getSecond().isManaged()).collect(Collectors.toMap(Pair::getFirst, Pair::getSecond));
for (Entry<Disk, VmDevice> diskAndDevice : vmInfoBuildUtils.getSortedDisks(vmDisksToDevices, vm.getId())) {
Disk disk = diskAndDevice.getKey();
VmDevice device = diskAndDevice.getValue();
DiskVmElement dve = disk.getDiskVmElementForVm(vm.getId());
DiskInterface diskInterface = dve.getDiskInterface();
int index = 0;
int pinTo = 0;
switch(diskInterface) {
case IDE:
index = hdIndex = skipCdIndices(++hdIndex, diskInterface);
break;
case VirtIO:
pinTo = vmInfoBuildUtils.pinToIoThreads(vm, pinnedDriveIndex++);
index = vdIndex = skipCdIndices(++vdIndex, diskInterface);
break;
case SPAPR_VSCSI:
case VirtIO_SCSI:
vmInfoBuildUtils.calculateAddressForScsiDisk(vm, disk, device, vmDeviceSpaprVscsiUnitMap, vmDeviceVirtioScsiUnitMap);
case SATA:
index = sdIndex = skipCdIndices(++sdIndex, diskInterface);
break;
}
String dev = vmInfoBuildUtils.makeDiskName(dve.getDiskInterface().getName(), index);
writeDisk(device, disk, dve, dev, pinTo);
}
}
use of org.ovirt.engine.core.common.businessentities.storage.Disk in project ovirt-engine by oVirt.
the class VmInfoBuildUtils method calculateAddressForScsiDisk.
public void calculateAddressForScsiDisk(VM vm, Disk disk, VmDevice device, Map<Integer, Map<VmDevice, Integer>> vmDeviceSpaprVscsiUnitMap, Map<Integer, Map<VmDevice, Integer>> vmDeviceVirtioScsiUnitMap) {
Map<DiskInterface, Integer> controllerIndexMap = ArchStrategyFactory.getStrategy(vm.getClusterArch()).run(new GetControllerIndices()).returnValue();
int defaultSpaprVscsiControllerIndex = controllerIndexMap.get(DiskInterface.SPAPR_VSCSI);
int defaultVirtioScsiControllerIndex = controllerIndexMap.get(DiskInterface.VirtIO_SCSI);
Integer unitIndex = null;
switch(disk.getDiskVmElementForVm(vm.getId()).getDiskInterface()) {
case SPAPR_VSCSI:
if (StringUtils.isEmpty(device.getAddress())) {
unitIndex = vmDeviceSpaprVscsiUnitMap.get(defaultSpaprVscsiControllerIndex).get(device);
device.setAddress(createAddressForScsiDisk(defaultSpaprVscsiControllerIndex, unitIndex).toString());
}
break;
case VirtIO_SCSI:
int controllerIndex = defaultVirtioScsiControllerIndex;
VmDevice deviceFromMap = device;
for (Map.Entry<Integer, Map<VmDevice, Integer>> controllerToDevices : vmDeviceVirtioScsiUnitMap.entrySet()) {
Optional<VmDevice> maybeDeviceFromMap = controllerToDevices.getValue().keySet().stream().filter(d -> d.getId().equals(device.getId())).findFirst();
if (maybeDeviceFromMap.isPresent()) {
deviceFromMap = maybeDeviceFromMap.get();
controllerIndex = controllerToDevices.getKey();
unitIndex = controllerToDevices.getValue().get(deviceFromMap);
break;
}
}
if (StringUtils.isEmpty(deviceFromMap.getAddress())) {
if (unitIndex == null) {
// should never get here, but for safety having this fallback and generating a new unit id
unitIndex = getAvailableUnitForScsiDisk(vmDeviceVirtioScsiUnitMap.get(controllerIndex), false, false);
log.debug("The unit was null for disk '{}' on controller '{}', generating a new one '{}'", disk.getId(), controllerIndex, unitIndex);
}
device.setAddress(createAddressForScsiDisk(controllerIndex, unitIndex).toString());
}
break;
}
}
use of org.ovirt.engine.core.common.businessentities.storage.Disk in project ovirt-engine by oVirt.
the class UpdateVmDiskCommand method performDiskUpdate.
protected void performDiskUpdate(final boolean unlockImage) {
if (shouldPerformMetadataUpdate()) {
updateMetaDataDescription((DiskImage) getNewDisk());
}
final Disk diskForUpdate = diskDao.get(getParameters().getDiskInfo().getId());
final DiskVmElement diskVmElementForUpdate = diskVmElementDao.get(new VmDeviceId(getOldDisk().getId(), getVmId()));
applyUserChanges(diskForUpdate, diskVmElementForUpdate);
TransactionSupport.executeInNewTransaction(new TransactionMethod<Object>() {
@Override
public Object runInTransaction() {
vmStaticDao.incrementDbGeneration(getVm().getId());
updateDeviceProperties();
baseDiskDao.update(diskForUpdate);
diskVmElementDao.update(diskVmElementForUpdate);
switch(diskForUpdate.getDiskStorageType()) {
case IMAGE:
DiskImage diskImage = (DiskImage) diskForUpdate;
diskImage.setQuotaId(getQuotaId());
if (unlockImage && diskImage.getImageStatus() == ImageStatus.LOCKED) {
diskImage.setImageStatus(ImageStatus.OK);
}
imageDao.update(diskImage.getImage());
updateQuota(diskImage);
updateDiskProfile();
break;
case CINDER:
CinderDisk cinderDisk = (CinderDisk) diskForUpdate;
cinderDisk.setQuotaId(getQuotaId());
setStorageDomainId(cinderDisk.getStorageIds().get(0));
getCinderBroker().updateDisk(cinderDisk);
if (unlockImage && cinderDisk.getImageStatus() == ImageStatus.LOCKED) {
cinderDisk.setImageStatus(ImageStatus.OK);
}
imageDao.update(cinderDisk.getImage());
updateQuota(cinderDisk);
break;
case LUN:
// No specific update for LUN disk
break;
}
reloadDisks();
setSucceeded(true);
// If necessary set the new Storage QoS values on running VMs asynchronously
liveUpdateDiskProfile();
return null;
}
private void updateDeviceProperties() {
if (updateReadOnlyRequested()) {
vmDeviceForVm.setReadOnly(getDiskVmElement().isReadOnly());
vmDeviceDao.update(vmDeviceForVm);
}
if ((getOldDiskVmElement().getDiskInterface() != getDiskVmElement().getDiskInterface()) || ((getOldDiskVmElement().isBoot() != getDiskVmElement().isBoot()) && (getDiskVmElement().getDiskInterface() == DiskInterface.IDE))) {
vmDeviceForVm.setAddress("");
vmDeviceDao.clearDeviceAddress(getOldDisk().getId());
}
}
});
}
use of org.ovirt.engine.core.common.businessentities.storage.Disk in project ovirt-engine by oVirt.
the class AttachDiskToVmCommand method executeVmCommand.
@Override
protected void executeVmCommand() {
if (!isOperationPerformedOnDiskSnapshot()) {
vmStaticDao.incrementDbGeneration(getVm().getId());
}
final VmDevice vmDevice = createVmDevice();
vmDeviceDao.save(vmDevice);
DiskVmElement diskVmElement = getDiskVmElement();
diskVmElement.getId().setDeviceId(disk.getId());
diskVmElementDao.save(diskVmElement);
// When performing hot plug for VirtIO-SCSI or SPAPR_VSCSI the address map calculation needs this info to be populated
disk.setDiskVmElements(Collections.singletonList(diskVmElement));
// update cached image
List<Disk> imageList = new ArrayList<>();
imageList.add(disk);
vmHandler.updateDisksForVm(getVm(), imageList);
if (!isOperationPerformedOnDiskSnapshot()) {
if (disk.isAllowSnapshot()) {
updateDiskVmSnapshotId();
}
}
if (getParameters().isPlugUnPlug() && getVm().getStatus() != VMStatus.Down) {
performPlugCommand(VDSCommandType.HotPlugDisk, disk, vmDevice);
}
setSucceeded(true);
}
use of org.ovirt.engine.core.common.businessentities.storage.Disk in project ovirt-engine by oVirt.
the class AttachDiskToVmCommand method validate.
@Override
protected boolean validate() {
if (disk == null) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_VM_IMAGE_DOES_NOT_EXIST);
}
DiskValidator oldDiskValidator = new DiskValidator(disk);
ValidationResult isHostedEngineDisk = oldDiskValidator.validateNotHostedEngineDisk();
if (!isHostedEngineDisk.isValid()) {
return validate(isHostedEngineDisk);
}
if (!checkOperationAllowedOnDiskContentType(disk)) {
return false;
}
if (isOperationPerformedOnDiskSnapshot() && (!validate(snapshotsValidator.snapshotExists(getSnapshot())) || !validate(snapshotsValidator.isRegularSnapshot(getSnapshot())))) {
return false;
}
boolean isImageDisk = disk.getDiskStorageType().isInternal();
if (isImageDisk) {
// TODO : this load and check of the active disk will be removed
// after inspecting upgrade
Disk activeDisk = diskHandler.loadActiveDisk(disk.getId());
if (((DiskImage) activeDisk).getImageStatus() == ImageStatus.ILLEGAL) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_ILLEGAL_DISK_OPERATION);
}
if (((DiskImage) disk).getImageStatus() == ImageStatus.LOCKED) {
addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_DISKS_LOCKED);
addValidationMessageVariable("diskAliases", disk.getDiskAlias());
return false;
}
}
if (!validate(new VmValidator(getVm()).isVmExists()) || !isVmInUpPausedDownStatus()) {
return false;
}
if (!validateDiskVmData()) {
return false;
}
if (!canRunActionOnNonManagedVm()) {
return false;
}
updateDisksFromDb();
if (getDiskVmElement().isBoot() && !validate(getDiskValidator(disk).isVmNotContainsBootDisk(getVm()))) {
return false;
}
if (!isDiskPassPciAndIdeLimit()) {
return false;
}
if (vmDeviceDao.exists(new VmDeviceId(disk.getId(), getVmId()))) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_DISK_ALREADY_ATTACHED);
}
if (!isOperationPerformedOnDiskSnapshot() && !disk.isShareable() && disk.getNumberOfVms() > 0) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_NOT_SHAREABLE_DISK_ALREADY_ATTACHED);
}
if (isImageDisk && storagePoolIsoMapDao.get(new StoragePoolIsoMapId(((DiskImage) disk).getStorageIds().get(0), getVm().getStoragePoolId())) == null) {
return failValidation(EngineMessage.ACTION_TYPE_FAILED_STORAGE_POOL_NOT_MATCH);
}
if (isImageDisk) {
StorageDomain storageDomain = storageDomainDao.getForStoragePool(((DiskImage) disk).getStorageIds().get(0), ((DiskImage) disk).getStoragePoolId());
StorageDomainValidator storageDomainValidator = getStorageDomainValidator(storageDomain);
if (!validate(storageDomainValidator.isDomainExistAndActive())) {
return false;
}
}
DiskVmElementValidator diskVmElementValidator = getDiskVmElementValidator(disk, getDiskVmElement());
if (!validate(diskVmElementValidator.isReadOnlyPropertyCompatibleWithInterface())) {
return false;
}
if (!validate(diskVmElementValidator.isVirtIoScsiValid(getVm()))) {
return false;
}
if (!validate(diskVmElementValidator.isDiskInterfaceSupported(getVm()))) {
return false;
}
Guid storageDomainId = disk.getDiskStorageType() == DiskStorageType.IMAGE ? ((DiskImage) disk).getStorageIds().get(0) : null;
if (!validate(diskVmElementValidator.isPassDiscardSupported(storageDomainId))) {
return false;
}
if (!isVmNotInPreviewSnapshot()) {
return false;
}
if (getParameters().isPlugUnPlug() && getVm().getStatus() != VMStatus.Down) {
return isDiskSupportedForPlugUnPlug(getDiskVmElement(), disk.getDiskAlias());
}
return true;
}
Aggregations