package org.ovirt.engine.ui.uicommonweb.models.hosts; import org.ovirt.engine.core.common.action.StorageDomainManagementParameter; import org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.action.VdsActionParameters; import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.StorageServerConnections; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.ui.frontend.AsyncQuery; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicompat.Enlistment; import org.ovirt.engine.ui.uicompat.IEnlistmentNotification; import org.ovirt.engine.ui.uicompat.PreparingEnlistment; import com.google.gwt.user.client.Timer; @SuppressWarnings("unused") public class AddStorageDomainRM extends IEnlistmentNotification { public AddStorageDomainRM(String correlationId) { super(correlationId); } private static final int WaitInterval = 5000; private static final int MaxWaitTries = 6; private Timer timer; @Override public void prepare(PreparingEnlistment enlistment) { context.enlistment = enlistment; // Fetch all necessary data to make code flat. prepare1(); } public void prepare1() { EnlistmentContext enlistmentContext = (EnlistmentContext) context.enlistment.getContext(); HostListModel<?> model = enlistmentContext.getModel(); final VDS host = model.getSelectedItem(); VdsActionParameters parameters = new VdsActionParameters(host.getId()); parameters.setCorrelationId(getCorrelationId()); Frontend.getInstance().runAction(VdcActionType.ActivateVds, parameters, result -> { VdcReturnValueBase returnValue = result.getReturnValue(); context.activateVdsReturnValue = returnValue; prepare2(); }); } private void prepare2() { PreparingEnlistment enlistment = (PreparingEnlistment) context.enlistment; VdcReturnValueBase returnValue = context.activateVdsReturnValue; if (returnValue == null || !returnValue.getSucceeded()) { context.enlistment = null; enlistment.forceRollback(); } else { prepare3(); } } private void prepare3() { PreparingEnlistment enlistment = (PreparingEnlistment) context.enlistment; EnlistmentContext enlistmentContext = (EnlistmentContext) enlistment.getContext(); HostListModel<?> model = enlistmentContext.getModel(); VDS host = model.getSelectedItem(); if (context.waitTries < MaxWaitTries) { context.waitTries++; AsyncDataProvider.getInstance().getHostById(new AsyncQuery<>( returnValue -> { context.host = returnValue; timer = new Timer() { @Override public void run() { prepare4(); } }; timer.scheduleRepeating(WaitInterval); }), host.getId()); } else { context.enlistment = null; enlistment.forceRollback(); } } private void prepare4() { if (timer != null) { timer.cancel(); timer = null; } PreparingEnlistment enlistment = (PreparingEnlistment) context.enlistment; EnlistmentContext enlistmentContext = (EnlistmentContext) enlistment.getContext(); HostListModel<?> model = enlistmentContext.getModel(); ConfigureLocalStorageModel configureModel = (ConfigureLocalStorageModel) model.getWindow(); if (context.host.getStatus() != VDSStatus.Up) { prepare3(); } else { // Add storage domain. StorageServerConnections connection = new StorageServerConnections(); connection.setConnection(configureModel.getStorage().getPath().getEntity()); connection.setStorageType(StorageType.LOCALFS); context.connection = connection; StorageServerConnectionParametersBase parameters = new StorageServerConnectionParametersBase(connection, context.host.getId(), false); parameters.setCorrelationId(getCorrelationId()); Frontend.getInstance().runAction(VdcActionType.AddStorageServerConnection, parameters, result -> { VdcReturnValueBase returnValue = result.getReturnValue(); context.addStorageServerConnectionReturnValue = returnValue; prepare5(); }); } } private void prepare5() { PreparingEnlistment enlistment = (PreparingEnlistment) context.enlistment; EnlistmentContext enlistmentContext = (EnlistmentContext) enlistment.getContext(); HostListModel<?> model = enlistmentContext.getModel(); ConfigureLocalStorageModel configureModel = (ConfigureLocalStorageModel) model.getWindow(); VdcReturnValueBase returnValue = context.addStorageServerConnectionReturnValue; if (returnValue == null || !returnValue.getSucceeded()) { // Don't rollback. context.enlistment = null; enlistment.done(); } else { StorageDomainStatic storage = new StorageDomainStatic(); storage.setStorageType(StorageType.LOCALFS); storage.setStorageDomainType(StorageDomainType.Data); storage.setStorageName(configureModel.getFormattedStorageName().getEntity()); storage.setStorage((String) returnValue.getActionReturnValue()); StorageDomainManagementParameter parameters = new StorageDomainManagementParameter(storage); parameters.setVdsId(context.host.getId()); parameters.setCorrelationId(getCorrelationId()); Frontend.getInstance().runAction(VdcActionType.AddLocalStorageDomain, parameters, result -> { VdcReturnValueBase returnValue1 = result.getReturnValue(); context.addLocalStorageDomainReturnValue = returnValue1; prepare6(); }); } } private void prepare6() { VdcReturnValueBase returnValue = context.addLocalStorageDomainReturnValue; if (returnValue == null || !returnValue.getSucceeded()) { StorageServerConnectionParametersBase parameter = new StorageServerConnectionParametersBase(context.connection, context.host.getId(), false); parameter.setCorrelationId(getCorrelationId()); Frontend.getInstance().runAction(VdcActionType.DisconnectStorageServerConnection, parameter, result -> { VdcReturnValueBase returnValue1 = result.getReturnValue(); context.removeStorageServerConnectionReturnValue = returnValue1; prepare7(); }); } else { prepare7(); } } private void prepare7() { PreparingEnlistment enlistment = (PreparingEnlistment) context.enlistment; VdcReturnValueBase returnValue = context.removeStorageServerConnectionReturnValue; context.enlistment = null; // ReturnValue not equals null means remove connection occurred. if (returnValue != null) { // Don't rollback. enlistment.done(); } else { enlistment.prepared(); } } @Override public void commit(Enlistment enlistment) { enlistment.done(); } @Override public void rollback(Enlistment enlistment) { enlistment.done(); } private final Context context = new Context(); public static final class Context { public Enlistment enlistment; public VDS host; StorageServerConnections connection; public VdcReturnValueBase activateVdsReturnValue; public VdcReturnValueBase addStorageServerConnectionReturnValue; public VdcReturnValueBase addLocalStorageDomainReturnValue; public VdcReturnValueBase removeStorageServerConnectionReturnValue; public int waitTries; } }