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 cd065a0adc4..2cd31ba952a 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 @@ -3757,6 +3757,13 @@ + + + + Execution environment configuration to use for partition task. + + + @@ -3823,6 +3830,13 @@ + + + + Execution environment configuration to use for partition task. + + + diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java index 58d652e3a31..26eca933b40 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/util/SimpleTaskAdapter.java @@ -853,4 +853,9 @@ public ObjectReferenceType getOwnerRef() { public Collection getCachingProfiles() { return emptySet(); } + + @Override + public TaskExecutionEnvironmentType getExecutionEnvironment() { + return null; + } } diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/StaticTaskPartitionsDefinition.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/StaticTaskPartitionsDefinition.java index 00dae357a77..30c6ae652d4 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/StaticTaskPartitionsDefinition.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/StaticTaskPartitionsDefinition.java @@ -126,6 +126,11 @@ public TaskWorkManagementType getWorkManagement(Task masterTask) { return data.getWorkManagement(); } + @Override + public TaskExecutionEnvironmentType getExecutionEnvironment(Task masterTask) { + return data.getExecutionEnvironment(); + } + @Override public Boolean isCopyMasterExtension(Task masterTask) { return data.isCopyMasterExtension(); @@ -169,6 +174,11 @@ public TaskWorkManagementType getWorkManagement(Task masterTask) { return data.getWorkManagement(); } + @Override + public TaskExecutionEnvironmentType getExecutionEnvironment(Task masterTask) { + return data.getExecutionEnvironment(); + } + @Override public Boolean isCopyMasterExtension(Task masterTask) { return data.isCopyMasterExtension(); diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java index 4425e675085..ea742018788 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java @@ -1047,4 +1047,6 @@ void flushPendingModifications(OperationResult parentResult) throws ObjectNotFou @NotNull Collection getCachingProfiles(); + + TaskExecutionEnvironmentType getExecutionEnvironment(); } diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskPartitionsDefinition.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskPartitionsDefinition.java index 08e93266a54..b2f6ba001d0 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskPartitionsDefinition.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/TaskPartitionsDefinition.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.task.api; import com.evolveum.midpoint.prism.delta.ItemDelta; +import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionEnvironmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskWorkManagementType; import org.jetbrains.annotations.NotNull; @@ -77,6 +78,13 @@ default TaskWorkManagementType getWorkManagement(Task masterTask) { return null; } + /** + * Execution environment to be used in subtask. + */ + default TaskExecutionEnvironmentType getExecutionEnvironment(Task masterTask) { + return null; + } + /** * Whether to copy extension from master task into subtask. */ @@ -124,6 +132,13 @@ default TaskWorkManagementType getWorkManagement(Task masterTask) { return null; } + /** + * Execution environment to be used in subtask. Overrides strategy.executionEnvironment. + */ + default TaskExecutionEnvironmentType getExecutionEnvironment(Task masterTask) { + return null; + } + /** * Whether to copy extension from master task into subtask. Overrides strategy.copyMasterExtension. */ 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 bfc7c14dc48..7352b82a627 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 @@ -2603,7 +2603,12 @@ public void addSubtask(TaskType subtaskBean) { @NotNull @Override public Collection getCachingProfiles() { - TaskExecutionEnvironmentType executionEnvironment = getTaskType().getExecutionEnvironment(); + TaskExecutionEnvironmentType executionEnvironment = getExecutionEnvironment(); return executionEnvironment != null ? executionEnvironment.getCachingProfile() : emptySet(); } + + @Override + public TaskExecutionEnvironmentType getExecutionEnvironment() { + return getTaskType().getExecutionEnvironment(); + } } 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 1c12aedc3f5..d76fd05921d 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 @@ -16,7 +16,6 @@ package com.evolveum.midpoint.task.quartzimpl.handlers; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.delta.ItemDelta; @@ -261,6 +260,12 @@ private String createSubtask(int index, TaskPartitionsDefinition partitionsDefin null, partition, partitionsDefinition); // work management is updated and stored into subtask later + TaskExecutionEnvironmentType executionEnvironment = applyDefaults( + p -> p.getExecutionEnvironment(masterTask), + ps -> ps.getExecutionEnvironment(masterTask), + masterTask.getExecutionEnvironment(), partition, partitionsDefinition); + subtask.setExecutionEnvironment(CloneUtil.clone(executionEnvironment)); + String handlerUriTemplate = applyDefaults( p -> p.getHandlerUri(masterTask), ps -> ps.getHandlerUri(masterTask), diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/WorkStateManager.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/WorkStateManager.java index 534964276f8..d398857fcda 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/WorkStateManager.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/WorkStateManager.java @@ -16,27 +16,9 @@ package com.evolveum.midpoint.task.quartzimpl.work; -import static com.evolveum.midpoint.schema.util.TaskWorkStateTypeUtil.findBucketByNumber; -import static java.util.Collections.singletonList; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; - -import org.apache.commons.lang.BooleanUtils; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.prism.delta.ItemDeltaCollectionsUtil; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -47,7 +29,6 @@ import com.evolveum.midpoint.repo.api.VersionPrecondition; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.TaskWorkStateTypeUtil; -import com.evolveum.midpoint.task.api.RunningTask; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskExecutionStatus; import com.evolveum.midpoint.task.api.TaskManager; @@ -62,7 +43,6 @@ import com.evolveum.midpoint.task.quartzimpl.work.segmentation.WorkSegmentationStrategyFactory; import com.evolveum.midpoint.task.quartzimpl.work.segmentation.content.WorkBucketContentHandler; import com.evolveum.midpoint.task.quartzimpl.work.segmentation.content.WorkBucketContentHandlerRegistry; -import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.backoff.BackoffComputer; import com.evolveum.midpoint.util.backoff.ExponentialBackoffComputer; import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; @@ -71,15 +51,21 @@ import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkSegmentationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; -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.WorkAllocationConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketStateType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.WorkBucketType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.apache.commons.lang.BooleanUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import static com.evolveum.midpoint.schema.util.TaskWorkStateTypeUtil.findBucketByNumber; +import static java.util.Collections.singletonList; /** * Responsible for managing task work state. @@ -109,7 +95,7 @@ private class Context { Task coordinatorTask; // null for standalone worker tasks final Supplier canRunSupplier; - public Context(Supplier canRunSupplier) { + Context(Supplier canRunSupplier) { this.canRunSupplier = canRunSupplier; } @@ -121,15 +107,15 @@ public boolean isStandalone() { return kind == null || kind == TaskKindType.STANDALONE; } - public void reloadCoordinatorTask(OperationResult result) throws SchemaException, ObjectNotFoundException { + void reloadCoordinatorTask(OperationResult result) throws SchemaException, ObjectNotFoundException { coordinatorTask = taskManager.getTask(coordinatorTask.getOid(), null, result); } - public void reloadWorkerTask(OperationResult result) throws SchemaException, ObjectNotFoundException { + void reloadWorkerTask(OperationResult result) throws SchemaException, ObjectNotFoundException { workerTask = taskManager.getTask(workerTask.getOid(), null, result); } - public TaskWorkManagementType getWorkStateConfiguration() { + TaskWorkManagementType getWorkStateConfiguration() { return isStandalone() ? workerTask.getWorkManagement() : coordinatorTask.getWorkManagement(); } } diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/workers/WorkersManager.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/workers/WorkersManager.java index 5eabc79ff1f..7ffe85b23f9 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/workers/WorkersManager.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/work/workers/WorkersManager.java @@ -250,9 +250,10 @@ private int createWorkers(Task coordinatorTask, MultiValuedMap coordinatorExtension = coordinatorTask.getExtensionClone(); if (coordinatorExtension != null) { diff --git a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/AbstractTaskManagerTest.java b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/AbstractTaskManagerTest.java index 828e472145f..72d5147a626 100644 --- a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/AbstractTaskManagerTest.java +++ b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/AbstractTaskManagerTest.java @@ -43,13 +43,10 @@ import org.testng.annotations.BeforeSuite; import org.xml.sax.SAXException; -import javax.xml.bind.JAXBException; import java.io.File; import java.io.IOException; import java.math.BigInteger; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; +import java.util.*; import static com.evolveum.midpoint.test.IntegrationTestTools.display; import static com.evolveum.midpoint.test.IntegrationTestTools.waitFor; @@ -77,7 +74,9 @@ public class AbstractTaskManagerTest extends AbstractTestNGSpringContextTests { protected static final String PARALLEL_TASK_HANDLER_URI = "http://midpoint.evolveum.com/test/parallel-task-handler"; protected static final String LONG_TASK_HANDLER_URI = "http://midpoint.evolveum.com/test/long-task-handler"; - private static final String USER_ADMINISTRATOR_FILE = "src/test/resources/common/user-administrator.xml"; + public static final String COMMON_DIR = "src/test/resources/common"; + private static final File USER_ADMINISTRATOR_FILE = new File(COMMON_DIR, "user-administrator.xml"); + static final File SYSTEM_CONFIGURATION_FILE = new File(COMMON_DIR, "system-configuration.xml"); // TODO make configurable. Due to a race condition there can be a small number of unoptimized complete buckets // (it should not exceed the number of workers ... at least not by much amount :) @@ -149,10 +148,10 @@ public void setup() throws SchemaException, SAXException, IOException { public void initialize() throws Exception { initHandlers(); - addObjectFromFile(USER_ADMINISTRATOR_FILE); + addObjectFromFile(USER_ADMINISTRATOR_FILE.getPath()); } - protected PrismObject unmarshallJaxbFromFile(String filePath) throws IOException, JAXBException, SchemaException { + protected PrismObject unmarshallJaxbFromFile(String filePath) throws IOException, SchemaException { File file = new File(filePath); return PrismTestUtil.parseObject(file); } @@ -347,4 +346,13 @@ protected Collection> retrieveItemsNamed(Ob .build(); } + void assertCachingProfiles(Task task, String... expectedProfiles) { + Set realProfiles = getCachingProfiles(task); + assertEquals("Wrong caching profiles in " + task, new HashSet<>(Arrays.asList(expectedProfiles)), realProfiles); + } + + private Set getCachingProfiles(Task task) { + TaskExecutionEnvironmentType env = task.getExecutionEnvironment(); + return env != null ? new HashSet<>(env.getCachingProfile()) : Collections.emptySet(); + } } diff --git a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestWorkersManagement.java b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestWorkersManagement.java index f99247cdd7e..f41df2da531 100644 --- a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestWorkersManagement.java +++ b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestWorkersManagement.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.task.quartzimpl; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.cache.CacheConfigurationManager; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.task.api.TaskExecutionStatus; @@ -23,6 +24,7 @@ import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +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.TaskKindType; import org.jetbrains.annotations.NotNull; @@ -54,15 +56,17 @@ public class TestWorkersManagement extends AbstractTaskManagerTest { private static final transient Trace LOGGER = TraceManager.getTrace(TestWorkersManagement.class); - public static final long DEFAULT_SLEEP_INTERVAL = 250L; - public static final long DEFAULT_TIMEOUT = 30000L; + private static final long DEFAULT_SLEEP_INTERVAL = 250L; + private static final long DEFAULT_TIMEOUT = 30000L; @Autowired private WorkStateManager workStateManager; + @Autowired private CacheConfigurationManager cacheConfigurationManager; private static String taskFilename(String testName, String subId) { return "src/test/resources/workers/task-" + testNumber(testName) + "-" + subId + ".xml"; } + @SuppressWarnings("unused") private static String taskFilename(String testName) { return taskFilename(testName, "0"); } @@ -71,6 +75,7 @@ private static String taskOid(String testName, String subId) { return "44444444-2222-2222-2223-" + testNumber(testName) + subId + "00000000"; } + @SuppressWarnings("unused") private static String taskOid(String test) { return taskOid(test, "0"); } @@ -79,23 +84,25 @@ private static String testNumber(String test) { return test.substring(4, 7); } + @SuppressWarnings("unused") @NotNull protected String workerTaskFilename(String TEST_NAME) { return taskFilename(TEST_NAME, "w"); } @NotNull - protected String coordinatorTaskFilename(String TEST_NAME) { + private String coordinatorTaskFilename(String TEST_NAME) { return taskFilename(TEST_NAME, "c"); } + @SuppressWarnings("unused") @NotNull protected String workerTaskOid(String TEST_NAME) { return taskOid(TEST_NAME, "w"); } @NotNull - protected String coordinatorTaskOid(String TEST_NAME) { + private String coordinatorTaskOid(String TEST_NAME) { return taskOid(TEST_NAME, "c"); } @@ -104,6 +111,9 @@ public void initialize() throws Exception { super.initialize(); workStateManager.setFreeBucketWaitIntervalOverride(1000L); DebugUtil.setPrettyPrintBeansAs(PrismContext.LANG_YAML); + + cacheConfigurationManager.applyCachingConfiguration( + (SystemConfigurationType) prismContext.parseObject(SYSTEM_CONFIGURATION_FILE).asObjectable()); } @Test @@ -134,6 +144,8 @@ public void test100CreateWorkersSingle() throws Exception { display("coordinator task", coordinatorTask); display("worker task", workers.get(0)); + assertCachingProfiles(coordinatorTask, "profile1"); + assertCachingProfiles(workers.get(0), "profile1"); waitForTaskClose(coordinatorTaskOid, result, DEFAULT_TIMEOUT, DEFAULT_SLEEP_INTERVAL); @@ -162,7 +174,7 @@ public void test100CreateWorkersSingle() throws Exception { } } - @Test + @Test public void test110CreateWorkersRecurring() throws Exception { final String TEST_NAME = "test110CreateWorkersRecurring"; OperationResult result = createResult(TEST_NAME, LOGGER); @@ -234,6 +246,7 @@ public void test110CreateWorkersRecurring() throws Exception { //assertEquals("Wrong state-before-suspend of coordinator", TaskExecutionStatusType.RUNNABLE, // coordinatorTask.getStateBeforeSuspend()); assertEquals("Wrong execution status of worker", TaskExecutionStatus.CLOSED, worker.getExecutionStatus()); + //noinspection SimplifiedTestNGAssertion assertEquals("Wrong state-before-suspend of worker", null, worker.getStateBeforeSuspend()); // (4) ------------------------------------------------------------------------------------ WHEN (resume the tree) @@ -252,7 +265,9 @@ public void test110CreateWorkersRecurring() throws Exception { assertEquals("Wrong execution status of coordinator", TaskExecutionStatus.RUNNABLE, coordinatorTask.getExecutionStatus()); + //noinspection SimplifiedTestNGAssertion assertEquals("Wrong state-before-suspend of coordinator", null, coordinatorTask.getStateBeforeSuspend()); + //noinspection SimplifiedTestNGAssertion assertEquals("Wrong state-before-suspend of worker", null, worker.getStateBeforeSuspend()); // (5) ------------------------------------------------------------------------------------ WHEN (suspend the tree while worker is executing) @@ -332,8 +347,14 @@ public void test200SimplePartitioning() throws Exception { assertEquals("Wrong task kind", TaskKindType.PARTITIONED_MASTER, masterTask.getWorkManagement().getTaskKind()); assertEquals("Wrong # of partitions", 3, subtasks.size()); + assertCachingProfiles(masterTask, "profile1"); + assertCachingProfiles(subtasks.get(0), "profile1"); + assertCachingProfiles(subtasks.get(1), "profile1"); + assertCachingProfiles(subtasks.get(2), "profile1"); + waitForTaskCloseCheckingSubtasks(masterTaskOid, result, DEFAULT_TIMEOUT, DEFAULT_SLEEP_INTERVAL); + //noinspection SimplifiedTestNGAssertion assertEquals("Unexpected failure", null, partitionedWorkBucketsTaskHandler.getFailure()); // TODO some asserts here @@ -369,6 +390,7 @@ public void test210PartitioningToWorkersSingleBucket() throws Exception { assertEquals("Wrong task kind", TaskKindType.PARTITIONED_MASTER, masterTask.getWorkManagement().getTaskKind()); assertEquals("Wrong # of partitions", 3, subtasks.size()); + Task first = subtasks.stream().filter(t -> t.getName().getOrig().contains("(1)")).findFirst().orElse(null); Task second = subtasks.stream().filter(t -> t.getName().getOrig().contains("(2)")).findFirst().orElse(null); Task third = subtasks.stream().filter(t -> t.getName().getOrig().contains("(3)")).findFirst().orElse(null); assertNotNull("Second-phase task was not created", second); @@ -381,6 +403,12 @@ public void test210PartitioningToWorkersSingleBucket() throws Exception { display("Subtasks of second task after completion", secondSubtasks); assertEquals("Wrong # of second task's subtasks", 3, secondSubtasks.size()); + assertCachingProfiles(masterTask, "profile1"); + assertCachingProfiles(first, "profile1"); + assertCachingProfiles(second, "profile2"); + assertCachingProfiles(third, "profile1"); + secondSubtasks.forEach(t -> assertCachingProfiles(t, "profile2")); + waitForTaskCloseCheckingSubtasks(third.getOid(), result, DEFAULT_TIMEOUT, DEFAULT_SLEEP_INTERVAL); third = taskManager.getTask(third.getOid(), result); display("Third task after completion", third); @@ -390,6 +418,7 @@ public void test210PartitioningToWorkersSingleBucket() throws Exception { waitForTaskCloseCheckingSubtasks(masterTaskOid, result, DEFAULT_TIMEOUT, DEFAULT_SLEEP_INTERVAL); + //noinspection SimplifiedTestNGAssertion assertEquals("Unexpected failure", null, partitionedWorkBucketsTaskHandler.getFailure()); // TODO some asserts here @@ -400,7 +429,7 @@ public void test210PartitioningToWorkersSingleBucket() throws Exception { } } - @Test(enabled = false) // MID-5041 + @Test public void test220PartitioningToWorkersMoreBuckets() throws Exception { final String TEST_NAME = "test220PartitioningToWorkersMoreBuckets"; OperationResult result = createResult(TEST_NAME, LOGGER); @@ -425,6 +454,7 @@ public void test220PartitioningToWorkersMoreBuckets() throws Exception { assertEquals("Wrong task kind", TaskKindType.PARTITIONED_MASTER, masterTask.getWorkManagement().getTaskKind()); assertEquals("Wrong # of partitions", 3, subtasks.size()); + Task first = subtasks.stream().filter(t -> t.getName().getOrig().contains("(1)")).findFirst().orElse(null); Task second = subtasks.stream().filter(t -> t.getName().getOrig().contains("(2)")).findFirst().orElse(null); Task third = subtasks.stream().filter(t -> t.getName().getOrig().contains("(3)")).findFirst().orElse(null); assertNotNull("Second-phase task was not created", second); @@ -444,8 +474,16 @@ public void test220PartitioningToWorkersMoreBuckets() throws Exception { display("Subtasks of third task after completion", thirdSubtasks); assertEquals("Wrong # of third task's subtasks", 2, thirdSubtasks.size()); + assertCachingProfiles(masterTask, "profile1"); + assertCachingProfiles(first, "profile2"); + assertCachingProfiles(second, "profile2"); + assertCachingProfiles(third, "profile3"); + secondSubtasks.forEach(t -> assertCachingProfiles(t, "profile2")); + thirdSubtasks.forEach(t -> assertCachingProfiles(t, "profile3")); + waitForTaskCloseCheckingSubtasks(masterTaskOid, result, DEFAULT_TIMEOUT, DEFAULT_SLEEP_INTERVAL); + //noinspection SimplifiedTestNGAssertion assertEquals("Unexpected failure", null, partitionedWorkBucketsTaskHandler.getFailure()); assertEquals("Wrong # of items processed", 41, partitionedWorkBucketsTaskHandler.getItemsProcessed()); diff --git a/repo/task-quartz-impl/src/test/resources/common/system-configuration.xml b/repo/task-quartz-impl/src/test/resources/common/system-configuration.xml new file mode 100644 index 00000000000..527fe08d8e6 --- /dev/null +++ b/repo/task-quartz-impl/src/test/resources/common/system-configuration.xml @@ -0,0 +1,31 @@ + + + + + + + profile1 + + + profile2 + + + profile3 + + + + \ No newline at end of file diff --git a/repo/task-quartz-impl/src/test/resources/workers/task-100-c.xml b/repo/task-quartz-impl/src/test/resources/workers/task-100-c.xml index 91a86cb82d8..2646d4122ef 100644 --- a/repo/task-quartz-impl/src/test/resources/workers/task-100-c.xml +++ b/repo/task-quartz-impl/src/test/resources/workers/task-100-c.xml @@ -44,4 +44,7 @@ single loose + + profile1 + diff --git a/repo/task-quartz-impl/src/test/resources/workers/task-200-r.xml b/repo/task-quartz-impl/src/test/resources/workers/task-200-r.xml index 141d7bae7d3..c64b96cbeec 100644 --- a/repo/task-quartz-impl/src/test/resources/workers/task-200-r.xml +++ b/repo/task-quartz-impl/src/test/resources/workers/task-200-r.xml @@ -30,4 +30,7 @@ single loose + + profile1 + diff --git a/repo/task-quartz-impl/src/test/resources/workers/task-210-r.xml b/repo/task-quartz-impl/src/test/resources/workers/task-210-r.xml index 2fb75f06169..46798c4c047 100644 --- a/repo/task-quartz-impl/src/test/resources/workers/task-210-r.xml +++ b/repo/task-quartz-impl/src/test/resources/workers/task-210-r.xml @@ -40,6 +40,9 @@ + + profile2 + 3 @@ -56,4 +59,7 @@ single loose + + profile1 + diff --git a/repo/task-quartz-impl/src/test/resources/workers/task-220-r.xml b/repo/task-quartz-impl/src/test/resources/workers/task-220-r.xml index 1cbee5f8981..8c118490263 100644 --- a/repo/task-quartz-impl/src/test/resources/workers/task-220-r.xml +++ b/repo/task-quartz-impl/src/test/resources/workers/task-220-r.xml @@ -30,6 +30,9 @@ + + profile2 + 2 @@ -65,9 +68,15 @@ + + profile3 + single loose + + profile1 +