package org.ovirt.engine.core.bll.network.host;
import java.util.Collections;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.UpdateHostNicVfsConfigParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdsActionParameters;
import org.ovirt.engine.core.common.businessentities.network.HostNicVfsConfig;
import org.ovirt.engine.core.common.errors.EngineError;
import org.ovirt.engine.core.common.errors.EngineException;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.vdscommands.HostDevChangeNumVfsVDSParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.utils.transaction.TransactionSupport;
@NonTransactiveCommandAttribute
public class UpdateHostNicVfsConfigCommand extends VfsConfigCommandBase<UpdateHostNicVfsConfigParameters> {
@Inject
private NetworkDeviceHelper networkDeviceHelper;
private HostNicVfsConfig hostNicVfsConfig;
public UpdateHostNicVfsConfigCommand(UpdateHostNicVfsConfigParameters parameters, CommandContext commandContext) {
super(parameters, commandContext);
}
@Override
protected void executeCommand() {
boolean result = true;
HostNicVfsConfig oldVfsConfig = getVfsConfig();
boolean allNetworksAllowedChanged = isAllNetworksAllowed() != oldVfsConfig.isAllNetworksAllowed();
super.executeCommand();
// Check if 'allNetworksAllowed' has changed
if (allNetworksAllowedChanged) {
oldVfsConfig.setAllNetworksAllowed(isAllNetworksAllowed());
if (isAllNetworksAllowed()) {
oldVfsConfig.setNetworks(Collections.emptySet());
oldVfsConfig.setNetworkLabels(Collections.emptySet());
}
}
boolean shouldRefreshHost = false;
if (wasNumOfVfsChanged()) {
shouldRefreshHost = true;
String deviceName = networkDeviceHelper.getPciDeviceNameByNic(getNic());
try {
VDSReturnValue returnValue = runVdsCommand(VDSCommandType.HostDevChangeNumVfs,
new HostDevChangeNumVfsVDSParameters(getVdsId(), deviceName, getNumOfVfs()));
result = returnValue.getSucceeded();
} catch (EngineException e) {
throw new EngineException(EngineError.UPDATE_NUM_VFS_FAILURE);
}
}
if (result) {
setSucceeded(saveChangesToDb(shouldRefreshHost, oldVfsConfig, allNetworksAllowedChanged));
}
}
private boolean saveChangesToDb(final boolean shouldRefreshHost,
final HostNicVfsConfig oldVfsConfig,
final boolean allNetworksAllowedChanged) {
return TransactionSupport.executeInNewTransaction(() -> {
boolean result = true;
if (shouldRefreshHost) {
result = refreshHost();
}
if (result && allNetworksAllowedChanged) {
getVfsConfigDao().update(oldVfsConfig);
}
return result;
});
}
private boolean refreshHost() {
VdsActionParameters vdsActionParams = new VdsActionParameters(getVdsId());
return runInternalAction(VdcActionType.RefreshHost, vdsActionParams).getSucceeded();
}
@Override
protected boolean validate() {
boolean isValid = super.validate();
if (isValid && wasNumOfVfsChanged()) {
isValid = validate(getVfsConfigValidator().allVfsAreFree(networkDeviceHelper))
&& validate(getVfsConfigValidator().numOfVfsInValidRange(getNumOfVfs()));
}
return isValid;
}
boolean wasNumOfVfsChanged() {
return getVfsConfig().getNumOfVfs() != getNumOfVfs();
}
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.UPDATE_HOST_NIC_VFS_CONFIG
: AuditLogType.UPDATE_HOST_NIC_VFS_CONFIG_FAILED;
}
@Override
protected void setActionMessageParameters() {
addValidationMessage(EngineMessage.VAR__ACTION__UPDATE);
addValidationMessage(EngineMessage.VAR__TYPE__HOST_NIC_VFS_CONFIG);
}
private int getNumOfVfs() {
return getParameters().getNumOfVfs();
}
private boolean isAllNetworksAllowed() {
return getParameters().getAllNetworksAllowed();
}
@Override
public HostNicVfsConfig getVfsConfig() {
HostNicVfsConfig tmpVfsConfig = super.getVfsConfig();
if (hostNicVfsConfig == null) {
networkDeviceHelper.updateHostNicVfsConfigWithNumVfsData(tmpVfsConfig);
}
hostNicVfsConfig = tmpVfsConfig;
return hostNicVfsConfig;
}
}