package org.ovirt.engine.core.bll.gluster; import java.util.List; import java.util.stream.Collectors; import javax.inject.Inject; import org.ovirt.engine.core.bll.QueriesCommandBase; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.StorageDevice; import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.dao.gluster.GlusterBrickDao; import org.ovirt.engine.core.dao.gluster.StorageDeviceDao; public class GetUnusedGlusterBricksQuery<P extends IdQueryParameters> extends QueriesCommandBase<P> { @Inject private StorageDeviceDao storageDeviceDao; @Inject private GlusterBrickDao glusterBrickDao; public GetUnusedGlusterBricksQuery(P parameters) { super(parameters); } @Override protected void executeQueryCommand() { List<StorageDevice> storageDevicesInHost = storageDeviceDao.getStorageDevicesInHost(getParameters().getId()); getQueryReturnValue().setReturnValue(getUnUsedBricks(storageDevicesInHost)); } private List<StorageDevice> getUnUsedBricks(List<StorageDevice> storageDevicesInHost) { List<GlusterBrickEntity> usedBricks = glusterBrickDao.getGlusterVolumeBricksByServerId(getParameters().getId()); return storageDevicesInHost.stream().filter (storageDevice -> storageDevice.getMountPoint() != null && !storageDevice.getMountPoint().isEmpty() && (storageDevice.getMountPoint() .startsWith(Config.getValue(ConfigValues.GlusterDefaultBrickMountPoint)) || storageDevice.isGlusterBrick()) && !isBrickUsed(usedBricks, storageDevice.getMountPoint())) .collect(Collectors.toList()); } private boolean isBrickUsed(List<GlusterBrickEntity> usedBricks, String mountPoint) { // Checks if the given mount point is already part of any Gluster brick directory. // Brick directory may be any directory inside the mount points, so we are using brickDir.startsWith() return usedBricks.stream().anyMatch(brick -> brick.getBrickDirectory().startsWith(mountPoint)); } }