package org.ovirt.engine.core.bll;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.common.businessentities.VmStatic;
import org.ovirt.engine.core.common.queries.GetVmChangedFieldsForNextRunParameters;
import org.ovirt.engine.core.common.utils.SimpleDependencyInjector;
import org.ovirt.engine.core.common.utils.VmCommonUtils;
import org.ovirt.engine.core.common.utils.VmDeviceUpdate;
import org.ovirt.engine.core.common.utils.customprop.VmPropertiesUtils;
public class GetVmChangedFieldsForNextRunQuery<P extends GetVmChangedFieldsForNextRunParameters>
extends QueriesCommandBase<P>{
@Inject
private VmHandler vmHandler;
public GetVmChangedFieldsForNextRunQuery(P parameters) {
super(parameters);
}
@Override
protected void executeQueryCommand() {
VM srcVm = getParameters().getOriginal();
VM dstVm = getParameters().getUpdated();
VmStatic srcStatic = srcVm.getStaticData();
VmStatic dstStatic = dstVm.getStaticData();
// copy fields which are not saved as part of the OVF
dstStatic.setExportDate(srcStatic.getExportDate());
dstStatic.setManagedDeviceMap(srcStatic.getManagedDeviceMap());
dstStatic.setUnmanagedDeviceList(srcStatic.getUnmanagedDeviceList());
dstStatic.setOvfVersion(srcStatic.getOvfVersion());
// Copy creationDate to ignore it, because it is never changed by user.
// Without this creationDate will always show change in milliseconds,
// because creationDate is saved without milliseconds in OVF, but
// with milliseconds in the DB.
dstStatic.setCreationDate(srcStatic.getCreationDate());
// Hot plug CPU & memory are displayed separately in the confirmation dialog,
// so it is not needed to include them into changed fields list.
if (VmCommonUtils.isCpusToBeHotplugged(srcVm, dstVm)) {
dstStatic.setNumOfSockets(srcStatic.getNumOfSockets());
}
if (VmCommonUtils.isMemoryToBeHotplugged(srcVm, dstVm)) {
dstStatic.setMemSizeMb(srcStatic.getMemSizeMb());
}
VmPropertiesUtils vmPropertiesUtils = SimpleDependencyInjector.getInstance().get(VmPropertiesUtils.class);
vmPropertiesUtils.separateCustomPropertiesToUserAndPredefined(
srcVm.getCompatibilityVersion(), srcStatic);
vmPropertiesUtils.separateCustomPropertiesToUserAndPredefined(
dstVm.getCompatibilityVersion(), dstStatic);
Set<String> result = new HashSet<>(vmHandler.getChangedFieldsForStatus(srcStatic, dstStatic, VMStatus.Up));
for (VmDeviceUpdate device :
vmHandler.getVmDevicesFieldsToUpdateOnNextRun(srcVm.getId(), VMStatus.Up, getParameters().getUpdateVmParameters())) {
if (!device.getName().isEmpty()) {
result.add(device.getName());
} else {
switch (device.getType()) {
case UNKNOWN:
case VIRTIO:
result.add(device.getGeneralType().name());
break;
default:
result.add(device.getType().getName());
break;
}
}
}
setReturnValue(new ArrayList<>(result));
}
}