Skip to content

Commit

Permalink
Fixing DeleteTaskHandler (+test)
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Jun 22, 2015
1 parent c89fd93 commit d201a05
Show file tree
Hide file tree
Showing 11 changed files with 198 additions and 40 deletions.
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2014 Evolveum
* Copyright (c) 2010-2015 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -19,17 +19,13 @@
import java.util.*;
import java.util.Map.Entry;

import javax.xml.bind.JAXBElement;

import com.evolveum.midpoint.prism.util.CloneUtil;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.util.ParamsTypeUtil;
import com.evolveum.midpoint.schema.util.SchemaDebugUtil;
Expand All @@ -39,14 +35,9 @@
import com.evolveum.midpoint.util.exception.CommonException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.EntryType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LocalizedMessageType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectFactory;
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.OperationResultType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ParamsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UnknownJavaObjectType;

/**
* Nested Operation Result.
Expand Down Expand Up @@ -311,6 +302,19 @@ public OperationResult findSubresult(String operation) {
}
return null;
}

public List<OperationResult> findSubresults(String operation) {
List<OperationResult> found = new ArrayList<>();
if (subresults == null) {
return found;
}
for (OperationResult subResult: getSubresults()) {
if (operation.equals(subResult.getOperation())) {
found.add(subResult);
}
}
return found;
}

/**
* Contains operation status as defined in {@link OperationResultStatus}
Expand Down Expand Up @@ -967,10 +971,14 @@ public static OperationResult createOperationResult(OperationResultType result)
String localizedMessage = message == null ? null : message.getKey();
List<Serializable> localizedArguments = message == null ? null : (List<Serializable>) (List) message.getArgument(); // FIXME: brutal hack

return new OperationResult(result.getOperation(), params, context, returns,
OperationResult opResult = new OperationResult(result.getOperation(), params, context, returns,
OperationResultStatus.parseStatusType(result.getStatus()), result.getToken(),
result.getMessageCode(), result.getMessage(), localizedMessage, localizedArguments, null,
subresults);
if (result.getCount() != null) {
opResult.setCount(result.getCount());
}
return opResult;
}

public OperationResultType createOperationResultType() {
Expand All @@ -981,6 +989,9 @@ private OperationResultType createOperationResultType(OperationResult opResult)
OperationResultType result = new OperationResultType();
result.setToken(opResult.getToken());
result.setStatus(OperationResultStatus.createStatusType(opResult.getStatus()));
if (opResult.getCount() != 1) {
result.setCount(opResult.getCount());
}
result.setOperation(opResult.getOperation());
result.setMessage(opResult.getMessage());
result.setMessageCode(opResult.getMessageCode());
Expand Down Expand Up @@ -1207,6 +1218,9 @@ private OperationResult findSimilarSubresult(OperationResult subresult) {
if (sub == subresult) {
continue;
}
if (!sub.operation.equals(subresult.operation)) {
continue;
}
if (sub.status != subresult.status) {
continue;
}
Expand Down
Expand Up @@ -7985,6 +7985,7 @@
<xsd:sequence>
<xsd:element name="operation" type="xsd:string"/>
<xsd:element name="status" type="tns:OperationResultStatusType"/>
<xsd:element name="count" type="xsd:int" minOccurs="0" default="1"/>
<xsd:element name="params" type="tns:ParamsType" minOccurs="0"/>
<xsd:element name="context" type="tns:ParamsType" minOccurs="0"/>
<xsd:element name="returns" type="tns:ParamsType" minOccurs="0"/>
Expand Down
Expand Up @@ -81,25 +81,26 @@
public interface ModelService {

// Constants for OperationResult
String CLASS_NAME_WITH_DOT = ModelService.class.getName() + ".";
String GET_OBJECT = CLASS_NAME_WITH_DOT + "getObject";
String COUNT_OBJECTS = CLASS_NAME_WITH_DOT + "countObjects";
String EXECUTE_CHANGES = CLASS_NAME_WITH_DOT + "executeChanges";
String EXECUTE_CHANGE = CLASS_NAME_WITH_DOT + "executeChange";
String RECOMPUTE = CLASS_NAME_WITH_DOT + "recompute";
String GET_PROPERTY_AVAILABLE_VALUES = CLASS_NAME_WITH_DOT + "getPropertyAvailableValues";
String LIST_OBJECTS = CLASS_NAME_WITH_DOT + "listObjects";
String LIST_ACCOUNT_SHADOW_OWNER = CLASS_NAME_WITH_DOT + "listAccountShadowOwner";
String LIST_RESOURCE_OBJECT_SHADOWS = CLASS_NAME_WITH_DOT + "listResourceObjectShadows";
String LIST_RESOURCE_OBJECTS = CLASS_NAME_WITH_DOT + "listResourceObjects";
String TEST_RESOURCE = CLASS_NAME_WITH_DOT + "testResource";
String IMPORT_ACCOUNTS_FROM_RESOURCE = CLASS_NAME_WITH_DOT + "importAccountsFromResource";
String IMPORT_OBJECTS_FROM_FILE = CLASS_NAME_WITH_DOT + "importObjectsFromFile";
String IMPORT_OBJECTS_FROM_STREAM = CLASS_NAME_WITH_DOT + "importObjectsFromStream";
String POST_INIT = CLASS_NAME_WITH_DOT + "postInit";
String DISCOVER_CONNECTORS = CLASS_NAME_WITH_DOT + "discoverConnectors";
static final String CLASS_NAME_WITH_DOT = ModelService.class.getName() + ".";
static final String GET_OBJECT = CLASS_NAME_WITH_DOT + "getObject";
static final String SEARCH_OBJECTS = CLASS_NAME_WITH_DOT + "searchObjects";
static final String COUNT_OBJECTS = CLASS_NAME_WITH_DOT + "countObjects";
static final String EXECUTE_CHANGES = CLASS_NAME_WITH_DOT + "executeChanges";
static final String EXECUTE_CHANGE = CLASS_NAME_WITH_DOT + "executeChange";
static final String RECOMPUTE = CLASS_NAME_WITH_DOT + "recompute";
static final String GET_PROPERTY_AVAILABLE_VALUES = CLASS_NAME_WITH_DOT + "getPropertyAvailableValues";
static final String LIST_OBJECTS = CLASS_NAME_WITH_DOT + "listObjects";
static final String LIST_ACCOUNT_SHADOW_OWNER = CLASS_NAME_WITH_DOT + "listAccountShadowOwner";
static final String LIST_RESOURCE_OBJECT_SHADOWS = CLASS_NAME_WITH_DOT + "listResourceObjectShadows";
static final String LIST_RESOURCE_OBJECTS = CLASS_NAME_WITH_DOT + "listResourceObjects";
static final String TEST_RESOURCE = CLASS_NAME_WITH_DOT + "testResource";
static final String IMPORT_ACCOUNTS_FROM_RESOURCE = CLASS_NAME_WITH_DOT + "importAccountsFromResource";
static final String IMPORT_OBJECTS_FROM_FILE = CLASS_NAME_WITH_DOT + "importObjectsFromFile";
static final String IMPORT_OBJECTS_FROM_STREAM = CLASS_NAME_WITH_DOT + "importObjectsFromStream";
static final String POST_INIT = CLASS_NAME_WITH_DOT + "postInit";
static final String DISCOVER_CONNECTORS = CLASS_NAME_WITH_DOT + "discoverConnectors";

String AUTZ_NAMESPACE = AuthorizationConstants.NS_AUTHORIZATION_MODEL;
static final String AUTZ_NAMESPACE = AuthorizationConstants.NS_AUTHORIZATION_MODEL;

/**
* <p>
Expand Down
Expand Up @@ -210,7 +210,6 @@ public class ModelController implements ModelService, ModelInteractionService, T

// Constants for OperationResult
public static final String CLASS_NAME_WITH_DOT = ModelController.class.getName() + ".";
public static final String SEARCH_OBJECTS = CLASS_NAME_WITH_DOT + "searchObjects";
public static final String ADD_OBJECT_WITH_EXCLUSION = CLASS_NAME_WITH_DOT + "addObjectWithExclusion";
public static final String MODIFY_OBJECT_WITH_EXCLUSION = CLASS_NAME_WITH_DOT
+ "modifyObjectWithExclusion";
Expand Down
Expand Up @@ -106,6 +106,10 @@ public <O extends ObjectType> TaskRunResult runInternal(Task task) {
opResult.setStatus(OperationResultStatus.IN_PROGRESS);
TaskRunResult runResult = new TaskRunResult();
runResult.setOperationResult(opResult);

opResult.setSummarizeErrors(true);
opResult.setSummarizePartialErrors(true);
opResult.setSummarizeSuccesses(true);

QueryType queryType;
PrismProperty<QueryType> objectQueryPrismProperty = task.getExtensionProperty(SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY);
Expand Down Expand Up @@ -203,7 +207,11 @@ public <O extends ObjectType> TaskRunResult runInternal(Task task) {
progress++;
}

opResult.summarize();
task.setProgress(progress);
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Deleted {} objects, result:\n{}", progress, opResult.debugDump());
}

} while (!objects.isEmpty());

Expand All @@ -225,6 +233,8 @@ public <O extends ObjectType> TaskRunResult runInternal(Task task) {

runResult.setProgress(progress);
runResult.setRunResultStatus(TaskRunResultStatus.FINISHED);
opResult.summarize();
opResult.recordSuccess();

long wallTime = System.currentTimeMillis() - startTimestamp;

Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2013 Evolveum
* Copyright (c) 2010-2015 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -30,6 +30,8 @@

import javax.xml.namespace.QName;

import org.apache.commons.lang.mutable.MutableInt;
import org.opends.messages.TaskMessages;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
Expand All @@ -43,18 +45,24 @@
import com.evolveum.midpoint.audit.api.AuditEventStage;
import com.evolveum.midpoint.audit.api.AuditEventType;
import com.evolveum.midpoint.common.monitor.InternalMonitor;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskHandler;
import com.evolveum.midpoint.model.impl.sync.ReconciliationTaskResultListener;
import com.evolveum.midpoint.model.impl.util.DebugReconciliationTaskResultListener;
import com.evolveum.midpoint.model.intest.AbstractInitializedModelIntegrationTest;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.util.PrismTestUtil;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.ObjectDeltaOperation;
import com.evolveum.midpoint.schema.ResultHandler;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.constants.MidPointConstants;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.test.DummyResourceContoller;
import com.evolveum.midpoint.test.IntegrationTestTools;
Expand Down Expand Up @@ -176,6 +184,9 @@ public class TestImportRecon extends AbstractInitializedModelIntegrationTest {
protected static final File TASK_RECONCILE_DUMMY_LIME_FILE = new File(TEST_DIR, "task-reconcile-dummy-lime.xml");
protected static final String TASK_RECONCILE_DUMMY_LIME_OID = "10000000-0000-0000-5656-565600131204";

protected static final File TASK_DELETE_DUMMY_SHADOWS_FILE = new File(TEST_DIR, "task-delete-dummy-shadows.xml");
protected static final String TASK_DELETE_DUMMY_SHADOWS_OID = "abaab842-18be-11e5-9416-001e8c717e5b";

protected DummyResource dummyResourceAzure;
protected DummyResourceContoller dummyResourceCtlAzure;
protected ResourceType resourceDummyAzureType;
Expand Down Expand Up @@ -1345,6 +1356,66 @@ public void test510ImportFromResourceDummy() throws Exception {
assertShadowKindIntent(ACCOUNT_AUGUSTUS_OID, ShadowKindType.ACCOUNT, SchemaConstants.INTENT_DEFAULT);
assertShadowKindIntent(ACCOUNT_TAUGUSTUS_OID, ShadowKindType.ACCOUNT, INTENT_TEST);
}

@Test
public void test900DeleteDummyShadows() throws Exception {
final String TEST_NAME = "test900DeleteDummyShadows";
TestUtil.displayTestTile(this, TEST_NAME);

// GIVEN
Task task = createTask(TestImportRecon.class.getName() + "." + TEST_NAME);
OperationResult result = task.getResult();

// Preconditions
assertUsers(17);
dummyAuditService.clear();
rememberShadowFetchOperationCount();

// WHEN
TestUtil.displayWhen(TEST_NAME);
importObjectFromFile(TASK_DELETE_DUMMY_SHADOWS_FILE);

// THEN
TestUtil.displayThen(TEST_NAME);

waitForTaskFinish(TASK_DELETE_DUMMY_SHADOWS_OID, true, 20000);

// THEN
TestUtil.displayThen(TEST_NAME);
assertShadowFetchOperationCountIncrement(0);

PrismObject<TaskType> deleteTask = getTask(TASK_DELETE_DUMMY_SHADOWS_OID);
OperationResultType deleteTaskResultType = deleteTask.asObjectable().getResult();
display("Final delete task result", deleteTaskResultType);
TestUtil.assertSuccess(deleteTaskResultType);
OperationResult deleteTaskResult = OperationResult.createOperationResult(deleteTaskResultType);
TestUtil.assertSuccess(deleteTaskResult);
List<OperationResult> opExecResults = deleteTaskResult.findSubresults(ModelService.EXECUTE_CHANGES);
assertEquals(1, opExecResults.size());
OperationResult opExecResult = opExecResults.get(0);
TestUtil.assertSuccess(opExecResult);
assertEquals("Wrong exec operation count", 17, opExecResult.getCount());
assertTrue("Too many subresults: "+deleteTaskResult.getSubresults().size(), deleteTaskResult.getSubresults().size() < 10);

assertUsers(17);

ObjectQuery query = ObjectQueryUtil.createResourceAndObjectClassQuery(RESOURCE_DUMMY_OID,
new QName(RESOURCE_DUMMY_NAMESPACE, "AccountObjectClass"), prismContext);

final MutableInt count = new MutableInt(0);
ResultHandler<ShadowType> handler = new ResultHandler<ShadowType>() {
@Override
public boolean handle(PrismObject<ShadowType> shadow, OperationResult parentResult) {
count.increment();
display("Found",shadow);
return true;
}
};
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createRaw());
modelService.searchObjectsIterative(ShadowType.class, query, handler, options, task, result);
assertEquals("Unexpected number of search results", 0, count.getValue());

}

private void assertImportAuditModifications(int expectedModifications) {
display("Audit", dummyAuditService);
Expand Down
1 change: 1 addition & 0 deletions model/model-intest/src/test/resources/logback-test.xml
Expand Up @@ -74,6 +74,7 @@
<logger name="com.evolveum.midpoint.model.impl.controller.ModelController" level="DEBUG" />
<logger name="com.evolveum.icf.dummy" level="INFO" />
<logger name="com.evolveum.midpoint.model.impl.expr" level="DEBUG" />
<logger name="com.evolveum.midpoint.model.impl.util.DeleteTaskHandler" level="TRACE" />

<logger name="com.evolveum.midpoint.security.impl.SecurityEnforcerImpl" level="DEBUG" />

Expand Down
Expand Up @@ -15,11 +15,11 @@
~ limitations under the License.
-->

<task oid="412218e4-184b-11e5-9c9b-3c970e467874"
<task oid="abaab842-18be-11e5-9416-001e8c717e5b"
xmlns="http://midpoint.evolveum.com/xml/ns/public/common/common-3"
xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"
xmlns:modelext="http://midpoint.evolveum.com/xml/ns/public/model/extension-3"
xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3"
xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance/10000000-0000-0000-0000-000000000004"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

Expand All @@ -31,14 +31,14 @@
<q:filter>
<q:and>
<q:ref>
<q:path>i:resourceRef</q:path>
<q:path>resourceRef</q:path>
<q:value>
<oid>10000000-0000-0000-0000-000000000003</oid>
<oid>10000000-0000-0000-0000-000000000004</oid>
</q:value>
</q:ref>
<q:equal>
<q:path>objectClass</q:path>
<q:value>ri:inetOrgPerson</q:value>
<q:value>ri:AccountObjectClass</q:value>
</q:equal>
</q:and>
</q:filter>
Expand Down
Expand Up @@ -63,6 +63,7 @@
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.SystemObjectsType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

/**
Expand Down Expand Up @@ -109,8 +110,8 @@ public class TestLdap extends AbstractModelIntegrationTest {
private static final String ACCOUNT_LECHUCK_NAME = "lechuck";
private static final String ACCOUNT_CHARLES_NAME = "charles";

protected static final File TASK_DELETE_DUMMY_SHADOWS_FILE = new File(TEST_DIR, "task-delete-dummy-shadows.xml");
protected static final String TASK_DELETE_DUMMY_SHADOWS_OID = "412218e4-184b-11e5-9c9b-3c970e467874";
protected static final File TASK_DELETE_OPENDJ_SHADOWS_FILE = new File(TEST_DIR, "task-delete-opendj-shadows.xml");
protected static final String TASK_DELETE_OPENDJ_SHADOWS_OID = "412218e4-184b-11e5-9c9b-3c970e467874";

// Make it at least 1501 so it will go over the 3000 entries size limit
private static final int NUM_LDAP_ENTRIES = 1600;
Expand Down Expand Up @@ -436,12 +437,12 @@ public void test900DeleteShadows() throws Exception {

// WHEN
TestUtil.displayWhen(TEST_NAME);
importObjectFromFile(TASK_DELETE_DUMMY_SHADOWS_FILE);
importObjectFromFile(TASK_DELETE_OPENDJ_SHADOWS_FILE);

// THEN
TestUtil.displayThen(TEST_NAME);

waitForTaskFinish(TASK_DELETE_DUMMY_SHADOWS_OID, false);
waitForTaskFinish(TASK_DELETE_OPENDJ_SHADOWS_OID, false);

// THEN
TestUtil.displayThen(TEST_NAME);
Expand All @@ -463,6 +464,10 @@ public boolean handle(PrismObject<ShadowType> shadow, OperationResult parentResu
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(GetOperationOptions.createRaw());
modelService.searchObjectsIterative(ShadowType.class, query, handler, options, task, result);
assertEquals("Unexpected number of search results", 0, count.getValue());

PrismObject<TaskType> finishedDeleteTask = getTask(TASK_DELETE_OPENDJ_SHADOWS_OID);
// TODO: check result, check summarization

}

private void loadEntries(String prefix) throws LDIFException, IOException {
Expand Down

0 comments on commit d201a05

Please sign in to comment.