Skip to content

Commit

Permalink
MID-8842 upgrade, more ninja code, a lot of cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Jun 8, 2023
1 parent cc77570 commit a6d3ed5
Show file tree
Hide file tree
Showing 16 changed files with 304 additions and 528 deletions.
8 changes: 0 additions & 8 deletions tools/ninja/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,6 @@
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>

<dependency>
<groupId>com.beust</groupId>
Expand Down Expand Up @@ -143,10 +139,6 @@
<artifactId>okio-jvm</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>

<dependency>
<groupId>org.fusesource.jansi</groupId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
package com.evolveum.midpoint.ninja.action;

import static com.evolveum.midpoint.repo.sqlbase.JdbcRepositoryConfiguration.PROPERTY_DATASOURCE;
import static com.evolveum.midpoint.repo.sqlbase.JdbcRepositoryConfiguration.PROPERTY_JDBC_URL;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import javax.sql.DataSource;

import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.HierarchicalConfiguration;
import org.apache.commons.configuration2.tree.ImmutableNode;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.ApplicationContext;

import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration;
import com.evolveum.midpoint.init.AuditFactory;
import com.evolveum.midpoint.init.AuditServiceProxy;
import com.evolveum.midpoint.ninja.opts.DataSourceOptions;
import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException;
import com.evolveum.midpoint.repo.sqale.SqaleRepoContext;
import com.evolveum.midpoint.repo.sqale.SqaleRepositoryConfiguration;
import com.evolveum.midpoint.repo.sqale.audit.SqaleAuditService;
import com.evolveum.midpoint.repo.sqale.audit.SqaleAuditServiceFactory;
import com.evolveum.midpoint.repo.sqlbase.DataSourceFactory;

public abstract class DataSourceAction<O extends DataSourceOptions> extends Action<O> {

@Override
public void execute() throws Exception {
// this is manual setup of datasource for midpoint, can't be done via spring application context initialization with repository
// because sqale repository during initialization loads data from m_uri and m_ext_item (not yet existing)
final ApplicationContext applicationContext = context.getApplicationContext();
final MidpointConfiguration midpointConfiguration = applicationContext.getBean(MidpointConfiguration.class);

DataSource repositoryDataSource = null;
DataSource auditDataSource = null;
try {
File scriptsDirectory = options.getScriptsDirectory();

// upgrade midpoint repository
Configuration configuration = midpointConfiguration.getConfiguration(MidpointConfiguration.REPOSITORY_CONFIGURATION);
repositoryDataSource = createDataSource(configuration, "ninja-repository");
if (!options.isAuditOnly()) {
executeScripts(repositoryDataSource, scriptsDirectory, options.getScripts());
}

// upgrade audit database
if (!options.isNoAudit()) {
auditDataSource = createAuditDataSource(repositoryDataSource, midpointConfiguration);
if (auditDataSource != null) {
executeScripts(auditDataSource, scriptsDirectory, options.getAuditScripts());
} else {
// todo log error
}
}
} finally {
closeQuietly(repositoryDataSource);
closeQuietly(auditDataSource);
}
}

private void executeScripts(DataSource dataSource, File scriptsDirectory, List<File> scripts) throws IOException, SQLException {
List<File> files = scripts.stream()
.map(script -> scriptsDirectory != null ? new File(scriptsDirectory, script.getPath()) : script)
.toList();

executeSqlScripts(dataSource, files);
}

private DataSource createAuditDataSource(DataSource repositoryDataSource, MidpointConfiguration midpointConfiguration)
throws RepositoryServiceFactoryException {

Configuration config = midpointConfiguration.getConfiguration(MidpointConfiguration.AUDIT_CONFIGURATION);
List<HierarchicalConfiguration<ImmutableNode>> auditServices =
((BaseHierarchicalConfiguration) config).configurationsAt(AuditFactory.CONF_AUDIT_SERVICE);

Configuration auditServiceConfig = null;
for (Configuration serviceConfig : auditServices) {
String className = serviceConfig.getString(AuditFactory.CONF_AUDIT_SERVICE_FACTORY);
if (SqaleAuditServiceFactory.class.getName().equals(className)) {
auditServiceConfig = serviceConfig;
break;
}
}

if (auditServiceConfig == null) {
return null;
}

if (auditServiceConfig.getString(PROPERTY_JDBC_URL) == null
&& auditServiceConfig.getString(PROPERTY_DATASOURCE) == null) {
return repositoryDataSource;
}

return createDataSource(auditServiceConfig, "ninja-audit");
}

private DataSource createDataSource(Configuration configuration, String name) throws RepositoryServiceFactoryException {
SqaleRepositoryConfiguration repositoryConfiguration = new SqaleRepositoryConfiguration(configuration);
repositoryConfiguration.init();
DataSourceFactory dataSourceFactory = new DataSourceFactory(repositoryConfiguration);

return dataSourceFactory.createDataSource(name);
}

private void executeSqlScripts(@NotNull DataSource dataSource, @NotNull List<File> scripts) throws IOException, SQLException {
try (Connection connection = dataSource.getConnection()) {
boolean autocommit = connection.getAutoCommit();
connection.setAutoCommit(true);

try {
for (File script : scripts) {
Statement stmt = connection.createStatement();

String sql = FileUtils.readFileToString(script, StandardCharsets.UTF_8);
stmt.execute(sql);

stmt.close();
}
} finally {
connection.setAutoCommit(autocommit);
}
}
}

private DataSource getAuditDataSourceBean(ApplicationContext applicationContext) throws IllegalAccessException {
AuditServiceProxy auditProxy = applicationContext.getBean(AuditServiceProxy.class);
SqaleAuditService auditService = auditProxy.getImplementation(SqaleAuditService.class);
SqaleRepoContext repoContext = auditService.sqlRepoContext();
return (DataSource) FieldUtils.readField(repoContext, "dataSource", true);
}

private void closeQuietly(DataSource dataSource) {
if (dataSource instanceof Closeable) {
IOUtils.closeQuietly((Closeable) dataSource);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,114 +1,15 @@
package com.evolveum.midpoint.ninja.action;

import static com.evolveum.midpoint.repo.sqlbase.JdbcRepositoryConfiguration.PROPERTY_DATASOURCE;
import static com.evolveum.midpoint.repo.sqlbase.JdbcRepositoryConfiguration.PROPERTY_JDBC_URL;

import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;

import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.HierarchicalConfiguration;
import org.apache.commons.configuration2.tree.ImmutableNode;
import org.apache.commons.io.IOUtils;
import org.springframework.context.ApplicationContext;

import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration;
import com.evolveum.midpoint.init.AuditFactory;
import com.evolveum.midpoint.ninja.opts.SetupDatabaseOptions;
import com.evolveum.midpoint.ninja.util.NinjaUtils;
import com.evolveum.midpoint.repo.api.RepositoryServiceFactoryException;
import com.evolveum.midpoint.repo.sqale.SqaleRepositoryConfiguration;
import com.evolveum.midpoint.repo.sqale.audit.SqaleAuditServiceFactory;
import com.evolveum.midpoint.repo.sqlbase.DataSourceFactory;

public class SetupDatabaseAction extends RepositoryAction<SetupDatabaseOptions> {

@Override
public void execute() throws Exception {
// this is manual setup of datasource for midpoint, can't be done via spring application context initialization with repository
// because sqale repository during initialization loads data from m_uri and m_ext_item (not yet existing)
final ApplicationContext applicationContext = context.getApplicationContext();
final MidpointConfiguration midpointConfiguration = applicationContext.getBean(MidpointConfiguration.class);

DataSource repositoryDataSource = null;
DataSource auditDataSource = null;
try {
File scriptsDirectory = options.getScriptsDirectory();

// upgrade midpoint repository
Configuration configuration = midpointConfiguration.getConfiguration(MidpointConfiguration.REPOSITORY_CONFIGURATION);
repositoryDataSource = createDataSource(configuration, "ninja-repository");
if (!options.isAuditOnly()) {
executeScripts(repositoryDataSource, scriptsDirectory, options.getScripts());
}

// upgrade audit database
if (!options.isNoAudit()) {
auditDataSource = createAuditDataSource(repositoryDataSource, midpointConfiguration);
if (auditDataSource != null) {
executeScripts(auditDataSource, scriptsDirectory, options.getAuditScripts());
} else {
// todo log error
}
}
} finally {
closeQuietly(repositoryDataSource);
closeQuietly(auditDataSource);
}
}

private void closeQuietly(DataSource dataSource) {
if (dataSource instanceof Closeable) {
IOUtils.closeQuietly((Closeable) dataSource);
}
}

private void executeScripts(DataSource dataSource, File scriptsDirectory, List<File> scripts) throws IOException, SQLException {
List<File> files = scripts.stream()
.map(script -> scriptsDirectory != null ? new File(scriptsDirectory, script.getPath()) : script)
.toList();

NinjaUtils.executeSqlScripts(dataSource, files);
}

private DataSource createAuditDataSource(DataSource repositoryDataSource, MidpointConfiguration midpointConfiguration)
throws RepositoryServiceFactoryException {

Configuration config = midpointConfiguration.getConfiguration(MidpointConfiguration.AUDIT_CONFIGURATION);
List<HierarchicalConfiguration<ImmutableNode>> auditServices =
((BaseHierarchicalConfiguration) config).configurationsAt(AuditFactory.CONF_AUDIT_SERVICE);

Configuration auditServiceConfig = null;
for (Configuration serviceConfig : auditServices) {
String className = serviceConfig.getString(AuditFactory.CONF_AUDIT_SERVICE_FACTORY);
if (SqaleAuditServiceFactory.class.getName().equals(className)) {
auditServiceConfig = serviceConfig;
break;
}
}

if (auditServiceConfig == null) {
return null;
}

if (auditServiceConfig.getString(PROPERTY_JDBC_URL) == null
&& auditServiceConfig.getString(PROPERTY_DATASOURCE) == null) {
return repositoryDataSource;
}

return createDataSource(auditServiceConfig, "ninja-audit");
}
public class SetupDatabaseAction extends DataSourceAction<SetupDatabaseOptions> {

private DataSource createDataSource(Configuration configuration, String name) throws RepositoryServiceFactoryException {
SqaleRepositoryConfiguration repositoryConfiguration = new SqaleRepositoryConfiguration(configuration);
repositoryConfiguration.init();
DataSourceFactory dataSourceFactory = new DataSourceFactory(repositoryConfiguration);

return dataSourceFactory.createDataSource(name);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ public class UpgradeAction extends Action<UpgradeOptions> {
// UpgradePreCheckStep.class,
// VerifyStep.class,
// UpgradeObjectsBeforeShutdownStep.class, // todo upgrade initial objects, also all other objects that can be upgraded before midpoint version/DB/midpoint home was upgraded
DownloadDistributionStep.class,
// DatabaseSchemaStep.class,
// UpgradeMidpointInstallationStep.class,
// UpgradeObjectsAfterShutdownStep.class, // todo upgrade initial objects, also all other objects (changes that had to be done after DB upgrade)
// todo what if recomputation/reconciliation/whatever task is needed?
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package com.evolveum.midpoint.ninja.action.upgrade;

import com.evolveum.midpoint.ninja.action.Action;
import com.evolveum.midpoint.ninja.action.DataSourceAction;

public class UpgradeDatabaseAction extends Action<UpgradeDatabaseOptions> {
public class UpgradeDatabaseAction extends DataSourceAction<UpgradeDatabaseOptions> {

@Override
public void execute() throws Exception {

}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,22 @@
package com.evolveum.midpoint.ninja.action.upgrade;

public class UpgradeDatabaseOptions {
import java.io.File;
import java.util.List;

import com.beust.jcommander.Parameters;

import com.evolveum.midpoint.ninja.opts.DataSourceOptions;

@Parameters(resourceBundle = "messages", commandDescriptionKey = "upgradeDatabase")
public class UpgradeDatabaseOptions extends DataSourceOptions {

public UpgradeDatabaseOptions() {
setScriptsDirectory(new File("./doc/config/sql/native-new"));
setScripts(List.of(
new File("postgres-new-upgrade.sql")
));
setAuditScripts(List.of(
new File("postgres-new-upgrade-audit.sql")
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ public void execute() throws Exception {
installationAction.execute();

UpgradeDatabaseOptions databaseOptions = new UpgradeDatabaseOptions();
// databaseOptions.setAuditOnly();
// databaseOptions.setNoAudit();
// databaseOptions.setScripts();
// databaseOptions.setScriptsDirectory();
// databaseOptions.setAuditScripts();
// todo options

UpgradeDatabaseAction databaseAction = new UpgradeDatabaseAction();
Expand Down

0 comments on commit a6d3ed5

Please sign in to comment.