Sahina Bose has uploaded a new change for review. Change subject: engine: [WIP] Populate jobId on gluster async task ......................................................................
engine: [WIP] Populate jobId on gluster async task When a volume asynchronous task like rebalance or remove-brick is started, the user needs to be provided feedback that the command is started. Currently we wait for the gluster task's return to update the volume with task status. This feedback takes time. Added a check on jobId to inform the user quicker. Change-Id: I3e1eebe89dd455a5afa85b6747f11ddc5cafb146 Bug-Url: https://bugzilla.redhat.com/1025304 Signed-off-by: Sahina Bose <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/gluster/GlusterAsyncTask.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterTaskSupport.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java M frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityColumn.java M frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityStatusCell.java A frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeTaskCompositeCell.java M packaging/dbscripts/create_views.sql M packaging/dbscripts/gluster_volumes_sp.sql 12 files changed, 162 insertions(+), 16 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/20/21120/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java index 75d25a6..e98eed0 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterAsyncCommandBase.java @@ -75,6 +75,7 @@ getStepType(), ExecutionMessageDirector.resolveStepMessage(getStepType(), getStepMessageMap(JobExecutionStatus.STARTED))); + getGlusterVolumeDao().updateVolumeTask(getGlusterVolumeId(), asyncTaskStep.getJobId()); } protected void endStepJobAborted() { diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/gluster/GlusterAsyncTask.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/gluster/GlusterAsyncTask.java index 10190ff..7cf846e 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/gluster/GlusterAsyncTask.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/asynctasks/gluster/GlusterAsyncTask.java @@ -16,6 +16,8 @@ private String message; private Guid stepId; private GlusterTaskParameters taskParameters; + private Guid jobId; + private JobExecutionStatus jobStatus; public GlusterAsyncTask(){ @@ -62,6 +64,22 @@ this.taskParameters = taskParameters; } + public Guid getJobId() { + return jobId; + } + + public void setJobId(Guid jobId) { + this.jobId = jobId; + } + + public JobExecutionStatus getJobStatus() { + return jobStatus; + } + + public void setJobStatus(JobExecutionStatus jobStatus) { + this.jobStatus = jobStatus; + } + @Override public int hashCode() { final int prime = 31; @@ -71,6 +89,8 @@ result = prime * result + ((taskId == null) ? 0 : taskId.hashCode()); result = prime * result + ((type == null) ? 0 : type.hashCode()); result = prime * result + ((stepId == null) ? 0 : stepId.hashCode()); + result = prime * result + ((jobId == null) ? 0 : jobId.hashCode()); + result = prime * result + ((jobStatus == null) ? 0 : jobStatus.hashCode()); return result; } @@ -90,7 +110,9 @@ && ObjectUtils.objectsEqual(taskId, other.taskId) && type == other.type && status == other.status - && ObjectUtils.objectsEqual(stepId, other.stepId)); + && ObjectUtils.objectsEqual(stepId, other.stepId) + && ObjectUtils.objectsEqual(jobId, other.jobId) + && jobStatus == other.jobStatus); } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterTaskSupport.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterTaskSupport.java index 59f512f..3b7391e 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterTaskSupport.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterTaskSupport.java @@ -18,4 +18,5 @@ * @param task Currently active in the Gluster entity */ public void setAsyncTask(GlusterAsyncTask task); + } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java index 9ef32b9..fb72457 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/GlusterVolumeEntity.java @@ -17,6 +17,7 @@ import org.ovirt.engine.core.common.businessentities.BusinessEntityWithStatus; import org.ovirt.engine.core.common.businessentities.IVdcQueryable; import org.ovirt.engine.core.common.constants.gluster.GlusterConstants; +import org.ovirt.engine.core.common.job.Job; import org.ovirt.engine.core.common.utils.ListUtils; import org.ovirt.engine.core.common.utils.ObjectUtils; import org.ovirt.engine.core.common.validation.group.CreateEntity; @@ -76,6 +77,8 @@ private Set<TransportType> transportTypes; private GlusterAsyncTask asyncTask; + + private Job runningJob; public GlusterVolumeEntity() { options = new LinkedHashMap<String, GlusterVolumeOptionEntity>(); @@ -448,4 +451,5 @@ public void setAsyncTask(GlusterAsyncTask asyncTask) { this.asyncTask = asyncTask; } + } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java index 821a296..5c4b31c 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/GlusterVolumeDaoDbFacadeImpl.java @@ -241,7 +241,7 @@ glusterAsyncTaskRowMapper, createVolumeIdParams(volumeId)); - if(glusterAsyncTasks != null && !glusterAsyncTasks.isEmpty()){ + if(glusterAsyncTasks != null && !glusterAsyncTasks.isEmpty()) { return glusterAsyncTasks.get(0); } return null; @@ -367,15 +367,21 @@ public GlusterAsyncTask mapRow(ResultSet rs, int rowNum) throws SQLException { GlusterAsyncTask asyncTask = new GlusterAsyncTask(); - asyncTask.setTaskId(getGuidDefaultEmpty(rs, "external_id")); - String jobStatus =rs.getString("status"); + asyncTask.setTaskId(getGuid(rs, "external_id")); + String jobStatus =rs.getString("job_status"); + if (asyncTask.getTaskId() != null || JobExecutionStatus.STARTED.name().equalsIgnoreCase(jobStatus)) { + asyncTask.setJobId(getGuid(rs, "job_job_id")); + asyncTask.setJobStatus(JobExecutionStatus.valueOf(jobStatus)); + } + String stepStatus =rs.getString("status"); String stepType = rs.getString("step_type"); if(stepType != null && !stepType.isEmpty()){ asyncTask.setType(GlusterTaskType.forValue(StepEnum.valueOf(stepType))); } - if(jobStatus != null && !jobStatus.isEmpty()){ - asyncTask.setStatus(JobExecutionStatus.valueOf(jobStatus)); + if(stepStatus != null && !stepStatus.isEmpty()){ + asyncTask.setStatus(JobExecutionStatus.valueOf(stepStatus)); } + return asyncTask; } } diff --git a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java index 2418a9e..1273017 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java +++ b/frontend/webadmin/modules/gwt-common/src/main/java/org/ovirt/engine/ui/common/CommonApplicationConstants.java @@ -1584,4 +1584,7 @@ @DefaultStringValue("Active VM before the preview") String snapshotDescriptionActiveVmBeforePreview(); + + @DefaultStringValue("Waiting ...") + String waitForGlusterTask(); } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java index c1c66a9..efd4164 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/section/main/view/tab/MainTabVolumeView.java @@ -9,6 +9,7 @@ import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeType; import org.ovirt.engine.core.common.businessentities.gluster.TransportType; +import org.ovirt.engine.core.common.job.JobExecutionStatus; import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.uicommon.model.MainModelProvider; import org.ovirt.engine.ui.common.widget.table.column.EnumColumn; @@ -23,6 +24,7 @@ import org.ovirt.engine.ui.webadmin.widget.action.WebAdminButtonDefinition; import org.ovirt.engine.ui.webadmin.widget.table.column.MenuCell; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityColumn; +import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityCompositeCell; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivitySeperatorCell; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeActivityStatusColumn; import org.ovirt.engine.ui.webadmin.widget.table.column.VolumeStatusColumn; @@ -92,7 +94,6 @@ MenuCell<GlusterTaskSupport> rebalanceMenuCell = getRebalanceActivityMenu(constants); MenuCell<GlusterTaskSupport> removeBricksMenuCell = getRemoveBrickActivityMenu(constants); List<HasCell<GlusterTaskSupport, ?>> list = new ArrayList<HasCell<GlusterTaskSupport, ?>>(); - list.add(new VolumeActivityStatusColumn<GlusterTaskSupport>()); list.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(new VolumeActivitySeperatorCell<GlusterTaskSupport>()) { @Override public GlusterTaskSupport getValue(GlusterTaskSupport object) { @@ -112,7 +113,22 @@ } }); - getTable().addColumn(new VolumeActivityColumn<GlusterVolumeEntity>(list), + List<HasCell<GlusterTaskSupport, ?>> compositeList = new ArrayList<HasCell<GlusterTaskSupport, ?>>(); + compositeList.add(new VolumeActivityStatusColumn<GlusterTaskSupport>()); + compositeList.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(getTaskWaitingActivityMenu(constants)) { + @Override + public GlusterTaskSupport getValue(GlusterTaskSupport object) { + return object; + } + }); + compositeList.add(new Column<GlusterTaskSupport, GlusterTaskSupport>(new VolumeActivityCompositeCell<GlusterTaskSupport>(list)) { + @Override + public GlusterTaskSupport getValue(GlusterTaskSupport object) { + return object; + } + }); + + getTable().addColumn(new VolumeActivityColumn<GlusterVolumeEntity>(compositeList), constants.activitiesOnVolume(), "100px"); //$NON-NLS-1$ @@ -184,4 +200,16 @@ .getRetainBricksCommand()); return menuCell; } + + private MenuCell<GlusterTaskSupport> getTaskWaitingActivityMenu(ApplicationConstants constants) { + MenuCell<GlusterTaskSupport> menuCell = new MenuCell<GlusterTaskSupport>() { + @Override + protected boolean isVisible(GlusterTaskSupport value) { + return value.getAsyncTask() != null && value.getAsyncTask().getJobId() != null + && value.getAsyncTask().getType() == null + && value.getAsyncTask().getJobStatus() == JobExecutionStatus.STARTED; + } + }; + return menuCell; + } } diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityColumn.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityColumn.java index d946530..3fb960a 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityColumn.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityColumn.java @@ -10,13 +10,17 @@ public class VolumeActivityColumn<T extends GlusterTaskSupport> extends Column<T, GlusterTaskSupport> { public VolumeActivityColumn(List<HasCell<GlusterTaskSupport, ?>> list) { - this(new VolumeActivityCompositeCell<GlusterTaskSupport>(list)); + this(new VolumeTaskCompositeCell<GlusterTaskSupport>(list)); } public VolumeActivityColumn(VolumeActivityCompositeCell<GlusterTaskSupport> cell) { super(cell); } + public VolumeActivityColumn(VolumeTaskCompositeCell<GlusterTaskSupport> cell) { + super(cell); + } + @Override public GlusterTaskSupport getValue(T object) { return object; diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityStatusCell.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityStatusCell.java index d8baf46..533dcbc 100644 --- a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityStatusCell.java +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeActivityStatusCell.java @@ -2,6 +2,7 @@ import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskType; import org.ovirt.engine.core.common.businessentities.gluster.GlusterTaskSupport; +import org.ovirt.engine.core.common.job.JobExecutionStatus; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationResources; import org.ovirt.engine.ui.webadmin.ApplicationTemplates; @@ -25,7 +26,8 @@ @Override public void render(Context context, T value, SafeHtmlBuilder sb) { // Nothing to render if no task is provided, or if task status is empty: - if (value == null || value.getAsyncTask() == null || value.getAsyncTask().getStatus() == null) { + if (value == null || value.getAsyncTask() == null || (value.getAsyncTask().getStatus() == null + && value.getAsyncTask().getJobId() == null)) { return; } @@ -34,7 +36,11 @@ ImageResource taskImage = null; String tooltip = ""; //$NON-NLS-1$ - if (taskType == GlusterTaskType.REBALANCE) { + if (taskType == null && value.getAsyncTask().getJobId() != null && value.getAsyncTask().getJobStatus() == JobExecutionStatus.STARTED) { + taskImage = resources.waitImage(); + tooltip = constants.waitForGlusterTask(); + } + else if (taskType == GlusterTaskType.REBALANCE) { switch (value.getAsyncTask().getStatus()) { case STARTED: taskImage = resources.rebalanceRunning(); diff --git a/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeTaskCompositeCell.java b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeTaskCompositeCell.java new file mode 100644 index 0000000..f432063 --- /dev/null +++ b/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmin/widget/table/column/VolumeTaskCompositeCell.java @@ -0,0 +1,63 @@ +package org.ovirt.engine.ui.webadmin.widget.table.column; + +import java.util.Iterator; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.GlusterTaskSupport; + +import com.google.gwt.cell.client.Cell; +import com.google.gwt.cell.client.CompositeCell; +import com.google.gwt.cell.client.HasCell; +import com.google.gwt.dom.client.Element; +import com.google.gwt.safehtml.shared.SafeHtmlBuilder; + +public class VolumeTaskCompositeCell<T extends GlusterTaskSupport> extends CompositeCell<T> { + + private final List<HasCell<T, ?>> hasCells; + + public VolumeTaskCompositeCell(List<HasCell<T, ?>> hasCells) { + super(hasCells); + this.hasCells = hasCells; + } + + @Override + public void render(Context context, T value, SafeHtmlBuilder sb) { + if (value == null || value.getAsyncTask() == null) { + return; + } + + if (!isVisible(value)) { + return; + } + + sb.appendHtmlConstant("<table style=\"margin:0 auto\"><tr>"); //$NON-NLS-1$ + Iterator<HasCell<T, ?>> iterator = hasCells.iterator(); + while (iterator.hasNext()) { + render(context, value, sb, iterator.next()); + } + sb.appendHtmlConstant("</tr></table>"); //$NON-NLS-1$ + } + + protected boolean isVisible(T value) { + return true; + } + + @Override + protected <X> void render(Context context, + T value, + SafeHtmlBuilder sb, + HasCell<T, X> hasCell) { + Cell<X> cell = hasCell.getCell(); + sb.appendHtmlConstant("<td>"); //$NON-NLS-1$ + cell.render(context, hasCell.getValue(value), sb); + sb.appendHtmlConstant("</td>"); //$NON-NLS-1$ + } + + @Override + protected Element getContainerElement(Element parent) { + return super.getContainerElement(parent) + .getFirstChildElement() + .getFirstChildElement() + .getFirstChildElement(); + } +} diff --git a/packaging/dbscripts/create_views.sql b/packaging/dbscripts/create_views.sql index 0263b35..d1fa781 100644 --- a/packaging/dbscripts/create_views.sql +++ b/packaging/dbscripts/create_views.sql @@ -1602,10 +1602,17 @@ CREATE OR REPLACE VIEW gluster_volume_task_steps AS SELECT step.*, - gluster_volumes.id as volume_id -FROM step -INNER JOIN gluster_volumes ON gluster_volumes.task_id = step.external_id -WHERE step.external_system_type = 'GLUSTER'; +gluster_volumes.id as volume_id, +job.job_id as job_job_id, +job.action_type, +job.description as job_description, +job.status as job_status, +job.start_time as job_start_time, +job.end_time as job_end_time +FROM gluster_volumes +INNER JOIN job_subject_entity js ON js.entity_id = gluster_volumes.id +INNER JOIN job on job.job_id = js.job_id +LEFT OUTER JOIN step on step.external_id = gluster_volumes.task_id AND step.external_system_type = 'GLUSTER'; CREATE OR REPLACE VIEW gluster_server_services_view AS diff --git a/packaging/dbscripts/gluster_volumes_sp.sql b/packaging/dbscripts/gluster_volumes_sp.sql index a742b40..e718352 100644 --- a/packaging/dbscripts/gluster_volumes_sp.sql +++ b/packaging/dbscripts/gluster_volumes_sp.sql @@ -244,7 +244,8 @@ BEGIN RETURN QUERY SELECT * FROM gluster_volume_task_steps - WHERE volume_id = v_volume_id; + WHERE volume_id = v_volume_id + ORDER BY job_start_time desc LIMIT 1; END; $procedure$ LANGUAGE plpgsql; -- To view, visit http://gerrit.ovirt.org/21120 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I3e1eebe89dd455a5afa85b6747f11ddc5cafb146 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Sahina Bose <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
