package org.ovirt.engine.core.bll.gluster;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import org.ovirt.engine.core.bll.utils.GlusterGeoRepUtil;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepNonEligibilityReason;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.di.Injector;
public class GetGlusterGeoReplicationEligibleVolumesQuery<P extends IdQueryParameters> extends GlusterQueriesCommandBase<IdQueryParameters> {
public GlusterGeoRepUtil getGeoRepUtilInstance() {
return Injector.get(GlusterGeoRepUtil.class);
}
public GetGlusterGeoReplicationEligibleVolumesQuery(IdQueryParameters parameters) {
super(parameters);
}
@Override
protected void executeQueryCommand() {
Guid masterVolumeId = getParameters().getId();
GlusterVolumeEntity masterVolume = glusterVolumeDao.getById(masterVolumeId);
getQueryReturnValue().setReturnValue(getEligibleVolumes(masterVolume));
}
public List<GlusterVolumeEntity> getEligibleVolumes(GlusterVolumeEntity masterVolume) {
List<GlusterVolumeEntity> possiblyEligibleVolumes = getAllGlusterVolumesWithMasterCompatibleVersion(masterVolume.getId());
Map<GlusterGeoRepNonEligibilityReason, Predicate<GlusterVolumeEntity>> eligibilityPredicateMap = getGeoRepUtilInstance().getEligibilityPredicates(masterVolume);
Predicate<GlusterVolumeEntity> andPredicate = eligibilityPredicateMap.values().stream().reduce(Predicate::and).orElse(t->true);
return possiblyEligibleVolumes.stream().filter(andPredicate).collect(Collectors.toList());
}
protected List<GlusterVolumeEntity> getAllGlusterVolumesWithMasterCompatibleVersion(Guid masterVolumeId) {
GlusterVolumeEntity masterVolume = glusterVolumeDao.getById(masterVolumeId);
Cluster masterCluster = clusterDao.get(masterVolume.getClusterId());
List<Cluster> clusters = clusterDao.getClustersByServiceAndCompatibilityVersion(true, false, masterCluster.getCompatibilityVersion().getValue());
List<GlusterVolumeEntity> volumes = new ArrayList<>();
if(clusters != null) {
for(Cluster currentCluster : clusters) {
if(!currentCluster.getId().equals(masterCluster.getId())) {
volumes.addAll(glusterVolumeDao.getByClusterId(currentCluster.getId()));
}
}
}
return volumes;
}
}