Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Aug 3, 2023
2 parents 5ed7eb8 + 39ff830 commit 41f701f
Show file tree
Hide file tree
Showing 13 changed files with 210 additions and 141 deletions.
49 changes: 29 additions & 20 deletions tools/ninja/src/main/java/com/evolveum/midpoint/ninja/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@
import com.beust.jcommander.ParameterException;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.fusesource.jansi.AnsiConsole;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.ninja.action.Action;
import com.evolveum.midpoint.ninja.action.ActionResult;
import com.evolveum.midpoint.ninja.action.BaseOptions;
import com.evolveum.midpoint.ninja.impl.Command;
import com.evolveum.midpoint.ninja.impl.LogLevel;
import com.evolveum.midpoint.ninja.impl.NinjaContext;
import com.evolveum.midpoint.ninja.util.ConsoleFormat;
import com.evolveum.midpoint.ninja.util.InputParameterException;
Expand Down Expand Up @@ -62,7 +64,7 @@ public void setErr(@NotNull PrintStream err) {
this.err = err;
}

// todo main doesn't return error code non zero if error occurrs, fix this
// todo main doesn't return error code non zero if error occurs, fix this
protected <T> @NotNull MainResult<?> run(String[] args) {
AnsiConsole.systemInstall();

Expand All @@ -71,7 +73,8 @@ public void setErr(@NotNull PrintStream err) {
try {
jc.parse(args);
} catch (ParameterException ex) {
err.println(ex.getMessage());
err.println(ConsoleFormat.formatLogMessage(LogLevel.ERROR, ex.getMessage()));

return MainResult.EMPTY_ERROR;
}

Expand All @@ -82,9 +85,11 @@ public void setErr(@NotNull PrintStream err) {
ConsoleFormat.setBatchMode(base.isBatchMode());

if (base.isVerbose() && base.isSilent()) {
err.println("Cant' use " + BaseOptions.P_VERBOSE + " and " + BaseOptions.P_SILENT
+ " together (verbose and silent)");
err.println(ConsoleFormat.formatLogMessage(
LogLevel.ERROR, "Can't use " + BaseOptions.P_VERBOSE + " and " + BaseOptions.P_SILENT + " together (verbose and silent)"));

printHelp(jc, parsedCommand);

return MainResult.EMPTY_ERROR;
}

Expand All @@ -103,7 +108,7 @@ public void setErr(@NotNull PrintStream err) {
Action<T, ?> action = Command.createAction(parsedCommand);

if (action == null) {
err.println("Action for command '" + parsedCommand + "' not found");
err.println(ConsoleFormat.formatLogMessage(LogLevel.ERROR, "Action for command '" + parsedCommand + "' not found"));
return MainResult.EMPTY_ERROR;
}

Expand Down Expand Up @@ -131,7 +136,7 @@ public void setErr(@NotNull PrintStream err) {
action.destroy();
}
} catch (InputParameterException ex) {
err.println("ERROR: " + ex.getMessage());
err.println(ConsoleFormat.formatLogMessage(LogLevel.ERROR, ex.getMessage()));

return MainResult.EMPTY_ERROR;
} catch (Exception ex) {
Expand All @@ -151,43 +156,47 @@ private void cleanupResources(BaseOptions opts, NinjaContext context) {
context.close();
}
} catch (Exception ex) {
if (opts.isVerbose()) {
String stack = NinjaUtils.printStackToString(ex);

err.println("Unexpected exception occurred (" + ex.getClass()
+ ") during destroying context. Exception stack trace:\n" + stack);
}
printException("Unexpected exception occurred (" + ex.getClass() + ") during destroying context", ex, opts.isVerbose());
}
}

private void handleException(BaseOptions opts, Exception ex) {
if (!opts.isSilent()) {
err.println("Unexpected exception occurred (" + ex.getClass() + "), reason: " + ex.getMessage());
err.println(ConsoleFormat.formatLogMessage(
LogLevel.ERROR, "Unexpected exception occurred (" + ex.getClass() + "), reason: " + ex.getMessage()));
}

if (opts.isVerbose()) {
String stack = NinjaUtils.printStackToString(ex);

err.println("Exception stack trace:\n" + stack);
err.println(ConsoleFormat.formatLogMessage(LogLevel.DEBUG, "Exception stack trace:\n" + stack));
}
}

private void printVersion(boolean verbose) {
URL url = Main.class.getResource("/version");
if (url == null) {
err.println("Couldn't obtain version");
err.println(ConsoleFormat.formatLogMessage(LogLevel.ERROR, "Couldn't obtain version. Version file not available."));
return;
}

try (InputStream is = url.openStream()) {
String version = IOUtils.toString(is, StandardCharsets.UTF_8).trim();
out.println(version);
} catch (Exception ex) {
err.println("Couldn't obtains version");
if (verbose) {
String stack = NinjaUtils.printStackToString(ex);
err.println("Exception stack trace:\n" + stack);
}
printException("Couldn't obtain version", ex, verbose);
}
}

private void printException(String message, Exception ex, boolean verbose) {
String msg = StringUtils.isNotEmpty(message) ? message + ", reason: " : "";
msg += ex.getMessage();

err.println(ConsoleFormat.formatLogMessage(LogLevel.ERROR, msg));
if (verbose) {
String stack = NinjaUtils.printStackToString(ex);

err.println(ConsoleFormat.formatLogMessage(LogLevel.DEBUG, "Exception stack trace:\n" + stack));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ private void executeScripts(@NotNull DataSource dataSource, @NotNull List<File>
}

private void printStatementResults(Statement stmt, boolean hasResult, int index) throws SQLException {
String resultHeader = ConsoleFormat.formatInfoMessageWithParameter("Result #", index) + ": ";
String resultHeader = ConsoleFormat.formatMessageWithInfoParameters("Result #{}", index) + ": ";
if (!hasResult) {
int updateCount = stmt.getUpdateCount();
if (updateCount != -1) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,28 @@
*/
package com.evolveum.midpoint.ninja.action;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;

import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.ninja.action.verify.VerificationReporter;
import com.evolveum.midpoint.ninja.action.worker.VerifyConsumerWorker;
import com.evolveum.midpoint.ninja.impl.NinjaApplicationContextLevel;
import com.evolveum.midpoint.ninja.util.ConsoleFormat;
import com.evolveum.midpoint.ninja.util.NinjaUtils;
import com.evolveum.midpoint.ninja.util.OperationStatus;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.schema.validator.UpgradeValidationResult;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;

/**
* Created by Viliam Repan (lazyman).
*/
Expand Down Expand Up @@ -67,8 +68,10 @@ public VerifyResult execute() throws Exception {
}

log.info(
"Verification finished, {} critical, {} necessary, {} optional issues found",
result.getCriticalCount(), result.getNecessaryCount(), result.getOptionalCount());
"Verification finished. {}, {}, {} optional issues found",
ConsoleFormat.formatMessageWithErrorParameters("{} critical", result.getCriticalCount()),
ConsoleFormat.formatMessageWithWarningParameters("{} necessary", result.getNecessaryCount()),
result.getOptionalCount());

if (options.getOutput() != null) {
log.info("Verification report saved to '{}'", options.getOutput().getPath());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@

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

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.commons.io.FileUtils;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

/**
* URL format: https://download.evolveum.com/midpoint/<VERSION>/midpoint-<VERSION_NUMBER>-dist.zip
* VERSION can be: 3.4.1, ..., 4.7, latest
Expand Down Expand Up @@ -57,7 +57,8 @@ public File downloadDistribution(@NotNull String version, ProgressListener liste

try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
throw new IOException("Couldn't download distribution with version " + version
+ ". Unexpected code " + response.code() + ", message: " + response.message() + " for url " + url);
}

try (InputStream is = response.body().byteStream()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,24 @@ public ActionResult<Boolean> execute() throws Exception {
final RepositoryService repository = context.getRepository();

if (!repository.isNative()) {
log.error("Repository implementation is not using native PostgreSQL");
log.error("Repository is not using native implementation for PostgreSQL (sqale)");
return new ActionResult<>(false, 1);
}

if (!options.isSkipNodesVersionCheck() && !checkNodesVersion(repository)) {
return new ActionResult<>(false, 2);
} else {
log.warn("Skipping nodes version check");
}

if (!options.isSkipDatabaseVersionCheck() && !checkDatabaseSchemaVersion(repository)) {
return new ActionResult<>(false, 3);
} else {
log.warn("Skipping database schema version check");
}

log.info("Pre-upgrade checks finished successfully");

return new ActionResult<>(true);
}

Expand All @@ -72,11 +77,11 @@ private boolean validateChangeNumber(List<LabeledString> list, String label, int
boolean equals = Objects.equals(number, Integer.toString(expected));

if (!equals) {
log.error(ConsoleFormat.formatError(
"Database schema change number (" + number + ") doesn't match supported one (" + expected + ") for label "
+ label + "."));
log.error(
"Database schema change number ({}) doesn't match supported one ({}) for label {}.",
number, expected, label);
} else {
log.info("Database schema change number matches supported one (" + expected + ") for label " + label + ".");
log.info("Database schema change number matches supported one ({}) for label {}.", expected, label);
}

return equals;
Expand Down Expand Up @@ -107,23 +112,24 @@ private boolean checkNodesVersion(RepositoryService repository) throws SchemaExc
});

if (versions.isEmpty()) {
log.info(ConsoleFormat.formatWarn("There are zero nodes in cluster to validate current midPoint version."));
log.warn("There are zero nodes in cluster to validate current midPoint version.");

return true;
} else if (versions.size() > 1) {
log.error(ConsoleFormat.formatError(
"There are nodes with different versions of midPoint. Please remove incorrect nodes from cluster."));
log.error("There are nodes with different versions of midPoint.");
log.error("Please remove incorrect nodes from cluster and related Node objects from repository.");
return false;
}

log.info(ConsoleFormat.formatInfoMessageWithParameter(
"Node versions in cluster: ", Arrays.toString(versions.toArray())));
log.info(ConsoleFormat.formatMessageWithInfoParameters("Nodes version in cluster: {}", versions.toArray()[0]));

String version = versions.iterator().next();
if (!Objects.equals(version, UpgradeConstants.SUPPORTED_VERSION)) {
log.error(
"There are midPoint nodes with versions " + Arrays.toString(versions.toArray())
+ " that doesn't match supported version for upgrade (" + UpgradeConstants.SUPPORTED_VERSION + ")");
log.error("Make sure that all nodes in midPoint cluster are running same and supported version of midPoint, "
+ "remove all obsolete Node objects from repository.");
return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public ActionResult<Void> execute() throws Exception {
return new ActionResult<>(null, shouldContinue.exitCode());
}
} else {
log.info("Pre-upgrade checks skipped.");
log.warn("Pre-upgrade checks skipped.");
}

// verification
Expand All @@ -54,14 +54,17 @@ public ActionResult<Void> execute() throws Exception {
log.info(Ansi.ansi().fgGreen().a("Pre-upgrade verification succeeded.").reset().toString());
} else {
log.error(Ansi.ansi().fgRed().a("Pre-upgrade verification failed with {} critical items.").reset().toString(), verifyResult.getCriticalCount());
log.error("To get rid of critical items, please run 'verify' command, review the results and then run 'upgrade-objects' before upgrading the distribution.");
log.error("Example commands:\n\n"
+ "\tninja.sh verify --report-style csv --output verify-output.csv\n"
+ "\tninja.sh upgrade-objects --verification-file verify-output.csv\n");
log.error("To get rid of critical items, please run 'verify' command, review the results and then run 'upgrade-objects' before upgrading the distribution.\n");
log.error("Example commands:");
log.error("To verify all objects and save report to CSV file:");
log.error("ninja.sh verify --report-style csv --output verify-output.csv");
log.error("To update all objects");
log.error("ninja.sh upgrade-objects --verification-file verify-output.csv");

return null;
}
} else {
log.info("Verification skipped.");
log.warn("Verification skipped.");
}

// download distribution
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
package com.evolveum.midpoint.ninja.action.upgrade.action;

import java.io.*;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.ninja.action.AbstractRepositorySearchAction;
import com.evolveum.midpoint.ninja.action.upgrade.SkipUpgradeItem;
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.ConsoleFormat;
import com.evolveum.midpoint.ninja.util.NinjaUtils;
import com.evolveum.midpoint.ninja.util.OperationStatus;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

import java.io.*;
import java.util.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;

public class UpgradeObjectsAction extends AbstractRepositorySearchAction<UpgradeObjectsOptions, Void> {

private Map<UUID, Set<SkipUpgradeItem>> skipUpgradeItems;
Expand Down Expand Up @@ -52,7 +51,7 @@ public Void execute() throws Exception {

if (!options.getFiles().isEmpty()) {
if (!options.isSkipUpgradeWarning()) {
log.info(ConsoleFormat.formatWarn("WARNING: File update will remove XML comments and change formatting. Do you wish to proceed? (Y/n)"));
log.warn("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")) {
Expand Down

0 comments on commit 41f701f

Please sign in to comment.