package org.ovirt.engine.core.bll.storage.connection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.action.ConnectHostToStoragePoolServersParameters;
import org.ovirt.engine.core.common.businessentities.NonOperationalReason;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.core.common.errors.EngineFault;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.RpmVersion;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.dao.VdsDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Storage helper for Posix FS connections
*/
public class GLUSTERFSStorageHelper extends BaseFsStorageHelper {
private static final Logger log = LoggerFactory.getLogger(GLUSTERFSStorageHelper.class);
@Override
protected StorageType getType() {
return StorageType.GLUSTERFS;
}
@Override
protected Pair<Boolean, EngineFault> runConnectionStorageToDomain(StorageDomain storageDomain, Guid vdsId, int type) {
VDS vds = getVdsDao().get(vdsId);
if (!canVDSConnectToGlusterfs(vds)) {
log.error("Couldn't find glusterfs-cli package on vds {} (needed for connecting storage domain {}).",
vds.getName(), storageDomain.getName());
StorageHelperBase.addMessageToAuditLog(AuditLogType.VDS_CANNOT_CONNECT_TO_GLUSTERFS, null, vds);
return new Pair<>(false, null);
}
return super.runConnectionStorageToDomain(storageDomain, vdsId, type);
}
@Override
public boolean prepareConnectHostToStoragePoolServers(CommandContext cmdContext,
ConnectHostToStoragePoolServersParameters parameters,
List<StorageServerConnections> connections) {
if (isActiveGlusterfsDomainAvailable(parameters.getStoragePoolId())) {
// Validate glusterfs-cli package availability
if (!canVDSConnectToGlusterfs(parameters.getVds())) {
log.error("Couldn't find glusterfs-cli package on vds {} (needed for connecting storage domains).",
parameters.getVds().getName());
setNonOperational(cmdContext,
parameters.getVds().getId(),
NonOperationalReason.VDS_CANNOT_CONNECT_TO_GLUSTERFS);
return false;
}
}
return true;
}
public static boolean canVDSConnectToGlusterfs(VDS vds) {
RpmVersion glusterfsCliVer = vds.getGlusterfsCliVersion();
return glusterfsCliVer != null && StringUtils.isNotEmpty(glusterfsCliVer.getRpmRelease());
}
private boolean isActiveGlusterfsDomainAvailable(Guid poolId) {
return isActiveStorageDomainAvailable(StorageType.GLUSTERFS, poolId);
}
private static VdsDao getVdsDao() {
return getDbFacade().getVdsDao();
}
private static DbFacade getDbFacade() {
return DbFacade.getInstance();
}
}