diff --git a/src/main/java/com/exasol/clusterlogs/LogPatternDetector.java b/src/main/java/com/exasol/clusterlogs/LogPatternDetector.java index 58598ff6..77bbcb60 100644 --- a/src/main/java/com/exasol/clusterlogs/LogPatternDetector.java +++ b/src/main/java/com/exasol/clusterlogs/LogPatternDetector.java @@ -43,7 +43,7 @@ public class LogPatternDetector { /** * Check whether a certain pattern appears in a log message. - *

Implementation notes

+ *

Implementation notes

*

* We use {@code find} to locate the log file(s) matching the filename search pattern. This {@code find} command * then executes a command that searches the files. diff --git a/src/main/java/com/exasol/containers/ContainerFileOperations.java b/src/main/java/com/exasol/containers/ContainerFileOperations.java index 685aa6bd..835c7c75 100644 --- a/src/main/java/com/exasol/containers/ContainerFileOperations.java +++ b/src/main/java/com/exasol/containers/ContainerFileOperations.java @@ -15,6 +15,11 @@ public class ContainerFileOperations { private final ExasolContainer> container; + /** + * Creates a new instance of the {@link ContainerFileOperations}. + * + * @param container Container reference required executing commands inside the container. + */ public ContainerFileOperations(final ExasolContainer> container) { this.container = container; } diff --git a/src/main/java/com/exasol/containers/ExasolContainer.java b/src/main/java/com/exasol/containers/ExasolContainer.java index 4e280f8c..11a8261f 100644 --- a/src/main/java/com/exasol/containers/ExasolContainer.java +++ b/src/main/java/com/exasol/containers/ExasolContainer.java @@ -219,15 +219,6 @@ public int getDefaultInternalDatabasePort() { } } - public static class PortDetectionException extends UnsupportedOperationException { - private static final long serialVersionUID = -1871794026177194823L; - - public PortDetectionException(final String service) { - super("Could not detect internal " + service + " port for custom image. " - + "Please specify the port explicitly using withExposedPorts()."); - } - } - @Override public Set getLivenessCheckPortNumbers() { return Set.of(getFirstMappedDatabasePort()); @@ -495,6 +486,9 @@ protected void waitUntilContainerStarted() { } } + /** + * Wait for BucketFS to become operational. + */ protected void waitForBucketFs() { if (isServiceReady(BUCKETFS)) { LOGGER.debug("BucketFS marked running in container status cache. Skipping startup monitoring."); @@ -509,6 +503,9 @@ protected void waitForBucketFs() { } } + /** + * Wait until the UDF container is available. + */ protected void waitForUdfContainer() { if (isServiceReady(UDF)) { LOGGER.debug("UDF Containter marked running in container status cache. Skipping startup monitoring."); @@ -570,6 +567,9 @@ private void cacheContainerStatus() { this.statusCache.write(this.getContainerId(), this.status); } + /** + * Wait until we can read from the Exasol cluster configuration. + */ protected void waitUntilClusterConfigurationAvailable() { if (!this.reused) { LOGGER.debug("Waiting for cluster configuration to become available."); diff --git a/src/main/java/com/exasol/containers/ExasolContainerConstants.java b/src/main/java/com/exasol/containers/ExasolContainerConstants.java index aab2d4bb..bbd4b549 100644 --- a/src/main/java/com/exasol/containers/ExasolContainerConstants.java +++ b/src/main/java/com/exasol/containers/ExasolContainerConstants.java @@ -6,29 +6,64 @@ * Constants for the Exasol Docker containers (like image ID and version). */ public final class ExasolContainerConstants { + /** Version of the Exasol Docker image */ public static final String EXASOL_DOCKER_IMAGE_VERSION = "7.1.1"; + + /** Reference name of the Exasol Docker image */ public static final String EXASOL_DOCKER_IMAGE_ID = "exasol/docker-db"; + + /** Complete Docker image reference */ public static final String EXASOL_DOCKER_IMAGE_REFERENCE = EXASOL_DOCKER_IMAGE_ID + ":" + EXASOL_DOCKER_IMAGE_VERSION; + + /** Exasol initial administrator username */ public static final String DEFAULT_ADMIN_USER = "SYS"; + // The following assignment intentionally contains the initial password for the database administrator. // Keep in mind that this project deals with disposable containers that should only be used in integration tests. + /** Initial administrator password */ @SuppressWarnings("squid:S2068") public static final String DEFAULT_SYS_USER_PASSWORD = "exasol"; - @SuppressWarnings("squid:S1075") // This is the default URI where EXAConf is supposed to be located. + + /** Default path of the central EXAConf configuration file. */ + @SuppressWarnings("squid:S1075") public static final String CLUSTER_CONFIGURATION_PATH = "/exa/etc/EXAConf"; + + /** Default path of all Exasol logs */ @SuppressWarnings("squid:S1075") // This is the parent directory of all logs in the Docker version of Exasol public static final String EXASOL_LOGS_PATH = "/exa/logs"; + + /** Path to core daemon logs */ public static final String EXASOL_CORE_DAEMON_LOGS_PATH = EXASOL_LOGS_PATH + "/cored"; + + /** Reference name for the service used in the container factory */ public static final String NAME = "exasol"; + + /** JDBC main class */ public static final String JDBC_DRIVER_CLASS = "com.exasol.jdbc.EXADriver"; + + /** BucketFS log filename pattern */ public static final String BUCKETFS_DAEMON_LOG_FILENAME_PATTERN = "bucketfsd.*.log"; + + /** File extensions of supported (i.e. auto-expanded) archive formats in BucketFS */ public static final Set SUPPORTED_ARCHIVE_EXTENSIONS = Set.of(".tar", ".tgz", ".tar.gz", ".zip"); + + /** Name of the property with which the docker image name can be overridden */ public static final String DOCKER_IMAGE_OVERRIDE_PROPERTY = "com.exasol.dockerdb.image"; + + /** Default database port for Exasol versions in Docker before 7.0 */ static final int DEFAULT_CONTAINER_INTERNAL_DATABASE_PORT = 8888; + + /** Default database port for Exasol versions in Docker from 7.0 on */ static final int DEFAULT_CONTAINER_INTERNAL_DATABASE_PORT_V7_AND_ABOVE = 8563; + + /** Default BucketFS port for Exasol versions in Docker before 7.0 */ static final int DEFAULT_CONTAINER_INTERNAL_BUCKETFS_PORT = 6583; + + /** Default BucketFS port for Exasol versions in Docker from 7.0 on */ static final int DEFAULT_CONTAINER_INTERNAL_BUCKETFS_PORT_V7_AND_ABOVE = 2580; + + /** Default RPC port for Exasol versions in Docker */ static final int DEFAULT_CONTAINER_INTERNAL_RPC_PORT = 443; private ExasolContainerConstants() { diff --git a/src/main/java/com/exasol/containers/PortDetectionException.java b/src/main/java/com/exasol/containers/PortDetectionException.java new file mode 100644 index 00000000..776d8494 --- /dev/null +++ b/src/main/java/com/exasol/containers/PortDetectionException.java @@ -0,0 +1,18 @@ +package com.exasol.containers; + +/** + * Exception for failed detection of service ports. + */ +public class PortDetectionException extends UnsupportedOperationException { + private static final long serialVersionUID = -1871794026177194823L; + + /** + * Create a new instance of a {@link PortDetectionException}. + * + * @param service service for which the port could not be detected. + */ + public PortDetectionException(final String service) { + super("Could not detect internal " + service + " port for custom image. " + + "Please specify the port explicitly using withExposedPorts()."); + } +} \ No newline at end of file diff --git a/src/main/java/com/exasol/containers/exec/ExitCode.java b/src/main/java/com/exasol/containers/exec/ExitCode.java index 99f70837..4ff90723 100644 --- a/src/main/java/com/exasol/containers/exec/ExitCode.java +++ b/src/main/java/com/exasol/containers/exec/ExitCode.java @@ -4,6 +4,7 @@ * Exit codes for in-container command execution. */ public final class ExitCode { + /** Exit code to signal successful completion */ public static final int OK = 0; private ExitCode() { diff --git a/src/main/java/com/exasol/containers/status/ServiceStatus.java b/src/main/java/com/exasol/containers/status/ServiceStatus.java index 7d7031d6..5e3b9ddb 100644 --- a/src/main/java/com/exasol/containers/status/ServiceStatus.java +++ b/src/main/java/com/exasol/containers/status/ServiceStatus.java @@ -6,7 +6,10 @@ * Status of a service (like BucketFs). */ public enum ServiceStatus implements Serializable { - NOT_READY, // service is no available yet - READY, // service can be used - NOT_CHECKED // service state has not yet been determined + /** service is no available yet */ + NOT_READY, + /** service can be used */ + READY, + /** service state has not yet been determined */ + NOT_CHECKED } \ No newline at end of file diff --git a/src/main/java/com/exasol/containers/wait/strategy/LogFileEntryWaitStrategy.java b/src/main/java/com/exasol/containers/wait/strategy/LogFileEntryWaitStrategy.java index 531ce083..6d39ddde 100644 --- a/src/main/java/com/exasol/containers/wait/strategy/LogFileEntryWaitStrategy.java +++ b/src/main/java/com/exasol/containers/wait/strategy/LogFileEntryWaitStrategy.java @@ -63,6 +63,11 @@ protected void waitUntilReady() { + this.detector.getActualLog() + "\""); } + /** + * Get the timeout in milliseconds. + * + * @return timeout in milliseconds + */ protected long getWaitTimeOutMilliseconds() { return WAIT_DURATION_IN_MILLISECONDS; } diff --git a/src/main/java/com/exasol/containers/wait/strategy/UdfContainerWaitStrategy.java b/src/main/java/com/exasol/containers/wait/strategy/UdfContainerWaitStrategy.java index 5a18e165..9f8287b4 100644 --- a/src/main/java/com/exasol/containers/wait/strategy/UdfContainerWaitStrategy.java +++ b/src/main/java/com/exasol/containers/wait/strategy/UdfContainerWaitStrategy.java @@ -14,6 +14,7 @@ * Strategy for waiting until the UDF language container is ready. */ public class UdfContainerWaitStrategy extends LogFileEntryWaitStrategy { + /** Pattern for detecting extraction of script language containers */ public static final String SCRIPT_LANGUAGE_CONTAINER_READY_PATTERN = "ScriptLanguages.*extracted$"; private static final long WAIT_FOR_UDF_CONTAINER_DURATION_IN_MILLISECONDS = TimeUnit.MINUTES.toMillis(10); private static final Logger LOGGER = LoggerFactory.getLogger(UdfContainerWaitStrategy.class); diff --git a/src/main/java/com/exasol/containers/workarounds/WorkaroundManager.java b/src/main/java/com/exasol/containers/workarounds/WorkaroundManager.java index 162460a4..4833f081 100644 --- a/src/main/java/com/exasol/containers/workarounds/WorkaroundManager.java +++ b/src/main/java/com/exasol/containers/workarounds/WorkaroundManager.java @@ -7,6 +7,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +/** + * Manager for automatically applied workarounds for container version quirks. + */ public class WorkaroundManager { private static final Logger LOGGER = LoggerFactory.getLogger(WorkaroundManager.class); private final Workaround[] workarounds; diff --git a/src/main/java/com/exasol/database/DatabaseServiceException.java b/src/main/java/com/exasol/database/DatabaseServiceException.java index d81c3779..a1fbdd1e 100644 --- a/src/main/java/com/exasol/database/DatabaseServiceException.java +++ b/src/main/java/com/exasol/database/DatabaseServiceException.java @@ -20,6 +20,12 @@ public DatabaseServiceException(final String databaseName, final String message, this.databaseName = databaseName; } + /** + * Create a new instance of a {@link DatabaseServiceException}. + * + * @param databaseName name of the affected database + * @param message error message + */ public DatabaseServiceException(final String databaseName, final String message) { super(message); this.databaseName = databaseName; diff --git a/src/main/java/com/exasol/drivers/ExasolDriverManager.java b/src/main/java/com/exasol/drivers/ExasolDriverManager.java index 470b74bc..f9845035 100644 --- a/src/main/java/com/exasol/drivers/ExasolDriverManager.java +++ b/src/main/java/com/exasol/drivers/ExasolDriverManager.java @@ -85,6 +85,11 @@ private void uploadManifest(final String manifest) { } } + /** + * Get a list of all installed drivers. + * + * @return list of installed drivers + */ public Collection getDrivers() { return this.installedDrivers.values(); } diff --git a/src/main/java/com/exasol/drivers/JdbcDriver.java b/src/main/java/com/exasol/drivers/JdbcDriver.java index aa8b09d8..8096c7ac 100644 --- a/src/main/java/com/exasol/drivers/JdbcDriver.java +++ b/src/main/java/com/exasol/drivers/JdbcDriver.java @@ -91,6 +91,9 @@ public String getManifest() { + "INSERTSIZE=-1"; } + /** + * Builder for {@link JdbcDriver} instances. + */ public static class Builder { private final String name; private String prefix; diff --git a/src/main/java/com/exasol/exaoperation/plugin/Plugin.java b/src/main/java/com/exasol/exaoperation/plugin/Plugin.java index bf0c4f3f..03791796 100644 --- a/src/main/java/com/exasol/exaoperation/plugin/Plugin.java +++ b/src/main/java/com/exasol/exaoperation/plugin/Plugin.java @@ -23,6 +23,7 @@ *

*/ public class Plugin { + /** Plugin package prefix */ public static final String PLUGIN_PACKAGE_PREFIX = "Plugin."; private static final Logger LOGGER = LoggerFactory.getLogger(Plugin.class); @SuppressWarnings("squid:S4784") // This is a test framework RegEx DoS attacks are unrealistic since this would mean diff --git a/src/main/java/com/exasol/support/SupportInformationRetriever.java b/src/main/java/com/exasol/support/SupportInformationRetriever.java index 814bfbbd..9ff41816 100644 --- a/src/main/java/com/exasol/support/SupportInformationRetriever.java +++ b/src/main/java/com/exasol/support/SupportInformationRetriever.java @@ -18,7 +18,9 @@ * Manages getting support information (like cluster logs, configuration settings and core-dumps) from the database. */ public class SupportInformationRetriever { + /** Target directory where support information packages will be stored */ public static final String TARGET_DIRECTORY_PROPERTY = "com.exasol.containers.support_information_target_dir"; + /** Name of the property that allows overriding the monitored container exit */ public static final String MONITORED_EXIT_PROPERTY = "com.exasol.containers.monitored_exit"; static final String SUPPORT_ARCHIVE_PREFIX = "exacluster_debuginfo_"; private static final String EXASUPPORT_EXECUTABLE = "exasupport";