package org.ovirt.engine.core.bll.provider; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.utils.PermissionSubject; import org.ovirt.engine.core.bll.validator.NetworkValidator; import org.ovirt.engine.core.common.AuditLogType; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.ProviderParameters; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.Provider; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.errors.EngineMessage; import org.ovirt.engine.core.common.validation.group.RemoveEntity; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.VmDao; import org.ovirt.engine.core.dao.network.NetworkDao; import org.ovirt.engine.core.dao.provider.ProviderDao; import org.ovirt.engine.core.utils.ReplacementUtils; public class RemoveProviderCommand<P extends ProviderParameters> extends CommandBase<P> { private Provider<?> deletedProvider; private ProviderProxy providerProxy; @Inject private ProviderDao providerDao; @Inject private NetworkDao networkDao; @Inject private VmDao vmDao; public RemoveProviderCommand(Guid commandId) { super(commandId); } public RemoveProviderCommand(P parameters, CommandContext cmdContext) { super(parameters, cmdContext); } private Provider<?> getDeletedProvider() { if (deletedProvider == null) { deletedProvider = providerDao.get(getParameters().getProvider().getId()); } return deletedProvider; } public String getProviderName() { Provider<?> provider = getDeletedProvider(); return provider == null ? null : provider.getName(); } protected boolean validateRemoveProvider() { if (getProviderProxy() != null) { ProviderValidator providerValidator = getProviderProxy().getProviderValidator(); return validate(providerValidator.validateRemoveProvider()); } return true; } public ProviderProxy getProviderProxy() { if (providerProxy == null) { providerProxy = ProviderProxyFactory.getInstance().create(getParameters().getProvider()); } return providerProxy; } @Override protected boolean validate() { RemoveProviderValidator validator = new RemoveProviderValidator(vmDao, networkDao, getDeletedProvider()); return validate(validator.providerIsSet()) && validate(validator.providerNetworksNotUsed()) && validateRemoveProvider(); } @Override protected void executeCommand() { final Guid providerId = getParameters().getProvider().getId(); if (getProviderProxy() != null) { getProviderProxy().onRemoval(); } providerDao.remove(providerId); setSucceeded(true); } @Override public List<PermissionSubject> getPermissionCheckSubjects() { return Collections.singletonList(new PermissionSubject(Guid.SYSTEM, VdcObjectType.System, ActionGroup.CREATE_STORAGE_POOL)); } @Override protected void setActionMessageParameters() { addValidationMessage(EngineMessage.VAR__ACTION__REMOVE); addValidationMessage(EngineMessage.VAR__TYPE__PROVIDER); } @Override protected List<Class<?>> getValidationGroups() { addValidationGroup(RemoveEntity.class); return super.getValidationGroups(); } @Override public AuditLogType getAuditLogTypeValue() { return getSucceeded() ? AuditLogType.PROVIDER_REMOVED : AuditLogType.PROVIDER_REMOVAL_FAILED; } protected static class RemoveProviderValidator extends ProviderValidator { private final VmDao vmDao; private final NetworkDao networkDao; public RemoveProviderValidator(VmDao vmDao, NetworkDao networkDao, Provider<?> provider) { super(provider); this.vmDao = vmDao; this.networkDao = networkDao; } public ValidationResult providerNetworksNotUsed() { List<Network> networksInUse = new ArrayList<>(); List<Network> networks = networkDao.getAllForProvider(provider.getId()); for (Network network : networks) { NetworkValidator networkValidator = getValidator(network); if (!networkValidator.networkNotUsedByVms().isValid() || !networkValidator.networkNotUsedByTemplates().isValid()) { networksInUse.add(network); } } return networksInUse.isEmpty() ? ValidationResult.VALID : new ValidationResult(getProviderNetworkUsedValidationMessage(networksInUse.size()), ReplacementUtils.replaceWithNameable("NETWORK_NAMES", networksInUse)); } protected EngineMessage getProviderNetworkUsedValidationMessage(int numberOfNetworks) { boolean singular = numberOfNetworks == 1; if (singular) { return EngineMessage.ACTION_TYPE_FAILED_PROVIDER_NETWORKS_USED_ONCE; } else { return EngineMessage.ACTION_TYPE_FAILED_PROVIDER_NETWORKS_USED_MULTIPLE_TIMES; } } protected NetworkValidator getValidator(Network network) { return new NetworkValidator(vmDao, network); } } }