Skip to content

Commit

Permalink
MID-8842 ninja - verify/upgrade objects (in files) test fixed and ena…
Browse files Browse the repository at this point in the history
…bled. fixed also upgrade handler

(cherry picked from commit a23e99c)
  • Loading branch information
1azyman committed Jul 17, 2023
1 parent bbdc466 commit e171223
Show file tree
Hide file tree
Showing 9 changed files with 67 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public void showAllWarnings() {
public <O extends ObjectType> UpgradeValidationResult validate(PrismObject<O> object) {
ValidationResult result = validator.validate(object);

UpgradeObjectsHandler handler = new UpgradeObjectsHandler();
return handler.verify(object, result);
UpgradeProcessor processor = new UpgradeProcessor();
return processor.process(object, result);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.lang.reflect.Modifier;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

Expand All @@ -12,14 +13,21 @@
import com.evolveum.midpoint.util.ClassPathUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

public class UpgradeObjectsHandler {
public class UpgradeProcessor {

public static final List<UpgradeObjectProcessor<?>> PROCESSORS;

static {
PROCESSORS = initProcessors();
}

public static <T extends ObjectType> UpgradeObjectProcessor<T> getProcessor(String identifier) {
return (UpgradeObjectProcessor<T>) PROCESSORS.stream()
.filter(p -> Objects.equals(identifier, p.getIdentifier()))
.findFirst()
.orElse(null);
}

private static List<UpgradeObjectProcessor<?>> initProcessors() {
Set<Class<?>> processors = ClassPathUtil.listClasses("com.evolveum.midpoint")
.stream()
Expand All @@ -39,7 +47,7 @@ private static List<UpgradeObjectProcessor<?>> initProcessors() {
.collect(Collectors.toUnmodifiableList());
}

public <T extends ObjectType> UpgradeValidationItem verify(PrismObject<T> object, ValidationItem item) {
private <T extends ObjectType> UpgradeValidationItem process(PrismObject<T> object, ValidationItem item) {
ItemPath path = item.getItemPath();

PrismObject<T> cloned = object.clone();
Expand Down Expand Up @@ -71,11 +79,11 @@ public <T extends ObjectType> UpgradeValidationItem verify(PrismObject<T> object
return result;
}

public <T extends ObjectType> UpgradeValidationResult verify(PrismObject<T> object, ValidationResult result) {
public <T extends ObjectType> UpgradeValidationResult process(PrismObject<T> object, ValidationResult result) {
UpgradeValidationResult verificationResult = new UpgradeValidationResult(result);

for (ValidationItem item : result.getItems()) {
UpgradeValidationItem upgrade = verify(object, item);
UpgradeValidationItem upgrade = process(object, item);
if (upgrade != null) {
verificationResult.getItems().add(upgrade);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ private void assertUpgrade(String file, UpgradeValidationResult result) {
@Test
public void test00CheckIdentifierUniqueness() {
Map<String, Class<?>> identifiers = new HashMap<>();
UpgradeObjectsHandler.PROCESSORS.forEach(p -> {
UpgradeProcessor.PROCESSORS.forEach(p -> {
String identifier = p.getIdentifier();
Class<?> existing = identifiers.get(identifier);
if (existing != null) {
Expand Down
10 changes: 4 additions & 6 deletions infra/schema/src/test/resources/validator/expected/resource.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,11 @@
<name>Invalid resource</name>

<capabilities>
<native>
<cap:addRemoveAttributeValues/>
</native>
<native/>
<configured>
<cap:addRemoveAttributeValues>
<cap:enabled>false</cap:enabled>
</cap:addRemoveAttributeValues>
<cap:update>
<cap:addRemoveAttributeValues>false</cap:addRemoveAttributeValues>
</cap:update>
</configured>
</capabilities>
</resource>
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@

<name>system-configuration</name>

<roleManagement/>

<notificationConfiguration>
<!--<sms>
<gateway>
Expand Down Expand Up @@ -60,11 +58,11 @@
<roleCatalogRef oid="0e5b7304-ea5c-438e-84d1-2b0ce40517ce" type="OrgType"/>
<collection>
<identifier>allRoles</identifier>
<collectionUri>allRoles</collectionUri>
<collectionIdentifier>allRoles</collectionIdentifier>
</collection>
<collection>
<identifier>myCustomCollection</identifier>
<collectionUri>myCustomCollection</collectionUri>
<collectionIdentifier>myCustomCollection</collectionIdentifier>
</collection>
</roleCatalog>
</accessRequest>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,19 @@

package com.evolveum.midpoint.ninja.action.upgrade;

import java.util.List;
import java.util.stream.Collectors;

import com.evolveum.midpoint.ninja.action.upgrade.action.UpgradeObjectsOptions;
import com.evolveum.midpoint.ninja.impl.NinjaContext;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.validator.ObjectUpgradeValidator;
import com.evolveum.midpoint.schema.validator.UpgradeValidationItem;
import com.evolveum.midpoint.schema.validator.UpgradeValidationResult;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.validator.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import java.util.List;
import java.util.stream.Collectors;

/**
* // todo doesn't take into account "skipped" items from verification phase
* Handles upgrade of single object, filters out items that are not applicable for upgrade based on options selected by user.
*/
public class UpgradeObjectHandler {
Expand Down Expand Up @@ -58,16 +56,23 @@ public <O extends ObjectType> boolean execute(PrismObject<O> object) {
return false;
}

// applicable items can't be applied by using delta from each item on object - deltas might
// collide and replace changes from other items - we use upgrade processor to apply change
// directly on to object for each item iteratively
applicableItems.forEach(item -> {
try {
ObjectDelta delta = item.getDelta();
if (!delta.isEmpty()) {
delta.applyTo(object);
}
} catch (SchemaException ex) {
// todo error handling
ex.printStackTrace();
String identifier = item.getIdentifier();
if (identifier == null) {
return;
}

ItemPath path = item.getItem().getItemPath();

UpgradeObjectProcessor<O> processor = UpgradeProcessor.getProcessor(identifier);
if (processor == null) {
return;
}

processor.process(object, path);
});

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;

import com.evolveum.midpoint.ninja.impl.LogTarget;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
Expand All @@ -18,6 +16,7 @@
import com.evolveum.midpoint.ninja.action.upgrade.UpgradeObjectHandler;
import com.evolveum.midpoint.ninja.action.upgrade.UpgradeObjectsConsumerWorker;
import com.evolveum.midpoint.ninja.action.verify.VerificationReporter;
import com.evolveum.midpoint.ninja.impl.LogTarget;
import com.evolveum.midpoint.ninja.impl.NinjaApplicationContextLevel;
import com.evolveum.midpoint.ninja.util.NinjaUtils;
import com.evolveum.midpoint.ninja.util.OperationStatus;
Expand Down Expand Up @@ -51,7 +50,17 @@ public Void execute() throws Exception {
skipUpgradeForOids = loadVerificationFile();

log.info("Upgrade will skip {} objects", skipUpgradeForOids.size());

if (!options.getFiles().isEmpty()) {
// todo this is another check whether we want to upgrade objects in files
// log.info(ConsoleFormat.formatWarn("WARNING: File update will remove XML comments and change formatting. Do you wish to proceed? (Y/n)"));
// String result = NinjaUtils.readInput(input -> StringUtils.isEmpty(input) || input.equalsIgnoreCase("y"));
//
// if (result.trim().equalsIgnoreCase("n")) {
// log.info("Upgrade aborted");
// return null;
// }

return upgradeObjectsInFiles();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,15 +273,18 @@ private static boolean containsFileNames(String[] names, String filenameRegex) {
return Arrays.stream(names).anyMatch(s -> s.matches(filenameRegex));
}

public static void readInput(Function<String, Boolean> responseHandler) throws IOException {
public static String readInput(Function<String, Boolean> inputValidation) throws IOException {
String line = null;
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
boolean accepted = false;
while (!accepted) {
String line = br.readLine();
line = br.readLine();

accepted = responseHandler.apply(line);
accepted = inputValidation.apply(line);
}
}

return line;
}

public static void logException(Log log, String msg, Exception ex) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.DeltaConversionOptions;
import com.evolveum.midpoint.schema.DeltaConvertor;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.commons.io.FileUtils;
Expand Down Expand Up @@ -153,8 +155,7 @@ public void test150Sample() throws Exception {
System.out.println(config);
}

// todo not working yet
@Test(enabled = false)
@Test
public void test200UpgradeFiles() throws Exception {
given();

Expand Down Expand Up @@ -182,13 +183,16 @@ public void test200UpgradeFiles() throws Exception {
PrismObject object = objects.get(i);
PrismObject expectedObject = expectedObjects.get(i);

ObjectDelta delta = object.diff(expectedObject);

Assertions.assertThat(object).is(new Condition<>(
o -> o.equivalent(expectedObject),
"Object %s (%s) doesn't look like expected one.\nExpected:\n%s\nActual:\n%s",
"Object %s (%s) doesn't look like expected one.\nExpected:\n%s\nActual:\n%s\nDifference:\n%s",
object,
file.getName(),
PrismTestUtil.serializeToXml(expectedObject.asObjectable()),
PrismTestUtil.serializeToXml(object.asObjectable())));
PrismTestUtil.serializeToXml(object.asObjectable()),
DeltaConvertor.serializeDelta(delta, DeltaConversionOptions.createSerializeReferenceNames(), "xml")));
}
}
}
Expand Down

0 comments on commit e171223

Please sign in to comment.