use of org.ovirt.engine.core.common.businessentities.storage.DiskVmElement in project ovirt-engine by oVirt.
the class GetAllDisksByVmIdQuery method executeQueryCommand.
@Override
protected void executeQueryCommand() {
List<Disk> allDisks = diskDao.getAllForVm(getParameters().getId(), getUserID(), getParameters().isFiltered());
List<Disk> disks = new ArrayList<>();
for (Disk disk : allDisks) {
if (disk.getDiskStorageType() == DiskStorageType.IMAGE || disk.getDiskStorageType() == DiskStorageType.CINDER) {
DiskImage diskImage = (DiskImage) disk;
diskImage.getSnapshots().addAll(diskImageDao.getAllSnapshotsForLeaf(diskImage.getImageId()));
}
DiskVmElement dve = getDiskVmElement(disk);
if (dve != null) {
disk.setDiskVmElements(Collections.singletonList(dve));
disks.add(disk);
}
}
getQueryReturnValue().setReturnValue(disks);
}
use of org.ovirt.engine.core.common.businessentities.storage.DiskVmElement 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.DiskVmElement in project ovirt-engine by oVirt.
the class MoveDiskCommand method executeCommand.
@Override
protected void executeCommand() {
List<DiskVmElement> diskVmElements = diskVmElementDao.getAllDiskVmElementsByDiskId(getParameters().getImageGroupID());
ActionType actionType = getMoveActionType(diskVmElements);
if (actionType == ActionType.MoveOrCopyDisk) {
MoveDiskParameters moveDiskParameters = getParameters();
// This is required to make MoveDiskCommand and MoveOrCopyDiskCommand have
// different a commandId. Having the same commandId will make CommandsCache
// return the wrong command and lead to unexpected results
moveDiskParameters.setCommandId(null);
setReturnValue(runInternalAction(actionType, moveDiskParameters, ExecutionHandler.createInternalJobContext(getContext(), getLock())));
} else {
Guid vmId = diskVmElements.get(0).getVmId();
engineLock = lockVmWithWait(vmId);
setReturnValue(runInternalAction(actionType, createLiveMigrateDiskParameters(getParameters(), vmId), ExecutionHandler.createInternalJobContext(getContext(), engineLock)));
}
setSucceeded(true);
}
use of org.ovirt.engine.core.common.businessentities.storage.DiskVmElement 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.DiskVmElement in project ovirt-engine by oVirt.
the class AddDiskCommand method buildAddCinderDiskParameters.
private ActionParametersBase buildAddCinderDiskParameters() {
AddDiskParameters parameters = new AddDiskParameters(new DiskVmElement(null, getVmId()), getParameters().getDiskInfo());
parameters.setPlugDiskToVm(getParameters().getPlugDiskToVm());
parameters.setStorageDomainId(getParameters().getStorageDomainId());
parameters.setQuotaId(getQuotaId());
parameters.setEndProcedure(EndProcedure.COMMAND_MANAGED);
if (getVm() != null) {
parameters.setVmSnapshotId(snapshotDao.getId(getVmId(), SnapshotType.ACTIVE));
parameters.setDiskVmElement(getParameters().getDiskVmElement());
}
return parameters;
}
Aggregations