package org.ovirt.engine.core.bll.validator; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.network.host.NetworkDeviceHelper; import org.ovirt.engine.core.common.businessentities.network.HostNicVfsConfig; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dal.dbbroker.DbFacade; public class VfsConfigValidator { private Guid nicId; private VdsNetworkInterface nic; private HostNicVfsConfig oldVfsConfig; static final String NIC_NAME_REPLACEMENT = "$nicName %s"; static final String NUM_OF_VFS_REPLACEMENT = "$numOfVfs %d"; static final String MAX_NUM_OF_VFS_REPLACEMENT = "$maxNumOfVfs %d"; static final String NETWORK_NAME_REPLACEMENT = "$networkName %s"; static final String NETWORK_ID_REPLACEMENT = "$networkId %s"; static final String LABEL_REPLACEMENT = "$label %s"; public VfsConfigValidator(Guid nicId, HostNicVfsConfig oldVfsConfig) { this.nicId = nicId; this.oldVfsConfig = oldVfsConfig; } protected DbFacade getDbFacade() { return DbFacade.getInstance(); } /** * @return An error iff a nic with the specified id doesn't exist. */ public ValidationResult nicExists() { return ValidationResult.failWith(EngineMessage.HOST_NETWORK_INTERFACE_NOT_EXIST) .when(getNic() == null); } /** * @return An error iff the nic is not SR-IOV enabled */ public ValidationResult nicSriovEnabled() { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_NIC_IS_NOT_SRIOV_ENABLED, getNicNameReplacement()) .when(oldVfsConfig == null); } /** * @return An error iff there are non-free VFs of the nic */ public ValidationResult allVfsAreFree(NetworkDeviceHelper networkDeviceHelper) { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_NUM_OF_VFS_CANNOT_BE_CHANGED, getNicNameReplacement()) .unless(networkDeviceHelper.areAllVfsFree(getNic())); } /** * @return An error iff <code>numOfVfs</code> is bigger than the <code>vfsConfig.maxNumOfVfs</code> */ public ValidationResult numOfVfsInValidRange(int numOfVfs) { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_NUM_OF_VFS_NOT_IN_VALID_RANGE, getNicNameReplacement(), String.format(NUM_OF_VFS_REPLACEMENT, numOfVfs), String.format(MAX_NUM_OF_VFS_REPLACEMENT, oldVfsConfig.getMaxNumOfVfs())) .when(numOfVfs > oldVfsConfig.getMaxNumOfVfs() || numOfVfs < 0); } /** * @return An error iff <code>allNetworkAllowed</code> is <code>true</code> */ public ValidationResult settingSpecificNetworksAllowed() { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_CANNOT_SET_SPECIFIC_NETWORKS, getNicNameReplacement()) .when(oldVfsConfig.isAllNetworksAllowed()); } /** * @return An error iff a network with the specified id doesn't exist */ public ValidationResult networkExists(Guid networkId) { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_NOT_EXIST, getNicNameReplacement(), String.format(NETWORK_ID_REPLACEMENT, networkId)) .when(getNetwork(networkId) == null); } /** * @return An error iff the network is already part of the VFs configuration */ public ValidationResult networkNotInVfsConfig(Guid networkId) { String networkName = getNetwork(networkId).getName(); return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_ALREADY_IN_VFS_CONFIG, getNicNameReplacement(), String.format(NETWORK_NAME_REPLACEMENT, networkName)) .when(oldVfsConfig.getNetworks().contains(networkId)); } /** * @return An error iff the network is not part of the VFs configuration */ public ValidationResult networkInVfsConfig(Guid networkId) { String networkName = getNetwork(networkId).getName(); return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_NETWORK_NOT_IN_VFS_CONFIG, getNicNameReplacement(), String.format(NETWORK_NAME_REPLACEMENT, networkName)) .when(!oldVfsConfig.getNetworks().contains(networkId)); } /** * @return An error iff the label is already part of the VFs configuration */ public ValidationResult labelNotInVfsConfig(String label) { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_LABEL_ALREADY_IN_VFS_CONFIG, getNicNameReplacement(), String.format(LABEL_REPLACEMENT, label)) .when(oldVfsConfig.getNetworkLabels().contains(label)); } /** * @return An error iff the label is not part of the VFs configuration */ public ValidationResult labelInVfsConfig(String label) { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_LABEL_NOT_IN_VFS_CONFIG, getNicNameReplacement(), String.format(LABEL_REPLACEMENT, label)) .unless(oldVfsConfig.getNetworkLabels().contains(label)); } Network getNetwork(Guid networkId) { return getDbFacade().getNetworkDao().get(networkId); } VdsNetworkInterface getNic() { if (nic == null) { nic = getDbFacade().getInterfaceDao().get(nicId); } return nic; } String getNicNameReplacement() { return String.format(NIC_NAME_REPLACEMENT, getNic().getName()); } void setOldVfsConfig(HostNicVfsConfig oldVfsConfig) { this.oldVfsConfig = oldVfsConfig; } }