Search in sources :

Example 11 with OperationResultStatus

use of com.evolveum.midpoint.schema.result.OperationResultStatus in project midpoint by Evolveum.

the class TestMultiResource method jackUnAssignRoleDummiesError.

public void jackUnAssignRoleDummiesError(final String TEST_NAME, String roleOid) throws Exception {
    TestUtil.displayTestTile(this, TEST_NAME);
    Task task = taskManager.createTaskInstance(TestRbac.class.getName() + "." + TEST_NAME);
    OperationResult result = task.getResult();
    // WHEN
    TestUtil.displayWhen(TEST_NAME);
    unassignRole(USER_JACK_OID, roleOid, task, result);
    // THEN
    TestUtil.displayThen(TEST_NAME);
    result.computeStatus();
    display(result);
    // there is a failure while reading dummy account - it was not created
    // because of unavailability of the resource..but it is OK..
    OperationResultStatus status = result.getStatus();
    if (status != OperationResultStatus.SUCCESS && status != OperationResultStatus.PARTIAL_ERROR) {
        AssertJUnit.fail("Expected result success or partial error status, but was " + status);
    }
    PrismObject<UserType> user = getUser(USER_JACK_OID);
    assertAssignedNoRole(user);
    assertLinks(user, 0);
    assertNoDummyAccount(ACCOUNT_JACK_DUMMY_USERNAME);
    assertNoDummyAccount(RESOURCE_DUMMY_LAVENDER_NAME, ACCOUNT_JACK_DUMMY_USERNAME);
    assertNoDummyAccount(RESOURCE_DUMMY_IVORY_NAME, ACCOUNT_JACK_DUMMY_USERNAME);
    assertNoDummyAccount(RESOURCE_DUMMY_BEIGE_NAME, ACCOUNT_JACK_DUMMY_USERNAME);
    assertUserProperty(USER_JACK_OID, UserType.F_ORGANIZATIONAL_UNIT, PrismTestUtil.createPolyString("The crew of The Lost Souls"));
}
Also used : OperationResultStatus(com.evolveum.midpoint.schema.result.OperationResultStatus) Task(com.evolveum.midpoint.task.api.Task) TestRbac(com.evolveum.midpoint.model.intest.rbac.TestRbac) OperationResult(com.evolveum.midpoint.schema.result.OperationResult) UserType(com.evolveum.midpoint.xml.ns._public.common.common_3.UserType)

Example 12 with OperationResultStatus

use of com.evolveum.midpoint.schema.result.OperationResultStatus in project midpoint by Evolveum.

the class ShadowCache method refreshShadow.

public PrismObject<ShadowType> refreshShadow(PrismObject<ShadowType> repoShadow, Task task, OperationResult parentResult) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, ExpressionEvaluationException {
    ShadowType shadowType = repoShadow.asObjectable();
    List<PendingOperationType> pendingOperations = shadowType.getPendingOperation();
    if (pendingOperations.isEmpty()) {
        LOGGER.trace("Skipping refresh of {} because there are no pending operations", repoShadow);
        return repoShadow;
    }
    LOGGER.trace("Refreshing {}", repoShadow);
    ProvisioningContext ctx = ctxFactory.create(repoShadow, task, parentResult);
    ctx.assertDefinition();
    Duration gracePeriod = null;
    ResourceConsistencyType consistency = ctx.getResource().getConsistency();
    if (consistency != null) {
        gracePeriod = consistency.getPendingOperationGracePeriod();
    }
    List<ObjectDelta<ShadowType>> notificationDeltas = new ArrayList<>();
    List<PendingOperationType> sortedOperations = sortOperations(pendingOperations);
    boolean isDead = ShadowUtil.isDead(shadowType);
    ObjectDelta<ShadowType> shadowDelta = repoShadow.createModifyDelta();
    for (PendingOperationType pendingOperation : sortedOperations) {
        ItemPath containerPath = pendingOperation.asPrismContainerValue().getPath();
        OperationResultStatusType statusType = pendingOperation.getResultStatus();
        XMLGregorianCalendar completionTimestamp = pendingOperation.getCompletionTimestamp();
        XMLGregorianCalendar now = null;
        String asyncRef = pendingOperation.getAsynchronousOperationReference();
        if (asyncRef != null) {
            OperationResultStatus newStaus = resouceObjectConverter.refreshOperationStatus(ctx, repoShadow, asyncRef, parentResult);
            now = clock.currentTimeXMLGregorianCalendar();
            if (newStaus != null) {
                OperationResultStatusType newStatusType = newStaus.createStatusType();
                if (!newStatusType.equals(pendingOperation.getResultStatus())) {
                    boolean operationCompleted = isCompleted(newStatusType) && pendingOperation.getCompletionTimestamp() == null;
                    if (operationCompleted && gracePeriod == null) {
                        LOGGER.trace("Deleting pending operation because it is completed (no grace): {}", pendingOperation);
                        shadowDelta.addModificationDeleteContainer(new ItemPath(ShadowType.F_PENDING_OPERATION), pendingOperation.clone());
                        continue;
                    } else {
                        PropertyDelta<OperationResultStatusType> statusDelta = shadowDelta.createPropertyModification(containerPath.subPath(PendingOperationType.F_RESULT_STATUS));
                        statusDelta.setValuesToReplace(new PrismPropertyValue<>(newStatusType));
                        shadowDelta.addModification(statusDelta);
                    }
                    statusType = newStatusType;
                    if (operationCompleted) {
                        // Operation completed
                        PropertyDelta<XMLGregorianCalendar> timestampDelta = shadowDelta.createPropertyModification(containerPath.subPath(PendingOperationType.F_COMPLETION_TIMESTAMP));
                        timestampDelta.setValuesToReplace(new PrismPropertyValue<>(now));
                        shadowDelta.addModification(timestampDelta);
                        completionTimestamp = now;
                        ObjectDeltaType pendingDeltaType = pendingOperation.getDelta();
                        ObjectDelta<ShadowType> pendingDelta = DeltaConvertor.createObjectDelta(pendingDeltaType, prismContext);
                        if (pendingDelta.isAdd()) {
                            // We do not need to care about attributes in add deltas here. The add operation is already applied to
                            // attributes. We need this to "allocate" the identifiers, so iteration mechanism in the
                            // model can find unique values while taking pending create operations into consideration.
                            PropertyDelta<Boolean> existsDelta = shadowDelta.createPropertyModification(new ItemPath(ShadowType.F_EXISTS));
                            existsDelta.setValuesToReplace(new PrismPropertyValue<>(true));
                            shadowDelta.addModification(existsDelta);
                        }
                        if (pendingDelta.isModify()) {
                            for (ItemDelta<?, ?> pendingModification : pendingDelta.getModifications()) {
                                shadowDelta.addModification(pendingModification.clone());
                            }
                        }
                        if (pendingDelta.isDelete()) {
                            isDead = true;
                            if (gracePeriod == null) {
                                shadowDelta = repoShadow.createDeleteDelta();
                                notificationDeltas.add(pendingDelta);
                                break;
                            } else {
                                PropertyDelta<Boolean> deadDelta = shadowDelta.createPropertyModification(new ItemPath(ShadowType.F_DEAD));
                                deadDelta.setValuesToReplace(new PrismPropertyValue<>(true));
                                shadowDelta.addModification(deadDelta);
                                PropertyDelta<Boolean> existsDelta = shadowDelta.createPropertyModification(new ItemPath(ShadowType.F_EXISTS));
                                existsDelta.setValuesToReplace(new PrismPropertyValue<>(false));
                                shadowDelta.addModification(existsDelta);
                            }
                        }
                        notificationDeltas.add(pendingDelta);
                    }
                }
            }
        }
        if (now == null) {
            now = clock.currentTimeXMLGregorianCalendar();
        }
    }
    if (shadowDelta.isDelete()) {
        LOGGER.trace("Deleting dead shadow because pending delete delta was completed (no grace period): {}", repoShadow);
        shadowManager.deleteShadow(ctx, repoShadow, null, parentResult);
        return null;
    }
    XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar();
    boolean atLeastOnePendingOperationRemains = expirePendingOperations(ctx, repoShadow, shadowDelta, now, parentResult);
    if (shadowType.getFailedOperationType() != null) {
        atLeastOnePendingOperationRemains = true;
    }
    if (isDead && !atLeastOnePendingOperationRemains) {
        LOGGER.trace("Deleting dead shadow because all pending operations expired: {}", repoShadow);
        shadowManager.deleteShadow(ctx, repoShadow, null, parentResult);
        return null;
    }
    if (!shadowDelta.isEmpty()) {
        shadowManager.modifyShadowAttributes(ctx, repoShadow, shadowDelta.getModifications(), parentResult);
    }
    for (ObjectDelta<ShadowType> notificationDelta : notificationDeltas) {
        ResourceOperationDescription operationDescription = createSuccessOperationDescription(ctx, repoShadow, notificationDelta, parentResult);
        operationListener.notifySuccess(operationDescription, task, parentResult);
    }
    if (shadowDelta.isEmpty()) {
        return repoShadow;
    }
    shadowDelta.applyTo(repoShadow);
    return repoShadow;
}
Also used : ArrayList(java.util.ArrayList) Duration(javax.xml.datatype.Duration) OperationResultStatus(com.evolveum.midpoint.schema.result.OperationResultStatus) XMLGregorianCalendar(javax.xml.datatype.XMLGregorianCalendar) ObjectDeltaType(com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType) ShadowDiscriminatorObjectDelta(com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta) ItemPath(com.evolveum.midpoint.prism.path.ItemPath)

Example 13 with OperationResultStatus

use of com.evolveum.midpoint.schema.result.OperationResultStatus in project midpoint by Evolveum.

the class ResourceObjectConverter method computeResultStatus.

private void computeResultStatus(OperationResult parentResult) {
    if (parentResult.isInProgress()) {
        return;
    }
    OperationResultStatus status = OperationResultStatus.SUCCESS;
    String asyncRef = null;
    for (OperationResult subresult : parentResult.getSubresults()) {
        if (OPERATION_MODIFY_ENTITLEMENT.equals(subresult.getOperation()) && subresult.isError()) {
            status = OperationResultStatus.PARTIAL_ERROR;
        } else if (subresult.isError()) {
            status = OperationResultStatus.FATAL_ERROR;
        } else if (subresult.isInProgress()) {
            status = OperationResultStatus.IN_PROGRESS;
            asyncRef = subresult.getAsynchronousOperationReference();
        }
    }
    parentResult.setStatus(status);
    parentResult.setAsynchronousOperationReference(asyncRef);
}
Also used : OperationResultStatus(com.evolveum.midpoint.schema.result.OperationResultStatus) OperationResult(com.evolveum.midpoint.schema.result.OperationResult) AsynchronousOperationResult(com.evolveum.midpoint.schema.result.AsynchronousOperationResult)

Example 14 with OperationResultStatus

use of com.evolveum.midpoint.schema.result.OperationResultStatus in project midpoint by Evolveum.

the class Projector method computeResultStatus.

private void computeResultStatus(XMLGregorianCalendar projectoStartTimestampCal, OperationResult result) {
    boolean hasProjectionErrror = false;
    OperationResultStatus finalStatus = OperationResultStatus.SUCCESS;
    String message = null;
    for (OperationResult subresult : result.getSubresults()) {
        if (subresult.isNotApplicable() || subresult.isSuccess()) {
            continue;
        }
        if (subresult.isHandledError()) {
            if (finalStatus == OperationResultStatus.SUCCESS) {
                finalStatus = OperationResultStatus.HANDLED_ERROR;
            }
            continue;
        }
        if (subresult.isError()) {
            message = subresult.getMessage();
            if (OPERATION_PROJECT_PROJECTION.equals(subresult.getOperation())) {
                hasProjectionErrror = true;
            } else {
                if (finalStatus != OperationResultStatus.FATAL_ERROR) {
                    finalStatus = subresult.getStatus();
                }
            }
        }
    }
    if (finalStatus != OperationResultStatus.FATAL_ERROR && hasProjectionErrror) {
        finalStatus = OperationResultStatus.PARTIAL_ERROR;
    }
    result.setStatus(finalStatus);
    result.setMessage(message);
    result.cleanupResult();
    if (LOGGER.isDebugEnabled()) {
        long projectoStartTimestamp = XmlTypeConverter.toMillis(projectoStartTimestampCal);
        long projectorEndTimestamp = clock.currentTimeMillis();
        LOGGER.trace("Projector finished ({}). Etime: {} ms", result.getStatus(), (projectorEndTimestamp - projectoStartTimestamp));
    }
}
Also used : OperationResultStatus(com.evolveum.midpoint.schema.result.OperationResultStatus) OperationResult(com.evolveum.midpoint.schema.result.OperationResult)

Aggregations

OperationResultStatus (com.evolveum.midpoint.schema.result.OperationResultStatus)14 OperationResult (com.evolveum.midpoint.schema.result.OperationResult)9 AsynchronousOperationResult (com.evolveum.midpoint.schema.result.AsynchronousOperationResult)2 ObjectNotFoundException (com.evolveum.midpoint.util.exception.ObjectNotFoundException)2 SchemaException (com.evolveum.midpoint.util.exception.SchemaException)2 ArrayList (java.util.ArrayList)2 ShadowDiscriminatorObjectDelta (com.evolveum.midpoint.common.refinery.ShadowDiscriminatorObjectDelta)1 ModelProjectionContext (com.evolveum.midpoint.model.api.context.ModelProjectionContext)1 TestRbac (com.evolveum.midpoint.model.intest.rbac.TestRbac)1 ObjectDelta (com.evolveum.midpoint.prism.delta.ObjectDelta)1 ItemPath (com.evolveum.midpoint.prism.path.ItemPath)1 PolyString (com.evolveum.midpoint.prism.polystring.PolyString)1 ObjectQuery (com.evolveum.midpoint.prism.query.ObjectQuery)1 ObjectDeltaOperation (com.evolveum.midpoint.schema.ObjectDeltaOperation)1 ResourceAttribute (com.evolveum.midpoint.schema.processor.ResourceAttribute)1 AsynchronousOperationQueryable (com.evolveum.midpoint.schema.result.AsynchronousOperationQueryable)1 Task (com.evolveum.midpoint.task.api.Task)1 CommunicationException (com.evolveum.midpoint.util.exception.CommunicationException)1 ConfigurationException (com.evolveum.midpoint.util.exception.ConfigurationException)1 ExpressionEvaluationException (com.evolveum.midpoint.util.exception.ExpressionEvaluationException)1