package org.ovirt.engine.core.bll.validator; import javax.inject.Inject; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.VdsHandler; import org.ovirt.engine.core.common.action.VdsOperationActionParameters.AuthenticationMethod; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.ProviderType; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VDSType; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.dao.provider.ProviderDao; import org.ovirt.engine.core.di.Injector; public class UpdateHostValidator extends HostValidator { private final VDS oldHost; private final boolean installHost; @Inject private ProviderDao providerDao; @Inject private VdsHandler vdsHandler; private Provider<?> provider; public static UpdateHostValidator createInstance(VDS oldHost, VDS updatedHost, boolean installHost) { return Injector.injectMembers(new UpdateHostValidator(oldHost, updatedHost, installHost)); } public UpdateHostValidator(VDS oldHost, VDS updatedHost, boolean installHost) { super(updatedHost); this.oldHost = oldHost; this.installHost = installHost; } @Override public ValidationResult hostExists() { return ValidationResult.failWith(EngineMessage.VDS_INVALID_SERVER_ID) .when(oldHost == null || getHost() == null); } public ValidationResult hostStatusValid() { return ValidationResult.failWith(EngineMessage.VDS_STATUS_NOT_VALID_FOR_UPDATE).when(!isUpdateValid()); } protected boolean isUpdateValid() { return vdsHandler.isUpdateValid(getHost().getStaticData(), oldHost.getStaticData(), oldHost.getStatus()); } public ValidationResult updateHostAddressAllowed() { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_HOSTNAME_CANNOT_CHANGE) .when(oldHost.getStatus() != VDSStatus.InstallFailed && !oldHost.getHostName().equals(getHost().getHostName())); } @Override public ValidationResult nameNotUsed() { if (StringUtils.equalsIgnoreCase(oldHost.getName(), getHost().getName())) { return ValidationResult.VALID; } return super.nameNotUsed(); } @Override public ValidationResult hostNameNotUsed() { if (StringUtils.equalsIgnoreCase(oldHost.getHostName(), getHost().getHostName())) { return ValidationResult.VALID; } return super.hostNameNotUsed(); } public ValidationResult statusSupportedForHostInstallation() { return ValidationResult.failWith(EngineMessage.VDS_CANNOT_INSTALL_STATUS_ILLEGAL) .when(installHost && oldHost.getStatus() != VDSStatus.Maintenance && oldHost.getStatus() != VDSStatus.NonOperational && oldHost.getStatus() != VDSStatus.InstallFailed && oldHost.getStatus() != VDSStatus.InstallingOS); } public ValidationResult passwordProvidedForHostInstallation(AuthenticationMethod method, String password) { return ValidationResult.failWith(EngineMessage.VDS_CANNOT_INSTALL_EMPTY_PASSWORD) .when(installHost && method == AuthenticationMethod.Password && StringUtils.isEmpty(password) && getHost().getVdsType() == VDSType.VDS); } public ValidationResult updatePortAllowed() { return ValidationResult.failWith(EngineMessage.VDS_PORT_CHANGE_REQUIRE_INSTALL) .unless(installHost || oldHost.getPort() == getHost().getPort()); } /** * Forbids updating group id - this must be done through {@code ChangeVDSClusterCommand}. This is due to permission * check that must be done both on the VDS and on the Cluster */ public ValidationResult clusterNotChanged() { return ValidationResult.failWith(EngineMessage.VDS_CANNOT_UPDATE_CLUSTER) .unless(oldHost.getClusterId().equals(getHost().getClusterId())); } public ValidationResult hostProviderExists() { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_PROVIDER_DOESNT_EXIST) .when(getHost().getHostProviderId() != null && getProvider() == null); } public ValidationResult hostProviderTypeMatches() { return ValidationResult.failWith(EngineMessage.ACTION_TYPE_FAILED_HOST_PROVIDER_TYPE_MISMATCH) .when(getProvider() != null && getProvider().getType() != ProviderType.FOREMAN); } private Provider<?> getProvider() { if (getHost().getHostProviderId() != null && provider == null) { provider = providerDao.get(getHost().getHostProviderId()); } return provider; } }