package org.ovirt.engine.ui.uicommonweb.models.gluster;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusForHost;
import org.ovirt.engine.core.common.job.JobExecutionStatus;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import com.google.gwt.user.client.Timer;
public class VolumeRebalanceStatusModel extends Model {
private EntityModel<String> volume;
private EntityModel<String> cluster;
private EntityModel<Date> startTime;
private EntityModel<Date> statusTime;
public EntityModel<Date> getStopTime() {
return stopTime;
}
public void setStopTime(EntityModel<Date> stopTime) {
this.stopTime = stopTime;
}
private EntityModel<Date> stopTime;
private GlusterVolumeEntity entity;
private ListModel<EntityModel<GlusterVolumeTaskStatusForHost>> rebalanceSessions;
private boolean isStatusAvailable;
private Timer refresh;
private UICommand stopReblanceFromStatus;
public VolumeRebalanceStatusModel(final GlusterVolumeEntity volumeEntity) {
setVolume(new EntityModel<String>());
setCluster(new EntityModel<String>());
setStartTime(new EntityModel<Date>());
setStatusTime(new EntityModel<Date>());
setStopTime(new EntityModel<Date>());
setRebalanceSessions(new ListModel<EntityModel<GlusterVolumeTaskStatusForHost>>());
setEntity(volumeEntity);
refresh = new Timer() {
@Override
public void run() {
refreshDetails(volumeEntity);
}
};
refresh.scheduleRepeating(10000);
}
public ListModel<EntityModel<GlusterVolumeTaskStatusForHost>> getRebalanceSessions() {
return rebalanceSessions;
}
public void setRebalanceSessions(ListModel<EntityModel<GlusterVolumeTaskStatusForHost>> rebalanceSessions) {
this.rebalanceSessions = rebalanceSessions;
}
public EntityModel<String> getVolume() {
return volume;
}
public void setVolume(EntityModel<String> volume) {
this.volume = volume;
}
public EntityModel<Date> getStartTime() {
return startTime;
}
public void setStartTime(EntityModel<Date> startedTime) {
this.startTime = startedTime;
}
public EntityModel<String> getCluster() {
return cluster;
}
public void setCluster(EntityModel<String> cluster) {
this.cluster = cluster;
}
public EntityModel<Date> getStatusTime() {
return statusTime;
}
public void setStatusTime(EntityModel<Date> statusTime) {
this.statusTime = statusTime;
}
public void showStatus(GlusterVolumeTaskStatusEntity rebalanceStatusEntity) {
List<GlusterVolumeTaskStatusForHost> rebalanceSessionsList =
rebalanceStatusEntity.getHostwiseStatusDetails();
List<EntityModel<GlusterVolumeTaskStatusForHost>> sessionList = new ArrayList<>();
for (GlusterVolumeTaskStatusForHost hostDetail : rebalanceSessionsList) {
EntityModel<GlusterVolumeTaskStatusForHost> sessionModel = new EntityModel<>(hostDetail);
sessionList.add(sessionModel);
}
getStartTime().setEntity(rebalanceStatusEntity.getStartTime());
getStatusTime().setEntity(rebalanceStatusEntity.getStatusTime());
getRebalanceSessions().setItems(sessionList);
setStatusAvailable(rebalanceStatusEntity.getStatusSummary().getStatus() == JobExecutionStatus.FINISHED);
if(rebalanceStatusEntity.getStatusSummary().getStatus() == JobExecutionStatus.FINISHED) {
refresh.cancel();
}else {
if (rebalanceStatusEntity.getStatusSummary().getStatus() == JobExecutionStatus.ABORTED || rebalanceStatusEntity.getStatusSummary().getStatus() == JobExecutionStatus.FAILED) {
refresh.cancel();
if(rebalanceStatusEntity.getStatusSummary().getStatus() == JobExecutionStatus.ABORTED) {
getStopTime().setEntity(rebalanceStatusEntity.getStopTime());
}
}
}
setStopTimeVisible(rebalanceStatusEntity.getStatusSummary().getStatus() == JobExecutionStatus.ABORTED);
if (GlusterTaskType.REBALANCE == getEntity().getAsyncTask().getType()) {
getStopReblanceFromStatus().setIsExecutionAllowed(rebalanceStatusEntity.getStatusSummary().getStatus() == JobExecutionStatus.STARTED);
}
}
public void cancelRefresh() {
if (refresh != null) {
refresh.cancel();
}
}
public void refreshDetails(GlusterVolumeEntity volumeEntity) {
AsyncDataProvider.getInstance().getGlusterRebalanceStatus(new AsyncQuery<>(returnValue -> {
GlusterVolumeTaskStatusEntity rebalanceStatusEntity = returnValue.getReturnValue();
if (rebalanceStatusEntity != null) {
showStatus(rebalanceStatusEntity);
}
}), volumeEntity.getClusterId(), volumeEntity.getId());
}
public GlusterVolumeEntity getEntity() {
return entity;
}
public void setEntity(GlusterVolumeEntity entity) {
this.entity = entity;
}
public boolean isStatusAvailable() {
return isStatusAvailable;
}
public void setStatusAvailable(boolean isStatusAvailable) {
this.isStatusAvailable = isStatusAvailable;
onPropertyChanged(new PropertyChangedEventArgs("STATUS_UPDATED"));//$NON-NLS-1$
}
private boolean stopTimeVisible;
public UICommand getStopReblanceFromStatus() {
return stopReblanceFromStatus;
}
public void setStopReblanceFromStatus(UICommand stopReblanceFromStatus) {
this.stopReblanceFromStatus = stopReblanceFromStatus;
}
public boolean isStopTimeVisible() {
return stopTimeVisible;
}
public void setStopTimeVisible(boolean stopTimeVisible) {
this.stopTimeVisible = stopTimeVisible;
onPropertyChanged(new PropertyChangedEventArgs("STOP_TIME_UPDATED"));//$NON-NLS-1$
}
}