Skip to content

Commit

Permalink
Wired simulation result manager to tests
Browse files Browse the repository at this point in the history
Signed-off-by: Tony Tkacik <tonydamage@gmail.com>
  • Loading branch information
tonydamage committed Dec 7, 2022
1 parent 9b296bb commit 746da07
Show file tree
Hide file tree
Showing 8 changed files with 182 additions and 18 deletions.
6 changes: 3 additions & 3 deletions config/sql/native-new/postgres-new-upgrade.sql
Original file line number Diff line number Diff line change
Expand Up @@ -205,10 +205,10 @@ CREATE TABLE m_simulation_result_processed_object (
cid BIGINT NOT NULL,
containerType ContainerType GENERATED ALWAYS AS ('SIMULATION_RESULT_PROCESSED_OBJECT') STORED
CHECK (containerType = 'SIMULATION_RESULT_PROCESSED_OBJECT'),
oid UUID NOT NULL,
oid UUID,
objectType ObjectType,
nameOrig TEXT NOT NULL,
nameNorm TEXT NOT NULL,
nameOrig TEXT,
nameNorm TEXT,
state ObjectProcessingStateType,
metricIdentifiers TEXT[],
fullObject BYTEA,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.evolveum.midpoint.model.api.simulation;

import com.evolveum.midpoint.task.api.ObjectProcessingListener;

public interface SimulationResultContext {

ObjectProcessingListener objectProcessingListener();

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
package com.evolveum.midpoint.model.api.simulation;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultType;

public interface SimulationResultManager {

SimulationResultContext newSimulationResult(@Nullable SimulationResultType configuration,
@NotNull OperationResult parentResult);

SimulationResultType newConfiguration();




Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package com.evolveum.midpoint.model.impl.simulation;

import java.util.Map;

import javax.xml.namespace.QName;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import com.evolveum.midpoint.model.api.simulation.SimulationResultContext;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.ObjectProcessingListener;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectProcessingStateType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultProcessedObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultType;
import com.google.common.collect.ImmutableMap;

public class SimulationResultContextImpl implements SimulationResultContext, ObjectProcessingListener {

private @NotNull String oid;
private @NotNull SimulationResultManagerImpl manager;
private @Nullable SimulationResultType configuration;

private static final Map<ChangeType, ObjectProcessingStateType> DELTA_TO_PROCESSING_STATE = new ImmutableMap.Builder<ChangeType, ObjectProcessingStateType>()
.put(ChangeType.ADD, ObjectProcessingStateType.ADDED)
.put(ChangeType.DELETE, ObjectProcessingStateType.DELETED)
.put(ChangeType.MODIFY, ObjectProcessingStateType.MODIFIED)
.build();

public SimulationResultContextImpl(SimulationResultManagerImpl manager, @NotNull String storedOid, @Nullable SimulationResultType configuration) {
this.manager = manager;
this.oid = storedOid;
this.configuration = configuration;
}

@Override
public void onChangeExecuted(@NotNull ObjectDelta<?> delta, boolean executed, @NotNull OperationResult result) {
//
SimulationResultProcessedObjectType processedObject = createProcessedObject(delta);
manager.storeProcessedObject(oid, processedObject, result);

}

private SimulationResultProcessedObjectType createProcessedObject(@NotNull ObjectDelta<?> delta) {
SimulationResultProcessedObjectType processedObject = new SimulationResultProcessedObjectType();
processedObject.setOid(delta.getOid());
// TODO fill up name

processedObject.setState(DELTA_TO_PROCESSING_STATE.get(delta.getChangeType()));
processedObject.setType(toQName(delta.getObjectTypeClass()));

PrismContainerValue<SimulationResultProcessedObjectType> pcv = processedObject.asPrismContainerValue();
if (delta.isAdd()) {
PrismObject<?> objectToAdd = delta.getObjectToAdd();
processedObject.setName(PolyString.toPolyStringType(objectToAdd.getName()));
//pcv.findOrCreateContainer(containerName)
} else if (delta.isDelete()) {
// TODO: Fill up before state
}
return processedObject;
}

@Override
public ObjectProcessingListener objectProcessingListener() {
return this;
}

private QName toQName(Class<?> objectTypeClass) {
return PrismContext.get().getSchemaRegistry().determineTypeForClass(objectTypeClass);
}

}
Original file line number Diff line number Diff line change
@@ -1,18 +1,30 @@
package com.evolveum.midpoint.model.impl.simulation;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.model.api.simulation.SimulationResultContext;
import com.evolveum.midpoint.model.api.simulation.SimulationResultManager;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ItemDelta;
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.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.util.exception.SystemException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultProcessedObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SimulationResultType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationSimulationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;
Expand All @@ -29,14 +41,46 @@ public class SimulationResultManagerImpl implements SimulationResultManager, Sys
private SystemConfigurationSimulationType currentConfiguration;

public PrismObject<SimulationResultType> newWithDefaults() {
var ret = new SimulationResultType()
.useOwnPartitionForProcessedObjects(currentConfiguration.isUseOwnPartitionForProcessedObjects());
var ret = new SimulationResultType();
ret.name("Simulation Result: " + System.currentTimeMillis());
//.useOwnPartitionForProcessedObjects(currentConfiguration.isUseOwnPartitionForProcessedObjects());
return ret.asPrismObject();
}

@Override
public SimulationResultType newConfiguration() {
return newWithDefaults().asObjectable();
}

@Override
public SimulationResultContext newSimulationResult(@Nullable SimulationResultType configuration, @NotNull OperationResult parentResult) {
// TODO: Check if this is configuration
configuration = mergeDefaults(configuration);

@NotNull
String storedOid;
try {
storedOid = repository.addObject(configuration.asPrismObject(), null, parentResult);
} catch (ObjectAlreadyExistsException | SchemaException e) {
throw new SystemException(e);
}

return new SimulationResultContextImpl(this, storedOid, configuration);
}


private @Nullable SimulationResultType mergeDefaults(@Nullable SimulationResultType configuration) {
// FIXME: Merge somehow
return configuration;
}

@Override
public void update(@Nullable SystemConfigurationType value) {
if (value == null) {
currentConfiguration = new SystemConfigurationSimulationType();
return;
}

// Get current simulations configuration
currentConfiguration = value.getSimulation() != null ? value.getSimulation() : new SystemConfigurationSimulationType();
}
Expand All @@ -51,4 +95,19 @@ public void shutdown() {
systemConfigurationChangeDispatcher.unregisterListener(this);
}

public void storeProcessedObject(@NotNull String oid, SimulationResultProcessedObjectType processedObject, @NotNull OperationResult parentResult) {
try {
List<ItemDelta<?, ?>> modifications = PrismContext.get().deltaFor(SimulationResultType.class)
.item(SimulationResultType.F_PROCESSED_OBJECT)
.add(processedObject.asPrismContainerValue())
.asItemDeltas()
;
repository.modifyObject(SimulationResultType.class, oid, modifications, parentResult);
} catch (Exception e) {
// FIXME: Handle properly
throw new SystemException(e);
}
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public void test100CreateUser() throws Exception {
.name("test100");

when("user is created in simulation");
Object simulationConfiguration = getSimulationConfiguration();
SimulationResultType simulationConfiguration = getSimulationConfiguration();
SimulationResult simResult =
executeInProductionSimulationMode(
List.of(user.asPrismObject().createAddDelta()),
Expand Down Expand Up @@ -97,12 +97,12 @@ public void test100CreateUser() throws Exception {
assertUserPrimaryAndSecondaryDeltas(modelContext);
}

private Object getSimulationConfiguration() {
private SimulationResultType getSimulationConfiguration() {
if (!isNativeRepository()) {
return null; // No simulation storage in old repo
}
// TODO create the configuration
return null;
return simulationResultManager.newConfiguration();
}

private void assertTest100UserDeltas(Collection<ObjectDelta<?>> simulatedDeltas, String message) {
Expand Down Expand Up @@ -166,7 +166,7 @@ public void test110CreateUserWithLinkedAccount() throws Exception {
createAccount()));

when("user is created in simulation");
Object simulationConfiguration = getSimulationConfiguration();
SimulationResultType simulationConfiguration = getSimulationConfiguration();
SimulationResult simResult =
executeInProductionSimulationMode(
List.of(user.asPrismObject().createAddDelta()),
Expand Down Expand Up @@ -282,7 +282,7 @@ public void test120CreateUserWithAssignedAccount() throws Exception {
.resourceRef(RESOURCE_SIMPLE_PRODUCTION_TARGET.oid, ResourceType.COMPLEX_TYPE)));

when("user is created in simulation");
Object simulationConfiguration = getSimulationConfiguration();
SimulationResultType simulationConfiguration = getSimulationConfiguration();
SimulationResult simResult =
traced(() -> executeInProductionSimulationMode(
List.of(user.asPrismObject().createAddDelta()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.model.api.simulation.SimulationResultContext;
import com.evolveum.midpoint.model.api.simulation.SimulationResultManager;
import com.evolveum.midpoint.model.common.archetypes.ArchetypeManager;

Expand Down Expand Up @@ -312,6 +313,7 @@ public DummyResourceContoller initDummyResource(DummyTestResource resource, Task
return resource.controller;
}

@Override
public void initAndTestDummyResource(DummyTestResource resource, Task task, OperationResult result)
throws Exception {
resource.controller = dummyResourceCollection.initDummyResource(
Expand Down Expand Up @@ -6904,7 +6906,7 @@ public ImportSingleAccountRequestBuilder importSingleAccountRequest() {
*/
protected SimulationResult executeInProductionSimulationMode(
@NotNull Collection<ObjectDelta<? extends ObjectType>> deltas,
@Nullable Object simulationConfiguration, // TODO correct Java type
@Nullable SimulationResultType simulationConfiguration,
@NotNull Task task,
@NotNull OperationResult result)
throws CommonException {
Expand All @@ -6930,7 +6932,7 @@ protected SimulationResult executeInProductionSimulationMode(
* Executes a {@link ProcedureCall} in {@link TaskExecutionMode#SIMULATED_PRODUCTION} mode.
*/
public SimulationResult executeInProductionSimulationMode(
Object simulationConfiguration, Task task, ProcedureCall simulatedCall) throws CommonException {
SimulationResultType simulationConfiguration, Task task, ProcedureCall simulatedCall) throws CommonException {
return executeInSimulationMode(
TaskExecutionMode.SIMULATED_PRODUCTION,
simulationConfiguration,
Expand All @@ -6944,12 +6946,15 @@ public interface SimulatedProcedureCall {
}

private SimulationResult executeInSimulationMode(
TaskExecutionMode mode, Object simulationConfiguration, Task task, SimulatedProcedureCall simulatedCall)
TaskExecutionMode mode, SimulationResultType simulationConfiguration, Task task, SimulatedProcedureCall simulatedCall)
throws CommonException {

ObjectProcessingListener simulationObjectProcessingListener =
simulationConfiguration != null ?
null : null; //simulationResultManager.createNewSimulationResult(simulationConfiguration); // TODO
ObjectProcessingListener simulationObjectProcessingListener = null;

if (simulationConfiguration != null) {
SimulationResultContext context = simulationResultManager.newSimulationResult(simulationConfiguration, createOperationResult());
simulationObjectProcessingListener = context.objectProcessingListener();
}

SimulationResult simulationResult = new SimulationResult();
ObjectProcessingListener testObjectProcessingListener = simulationResult.objectProcessingListener();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,10 @@ public MProcessedObject insert(SimulationResultProcessedObjectType object, MSimu
MProcessedObject row = initRowObject(object, ownerRow);
//row.oid
row.oid = SqaleUtils.oidToUUid(object.getOid());
row.nameOrig = object.getName().getOrig();
row.nameNorm = object.getName().getNorm();
if (object.getName() != null) {
row.nameOrig = object.getName().getOrig();
row.nameNorm = object.getName().getNorm();
}
row.state = object.getState();

row.metricIdentifiers = stringsToArray(object.getMetricIdentifier());
Expand Down

0 comments on commit 746da07

Please sign in to comment.