use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap in project ovirt-engine by oVirt.
the class AttachStorageDomainToPoolCommand method executeCommand.
@Override
protected void executeCommand() {
if (isCinderStorageDomain()) {
handleCinderDomain();
return;
}
if (getStoragePool().getStatus() == StoragePoolStatus.Uninitialized) {
StoragePoolWithStoragesParameter parameters = new StoragePoolWithStoragesParameter(getStoragePool(), Collections.singletonList(getStorageDomain().getId()), getParameters().getSessionId());
parameters.setIsInternal(true);
parameters.setTransactionScopeOption(TransactionScopeOption.Suppress);
ActionReturnValue returnValue = runInternalAction(ActionType.AddStoragePoolWithStorages, parameters, getContext().clone().withoutCompensationContext());
setSucceeded(returnValue.getSucceeded());
if (!returnValue.getSucceeded()) {
getReturnValue().setFault(returnValue.getFault());
}
} else {
map = storagePoolIsoMapDao.get(new StoragePoolIsoMapId(getStorageDomain().getId(), getParameters().getStoragePoolId()));
if (map == null) {
executeInNewTransaction(() -> {
map = new StoragePoolIsoMap(getStorageDomain().getId(), getParameters().getStoragePoolId(), StorageDomainStatus.Locked);
storagePoolIsoMapDao.save(map);
getCompensationContext().snapshotNewEntity(map);
getCompensationContext().stateChanged();
return null;
});
List<Pair<Guid, Boolean>> hostsConnectionResults = connectHostsInUpToDomainStorageServer();
if (isAllHostConnectionFailed(hostsConnectionResults)) {
log.error("Cannot connect storage connection server, aborting attach storage domain operation.");
setSucceeded(false);
return;
}
// Forcibly detach only data storage domains.
if (getStorageDomain().getStorageDomainType() == StorageDomainType.Data) {
@SuppressWarnings("unchecked") Pair<StorageDomainStatic, Guid> domainFromIrs = (Pair<StorageDomainStatic, Guid>) runVdsCommand(VDSCommandType.HSMGetStorageDomainInfo, new HSMGetStorageDomainInfoVDSCommandParameters(getVdsId(), getParameters().getStorageDomainId())).getReturnValue();
// If the storage domain is already related to another Storage Pool, detach it by force.
Guid storagePoolId = domainFromIrs.getSecond();
if (storagePoolId != null) {
// Master domain version is not relevant since force remove at
// DetachStorageDomainVdsCommand does not use it.
// Storage pool id can be empty
DetachStorageDomainVDSCommandParameters detachParams = new DetachStorageDomainVDSCommandParameters(getStoragePoolIdFromVds(), getParameters().getStorageDomainId(), Guid.Empty, 0);
detachParams.setForce(true);
detachParams.setDetachFromOldStoragePool(true);
try {
runVdsCommand(VDSCommandType.DetachStorageDomain, detachParams);
} catch (EngineException e) {
log.warn("Detaching Storage Domain '{}' from it's previous storage pool '{}'" + " has failed. The meta data of the Storage Domain might still" + " indicate that it is attached to a different Storage Pool.", getParameters().getStorageDomainId(), Guid.Empty, 0);
throw e;
}
}
if (diskProfileDao.getAllForStorageDomain(getStorageDomain().getId()).isEmpty()) {
createDefaultDiskProfile();
}
}
runVdsCommand(VDSCommandType.AttachStorageDomain, new AttachStorageDomainVDSCommandParameters(getParameters().getStoragePoolId(), getParameters().getStorageDomainId()));
final List<OvfEntityData> unregisteredEntitiesFromOvfDisk = new ArrayList<>();
if (getStorageDomain().getStorageDomainType().isDataDomain()) {
List<OvfEntityData> returnValueFromStorageOvfDisk = getEntitiesFromStorageOvfDisk(getParameters().getStorageDomainId(), getStoragePoolIdFromVds());
unregisteredEntitiesFromOvfDisk.addAll(returnValueFromStorageOvfDisk);
}
List<DiskImage> ovfStoreDiskImages = getAllOVFDisks(getParameters().getStorageDomainId(), getStoragePoolIdFromVds());
executeInNewTransaction(() -> {
final StorageDomainType sdType = getStorageDomain().getStorageDomainType();
map.setStatus(StorageDomainStatus.Maintenance);
storagePoolIsoMapDao.updateStatus(map.getId(), map.getStatus());
if (sdType == StorageDomainType.Master) {
calcStoragePoolStatusByDomainsStatus();
}
if (getStorageDomain().getStorageDomainType().isDataDomain()) {
registerAllOvfDisks(ovfStoreDiskImages, getParameters().getStorageDomainId());
// Update unregistered entities
for (OvfEntityData ovf : unregisteredEntitiesFromOvfDisk) {
unregisteredOVFDataDao.removeEntity(ovf.getEntityId(), getParameters().getStorageDomainId());
unregisteredOVFDataDao.saveOVFData(ovf);
log.info("Adding OVF data of entity id '{}' and entity name '{}'", ovf.getEntityId(), ovf.getEntityName());
}
initUnregisteredDisksToDB(getParameters().getStorageDomainId());
}
// upgrade the domain format to the storage pool format
updateStorageDomainFormatIfNeeded(getStorageDomain());
return null;
});
if (getParameters().getActivate()) {
attemptToActivateDomain();
}
setSucceeded(true);
}
}
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap in project ovirt-engine by oVirt.
the class DeactivateStorageDomainCommand method executeCommand.
@Override
protected void executeCommand() {
if (isCinderStorageDomain()) {
deactivateCinderStorageDomain();
return;
}
final StoragePoolIsoMap map = storagePoolIsoMapDao.get(new StoragePoolIsoMapId(getParameters().getStorageDomainId(), getParameters().getStoragePoolId()));
map.setStatus(StorageDomainStatus.Unknown);
changeStorageDomainStatusInTransaction(map, getParameters().isInactive() ? StorageDomainStatus.Locked : StorageDomainStatus.PreparingForMaintenance);
final StorageDomain newMaster;
if (getStorageDomain().getStorageDomainType() == StorageDomainType.Master) {
newMaster = electNewMaster();
isLastMaster = proceedStorageDomainTreatmentByDomainType(newMaster, true);
} else {
newMaster = null;
isLastMaster = false;
}
final Guid newMasterId = newMaster != null ? newMaster.getId() : Guid.Empty;
if (isLastMaster) {
executeInNewTransaction(() -> {
getCompensationContext().snapshotEntityStatus(getStoragePool());
getStoragePool().setStatus(StoragePoolStatus.Maintenance);
storagePoolDao.updateStatus(getStoragePool().getId(), getStoragePool().getStatus());
getCompensationContext().stateChanged();
return null;
});
StoragePoolStatusHandler.poolStatusChanged(getStoragePool().getId(), getStoragePool().getStatus());
getStorageDomain().getStorageDynamicData().setAvailableDiskSize(null);
getStorageDomain().getStorageDynamicData().setUsedDiskSize(null);
}
if (!getParameters().isInactive()) {
runVdsCommand(VDSCommandType.DeactivateStorageDomain, new DeactivateStorageDomainVDSCommandParameters(getStoragePool().getId(), getStorageDomain().getId(), newMasterId, getStoragePool().getMasterDomainVersion()));
}
freeLock();
VDS spm = null;
if (getStoragePool().getSpmVdsId() != null) {
spm = vdsDao.get(getStoragePool().getSpmVdsId());
}
if (isLastMaster) {
if (spm != null) {
final VDSReturnValue stopSpmReturnValue = runVdsCommand(VDSCommandType.SpmStopOnIrs, new SpmStopOnIrsVDSCommandParameters(getStoragePool().getId()));
if (!stopSpmReturnValue.getSucceeded()) {
// no need to continue because DisconnectStoragePool will
// fail if host is SPM
log.error("Aborting execution due to failure to stop SPM");
setSucceeded(false);
return;
}
runVdsCommand(VDSCommandType.DisconnectStoragePool, new DisconnectStoragePoolVDSCommandParameters(spm.getId(), getStoragePool().getId(), spm.getVdsSpmId()));
}
runSynchronizeOperation(new DisconnectStoragePoolAsyncOperationFactory());
}
if (!getParameters().isInactive()) {
getEventQueue().submitEventSync(new Event(getParameters().getStoragePoolId(), getParameters().getStorageDomainId(), null, EventType.POOLREFRESH, ""), () -> {
runSynchronizeOperation(new AfterDeactivateSingleAsyncOperationFactory(), isLastMaster, newMasterId);
return null;
});
if (spm != null) {
getStorageHelper(getStorageDomain()).disconnectStorageFromDomainByVdsId(getStorageDomain(), spm.getId());
}
}
executeInNewTransaction(() -> {
if (getParameters().isInactive()) {
map.setStatus(StorageDomainStatus.Inactive);
} else if (isLastMaster) {
map.setStatus(StorageDomainStatus.Maintenance);
} else {
log.info("Domain '{}' will remain in '{}' status until deactivated on all hosts", getStorageDomain().getId(), map.getStatus());
}
storagePoolIsoMapDao.updateStatus(map.getId(), map.getStatus());
if (newMaster != null) {
StoragePoolIsoMap mapOfNewMaster = newMaster.getStoragePoolIsoMapData();
mapOfNewMaster.setStatus(StorageDomainStatus.Active);
storagePoolIsoMapDao.updateStatus(mapOfNewMaster.getId(), mapOfNewMaster.getStatus());
}
return null;
});
if (!getParameters().isSkipChecks()) {
notifyAsyncTasks();
}
setSucceeded(true);
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap in project ovirt-engine by oVirt.
the class DeactivateStorageDomainCommand method deactivateCinderStorageDomain.
private void deactivateCinderStorageDomain() {
List<Pair<Guid, Boolean>> hostsConnectionResults = disconnectHostsInUpToDomainStorageServer();
for (Pair<Guid, Boolean> pair : hostsConnectionResults) {
if (!pair.getSecond()) {
log.error("Failed to deactivate Cinder storage domain '{}' due to secrets un-registration failure.", getStorageDomain().getName());
StoragePoolIsoMap map = storagePoolIsoMapDao.get(new StoragePoolIsoMapId(getParameters().getStorageDomainId(), getParameters().getStoragePoolId()));
map.setStatus(StorageDomainStatus.Inactive);
storagePoolIsoMapDao.updateStatus(map.getId(), map.getStatus());
return;
}
}
cinderStorageHelper.deactivateCinderDomain(getParameters().getStorageDomainId(), getParameters().getStoragePoolId());
setSucceeded(true);
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap in project ovirt-engine by oVirt.
the class DeactivateStorageDomainWithOvfUpdateCommand method executeCommand.
@Override
protected void executeCommand() {
StoragePoolIsoMap map = loadStoragePoolIsoMap();
changeDomainStatusWithCompensation(map, StorageDomainStatus.Unknown, StorageDomainStatus.Locked, getCompensationContext());
if (shouldPerformOvfUpdate()) {
ActionReturnValue returnValue = runInternalAction(ActionType.UpdateOvfStoreForStorageDomain, createUpdateOvfStoreParams(), cloneContext().withoutCompensationContext());
if (!returnValue.getSucceeded()) {
propagateFailure(returnValue);
return;
}
}
if (noAsyncOperations()) {
executeDeactivateCommand();
}
setSucceeded(true);
}
use of org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap in project ovirt-engine by oVirt.
the class DetachStorageDomainFromPoolCommand method removeStoragePoolIsoMapWithCompensation.
private void removeStoragePoolIsoMapWithCompensation() {
StoragePoolIsoMap mapToRemove = getStorageDomain().getStoragePoolIsoMapData();
getCompensationContext().snapshotEntity(mapToRemove);
storagePoolIsoMapDao.remove(new StoragePoolIsoMapId(mapToRemove.getStorageId(), mapToRemove.getStoragePoolId()));
getCompensationContext().stateChanged();
}
Aggregations