package org.ovirt.engine.core.bll.storage.dr; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.ovirt.engine.core.bll.CommandBase; import org.ovirt.engine.core.bll.tasks.CommandCoordinatorUtil; import org.ovirt.engine.core.bll.tasks.interfaces.CommandCallback; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.gluster.GlusterVolumeGeoRepSessionParameters; import org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSession; import org.ovirt.engine.core.common.businessentities.gluster.GlusterGeoRepSessionDetails; import org.ovirt.engine.core.compat.CommandStatus; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.dao.gluster.GlusterGeoRepDao; public class GlusterStorageGeoRepSyncCallback implements CommandCallback { @Inject private GlusterGeoRepDao geoRepDao; @Override public void doPolling(Guid cmdId, List<Guid> childCmdIds) { CommandBase<?> rootCommand = CommandCoordinatorUtil.retrieveCommand(cmdId); evaluateGeoRepSessionStatus(rootCommand); } private void evaluateGeoRepSessionStatus(CommandBase<?> rootCommand) { GlusterVolumeGeoRepSessionParameters parameters = (GlusterVolumeGeoRepSessionParameters) rootCommand.getParameters(); GlusterGeoRepSession session = geoRepDao.getById(parameters.getGeoRepSessionId()); if (session == null) { rootCommand.setCommandStatus(CommandStatus.FAILED); return; } session.setSessionDetails( (ArrayList<GlusterGeoRepSessionDetails>) geoRepDao.getGeoRepSessionDetails(session.getId())); switch (session.getStatus()) { case ACTIVE: // check if checkpoint is completed if (session.isCheckPointCompleted()) { // stop the geo-rep session stopGeoRepSessionCommand(rootCommand, session); rootCommand.setCommandStatus(CommandStatus.SUCCEEDED); } break; case FAULTY: rootCommand.setCommandStatus(CommandStatus.FAILED); default: break; } } private void stopGeoRepSessionCommand(CommandBase<?> command, GlusterGeoRepSession session) { CommandCoordinatorUtil.executeAsyncCommand(VdcActionType.StopGeoRepSession, new GlusterVolumeGeoRepSessionParameters(session.getMasterVolumeId(), session.getId()), command.cloneContextAndDetachFromParent()); } }