package org.ovirt.engine.core.bll.storage.pool;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.InternalCommandAttribute;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.storage.StorageHandlingCommandBase;
import org.ovirt.engine.core.bll.storage.connection.FCPStorageHelper;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.StoragePoolParametersBase;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.storage.LibvirtSecret;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.vdscommands.RegisterLibvirtSecretsVDSParameters;
import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
import org.ovirt.engine.core.common.vdscommands.VDSReturnValue;
import org.ovirt.engine.core.dao.StorageDomainDao;
import org.ovirt.engine.core.dao.StorageServerConnectionDao;
import org.ovirt.engine.core.utils.collections.MultiValueMapUtils;
@InternalCommandAttribute
public abstract class ConnectHostToStoragePoolServerCommandBase<T extends StoragePoolParametersBase> extends
StorageHandlingCommandBase<T> {
@Inject
private StorageServerConnectionDao storageServerConnectionDao;
@Inject
private StorageDomainDao storageDomainDao;
private List<StorageServerConnections> connections;
private Map<StorageType, List<StorageServerConnections>> connectionsTypeMap;
public ConnectHostToStoragePoolServerCommandBase(T parameters, CommandContext cmdContext) {
super(parameters, cmdContext);
}
protected Map<StorageType, List<StorageServerConnections>> getConnectionsTypeMap() {
return connectionsTypeMap;
}
protected void initConnectionList(boolean includeInactiveDomains) {
Set<StorageDomainStatus> statuses;
statuses = includeInactiveDomains ?
EnumSet.of(StorageDomainStatus.Active, StorageDomainStatus.Unknown, StorageDomainStatus.Inactive) :
EnumSet.of(StorageDomainStatus.Active, StorageDomainStatus.Unknown);
connections =
storageServerConnectionDao
.getStorageConnectionsByStorageTypeAndStatus(getStoragePool().getId(),
null,
statuses);
updateConnectionsTypeMap();
updateConnectionMapForFiberChannel(statuses);
}
private void updateConnectionsTypeMap() {
connectionsTypeMap = new HashMap<>();
for (StorageServerConnections conn : connections) {
StorageType connType = conn.getStorageType();
MultiValueMapUtils.addToMap(connType, conn, connectionsTypeMap);
}
}
private void updateConnectionMapForFiberChannel(Set<StorageDomainStatus> statuses) {
List<StorageDomain> storageDomainList =
storageDomainDao.getAllForStoragePool(getStoragePool().getId());
for (StorageDomain sd : storageDomainList) {
if (sd.getStorageType() == StorageType.FCP && statuses.contains(sd.getStatus())) {
MultiValueMapUtils.addToMap(StorageType.FCP,
FCPStorageHelper.getFCPConnection(),
getConnectionsTypeMap());
break;
}
}
}
protected boolean registerLibvirtSecrets(List<LibvirtSecret> libvirtSecrets, boolean clearUnusedSecrets) {
VDSReturnValue returnValue = runVdsCommand(
VDSCommandType.RegisterLibvirtSecrets,
new RegisterLibvirtSecretsVDSParameters(getVdsId(), libvirtSecrets, clearUnusedSecrets));
if (!returnValue.getSucceeded()) {
auditLogDirector.log(this,
AuditLogType.FAILED_TO_REGISTER_LIBVIRT_SECRET_ON_VDS);
log.error("Failed to register libvirt secret on vds {}.", getVds().getName());
return false;
}
return true;
}
protected boolean unregisterLibvirtSecrets() {
return registerLibvirtSecrets(Collections.emptyList(), true);
}
}