package org.ovirt.engine.core.vdsbroker.storage; import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.inject.Inject; import javax.inject.Singleton; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.errors.EngineError; import org.ovirt.engine.core.common.errors.EngineException; import org.ovirt.engine.core.common.errors.VDSError; import org.ovirt.engine.core.common.vdscommands.ConnectStoragePoolVDSCommandParameters; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.common.vdscommands.VDSReturnValue; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.StoragePoolIsoMapDao; import org.ovirt.engine.core.vdsbroker.ResourceManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Singleton public class StoragePoolDomainHelper { @Inject private ResourceManager resourceManager; @Inject private StoragePoolIsoMapDao storagePoolIsoMapDao; private static final Logger log = LoggerFactory.getLogger(StoragePoolDomainHelper.class); public static final Set<VDSStatus> vdsDomainsActiveMonitoringStatus = Collections.unmodifiableSet(EnumSet.of(VDSStatus.Up)); public static final Set<VDSStatus> vdsDomainsMaintenanceMonitoringStatus = Collections.unmodifiableSet(EnumSet.of( VDSStatus.Up, VDSStatus.NonOperational)); private static final Set<StorageDomainStatus> domainAttachedStatuses = Collections.unmodifiableSet(EnumSet.of(StorageDomainStatus.Maintenance, StorageDomainStatus.Detaching, StorageDomainStatus.PreparingForMaintenance, StorageDomainStatus.Activating)); public static Map<String, String> buildStoragePoolDomainsMap(List<StoragePoolIsoMap> storagePoolIsoMaps) { return storagePoolIsoMaps.stream().collect(Collectors.toMap(x -> x.getStorageId().toString(), x -> domainAttachedStatuses.contains(x.getStatus()) ? "attached" : "active")); } /** * Refreshes the given vds pool metadata, if the host isn't connected to the pool it'll be connected. * * @return boolean indicating whether the host pool metadata was "refreshed" succesfully (either by refresh or * connect) */ public boolean refreshHostPoolMetadata(VDS vds, StoragePool storagePool, Guid masterDomainId, List<StoragePoolIsoMap> storagePoolIsoMaps) { try { resourceManager.runVdsCommand( VDSCommandType.ConnectStoragePool, new ConnectStoragePoolVDSCommandParameters(vds, storagePool, masterDomainId, storagePoolIsoMaps, true)); } catch (EngineException ex) { VDSError error = ex.getVdsError(); if (error.getCode() != EngineError.StoragePoolUnknown) { log.info("Failed to refresh host '{}' pool '{}' metadata with error '{}': {}", vds.getName(), storagePool.getId(), error.getCode(), error.getMessage()); log.debug("Exception", ex); return false; } error = null; try { VDSReturnValue vdsReturnValue = resourceManager.runVdsCommand( VDSCommandType.ConnectStoragePool, new ConnectStoragePoolVDSCommandParameters(vds, storagePool, masterDomainId, storagePoolIsoMaps, false)); if (!vdsReturnValue.getSucceeded()) { error = vdsReturnValue.getVdsError(); } } catch (EngineException e) { error = e.getVdsError(); } if (error != null) { log.info("Failed to connect host '{}' to pool '{}' with error '{}': {}", vds.getName(), storagePool.getId(), error.getCode(), error.getMessage()); return false; } } return true; } public void updateApplicablePoolDomainsStatuses(Guid storagePoolId, Set<StorageDomainStatus> applicableStatusesForUpdate, StorageDomainStatus newStatus, String reason) { List<StoragePoolIsoMap> storagesStatusInPool = storagePoolIsoMapDao.getAllForStoragePool(storagePoolId); for (StoragePoolIsoMap storageStatusInPool : storagesStatusInPool) { if (storageStatusInPool.getStatus() != null && storageStatusInPool.getStatus() != newStatus && applicableStatusesForUpdate.contains(storageStatusInPool.getStatus())) { log.info("Storage Pool '{}' - Updating Storage Domain '{}' status from '{}' to '{}', reason: {}", storagePoolId, storageStatusInPool.getStorageId(), storageStatusInPool.getStatus().name(), newStatus.name(), reason); storageStatusInPool.setStatus(newStatus); storagePoolIsoMapDao.updateStatus(storageStatusInPool.getId(), storageStatusInPool.getStatus()); } } } }