package org.ovirt.engine.core.bll.host; import java.util.EnumSet; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import javax.enterprise.inject.Instance; import javax.inject.Inject; import javax.inject.Singleton; import org.ovirt.engine.core.common.HostUpgradeManagerResult; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSType; import org.ovirt.engine.core.compat.Guid; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton public class AvailableUpdatesFinder { private static Logger log = LoggerFactory.getLogger(AvailableUpdatesFinder.class); @Inject private Instance<UpdateAvailable> hostUpdaters; private ConcurrentMap<Guid, Boolean> upgradeCheckInProgressMap = new ConcurrentHashMap<>(); private AvailableUpdatesFinder() { } public HostUpgradeManagerResult checkForUpdates(VDS host) { if (upgradeCheckInProgressMap.getOrDefault(host.getId(), false)) { String error = String.format( "Failed to refresh host '%s' packages availability, another refresh process is already running.", host.getName()); throw new IllegalStateException(error); } try { upgradeCheckInProgressMap.put(host.getId(), true); return create(host.getVdsType()).checkForUpdates(host); } finally { upgradeCheckInProgressMap.remove(host.getId()); } } private UpdateAvailable create(VDSType hostType) { for (UpdateAvailable hostUpdater : hostUpdaters) { EnumSet<VDSType> hostTypes = hostUpdater.getHostTypes(); if (hostTypes.contains(hostType)) { return hostUpdater; } } log.error("Cannot instantiate host available strategy for unknown host type '{}'", hostType); throw new RuntimeException("Cannot instantiate host available strategy for unknown host type"); } }