From 5c41060b0931f5c260e1b8f4fbafcfe467ebdd27 Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Thu, 28 Feb 2019 07:51:34 +0100 Subject: [PATCH] some thresholds improvements --- .../schema/ResourceShadowDiscriminator.java | 3 +- .../xml/ns/public/common/common-core-3.xsd | 129 ++++++---- ...tificationCampaignCreationTaskHandler.java | 4 +- ...AccessCertificationClosingTaskHandler.java | 2 +- ...ssCertificationRemediationTaskHandler.java | 3 +- .../api/context/EvaluatedPolicyRule.java | 3 + .../midpoint/model/impl/ModelCrudService.java | 3 +- .../midpoint/model/impl/ModelWebService.java | 3 +- .../impl/cleanup/CleanUpTaskHandler.java | 4 +- .../cleanup/ShadowRefreshTaskHandler.java | 3 +- .../controller/ExecuteDeltasTaskHandler.java | 3 +- .../controller/ModelOperationTaskHandler.java | 4 +- ...ImportAccountsFromResourceTaskHandler.java | 13 +- .../ImportObjectsFromFileTaskHandler.java | 3 +- .../ObjectIntegrityCheckTaskHandler.java | 4 +- .../ShadowIntegrityCheckTaskHandler.java | 4 +- .../model/impl/lens/AssignmentEvaluator.java | 7 +- .../impl/lens/EvaluatedPolicyRuleImpl.java | 20 ++ .../policy/PolicyRuleSuspendTaskExecutor.java | 2 +- .../IterativeScriptExecutionTaskHandler.java | 3 +- .../scripting/ScriptExecutionTaskHandler.java | 3 +- .../impl/sync/ExecuteChangesTaskHandler.java | 3 +- .../sync/FocusValidityScannerTaskHandler.java | 3 +- .../model/impl/sync/LiveSyncTaskHandler.java | 62 ++++- .../model/impl/sync/RecomputeTaskHandler.java | 15 +- .../impl/sync/ReconciliationTaskHandler.java | 77 ++---- .../sync/SynchronizeAccountResultHandler.java | 10 +- .../trigger/TriggerScannerTaskHandler.java | 3 +- .../impl/util/AuditReindexTaskHandler.java | 4 +- .../model/impl/util/DeleteTaskHandler.java | 3 +- .../model/impl/util/ModelImplUtils.java | 40 +-- .../model/impl/util/ReindexTaskHandler.java | 4 +- .../model/intest/util/MockTaskHandler.java | 3 +- .../test/AbstractModelIntegrationTest.java | 63 +++++ .../report/impl/ReportCreateTaskHandler.java | 3 +- .../WfPrepareChildOperationTaskHandler.java | 4 +- .../WfPrepareRootOperationTaskHandler.java | 4 +- ...opagateTaskObjectReferenceTaskHandler.java | 3 +- .../WfProcessInstanceShadowTaskHandler.java | 4 +- provisioning/provisioning-api/pom.xml | 5 + .../provisioning/api/ProvisioningService.java | 6 +- .../api/ResourceEventListener.java | 7 +- .../ChangeNotificationDispatcherImpl.java | 4 +- .../impl/ProvisioningServiceImpl.java | 15 +- .../impl/ResourceEventListenerImpl.java | 8 +- .../provisioning/impl/ShadowCache.java | 71 ++++-- .../task/MultiPropagationTaskHandler.java | 3 +- .../impl/task/PropagationResultHandler.java | 2 +- .../impl/task/PropagationTaskHandler.java | 3 +- .../provisioning/impl/dummy/TestDummy.java | 18 +- .../impl/opendj/TestOpenDjNegative.java | 4 +- .../impl/opendj/TestSynchronization.java | 4 +- .../midpoint/repo/api/RepositoryService.java | 31 ++- .../repo/api/VersionPrecondition.java | 7 +- .../midpoint/repo/cache/RepositoryCache.java | 61 +++-- .../midpoint/repo/common/CounterManager.java | 96 ++++---- .../AbstractSearchIterativeResultHandler.java | 23 +- .../AbstractSearchIterativeTaskHandler.java | 10 +- .../repo/common/util/RepoCommonUtils.java | 10 + .../midpoint/repo/sql/ModifyTest.java | 42 +++- .../repo/sql/SqlRepositoryServiceImpl.java | 85 +++++-- .../repo/sql/helpers/ObjectUpdater.java | 59 +++-- .../midpoint/task/api/TaskConstants.java | 2 + .../midpoint/task/api/TaskHandler.java | 13 +- .../midpoint/task/api/TaskManager.java | 28 ++- .../task/api/WorkBucketAwareTaskHandler.java | 10 +- .../quartzimpl/TaskManagerQuartzImpl.java | 90 ++++++- .../task/quartzimpl/TaskQuartzImpl.java | 115 +++++++-- .../execution/ExecutionManager.java | 40 ++- .../quartzimpl/execution/HandlerExecutor.java | 205 ++++++++++++++++ .../quartzimpl/execution/JobExecutor.java | 231 +++++++----------- .../handlers/JdbcPingTaskHandler.java | 4 +- .../LightweigthPartitioningTaskHandler.java | 179 ++++++++++++++ .../quartzimpl/handlers/NoOpTaskHandler.java | 3 +- .../handlers/PartitioningTaskHandler.java | 2 +- .../WaitForSubtasksByPollingTaskHandler.java | 3 +- .../handlers/WaitForTasksTaskHandler.java | 3 +- .../handlers/WorkersCreationTaskHandler.java | 2 +- .../handlers/WorkersRestartTaskHandler.java | 3 +- .../quartzimpl/work/WorkStateManager.java | 43 ++-- .../task/quartzimpl/MockCycleTaskHandler.java | 3 +- .../task/quartzimpl/MockLongTaskHandler.java | 3 +- .../quartzimpl/MockParallelTaskHandler.java | 4 +- .../quartzimpl/MockSingleTaskHandler.java | 3 +- .../MockWorkBucketsTaskHandler.java | 3 +- .../testing/story/TestThresholds.java | 215 ++++++++-------- .../story/TestThresholdsLiveSyncFull.java | 75 ++++++ .../story/TestThresholdsLiveSyncSimulate.java | 72 ++++++ .../story/TestThresholdsReconFull.java | 68 ++++++ .../story/TestThresholdsReconSimulate.java | 69 ++++++ .../story/src/test/resources/logback-test.xml | 5 +- .../resources/thresholds/resource-opendj.xml | 3 +- .../task-opendj-import-base-users.xml | 34 +++ ...cile.xml => task-opendj-livesync-full.xml} | 40 +-- .../task-opendj-livesync-simulate.xml | 64 +++++ .../thresholds/task-opendj-reconcile-full.xml | 66 +++++ .../task-opendj-reconcile-simulate.xml | 69 ++++++ .../test/resources/thresholds/users-base.ldif | 35 +++ .../src/test/resources/thresholds/users.ldif | 36 --- testing/story/testng-integration.xml | 5 +- 100 files changed, 2175 insertions(+), 778 deletions(-) create mode 100644 repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/HandlerExecutor.java create mode 100644 repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/LightweigthPartitioningTaskHandler.java create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncFull.java create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncSimulate.java create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconFull.java create mode 100644 testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconSimulate.java create mode 100644 testing/story/src/test/resources/thresholds/task-opendj-import-base-users.xml rename testing/story/src/test/resources/thresholds/{task-opendj-reconcile.xml => task-opendj-livesync-full.xml} (69%) create mode 100644 testing/story/src/test/resources/thresholds/task-opendj-livesync-simulate.xml create mode 100644 testing/story/src/test/resources/thresholds/task-opendj-reconcile-full.xml create mode 100644 testing/story/src/test/resources/thresholds/task-opendj-reconcile-simulate.xml create mode 100644 testing/story/src/test/resources/thresholds/users-base.ldif diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ResourceShadowDiscriminator.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ResourceShadowDiscriminator.java index 3890e5225c2..b048401121c 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/ResourceShadowDiscriminator.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/ResourceShadowDiscriminator.java @@ -51,7 +51,7 @@ public class ResourceShadowDiscriminator implements Serializable, DebugDumpable, private QName objectClass; private boolean tombstone; private int order = 0; - + public ResourceShadowDiscriminator(String resourceOid, ShadowKindType kind, String intent, boolean tombstone) { this.resourceOid = resourceOid; this.tombstone = tombstone; @@ -151,7 +151,6 @@ public boolean isWildcard() { return kind == null && objectClass == null; } - public ShadowDiscriminatorType toResourceShadowDiscriminatorType() { ShadowDiscriminatorType rsdt = new ShadowDiscriminatorType(); rsdt.setIntent(intent); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 0ca28178a62..b12431d739a 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -1209,6 +1209,7 @@ + @@ -2744,21 +2745,6 @@ - - - - Stage of the task. Some task can have different processing stages. E.g. reconciliation - task can have: - - situation stage in which only the situation for shadows is computed - - simulation stage in which all changes are computed but nothing is executed - - execution state in which the full reconciliation is run - Supported stages are defined per task type. - - - 4.0 - - - @@ -3303,42 +3289,6 @@ - - - - Stage type of the task. - - - 4.0 - - - - - - - - Name identifying task stage. - - - - - - - Defines which errors are critical and should stop the task in the defined stage. - - - - - - - Define if the specified stage is executed. - - - - - - - @@ -3649,8 +3599,85 @@ + + + + Name identifying task stage. + + + + + + + Defines which errors are critical and should stop the task in the defined stage. + + + + + + + Define if the specified stage is executed. + + + + + + + + An enumeration that indicates the activation status of a particular entity. + The activation status determines whether the entity is active (enabled) + or inactive (disabled, archived, etc.). Please see documentation of individual + enumeration values for more details. + + + + + + + + + +

+ Nothing is executed. Just metadata are handled. E.g. during reconciliation + only situations in shadows are set. +

+
+ + + +
+
+ + + +

+ Changes are computed, but nothing is executed. E.g. preview changes is run for + objects and the computed deltas are stored to be processed later. E.g. simulate + how many changes will be processed during the reconciliation. After reconciliation + finished, proper action is taked to show results during simulation. +

+
+ + + +
+
+ + + +

+ Full execution mode. Cahnges are computed and also executed. +

+
+ + + +
+
+
+
diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationCampaignCreationTaskHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationCampaignCreationTaskHandler.java index e0357befe23..6a1a3571256 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationCampaignCreationTaskHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationCampaignCreationTaskHandler.java @@ -25,6 +25,8 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -61,7 +63,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { LOGGER.trace("Task run starting"); OperationResult opResult = new OperationResult(CLASS_DOT+"run"); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java index c9c662ad02c..2cc5d6285e4 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java @@ -90,7 +90,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { LOGGER.info("Task run starting"); OperationResult opResult = new OperationResult(CLASS_DOT+"run"); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java index e8d5e21969b..17c5f02b198 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCaseType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.jetbrains.annotations.NotNull; @@ -83,7 +84,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { LOGGER.trace("Task run starting"); OperationResult opResult = new OperationResult(CLASS_DOT+"run"); diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java index f2e3250710e..30869a6b08e 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java @@ -97,4 +97,7 @@ void addToEvaluatedPolicyRuleTypes(Collection rules, Po // use only if you know what you're doing void addTrigger(@NotNull EvaluatedPolicyRuleTrigger trigger); + + //experimental + String getPolicyRuleIdentifier(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java index 2bee796f5c9..f9ef107013a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java @@ -42,6 +42,7 @@ import com.evolveum.midpoint.provisioning.api.ChangeNotificationDispatcher; import com.evolveum.midpoint.provisioning.api.GenericConnectorException; import com.evolveum.midpoint.provisioning.api.ResourceEventDescription; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.cache.RepositoryCache; import com.evolveum.midpoint.schema.DeltaConvertor; @@ -121,7 +122,7 @@ public List> searchObjects(Class type, return modelService.searchObjects(type, query, options, task, parentResult); } - public void notifyChange(ResourceObjectShadowChangeDescriptionType changeDescription, OperationResult parentResult, Task task) throws SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ObjectNotFoundException, GenericConnectorException, ObjectAlreadyExistsException, ExpressionEvaluationException{ + public void notifyChange(ResourceObjectShadowChangeDescriptionType changeDescription, OperationResult parentResult, Task task) throws SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ObjectNotFoundException, GenericConnectorException, ObjectAlreadyExistsException, ExpressionEvaluationException, PolicyViolationException, PreconditionViolationException{ String oldShadowOid = changeDescription.getOldShadowOid(); ResourceEventDescription eventDescription = new ResourceEventDescription(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java index 4cfe76cea01..ca6ef979338 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelWebService.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ObjectDeltaOperation; @@ -426,7 +427,7 @@ public TaskType notifyChange(ResourceObjectShadowChangeDescriptionType changeDes try { model.notifyChange(changeDescription, parentResult, task); - } catch (ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ObjectAlreadyExistsException | ExpressionEvaluationException | RuntimeException | Error ex) { + } catch (ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ObjectAlreadyExistsException | ExpressionEvaluationException | RuntimeException | Error | PolicyViolationException | PreconditionViolationException ex) { LoggingUtils.logException(LOGGER, "# MODEL notifyChange() failed", ex); auditLogout(task); throwFault(ex, parentResult); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/CleanUpTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/CleanUpTaskHandler.java index 02dda5f6e61..180dcf2b643 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/CleanUpTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/CleanUpTaskHandler.java @@ -35,6 +35,8 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -72,7 +74,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { LOGGER.trace("CleanUpTaskHandler.run starting"); OperationResult opResult = new OperationResult(OperationConstants.CLEANUP); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/ShadowRefreshTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/ShadowRefreshTaskHandler.java index 45969bed632..d88c80eb565 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/ShadowRefreshTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/cleanup/ShadowRefreshTaskHandler.java @@ -36,6 +36,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; /** * Scanner that looks for pending operations in the shadows and updates the status. @@ -95,7 +96,7 @@ protected void finish(AbstractScannerResultHandler handler, TaskRunR } @Override - protected AbstractScannerResultHandler createHandler(TaskRunResult runResult, final Task coordinatorTask, + protected AbstractScannerResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, final Task coordinatorTask, OperationResult opResult) { AbstractScannerResultHandler handler = new AbstractScannerResultHandler( diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java index 1b624125fa8..ea526cc0bca 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -57,7 +58,7 @@ public class ExecuteDeltasTaskHandler implements TaskHandler { @Autowired private ModelService modelService; @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { OperationResult result = task.getResult().createSubresult(DOT_CLASS + "run"); TaskRunResult runResult = new TaskRunResult(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelOperationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelOperationTaskHandler.java index 626ee63e626..856c418f1dd 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelOperationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelOperationTaskHandler.java @@ -35,6 +35,8 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.LensContextType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -67,7 +69,7 @@ public class ModelOperationTaskHandler implements TaskHandler { @Autowired private Clockwork clockwork; @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { OperationResult result = task.getResult().createSubresult(DOT_CLASS + "run"); TaskRunResult runResult = new TaskRunResult(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java index 5a82038ee90..9c6d2f4ba3a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java @@ -64,6 +64,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** @@ -174,7 +175,7 @@ public void launch(ResourceType resource, QName objectclass, Task task, Operatio } @Override - protected SynchronizeAccountResultHandler createHandler(TaskRunResult runResult, Task coordinatorTask, + protected SynchronizeAccountResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { ResourceType resource = resolveObjectRef(ResourceType.class, runResult, coordinatorTask, opResult); @@ -182,11 +183,11 @@ protected SynchronizeAccountResultHandler createHandler(TaskRunResult runResult, return null; } - return createHandler(resource, null, runResult, coordinatorTask, opResult); + return createHandler(partition, resource, null, runResult, coordinatorTask, opResult); } // shadowToImport - it is used to derive objectClass/intent/kind when importing a single shadow - private SynchronizeAccountResultHandler createHandler(ResourceType resource, PrismObject shadowToImport, + private SynchronizeAccountResultHandler createHandler(TaskPartitionDefinitionType partition, ResourceType resource, PrismObject shadowToImport, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { ObjectClassComplexTypeDefinition objectClass = determineObjectClassDefinition(resource, shadowToImport, runResult, coordinatorTask, opResult); @@ -197,13 +198,13 @@ private SynchronizeAccountResultHandler createHandler(ResourceType resource, Pri LOGGER.info("Start executing import from resource {}, importing object class {}", resource, objectClass.getTypeName()); SynchronizeAccountResultHandler handler = new SynchronizeAccountResultHandler(resource, objectClass, "import", - coordinatorTask, changeNotificationDispatcher, null, taskManager); + coordinatorTask, changeNotificationDispatcher, partition, taskManager); handler.setSourceChannel(SchemaConstants.CHANGE_CHANNEL_IMPORT); handler.setForceAdd(true); handler.setStopOnError(false); handler.setContextDesc("from "+resource); handler.setLogObjectProgress(true); - + return handler; } @@ -299,7 +300,7 @@ public boolean importSingleShadow(String shadowOid, Task task, OperationResult p // Create a result handler just for one object. Invoke the handle() method manually. TaskRunResult runResult = new TaskRunResult(); - SynchronizeAccountResultHandler resultHandler = createHandler(resource.asObjectable(), shadow, runResult, task, parentResult); + SynchronizeAccountResultHandler resultHandler = createHandler(null, resource.asObjectable(), shadow, runResult, task, parentResult); if (resultHandler == null) { return false; } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java index 0d2996e0130..5e154026f0d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportObjectsFromFileTaskHandler.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.apache.commons.lang.NotImplementedException; @@ -150,7 +151,7 @@ public void launch(File input, Task task, OperationResult parentResult) { * The body of the task. This will start the import "loop". */ @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { LOGGER.debug("Import objects from file run (task {})", task); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ObjectIntegrityCheckTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ObjectIntegrityCheckTaskHandler.java index 20dfa935749..834f1a1bd4a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ObjectIntegrityCheckTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ObjectIntegrityCheckTaskHandler.java @@ -31,6 +31,8 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -72,7 +74,7 @@ private void initialize() { } @Override - protected ObjectIntegrityCheckResultHandler createHandler(TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { + protected ObjectIntegrityCheckResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { return new ObjectIntegrityCheckResultHandler(coordinatorTask, ObjectIntegrityCheckTaskHandler.class.getName(), "check object integrity", "check object integrity", taskManager, prismContext, repositoryService, systemObjectCache, opResult); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckTaskHandler.java index a5e532c6992..95da89315b4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/integrity/ShadowIntegrityCheckTaskHandler.java @@ -31,6 +31,8 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -89,7 +91,7 @@ private void initialize() { } @Override - protected ShadowIntegrityCheckResultHandler createHandler(TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { + protected ShadowIntegrityCheckResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { return new ShadowIntegrityCheckResultHandler(coordinatorTask, ShadowIntegrityCheckTaskHandler.class.getName(), "check shadow integrity", "check shadow integrity", taskManager, prismContext, provisioningService, matchingRuleRegistry, repositoryService, synchronizationService, systemObjectCache, opResult); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java index 35bd74c46be..ae7c1f7f5ce 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java @@ -442,18 +442,13 @@ private boolean evaluateSegmentContent(AssignmentPathSegm } if (assignmentType.getPolicyRule() != null && !loginMode) { // We can ignore "reallyValid" for the same reason as for focus mappings. - LOGGER.info("###policy rule"); if (isNonNegative(relativeMode)) { - LOGGER.info("##### is non negative"); if (segment.isMatchingOrder()) { - LOGGER.info("##### collect focus rules"); collectPolicyRule(true, segment, ctx); } if (segment.isMatchingOrderForTarget()) { collectPolicyRule(false, segment, ctx); - } else { - collectPolicyRule(false, segment, ctx); - } + } } } if (assignmentType.getTarget() != null || assignmentType.getTargetRef() != null) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java index d4e5588e435..ada9a1e177e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java @@ -87,6 +87,8 @@ public class EvaluatedPolicyRuleImpl implements EvaluatedPolicyRule { @Nullable private final ObjectType directOwner; private final transient PrismContext prismContextForDebugDump; // if null, nothing serious happens + private String policyRuleId; + @NotNull private final List enabledActions = new ArrayList<>(); // computed only when necessary (typically when triggered) public EvaluatedPolicyRuleImpl(@NotNull PolicyRuleType policyRuleType, @Nullable AssignmentPath assignmentPath, @@ -95,6 +97,15 @@ public EvaluatedPolicyRuleImpl(@NotNull PolicyRuleType policyRuleType, @Nullable this.assignmentPath = assignmentPath; this.prismContextForDebugDump = prismContext; this.directOwner = computeDirectOwner(); + this.policyRuleId = computePolicyRuleId(); + } + + private String computePolicyRuleId() { + if (directOwner == null) { + return null; + } + + return directOwner.getOid() + policyRuleType.asPrismContainerValue().getId(); } public EvaluatedPolicyRuleImpl clone() { @@ -446,4 +457,13 @@ public void computeEnabledActions(@Nullable Po enabledActions.add(action); } } + + //experimental + /* (non-Javadoc) + * @see com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule#getPolicyRuleIdentifier() + */ + @Override + public String getPolicyRuleIdentifier() { + return policyRuleId; + } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java index d429ca1176a..a29e8462733 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleSuspendTaskExecutor.java @@ -58,7 +58,7 @@ public void execute(@NotNull ModelContext context, Tas } for (EvaluatedPolicyRule policyRule : focusCtx.getPolicyRules()) { - CounterSepcification counterSpec = counterManager.getCounterSpec(task, policyRule.getPolicyRule()); + CounterSepcification counterSpec = counterManager.getCounterSpec(task, policyRule.getPolicyRuleIdentifier(), policyRule.getPolicyRule()); LOGGER.trace("Found counter specification {} for {}", counterSpec, DebugUtil.debugDumpLazily(policyRule)); int counter = 1; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/IterativeScriptExecutionTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/IterativeScriptExecutionTaskHandler.java index d6f3ead757f..e392c3c2931 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/IterativeScriptExecutionTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/IterativeScriptExecutionTaskHandler.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ValueListType; import org.jetbrains.annotations.NotNull; @@ -69,7 +70,7 @@ protected Class getType(Task task) { @NotNull @Override - protected AbstractSearchIterativeResultHandler createHandler(TaskRunResult runResult, final Task coordinatorTask, + protected AbstractSearchIterativeResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, final Task coordinatorTask, OperationResult opResult) { PrismProperty executeScriptProperty = coordinatorTask.getExtensionProperty(SchemaConstants.SE_EXECUTE_SCRIPT); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java index e9965ab98a9..cbcfe2a4f89 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/ScriptExecutionTaskHandler.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; @@ -66,7 +67,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { OperationResult result = task.getResult().createSubresult(DOT_CLASS + "run"); TaskRunResult runResult = new TaskRunResult(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java index 2e7b4757a74..e727cbfc979 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ExecuteChangesTaskHandler.java @@ -53,6 +53,7 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; @@ -88,7 +89,7 @@ protected Class getType(Task task) { @NotNull @Override - protected AbstractSearchIterativeResultHandler createHandler(TaskRunResult runResult, final Task coordinatorTask, + protected AbstractSearchIterativeResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, final Task coordinatorTask, OperationResult opResult) { AbstractSearchIterativeResultHandler handler = new AbstractSearchIterativeResultHandler( diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java index 7f013f09e65..a1a05abf895 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java @@ -48,6 +48,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyRuleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TimeValidityPolicyConstraintType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; @@ -256,7 +257,7 @@ protected void finish(AbstractScannerResultHandler handler, TaskRunRe @NotNull @Override - protected AbstractScannerResultHandler createHandler(TaskRunResult runResult, final Task coordinatorTask, + protected AbstractScannerResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, final Task coordinatorTask, OperationResult opResult) { AbstractScannerResultHandler handler = new AbstractScannerResultHandler( diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java index 678c431d5b1..cfac437ec83 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/LiveSyncTaskHandler.java @@ -21,25 +21,33 @@ import com.evolveum.midpoint.model.impl.util.ModelImplUtils; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.provisioning.api.ProvisioningService; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.repo.common.CounterManager; +import com.evolveum.midpoint.repo.common.util.RepoCommonUtils; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.result.OperationConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.schema.util.ExceptionUtil; import com.evolveum.midpoint.task.api.*; import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.PolicyViolationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CriticalityType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExecutionModeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -83,8 +91,9 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { .maintainActionsExecutedStatistics(); } + @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { LOGGER.trace("LiveSyncTaskHandler.run starting"); // counterManager.registerCounter(task, true); @@ -182,51 +191,66 @@ public TaskRunResult run(Task task) { // It will use extension of task to store synchronization state ModelImplUtils.clearRequestee(task); - changesProcessed = provisioningService.synchronize(coords, task, opResult); + + changesProcessed = provisioningService.synchronize(coords, task, partition, opResult); } catch (ObjectNotFoundException ex) { LOGGER.error("Live Sync: A required object does not exist, OID: {}", ex.getOid()); LOGGER.error("Exception stack trace", ex); // This is bad. The resource or task or something like that does not exist. Permanent problem. opResult.recordFatalError("A required object does not exist, OID: " + ex.getOid(), ex); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + setRunResultStatus(ex, partition, CriticalityType.FATAL, runResult); return runResult; } catch (CommunicationException ex) { LOGGER.error("Live Sync: Communication error:",ex); // Error, but not critical. Just try later. opResult.recordPartialError("Communication error: "+ex.getMessage(),ex); - runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); + setRunResultStatus(ex, partition, CriticalityType.PARTIAL, runResult); return runResult; } catch (SchemaException ex) { LOGGER.error("Live Sync: Error dealing with schema:",ex); // Not sure about this. But most likely it is a misconfigured resource or connector // It may be worth to retry. Error is fatal, but may not be permanent. opResult.recordFatalError("Error dealing with schema: "+ex.getMessage(),ex); - runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); + setRunResultStatus(ex, partition, CriticalityType.PARTIAL, runResult); + return runResult; + } catch (PolicyViolationException ex) { + LOGGER.error("Live Sync: Policy violation:",ex); + // Not sure about this. But most likely it is a misconfigured resource or connector + // It may be worth to retry. Error is fatal, but may not be permanent. + opResult.recordFatalError("Live Sync: Policy violation: "+ex.getMessage(),ex); + setRunResultStatus(ex, partition, CriticalityType.PARTIAL, runResult); + return runResult; + } catch (PreconditionViolationException ex) { + LOGGER.error("Live Sync: Error dealing with schema:",ex); + // Not sure about this. But most likely it is a misconfigured resource or connector + // It may be worth to retry. Error is fatal, but may not be permanent. + opResult.recordFatalError("Error dealing with schema: "+ex.getMessage(),ex); + setRunResultStatus(ex, partition, CriticalityType.PARTIAL, runResult); return runResult; } catch (RuntimeException ex) { LOGGER.error("Live Sync: Internal Error:", ex); // Can be anything ... but we can't recover from that. // It is most likely a programming error. Does not make much sense to retry. opResult.recordFatalError("Internal Error: "+ex.getMessage(),ex); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + setRunResultStatus(ex, partition, CriticalityType.FATAL, runResult); return runResult; } catch (ConfigurationException ex) { LOGGER.error("Live Sync: Configuration error:",ex); // Not sure about this. But most likely it is a misconfigured resource or connector // It may be worth to retry. Error is fatal, but may not be permanent. opResult.recordFatalError("Configuration error: "+ex.getMessage(),ex); - runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); + setRunResultStatus(ex, partition, CriticalityType.PARTIAL, runResult); return runResult; } catch (SecurityViolationException ex) { LOGGER.error("Recompute: Security violation: {}",ex.getMessage(),ex); opResult.recordFatalError("Security violation: "+ex.getMessage(),ex); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + setRunResultStatus(ex, partition, CriticalityType.FATAL, runResult); return runResult; } catch (ExpressionEvaluationException ex) { LOGGER.error("Recompute: Expression error: {}",ex.getMessage(),ex); opResult.recordFatalError("Expression error: "+ex.getMessage(),ex); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + setRunResultStatus(ex, partition, CriticalityType.FATAL, runResult); return runResult; } @@ -238,6 +262,26 @@ public TaskRunResult run(Task task) { LOGGER.trace("LiveSyncTaskHandler.run stopping (resource {})", resourceOid); return runResult; } + + private void setRunResultStatus(Throwable ex, TaskPartitionDefinitionType partition, CriticalityType defaultCriticality, TaskRunResult runResult) { + CriticalityType criticality = null; + if (partition == null) { + criticality = defaultCriticality; + } else { + criticality = ExceptionUtil.getCriticality(partition.getErrorCriticality(), ex, defaultCriticality); + } + + switch (criticality) { + case PARTIAL: + runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); + break; + case FATAL: + runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + break; + default: + runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); + } + } @Override public Long heartbeat(Task task) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java index 5761b656eb8..80b40798bac 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java @@ -50,8 +50,10 @@ import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExecutionModeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** @@ -92,14 +94,14 @@ protected Class getType(Task task) { } @Override - protected AbstractSearchIterativeResultHandler createHandler(TaskRunResult runResult, final Task coordinatorTask, + protected AbstractSearchIterativeResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, final Task coordinatorTask, OperationResult opResult) { AbstractSearchIterativeResultHandler handler = new AbstractSearchIterativeResultHandler( coordinatorTask, RecomputeTaskHandler.class.getName(), "recompute", "recompute task", taskManager) { @Override protected boolean handleObject(PrismObject object, Task workerTask, OperationResult result) throws CommonException, PreconditionViolationException { - recompute(object, getOptions(coordinatorTask), workerTask, result); + recompute(object, getOptions(coordinatorTask), workerTask, partition, result); return true; } @@ -119,7 +121,7 @@ private ModelExecuteOptions getOptions(Task coordinatorTask) throws SchemaExcept return modelExecuteOptions; } - private void recompute(PrismObject focalObject, ModelExecuteOptions options, Task task, OperationResult result) throws SchemaException, + private void recompute(PrismObject focalObject, ModelExecuteOptions options, Task task, TaskPartitionDefinitionType partition, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ObjectAlreadyExistsException, ConfigurationException, PolicyViolationException, SecurityViolationException, PreconditionViolationException { LOGGER.trace("Recomputing object {}", focalObject); @@ -128,7 +130,12 @@ private void recompute(PrismObject focalObject, ModelExecuteOptions o if (LOGGER.isTraceEnabled()) { LOGGER.trace("Recomputing object {}: context:\n{}", focalObject, syncContext.debugDump()); } - clockwork.run(syncContext, task, result); + + if (partition != null && ExecutionModeType.SIMULATE == partition.getStage()) { + clockwork.previewChanges(syncContext, null, task, result); + } else { + clockwork.run(syncContext, task, result); + } LOGGER.trace("Recomputation of object {}: {}", focalObject, result.getStatus()); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index d0ed7116abc..56e0ed0ef61 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -69,7 +69,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.LayerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskStageType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -164,14 +164,16 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { .maintainSynchronizationStatistics() .maintainActionsExecutedStatistics(); } - + + @Override public TaskWorkBucketProcessingResult run(Task localCoordinatorTask, WorkBucketType workBucket, - TaskWorkBucketProcessingResult previousRunResult) { - -// counterManager.registerCounter(localCoordinatorTask, false); - + TaskPartitionDefinitionType partitionDefinition, TaskWorkBucketProcessingResult previousRunResult) { + String handlerUri = localCoordinatorTask.getHandlerUri(); + if (partitionDefinition != null && partitionDefinition.getHandlerUri() != null) { + handlerUri = partitionDefinition.getHandlerUri(); + } Stage stage = getStage(handlerUri); LOGGER.trace("ReconciliationTaskHandler.run starting (stage: {})", stage); ReconciliationTaskResult reconResult = new ReconciliationTaskResult(); @@ -199,28 +201,6 @@ public TaskWorkBucketProcessingResult run(Task localCoordinatorTask, WorkBucketT String resourceOid = localCoordinatorTask.getObjectOid(); opResult.addContext("resourceOid", resourceOid); - try { - - Collection> evaluatedAssignments = assignmentCollector.collect(localCoordinatorTask.getTaskPrismObject(), systemObjectCache.getSystemConfiguration(opResult), false, localCoordinatorTask, opResult); - Set evaluatedPolicyRules = new HashSet<>(); - - LOGGER.info("Evaluated assignments for task: {}", DebugUtil.debugDumpLazily(evaluatedAssignments)); - - for (EvaluatedAssignment evaluatedAssignment : evaluatedAssignments) { - LOGGER.info("Evaluated other policy rules for task: {}", DebugUtil.debugDumpLazily(evaluatedAssignment.getOtherTargetsPolicyRules())); - evaluatedPolicyRules.addAll(evaluatedAssignment.getOtherTargetsPolicyRules()); - - LOGGER.info("Evaluated focus policy rules for task: {}", DebugUtil.debugDumpLazily(evaluatedAssignment.getFocusPolicyRules())); - evaluatedPolicyRules.addAll(evaluatedAssignment.getFocusPolicyRules()); - - LOGGER.info("Evaluated this policy rules for task: {}", DebugUtil.debugDumpLazily(evaluatedAssignment.getThisTargetPolicyRules())); - evaluatedPolicyRules.addAll(evaluatedAssignment.getThisTargetPolicyRules()); - } - evaluatedPolicyRules.forEach(policyRule -> counterManager.registerCounter(localCoordinatorTask, policyRule.getPolicyRule())); - } catch (SchemaException e) { - throw new SystemException("Cannot collect task thresholds."); - } - if (localCoordinatorTask.getChannel() == null) { localCoordinatorTask.setChannel(SchemaConstants.CHANGE_CHANNEL_RECON_URI); } @@ -313,7 +293,7 @@ public TaskWorkBucketProcessingResult run(Task localCoordinatorTask, WorkBucketT long afterShadowReconTimestamp; try { if (isStage(stage, Stage.SECOND) && !performResourceReconciliation(resource, objectclassDef, reconResult, - localCoordinatorTask, workBucket, opResult)) { + localCoordinatorTask, partitionDefinition, workBucket, opResult)) { processInterruption(runResult, resource, localCoordinatorTask, opResult); return runResult; } @@ -518,39 +498,11 @@ private void processErrorPartial(TaskRunResult runResult, String errorDesc, Exce runResult.setRunResultStatus(runResultStatus); } - private boolean performResourceReconciliation(PrismObject resource, - ObjectClassComplexTypeDefinition objectclassDef, - ReconciliationTaskResult reconResult, Task localCoordinatorTask, - WorkBucketType workBucket, OperationResult result) - throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, - SecurityViolationException, ExpressionEvaluationException { - - List stages = localCoordinatorTask.getTaskType().getStage(); - if (CollectionUtils.isEmpty(stages)) { - TaskStageType defaultStage = new TaskStageType(prismContext); - defaultStage.setStage(EXECUTE_URI); - return performResourceReconciliationInternal(resource, objectclassDef, defaultStage, - reconResult, localCoordinatorTask, workBucket, result); - } - - boolean canContinue = true; - for (TaskStageType stage : stages) { - canContinue = performResourceReconciliationInternal(resource, objectclassDef, stage, - reconResult, localCoordinatorTask, workBucket, result); - if (!canContinue) { - break; - } - } - - return canContinue; - - } - // returns false in case of execution interruption - private boolean performResourceReconciliationInternal(PrismObject resource, - ObjectClassComplexTypeDefinition objectclassDef, TaskStageType stage, + private boolean performResourceReconciliation(PrismObject resource, + ObjectClassComplexTypeDefinition objectclassDef, ReconciliationTaskResult reconResult, Task localCoordinatorTask, - WorkBucketType workBucket, OperationResult result) + TaskPartitionDefinitionType partitionDefinition, WorkBucketType workBucket, OperationResult result) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { @@ -561,7 +513,7 @@ private boolean performResourceReconciliationInternal(PrismObject // Instantiate result handler. This will be called with every search // result in the following iterative search SynchronizeAccountResultHandler handler = new SynchronizeAccountResultHandler(resource.asObjectable(), - objectclassDef, "reconciliation", localCoordinatorTask, changeNotificationDispatcher, stage, taskManager); + objectclassDef, "reconciliation", localCoordinatorTask, changeNotificationDispatcher, partitionDefinition, taskManager); handler.setSourceChannel(SchemaConstants.CHANGE_CHANNEL_RECON); handler.setStopOnError(false); handler.setEnableSynchronizationStatistics(true); @@ -573,7 +525,7 @@ private boolean performResourceReconciliationInternal(PrismObject ObjectQuery query = objectclassDef.createShadowSearchQuery(resource.getOid()); query = narrowQueryForBucket(query, localCoordinatorTask, workBucket, objectclassDef, opResult); - + OperationResult searchResult = new OperationResult(OperationConstants.RECONCILIATION+".searchIterative"); handler.createWorkerThreads(localCoordinatorTask, searchResult); @@ -849,4 +801,5 @@ public void refreshStatus(Task task) { public String getCategoryName(Task task) { return TaskCategory.RECONCILIATION; } + } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java index 2bfc02eb46d..f924e64a5f1 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizeAccountResultHandler.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.provisioning.api.ResourceObjectChangeListener; import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; import com.evolveum.midpoint.repo.common.task.AbstractSearchIterativeResultHandler; +import com.evolveum.midpoint.repo.common.util.RepoCommonUtils; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.result.OperationResult; @@ -34,10 +35,11 @@ import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExecutionModeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskStageType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; /** * Iterative search result handler for account synchronization. Works both for @@ -67,7 +69,7 @@ public class SynchronizeAccountResultHandler extends AbstractSearchIterativeResu public SynchronizeAccountResultHandler(ResourceType resource, ObjectClassComplexTypeDefinition objectClassDef, String processShortName, Task coordinatorTask, ResourceObjectChangeListener objectChangeListener, - TaskStageType stageType, TaskManager taskManager) { + TaskPartitionDefinitionType stageType, TaskManager taskManager) { super(coordinatorTask, SynchronizeAccountResultHandler.class.getName(), processShortName, "from "+resource, stageType, taskManager); this.objectChangeListener = objectChangeListener; this.resourceReadOnly = resource; @@ -125,7 +127,7 @@ protected boolean handleObject(PrismObject accountShadow, Task worke boolean rv = handleObjectInternal(accountShadow, workerTask, result); result.computeStatusIfUnknown(); if (result.isError()) { - workerTask.recordIterativeOperationEnd(accountShadow.asObjectable(), started, getException(result)); + workerTask.recordIterativeOperationEnd(accountShadow.asObjectable(), started, RepoCommonUtils.getResultException(result)); } else { workerTask.recordIterativeOperationEnd(accountShadow.asObjectable(), started, null); } @@ -168,7 +170,7 @@ protected boolean handleObjectInternal(PrismObject accountShadow, Ta ResourceObjectShadowChangeDescription change = new ResourceObjectShadowChangeDescription(); change.setSourceChannel(QNameUtil.qNameToUri(sourceChannel)); change.setResource(getResourceWorkingCopy().asPrismObject()); - if (getStageType() != null && ReconciliationTaskHandler.SIMULATE_URI.equals(getStageType().getStage())) { + if (getStageType() != null && ExecutionModeType.SIMULATE == getStageType().getStage()) { change.setSimulate(true); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java index 1d03f6496b5..38986a0a308 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/TriggerScannerTaskHandler.java @@ -36,6 +36,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType; import org.apache.commons.lang3.Validate; import org.springframework.beans.factory.annotation.Autowired; @@ -132,7 +133,7 @@ protected void finish(AbstractScannerResultHandler handler, TaskRunR } @Override - protected AbstractScannerResultHandler createHandler(TaskRunResult runResult, final Task coordinatorTask, + protected AbstractScannerResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, final Task coordinatorTask, OperationResult opResult) { AbstractScannerResultHandler handler = new AbstractScannerResultHandler( diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AuditReindexTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AuditReindexTaskHandler.java index 94843da4ab1..1928fe47cd8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AuditReindexTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AuditReindexTaskHandler.java @@ -14,6 +14,8 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -48,7 +50,7 @@ private void initialize() { } @Override - public TaskRunResult run(Task coordinatorTask) { + public TaskRunResult run(Task coordinatorTask, TaskPartitionDefinitionType partition) { OperationResult opResult = new OperationResult(OperationConstants.AUDIT_REINDEX + ".run"); opResult.setStatus(OperationResultStatus.IN_PROGRESS); TaskRunResult runResult = new TaskRunResult(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java index 7a32ea12e69..58f1960ad6a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java @@ -59,6 +59,7 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import static org.apache.commons.lang3.BooleanUtils.isTrue; @@ -92,7 +93,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { return runInternal(task); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java index 99c103de200..dbb86fd899e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java @@ -600,26 +600,26 @@ public static boolean isDryRun(Task task) throws SchemaException { return dryRun != null ? dryRun : Boolean.FALSE; } - public static boolean canPerformStage(String stageUri, Task task) throws SchemaException { - PrismObject taskType = task.getTaskPrismObject(); - PrismProperty stageType = taskType.findProperty(ItemPath.create(TaskType.F_STAGE, TaskStageType.F_STAGE)); - if (stageType == null) { - return false; - } - - String stageTypeRealValue = stageType.getRealValue(); - return stageUri.equals(stageTypeRealValue); - } - - public static String getStageUri(Task task) { - PrismObject taskType = task.getTaskPrismObject(); - PrismProperty stageType = taskType.findProperty(ItemPath.create(TaskType.F_STAGE, TaskStageType.F_STAGE)); - if (stageType == null) { - return ModelPublicConstants.RECONCILIATION_TASK_HANDLER_URI + "#execute"; - } - - return stageType.getRealValue(); - } +// public static boolean canPerformStage(String stageUri, Task task) throws SchemaException { +// PrismObject taskType = task.getTaskPrismObject(); +// PrismProperty stageType = taskType.findProperty(ItemPath.create(TaskType.F_STAGE, TaskStageType.F_STAGE)); +// if (stageType == null) { +// return false; +// } +// +// String stageTypeRealValue = stageType.getRealValue(); +// return stageUri.equals(stageTypeRealValue); +// } + +// public static String getStageUri(Task task) { +// PrismObject taskType = task.getTaskPrismObject(); +// PrismProperty stageType = taskType.findProperty(ItemPath.create(TaskType.F_STAGE, TaskStageType.F_STAGE)); +// if (stageType == null) { +// return ModelPublicConstants.RECONCILIATION_TASK_HANDLER_URI + "#execute"; +// } +// +// return stageType.getRealValue(); +// } static Boolean findItemValue(Task task, QName path) throws SchemaException{ Validate.notNull(task, "Task must not be null."); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ReindexTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ReindexTaskHandler.java index 2e6ef943616..1a3a35c5d17 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ReindexTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ReindexTaskHandler.java @@ -33,6 +33,8 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @@ -69,7 +71,7 @@ private void initialize() { } @Override - protected ReindexResultHandler createHandler(TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) + protected ReindexResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) throws SchemaException, SecurityViolationException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException { securityEnforcer.authorize(AuthorizationConstants.AUTZ_ALL_URL, null, AuthorizationParameters.EMPTY, null, coordinatorTask, opResult); return new ReindexResultHandler(coordinatorTask, ReindexTaskHandler.class.getName(), diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/util/MockTaskHandler.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/util/MockTaskHandler.java index 92606a25489..890a5831820 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/util/MockTaskHandler.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/util/MockTaskHandler.java @@ -34,6 +34,7 @@ import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; /** * This task handler does nothing. Used in the tests. @@ -56,7 +57,7 @@ private void initialize() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { LOGGER.trace("MockTaskHandler.run starting"); OperationResult opResult = new OperationResult(OperationConstants.RECONCILIATION); diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index bcaa6ecbd66..5c1a71907cd 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -3323,6 +3323,69 @@ private OperationResult getSubresult(OperationResult result, boolean checkSubres } return result; } + + protected OperationResult waitForTaskResume(final String taskOid, final boolean checkSubresult, final int timeout) throws Exception { + final OperationResult waitResult = new OperationResult(AbstractIntegrationTest.class+".waitForTaskResume"); + Task origTask = taskManager.getTaskWithResult(taskOid, waitResult); + + final Long origLastRunStartTimestamp = origTask.getLastRunStartTimestamp(); + final Long origLastRunFinishTimestamp = origTask.getLastRunFinishTimestamp(); + + taskManager.resumeTask(origTask, waitResult); + + final Holder taskResultHolder = new Holder<>(); + Checker checker = new Checker() { + @Override + public boolean check() throws CommonException { + Task freshTask = taskManager.getTaskWithResult(origTask.getOid(), waitResult); + OperationResult taskResult = freshTask.getResult(); +// display("Times", longTimeToString(origLastRunStartTimestamp) + "-" + longTimeToString(origLastRunStartTimestamp) +// + " : " + longTimeToString(freshTask.getLastRunStartTimestamp()) + "-" + longTimeToString(freshTask.getLastRunFinishTimestamp())); + if (verbose) display("Check result", taskResult); + taskResultHolder.setValue(taskResult); + if (isError(taskResult, checkSubresult)) { + return true; + } + if (isUnknown(taskResult, checkSubresult)) { + return false; + } + if (freshTask.getLastRunFinishTimestamp() == null) { + return false; + } + if (freshTask.getLastRunStartTimestamp() == null) { + return false; + } + return !freshTask.getLastRunStartTimestamp().equals(origLastRunStartTimestamp) + && !freshTask.getLastRunFinishTimestamp().equals(origLastRunFinishTimestamp) + && freshTask.getLastRunStartTimestamp() < freshTask.getLastRunFinishTimestamp(); + } + @Override + public void timeout() { + try { + Task freshTask = taskManager.getTaskWithResult(origTask.getOid(), waitResult); + OperationResult result = freshTask.getResult(); + LOGGER.debug("Timed-out task:\n{}", freshTask.debugDump()); + display("Times", "origLastRunStartTimestamp="+longTimeToString(origLastRunStartTimestamp) + + ", origLastRunFinishTimestamp=" + longTimeToString(origLastRunFinishTimestamp) + + ", freshTask.getLastRunStartTimestamp()=" + longTimeToString(freshTask.getLastRunStartTimestamp()) + + ", freshTask.getLastRunFinishTimestamp()=" + longTimeToString(freshTask.getLastRunFinishTimestamp())); + assert false : "Timeout ("+timeout+") while waiting for "+freshTask+" next run. Last result "+result; + } catch (ObjectNotFoundException | SchemaException e) { + LOGGER.error("Exception during task refresh: {}", e, e); + } + } + }; + IntegrationTestTools.waitFor("Waiting for task " + origTask + " resume", checker, timeout, DEFAULT_TASK_SLEEP_TIME); + + Task freshTask = taskManager.getTaskWithResult(origTask.getOid(), waitResult); + LOGGER.debug("Final task:\n{}", freshTask.debugDump()); + display("Times", "origLastRunStartTimestamp="+longTimeToString(origLastRunStartTimestamp) + + ", origLastRunFinishTimestamp=" + longTimeToString(origLastRunFinishTimestamp) + + ", freshTask.getLastRunStartTimestamp()=" + longTimeToString(freshTask.getLastRunStartTimestamp()) + + ", freshTask.getLastRunFinishTimestamp()=" + longTimeToString(freshTask.getLastRunFinishTimestamp())); + + return taskResultHolder.getValue(); + } protected void restartTask(String taskOid) throws CommonException { diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java index 66002b35be6..d87193c078e 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java @@ -102,6 +102,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportParameterType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ReportType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SubreportType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import net.sf.jasperreports.engine.JRParameter; import net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer; @@ -144,7 +145,7 @@ private void initialize() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { // TODO Auto-generated method stub OperationResult parentResult = task.getResult(); OperationResult result = parentResult.createSubresult(ReportCreateTaskHandler.class.getSimpleName() + ".run"); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareChildOperationTaskHandler.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareChildOperationTaskHandler.java index b33f84d9a8c..f8c591ca39d 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareChildOperationTaskHandler.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareChildOperationTaskHandler.java @@ -35,6 +35,8 @@ import com.evolveum.midpoint.wf.impl.tasks.WfTaskUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -73,7 +75,7 @@ public void init() { //region Body @SuppressWarnings("unchecked") @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { TaskRunResult.TaskRunResultStatus status = TaskRunResult.TaskRunResultStatus.FINISHED; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareRootOperationTaskHandler.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareRootOperationTaskHandler.java index d84487dc516..f51b11fc5af 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareRootOperationTaskHandler.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPrepareRootOperationTaskHandler.java @@ -34,6 +34,8 @@ import com.evolveum.midpoint.wf.impl.tasks.WfTaskUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -70,7 +72,7 @@ public void init() { //region run method @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { TaskRunResultStatus status = TaskRunResultStatus.FINISHED; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPropagateTaskObjectReferenceTaskHandler.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPropagateTaskObjectReferenceTaskHandler.java index fd5ff64f8aa..fd57e52b769 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPropagateTaskObjectReferenceTaskHandler.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/WfPropagateTaskObjectReferenceTaskHandler.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.wf.impl.tasks.WfTaskController; import com.evolveum.midpoint.wf.impl.tasks.WfTaskUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -76,7 +77,7 @@ public void init() { //region Body @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { TaskRunResult.TaskRunResultStatus status = TaskRunResult.TaskRunResultStatus.FINISHED; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfProcessInstanceShadowTaskHandler.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfProcessInstanceShadowTaskHandler.java index 99669ce7010..d4bd9332e0d 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfProcessInstanceShadowTaskHandler.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfProcessInstanceShadowTaskHandler.java @@ -28,6 +28,8 @@ import com.evolveum.midpoint.wf.impl.WfConfiguration; import com.evolveum.midpoint.wf.impl.activiti.ActivitiInterface; import com.evolveum.midpoint.wf.impl.messages.QueryProcessCommand; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.DependsOn; @@ -87,7 +89,7 @@ public void init() { * */ @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { OperationResult taskResult = WfTaskUtil.getResult(task); diff --git a/provisioning/provisioning-api/pom.xml b/provisioning/provisioning-api/pom.xml index c118c9802b1..eb2362afba5 100644 --- a/provisioning/provisioning-api/pom.xml +++ b/provisioning/provisioning-api/pom.xml @@ -43,6 +43,11 @@ prism-api 4.0-SNAPSHOT + + com.evolveum.midpoint.repo + repo-api + 4.0-SNAPSHOT + diff --git a/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java b/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java index e24129d4c38..c537de0d20b 100644 --- a/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java +++ b/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ProvisioningService.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.ProvisioningDiag; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; @@ -56,6 +57,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvisioningScriptType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; /** *

Provisioning Service Interface.

@@ -197,8 +199,8 @@ String addObject(PrismObject object, OperationProvisio * @throws GenericConnectorException * unknown connector framework error */ - int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, OperationResult parentResult) throws ObjectNotFoundException, - CommunicationException, SchemaException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException; + int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, TaskPartitionDefinitionType taskPartition, OperationResult parentResult) throws ObjectNotFoundException, + CommunicationException, SchemaException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException, PolicyViolationException, PreconditionViolationException; /** diff --git a/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ResourceEventListener.java b/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ResourceEventListener.java index 73b19fd2ea2..fc415ace0d9 100644 --- a/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ResourceEventListener.java +++ b/provisioning/provisioning-api/src/main/java/com/evolveum/midpoint/provisioning/api/ResourceEventListener.java @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.provisioning.api; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -22,11 +23,13 @@ import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.PolicyViolationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; public interface ResourceEventListener extends ProvisioningListener { - public void notifyEvent(ResourceEventDescription eventDescription, Task task, OperationResult parentResult) throws SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ObjectNotFoundException, GenericConnectorException, ObjectAlreadyExistsException, ExpressionEvaluationException; - + public void notifyEvent(ResourceEventDescription eventDescription, Task task, OperationResult parentResult) throws SchemaException, CommunicationException, ConfigurationException, + SecurityViolationException, ObjectNotFoundException, GenericConnectorException, ObjectAlreadyExistsException, + ExpressionEvaluationException, PolicyViolationException, PreconditionViolationException; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java index 09286f75933..6055ef698ee 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ChangeNotificationDispatcherImpl.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.provisioning.api.ResourceObjectShadowChangeDescription; import com.evolveum.midpoint.provisioning.api.ResourceOperationDescription; import com.evolveum.midpoint.provisioning.api.ResourceOperationListener; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; @@ -37,6 +38,7 @@ import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.PolicyViolationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; @@ -269,7 +271,7 @@ public void notifyEvent(ResourceEventDescription eventDescription, Task task, OperationResult parentResult) throws SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ObjectNotFoundException, - GenericConnectorException, ObjectAlreadyExistsException, ExpressionEvaluationException { + GenericConnectorException, ObjectAlreadyExistsException, ExpressionEvaluationException, PolicyViolationException, PreconditionViolationException { Validate.notNull(eventDescription, "Event description must not be null."); if (LOGGER.isTraceEnabled()) { diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java index 1a10800952c..b2b4365d027 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ProvisioningServiceImpl.java @@ -53,6 +53,7 @@ import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.provisioning.ucf.api.GenericFrameworkException; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.repo.api.RepoAddOptions; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; @@ -92,6 +93,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ProvisioningScriptType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; /** * Implementation of provisioning service. @@ -330,8 +332,8 @@ public String addObject(PrismObject object, OperationP @SuppressWarnings("rawtypes") @Override - public int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, OperationResult parentResult) throws ObjectNotFoundException, - CommunicationException, SchemaException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { + public int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, TaskPartitionDefinitionType taskPartition, OperationResult parentResult) throws ObjectNotFoundException, + CommunicationException, SchemaException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException, PolicyViolationException, PreconditionViolationException { Validate.notNull(shadowCoordinates, "Coordinates oid must not be null."); String resourceOid = shadowCoordinates.getResourceOid(); @@ -349,7 +351,7 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, // Resolve resource PrismObject resource = getObject(ResourceType.class, resourceOid, null, task, result); ResourceType resourceType = resource.asObjectable(); - + LOGGER.trace("Start synchronization of resource {} ", resourceType); // getting token form task @@ -359,20 +361,23 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, Task task, SchemaDebugUtil.prettyPrint(tokenProperty)); } - processedChanges = shadowCache.synchronize(shadowCoordinates, tokenProperty, task, result); + processedChanges = shadowCache.synchronize(shadowCoordinates, tokenProperty, task, taskPartition, result); LOGGER.debug("Synchronization of {} done, token {}, {} changes", resource, tokenProperty, processedChanges); } catch (ObjectNotFoundException | CommunicationException | SchemaException | SecurityViolationException | ConfigurationException | ExpressionEvaluationException | RuntimeException | Error e) { ProvisioningUtil.recordFatalError(LOGGER, result, null, e); + result.summarize(true); throw e; } catch (ObjectAlreadyExistsException | EncryptionException e) { ProvisioningUtil.recordFatalError(LOGGER, result, null, e); + result.summarize(true); throw new SystemException(e); } catch (GenericFrameworkException e) { ProvisioningUtil.recordFatalError(LOGGER, result, "Synchronization error: generic connector framework error: " + e.getMessage(), e); + result.summarize(true); throw new GenericConnectorException(e.getMessage(), e); - } + } result.recordSuccess(); result.cleanupResult(); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceEventListenerImpl.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceEventListenerImpl.java index d957dc6b8fa..f6152560d1a 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceEventListenerImpl.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceEventListenerImpl.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.provisioning.api.ResourceEventDescription; import com.evolveum.midpoint.provisioning.api.ResourceEventListener; import com.evolveum.midpoint.provisioning.ucf.api.Change; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.result.OperationResult; @@ -43,6 +44,7 @@ import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.PolicyViolationException; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.exception.SystemException; @@ -77,7 +79,9 @@ public String getName() { } @Override - public void notifyEvent(ResourceEventDescription eventDescription, Task task, OperationResult parentResult) throws SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ObjectNotFoundException, GenericConnectorException, ObjectAlreadyExistsException, ExpressionEvaluationException { + public void notifyEvent(ResourceEventDescription eventDescription, Task task, OperationResult parentResult) throws SchemaException, CommunicationException, ConfigurationException, + SecurityViolationException, ObjectNotFoundException, GenericConnectorException, ObjectAlreadyExistsException, + ExpressionEvaluationException, PolicyViolationException, PreconditionViolationException { Validate.notNull(eventDescription, "Event description must not be null."); Validate.notNull(task, "Task must not be null."); @@ -113,7 +117,7 @@ public void notifyEvent(ResourceEventDescription eventDescription, Task task, Op } LOGGER.trace("Change after processing {} . Start synchronizing.", change.toString()); - shadowCache.processSynchronization(ctx, change, parentResult); + shadowCache.processSynchronization(ctx, false, change, task, null, parentResult); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index a6f390dee95..8491890b51d 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -36,7 +36,9 @@ import com.evolveum.midpoint.provisioning.ucf.api.ConnectorOperationOptions; import com.evolveum.midpoint.provisioning.ucf.api.GenericFrameworkException; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.repo.common.util.RepoCommonUtils; import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalCounters; @@ -48,6 +50,7 @@ import com.evolveum.midpoint.schema.result.AsynchronousOperationReturnValue; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; +import com.evolveum.midpoint.schema.util.ExceptionUtil; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; @@ -2329,13 +2332,17 @@ public boolean handle(PrismObject shadow, OperationResult objResult) /////////////////////////////////////////////////////////////////////////// public int synchronize(ResourceShadowDiscriminator shadowCoordinates, PrismProperty lastToken, - Task task, OperationResult parentResult) throws ObjectNotFoundException, CommunicationException, + Task task, TaskPartitionDefinitionType partition, OperationResult parentResult) throws ObjectNotFoundException, CommunicationException, GenericFrameworkException, SchemaException, ConfigurationException, - SecurityViolationException, ObjectAlreadyExistsException, ExpressionEvaluationException, EncryptionException { + SecurityViolationException, ObjectAlreadyExistsException, ExpressionEvaluationException, EncryptionException, PolicyViolationException, PreconditionViolationException { InternalMonitor.recordCount(InternalCounters.PROVISIONING_ALL_EXT_OPERATION_COUNT); final ProvisioningContext ctx = ctxFactory.create(shadowCoordinates, task, parentResult); + boolean isSimulate = false; + if (partition != null && ExecutionModeType.SIMULATE == partition.getStage()) { + isSimulate = true; + } List changes; try { @@ -2350,7 +2357,9 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, PrismPrope if (change.isTokenOnly()) { LOGGER.trace("Found token-only change: {}", change); - task.setExtensionProperty(change.getToken()); + if (!isSimulate) { + task.setExtensionProperty(change.getToken()); + } continue; } @@ -2396,20 +2405,23 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, PrismPrope "Skipping processing change. Can't find appropriate shadow (e.g. the object was deleted on the resource meantime)."); continue; } - boolean isSuccess = processSynchronization(shadowCtx, change, parentResult); - - boolean retryUnhandledError = true; - if (task.getExtension() != null) { - PrismProperty tokenRetryUnhandledErrProperty = task.getExtensionProperty(SchemaConstants.SYNC_TOKEN_RETRY_UNHANDLED); - - if (tokenRetryUnhandledErrProperty != null) { - retryUnhandledError = (boolean) tokenRetryUnhandledErrProperty.getRealValue(); - } - } - - if (!retryUnhandledError || isSuccess) { - // get updated token from change, create property modification from new token and replace old token with the new one - task.setExtensionProperty(change.getToken()); + boolean isSuccess = processSynchronization(shadowCtx, isSimulate, change, task, partition, parentResult); + + boolean retryUnhandledError = true; + if (task.getExtension() != null) { + PrismProperty tokenRetryUnhandledErrProperty = task + .getExtensionProperty(SchemaConstants.SYNC_TOKEN_RETRY_UNHANDLED); + + if (tokenRetryUnhandledErrProperty != null) { + retryUnhandledError = (boolean) tokenRetryUnhandledErrProperty.getRealValue(); + } + } + + if (!retryUnhandledError || isSuccess) { + if (!isSimulate) { + // get updated token from change, create property modification from new token and replace old token with the new one + task.setExtensionProperty(change.getToken()); + } processedChanges++; task.incrementProgressAndStoreStatsIfNeeded(); } @@ -2431,9 +2443,9 @@ public int synchronize(ResourceShadowDiscriminator shadowCoordinates, PrismPrope } @SuppressWarnings("rawtypes") - boolean processSynchronization(ProvisioningContext ctx, Change change, OperationResult parentResult) + boolean processSynchronization(ProvisioningContext ctx, boolean isSimulate, Change change, Task task, TaskPartitionDefinitionType partition, OperationResult parentResult) throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException, - CommunicationException, ConfigurationException, ExpressionEvaluationException { + CommunicationException, ConfigurationException, ExpressionEvaluationException, SecurityViolationException, PolicyViolationException, PreconditionViolationException { OperationResult result = parentResult.createSubresult(OP_PROCESS_SYNCHRONIZATION); @@ -2441,18 +2453,19 @@ boolean processSynchronization(ProvisioningContext ctx, Change change, Operation try { ResourceObjectShadowChangeDescription shadowChangeDescription = createResourceShadowChangeDescription( change, ctx.getResource(), ctx.getChannel()); + shadowChangeDescription.setSimulate(isSimulate); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Created resource object shadow change description {}", SchemaDebugUtil.prettyPrint(shadowChangeDescription)); } - OperationResult notifyChangeResult = new OperationResult( - ShadowCache.class.getName() + "notifyChange"); + OperationResult notifyChangeResult = result.createMinorSubresult( + ShadowCache.class.getName() + ".notifyChange"); notifyChangeResult.addParam("resourceObjectShadowChangeDescription", shadowChangeDescription.toString()); try { notifyResourceObjectChangeListeners(shadowChangeDescription, ctx.getTask(), notifyChangeResult); - notifyChangeResult.recordSuccess(); + notifyChangeResult.computeStatusIfUnknown(); } catch (RuntimeException ex) { // recordFatalError(LOGGER, notifyChangeResult, "Synchronization // error: " + ex.getMessage(), ex); @@ -2482,15 +2495,29 @@ boolean processSynchronization(ProvisioningContext ctx, Change change, Operation result.computeStatus(); } + validateResult(notifyChangeResult, task, partition); + } catch (SchemaException | ObjectNotFoundException | ObjectAlreadyExistsException | CommunicationException | ConfigurationException | ExpressionEvaluationException | RuntimeException | Error e) { result.recordFatalError(e); throw e; } + return successfull; } + private void validateResult(OperationResult result, Task task, TaskPartitionDefinitionType partition) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, SecurityViolationException, PolicyViolationException, ExpressionEvaluationException, ObjectAlreadyExistsException, PreconditionViolationException { + + if (result.isSuccess() || result.isHandledError()) { + return; + } + + Throwable ex = RepoCommonUtils.getResultException(result); + CriticalityType criticality = ExceptionUtil.getCriticality(partition.getErrorCriticality(), ex, CriticalityType.PARTIAL); + RepoCommonUtils.processErrorCriticality(task.getTaskType(), criticality, ex, result); + } + private void notifyResourceObjectChangeListeners(ResourceObjectShadowChangeDescription change, Task task, OperationResult parentResult) { changeNotificationDispatcher.notifyChange(change, task, parentResult); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/MultiPropagationTaskHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/MultiPropagationTaskHandler.java index 745e3d6084e..c5dfd6a3cde 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/MultiPropagationTaskHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/MultiPropagationTaskHandler.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; /** * Task handler for provisioning propagation of many resources. @@ -74,7 +75,7 @@ private void initialize() { } @Override - protected MultiPropagationResultHandler createHandler(TaskRunResult runResult, Task coordinatorTask, + protected MultiPropagationResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { MultiPropagationResultHandler handler = new MultiPropagationResultHandler(coordinatorTask, getTaskOperationPrefix(), taskManager, repositoryService, shadowCache); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationResultHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationResultHandler.java index 7bf22683dfd..3ee81c9056d 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationResultHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationResultHandler.java @@ -30,7 +30,7 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskStageType; + /** * @author semancik diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationTaskHandler.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationTaskHandler.java index 4428c74dfac..f823db4422f 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationTaskHandler.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/task/PropagationTaskHandler.java @@ -45,6 +45,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; /** * Task handler for provisioning propagation of one resource. @@ -82,7 +83,7 @@ private void initialize() { } @Override - protected PropagationResultHandler createHandler(TaskRunResult runResult, Task coordinatorTask, + protected PropagationResultHandler createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) { String resourceOid = coordinatorTask.getObjectOid(); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java index 73f8c4f0e9d..6359cf6e1cd 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java @@ -3980,7 +3980,7 @@ public void test800LiveSyncInit() throws Exception { // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN result.computeStatus(); @@ -4021,7 +4021,7 @@ public void test801LiveSyncAddBlackbeard() throws Exception { // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN result.computeStatus(); @@ -4084,7 +4084,7 @@ public void test802LiveSyncModifyBlackbeard() throws Exception { // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN result.computeStatus(); @@ -4248,7 +4248,7 @@ public void testLiveSyncAddDrake(final String TEST_NAME, DummySyncStyle syncStyl // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN displayThen(TEST_NAME); @@ -4320,7 +4320,7 @@ public void testLiveSyncModifyDrake(final String TEST_NAME, DummySyncStyle syncS // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN displayThen(TEST_NAME); @@ -4381,7 +4381,7 @@ public void testLiveSyncAddCorsairs(final String TEST_NAME, DummySyncStyle syncS // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN displayThen(TEST_NAME); @@ -4458,7 +4458,7 @@ public void testLiveSyncDeleteCorsairs(final String TEST_NAME, DummySyncStyle sy // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN displayThen(TEST_NAME); @@ -4526,7 +4526,7 @@ public void testLiveSyncDeleteDrake(final String TEST_NAME, DummySyncStyle syncS // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN displayThen(TEST_NAME); @@ -4582,7 +4582,7 @@ public void test890LiveSyncModifyProtectedAccount() throws Exception { // WHEN displayWhen(TEST_NAME); - provisioningService.synchronize(coords, syncTokenTask, result); + provisioningService.synchronize(coords, syncTokenTask, null, result); // THEN displayThen(TEST_NAME); diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java index 7f47f1881ea..2c3bb853163 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestOpenDjNegative.java @@ -430,7 +430,7 @@ public void test190Synchronize() throws Exception { try { - provisioningService.synchronize(coords, task, result); + provisioningService.synchronize(coords, task, null, result); AssertJUnit.fail("addObject succeeded unexpectedly"); } catch (CommunicationException e) { @@ -763,7 +763,7 @@ public void test590Synchronize() throws Exception { try { provisioningService.synchronize(coords, - task, result); + task, null, result); AssertJUnit.fail("addObject succeeded unexpectedly"); } catch (CommunicationException e) { diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java index 7890037e09a..e0f9eb98fcf 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/opendj/TestSynchronization.java @@ -167,7 +167,7 @@ public void test100SyncAddWill() throws Exception { // WHEN provisioningService.synchronize(coords, - syncTask, result); + syncTask, null, result); // THEN SynchronizationServiceMock mock = (SynchronizationServiceMock) syncServiceMock; @@ -229,7 +229,7 @@ public void test500SyncAddProtected() throws Exception { // WHEN provisioningService.synchronize(coords, - syncTask, result); + syncTask, null, result); // THEN SynchronizationServiceMock mock = (SynchronizationServiceMock) syncServiceMock; diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java index dac24882d71..057f778aa6f 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/RepositoryService.java @@ -18,19 +18,38 @@ import java.util.Collection; import java.util.List; +import javax.xml.namespace.QName; + +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator; -import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RepositoryDiag; +import com.evolveum.midpoint.schema.RepositoryQueryDiagRequest; +import com.evolveum.midpoint.schema.RepositoryQueryDiagResponse; +import com.evolveum.midpoint.schema.ResultHandler; +import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.SearchResultMetadata; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.util.exception.*; +import com.evolveum.midpoint.util.exception.CommunicationException; +import com.evolveum.midpoint.util.exception.ConfigurationException; +import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; +import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.jetbrains.annotations.NotNull; - -import javax.xml.namespace.QName; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FullTextSearchConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSelectorType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** *

Identity Repository Interface.

diff --git a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/VersionPrecondition.java b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/VersionPrecondition.java index 14bd13f8824..713acd2e736 100644 --- a/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/VersionPrecondition.java +++ b/repo/repo-api/src/main/java/com/evolveum/midpoint/repo/api/VersionPrecondition.java @@ -16,11 +16,12 @@ package com.evolveum.midpoint.repo.api; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import java.io.Serializable; + import org.jetbrains.annotations.NotNull; -import java.io.Serializable; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; /** * @author mederly diff --git a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java index 0c1bb3e760a..ceb63052795 100644 --- a/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java +++ b/repo/repo-cache/src/main/java/com/evolveum/midpoint/repo/cache/RepositoryCache.java @@ -15,15 +15,47 @@ */ package com.evolveum.midpoint.repo.cache; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.PostConstruct; +import javax.xml.namespace.QName; + +import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.repo.api.*; +import com.evolveum.midpoint.repo.api.CacheDispatcher; +import com.evolveum.midpoint.repo.api.ConflictWatcher; +import com.evolveum.midpoint.repo.api.ModificationPrecondition; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; +import com.evolveum.midpoint.repo.api.RepoAddOptions; +import com.evolveum.midpoint.repo.api.RepoModifyOptions; +import com.evolveum.midpoint.repo.api.RepositoryPerformanceMonitor; +import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator; -import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RepositoryDiag; +import com.evolveum.midpoint.schema.RepositoryQueryDiagRequest; +import com.evolveum.midpoint.schema.RepositoryQueryDiagResponse; +import com.evolveum.midpoint.schema.ResultHandler; +import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.SearchResultMetadata; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.DiagnosticContextHolder; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -35,18 +67,19 @@ import com.evolveum.midpoint.util.exception.SecurityViolationException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.apache.commons.lang.Validate; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.xml.namespace.QName; -import java.util.*; -import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FullTextSearchConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSelectorType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectTemplateType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SecurityPolicyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SequenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ValuePolicyType; /** * Read-through write-through per-session repository cache. diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterManager.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterManager.java index 3ee05095c6b..39728747aa4 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterManager.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/CounterManager.java @@ -15,7 +15,9 @@ */ package com.evolveum.midpoint.repo.common; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import javax.xml.datatype.Duration; @@ -43,53 +45,27 @@ public class CounterManager { private static final Trace LOGGER = TraceManager.getTrace(CounterManager.class); -// private Map countersMapOld = new ConcurrentHashMap<>(); -// private Map countersMap = new ConcurrentHashMap<>(); -// -// public synchronized void registerCounter(Task task, boolean timeCounter) { -// CounterSepcification counterSpec = countersMapOld.get(task.getOid()); -// if (counterSpec == null) { -// counterSpec = new CounterSepcification(); -// counterSpec.setCounterStart(clock.currentTimeMillis()); -// countersMapOld.put(task.getOid(), counterSpec); -// return; -// } -// -// if (timeCounter) { -// long currentInMillis = clock.currentTimeMillis(); -// long start = counterSpec.getCounterStart(); -// if (start + 3600 * 1000 < currentInMillis) { -// counterSpec = new CounterSepcification(); -// counterSpec.setCounterStart(clock.currentTimeMillis()); -// countersMapOld.replace(task.getOid(), counterSpec); -// } -// return; -// } -// -// counterSpec = new CounterSepcification(); -// counterSpec.setCounterStart(clock.currentTimeMillis()); -// countersMapOld.replace(task.getOid(), counterSpec); -// } - public synchronized void registerCounter(Task task, PolicyRuleType policyRule) { + public synchronized CounterSepcification registerCounter(Task task, String policyRuleId, PolicyRuleType policyRule) { if (task.getOid() == null) { LOGGER.trace("Not persistent task, skipping registering counter."); - return; + return null; } - CounterKey key = new CounterKey(task.getOid(), policyRule); + CounterKey key = new CounterKey(task.getOid(), policyRuleId); CounterSepcification counterSpec = countersMap.get(key); if (counterSpec == null) { - initCleanCounter(policyRule, task); - return; + return initCleanCounter(key, policyRule); } if (isResetCounter(counterSpec)) { - refreshCounter(key, counterSpec); + return refreshCounter(key, counterSpec); } + throw new IllegalStateException("Cannot register counter."); + } private boolean isResetCounter(CounterSepcification counterSpec) { @@ -102,10 +78,10 @@ private boolean isResetCounter(CounterSepcification counterSpec) { TimeIntervalType timeInterval = threshold.getTimeInterval(); if (timeInterval == null) { - return true; + return false; } if (timeInterval.getInterval() == null) { - return true; + return false; } Duration interval = timeInterval.getInterval(); @@ -113,37 +89,65 @@ private boolean isResetCounter(CounterSepcification counterSpec) { } - private CounterSepcification initCleanCounter(PolicyRuleType policyRule, Task task) { + public void cleanupCounters(String taskOid) { + Set keys = countersMap.keySet(); + + Set counersToRemove = new HashSet<>(); + for (CounterKey key : keys) { + if (taskOid.equals(key.oid)) { + counersToRemove.add(key); + } + } + + for (CounterKey counterToRemove : counersToRemove) { + countersMap.remove(counterToRemove); + } + } + + private CounterSepcification initCleanCounter(CounterKey key, PolicyRuleType policyRule) { CounterSepcification counterSpec = new CounterSepcification(); counterSpec.setCounterStart(clock.currentTimeMillis()); counterSpec.setPolicyThreshold(policyRule.getPolicyThreshold()); - countersMap.put(new CounterKey(task.getOid(), policyRule), counterSpec); + countersMap.put(key, counterSpec); return counterSpec; } - private void refreshCounter(CounterKey key, CounterSepcification counterSpec) { + private CounterSepcification refreshCounter(CounterKey key, CounterSepcification counterSpec) { counterSpec.reset(clock.currentTimeMillis()); countersMap.replace(key, counterSpec); + return counterSpec; } - public CounterSepcification getCounterSpec(Task task, PolicyRuleType policyRule) { + public CounterSepcification getCounterSpec(Task task, String policyRuleId, PolicyRuleType policyRule) { if (task.getOid() == null) { LOGGER.trace("Cannot get counter spec for task without oid"); return null; } LOGGER.trace("Getting counter spec for {} and {}", task, policyRule); - return countersMap.get(new CounterKey(task.getOid(), policyRule)); + CounterKey key = new CounterKey(task.getOid(), policyRuleId); + CounterSepcification counterSpec = countersMap.get(key); + + if (counterSpec == null) { + return registerCounter(task, policyRuleId, policyRule); + } + + if (isResetCounter(counterSpec)) { + counterSpec = refreshCounter(key, counterSpec); + } + + + return counterSpec; } class CounterKey { private String oid; - private PolicyRuleType policyRule; + private String policyRuleId; - public CounterKey(String oid, PolicyRuleType policyRule) { + public CounterKey(String oid, String policyRuleId) { this.oid = oid; - this.policyRule = policyRule; + this.policyRuleId = policyRuleId; } @Override @@ -155,16 +159,16 @@ public boolean equals(Object o) { CounterKey cacheKey = (CounterKey) o; - if (policyRule != null ? !policyRule.equals(cacheKey.policyRule) : cacheKey.policyRule != null) + if (policyRuleId != null ? !policyRuleId.equals(cacheKey.policyRuleId) : cacheKey.policyRuleId != null) return false; return oid != null ? oid.equals(cacheKey.oid) : cacheKey.oid == null; } @Override public int hashCode() { - int result = policyRule != null ? policyRule.hashCode() : 0; + int result = policyRuleId != null ? policyRuleId.hashCode() : 0; result = 31 * result + (oid != null ? oid.hashCode() : 0); - LOGGER.trace("hashCode {} for {}{}", result, oid, policyRule); + LOGGER.trace("hashCode {} for {}{}", result, oid, policyRuleId); return result; } } diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java index 181c63e66c9..347dfbbd845 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeResultHandler.java @@ -47,7 +47,7 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.CriticalityType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskStageType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import java.util.ArrayList; import java.util.List; @@ -91,7 +91,7 @@ public abstract class AbstractSearchIterativeResultHandler private List workerSpecificResults; - private TaskStageType stageType; + private TaskPartitionDefinitionType stageType; public AbstractSearchIterativeResultHandler(Task coordinatorTask, String taskOperationPrefix, String processShortName, String contextDesc, TaskManager taskManager) { @@ -99,7 +99,7 @@ public AbstractSearchIterativeResultHandler(Task coordinatorTask, String taskOpe } public AbstractSearchIterativeResultHandler(Task coordinatorTask, String taskOperationPrefix, String processShortName, - String contextDesc, TaskStageType taskStageType, TaskManager taskManager) { + String contextDesc, TaskPartitionDefinitionType taskStageType, TaskManager taskManager) { super(); this.coordinatorTask = coordinatorTask; this.taskOperationPrefix = taskOperationPrefix; @@ -360,10 +360,10 @@ private void processRequest(ProcessingRequest request, Task workerTask, Operatio // Alternative way how to indicate an error. if (isRecordIterationStatistics()) { workerTask.recordIterativeOperationEnd(objectName, objectDisplayName, - null /* TODO */, object.getOid(), startTime, getException(result)); + null /* TODO */, object.getOid(), startTime, RepoCommonUtils.getResultException(result)); } - cont = processError(object, workerTask, getException(result), result); + cont = processError(object, workerTask, RepoCommonUtils.getResultException(result), result); } else { if (isRecordIterationStatistics()) { workerTask.recordIterativeOperationEnd(objectName, objectDisplayName, @@ -439,16 +439,7 @@ protected String getDisplayName(PrismObject object) { } // TODO implement better - protected Throwable getException(OperationResult result) { - if (result.getCause() != null) { - return result.getCause(); - } else if (result.getLastSubresult().getCause() != null) { - return result.getLastSubresult().getCause(); - } else { - return new SystemException(result.getMessage()); - } - } - + // @pre: result is "error" or ex is not null private boolean processError(PrismObject object, Task task, Throwable ex, OperationResult result) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, SecurityViolationException, PolicyViolationException, ExpressionEvaluationException, ObjectAlreadyExistsException, PreconditionViolationException { int errorsCount = errors.incrementAndGet(); @@ -488,7 +479,7 @@ private boolean isStopOnError(Task task, Throwable ex, OperationResult result) t /** * @return the stageType */ - public TaskStageType getStageType() { + public TaskPartitionDefinitionType getStageType() { return stageType; } diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java index 54832ca0904..ac22ac9eb7e 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/task/AbstractSearchIterativeTaskHandler.java @@ -171,7 +171,7 @@ public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { @Override public TaskWorkBucketProcessingResult run(Task localCoordinatorTask, WorkBucketType workBucket, - TaskWorkBucketProcessingResult previousRunResult) { + TaskPartitionDefinitionType partition, TaskWorkBucketProcessingResult previousRunResult) { LOGGER.trace("{} run starting: local coordinator task {}, bucket {}, previous run result {}", taskName, localCoordinatorTask, workBucket, previousRunResult); @@ -207,7 +207,7 @@ public TaskWorkBucketProcessingResult run(Task localCoordinatorTask, WorkBucketT } try { - H resultHandler = setupHandler(runResult, localCoordinatorTask, opResult); + H resultHandler = setupHandler(partition, runResult, localCoordinatorTask, opResult); boolean cont = initializeRun(resultHandler, runResult, localCoordinatorTask, opResult); if (!cont) { @@ -433,10 +433,10 @@ private ObjectQuery prepareQuery(H resultHandler, return query; } - private H setupHandler(TaskWorkBucketProcessingResult runResult, Task localCoordinatorTask, OperationResult opResult) + private H setupHandler(TaskPartitionDefinitionType partition, TaskWorkBucketProcessingResult runResult, Task localCoordinatorTask, OperationResult opResult) throws ExitWorkBucketHandlerException { try { - H resultHandler = createHandler(runResult, localCoordinatorTask, opResult); + H resultHandler = createHandler(partition, runResult, localCoordinatorTask, opResult); if (resultHandler == null) { throw new ExitWorkBucketHandlerException(runResult); // the error should already be in the runResult } @@ -535,7 +535,7 @@ protected boolean requiresDirectRepositoryAccess(H resultHandler, TaskRunResult protected abstract Class getType(Task task); - protected abstract H createHandler(TaskRunResult runResult, Task coordinatorTask, + protected abstract H createHandler(TaskPartitionDefinitionType partition, TaskRunResult runResult, Task coordinatorTask, OperationResult opResult) throws SchemaException, SecurityViolationException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException; /** diff --git a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/util/RepoCommonUtils.java b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/util/RepoCommonUtils.java index 385b0bc3f35..39854387b29 100644 --- a/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/util/RepoCommonUtils.java +++ b/repo/repo-common/src/main/java/com/evolveum/midpoint/repo/common/util/RepoCommonUtils.java @@ -89,5 +89,15 @@ public static void throwException(Throwable e, OperationResult result) throw new SystemException(e.getMessage(), e); } } + //TODO implement better + public static Throwable getResultException(OperationResult result) { + if (result.getCause() != null) { + return result.getCause(); + } else if (result.getLastSubresult().getCause() != null) { + return result.getLastSubresult().getCause(); + } else { + return new SystemException(result.getMessage()); + } + } } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java index 60f6f7f9bbb..ce6a73fe739 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ModifyTest.java @@ -35,12 +35,6 @@ import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.*; -import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.midpoint.schema.SearchResultList; import org.hibernate.Session; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; @@ -51,6 +45,25 @@ import org.xml.sax.SAXException; import com.evolveum.midpoint.common.SynchronizationUtils; +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.Item; +import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.MutablePrismPropertyDefinition; +import com.evolveum.midpoint.prism.Objectable; +import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismReferenceDefinition; +import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.delta.ItemDeltaCollectionsUtil; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.delta.ReferenceDelta; +import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -65,6 +78,7 @@ import com.evolveum.midpoint.repo.sql.testing.SqlRepoTestUtil; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalsConfig; @@ -79,6 +93,22 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ObjectModificationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PendingOperationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowAttributesType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationDescriptionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index 98ba827c5e5..06a8ff72f96 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -16,6 +16,36 @@ package com.evolveum.midpoint.repo.sql; +import static org.apache.commons.collections4.CollectionUtils.emptyIfNull; + +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.List; +import java.util.Properties; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import javax.xml.namespace.QName; + +import org.apache.commons.lang.Validate; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.internal.SessionFactoryImpl; +import org.hibernate.jdbc.Work; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; import com.evolveum.midpoint.common.crypto.CryptoUtil; import com.evolveum.midpoint.prism.ConsistencyCheckScope; @@ -35,13 +65,32 @@ import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.repo.api.*; +import com.evolveum.midpoint.repo.api.ConflictWatcher; +import com.evolveum.midpoint.repo.api.ModificationPrecondition; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; +import com.evolveum.midpoint.repo.api.RepoAddOptions; +import com.evolveum.midpoint.repo.api.RepoModifyOptions; +import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.repo.api.SystemConfigurationChangeDispatcher; import com.evolveum.midpoint.repo.api.query.ObjectFilterExpressionEvaluator; -import com.evolveum.midpoint.repo.sql.helpers.*; +import com.evolveum.midpoint.repo.sql.helpers.BaseHelper; +import com.evolveum.midpoint.repo.sql.helpers.ObjectRetriever; +import com.evolveum.midpoint.repo.sql.helpers.ObjectUpdater; +import com.evolveum.midpoint.repo.sql.helpers.OrgClosureManager; +import com.evolveum.midpoint.repo.sql.helpers.SequenceHelper; import com.evolveum.midpoint.repo.sql.query2.matcher.DefaultMatcher; import com.evolveum.midpoint.repo.sql.query2.matcher.PolyStringMatcher; import com.evolveum.midpoint.repo.sql.query2.matcher.StringMatcher; -import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.LabeledString; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.schema.RepositoryDiag; +import com.evolveum.midpoint.schema.RepositoryQueryDiagRequest; +import com.evolveum.midpoint.schema.RepositoryQueryDiagResponse; +import com.evolveum.midpoint.schema.ResultHandler; +import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.SearchResultMetadata; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; @@ -61,30 +110,16 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FullTextSearchConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.IterationMethodType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSelectorType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import org.apache.commons.lang.Validate; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.internal.SessionFactoryImpl; -import org.hibernate.jdbc.Work; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Repository; - -import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.*; -import java.util.function.Consumer; -import java.util.function.Supplier; - -import javax.xml.namespace.QName; - -import static org.apache.commons.collections4.CollectionUtils.emptyIfNull; /** * @author lazyman diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java index d7f97225e0d..5a83d8b2601 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java @@ -16,12 +16,41 @@ package com.evolveum.midpoint.repo.sql.helpers; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.*; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import javax.persistence.PersistenceException; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; + +import org.apache.commons.lang.StringUtils; +import org.hibernate.Session; +import org.hibernate.exception.ConstraintViolationException; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismReference; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.delta.ItemDeltaCollectionsUtil; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.equivalence.EquivalenceStrategy; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.CloneUtil; -import com.evolveum.midpoint.repo.api.*; +import com.evolveum.midpoint.repo.api.ModificationPrecondition; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; +import com.evolveum.midpoint.repo.api.RepoAddOptions; +import com.evolveum.midpoint.repo.api.RepoModifyOptions; +import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sql.SerializationRelatedException; import com.evolveum.midpoint.repo.sql.SqlRepositoryConfiguration; import com.evolveum.midpoint.repo.sql.SqlRepositoryServiceImpl; @@ -33,7 +62,9 @@ import com.evolveum.midpoint.repo.sql.util.IdGeneratorResult; import com.evolveum.midpoint.repo.sql.util.PrismIdentifierGenerator; import com.evolveum.midpoint.repo.sql.util.RUtil; -import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.GetOperationOptionsBuilder; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.schema.SchemaHelper; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ExceptionUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -43,21 +74,11 @@ import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang.StringUtils; -import org.hibernate.query.Query; -import org.hibernate.Session; -import org.hibernate.exception.ConstraintViolationException; -import org.hibernate.query.NativeQuery; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - -import javax.persistence.PersistenceException; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import java.lang.reflect.Method; -import java.util.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; /** * @author lazyman, mederly diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskConstants.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskConstants.java index e0b3a56e9f7..7b8f304360f 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskConstants.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskConstants.java @@ -25,6 +25,8 @@ public class TaskConstants { public static final String WORKERS_RESTART_TASK_HANDLER_URI = "http://midpoint.evolveum.com/xml/ns/public/task/workers-restart/handler-3"; public static final String WORKERS_CREATION_TASK_HANDLER_URI = "http://midpoint.evolveum.com/xml/ns/public/task/workers-creation/handler-3"; public static final String GENERIC_PARTITIONING_TASK_HANDLER_URI = "http://midpoint.evolveum.com/xml/ns/public/task/generic-partitioning/handler-3"; + public static final String LIGHTWEIGTH_PARTITIONING_TASK_HANDLER_URI = "http://midpoint.evolveum.com/xml/ns/public/task/lightweigth-partitioning/handler-3"; + public static final String NOOP_TASK_HANDLER_URI = "http://midpoint.evolveum.com/xml/ns/public/task/noop/handler-3"; public static final String NOOP_TASK_HANDLER_URI_1 = NOOP_TASK_HANDLER_URI + "#1"; diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskHandler.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskHandler.java index 5dc1ce84323..fa72c128447 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskHandler.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskHandler.java @@ -17,6 +17,11 @@ import org.jetbrains.annotations.NotNull; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.util.annotation.Experimental; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; + import java.util.List; /** @@ -25,7 +30,12 @@ */ public interface TaskHandler { - TaskRunResult run(Task task); + default TaskRunResult run(Task task) { + return run(task); + } + + @Experimental + TaskRunResult run(Task task, TaskPartitionDefinitionType partitionDefinition); default Long heartbeat(Task task) { return null; @@ -56,4 +66,5 @@ default List getCategoryNames() { default StatisticsCollectionStrategy getStatisticsCollectionStrategy() { return new StatisticsCollectionStrategy(); } + } diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskManager.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskManager.java index b00193dcf6f..b687e5d937b 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskManager.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskManager.java @@ -15,6 +15,14 @@ */ package com.evolveum.midpoint.task.api; +import java.text.ParseException; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.function.Function; + +import org.jetbrains.annotations.NotNull; + import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -22,19 +30,21 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.repo.api.RepoAddOptions; -import com.evolveum.midpoint.schema.*; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.ResultHandler; +import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.SearchResultMetadata; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.jetbrains.annotations.NotNull; - -import java.text.ParseException; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.function.Function; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SchedulerInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; /** *

Task Manager Interface.

diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/WorkBucketAwareTaskHandler.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/WorkBucketAwareTaskHandler.java index 17240a6628f..d668d623848 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/WorkBucketAwareTaskHandler.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/WorkBucketAwareTaskHandler.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.task.api; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; /** @@ -27,8 +28,15 @@ public interface WorkBucketAwareTaskHandler extends TaskHandler { default TaskRunResult run(Task task) { throw new UnsupportedOperationException("run with no work bucket is not supported here"); } + + @Override + default TaskRunResult run(Task task, TaskPartitionDefinitionType partitionDefinition) { + throw new UnsupportedOperationException("run with no work bucket is not supported here"); + } - TaskWorkBucketProcessingResult run(Task task, WorkBucketType workBucket, TaskWorkBucketProcessingResult previousRunResult); + TaskWorkBucketProcessingResult run(Task task, WorkBucketType workBucket, TaskPartitionDefinitionType partitionDefinition, TaskWorkBucketProcessingResult previousRunResult); + +// TaskWorkBucketProcessingResult run(Task task, WorkBucketType workBucket, TaskWorkBucketProcessingResult previousRunResult); default TaskWorkBucketProcessingResult onNoMoreBuckets(Task task, TaskWorkBucketProcessingResult previousRunResult) { return previousRunResult; diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java index 187b0a1a121..5f7609ad6f7 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java @@ -21,7 +21,16 @@ import static java.util.Collections.singleton; import java.text.ParseException; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.ConcurrentModificationException; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -33,17 +42,6 @@ import javax.xml.datatype.Duration; import javax.xml.datatype.XMLGregorianCalendar; -import com.evolveum.midpoint.common.LocalizationService; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.crypto.Protector; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.repo.api.*; -import com.evolveum.midpoint.schema.*; -import com.evolveum.midpoint.task.api.*; -import com.evolveum.midpoint.task.quartzimpl.handlers.PartitioningTaskHandler; -import com.evolveum.midpoint.task.quartzimpl.work.WorkStateManager; -import com.evolveum.midpoint.task.quartzimpl.work.workers.WorkersManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; @@ -60,22 +58,60 @@ import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Service; +import com.evolveum.midpoint.common.LocalizationService; import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration; +import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; +import com.evolveum.midpoint.repo.api.PreconditionViolationException; +import com.evolveum.midpoint.repo.api.RepoAddOptions; +import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.repo.api.SystemConfigurationChangeDispatcher; +import com.evolveum.midpoint.repo.api.SystemConfigurationChangeListener; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.schema.ResultHandler; +import com.evolveum.midpoint.schema.SchemaHelper; +import com.evolveum.midpoint.schema.SearchResultList; +import com.evolveum.midpoint.schema.SearchResultMetadata; +import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.security.api.SecurityContextManager; +import com.evolveum.midpoint.task.api.ClusterExecutionHelper; +import com.evolveum.midpoint.task.api.LightweightIdentifier; +import com.evolveum.midpoint.task.api.LightweightIdentifierGenerator; +import com.evolveum.midpoint.task.api.LightweightTaskHandler; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskCategory; +import com.evolveum.midpoint.task.api.TaskDeletionListener; +import com.evolveum.midpoint.task.api.TaskExecutionStatus; +import com.evolveum.midpoint.task.api.TaskHandler; +import com.evolveum.midpoint.task.api.TaskListener; +import com.evolveum.midpoint.task.api.TaskManager; +import com.evolveum.midpoint.task.api.TaskManagerException; +import com.evolveum.midpoint.task.api.TaskManagerInitializationException; +import com.evolveum.midpoint.task.api.TaskPartitionsDefinition; +import com.evolveum.midpoint.task.api.TaskPersistenceStatus; +import com.evolveum.midpoint.task.api.TaskRunResult; +import com.evolveum.midpoint.task.api.TaskWaitingReason; +import com.evolveum.midpoint.task.api.WorkersReconciliationOptions; import com.evolveum.midpoint.task.quartzimpl.cluster.ClusterManager; import com.evolveum.midpoint.task.quartzimpl.cluster.ClusterStatusInformation; import com.evolveum.midpoint.task.quartzimpl.execution.ExecutionManager; +import com.evolveum.midpoint.task.quartzimpl.execution.HandlerExecutor; import com.evolveum.midpoint.task.quartzimpl.execution.StalledTasksWatcher; +import com.evolveum.midpoint.task.quartzimpl.handlers.PartitioningTaskHandler; +import com.evolveum.midpoint.task.quartzimpl.work.WorkStateManager; +import com.evolveum.midpoint.task.quartzimpl.work.workers.WorkersManager; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -87,6 +123,20 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.CleanupPolicyType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.InfrastructureConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeErrorStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeExecutionStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationStatsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SchedulerInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskUnpauseActionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; /** @@ -181,6 +231,9 @@ public class TaskManagerQuartzImpl implements TaskManager, BeanFactoryAware, Sys @Autowired @Qualifier("securityContextManager") private SecurityContextManager securityContextManager; + + // fixme " how to properly initialize handler executer for jobexecutor? + @Autowired private HandlerExecutor handlerExecutor; private static final transient Trace LOGGER = TraceManager.getTrace(TaskManagerQuartzImpl.class); @@ -239,6 +292,12 @@ public void init() { postInit(result); } } + + @PreDestroy + public void destroy() { + systemConfigurationChangeDispatcher.unregisterListener(this); + } + @Override public void postInit(OperationResult parentResult) { @@ -2343,6 +2402,13 @@ public SecurityContextManager getSecurityContextManager() { public WorkStateManager getWorkStateManager() { return workStateManager; } + + /** + * @return the handlerExecutor + */ + public HandlerExecutor getHandlerExecutor() { + return handlerExecutor; + } @Override public ObjectQuery narrowQueryForWorkBucket(ObjectQuery query, Class type, diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java index 9432c6b7f0b..fba84ac0cd1 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskQuartzImpl.java @@ -15,10 +15,58 @@ */ package com.evolveum.midpoint.task.quartzimpl; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.delta.*; -import com.evolveum.midpoint.prism.path.ItemPath; +import static com.evolveum.midpoint.prism.xml.XmlTypeConverter.createXMLGregorianCalendar; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_MODEL_OPERATION_CONTEXT; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_WORKFLOW_CONTEXT; +import static java.util.Collections.emptyMap; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; +import static org.apache.commons.collections4.CollectionUtils.addIgnoreNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Future; + +import javax.xml.datatype.Duration; +import javax.xml.datatype.XMLGregorianCalendar; +import javax.xml.namespace.QName; + +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import com.evolveum.midpoint.prism.Containerable; +import com.evolveum.midpoint.prism.Item; +import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.prism.PrismContainerDefinition; +import com.evolveum.midpoint.prism.PrismContainerValue; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismPropertyValue; +import com.evolveum.midpoint.prism.PrismReference; +import com.evolveum.midpoint.prism.PrismReferenceDefinition; +import com.evolveum.midpoint.prism.PrismReferenceValue; +import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.PrismValueCollectionsUtil; +import com.evolveum.midpoint.prism.delta.ChangeType; +import com.evolveum.midpoint.prism.delta.DeltaFactory; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.prism.delta.ItemDeltaCollectionsUtil; +import com.evolveum.midpoint.prism.delta.PropertyDelta; +import com.evolveum.midpoint.prism.delta.ReferenceDelta; import com.evolveum.midpoint.prism.path.ItemName; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.CloneUtil; @@ -32,13 +80,23 @@ import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.statistics.ActionsExecutedInformation; import com.evolveum.midpoint.schema.statistics.EnvironmentalPerformanceInformation; import com.evolveum.midpoint.schema.statistics.IterativeTaskInformation; import com.evolveum.midpoint.schema.statistics.ProvisioningOperation; -import com.evolveum.midpoint.schema.statistics.ActionsExecutedInformation; import com.evolveum.midpoint.schema.statistics.StatisticsUtil; import com.evolveum.midpoint.schema.statistics.SynchronizationInformation; -import com.evolveum.midpoint.task.api.*; +import com.evolveum.midpoint.task.api.LightweightIdentifier; +import com.evolveum.midpoint.task.api.LightweightTaskHandler; +import com.evolveum.midpoint.task.api.StatisticsCollectionStrategy; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskBinding; +import com.evolveum.midpoint.task.api.TaskExecutionStatus; +import com.evolveum.midpoint.task.api.TaskHandler; +import com.evolveum.midpoint.task.api.TaskPersistenceStatus; +import com.evolveum.midpoint.task.api.TaskRecurrence; +import com.evolveum.midpoint.task.api.TaskRunResult; +import com.evolveum.midpoint.task.api.TaskWaitingReason; import com.evolveum.midpoint.task.quartzimpl.handlers.WaitForSubtasksByPollingTaskHandler; import com.evolveum.midpoint.task.quartzimpl.handlers.WaitForTasksTaskHandler; import com.evolveum.midpoint.util.DebugUtil; @@ -49,25 +107,38 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ActionsExecutedInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.EnvironmentalPerformanceInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.IterativeTaskInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LensContextType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationResultType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationStatsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyRuleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ScheduleType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskBindingType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionConstraintsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionGroupConstraintType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskRecurrenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskUnpauseActionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskWaitingReasonType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskWorkManagementType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskWorkStateType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ThreadStopActionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UriStack; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UriStackEntry; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WfContextType; import com.evolveum.prism.xml.ns._public.types_3.ItemDeltaType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.Validate; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.xml.datatype.Duration; -import javax.xml.datatype.XMLGregorianCalendar; -import javax.xml.namespace.QName; -import java.util.*; -import java.util.concurrent.Future; - -import static com.evolveum.midpoint.prism.xml.XmlTypeConverter.createXMLGregorianCalendar; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_MODEL_OPERATION_CONTEXT; -import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType.F_WORKFLOW_CONTEXT; -import static java.util.Collections.*; -import static org.apache.commons.collections4.CollectionUtils.addIgnoreNull; /** * Implementation of a Task. diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/ExecutionManager.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/ExecutionManager.java index 0aaa661c4b9..e8c80a6ac73 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/ExecutionManager.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/ExecutionManager.java @@ -16,12 +16,35 @@ package com.evolveum.midpoint.task.quartzimpl.execution; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.quartz.TriggerKey; + import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; -import com.evolveum.midpoint.task.api.*; -import com.evolveum.midpoint.task.quartzimpl.*; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskExecutionStatus; +import com.evolveum.midpoint.task.api.TaskManagerException; +import com.evolveum.midpoint.task.api.TaskManagerInitializationException; +import com.evolveum.midpoint.task.api.UseThreadInterrupt; +import com.evolveum.midpoint.task.quartzimpl.TaskManagerConfiguration; +import com.evolveum.midpoint.task.quartzimpl.TaskManagerQuartzImpl; +import com.evolveum.midpoint.task.quartzimpl.TaskQuartzImpl; +import com.evolveum.midpoint.task.quartzimpl.TaskQuartzImplUtil; import com.evolveum.midpoint.task.quartzimpl.cluster.ClusterStatusInformation; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; @@ -30,13 +53,12 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.quartz.*; - -import java.util.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SchedulerInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionLimitationsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskGroupExecutionLimitationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; /** * Manages task threads (clusterwide). Concerned mainly with stopping threads and querying their state. diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/HandlerExecutor.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/HandlerExecutor.java new file mode 100644 index 00000000000..4ee1c4c4ed1 --- /dev/null +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/HandlerExecutor.java @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.task.quartzimpl.execution; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskHandler; +import com.evolveum.midpoint.task.api.TaskRunResult; +import com.evolveum.midpoint.task.api.TaskWorkBucketProcessingResult; +import com.evolveum.midpoint.task.api.WorkBucketAwareTaskHandler; +import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; +import com.evolveum.midpoint.task.quartzimpl.TaskManagerQuartzImpl; +import com.evolveum.midpoint.task.quartzimpl.TaskQuartzImpl; +import com.evolveum.midpoint.task.quartzimpl.work.WorkStateManager; +import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; + +/** + * @author katka + * + */ +@Component +public class HandlerExecutor { + + private static final transient Trace LOGGER = TraceManager.getTrace(HandlerExecutor.class); + private static final String DOT_CLASS = HandlerExecutor.class.getName() + "."; + + private static final long FREE_BUCKET_WAIT_TIME = -1; // indefinitely + + @Autowired private PrismContext prismCtx; + @Autowired private TaskManagerQuartzImpl taskManagerImpl; + + + public TaskRunResult executeHandler(TaskQuartzImpl task, TaskPartitionDefinitionType partition, TaskHandler handler, OperationResult executionResult) { + + if (handler instanceof WorkBucketAwareTaskHandler) { + return executeWorkBucketAwareTaskHandler(task, partition, (WorkBucketAwareTaskHandler) handler, executionResult); + } + + return executePlainTaskHandler(task, partition, handler); + } + + private TaskRunResult executePlainTaskHandler(TaskQuartzImpl task, TaskPartitionDefinitionType partition, TaskHandler handler) { + TaskRunResult runResult; + try { + LOGGER.trace("Executing handler {}", handler.getClass().getName()); + runResult = handler.run(task, partition); + if (runResult == null) { // Obviously an error in task handler + LOGGER.error("Unable to record run finish: task returned null result"); + runResult = createFailureTaskRunResult(task, "Unable to record run finish: task returned null result", null); + } + } catch (Throwable t) { + LOGGER.error("Task handler threw unexpected exception: {}: {}; task = {}", t.getClass().getName(), t.getMessage(), task, t); + runResult = createFailureTaskRunResult(task, "Task handler threw unexpected exception: " + t.getMessage(), t); + } + return runResult; + } + + private TaskRunResult executeWorkBucketAwareTaskHandler(TaskQuartzImpl task, TaskPartitionDefinitionType taskPartition, WorkBucketAwareTaskHandler handler, OperationResult executionResult) { + WorkStateManager workStateManager = taskManagerImpl.getWorkStateManager(); + + if (task.getWorkState() != null && Boolean.TRUE.equals(task.getWorkState().isAllWorkComplete())) { + LOGGER.debug("Work is marked as complete; restarting it in task {}", task); + try { + List> itemDeltas = prismCtx.deltaFor(TaskType.class) + .item(TaskType.F_WORK_STATE).replace() + .asItemDeltas(); + task.applyDeltasImmediate(itemDeltas, executionResult); + } catch (SchemaException | ObjectAlreadyExistsException | ObjectNotFoundException | RuntimeException e) { + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't remove work state from (completed) task {} -- continuing", e, task); + } + } + + boolean initialBucket = true; + TaskWorkBucketProcessingResult runResult = null; + for (;;) { + WorkBucketType bucket; + try { + try { + bucket = workStateManager.getWorkBucket(task.getOid(), FREE_BUCKET_WAIT_TIME, () -> task.canRun(), initialBucket, executionResult); + } catch (InterruptedException e) { + LOGGER.trace("InterruptedExecution in getWorkBucket for {}", task); + if (task.canRun()) { + throw new IllegalStateException("Unexpected InterruptedException: " + e.getMessage(), e); + } else { + return createInterruptedTaskRunResult(task); + } + } + } catch (Throwable t) { + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't allocate a work bucket for task {} (coordinator {})", t, task, null); + return createFailureTaskRunResult(task, "Couldn't allocate a work bucket for task: " + t.getMessage(), t); + } + initialBucket = false; + if (bucket == null) { + LOGGER.trace("No (next) work bucket within {}, exiting", task); + runResult = handler.onNoMoreBuckets(task, runResult); + return runResult != null ? runResult : createSuccessTaskRunResult(task); + } + try { + LOGGER.trace("Executing handler {} with work bucket of {} for {}", handler.getClass().getName(), bucket, task); + runResult = handler.run(task, bucket, taskPartition, runResult); + LOGGER.trace("runResult is {} for {}", runResult, task); + if (runResult == null) { // Obviously an error in task handler + LOGGER.error("Unable to record run finish: task returned null result"); + //releaseWorkBucketChecked(bucket, executionResult); + return createFailureTaskRunResult(task, "Unable to record run finish: task returned null result", null); + } + } catch (Throwable t) { + LOGGER.error("Task handler threw unexpected exception: {}: {}; task = {}", t.getClass().getName(), t.getMessage(), task, t); + //releaseWorkBucketChecked(bucket, executionResult); + return createFailureTaskRunResult(task, "Task handler threw unexpected exception: " + t.getMessage(), t); + } + if (!runResult.isBucketComplete()) { + return runResult; + } + try { + taskManagerImpl.getWorkStateManager().completeWorkBucket(task.getOid(), bucket.getSequentialNumber(), executionResult); + } catch (ObjectAlreadyExistsException | ObjectNotFoundException | SchemaException | RuntimeException e) { + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't complete work bucket for task {}", e, task); + return createFailureTaskRunResult(task, "Couldn't complete work bucket: " + e.getMessage(), e); + } + if (!task.canRun() || !runResult.isShouldContinue()) { + return runResult; + } + } + } + + private TaskRunResult createFailureTaskRunResult(TaskQuartzImpl task, String message, Throwable t) { + TaskRunResult runResult = new TaskRunResult(); + OperationResult opResult; + if (task.getResult() != null) { + opResult = task.getResult(); + } else { + opResult = createOperationResult(DOT_CLASS + "executeHandler"); + } + if (t != null) { + opResult.recordFatalError(message, t); + } else { + opResult.recordFatalError(message); + } + runResult.setOperationResult(opResult); + runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + return runResult; + } + + private TaskRunResult createSuccessTaskRunResult(TaskQuartzImpl task) { + TaskRunResult runResult = new TaskRunResult(); + OperationResult opResult; + if (task.getResult() != null) { + opResult = task.getResult(); + } else { + opResult = createOperationResult(DOT_CLASS + "executeHandler"); + } + opResult.recordSuccess(); + runResult.setOperationResult(opResult); + runResult.setRunResultStatus(TaskRunResultStatus.FINISHED); + return runResult; + } + + private TaskRunResult createInterruptedTaskRunResult(TaskQuartzImpl task) { + TaskRunResult runResult = new TaskRunResult(); + OperationResult opResult; + if (task.getResult() != null) { + opResult = task.getResult(); + } else { + opResult = createOperationResult(DOT_CLASS + "executeHandler"); + } + opResult.recordSuccess(); + runResult.setOperationResult(opResult); + runResult.setRunResultStatus(TaskRunResultStatus.INTERRUPTED); + return runResult; + } + + private OperationResult createOperationResult(String methodName) { + return new OperationResult(DOT_CLASS + methodName); + } + +} diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java index 56b07df9f21..f1d681ee04d 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java @@ -74,7 +74,7 @@ public static void setTaskManagerQuartzImpl(TaskManagerQuartzImpl managerImpl) { private static final int DEFAULT_RESCHEDULE_TIME_FOR_GROUP_LIMIT = 60; private static final int RESCHEDULE_TIME_RANDOMIZATION_INTERVAL = 3; - private static final long FREE_BUCKET_WAIT_TIME = -1; // indefinitely + /* * JobExecutor is instantiated at each execution of the task, so we can store @@ -535,9 +535,8 @@ private void executeRecurrentTask(TaskHandler handler) { LOGGER.trace("CycleRunner loop: start"); - TaskRunResult runResult; recordCycleRunStart(executionResult, handler); - runResult = executeHandler(handler, executionResult); + TaskRunResult runResult = executeHandler(handler, executionResult); boolean canContinue = recordCycleRunFinish(runResult, handler, executionResult); if (!canContinue) { // in case of task disappeared break; @@ -658,101 +657,96 @@ private TaskRunResult executeHandler(TaskHandler handler, OperationResult execut task.setResultTransient(task.createUnnamedTaskResult()); } - TaskRunResult runResult; - if (handler instanceof WorkBucketAwareTaskHandler) { - runResult = executeWorkBucketAwareTaskHandler((WorkBucketAwareTaskHandler) handler, executionResult); - } else { - runResult = executePlainTaskHandler(handler); - } + TaskRunResult runResult = taskManagerImpl.getHandlerExecutor().executeHandler(task, null, handler, executionResult); - waitForTransientChildrenAndCloseThem(executionResult); + waitForTransientChildrenAndCloseThem(executionResult); return runResult; } - - private TaskRunResult executePlainTaskHandler(TaskHandler handler) { - TaskRunResult runResult; - try { - LOGGER.trace("Executing handler {}", handler.getClass().getName()); - runResult = handler.run(task); - if (runResult == null) { // Obviously an error in task handler - LOGGER.error("Unable to record run finish: task returned null result"); - runResult = createFailureTaskRunResult("Unable to record run finish: task returned null result", null); - } - } catch (Throwable t) { - LOGGER.error("Task handler threw unexpected exception: {}: {}; task = {}", t.getClass().getName(), t.getMessage(), task, t); - runResult = createFailureTaskRunResult("Task handler threw unexpected exception: " + t.getMessage(), t); - } - return runResult; - } - - private TaskRunResult executeWorkBucketAwareTaskHandler(WorkBucketAwareTaskHandler handler, OperationResult executionResult) { - WorkStateManager workStateManager = taskManagerImpl.getWorkStateManager(); - - if (task.getWorkState() != null && Boolean.TRUE.equals(task.getWorkState().isAllWorkComplete())) { - LOGGER.debug("Work is marked as complete; restarting it in task {}", task); - try { - List> itemDeltas = taskManagerImpl.getPrismContext().deltaFor(TaskType.class) - .item(TaskType.F_WORK_STATE).replace() - .asItemDeltas(); - task.applyDeltasImmediate(itemDeltas, executionResult); - } catch (SchemaException | ObjectAlreadyExistsException | ObjectNotFoundException | RuntimeException e) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't remove work state from (completed) task {} -- continuing", e, task); - } - } - - boolean initialBucket = true; - TaskWorkBucketProcessingResult runResult = null; - for (;;) { - WorkBucketType bucket; - try { - try { - bucket = workStateManager.getWorkBucket(task.getOid(), FREE_BUCKET_WAIT_TIME, () -> task.canRun(), initialBucket, executionResult); - } catch (InterruptedException e) { - LOGGER.trace("InterruptedExecution in getWorkBucket for {}", task); - if (task.canRun()) { - throw new IllegalStateException("Unexpected InterruptedException: " + e.getMessage(), e); - } else { - return createInterruptedTaskRunResult(); - } - } - } catch (Throwable t) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't allocate a work bucket for task {} (coordinator {})", t, task, null); - return createFailureTaskRunResult("Couldn't allocate a work bucket for task: " + t.getMessage(), t); - } - initialBucket = false; - if (bucket == null) { - LOGGER.trace("No (next) work bucket within {}, exiting", task); - runResult = handler.onNoMoreBuckets(task, runResult); - return runResult != null ? runResult : createSuccessTaskRunResult(); - } - try { - LOGGER.trace("Executing handler {} with work bucket of {} for {}", handler.getClass().getName(), bucket, task); - runResult = handler.run(task, bucket, runResult); - LOGGER.trace("runResult is {} for {}", runResult, task); - if (runResult == null) { // Obviously an error in task handler - LOGGER.error("Unable to record run finish: task returned null result"); - //releaseWorkBucketChecked(bucket, executionResult); - return createFailureTaskRunResult("Unable to record run finish: task returned null result", null); - } - } catch (Throwable t) { - LOGGER.error("Task handler threw unexpected exception: {}: {}; task = {}", t.getClass().getName(), t.getMessage(), task, t); - //releaseWorkBucketChecked(bucket, executionResult); - return createFailureTaskRunResult("Task handler threw unexpected exception: " + t.getMessage(), t); - } - if (!runResult.isBucketComplete()) { - return runResult; - } - try { - taskManagerImpl.getWorkStateManager().completeWorkBucket(task.getOid(), bucket.getSequentialNumber(), executionResult); - } catch (ObjectAlreadyExistsException | ObjectNotFoundException | SchemaException | RuntimeException e) { - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't complete work bucket for task {}", e, task); - return createFailureTaskRunResult("Couldn't complete work bucket: " + e.getMessage(), e); - } - if (!task.canRun() || !runResult.isShouldContinue()) { - return runResult; - } - } - } +// +// private TaskRunResult executePlainTaskHandler(TaskHandler handler) { +// TaskRunResult runResult; +// try { +// LOGGER.trace("Executing handler {}", handler.getClass().getName()); +// runResult = handler.run(task); +// if (runResult == null) { // Obviously an error in task handler +// LOGGER.error("Unable to record run finish: task returned null result"); +// runResult = createFailureTaskRunResult("Unable to record run finish: task returned null result", null); +// } +// } catch (Throwable t) { +// LOGGER.error("Task handler threw unexpected exception: {}: {}; task = {}", t.getClass().getName(), t.getMessage(), task, t); +// runResult = createFailureTaskRunResult("Task handler threw unexpected exception: " + t.getMessage(), t); +// } +// return runResult; +// } +// +// private TaskRunResult executeWorkBucketAwareTaskHandler(WorkBucketAwareTaskHandler handler, OperationResult executionResult) { +// WorkStateManager workStateManager = taskManagerImpl.getWorkStateManager(); +// +// if (task.getWorkState() != null && Boolean.TRUE.equals(task.getWorkState().isAllWorkComplete())) { +// LOGGER.debug("Work is marked as complete; restarting it in task {}", task); +// try { +// List> itemDeltas = taskManagerImpl.getPrismContext().deltaFor(TaskType.class) +// .item(TaskType.F_WORK_STATE).replace() +// .asItemDeltas(); +// task.applyDeltasImmediate(itemDeltas, executionResult); +// } catch (SchemaException | ObjectAlreadyExistsException | ObjectNotFoundException | RuntimeException e) { +// LoggingUtils.logUnexpectedException(LOGGER, "Couldn't remove work state from (completed) task {} -- continuing", e, task); +// } +// } +// +// boolean initialBucket = true; +// TaskWorkBucketProcessingResult runResult = null; +// for (;;) { +// WorkBucketType bucket; +// try { +// try { +// bucket = workStateManager.getWorkBucket(task.getOid(), FREE_BUCKET_WAIT_TIME, () -> task.canRun(), initialBucket, executionResult); +// } catch (InterruptedException e) { +// LOGGER.trace("InterruptedExecution in getWorkBucket for {}", task); +// if (task.canRun()) { +// throw new IllegalStateException("Unexpected InterruptedException: " + e.getMessage(), e); +// } else { +// return createInterruptedTaskRunResult(); +// } +// } +// } catch (Throwable t) { +// LoggingUtils.logUnexpectedException(LOGGER, "Couldn't allocate a work bucket for task {} (coordinator {})", t, task, null); +// return createFailureTaskRunResult("Couldn't allocate a work bucket for task: " + t.getMessage(), t); +// } +// initialBucket = false; +// if (bucket == null) { +// LOGGER.trace("No (next) work bucket within {}, exiting", task); +// runResult = handler.onNoMoreBuckets(task, runResult); +// return runResult != null ? runResult : createSuccessTaskRunResult(); +// } +// try { +// LOGGER.trace("Executing handler {} with work bucket of {} for {}", handler.getClass().getName(), bucket, task); +// runResult = handler.run(task, bucket, runResult); +// LOGGER.trace("runResult is {} for {}", runResult, task); +// if (runResult == null) { // Obviously an error in task handler +// LOGGER.error("Unable to record run finish: task returned null result"); +// //releaseWorkBucketChecked(bucket, executionResult); +// return createFailureTaskRunResult("Unable to record run finish: task returned null result", null); +// } +// } catch (Throwable t) { +// LOGGER.error("Task handler threw unexpected exception: {}: {}; task = {}", t.getClass().getName(), t.getMessage(), task, t); +// //releaseWorkBucketChecked(bucket, executionResult); +// return createFailureTaskRunResult("Task handler threw unexpected exception: " + t.getMessage(), t); +// } +// if (!runResult.isBucketComplete()) { +// return runResult; +// } +// try { +// taskManagerImpl.getWorkStateManager().completeWorkBucket(task.getOid(), bucket.getSequentialNumber(), executionResult); +// } catch (ObjectAlreadyExistsException | ObjectNotFoundException | SchemaException | RuntimeException e) { +// LoggingUtils.logUnexpectedException(LOGGER, "Couldn't complete work bucket for task {}", e, task); +// return createFailureTaskRunResult("Couldn't complete work bucket: " + e.getMessage(), e); +// } +// if (!task.canRun() || !runResult.isShouldContinue()) { +// return runResult; +// } +// } +// } // private void releaseWorkBucketChecked(AbstractWorkBucketType bucket, OperationResult executionResult) { // try { @@ -762,53 +756,6 @@ private TaskRunResult executeWorkBucketAwareTaskHandler(WorkBucketAwareTaskHandl // } // } - private TaskRunResult createFailureTaskRunResult(String message, Throwable t) { - TaskRunResult runResult = new TaskRunResult(); - OperationResult opResult; - if (task.getResult() != null) { - opResult = task.getResult(); - } else { - opResult = createOperationResult(DOT_CLASS + "executeHandler"); - } - if (t != null) { - opResult.recordFatalError(message, t); - } else { - opResult.recordFatalError(message); - } - runResult.setOperationResult(opResult); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); - return runResult; - } - - private TaskRunResult createSuccessTaskRunResult() { - TaskRunResult runResult = new TaskRunResult(); - OperationResult opResult; - if (task.getResult() != null) { - opResult = task.getResult(); - } else { - opResult = createOperationResult(DOT_CLASS + "executeHandler"); - } - opResult.recordSuccess(); - runResult.setOperationResult(opResult); - runResult.setRunResultStatus(TaskRunResultStatus.FINISHED); - return runResult; - } - - private TaskRunResult createInterruptedTaskRunResult() { - TaskRunResult runResult = new TaskRunResult(); - OperationResult opResult; - if (task.getResult() != null) { - opResult = task.getResult(); - } else { - opResult = createOperationResult(DOT_CLASS + "executeHandler"); - } - opResult.recordSuccess(); - runResult.setOperationResult(opResult); - runResult.setRunResultStatus(TaskRunResultStatus.INTERRUPTED); - return runResult; - } - - private OperationResult createOperationResult(String methodName) { return new OperationResult(DOT_CLASS + methodName); } diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/JdbcPingTaskHandler.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/JdbcPingTaskHandler.java index 88ef16de576..eb1fe96d059 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/JdbcPingTaskHandler.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/JdbcPingTaskHandler.java @@ -26,6 +26,8 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -84,7 +86,7 @@ public String toString() { } @Override - public TaskRunResult run(Task task) { + public TaskRunResult run(Task task, TaskPartitionDefinitionType partition) { OperationResult opResult = new OperationResult(JdbcPingTaskHandler.class.getName()+".run"); diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/LightweigthPartitioningTaskHandler.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/LightweigthPartitioningTaskHandler.java new file mode 100644 index 00000000000..93a45f961be --- /dev/null +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/LightweigthPartitioningTaskHandler.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.task.quartzimpl.handlers; + +import java.util.Comparator; +import java.util.List; + +import javax.annotation.PostConstruct; + +import org.apache.commons.lang.Validate; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.StatisticsCollectionStrategy; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskConstants; +import com.evolveum.midpoint.task.api.TaskHandler; +import com.evolveum.midpoint.task.api.TaskManager; +import com.evolveum.midpoint.task.api.TaskRunResult; +import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; +import com.evolveum.midpoint.task.quartzimpl.TaskManagerQuartzImpl; +import com.evolveum.midpoint.task.quartzimpl.TaskQuartzImpl; +import com.evolveum.midpoint.task.quartzimpl.execution.HandlerExecutor; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionsDefinitionType; + +/** + * @author katka + * + */ +@Component +public class LightweigthPartitioningTaskHandler implements TaskHandler { + + private static final transient Trace LOGGER = TraceManager.getTrace(LightweigthPartitioningTaskHandler.class); + + private static final String HANDLER_URI = TaskConstants.LIGHTWEIGTH_PARTITIONING_TASK_HANDLER_URI; + + @Autowired private PrismContext prismContext; + @Autowired private TaskManagerQuartzImpl taskManager; + @Autowired private HandlerExecutor handlerExecutor; +// @Autowired private TaskManager taskManager; + + + @PostConstruct + private void initialize() { + taskManager.registerHandler(HANDLER_URI, this); + } + + public TaskRunResult run(Task task, TaskPartitionDefinitionType taskPartition) { + OperationResult opResult = new OperationResult(LightweigthPartitioningTaskHandler.class.getName()+".run"); + TaskRunResult runResult = new TaskRunResult(); + + runResult.setProgress(task.getProgress()); + runResult.setOperationResult(opResult); + + + TaskPartitionsDefinitionType partitionsDefinition = task.getWorkManagement().getPartitions(); + List partitions = partitionsDefinition.getPartition(); + Comparator comparator = + (partition1, partition2) -> { + + Validate.notNull(partition1); + Validate.notNull(partition2); + + Integer index1 = partition1.getIndex(); + Integer index2 = partition2.getIndex(); + + if (index1 == null) { + if (index2 == null) { + return 0; + } + return -1; + } + + if (index2 == null) { + return -1; + } + + return index1.compareTo(index2); + }; + + partitions.sort(comparator); + for (TaskPartitionDefinitionType partition : partitions) { + TaskHandler handler = taskManager.getHandler(partition.getHandlerUri()); + TaskRunResult subHandlerResult = handlerExecutor.executeHandler((TaskQuartzImpl) task, partition, handler, opResult); +// TaskRunResult subHandlerResult = handler.run(task, partition); + OperationResult subHandlerOpResult = subHandlerResult.getOperationResult(); + opResult.addSubresult(subHandlerOpResult); + if (subHandlerResult != null) { + runResult = subHandlerResult; + runResult.setProgress(task.getProgress()); + } + + if (!canContinue(task, subHandlerResult)) { + break; + } + + if (subHandlerOpResult.isError()) { + break; + } + } + + runResult.setProgress(runResult.getProgress() + 1); + opResult.computeStatusIfUnknown(); + + return runResult; + } + + private boolean canContinue(Task task, TaskRunResult runResult) { + if (!task.canRun() || runResult.getRunResultStatus() == TaskRunResultStatus.INTERRUPTED) { + // first, if a task was interrupted, we do not want to change its status + LOGGER.trace("Task was interrupted, exiting the execution cycle. Task = {}", task); + return true; + } else if (runResult.getRunResultStatus() == TaskRunResultStatus.TEMPORARY_ERROR) { + LOGGER.trace("Task encountered temporary error, continuing with the execution cycle. Task = {}", task); + return false; + } else if (runResult.getRunResultStatus() == TaskRunResultStatus.RESTART_REQUESTED) { + // in case of RESTART_REQUESTED we have to get (new) current handler and restart it + // this is implemented by pushHandler and by Quartz + LOGGER.trace("Task returned RESTART_REQUESTED state, exiting the execution cycle. Task = {}", task); + return true; + } else if (runResult.getRunResultStatus() == TaskRunResultStatus.PERMANENT_ERROR) { + LOGGER.info("Task encountered permanent error, suspending the task. Task = {}", task); + return false; + } else if (runResult.getRunResultStatus() == TaskRunResultStatus.FINISHED) { + LOGGER.trace("Task handler finished, continuing with the execution cycle. Task = {}", task); + return true; + } else if (runResult.getRunResultStatus() == TaskRunResultStatus.IS_WAITING) { + LOGGER.trace("Task switched to waiting state, exiting the execution cycle. Task = {}", task); + return true; + } else if (runResult.getRunResultStatus() == TaskRunResultStatus.FINISHED_HANDLER) { + LOGGER.trace("Task handler finished with FINISHED_HANDLER, calling task.finishHandler() and exiting the execution cycle. Task = {}", task); + return true; + } else { + throw new IllegalStateException("Invalid value for Task's runResultStatus: " + runResult.getRunResultStatus() + " for task " + task); + } + } + + @NotNull + @Override + public StatisticsCollectionStrategy getStatisticsCollectionStrategy() { + return new StatisticsCollectionStrategy() + .fromZero() + .maintainIterationStatistics() + .maintainSynchronizationStatistics() + .maintainActionsExecutedStatistics(); + } + + @Override + public String getCategoryName(Task task) { + // TODO Auto-generated method stub + return null; + }; + + +// private void processErrorCriticality(Task task, TaskPartitionDefinitionType partitionDefinition, Throwable ex, OperationResult result) throws ObjectNotFoundException, CommunicationException, SchemaException, ConfigurationException, SecurityViolationException, PolicyViolationException, ExpressionEvaluationException, ObjectAlreadyExistsException, PreconditionViolationException { +// CriticalityType criticality = ExceptionUtil.getCriticality(partitionDefinition.getErrorCriticality(), ex, CriticalityType.PARTIAL); +// RepoCommonUtils.processErrorCriticality(task.getTaskType(), criticality, ex, result); +// +// } +} diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/NoOpTaskHandler.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/NoOpTaskHandler.java index d15eb44f9cf..b2c1a7df007 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/NoOpTaskHandler.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/NoOpTaskHandler.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.NumericIntervalWorkBucketContentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskPartitionDefinitionType; import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; /** @@ -58,7 +59,7 @@ public static void instantiateAndRegister(TaskManagerQuartzImpl taskManager) { @Override public TaskWorkBucketProcessingResult run(Task task, WorkBucketType workBucket, - TaskWorkBucketProcessingResult previousRunResult) { + TaskPartitionDefinitionType taskPartition, TaskWorkBucketProcessingResult previousRunResult) { String partition = task.getHandlerUri().substring(TaskConstants.NOOP_TASK_HANDLER_URI.length()); // empty or #1..#4 diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/PartitioningTaskHandler.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/PartitioningTaskHandler.java index cde2eba1a2b..e8006d8c316 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/PartitioningTaskHandler.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/handlers/PartitioningTaskHandler.java @@ -62,7 +62,7 @@ public PartitioningTaskHandler(TaskManagerQuartzImpl taskManager, Function resourceOpenDj; + protected int getDefaultUsers() { + return 6; + } - private static int defaultLdapUsers = 3; @Override protected void startResources() throws Exception { @@ -97,6 +85,20 @@ public static void stopResources() throws Exception { openDJController.stop(); } + protected abstract File getTaskFile(); + protected abstract String getTaskOid(); + protected abstract int getProcessedUsers(); + protected abstract void assertSynchronizationStatisticsAfterImport(Task syncInfo) throws Exception; + + + protected void assertSynchronizationStatisticsActivation(Task taskAfter) { + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnmatched(), 5); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountDeleted(), 0); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountLinked(), getDefaultUsers()); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnlinked(), 0); + } + + @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); @@ -107,9 +109,50 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti repoAddObjectFromFile(ROLE_POLICY_RULE_CREATE_FILE, initResult); repoAddObjectFromFile(ROLE_POLICY_RULE_CHANGE_ACTIVATION_FILE, initResult); + + repoAddObjectFromFile(getTaskFile(), initResult); + } + + + @Test + public void test001testImportBaseUsers() throws Exception { + final String TEST_NAME = "test001testImportBaseUsers"; + displayTestTitle(TEST_NAME); + OperationResult result = new OperationResult(TEST_NAME); - repoAddObjectFromFile(TASK_RECONCILE_OPENDJ_FILE, initResult); - + importObjectFromFile(TASK_IMPORT_BASE_USERS_FILE); + + openDJController.addEntriesFromLdifFile(LDIF_CREATE_BASE_USERS_FILE); + + waitForTaskFinish(TASK_IMPORT_BASE_USERS_OID, true, 30000); + +// waitForTaskNextRun(TASK_IMPORT_BASE_USERS_OID, true, 20000, true); + + Task taskAfter = taskManager.getTaskWithResult(TASK_IMPORT_BASE_USERS_OID, result); + display("Task after test001testImportBaseUsers:", taskAfter); + + OperationStatsType stats = taskAfter.getStoredOperationStats(); + assertNotNull(stats, "No statistics in task"); + + SynchronizationInformationType syncInfo = stats.getSynchronizationInformation(); + assertNotNull(syncInfo, "No sync info in task"); + + assertEquals(syncInfo.getCountUnmatched(), getDefaultUsers()); + assertEquals(syncInfo.getCountDeleted(), 0); + assertEquals(syncInfo.getCountLinked(), 0); + assertEquals(syncInfo.getCountUnlinked(), 0); + + assertEquals(syncInfo.getCountUnmatchedAfter(), 0); + assertEquals(syncInfo.getCountDeletedAfter(), 0); + assertEquals(syncInfo.getCountLinkedAfter(), getDefaultUsers()); + assertEquals(syncInfo.getCountUnlinkedAfter(), 0); + + assertUsers(getNumberOfUsers()); + } + + @Override + protected int getNumberOfUsers() { + return super.getNumberOfUsers() + getDefaultUsers(); } @Test @@ -120,112 +163,66 @@ public void test100assignPolicyRuleCreateToTask() throws Exception { // WHEN Task task = taskManager.createTaskInstance(TEST_NAME); OperationResult result = task.getResult(); - assignRole(TaskType.class, TASK_RECONCILE_OPENDJ_OID, ROLE_POLICY_RULE_CREATE_OID, task, result); + assignRole(TaskType.class, getTaskOid(), ROLE_POLICY_RULE_CREATE_OID, task, result); //THEN - PrismObject taskAfter = getObject(TaskType.class, TASK_RECONCILE_OPENDJ_OID); + PrismObject taskAfter = getObject(TaskType.class, getTaskOid()); display("Task after:", taskAfter); assertAssignments(taskAfter, 1); assertAssigned(taskAfter, ROLE_POLICY_RULE_CREATE_OID, RoleType.COMPLEX_TYPE); - assertTaskExecutionStatus(TASK_RECONCILE_OPENDJ_OID, TaskExecutionStatus.SUSPENDED); + assertTaskExecutionStatus(getTaskOid(), TaskExecutionStatus.SUSPENDED); } @Test - public void test110importAccountsSimulate() throws Exception { + public void test110importAccounts() throws Exception { final String TEST_NAME = "test110importAccountsSimulate"; displayTestTitle(TEST_NAME); + + Task task = taskManager.createTaskInstance(TEST_NAME); + OperationResult result = task.getResult(); +// executeChanges(DeltaBuilder.deltaFor(TaskType.class, prismContext) +// .item(TaskType.F_EXECUTION_STATUS) +// .replace(TaskExecutionStatusType.RUNNABLE) +// .asObjectDelta(getTaskOid()), null, task, result); openDJController.addEntriesFromLdifFile(LDIF_CREATE_USERS_FILE); - Task task = taskManager.createTaskInstance(TEST_NAME); - OperationResult result = task.getResult(); - executeChanges(DeltaBuilder.deltaFor(TaskType.class, prismContext) - .item(TaskType.F_EXECUTION_STATUS) - .replace(TaskExecutionStatusType.RUNNABLE) - .asObjectDelta(TASK_RECONCILE_OPENDJ_OID), null, task, result); + assertUsers(getNumberOfUsers()); //WHEN displayWhen(TEST_NAME); - OperationResult reconResult = waitForTaskNextRun(TASK_RECONCILE_OPENDJ_OID, false, 20000, true); + OperationResult reconResult = waitForTaskResume(getTaskOid(), false, 20000); assertFailure(reconResult); //THEN - assertUsers(getNumberOfUsers()); - assertTaskExecutionStatus(TASK_RECONCILE_OPENDJ_OID, TaskExecutionStatus.SUSPENDED); + assertUsers(getProcessedUsers() + getNumberOfUsers()); + assertTaskExecutionStatus(getTaskOid(), TaskExecutionStatus.SUSPENDED); - Task taskAfter = taskManager.getTaskWithResult(TASK_RECONCILE_OPENDJ_OID, result); - IterativeTaskInformationType infoType = taskAfter.getStoredOperationStats().getIterativeTaskInformation(); - assertEquals(infoType.getTotalFailureCount(), 1); + Task taskAfter = taskManager.getTaskWithResult(getTaskOid(), result); + assertSynchronizationStatisticsAfterImport(taskAfter); - assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnmatched(), 5); - assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountDeleted(), 0); - assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountLinked(), 0); - assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnlinked(), 0); } - @Test - public void test120changeReconTaskFull() throws Exception { - final String TEST_NAME = "test120changeReconTaskFull"; + public void test500chageTaskPolicyRule() throws Exception { + final String TEST_NAME = "test500chageTaskPolicyRule"; displayTestTitle(TEST_NAME); - assertUsers(getNumberOfUsers()); - - // WHEN - displayWhen(TEST_NAME); - - Task task = taskManager.createTaskInstance(TEST_NAME); - OperationResult result = task.getResult(); - PrismObject taskBefore = getObject(TaskType.class, TASK_RECONCILE_OPENDJ_OID); - TaskType taskTypeBefore = taskBefore.asObjectable(); - List stages = taskTypeBefore.getStage(); - TaskStageType simulateStage = null; - for (TaskStageType stage : stages) { - if (ReconciliationTaskHandler.SIMULATE_URI.equals(stage.getStage())) { - simulateStage = stage; - break; - } - } - modifyObjectDeleteContainer(TaskType.class, TASK_RECONCILE_OPENDJ_OID, new ItemName(TaskType.F_STAGE), task, result, simulateStage.clone()); - - // THEN - displayThen(TEST_NAME); - - PrismObject taskAfter = getObject(TaskType.class, TASK_RECONCILE_OPENDJ_OID); - assertNotNull(taskAfter, "Task not found"); - - TaskType taskTypeAfter = taskAfter.asObjectable(); - List stagesAfter = taskTypeAfter.getStage(); - assertEquals(stagesAfter.size(), 1, "Unexpected number of stages"); - - TaskStageType stageAfter = stagesAfter.iterator().next(); - assertEquals(ReconciliationTaskHandler.EXECUTE_URI, stageAfter.getStage(), "Unexpected stage."); - assertTaskExecutionStatus(TASK_RECONCILE_OPENDJ_OID, TaskExecutionStatus.SUSPENDED); - - - } - - @Test - public void test510importFourAccounts() throws Exception { - final String TEST_NAME = "test510importFourAccounts"; - displayTestTitle(TEST_NAME); - - //GIVEN - Task task = taskManager.createTaskInstance(TEST_NAME); - OperationResult result = task.getResult(); - modifyObjectReplaceProperty(TaskType.class, TASK_RECONCILE_OPENDJ_OID, TaskType.F_EXECUTION_STATUS, task, result, TaskExecutionStatusType.RUNNABLE); - //WHEN - displayWhen(TEST_NAME); - OperationResult reconResult = waitForTaskNextRun(TASK_RECONCILE_OPENDJ_OID, false, 20000, true); - assertFailure(reconResult); + Task task = taskManager.createTaskInstance(TEST_NAME); + OperationResult result = task.getResult(); + unassignRole(TaskType.class, getTaskOid(), ROLE_POLICY_RULE_CREATE_OID, task, result); + assignRole(TaskType.class, getTaskOid(), ROLE_POLICY_RULE_CHANGE_ACTIVATION_OID, task, result); //THEN - assertUsers(getNumberOfUsers() + 4); - assertTaskExecutionStatus(TASK_RECONCILE_OPENDJ_OID, TaskExecutionStatus.SUSPENDED); + PrismObject taskAfter = getObject(TaskType.class, getTaskOid()); + display("Task after:", taskAfter); + assertAssignments(taskAfter, 1); + assertAssigned(taskAfter, ROLE_POLICY_RULE_CHANGE_ACTIVATION_OID, RoleType.COMPLEX_TYPE); + assertTaskExecutionStatus(getTaskOid(), TaskExecutionStatus.SUSPENDED); } @@ -233,32 +230,24 @@ public void test510importFourAccounts() throws Exception { public void test520changeActivationThreeAccounts() throws Exception { final String TEST_NAME = "test520changeActivationThreeAccounts"; displayTestTitle(TEST_NAME); + OperationResult result = new OperationResult(TEST_NAME); //GIVEN - Task task = taskManager.createTaskInstance(TEST_NAME); - OperationResult result = task.getResult(); - unassignRole(TaskType.class, TASK_RECONCILE_OPENDJ_OID, ROLE_POLICY_RULE_CREATE_OID, task, result); - assignRole(TaskType.class, TASK_RECONCILE_OPENDJ_OID, ROLE_POLICY_RULE_CHANGE_ACTIVATION_OID, task, result); - openDJController.executeLdifChange(LDIF_CHANGE_ACTIVATION_FILE); //WHEN displayWhen(TEST_NAME); - OperationResult reconResult = waitForTaskNextRun(TASK_RECONCILE_OPENDJ_OID, false, 20000, true); + OperationResult reconResult = waitForTaskNextRun(getTaskOid(), false, 20000, true); assertFailure(reconResult); //THEN - Task taskAfter = taskManager.getTaskWithResult(TASK_RECONCILE_OPENDJ_OID, result); -// recotaskAfternTask.getStoredOperationStats().getSynchronizationInformation().getCountLinked(); + Task taskAfter = taskManager.getTaskWithResult(getTaskOid(), result); - assertTaskExecutionStatus(TASK_RECONCILE_OPENDJ_OID, TaskExecutionStatus.SUSPENDED); - assertUsers(getNumberOfUsers() + 4); + assertTaskExecutionStatus(getTaskOid(), TaskExecutionStatus.SUSPENDED); + assertUsers(getNumberOfUsers() + getProcessedUsers()); -// assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnmatched(), 4); -// assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountDeleted(), 0); -// assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountLinked(), 0); -// assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnlinked(), 0); + assertSynchronizationStatisticsActivation(taskAfter); } diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncFull.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncFull.java new file mode 100644 index 00000000000..e95fbd113b4 --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncFull.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.testing.story; + +import static org.testng.Assert.assertEquals; + +import java.io.File; + +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.xml.ns._public.common.common_3.IterativeTaskInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; + +/** + * @author katka + * + */ +public class TestThresholdsLiveSyncFull extends TestThresholds { + + private static final File TASK_LIVESYNC_OPENDJ_FULL_FILE = new File(TEST_DIR, "task-opendj-livesync-full.xml"); + private static final String TASK_LIVESYNC_OPENDJ_FULL_OID = "10335c7c-838f-11e8-93a6-4b1dd0ab58e4"; + + + @Override + protected File getTaskFile() { + return TASK_LIVESYNC_OPENDJ_FULL_FILE; + } + + @Override + protected String getTaskOid() { + return TASK_LIVESYNC_OPENDJ_FULL_OID; + } + + @Override + protected int getProcessedUsers() { + return 4; + } + + @Override + protected void assertSynchronizationStatisticsAfterImport(Task taskAfter) throws Exception { + SynchronizationInformationType syncInfo = taskAfter.getStoredOperationStats().getSynchronizationInformation(); + + assertSyncToken(taskAfter, 8, taskAfter.getResult()); + + assertEquals(syncInfo.getCountUnmatched(), 5); + assertEquals(syncInfo.getCountDeleted(), 0); + assertEquals(syncInfo.getCountLinked(), 0); + assertEquals(syncInfo.getCountUnlinked(), 0); + + assertEquals(syncInfo.getCountUnmatchedAfter(), 0); + assertEquals(syncInfo.getCountDeletedAfter(), 0); + assertEquals(syncInfo.getCountLinkedAfter(), getProcessedUsers()); + assertEquals(syncInfo.getCountUnlinkedAfter(), 0); + + } + + protected void assertSynchronizationStatisticsActivation(Task taskAfter) { + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnmatched(), 5); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountDeleted(), 0); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountLinked(), 0); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnlinked(), 0); + } +} diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncSimulate.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncSimulate.java new file mode 100644 index 00000000000..b062d15baf8 --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsLiveSyncSimulate.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.testing.story; + +import static org.testng.Assert.assertEquals; + +import java.io.File; + +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.xml.ns._public.common.common_3.IterativeTaskInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; + +/** + * @author katka + * + */ +public class TestThresholdsLiveSyncSimulate extends TestThresholds { + + private static final File TASK_LIVESYNC_OPENDJ_SIMULATE_FILE = new File(TEST_DIR, "task-opendj-livesync-simulate.xml"); + private static final String TASK_LIVESYNC_OPENDJ_SIMULATE_OID = "10335c7c-838f-11e8-93a6-4b1dd0ab58e4"; + + + @Override + protected File getTaskFile() { + return TASK_LIVESYNC_OPENDJ_SIMULATE_FILE; + } + + @Override + protected String getTaskOid() { + return TASK_LIVESYNC_OPENDJ_SIMULATE_OID; + } + + @Override + protected int getProcessedUsers() { + return 0; + } + + @Override + protected void assertSynchronizationStatisticsAfterImport(Task taskAfter) throws Exception { + SynchronizationInformationType syncInfo = taskAfter.getStoredOperationStats().getSynchronizationInformation(); + + assertSyncToken(taskAfter, 4, taskAfter.getResult()); + + assertEquals(syncInfo.getCountUnmatchedAfter(), 0); + assertEquals(syncInfo.getCountDeletedAfter(), 0); + assertEquals(syncInfo.getCountLinkedAfter(), 0); + assertEquals(syncInfo.getCountUnlinkedAfter(), 0); + + } + + protected void assertSynchronizationStatisticsActivation(Task taskAfter) { + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnmatched(), 5); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountDeleted(), 0); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountLinked(), 0); + assertEquals(taskAfter.getStoredOperationStats().getSynchronizationInformation().getCountUnlinked(), 0); + } + + +} diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconFull.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconFull.java new file mode 100644 index 00000000000..9c10a12867c --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconFull.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.testing.story; + +import static org.testng.Assert.assertEquals; + +import java.io.File; + +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.xml.ns._public.common.common_3.IterativeTaskInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; + +/** + * @author katka + * + */ +public class TestThresholdsReconFull extends TestThresholds { + + private static final File TASK_RECONCILE_OPENDJ_FULL_FILE = new File(TEST_DIR, "task-opendj-reconcile-full.xml"); + private static final String TASK_RECONCILE_OPENDJ_FULL_OID = "20335c7c-838f-11e8-93a6-4b1dd0ab58e4"; + + + @Override + protected File getTaskFile() { + return TASK_RECONCILE_OPENDJ_FULL_FILE; + } + + @Override + protected String getTaskOid() { + return TASK_RECONCILE_OPENDJ_FULL_OID; + } + + @Override + protected int getProcessedUsers() { + return 4; + } + + @Override + protected void assertSynchronizationStatisticsAfterImport(Task taskAfter) throws Exception { + IterativeTaskInformationType infoType = taskAfter.getStoredOperationStats().getIterativeTaskInformation(); + assertEquals(infoType.getTotalFailureCount(), 1); + + SynchronizationInformationType syncInfo = taskAfter.getStoredOperationStats().getSynchronizationInformation(); + + assertEquals(syncInfo.getCountUnmatched(), 5); + assertEquals(syncInfo.getCountDeleted(), 0); + assertEquals(syncInfo.getCountLinked(), getDefaultUsers()); + assertEquals(syncInfo.getCountUnlinked(), 0); + + assertEquals(syncInfo.getCountUnmatchedAfter(), 0); + assertEquals(syncInfo.getCountDeleted(), 0); + assertEquals(syncInfo.getCountLinkedAfter(), getDefaultUsers() + getProcessedUsers()); + assertEquals(syncInfo.getCountUnlinked(), 0); + } +} diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconSimulate.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconSimulate.java new file mode 100644 index 00000000000..7719f1b31f4 --- /dev/null +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestThresholdsReconSimulate.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.testing.story; + +import static org.testng.Assert.assertEquals; + +import java.io.File; + +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.xml.ns._public.common.common_3.IterativeTaskInformationType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationInformationType; + +/** + * @author katka + * + */ +public class TestThresholdsReconSimulate extends TestThresholds { + + + private static final File TASK_RECONCILE_OPENDJ_SIMULATE_FILE = new File(TEST_DIR, "task-opendj-reconcile-simulate.xml"); + private static final String TASK_RECONCILE_OPENDJ_SIMULATE_OID = "10335c7c-838f-11e8-93a6-4b1dd0ab58e4"; + + @Override + protected File getTaskFile() { + return TASK_RECONCILE_OPENDJ_SIMULATE_FILE; + } + + @Override + protected String getTaskOid() { + return TASK_RECONCILE_OPENDJ_SIMULATE_OID; + } + + @Override + protected int getProcessedUsers() { + return 0; + } + + @Override + protected void assertSynchronizationStatisticsAfterImport(Task taskAfter) throws Exception { + IterativeTaskInformationType infoType = taskAfter.getStoredOperationStats().getIterativeTaskInformation(); + assertEquals(infoType.getTotalFailureCount(), 1); + + SynchronizationInformationType syncInfo = taskAfter.getStoredOperationStats().getSynchronizationInformation(); + + assertEquals(syncInfo.getCountUnmatched(), 5); + assertEquals(syncInfo.getCountDeleted(), 0); + assertEquals(syncInfo.getCountLinked(), getDefaultUsers()); + assertEquals(syncInfo.getCountUnlinked(), 0); + + assertEquals(syncInfo.getCountUnmatchedAfter(), 0); + assertEquals(syncInfo.getCountDeletedAfter(), 0); + assertEquals(syncInfo.getCountLinkedAfter(), 0); + assertEquals(syncInfo.getCountUnlinkedAfter(), 0); + } + +} diff --git a/testing/story/src/test/resources/logback-test.xml b/testing/story/src/test/resources/logback-test.xml index 26bda76405e..8573bb290b0 100644 --- a/testing/story/src/test/resources/logback-test.xml +++ b/testing/story/src/test/resources/logback-test.xml @@ -39,6 +39,9 @@ + + + @@ -68,7 +71,7 @@ - + diff --git a/testing/story/src/test/resources/thresholds/resource-opendj.xml b/testing/story/src/test/resources/thresholds/resource-opendj.xml index 065abcff96c..f4703dcf28a 100644 --- a/testing/story/src/test/resources/thresholds/resource-opendj.xml +++ b/testing/story/src/test/resources/thresholds/resource-opendj.xml @@ -75,7 +75,7 @@ ri:dn Distinguished Name - mr:stringIgnoreCase + mr:distinguishedName @@ -180,6 +180,7 @@ c:name + polyStringNorm declare namespace ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"; diff --git a/testing/story/src/test/resources/thresholds/task-opendj-import-base-users.xml b/testing/story/src/test/resources/thresholds/task-opendj-import-base-users.xml new file mode 100644 index 00000000000..8a47d7bccbe --- /dev/null +++ b/testing/story/src/test/resources/thresholds/task-opendj-import-base-users.xml @@ -0,0 +1,34 @@ + + + + + HR Import + + account + + fa25e6dc-a858-11e7-8ebc-eb2b71ecce1d + + runnable + http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/import/handler-3 + + single + diff --git a/testing/story/src/test/resources/thresholds/task-opendj-reconcile.xml b/testing/story/src/test/resources/thresholds/task-opendj-livesync-full.xml similarity index 69% rename from testing/story/src/test/resources/thresholds/task-opendj-reconcile.xml rename to testing/story/src/test/resources/thresholds/task-opendj-livesync-full.xml index 9a9523134a5..a76a5096582 100644 --- a/testing/story/src/test/resources/thresholds/task-opendj-reconcile.xml +++ b/testing/story/src/test/resources/thresholds/task-opendj-livesync-full.xml @@ -20,45 +20,45 @@ - Reconciliation: Dummy + LiveSync Simulate: Dummy ri:inetOrgPerson account default + 4 - - http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/reconciliation/handler-3#simulate - - fatal - - - - http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/reconciliation/handler-3#execute - - fatal - - - 10335c7c-838f-11e8-93a6-4b1dd0ab58e4 suspended - http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/reconciliation/handler-3 + http://midpoint.evolveum.com/xml/ns/public/task/lightweigth-partitioning/handler-3 + + + + + 2 + http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/live-sync/handler-3 + execute + + fatal + + + + + recurring + tight - 3 + 1 - - - - diff --git a/testing/story/src/test/resources/thresholds/task-opendj-livesync-simulate.xml b/testing/story/src/test/resources/thresholds/task-opendj-livesync-simulate.xml new file mode 100644 index 00000000000..99a94ca5c38 --- /dev/null +++ b/testing/story/src/test/resources/thresholds/task-opendj-livesync-simulate.xml @@ -0,0 +1,64 @@ + + + + + + + + + LiveSync Simulate: Dummy + + + ri:inetOrgPerson + account + default + 4 + + + 10335c7c-838f-11e8-93a6-4b1dd0ab58e4 + + suspended + + http://midpoint.evolveum.com/xml/ns/public/task/lightweigth-partitioning/handler-3 + + + + + 1 + http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/live-sync/handler-3 + simulate + + fatal + + + + + + + recurring + tight + + 1 + + + diff --git a/testing/story/src/test/resources/thresholds/task-opendj-reconcile-full.xml b/testing/story/src/test/resources/thresholds/task-opendj-reconcile-full.xml new file mode 100644 index 00000000000..1b1f45fdf18 --- /dev/null +++ b/testing/story/src/test/resources/thresholds/task-opendj-reconcile-full.xml @@ -0,0 +1,66 @@ + + + + + + + + + Reconciliation Full: Dummy + + + ri:inetOrgPerson + account + default + + + 20335c7c-838f-11e8-93a6-4b1dd0ab58e4 + + suspended + + http://midpoint.evolveum.com/xml/ns/public/task/lightweigth-partitioning/handler-3 + + + + + 2 + http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/reconciliation/handler-3 + execute + + fatal + + + + + + + recurring + + 3 + + + + + + + + diff --git a/testing/story/src/test/resources/thresholds/task-opendj-reconcile-simulate.xml b/testing/story/src/test/resources/thresholds/task-opendj-reconcile-simulate.xml new file mode 100644 index 00000000000..9c20005b574 --- /dev/null +++ b/testing/story/src/test/resources/thresholds/task-opendj-reconcile-simulate.xml @@ -0,0 +1,69 @@ + + + + + + + + + Reconciliation Simulate: Dummy + + + ri:inetOrgPerson + account + default + + + 10335c7c-838f-11e8-93a6-4b1dd0ab58e4 + + suspended + + http://midpoint.evolveum.com/xml/ns/public/task/lightweigth-partitioning/handler-3 + + + + + 2 + http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/reconciliation/handler-3 + execute + + fatal + + + + 1 + http://midpoint.evolveum.com/xml/ns/public/model/synchronization/task/reconciliation/handler-3 + simulate + + fatal + + + + + + + recurring + + 3 + + + diff --git a/testing/story/src/test/resources/thresholds/users-base.ldif b/testing/story/src/test/resources/thresholds/users-base.ldif new file mode 100644 index 00000000000..07f6ae65ad6 --- /dev/null +++ b/testing/story/src/test/resources/thresholds/users-base.ldif @@ -0,0 +1,35 @@ +dn: uid=user1,ou=People,dc=example,dc=com +uid: user1 +cn: User First +sn: First +givenname: User +objectclass: top +objectclass: person +objectclass: organizationalPerson +objectclass: inetOrgPerson +l: Caribbean +mail: user.first@example.com + +dn: uid=user2,ou=People,dc=example,dc=com +uid: user2 +cn: User Second +sn: Second +givenname: User +objectclass: top +objectclass: person +objectclass: organizationalPerson +objectclass: inetOrgPerson +l: Caribbean +mail: user.second@example.com + +dn: uid=user3,ou=People,dc=example,dc=com +uid: user3 +cn: User Third +sn: Third +givenname: User +objectclass: top +objectclass: person +objectclass: organizationalPerson +objectclass: inetOrgPerson +l: Caribbean +mail: user.third@example.com diff --git a/testing/story/src/test/resources/thresholds/users.ldif b/testing/story/src/test/resources/thresholds/users.ldif index e09817ca573..8e5ead31bd2 100644 --- a/testing/story/src/test/resources/thresholds/users.ldif +++ b/testing/story/src/test/resources/thresholds/users.ldif @@ -1,39 +1,3 @@ -dn: uid=user1,ou=People,dc=example,dc=com -uid: user1 -cn: User First -sn: First -givenname: User -objectclass: top -objectclass: person -objectclass: organizationalPerson -objectclass: inetOrgPerson -l: Caribbean -mail: user.first@example.com - -dn: uid=user2,ou=People,dc=example,dc=com -uid: user2 -cn: User Second -sn: Second -givenname: User -objectclass: top -objectclass: person -objectclass: organizationalPerson -objectclass: inetOrgPerson -l: Caribbean -mail: user.second@example.com - -dn: uid=user3,ou=People,dc=example,dc=com -uid: user3 -cn: User Third -sn: Third -givenname: User -objectclass: top -objectclass: person -objectclass: organizationalPerson -objectclass: inetOrgPerson -l: Caribbean -mail: user.third@example.com - dn: uid=user4,ou=People,dc=example,dc=com uid: user4 cn: User Fourth diff --git a/testing/story/testng-integration.xml b/testing/story/testng-integration.xml index 57ca7dcee62..177989ec849 100644 --- a/testing/story/testng-integration.xml +++ b/testing/story/testng-integration.xml @@ -57,7 +57,10 @@ - + + + +