protected PendingOperationType assertPendingOperation( PrismObject<ShadowType> shadow, PendingOperationType pendingOperation, XMLGregorianCalendar requestStart, XMLGregorianCalendar requestEnd, PendingOperationExecutionStatusType expectedExecutionStatus, OperationResultStatusType expectedResultStatus, XMLGregorianCalendar completionStart, XMLGregorianCalendar completionEnd) { assertNotNull("No operation ", pendingOperation); ObjectDeltaType deltaType = pendingOperation.getDelta(); assertNotNull("No delta in pending operation in "+shadow, deltaType); // TODO: check content of pending operations in the shadow TestUtil.assertBetween("No request timestamp in pending operation in "+shadow, requestStart, requestEnd, pendingOperation.getRequestTimestamp()); PendingOperationExecutionStatusType executiontStatus = pendingOperation.getExecutionStatus(); assertEquals("Wrong execution status in pending operation in "+shadow, expectedExecutionStatus, executiontStatus); OperationResultStatusType resultStatus = pendingOperation.getResultStatus(); assertEquals("Wrong result status in pending operation in "+shadow, expectedResultStatus, resultStatus); // TODO: assert other timestamps if (expectedExecutionStatus == PendingOperationExecutionStatusType.COMPLETED) { TestUtil.assertBetween("No completion timestamp in pending operation in "+shadow, completionStart, completionEnd, pendingOperation.getCompletionTimestamp()); } return pendingOperation; }
private PendingOperationType createPendingOperation( ObjectDelta<ShadowType> requestDelta, ProvisioningOperationState<? extends AsynchronousOperationResult> opState, String asyncOperationReference) throws SchemaException { ObjectDeltaType deltaType = DeltaConvertor.toObjectDeltaType(requestDelta); PendingOperationType pendingOperation = new PendingOperationType(); pendingOperation.setType(opState.getOperationType()); pendingOperation.setDelta(deltaType); XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar(); pendingOperation.setRequestTimestamp(now); if (PendingOperationExecutionStatusType.EXECUTING.equals(opState.getExecutionStatus())) { pendingOperation.setOperationStartTimestamp(now); } pendingOperation.setExecutionStatus(opState.getExecutionStatus()); pendingOperation.setResultStatus(opState.getResultStatusType()); if (opState.getAttemptNumber() != null) { pendingOperation.setAttemptNumber(opState.getAttemptNumber()); pendingOperation.setLastAttemptTimestamp(now); } if (asyncOperationReference != null) { pendingOperation.setAsynchronousOperationReference(asyncOperationReference); } else { pendingOperation.setAsynchronousOperationReference(opState.getAsynchronousOperationReference()); } return pendingOperation; }
public PendingOperationAsserter<R> assertAsynchronousOperationReference(String expected) { assertEquals("Wrong asynchronous operation reference in "+desc(), expected, pendingOperation.getAsynchronousOperationReference()); return this; }
@Override protected PendingOperationType createItem(PrismContainerValue value) { PendingOperationType pendingOperation = new PendingOperationType(); pendingOperation.setupContainerValue(value); return pendingOperation; }
public PendingOperationType clone() { PendingOperationType object = new PendingOperationType(); PrismContainerValue value = asPrismContainerValue().clone(); object.setupContainerValue(value); return object; }
private boolean needsRetry(PendingOperationType pendingOperation) { return PendingOperationExecutionStatusType.EXECUTING.equals(pendingOperation.getExecutionStatus()) && pendingOperation.getAttemptNumber() != null; }
if (pendingOperation.asPrismContainerValue().getId() == null) { cdelta.addValuesToAdd(pendingOperation.asPrismContainerValue()); shadowChanges.add(cdelta); } else { ItemPath containerPath = pendingOperation.asPrismContainerValue().getPath(); if (!opState.getExecutionStatus().equals(pendingOperation.getExecutionStatus())) { PropertyDelta<PendingOperationExecutionStatusType> executionStatusDelta = createPendingOperationDelta(containerDefinition, containerPath, PendingOperationType.F_EXECUTION_STATUS, opState.getExecutionStatus()); shadowChanges.add(executionStatusDelta); if (opState.getExecutionStatus().equals(PendingOperationExecutionStatusType.EXECUTING) && pendingOperation.getOperationStartTimestamp() == null) { PropertyDelta<XMLGregorianCalendar> timestampDelta = createPendingOperationDelta(containerDefinition, containerPath, PendingOperationType.F_OPERATION_START_TIMESTAMP, now); if (opState.getExecutionStatus().equals(PendingOperationExecutionStatusType.COMPLETED) && pendingOperation.getCompletionTimestamp() == null) { PropertyDelta<XMLGregorianCalendar> completionTimestampDelta = createPendingOperationDelta(containerDefinition, containerPath, PendingOperationType.F_COMPLETION_TIMESTAMP, now); if (pendingOperation.getRequestTimestamp() == null) { if (pendingOperation.getResultStatus() != null) { PropertyDelta<OperationResultStatusType> resultStatusDelta = createPendingOperationDelta(containerDefinition, containerPath, PendingOperationType.F_RESULT_STATUS, null); if (!opStateResultStatusType.equals(pendingOperation.getResultStatus())) { PropertyDelta<OperationResultStatusType> resultStatusDelta = createPendingOperationDelta(containerDefinition, containerPath, PendingOperationType.F_RESULT_STATUS, opStateResultStatusType);
private PendingOperationType findExistingPendingOperation(PrismObject<ShadowType> currentShadow, ObjectDelta<ShadowType> proposedDelta, boolean processInProgress) throws SchemaException { for (PendingOperationType pendingOperation: currentShadow.asObjectable().getPendingOperation()) { OperationResultStatusType resultStatus = pendingOperation.getResultStatus(); if (!isInProgressOrRequested(resultStatus, processInProgress)) { continue; } ObjectDeltaType deltaType = pendingOperation.getDelta(); if (deltaType == null) { continue; } ObjectDelta<Objectable> delta = DeltaConvertor.createObjectDelta(deltaType, prismContext); if (!matchPendingDelta(delta, proposedDelta)) { continue; } return pendingOperation; } return null; }
ItemPath containerPath = pendingOperation.asPrismContainerValue().getPath(); String asyncRef = pendingOperation.getAsynchronousOperationReference(); if (asyncRef == null) { continue; if (newStatusType.equals(pendingOperation.getResultStatus())) { continue; boolean operationCompleted = ProvisioningUtil.isCompleted(newStatusType) && pendingOperation.getCompletionTimestamp() == null; shadowDelta.addModificationDeleteContainer(ShadowType.F_PENDING_OPERATION, pendingOperation.clone()); continue; shadowDelta.addModification(completionTimestampDelta); ObjectDeltaType pendingDeltaType = pendingOperation.getDelta(); ObjectDelta<ShadowType> pendingDelta = DeltaConvertor.createObjectDelta(pendingDeltaType, prismContext);
private boolean matches(PendingOperationType operation) { ObjectDeltaType delta = operation.getDelta(); if (!executionStatus.equals(operation.getExecutionStatus())) { return false; if (!resultStatus.equals(operation.getResultStatus())) { return false;
ObjectDeltaType pendingDeltaType = DeltaConvertor.toObjectDeltaType(pendingDelta); PendingOperationType pendingOperation = new PendingOperationType(); pendingOperation.setDelta(pendingDeltaType); pendingOperation.setRequestTimestamp(clock.currentTimeXMLGregorianCalendar()); if (opState != null) { pendingOperation.setExecutionStatus(opState.getExecutionStatus()); pendingOperation.setResultStatus(opState.getResultStatusType()); pendingOperation.setAsynchronousOperationReference(opState.getAsynchronousOperationReference()); cdelta.addValuesToAdd(pendingOperation.asPrismContainerValue()); repoDeltas.add(cdelta);
private static boolean isPendingAddOperation(PendingOperationType pendingOperation) { return ChangeTypeType.ADD.equals(pendingOperation.getDelta().getChangeType()) && !PendingOperationExecutionStatusType.COMPLETED.equals(pendingOperation.getExecutionStatus()); }
boolean resourceReadIsCachingOnly = ProvisioningUtil.resourceReadIsCachingOnly(ctx.getResource()); for (PendingOperationType pendingOperation: sortedOperations) { OperationResultStatusType resultStatus = pendingOperation.getResultStatus(); PendingOperationExecutionStatusType executionStatus = pendingOperation.getExecutionStatus(); if (OperationResultStatusType.NOT_APPLICABLE.equals(resultStatus)) { ObjectDeltaType pendingDeltaType = pendingOperation.getDelta(); ObjectDelta<ShadowType> pendingDelta = DeltaConvertor.createObjectDelta(pendingDeltaType, prismContext); if (pendingDelta.isAdd()) { List<PendingOperationType> newPendingOperations = resultShadowType.getPendingOperation(); for (PendingOperationType pendingOperation2: shadowType.getPendingOperation()) { newPendingOperations.add(pendingOperation2.clone());
ItemPath containerPath = existingPendingOperation.asPrismContainerValue().getPath(); addPropertyDelta(repoDeltas, containerPath, PendingOperationType.F_EXECUTION_STATUS, executionStatus, shadow.getDefinition()); addPropertyDelta(repoDeltas, containerPath, PendingOperationType.F_RESULT_STATUS, resultStatus, shadow.getDefinition()); addPropertyDelta(repoDeltas, containerPath, PendingOperationType.F_ASYNCHRONOUS_OPERATION_REFERENCE, asynchronousOperationReference, shadow.getDefinition()); if (existingPendingOperation.getRequestTimestamp() == null) { if (executionStatus == PendingOperationExecutionStatusType.COMPLETED && existingPendingOperation.getCompletionTimestamp() == null) { addPropertyDelta(repoDeltas, containerPath, PendingOperationType.F_COMPLETION_TIMESTAMP, now, shadow.getDefinition()); if (executionStatus == PendingOperationExecutionStatusType.EXECUTING && existingPendingOperation.getOperationStartTimestamp() == null) { addPropertyDelta(repoDeltas, containerPath, PendingOperationType.F_OPERATION_START_TIMESTAMP, now, shadow.getDefinition());
public ObjectDeltaTypeAsserter<PendingOperationAsserter<R>> delta() { return new ObjectDeltaTypeAsserter<>(pendingOperation.getDelta(), this, "delta in "+desc()); }
public PendingOperationAsserter<R> assertId(Long expected) { assertEquals("Wrong id in "+desc(), expected, pendingOperation.getId()); return this; }
public static boolean isOverPeriod(XMLGregorianCalendar now, Duration period, PendingOperationType pendingOperation) { if (!isCompleted(pendingOperation.getResultStatus())) { return false; } XMLGregorianCalendar completionTimestamp = pendingOperation.getCompletionTimestamp(); if (completionTimestamp == null) { return false; } return isOverPeriod(now, period, completionTimestamp); }
display("Repo shadow", shadowRepo); PendingOperationType pendingOperation = assertSinglePendingOperation(shadowRepo, null, null, executionStage); assertNotNull("No ID in pending operation", pendingOperation.getId()); assertAttribute(shadowRepo, ATTR_USERNAME_QNAME, RawType.fromPropertyRealValue(USER_BIGMOUTH_NAME.toLowerCase(), ATTR_USERNAME_QNAME, prismContext)); PendingOperationType pendingOperationType = assertSinglePendingOperation(shadowModel, null, null, executionStage); String pendingOperationRef = pendingOperationType.getAsynchronousOperationReference(); assertNotNull("No async reference in pending operation", pendingOperationRef); assertCase(pendingOperationRef, SchemaConstants.CASE_STATE_OPEN);
lastActivityTimestamp = XmlTypeConverter.laterTimestamp(lastActivityTimestamp, pendingOperation.getRequestTimestamp()); lastActivityTimestamp = XmlTypeConverter.laterTimestamp(lastActivityTimestamp, pendingOperation.getLastAttemptTimestamp()); lastActivityTimestamp = XmlTypeConverter.laterTimestamp(lastActivityTimestamp, pendingOperation.getCompletionTimestamp());
private boolean needsRefresh(PendingOperationType pendingOperation) { PendingOperationExecutionStatusType executionStatus = pendingOperation.getExecutionStatus(); if (executionStatus == null) { // LEGACY: 3.7 and earlier return OperationResultStatusType.IN_PROGRESS.equals(pendingOperation.getResultStatus()); } else { return PendingOperationExecutionStatusType.EXECUTING.equals(executionStatus); } }