package org.ovirt.engine.core.bll;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.storage.domain.AttachStorageDomainsMultipleActionRunner;
import org.ovirt.engine.core.bll.storage.domain.DeactivateStorageDomainsMultipleActionRunner;
import org.ovirt.engine.core.common.action.RemoveVdsParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.ClusterDao;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.di.Injector;
@Singleton
public class MultipleActionsRunnersFactory {
@Inject
private VdsDao vdsDao;
@Inject
private ClusterDao clusterDao;
public MultipleActionsRunner createMultipleActionsRunner(VdcActionType actionType,
ArrayList<VdcActionParametersBase> parameters,
boolean isInternal, CommandContext commandContext) {
MultipleActionsRunner runner;
switch (actionType) {
case DeactivateStorageDomainWithOvfUpdate:
runner = new DeactivateStorageDomainsMultipleActionRunner(actionType, parameters, commandContext, isInternal);
break;
case AttachStorageDomainToPool:
runner = new AttachStorageDomainsMultipleActionRunner(actionType, parameters, commandContext, isInternal);
break;
case RunVm:
runner = new RunVMActionRunner(actionType, parameters, commandContext, isInternal);
break;
case MigrateVm:
runner = new MigrateVMActionRunner(actionType, parameters, commandContext, isInternal);
break;
case RemoveVmFromPool:
runner = new RemoveVmFromPoolRunner(actionType, parameters, commandContext, isInternal);
break;
case StartGlusterVolume:
case StopGlusterVolume:
case DeleteGlusterVolume:
case SetGlusterVolumeOption:
case ResetGlusterVolumeOptions:
case AddVds: // AddVds is called with multiple actions *only* in case of gluster clusters
case RemoveGlusterServer:
case EnableGlusterHook:
case DisableGlusterHook:
case DeleteGlusterVolumeSnapshot:
runner = new GlusterMultipleActionsRunner(actionType, parameters, commandContext, isInternal);
break;
case RemoveVds:
if (containsGlusterServer(parameters)) {
runner = new GlusterMultipleActionsRunner(actionType, parameters, commandContext, isInternal);
} else {
runner = new PrevalidatingMultipleActionsRunner(actionType, parameters, commandContext, isInternal);
}
break;
case PersistentHostSetupNetworks:
runner = new ParallelMultipleActionsRunner(actionType, parameters, commandContext, isInternal);
break;
case AttachNetworkToCluster:
case DetachNetworkToCluster:
case UpdateNetworkOnCluster:
throw new UnsupportedOperationException("Multiple network attachments/detachments/updates should be run through ManageNetworkClustersCommand!");
case AddNetworkAttachment:
case UpdateNetworkAttachment:
case RemoveNetworkAttachment:
throw new UnsupportedOperationException("AddNetworkAttachment, UpdateNetworkAttachment, and RemoveNetworkAttachment cannot be run using MultipleActionsRunner");
case RemoveDiskProfile:
case RemoveCpuProfile:
runner = new SequentialMultipleActionsRunner(actionType, parameters, commandContext, isInternal);
break;
default:
runner = new PrevalidatingMultipleActionsRunner(actionType, parameters, commandContext, isInternal);
break;
}
return Injector.injectMembers(runner);
}
private boolean containsGlusterServer(ArrayList<VdcActionParametersBase> parameters) {
Set<Guid> processed = new HashSet<>();
for (VdcActionParametersBase param : parameters) {
VDS vds = vdsDao.get(((RemoveVdsParameters) param).getVdsId());
if (vds != null && !processed.contains(vds.getClusterId())) {
Cluster cluster = clusterDao.get(vds.getClusterId());
if (cluster.supportsGlusterService()) {
return true;
}
processed.add(vds.getClusterId());
}
}
return false;
}
}