use of org.ovirt.engine.core.bll.validator.ClusterValidator 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.bll.validator.ClusterValidator in project ovirt-engine by oVirt.
the class AddClusterCommand method validate.
@Override
protected boolean validate() {
HasStoragePoolValidator hspValidator = new HasStoragePoolValidator(getCluster());
final ClusterValidator validator = new ClusterValidator(dbFacade, getCluster(), getCpuFlagsManagerHandler());
return validate(validator.nameNotUsed()) && validate(validator.cpuTypeSupportsVirtService()) && validate(validator.versionSupported()) && validate(validator.dataCenterVersionMismatch()) && validate(hspValidator.storagePoolExists()) && validate(validator.localStoragePoolAttachedToSingleCluster()) && validate(validator.clusterServiceDefined()) && validate(validator.mixedClusterServicesSupported()) && validate(validator.attestationServerConfigured()) && validate(validator.migrationSupported(getArchitecture())) && validate(validator.rngSourcesAllowed()) && validateClusterPolicy(null) && validateManagementNetwork() && validate(validator.memoryOptimizationConfiguration()) && validateDefaultNetworkProvider() && validate(validator.supportedFirewallTypeForClusterVersion());
}
Aggregations