package org.ovirt.engine.core.bll.storage.pool;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.bll.InternalCommandAttribute;
import org.ovirt.engine.core.bll.NonTransactiveCommandAttribute;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.storage.connection.CINDERStorageHelper;
import org.ovirt.engine.core.bll.storage.connection.StorageHelperDirector;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.HostStoragePoolParametersBase;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.vdscommands.StorageServerConnectionManagementVDSParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
@InternalCommandAttribute
@NonTransactiveCommandAttribute
public class DisconnectHostFromStoragePoolServersCommand extends
ConnectHostToStoragePoolServerCommandBase<HostStoragePoolParametersBase> {
public DisconnectHostFromStoragePoolServersCommand(HostStoragePoolParametersBase parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
setStoragePool(parameters.getStoragePool());
setVds(parameters.getVds());
}
@Override
protected void executeCommand() {
initConnectionList(true);
for (Map.Entry<StorageType, List<StorageServerConnections>> connectionToType : getConnectionsTypeMap().entrySet()) {
disconnectStorageByType(connectionToType.getKey(), connectionToType.getValue());
Pair<Boolean, AuditLogType> result = StorageHelperDirector.getInstance().getItem(connectionToType.getKey()).disconnectHostFromStoragePoolServersCommandCompleted(getParameters());
if (!result.getFirst()) {
auditLogDirector.log(this, result.getSecond());
}
}
// Unregister libvirt secrets when required (for Cinder storage domains).
CINDERStorageHelper CINDERStorageHelper = new CINDERStorageHelper();
if (CINDERStorageHelper.isActiveCinderDomainAvailable(getStoragePool().getId())) {
unregisterLibvirtSecrets();
}
}
private void disconnectStorageByType(StorageType storageType, List<StorageServerConnections> connections) {
StorageHelperDirector.getInstance().getItem(storageType).prepareDisconnectHostFromStoragePoolServers(getParameters(), connections);
VDSReturnValue vdsReturnValue = runVdsCommand(
VDSCommandType.DisconnectStorageServer,
new StorageServerConnectionManagementVDSParameters(getVds().getId(), getStoragePool().getId(),
storageType, connections));
setSucceeded(vdsReturnValue.getSucceeded());
if (!vdsReturnValue.getSucceeded()) {
StorageHelperDirector.getInstance().getItem(storageType)
.isConnectSucceeded((HashMap<String, String>) vdsReturnValue.getReturnValue(), connections);
}
}
}