package org.ovirt.engine.core.bll.storage.domain; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import javax.inject.Inject; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.SortedMultipleActionsRunnerBase; import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.common.action.StorageDomainPoolParametersBase; import org.ovirt.engine.core.common.action.StoragePoolWithStoragesParameter; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.StoragePoolDao; import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil; public class AttachStorageDomainsMultipleActionRunner extends SortedMultipleActionsRunnerBase { public AttachStorageDomainsMultipleActionRunner(VdcActionType actionType, ArrayList<VdcActionParametersBase> parameters, CommandContext commandContext, boolean isInternal) { super(actionType, parameters, commandContext, isInternal); } @Inject private StoragePoolDao storagePoolDao; @Inject private BackendInternal backend; @Override public ArrayList<VdcReturnValueBase> execute() { Iterator<?> iterator = getParameters() == null ? null : getParameters().iterator(); Object parameter = iterator != null && iterator.hasNext() ? iterator.next() : null; if (parameter instanceof StorageDomainPoolParametersBase) { StorageDomainPoolParametersBase storagePoolParameter = (StorageDomainPoolParametersBase) parameter; StoragePool pool = storagePoolDao.get(storagePoolParameter.getStoragePoolId()); if (pool.getStatus() == StoragePoolStatus.Uninitialized) { ArrayList<Guid> storageDomainIds = new ArrayList<>(); for (VdcActionParametersBase param : getParameters()) { storageDomainIds.add(((StorageDomainPoolParametersBase) param).getStorageDomainId()); } ArrayList<VdcActionParametersBase> parameters = new ArrayList<>(); parameters.add(new StoragePoolWithStoragesParameter(pool, storageDomainIds, storagePoolParameter.getSessionId())); if (isInternal) { return backend.runInternalMultipleActions(VdcActionType.AddStoragePoolWithStorages, parameters); } else { return backend.runMultipleActions(VdcActionType.AddStoragePoolWithStorages, parameters, false); } } else { return super.execute(); } } else { return super.execute(); } } @Override protected void sortCommands() { Collections.sort(getCommands(), new StorageDomainsByTypeComparer()); } @Override protected void runCommands() { sortCommands(); for (final CommandBase<?> command : getCommands()) { if (command.getReturnValue().isValid()) { ThreadPoolUtil.execute(() -> executeValidatedCommand(command)); } } } }