use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId in project ovirt-engine by oVirt.
the class IrsProxy method proceedStoragePoolStats.
@SuppressWarnings("unchecked")
private void proceedStoragePoolStats(StoragePool storagePool) {
// ugly patch because vdsm doesnt check if host is spm on spm
// operations
VDSReturnValue result = null;
Guid curVdsId = currentVdsId;
if (curVdsId != null) {
result = resourceManager.runVdsCommand(VDSCommandType.SpmStatus, new SpmStatusVDSCommandParameters(curVdsId, storagePoolId));
}
if (result == null || !result.getSucceeded() || (result.getSucceeded() && ((SpmStatusResult) result.getReturnValue()).getSpmStatus() != SpmStatus.SPM)) {
// update pool status to problematic until fence will happen
if (storagePool.getStatus() != StoragePoolStatus.NonResponsive && storagePool.getStatus() != StoragePoolStatus.NotOperational) {
if (result != null && result.getVdsError() != null) {
updateStoragePoolStatus(storagePoolId, StoragePoolStatus.NonResponsive, AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_PROBLEMATIC_WITH_ERROR, result.getVdsError().getCode());
} else {
updateStoragePoolStatus(storagePoolId, StoragePoolStatus.NonResponsive, AuditLogType.SYSTEM_CHANGE_STORAGE_POOL_STATUS_PROBLEMATIC, EngineError.ENGINE);
}
}
// then cause failover with attempts
if (result != null && !(result.getExceptionObject() instanceof VDSNetworkException)) {
HashMap<Guid, AsyncTaskStatus> tasksList = (HashMap<Guid, AsyncTaskStatus>) resourceManager.runVdsCommand(VDSCommandType.HSMGetAllTasksStatuses, new VdsIdVDSCommandParametersBase(curVdsId)).getReturnValue();
boolean allTasksFinished = true;
if (tasksList != null) {
for (AsyncTaskStatus taskStatus : tasksList.values()) {
if (AsyncTaskStatusEnum.finished != taskStatus.getStatus()) {
allTasksFinished = false;
break;
}
}
}
if ((tasksList == null) || allTasksFinished) {
nullifyInternalProxies();
} else {
if (_errorAttempts < Config.<Integer>getValue(ConfigValues.SPMFailOverAttempts)) {
_errorAttempts++;
log.warn("failed getting spm status for pool '{}' ({}), attempt number: {}", storagePoolId, storagePool.getName(), _errorAttempts);
} else {
nullifyInternalProxies();
_errorAttempts = 0;
}
}
}
} else if (result.getSucceeded() && ((SpmStatusResult) result.getReturnValue()).getSpmStatus() == SpmStatus.SPM && (storagePool.getStatus() == StoragePoolStatus.NonResponsive || storagePool.getStatus() == StoragePoolStatus.Contend)) {
// if recovered from network exception set back to up
storagePoolDao.updateStatus(storagePool.getId(), StoragePoolStatus.Up);
storagePool.setStatus(StoragePoolStatus.Up);
getEventListener().storagePoolStatusChanged(storagePool.getId(), storagePool.getStatus());
}
List<StorageDomain> domainsInDb = storageDomainDao.getAllForStoragePool(storagePoolId);
GetStoragePoolInfoVDSCommandParameters tempVar = new GetStoragePoolInfoVDSCommandParameters(storagePoolId);
tempVar.setIgnoreFailoverLimit(true);
VDSReturnValue storagePoolInfoResult = resourceManager.runVdsCommand(VDSCommandType.GetStoragePoolInfo, tempVar);
if (storagePoolInfoResult.getSucceeded()) {
KeyValuePairCompat<StoragePool, List<StorageDomain>> data = (KeyValuePairCompat<StoragePool, List<StorageDomain>>) storagePoolInfoResult.getReturnValue();
int masterVersion = data.getKey().getMasterDomainVersion();
HashSet<Guid> domainsInVds = new HashSet<>();
List<StorageDomain> storageDomainsToSync = data.getValue().stream().peek(storageDomain -> domainsInVds.add(storageDomain.getId())).filter(storageDomain -> proceedStorageDomain(storageDomain, masterVersion, storagePool)).collect(Collectors.toList());
if (!storageDomainsToSync.isEmpty()) {
getEventListener().syncStorageDomainsLuns(getCurrentVdsId(), storageDomainsToSync.stream().map(StorageDomain::getId).collect(Collectors.toList()));
}
for (final StorageDomain domainInDb : domainsInDb) {
if (domainInDb.getStorageDomainType() != StorageDomainType.Master && domainInDb.getStatus() != StorageDomainStatus.Locked && !domainInDb.getStorageType().isCinderDomain() && !domainsInVds.contains(domainInDb.getId())) {
// domain not attached to pool anymore
storagePoolIsoMapDao.remove(new StoragePoolIsoMapId(domainInDb.getId(), storagePoolId));
}
}
}
domainsInMaintenanceCheck(domainsInDb, storagePool);
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId in project ovirt-engine by oVirt.
the class AddStoragePoolWithStoragesCommand method updateStorageDomainsInDb.
private boolean updateStorageDomainsInDb() {
boolean result = TransactionSupport.executeInNewTransaction(() -> {
for (Guid storageDomainId : getParameters().getStorages()) {
StorageDomain storageDomain = storageDomainDao.get(storageDomainId);
if (storageDomain != null) {
StoragePoolIsoMap mapFromDB = storagePoolIsoMapDao.get(new StoragePoolIsoMapId(storageDomain.getId(), getStoragePool().getId()));
boolean existingInDb = mapFromDB != null;
if (existingInDb) {
getCompensationContext().snapshotEntity(mapFromDB);
}
final StorageDomainStatic staticDomain = storageDomain.getStorageStaticData();
boolean staticDomainChanged = false;
StorageFormatType requiredFormatType = VersionStorageFormatUtil.getForVersion(getStoragePool().getCompatibilityVersion());
if (staticDomain.getStorageFormat().compareTo(requiredFormatType) < 0) {
if (!staticDomainChanged) {
getCompensationContext().snapshotEntity(staticDomain);
}
staticDomain.setStorageFormat(requiredFormatType);
staticDomainChanged = true;
}
storageDomain.setStoragePoolId(getStoragePool().getId());
if (masterStorageDomain == null && storageDomain.getStorageDomainType() == StorageDomainType.Data) {
if (!staticDomainChanged) {
getCompensationContext().snapshotEntity(staticDomain);
}
storageDomain.setStorageDomainType(StorageDomainType.Master);
staticDomainChanged = true;
masterStorageDomain = storageDomain;
// The update of storage pool should be without compensation,
// this is why we run it in a different SUPRESS transaction.
updateStoragePoolMasterDomainVersionInDiffTransaction();
}
if (staticDomainChanged) {
storageDomainStaticDao.update(staticDomain);
}
storageDomain.setStatus(StorageDomainStatus.Locked);
if (existingInDb) {
storagePoolIsoMapDao.update(storageDomain.getStoragePoolIsoMapData());
} else {
storagePoolIsoMapDao.save(storageDomain.getStoragePoolIsoMapData());
getCompensationContext().snapshotNewEntity(storageDomain.getStoragePoolIsoMapData());
}
} else {
return false;
}
}
getCompensationContext().stateChanged();
return true;
});
return result && masterStorageDomain != null;
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId in project ovirt-engine by oVirt.
the class AddStoragePoolWithStoragesCommand method activateStorageDomains.
private boolean activateStorageDomains() {
boolean returnValue = true;
for (final Guid storageDomainId : getParameters().getStorages()) {
StorageDomainPoolParametersBase activateParameters = new StorageDomainPoolParametersBase(storageDomainId, getStoragePool().getId());
activateParameters.setSessionId(getParameters().getSessionId());
activateParameters.setTransactionScopeOption(TransactionScopeOption.RequiresNew);
returnValue = Backend.getInstance().runInternalAction(ActionType.ActivateStorageDomain, activateParameters).getSucceeded();
// if activate domain failed then set domain status to inactive
if (!returnValue) {
TransactionSupport.executeInNewTransaction(() -> {
storagePoolIsoMapDao.updateStatus(new StoragePoolIsoMapId(storageDomainId, getStoragePool().getId()), StorageDomainStatus.Inactive);
return null;
});
}
}
return returnValue;
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId in project ovirt-engine by oVirt.
the class RunVmValidatorTest method testNoIsoDomainIsoOnDataDomain.
@Test
public void testNoIsoDomainIsoOnDataDomain() {
VM vm = new VM();
vm.setStoragePoolId(Guid.newGuid());
vm.setBootSequence(BootSequence.CD);
StorageDomain storageDomain = new StorageDomain();
storageDomain.setId(Guid.newGuid());
DiskImage diskImage = new DiskImage();
diskImage.setStorageIds(Collections.singletonList(storageDomain.getId()));
diskImage.setContentType(DiskContentType.ISO);
when(diskDao.get(any(Guid.class))).thenReturn(diskImage);
when(storagePoolIsoMapDao.get(new StoragePoolIsoMapId(storageDomain.getId(), vm.getStoragePoolId()))).thenReturn(null);
validateResult(runVmValidator.validateIsoPath(vm, Guid.newGuid().toString(), null, null), false, EngineMessage.VM_CANNOT_RUN_FROM_CD_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO);
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMapId in project ovirt-engine by oVirt.
the class RunVmValidator method validateIsoPath.
protected ValidationResult validateIsoPath(VM vm, String diskPath, String floppyPath, Guid activeIsoDomainId) {
if (vm.isAutoStartup()) {
return ValidationResult.VALID;
}
if (StringUtils.isEmpty(vm.getIsoPath()) && StringUtils.isEmpty(diskPath) && StringUtils.isEmpty(floppyPath)) {
return ValidationResult.VALID;
}
if (!StringUtils.isEmpty(floppyPath) && activeIsoDomainId == null) {
return new ValidationResult(EngineMessage.VM_CANNOT_RUN_FROM_CD_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO);
}
String effectiveIsoPath = StringUtils.isEmpty(diskPath) ? vm.getIsoPath() : diskPath;
if (!StringUtils.isEmpty(effectiveIsoPath)) {
if (effectiveIsoPath.matches(ValidationUtils.GUID)) {
BaseDisk disk = diskDao.get(Guid.createGuidFromString(effectiveIsoPath));
if (disk == null || disk.getContentType() != DiskContentType.ISO) {
return new ValidationResult(EngineMessage.ERROR_CANNOT_FIND_ISO_IMAGE_PATH);
}
Guid domainId = ((DiskImage) disk).getStorageIds().get(0);
StoragePoolIsoMap spim = storagePoolIsoMapDao.get(new StoragePoolIsoMapId(domainId, vm.getStoragePoolId()));
if (spim == null || spim.getStatus() != StorageDomainStatus.Active) {
return new ValidationResult(EngineMessage.VM_CANNOT_RUN_FROM_CD_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO);
}
} else if (activeIsoDomainId == null) {
return new ValidationResult(EngineMessage.VM_CANNOT_RUN_FROM_CD_WITHOUT_ACTIVE_STORAGE_DOMAIN_ISO);
} else if (!isRepoImageExists(effectiveIsoPath, activeIsoDomainId, ImageFileType.ISO)) {
return new ValidationResult(EngineMessage.ERROR_CANNOT_FIND_ISO_IMAGE_PATH);
}
return ValidationResult.VALID;
}
if (!StringUtils.isEmpty(floppyPath) && !isRepoImageExists(floppyPath, activeIsoDomainId, ImageFileType.Floppy)) {
return new ValidationResult(EngineMessage.ERROR_CANNOT_FIND_FLOPPY_IMAGE_PATH);
}
return ValidationResult.VALID;
}
Aggregations