Alona Kaplan has uploaded a new change for review. Change subject: engine: scheduling host- find free VF ......................................................................
engine: scheduling host- find free VF A VF is marked as suitable for a passthrough vnic in case: 1. It is free (reported by vdsCaps, not attached to vm, doesn't have vlan device or network attached to it). 2. It's PF has the vnic's network (or label) in it's vf's configuration. Change-Id: I58c7aaa7a5a7160132418c397840583209aa8371 Signed-off-by: Alona Kaplan <alkap...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java M backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties M frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java M frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties M frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties 12 files changed, 167 insertions(+), 2 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/31/37931/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java index 8ca127b..0d5c4be 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/MigrateVmCommand.java @@ -117,6 +117,7 @@ getDestinationVdsId(), new ArrayList<String>(), new VdsFreeMemoryChecker(this), + null, getCorrelationId()); setDestinationVdsId(vdsToRunOn); if (vdsToRunOn != null && !Guid.Empty.equals(vdsToRunOn)) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java index 6a63925..b7532cd 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommand.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -15,6 +17,7 @@ import org.ovirt.engine.core.bll.job.ExecutionHandler; import org.ovirt.engine.core.bll.job.JobRepositoryFactory; import org.ovirt.engine.core.bll.network.cluster.NetworkHelper; +import org.ovirt.engine.core.bll.network.host.HostNicVfsConfigHelper; import org.ovirt.engine.core.bll.provider.ProviderProxyFactory; import org.ovirt.engine.core.bll.provider.network.NetworkProviderProxy; import org.ovirt.engine.core.bll.quota.QuotaConsumptionParameter; @@ -74,6 +77,7 @@ import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.job.ExecutionMessageDirector; +import org.ovirt.engine.core.di.Injector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -104,6 +108,8 @@ private boolean memoryFromSnapshotUsed; private Guid cachedActiveIsoDomainId; + + private Map<Guid, String> passthroughVnicToVfMap = new HashMap<>(); public static final String ISO_PREFIX = "iso://"; public static final String STATELESS_SNAPSHOT_DESCRIPTION = "stateless snapshot"; @@ -230,10 +236,12 @@ switch (e.getErrorCode()) { case Done: // should never get here with errorCode = 'Done' though case exist: + cleanupPassthroughVnics(); reportCompleted(); throw e; case VDS_NETWORK_ERROR: // probably wrong xml format sent. case PROVIDER_FAILURE: + cleanupPassthroughVnics(); runningFailed(); throw e; default: @@ -248,6 +256,8 @@ if (status != null && (status.isRunning() || status == VMStatus.RestoringState)) { setSucceeded(true); } else { + cleanupPassthroughVnics(); + // Try to rerun Vm on different vds no need to log the command because it is // being logged inside the rerun log.info("Trying to rerun VM '{}'", getVm().getName()); @@ -262,6 +272,10 @@ } } + private void cleanupPassthroughVnics() { + HostNicVfsConfigHelper hostNicVfsConfigHelper = Injector.get(HostNicVfsConfigHelper.class); + hostNicVfsConfigHelper.setVmIdOnVfs(getVdsId(), null, new HashSet<String>(passthroughVnicToVfMap.values())); + } @Override protected void executeVmCommand() { @@ -500,6 +514,8 @@ initParametersForExternalNetworks(); + initParametersForPassthroughVnics(); + VMStatus vmStatus = (VMStatus) getBackend() .getResourceManager() .RunAsyncVdsCommand(VDSCommandType.CreateVm, buildCreateVmParameters(), this).getReturnValue(); @@ -547,6 +563,10 @@ getVm().getRuntimeDeviceCustomProperties().put(vmDevice.getId(), deviceProperties); } } + } + + protected void initParametersForPassthroughVnics() { + getVm().setPassthroughVnicToVfMap(passthroughVnicToVfMap); } @Override @@ -751,6 +771,7 @@ getPredefinedVdsIdToRunOn(), new ArrayList<String>(), new VdsFreeMemoryChecker(this), + passthroughVnicToVfMap, getCorrelationId()); setVdsId(vdsToRunOn); if (vdsToRunOn != null && !Guid.Empty.equals(vdsToRunOn)) { diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java index 999e800..1aa57c0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java @@ -121,6 +121,7 @@ private final PolicyUnit policyUnit; protected VdsFreeMemoryChecker memoryChecker; + protected Map<Guid, Map<Guid, String>> hostToVnicToVfMap; public PolicyUnitImpl(PolicyUnit policyUnit) { this.policyUnit = policyUnit; @@ -156,4 +157,8 @@ this.memoryChecker = memoryChecker; } + + public void setHostToVnicToVfMap(Map<Guid, Map<Guid, String>> hostToVnicToVfMap) { + this.hostToVnicToVfMap = hostToVnicToVfMap; + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java index 3ab9a7a..e775855 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java @@ -19,6 +19,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; +import org.ovirt.engine.core.bll.network.host.HostNicVfsConfigHelper; import org.ovirt.engine.core.bll.scheduling.external.ExternalSchedulerDiscoveryThread; import org.ovirt.engine.core.bll.scheduling.external.ExternalSchedulerFactory; import org.ovirt.engine.core.common.AuditLogType; @@ -40,11 +41,13 @@ import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AlertDirector; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; +import org.ovirt.engine.core.dao.HostDeviceDao; import org.ovirt.engine.core.dao.VdsDAO; import org.ovirt.engine.core.dao.VdsDynamicDAO; import org.ovirt.engine.core.dao.VdsGroupDAO; import org.ovirt.engine.core.dao.scheduling.ClusterPolicyDao; import org.ovirt.engine.core.dao.scheduling.PolicyUnitDao; +import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation; import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl; import org.slf4j.Logger; @@ -253,6 +256,7 @@ Guid destHostId, List<String> messages, VdsFreeMemoryChecker memoryChecker, + Map<Guid, String> passthroughVnicToVfMap, String correlationId) { clusterLockMap.putIfAbsent(cluster.getId(), new Semaphore(1)); try { @@ -266,6 +270,7 @@ ClusterPolicy policy = policyMap.get(cluster.getClusterPolicyId()); Map<String, String> parameters = createClusterPolicyParameters(cluster); + Map<Guid, Map<Guid, String>> hostToVnicToVfMap = new HashMap<>(); vdsList = runFilters(policy.getFilters(), vdsList, @@ -275,6 +280,7 @@ messages, memoryChecker, true, + hostToVnicToVfMap, correlationId); if (vdsList == null || vdsList.isEmpty()) { @@ -291,6 +297,12 @@ 0, 0); + if (passthroughVnicToVfMap != null) { + passthroughVnicToVfMap.putAll(hostToVnicToVfMap.get(bestHost)); + } + + markVfsAsUsedByVm(bestHost, vm.getId(), passthroughVnicToVfMap); + return bestHost; } catch (InterruptedException e) { log.error("interrupted", e); @@ -303,6 +315,11 @@ } log.debug("Scheduling ended, correlation Id: {}", correlationId); } + } + + private void markVfsAsUsedByVm(Guid hostId, Guid vmId, Map<Guid, String> passthroughVnicToVfMap) { + HostNicVfsConfigHelper hostNicVfsConfigHelper = Injector.get(HostNicVfsConfigHelper.class); + hostNicVfsConfigHelper.setVmIdOnVfs(hostId, vmId, new HashSet<String>(passthroughVnicToVfMap.values())); } /** @@ -407,6 +424,7 @@ messages, noWaitingMemoryChecker, false, + null, null); return vdsList != null && !vdsList.isEmpty(); @@ -449,6 +467,7 @@ List<String> messages, VdsFreeMemoryChecker memoryChecker, boolean shouldRunExternalFilters, + Map<Guid, Map<Guid, String>> hostToVnicToVfMap, String correlationId) { SchedulingResult result = new SchedulingResult(); ArrayList<PolicyUnitImpl> internalFilters = new ArrayList<PolicyUnitImpl>(); @@ -476,7 +495,7 @@ hostList = runInternalFilters(internalFilters, hostList, vm, parameters, filterPositionMap, - memoryChecker, correlationId, result); + memoryChecker, hostToVnicToVfMap, correlationId, result); if (shouldRunExternalFilters && Config.<Boolean> getValue(ConfigValues.ExternalSchedulerEnabled) @@ -499,6 +518,7 @@ Map<String, String> parameters, Map<Guid, Integer> filterPositionMap, VdsFreeMemoryChecker memoryChecker, + Map<Guid, Map<Guid, String>> hostToVnicToVfMap, String correlationId, SchedulingResult result) { if (filters != null) { for (PolicyUnitImpl filterPolicyUnit : filters) { @@ -506,6 +526,7 @@ break; } filterPolicyUnit.setMemoryChecker(memoryChecker); + filterPolicyUnit.setHostToVnicToVfMap(hostToVnicToVfMap); List<VDS> currentHostList = new ArrayList<VDS>(hostList); hostList = filterPolicyUnit.filter(hostList, vm, parameters, result.getDetails()); logFilterActions(currentHostList, @@ -757,6 +778,10 @@ return DbFacade.getInstance().getVdsDynamicDao(); } + private HostDeviceDao getHostDeviceDao() { + return DbFacade.getInstance().getHostDeviceDao(); + } + protected PolicyUnitDao getPolicyUnitDao() { return DbFacade.getInstance().getPolicyUnitDao(); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java index a592026..ab3a9db 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java @@ -7,14 +7,18 @@ import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.ValidationResult; +import org.ovirt.engine.core.bll.network.host.HostNicVfsConfigHelper; import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl; import org.ovirt.engine.core.common.businessentities.Entities; +import org.ovirt.engine.core.common.businessentities.HostDevice; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VM; +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.NetworkBootProtocol; import org.ovirt.engine.core.common.businessentities.network.VdsNetworkInterface; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; +import org.ovirt.engine.core.common.businessentities.network.VnicProfile; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBllMessages; @@ -25,6 +29,8 @@ import org.ovirt.engine.core.dao.network.InterfaceDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao; +import org.ovirt.engine.core.dao.network.VnicProfileDao; +import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.utils.NetworkUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -60,6 +66,10 @@ networksByName, hostNics.get(host.getId()), hostDisplayNics.get(host.getId())); + + if (result.isValid()) { + result = validatePassthroughVnics(host, vmNICs); + } if (!result.isValid()) { toRemoveHostList.add(host); @@ -116,12 +126,13 @@ Config.<Boolean> getValue(ConfigValues.OnlyRequiredNetworksMandatoryForVdsSelection); for (final VmNetworkInterface vmIf : vmNICs) { boolean found = false; + boolean isVnicPassthrough = isVnicPassthrough(vmIf); if (vmIf.getNetworkName() == null) { found = true; } else { for (String networkName : hostNetworks) { - if (!networkRequiredOnVds(vmIf, networksByName, onlyRequiredNetworks) + if (isVnicPassthrough || !networkRequiredOnVds(vmIf, networksByName, onlyRequiredNetworks) || StringUtils.equals(vmIf.getNetworkName(), networkName)) { found = true; break; @@ -206,6 +217,81 @@ return ValidationResult.VALID; } + private boolean isVnicPassthrough(VmNetworkInterface vnic) { + VnicProfile vnicProfile = + vnic.getVnicProfileId() == null ? null : getVnicProfileDAO().get(vnic.getVnicProfileId()); + getVnicProfileDAO().get(vnic.getVnicProfileId()).isPassthrough(); + + return vnicProfile == null ? false : vnicProfile.isPassthrough(); + } + + private ValidationResult validatePassthroughVnics(VDS host, + List<VmNetworkInterface> vnics) { + + List<String> problematicVnics = new ArrayList<>(); + List<HostNicVfsConfig> vfsConfigs = + getHostNicVfsConfigHelper().getHostNicVfsConfigsWithNumVfsDataByHostId(host.getId()); + + for (final VmNetworkInterface vnic : vnics) { + boolean found = false; + if (isVnicPassthrough(vnic)) { + Network vnicNetwork = + vnic.getNetworkName() == null ? null : getNetworkDAO().getByName(vnic.getNetworkName()); + for (HostNicVfsConfig vfsConfig : vfsConfigs) { + if (vfsConfig.getNumOfVfs() != 0 && isNetworkInVfsConfig(vnicNetwork, vfsConfig)) { + + HostDevice freeVf = getFreeVf(vfsConfig); + + if (freeVf != null) { + found = true; + + if (hostToVnicToVfMap != null) { + Map<Guid, String> vnicToVfMap = new HashMap<>(); + VdsNetworkInterface nic = getInterfaceDAO().get(vfsConfig.getNicId()); + vnicToVfMap.put(vnic.getId(), getHostNicVfsConfigHelper().getFreeVf(nic).getDeviceName()); + hostToVnicToVfMap.put(host.getId(), vnicToVfMap); + } + } + } + } + } else { + found = true; + } + + if (!found) { + problematicVnics.add(vnic.getName()); + } + } + + if (!problematicVnics.isEmpty()) { + String vnicsString = StringUtils.join(problematicVnics, ", "); + log.warn("host {} doesn't contain suitable virtual functions for VM nics {}", + host.getName(), vnics); + return new ValidationResult(VdcBllMessages.VAR__DETAIL__NO_SUITABLE_VF, + String.format("$vnicNames %1$s", vnicsString)); + } + + return ValidationResult.VALID; + } + + private boolean isNetworkInVfsConfig(Network vnicNetwork, HostNicVfsConfig vfsConfig) { + if (vnicNetwork == null) { + return true; + } + + boolean isNetworkInConfig = + vfsConfig.isAllNetworksAllowed() || vfsConfig.getNetworks().contains(vnicNetwork.getId()); + boolean isLabelInConfig = + vnicNetwork.getLabel() != null && vfsConfig.getLabels().contains(vnicNetwork.getLabel()); + + return isNetworkInConfig || isLabelInConfig; + } + + private HostDevice getFreeVf(HostNicVfsConfig hostNicVfsConfig) { + VdsNetworkInterface nic = getInterfaceDAO().get(hostNicVfsConfig.getNicId()); + return getHostNicVfsConfigHelper().getFreeVf(nic); + } + private VmNetworkInterfaceDao getVmNetworkInterfaceDao() { return DbFacade.getInstance().getVmNetworkInterfaceDao(); } @@ -217,4 +303,12 @@ private NetworkDao getNetworkDAO() { return DbFacade.getInstance().getNetworkDao(); } + + private VnicProfileDao getVnicProfileDAO() { + return DbFacade.getInstance().getVnicProfileDao(); + } + + private HostNicVfsConfigHelper getHostNicVfsConfigHelper() { + return Injector.get(HostNicVfsConfigHelper.class); + } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java index 92715bc..7c2620d 100644 --- a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/RunVmCommandTest.java @@ -337,6 +337,7 @@ mockIsoDomainListSyncronizer(); mockSuccessfulRunVmValidator(); doNothing().when(command).initParametersForExternalNetworks(); + doNothing().when(command).initParametersForPassthroughVnics(); mockSuccessfulSnapshotValidator(); mockBackend(); } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java index 0e29dcd..c020c9f 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VM.java @@ -44,6 +44,8 @@ private Map<VmDeviceId, Map<String, String>> runtimeDeviceCustomProperties; + private Map<Guid, String> passthroughVnicToVfMap; + private ArchitectureType clusterArch; private boolean nextRunConfigurationExists; @@ -82,6 +84,14 @@ this.runtimeDeviceCustomProperties = runtimeDeviceCustomProperties; } + public Map<Guid, String> getPassthroughVnicToVfMap() { + return passthroughVnicToVfMap; + } + + public void setPassthroughVnicToVfMap(Map<Guid, String> passthroughVnicToVfMap) { + this.passthroughVnicToVfMap = passthroughVnicToVfMap; + } + public VM() { this(new VmStatic(), new VmDynamic(), new VmStatistics()); } @@ -98,6 +108,7 @@ snapshots = new ArrayList<Snapshot>(); initializationType = InitializationType.None; runtimeDeviceCustomProperties = new HashMap<VmDeviceId, Map<String, String>>(); + passthroughVnicToVfMap = new HashMap<>(); vmtCreationDate = new Date(0); storagePoolId = Guid.Empty; } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java index 318047d..6f3e35c 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java @@ -1073,6 +1073,7 @@ VAR__DETAIL__NETWORK_MISSING, VAR__DETAIL__DISPLAY_NETWORK_MISSING, VAR__DETAIL__DISPLAY_NETWORK_HAS_NO_BOOT_PROTOCOL, + VAR__DETAIL__NO_SUITABLE_VF, VAR__DETAIL__AFFINITY_FAILED_POSITIVE, VAR__DETAIL__AFFINITY_FAILED_NEGATIVE, VAR__DETAIL__LOW_CPU_LEVEL, diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index 8c38207..336d228 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -1285,6 +1285,7 @@ VAR__DETAIL__NETWORK_MISSING=$detailMessage network(s) ${networkNames} are missing VAR__DETAIL__DISPLAY_NETWORK_MISSING=$detailMessage display network ${DisplayNetwork} was missing VAR__DETAIL__DISPLAY_NETWORK_HAS_NO_BOOT_PROTOCOL=$detailMessage the display network ${DisplayNetwork} must have a DHCP or Static boot protocol when configured on a host +VAR__DETAIL__NO_SUITABLE_VF=$detailMessage there are no free virtual functions which are suitable for virtual nic(s) ${vnicNames}. A virtual function is constidered as suitable if the VF's configuration of its physical function contains the virtual nic's network/network label VAR__DETAIL__AFFINITY_FAILED_POSITIVE=$detailMessage it did not match positive affinity rules ${affinityRules} VAR__DETAIL__AFFINITY_FAILED_NEGATIVE=$detailMessage it matched negative affinity rules ${affinityRules} VAR__DETAIL__LOW_CPU_LEVEL=$detailMessage its CPU level ${hostCPULevel} is lower than the VM requires ${vmCPULevel} diff --git a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java index 4de68a9..116b501b 100644 --- a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java +++ b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java @@ -3410,6 +3410,9 @@ @DefaultStringValue("$detailMessage the display network ${DisplayNetwork} must have a DHCP or Static boot protocol when configured on a host") String VAR__DETAIL__DISPLAY_NETWORK_HAS_NO_BOOT_PROTOCOL(); + @DefaultStringValue("$detailMessage there are no free virtual functions which are suitable for virtual nic(s) ${vnicNames}. A virtual function is constidered as suitable if the VF's configuration of its physical function contains the virtual nic's network/network label") + String VAR__DETAIL__NO_SUITABLE_VF(); + @DefaultStringValue("$detailMessage its CPU level ${hostCPULevel} is lower than the VM requires ${vmCPULevel}") String VAR__DETAIL__LOW_CPU_LEVEL(); diff --git a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index 3452a0a..62d508e 100644 --- a/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/userportal-gwtp/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1027,6 +1027,7 @@ VAR__DETAIL__NETWORK_MISSING=$detailMessage network(s) ${networkNames} are missing VAR__DETAIL__DISPLAY_NETWORK_MISSING=$detailMessage display network ${DisplayNetwork} was missing VAR__DETAIL__DISPLAY_NETWORK_HAS_NO_BOOT_PROTOCOL=$detailMessage the display network ${DisplayNetwork} must have a DHCP or Static boot protocol when configured on a host +VAR__DETAIL__NO_SUITABLE_VF=$detailMessage there are no free virtual functions which are suitable for virtual nic(s) ${vnicNames}. A virtual function is constidered as suitable if the VF's configuration of its physical function contains the virtual nic's network/network label VAR__DETAIL__AFFINITY_FAILED_POSITIVE=$detailMessage it did not match positive affinity rules ${affinityRules} VAR__DETAIL__AFFINITY_FAILED_NEGATIVE=$detailMessage it matched negative affinity rules ${affinityRules} VAR__DETAIL__LOW_CPU_LEVEL=$detailMessage its CPU level ${hostCPULevel} is lower than the VM requires ${vmCPULevel} diff --git a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties index a2cd3c7..4d2e27b 100644 --- a/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties +++ b/frontend/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors.properties @@ -1243,6 +1243,7 @@ VAR__DETAIL__NETWORK_MISSING=$detailMessage network(s) ${networkNames} are missing VAR__DETAIL__DISPLAY_NETWORK_MISSING=$detailMessage display network ${DisplayNetwork} was missing VAR__DETAIL__DISPLAY_NETWORK_HAS_NO_BOOT_PROTOCOL=$detailMessage the display network ${DisplayNetwork} must have a DHCP or Static boot protocol when configured on a host +VAR__DETAIL__NO_SUITABLE_VF=$detailMessage there are no free virtual functions which are suitable for virtual nic(s) ${vnicNames}. A virtual function is constidered as suitable if the VF's configuration of its physical function contains the virtual nic's network/network label VAR__DETAIL__AFFINITY_FAILED_POSITIVE=$detailMessage it did not match positive affinity rules ${affinityRules} VAR__DETAIL__AFFINITY_FAILED_NEGATIVE=$detailMessage it matched negative affinity rules ${affinityRules} VAR__DETAIL__LOW_CPU_LEVEL=$detailMessage its CPU level ${hostCPULevel} is lower than the VM requires ${vmCPULevel} -- To view, visit http://gerrit.ovirt.org/37931 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I58c7aaa7a5a7160132418c397840583209aa8371 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Alona Kaplan <alkap...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches