Skip to content

Commit

Permalink
MID-2353 - errors count column for task list. doesn't work for partit…
Browse files Browse the repository at this point in the history
…ioned tasks yet.
  • Loading branch information
katkav committed Mar 9, 2020
1 parent 54ecf66 commit 8da2239
Show file tree
Hide file tree
Showing 4 changed files with 172 additions and 111 deletions.
Expand Up @@ -186,6 +186,7 @@ private Collection<SelectorOptions<GetOperationOptions>> createOperationOptions(
propertiesToGet.add(TaskType.F_NODE_AS_OBSERVED);
propertiesToGet.add(TaskType.F_NEXT_RUN_START_TIMESTAMP);
propertiesToGet.add(TaskType.F_NEXT_RETRY_TIMESTAMP);
propertiesToGet.add(TaskType.F_SUBTASK);

GetOperationOptionsBuilder getOperationOptionsBuilder = getSchemaHelper().getOperationOptionsBuilder();
getOperationOptionsBuilder = getOperationOptionsBuilder.resolveNames();
Expand Down
Expand Up @@ -37,6 +37,7 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;

public class TaskOperationStatisticsPanel extends BasePanel<PrismObjectWrapper<TaskType>> implements TaskTabPanel {

Expand Down Expand Up @@ -69,29 +70,39 @@ private LoadableModel<OperationStatsType> createOperationStatsModel() {
protected OperationStatsType load() {
PrismObject<TaskType> task = getModelObject().getObject();

IterativeTaskInformationType iterativeTaskInformation = new IterativeTaskInformationType();
SynchronizationInformationType synchronizationInformation = new SynchronizationInformationType();
ActionsExecutedInformationType actionsExecutedInformation = new ActionsExecutedInformationType();

if (TaskTypeUtil.isPartitionedMaster(task.asObjectable())) {
List<TaskType> subTasks = resolveSubTasks();
for (TaskType taskDto : subTasks) {
OperationStatsType operationStats = taskDto.getOperationStats();
if (operationStats != null) {
IterativeTaskInformation.addTo(iterativeTaskInformation, operationStats.getIterativeTaskInformation(), true);
SynchronizationInformation.addTo(synchronizationInformation, operationStats.getSynchronizationInformation());
ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStats.getActionsExecutedInformation());
}
}

return new OperationStatsType(getPrismContext())
.iterativeTaskInformation(iterativeTaskInformation)
.synchronizationInformation(synchronizationInformation)
.actionsExecutedInformation(actionsExecutedInformation);

}

return task.asObjectable().getOperationStats();
return TaskTypeUtil.getAggregatedOperationStats(task.asObjectable(), getPrismContext());
// IterativeTaskInformationType iterativeTaskInformation = new IterativeTaskInformationType();
// SynchronizationInformationType synchronizationInformation = new SynchronizationInformationType();
// ActionsExecutedInformationType actionsExecutedInformation = new ActionsExecutedInformationType();
//
// if (TaskTypeUtil.isPartitionedMaster(task.asObjectable())) {
//// List<TaskType> subTasks = resolveSubTasks();
// Stream<TaskType> subTasks = TaskTypeUtil.getAllTasksStream(task.asObjectable());
// subTasks.forEach(subTask -> {
// OperationStatsType operationStatsType = subTask.getOperationStats();
// if (operationStatsType != null) {
// IterativeTaskInformation.addTo(iterativeTaskInformation, operationStatsType.getIterativeTaskInformation(), true);
// SynchronizationInformation.addTo(synchronizationInformation, operationStatsType.getSynchronizationInformation());
// ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStatsType.getActionsExecutedInformation());
// }
// });
//// for (TaskType taskDto : subTasks) {
//// OperationStatsType operationStats = taskDto.getOperationStats();
//// if (operationStats != null) {
//// IterativeTaskInformation.addTo(iterativeTaskInformation, operationStats.getIterativeTaskInformation(), true);
//// SynchronizationInformation.addTo(synchronizationInformation, operationStats.getSynchronizationInformation());
//// ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStats.getActionsExecutedInformation());
//// }
//// }
//
// return new OperationStatsType(getPrismContext())
// .iterativeTaskInformation(iterativeTaskInformation)
// .synchronizationInformation(synchronizationInformation)
// .actionsExecutedInformation(actionsExecutedInformation);
//
// }
//
// return task.asObjectable().getOperationStats();

}
};
Expand Down
Expand Up @@ -46,6 +46,7 @@
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
Expand Down Expand Up @@ -227,6 +228,7 @@ protected List<IColumn<SelectableBean<TaskType>, String>> initCustomTaskColumns(
columns.add(createTaskExecutionStatusColumn());

columns.add(createProgressColumn("pageTasks.task.progress"));
columns.add(createErrorsColumn("pageTasks.task.errors"));

columns.add(new IconColumn<SelectableBean<TaskType>>(createStringResource("pageTasks.task.status"), TaskType.F_RESULT_STATUS.getLocalPart()) {

Expand Down Expand Up @@ -296,6 +298,17 @@ public IModel<String> getDataModel(IModel<SelectableBean<TaskType>> rowModel) {
};
}

private AbstractColumn<SelectableBean<TaskType>, String> createErrorsColumn(String titleKey) {
return new AbstractColumn<SelectableBean<TaskType>, String>(createStringResource(titleKey)) {
@Override
public void populateItem(Item<ICellPopulator<SelectableBean<TaskType>>> cellItem, String componentId, IModel<SelectableBean<TaskType>> rowModel) {
TaskType task = rowModel.getObject().getValue();
cellItem.add(new Label(componentId, new Model<>(TaskTypeUtil.getObjectsProcessedFailures(task, getPrismContext()))));

}
};
}

private String getProgressDescription(SelectableBean<TaskType> task) {
Long stalledSince = getStalledSince(task.getValue());
if (stalledSince != null) {
Expand Down Expand Up @@ -415,7 +428,7 @@ public IModel<Boolean> getVisible() {
if (rowModel == null){
return Model.of(Boolean.TRUE);
}
SelectableBean<TaskType> rowModelObj = (SelectableBean<TaskType>)rowModel.getObject();
SelectableBean<TaskType> rowModelObj = rowModel.getObject();
boolean visible = WebComponentUtil.canSuspendTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase());
return Model.of(visible);
}
Expand Down Expand Up @@ -452,7 +465,7 @@ public IModel<Boolean> getVisible() {
if (rowModel == null){
return Model.of(Boolean.TRUE);
}
SelectableBean<TaskType> rowModelObj = (SelectableBean<TaskType>)rowModel.getObject();
SelectableBean<TaskType> rowModelObj = rowModel.getObject();
boolean visible = WebComponentUtil.canResumeTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase());
return Model.of(visible);
}
Expand Down Expand Up @@ -490,7 +503,7 @@ public IModel<Boolean> getVisible() {
if (rowModel == null){
return Model.of(Boolean.TRUE);
}
SelectableBean<TaskType> rowModelObj = (SelectableBean<TaskType>)rowModel.getObject();
SelectableBean<TaskType> rowModelObj = rowModel.getObject();
return Model.of(WebComponentUtil.canRunNowTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase()));
}

Expand Down Expand Up @@ -664,7 +677,7 @@ public IModel<Boolean> getVisible() {
if (rowModel == null){
return Model.of(Boolean.TRUE);
}
SelectableBean<TaskType> rowModelObj = (SelectableBean<TaskType>)rowModel.getObject();
SelectableBean<TaskType> rowModelObj = rowModel.getObject();
return Model.of(WebComponentUtil.canSuspendTask(rowModelObj.getValue(), TaskTablePanel.this.getPageBase()));
}

Expand Down Expand Up @@ -843,12 +856,8 @@ private void deleteTaskConfirmedPerformed(AjaxRequestTarget target, IModel<Selec
}
showResult(result);

// TaskDtoProvider provider = (TaskDtoProvider) getTaskTable().getDataTable().getDataProvider();
// provider.clearCache();

// refresh feedback and table
refreshTable(TaskType.class, target);
// refreshTable(target);
}

private void reconcileWorkersConfirmedPerformed(AjaxRequestTarget target, @NotNull IModel<SelectableBean<TaskType>> task) {
Expand Down
@@ -1,80 +1,120 @@
/*
* Copyright (c) 2010-2018 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.schema.util;

import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

import java.util.*;
import java.util.stream.Stream;

/**
* @author mederly
*/
public class TaskTypeUtil {

/**
* Returns a stream of the task and all of its subtasks.
*/
@NotNull
public static Stream<TaskType> getAllTasksStream(TaskType root) {
return Stream.concat(Stream.of(root),
getResolvedSubtasks(root).stream().flatMap(TaskTypeUtil::getAllTasksStream));
}

public static List<TaskType> getResolvedSubtasks(TaskType parent) {
List<TaskType> rv = new ArrayList<>();
for (ObjectReferenceType childRef : parent.getSubtaskRef()) {
//noinspection unchecked
PrismObject<TaskType> child = childRef.getObject();
if (child != null) {
rv.add(child.asObjectable());
} else {
throw new IllegalStateException("Unresolved subtaskRef in " + parent + ": " + childRef);
}
}
return rv;
}

public static void addSubtask(TaskType parent, TaskType child, PrismContext prismContext) {
parent.getSubtaskRef().add(ObjectTypeUtil.createObjectRefWithFullObject(child, prismContext));
}

//moved from GUI
public static boolean isCoordinator(TaskType task) {
return getKind(task) == TaskKindType.COORDINATOR;
}

public static boolean isPartitionedMaster(TaskType task) {
return getKind(task) == TaskKindType.PARTITIONED_MASTER;
}

@NotNull
public static TaskKindType getKind(TaskType task) {
if (task.getWorkManagement() != null && task.getWorkManagement().getTaskKind() != null) {
return task.getWorkManagement().getTaskKind();
} else {
return TaskKindType.STANDALONE;
}
}

public static int getObjectsProcessed(TaskType task) {
OperationStatsType stats = task.getOperationStats();
if (stats == null) {
return 0;
}
IterativeTaskInformationType iterativeStats = stats.getIterativeTaskInformation();
if (iterativeStats == null) {
return 0;
}
return iterativeStats.getTotalSuccessCount() + iterativeStats.getTotalFailureCount();
}
}
/*
* Copyright (c) 2010-2018 Evolveum and contributors
*
* This work is dual-licensed under the Apache License 2.0
* and European Union Public License. See LICENSE file for details.
*/

package com.evolveum.midpoint.schema.util;

import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.statistics.ActionsExecutedInformation;
import com.evolveum.midpoint.schema.statistics.IterativeTaskInformation;
import com.evolveum.midpoint.schema.statistics.SynchronizationInformation;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

import java.util.*;
import java.util.stream.Stream;

/**
* @author mederly
*/
public class TaskTypeUtil {

/**
* Returns a stream of the task and all of its subtasks.
*/
@NotNull
public static Stream<TaskType> getAllTasksStream(TaskType root) {
return Stream.concat(Stream.of(root),
getResolvedSubtasks(root).stream().flatMap(TaskTypeUtil::getAllTasksStream));
}

public static List<TaskType> getResolvedSubtasks(TaskType parent) {
List<TaskType> rv = new ArrayList<>();
for (ObjectReferenceType childRef : parent.getSubtaskRef()) {
//noinspection unchecked
PrismObject<TaskType> child = childRef.getObject();
if (child != null) {
rv.add(child.asObjectable());
} else {
throw new IllegalStateException("Unresolved subtaskRef in " + parent + ": " + childRef);
}
}
return rv;
}

public static void addSubtask(TaskType parent, TaskType child, PrismContext prismContext) {
parent.getSubtaskRef().add(ObjectTypeUtil.createObjectRefWithFullObject(child, prismContext));
}

//moved from GUI
public static boolean isCoordinator(TaskType task) {
return getKind(task) == TaskKindType.COORDINATOR;
}

public static boolean isPartitionedMaster(TaskType task) {
return getKind(task) == TaskKindType.PARTITIONED_MASTER;
}

@NotNull
public static TaskKindType getKind(TaskType task) {
if (task.getWorkManagement() != null && task.getWorkManagement().getTaskKind() != null) {
return task.getWorkManagement().getTaskKind();
} else {
return TaskKindType.STANDALONE;
}
}

public static int getObjectsProcessed(TaskType task) {
OperationStatsType stats = task.getOperationStats();
if (stats == null) {
return 0;
}
IterativeTaskInformationType iterativeStats = stats.getIterativeTaskInformation();
if (iterativeStats == null) {
return 0;
}
return iterativeStats.getTotalSuccessCount() + iterativeStats.getTotalFailureCount();
}

public static int getObjectsProcessedFailures(TaskType task, PrismContext prismContext) {
OperationStatsType stats = getAggregatedOperationStats(task, prismContext);
if (stats == null) {
return 0;
}
IterativeTaskInformationType iterativeStats = stats.getIterativeTaskInformation();
if (iterativeStats == null) {
return 0;
}
return iterativeStats.getTotalFailureCount();
}

public static OperationStatsType getAggregatedOperationStats(TaskType task, PrismContext prismContext) {
if (!isPartitionedMaster(task)) {
return task.getOperationStats();
}

IterativeTaskInformationType iterativeTaskInformation = new IterativeTaskInformationType();
SynchronizationInformationType synchronizationInformation = new SynchronizationInformationType();
ActionsExecutedInformationType actionsExecutedInformation = new ActionsExecutedInformationType();

Stream<TaskType> subTasks = TaskTypeUtil.getAllTasksStream(task);
subTasks.forEach(subTask -> {
OperationStatsType operationStatsType = subTask.getOperationStats();
if (operationStatsType != null) {
IterativeTaskInformation.addTo(iterativeTaskInformation, operationStatsType.getIterativeTaskInformation(), true);
SynchronizationInformation.addTo(synchronizationInformation, operationStatsType.getSynchronizationInformation());
ActionsExecutedInformation.addTo(actionsExecutedInformation, operationStatsType.getActionsExecutedInformation());
}
});

return new OperationStatsType(prismContext)
.iterativeTaskInformation(iterativeTaskInformation)
.synchronizationInformation(synchronizationInformation)
.actionsExecutedInformation(actionsExecutedInformation);
}
}

0 comments on commit 8da2239

Please sign in to comment.