use of org.ovirt.engine.core.common.businessentities.SupportedAdditionalClusterFeature in project ovirt-engine by oVirt.
the class ClusterListModel method buildCluster.
public static Cluster buildCluster(ClusterModel model, Cluster cluster) {
Version version = model.getVersion().getSelectedItem();
cluster.setName(model.getName().getEntity());
cluster.setDescription(model.getDescription().getEntity());
cluster.setComment(model.getComment().getEntity());
cluster.setStoragePoolId(model.getDataCenter().getSelectedItem().getId());
if (model.getCPU().getSelectedItem() != null) {
cluster.setCpuName(model.getCPU().getSelectedItem().getCpuName());
}
cluster.setMaxVdsMemoryOverCommit(model.getMemoryOverCommit());
cluster.setCountThreadsAsCores(Boolean.TRUE.equals(model.getVersionSupportsCpuThreads().getEntity()) && Boolean.TRUE.equals(model.getCountThreadsAsCores().getEntity()));
cluster.setEnableKsm(Boolean.TRUE.equals(model.getEnableKsm().getEntity()));
cluster.setKsmMergeAcrossNumaNodes(model.getKsmPolicyForNuma());
cluster.setEnableBallooning(Boolean.TRUE.equals(model.getEnableBallooning().getEntity()));
// $NON-NLS-1$
cluster.setTransparentHugepages(true);
cluster.setCompatibilityVersion(version);
cluster.setRequiredSwitchTypeForCluster(model.getSwitchType().getSelectedItem());
cluster.setFirewallType(model.getFirewallType().getSelectedItem());
if (model.getDefaultNetworkProvider().getSelectedItem() != null) {
cluster.setDefaultNetworkProviderId(model.getDefaultNetworkProvider().getSelectedItem().getId());
}
cluster.setMigrateOnError(model.getMigrateOnErrorOption());
cluster.setVirtService(model.getEnableOvirtService().getEntity());
cluster.setGlusterService(model.getEnableGlusterService().getEntity());
for (AdditionalFeature feature : model.getAdditionalClusterFeatures().getSelectedItem()) {
cluster.getAddtionalFeaturesSupported().add(new SupportedAdditionalClusterFeature(cluster.getId(), true, feature));
}
cluster.setTrustedService(model.getEnableTrustedService().getEntity());
cluster.setHaReservation(model.getEnableHaReservation().getEntity());
cluster.setOptionalReasonRequired(model.getEnableOptionalReason().getEntity());
cluster.setMaintenanceReasonRequired(model.getEnableHostMaintenanceReason().getEntity());
cluster.setClusterPolicyId(model.getClusterPolicy().getSelectedItem().getId());
cluster.setClusterPolicyProperties(KeyValueModel.convertProperties(model.getCustomPropertySheet().serialize()));
if (model.getOptimizeForSpeed().getEntity()) {
cluster.setOptimizationType(OptimizationType.OPTIMIZE_FOR_SPEED);
} else if (model.getAllowOverbooking().getEntity()) {
cluster.setOptimizationType(OptimizationType.ALLOW_OVERBOOKING);
} else {
cluster.setOptimizationType(OptimizationType.NONE);
}
if (model.getCPU().getSelectedItem() == null) {
cluster.setArchitecture(model.getArchitecture().getSelectedItem());
} else {
cluster.setArchitecture(null);
}
if (model.getSpiceProxyEnabled().getEntity()) {
cluster.setSpiceProxy(model.getSpiceProxy().getEntity());
}
if (model.getMigrationPolicies().getSelectedItem() != null) {
cluster.setMigrationPolicyId(model.getMigrationPolicies().getSelectedItem().getId());
}
cluster.getFencingPolicy().setFencingEnabled(model.getFencingEnabledModel().getEntity());
cluster.getFencingPolicy().setSkipFencingIfSDActive(model.getSkipFencingIfSDActiveEnabled().getEntity());
cluster.getFencingPolicy().setSkipFencingIfConnectivityBroken(model.getSkipFencingIfConnectivityBrokenEnabled().getEntity());
cluster.getFencingPolicy().setHostsWithBrokenConnectivityThreshold(model.getHostsWithBrokenConnectivityThreshold().getSelectedItem().intValue());
cluster.getFencingPolicy().setSkipFencingIfGlusterBricksUp(model.getSkipFencingIfGlusterBricksUp().getEntity());
cluster.getFencingPolicy().setSkipFencingIfGlusterQuorumNotMet(model.getSkipFencingIfGlusterQuorumNotMet().getEntity());
cluster.setSerialNumberPolicy(model.getSerialNumberPolicy().getSelectedSerialNumberPolicy());
cluster.setCustomSerialNumber(model.getSerialNumberPolicy().getCustomSerialNumber().getEntity());
cluster.setAutoConverge(model.getAutoConverge().getSelectedItem());
cluster.setMigrateCompressed(model.getMigrateCompressed().getSelectedItem());
if (model.getEnableGlusterService().getEntity()) {
cluster.setGlusterTunedProfile(model.getGlusterTunedProfile().getSelectedItem());
}
cluster.getAdditionalRngSources().clear();
if (Boolean.TRUE.equals(model.getRngHwrngSourceRequired().getEntity())) {
cluster.getAdditionalRngSources().add(VmRngDevice.Source.HWRNG);
}
cluster.setMigrationBandwidthLimitType(model.getMigrationBandwidthLimitType().getSelectedItem());
cluster.setCustomMigrationNetworkBandwidth(MigrationBandwidthLimitType.CUSTOM.equals(model.getMigrationBandwidthLimitType().getSelectedItem()) ? model.getCustomMigrationNetworkBandwidth().getEntity() : null);
cluster.setMacPoolId(model.getMacPoolListModel().getSelectedItem().getId());
return cluster;
}
use of org.ovirt.engine.core.common.businessentities.SupportedAdditionalClusterFeature in project ovirt-engine by oVirt.
the class UpdateClusterCommand method validate.
@Override
protected boolean validate() {
boolean result = true;
boolean hasVms = false;
boolean hasVmOrHost = false;
boolean sameCpuNames = false;
boolean allVdssInMaintenance = false;
List<VM> vmList = null;
if (oldCluster == null) {
addValidationMessage(EngineMessage.VDS_CLUSTER_IS_NOT_VALID);
result = false;
}
// if the name was changed then make sure the new name is unique
if (result && !StringUtils.equals(oldCluster.getName(), getCluster().getName())) {
if (!isClusterUnique(getCluster().getName())) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_DO_ACTION_NAME_IN_USE);
result = false;
}
}
if (result && !VersionSupport.checkVersionSupported(getCluster().getCompatibilityVersion())) {
addValidationMessage(VersionSupport.getUnsupportedVersionMessage());
result = false;
}
if (result) {
allForCluster = vdsDao.getAllForCluster(oldCluster.getId());
}
// decreasing of compatibility version is only allowed when no hosts exists, and not beneath the DC version
if (result && getCluster().getCompatibilityVersion().compareTo(oldCluster.getCompatibilityVersion()) < 0) {
if (!allForCluster.isEmpty()) {
result = false;
addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_CANNOT_DECREASE_CLUSTER_WITH_HOSTS_COMPATIBILITY_VERSION);
}
if (oldCluster.getStoragePoolId() != null) {
ClusterValidator validator = new ClusterValidator(dbFacade, oldCluster, getCpuFlagsManagerHandler());
if (!validate(validator.dataCenterVersionMismatch())) {
result = false;
addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_CANNOT_DECREASE_COMPATIBILITY_VERSION_UNDER_DC);
}
}
}
if (result && oldCluster.getStoragePoolId() != null && !oldCluster.getStoragePoolId().equals(getCluster().getStoragePoolId())) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_CHANGE_STORAGE_POOL);
result = false;
}
// If both original Cpu and new Cpu are null, don't check Cpu validity
if (result) {
allVdssInMaintenance = areAllVdssInMaintenance(allForCluster);
}
// Validate the cpu only if the cluster supports Virt
if (result && getCluster().supportsVirtService() && (oldCluster.getCpuName() != null || getCluster().getCpuName() != null)) {
// Check that cpu exist
if (!checkIfCpusExist()) {
addValidationMessage(EngineMessage.ACTION_TYPE_FAILED_CPU_NOT_FOUND);
addValidationMessage(EngineMessage.VAR__TYPE__CLUSTER);
result = false;
} else {
// vds in this cluster, cannot update
if (!StringUtils.isEmpty(oldCluster.getCpuName()) && !checkIfCpusSameManufacture(oldCluster) && !allVdssInMaintenance) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_UPDATE_CPU_ILLEGAL);
result = false;
}
}
}
if (result) {
vmList = vmDao.getAllForCluster(oldCluster.getId());
hasVmOrHost = !vmList.isEmpty() || !allForCluster.isEmpty();
}
// cannot change the processor architecture while there are attached hosts or VMs to the cluster
if (result && getCluster().supportsVirtService() && !isArchitectureUpdatable() && hasVmOrHost) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_UPDATE_CPU_ARCHITECTURE_ILLEGAL);
result = false;
}
if (result) {
sameCpuNames = StringUtils.equals(oldCluster.getCpuName(), getCluster().getCpuName());
}
if (result) {
boolean isOldCPUEmpty = StringUtils.isEmpty(oldCluster.getCpuName());
if (!isOldCPUEmpty && !sameCpuNames && !isCpuUpdatable(oldCluster) && hasVmOrHost) {
addValidationMessage(EngineMessage.CLUSTER_CPU_IS_NOT_UPDATABLE);
result = false;
}
}
if (result && !oldCluster.getCompatibilityVersion().equals(getCluster().getCompatibilityVersion())) {
for (VM vm : vmList) {
if (vm.isPreviewSnapshot()) {
// can't change cluster version when a VM is in preview
if (result) {
addValidationMessage(EngineMessage.CLUSTER_VERSION_CHANGE_VM_PREVIEW);
// and continue with adding validation messages
result = false;
}
addValidationMessage(vm.getName());
}
}
}
if (result) {
List<VDS> vdss = new ArrayList<>();
isAddedToStoragePool = oldCluster.getStoragePoolId() == null && getCluster().getStoragePoolId() != null;
if (isAddedToStoragePool && !validateManagementNetwork()) {
return false;
}
for (VDS vds : allForCluster) {
if (vds.getStatus() == VDSStatus.Up) {
if (isAddedToStoragePool) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_UPDATE_VDS_UP);
return false;
} else {
vdss.add(vds);
}
}
}
for (VDS vds : vdss) {
if (!VersionSupport.checkClusterVersionSupported(getCluster().getCompatibilityVersion(), vds)) {
result = false;
addValidationMessage(EngineMessage.CLUSTER_CANNOT_UPDATE_COMPATIBILITY_VERSION_WITH_LOWER_HOSTS);
break;
} else if (getCluster().supportsVirtService() && missingServerCpuFlags(vds) != null) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_UPDATE_CPU_WITH_LOWER_HOSTS);
result = false;
break;
}
if (!isSupportedEmulatedMachinesMatchClusterLevel(vds)) {
return failValidation(EngineMessage.CLUSTER_CANNOT_UPDATE_COMPATIBILITY_VERSION_WITH_INCOMPATIBLE_EMULATED_MACHINE);
}
}
if (result) {
Set<SupportedAdditionalClusterFeature> additionalClusterFeaturesAdded = getAdditionalClusterFeaturesAdded();
// New Features cannot be enabled if all up hosts are not supporting the selected feature
if (CollectionUtils.isNotEmpty(additionalClusterFeaturesAdded) && !checkClusterFeaturesSupported(vdss, additionalClusterFeaturesAdded)) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_UPDATE_SUPPORTED_FEATURES_WITH_LOWER_HOSTS);
result = false;
}
}
if (result) {
boolean notDownVms = false;
boolean suspendedVms = false;
hasVms = vmList.size() > 0;
if (!sameCpuNames) {
for (VM vm : vmList) {
if (vm.getStatus() == VMStatus.Suspended) {
suspendedVms = true;
break;
} else if (vm.getStatus() != VMStatus.Down) {
notDownVms = true;
break;
}
}
if (suspendedVms) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_UPDATE_CPU_WITH_SUSPENDED_VMS);
result = false;
} else if (notDownVms) {
int compareResult = compareCpuLevels(oldCluster);
if (compareResult > 0) {
// Upgrade of CPU in same compability level is allowed if
// there
// are running VMs - but we should warn they
// cannot not be hibernated
addCustomValue("Cluster", getParameters().getCluster().getName());
auditLogDirector.log(this, AuditLogType.CANNOT_HIBERNATE_RUNNING_VMS_AFTER_CLUSTER_CPU_UPGRADE);
}
}
}
}
}
if (result && getCluster().getStoragePoolId() != null) {
StoragePool storagePool = storagePoolDao.get(getCluster().getStoragePoolId());
if (oldCluster.getStoragePoolId() == null && storagePool.isLocal()) {
// we allow only one cluster in localfs data center
if (!clusterDao.getAllForStoragePool(getCluster().getStoragePoolId()).isEmpty()) {
getReturnValue().getValidationMessages().add(EngineMessage.CLUSTER_CANNOT_ADD_MORE_THEN_ONE_HOST_TO_LOCAL_STORAGE.toString());
result = false;
} else if (Config.getValue(ConfigValues.AutoRegistrationDefaultClusterID).equals(getCluster().getId())) {
addValidationMessage(EngineMessage.DEFAULT_CLUSTER_CANNOT_BE_ON_LOCALFS);
result = false;
}
}
}
if (result) {
if (!(getCluster().supportsGlusterService() || getCluster().supportsVirtService())) {
addValidationMessage(EngineMessage.CLUSTER_AT_LEAST_ONE_SERVICE_MUST_BE_ENABLED);
result = false;
} else if (getCluster().supportsGlusterService() && getCluster().supportsVirtService() && !isAllowClusterWithVirtGluster()) {
addValidationMessage(EngineMessage.CLUSTER_ENABLING_BOTH_VIRT_AND_GLUSTER_SERVICES_NOT_ALLOWED);
result = false;
}
}
if (result && hasVms && !getCluster().supportsVirtService()) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_DISABLE_VIRT_WHEN_CLUSTER_CONTAINS_VMS);
result = false;
}
if (result && !getCluster().supportsGlusterService()) {
List<GlusterVolumeEntity> volumes = glusterVolumeDao.getByClusterId(getCluster().getId());
if (volumes != null && volumes.size() > 0) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_DISABLE_GLUSTER_WHEN_CLUSTER_CONTAINS_VOLUMES);
result = false;
}
}
if (result && getCluster().supportsTrustedService() && Config.<String>getValue(ConfigValues.AttestationServer).equals("")) {
addValidationMessage(EngineMessage.CLUSTER_CANNOT_SET_TRUSTED_ATTESTATION_SERVER_NOT_CONFIGURED);
result = false;
}
if (result && !FeatureSupported.isMigrationSupported(getArchitecture(), getCluster().getCompatibilityVersion()) && getCluster().getMigrateOnError() != MigrateOnErrorOptions.NO) {
return failValidation(EngineMessage.MIGRATION_ON_ERROR_IS_NOT_SUPPORTED);
}
if (result) {
result = validateClusterPolicy(oldCluster);
}
if (result && getParameters().isForceResetEmulatedMachine()) {
for (VDS vds : allForCluster) {
if (vds.getStatus() == VDSStatus.Up) {
addValidationMessage(EngineMessage.CLUSTER_HOSTS_MUST_BE_DOWN);
result = false;
break;
}
}
}
ClusterValidator clusterValidator = new ClusterValidator(dbFacade, getCluster(), cpuFlagsManagerHandler);
result = result && validate(clusterValidator.rngSourcesAllowed()) && validate(clusterValidator.memoryOptimizationConfiguration()) && validate(moveMacs.canMigrateMacsToAnotherMacPool(oldCluster, getNewMacPoolId())) && validateDefaultNetworkProvider() && validate(clusterValidator.supportedFirewallTypeForClusterVersion());
return result;
}
use of org.ovirt.engine.core.common.businessentities.SupportedAdditionalClusterFeature in project ovirt-engine by oVirt.
the class BackendClusterEnabledFeaturesResource method add.
@Override
public Response add(ClusterFeature feature) {
validateParameters(feature);
org.ovirt.engine.core.common.businessentities.AdditionalFeature featureEntity = map(feature, null);
org.ovirt.engine.core.common.businessentities.Cluster cluster = BackendClusterFeatureHelper.getClusterEntity(this, clusterId);
SupportedAdditionalClusterFeature supportedFeature = new SupportedAdditionalClusterFeature();
supportedFeature.setFeature(featureEntity);
supportedFeature.setEnabled(true);
supportedFeature.setClusterId(clusterId);
cluster.getAddtionalFeaturesSupported().add(supportedFeature);
ManagementNetworkOnClusterOperationParameters param = new ManagementNetworkOnClusterOperationParameters(cluster);
return performCreate(ActionType.UpdateCluster, param, new ClusterFeatureIdResolver(clusterId, featureEntity.getId()));
}
use of org.ovirt.engine.core.common.businessentities.SupportedAdditionalClusterFeature in project ovirt-engine by oVirt.
the class BackendClusterFeatureHelper method getEnabledFeature.
public static SupportedAdditionalClusterFeature getEnabledFeature(BackendResource resource, Guid clusterId, Guid id) {
Set<SupportedAdditionalClusterFeature> addlFeatures = resource.getOptionalEntity(Set.class, QueryType.GetClusterFeaturesByClusterId, new IdQueryParameters(clusterId), clusterId.toString(), false);
SupportedAdditionalClusterFeature feature = Optional.ofNullable(addlFeatures).orElse(Collections.emptySet()).stream().filter(f -> f.getFeature().getId().equals(id) && f.isEnabled()).findFirst().orElse(null);
return feature;
}
use of org.ovirt.engine.core.common.businessentities.SupportedAdditionalClusterFeature in project ovirt-engine by oVirt.
the class BackendClusterFeatureHelper method getClusterWithFeatureDisabled.
public static Cluster getClusterWithFeatureDisabled(BackendResource resource, Guid clusterId, Guid id) {
Cluster cluster = getClusterEntity(resource, clusterId);
SupportedAdditionalClusterFeature feature = cluster.getAddtionalFeaturesSupported().stream().filter(f -> f.getFeature().getId().equals(id)).findFirst().orElse(null);
if (feature != null) {
feature.setEnabled(false);
}
return cluster;
}
Aggregations