From 7f66073fb47e10032df6e5cc38529c01f93440bc Mon Sep 17 00:00:00 2001 From: Aurium Date: Fri, 19 Mar 2021 17:28:51 -0700 Subject: [PATCH 01/23] set up some general stuff --- pom.xml | 2 +- tick-api/pom.xml | 21 ++++- .../main/java/me/aurium/tick/CommonTick.java | 22 +++++ .../me/aurium/tick/CommonTickFactory.java | 44 +++++++++ .../java/me/aurium/tick/DockerSource.java | 9 -- .../aurium/tick/InvalidProviderException.java | 9 ++ .../src/main/java/me/aurium/tick/Tick.java | 12 +++ .../main/java/me/aurium/tick/TickFactory.java | 10 ++ .../tick/container/ClientTickContainer.java | 37 ++++++++ .../tick/container/ContainerManager.java | 8 ++ .../tick/container/ContainerManagerImpl.java | 42 +++++++++ .../tick/container/ContainerOptions.java | 15 +++ .../aurium/tick/container/CreationTerms.java | 9 ++ .../aurium/tick/container/TickContainer.java | 13 +++ .../container/jdbc/JDBCTickContainer.java | 11 +++ .../tick/container/terms/JDBCTerms.java | 32 +++++++ .../tick/container/terms/MariaDBTerms.java | 17 ++++ .../me/aurium/tick/docker/ClientOptions.java | 15 +++ .../tick/docker/DockerClientProducer.java | 34 +++++++ .../tick/{ => docker}/DockerHolder.java | 2 +- .../me/aurium/tick/docker/DockerSource.java | 8 ++ .../tick/docker/DockerSourceProvider.java | 9 ++ .../docker/machine/MachineDockerSource.java | 54 +++++++++++ .../docker/machine/MachineSourceProvider.java | 91 +++++++++++++++++++ .../machine/ShellExecutionException.java | 13 +++ tick-full/pom.xml | 2 +- tick-rapid/pom.xml | 2 +- 27 files changed, 527 insertions(+), 16 deletions(-) create mode 100644 tick-api/src/main/java/me/aurium/tick/CommonTick.java create mode 100644 tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java delete mode 100644 tick-api/src/main/java/me/aurium/tick/DockerSource.java create mode 100644 tick-api/src/main/java/me/aurium/tick/InvalidProviderException.java create mode 100644 tick-api/src/main/java/me/aurium/tick/Tick.java create mode 100644 tick-api/src/main/java/me/aurium/tick/TickFactory.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/ContainerOptions.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/TickContainer.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/ClientOptions.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/DockerClientProducer.java rename tick-api/src/main/java/me/aurium/tick/{ => docker}/DockerHolder.java (53%) create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/DockerSource.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/DockerSourceProvider.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/machine/MachineDockerSource.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/machine/MachineSourceProvider.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/machine/ShellExecutionException.java diff --git a/pom.xml b/pom.xml index 185093f..267e599 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ - 1.8 + 11 ${compiler.version} ${compiler.version} diff --git a/tick-api/pom.xml b/tick-api/pom.xml index e99b232..684ed6e 100644 --- a/tick-api/pom.xml +++ b/tick-api/pom.xml @@ -20,9 +20,24 @@ - com.amihaiemil.web - docker-java-api - 0.0.13 + com.github.docker-java + docker-java-core + 3.2.7 + + + com.github.docker-java + docker-java-transport-httpclient5 + 3.2.7 + + + org.zeroturnaround + zt-exec + 1.12 + + + org.slf4j + slf4j-simple + 1.7.30 diff --git a/tick-api/src/main/java/me/aurium/tick/CommonTick.java b/tick-api/src/main/java/me/aurium/tick/CommonTick.java new file mode 100644 index 0000000..2290357 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/CommonTick.java @@ -0,0 +1,22 @@ +package me.aurium.tick; + +import me.aurium.tick.container.ContainerManager; + +public class CommonTick implements Tick{ + + private final ContainerManager manager; + + public CommonTick(ContainerManager manager) { + this.manager = manager; + } + + @Override + public void close() throws Exception { + manager.close(); + } + + @Override + public ContainerManager getManager() { + return manager; + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java b/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java new file mode 100644 index 0000000..cab72fc --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java @@ -0,0 +1,44 @@ +package me.aurium.tick; + +import com.github.dockerjava.api.DockerClient; +import me.aurium.tick.container.ContainerManager; +import me.aurium.tick.container.ContainerManagerImpl; +import me.aurium.tick.container.ContainerOptions; +import me.aurium.tick.docker.ClientOptions; +import me.aurium.tick.docker.DockerClientProducer; +import me.aurium.tick.docker.DockerSource; +import me.aurium.tick.docker.DockerSourceProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CommonTickFactory implements TickFactory{ + + private final DockerSourceProvider provider; + private final ClientOptions clientOptions; + private final ContainerOptions containerOptions; + + private final Logger logger = LoggerFactory.getLogger(CommonTickFactory.class); + + //TODO builder + public CommonTickFactory(DockerSourceProvider provider, ClientOptions clientOptions, ContainerOptions containerOptions) { + this.provider = provider; + this.clientOptions = clientOptions; + this.containerOptions = containerOptions; + } + + @Override + public Tick produce() { + logger.debug("Attempting to produce a Tick! Producing DockerClient now..."); + + DockerSource source = provider.source().orElseThrow(InvalidProviderException::new); + DockerClient client = new DockerClientProducer(source).produce(clientOptions); + + logger.debug("DockerClient successfully initialized, setting up a ContainerManager..."); + + ContainerManager manager = new ContainerManagerImpl(client,containerOptions); + + logger.debug("ContainerManager set up correctly! Tick is now ready for use!"); + + return new CommonTick(manager); + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/DockerSource.java b/tick-api/src/main/java/me/aurium/tick/DockerSource.java deleted file mode 100644 index c6d9ff8..0000000 --- a/tick-api/src/main/java/me/aurium/tick/DockerSource.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.aurium.tick; - -import com.amihaiemil.docker.Docker; - -public interface DockerSource { - - Docker produceDocker(); - -} diff --git a/tick-api/src/main/java/me/aurium/tick/InvalidProviderException.java b/tick-api/src/main/java/me/aurium/tick/InvalidProviderException.java new file mode 100644 index 0000000..ee7a766 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/InvalidProviderException.java @@ -0,0 +1,9 @@ +package me.aurium.tick; + +public class InvalidProviderException extends RuntimeException { + + InvalidProviderException() { + super("A provider that was provided was unable to meet it's requirements for launch! See logs for details."); + } + +} diff --git a/tick-api/src/main/java/me/aurium/tick/Tick.java b/tick-api/src/main/java/me/aurium/tick/Tick.java new file mode 100644 index 0000000..aaab585 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/Tick.java @@ -0,0 +1,12 @@ +package me.aurium.tick; + +import me.aurium.tick.container.ContainerManager; + +/** + * Represents a prestarted Tick that can provide multiple containers + */ +public interface Tick extends AutoCloseable { + + ContainerManager getManager(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/TickFactory.java b/tick-api/src/main/java/me/aurium/tick/TickFactory.java new file mode 100644 index 0000000..cf60a38 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/TickFactory.java @@ -0,0 +1,10 @@ +package me.aurium.tick; + +/** + * Represents something that can make Ticks + */ +public interface TickFactory { + + Tick produce(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java b/tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java new file mode 100644 index 0000000..add9341 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java @@ -0,0 +1,37 @@ +package me.aurium.tick.container; + +import com.github.dockerjava.api.DockerClient; + +public class ClientTickContainer implements TickContainer { + + private final DockerClient initializedClient; + private final String containerIdentifier; + private final int shutdownWait; + + public ClientTickContainer(DockerClient initializedClient, String containerIdentifier, ContainerOptions options) { + this.initializedClient = initializedClient; + this.containerIdentifier = containerIdentifier; + this.shutdownWait = options.getContainerShutdownWait(); + } + + @Override + public String containerID() { + return containerIdentifier; + } + + @Override + public void start() { + initializedClient.startContainerCmd(containerIdentifier).exec(); + } + + @Override + public void stop() { + //probably a good spot for things like cooloff + initializedClient.stopContainerCmd(containerIdentifier).withTimeout(shutdownWait).exec(); + } + + @Override + public void close() throws Exception { + this.stop(); + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java b/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java new file mode 100644 index 0000000..22d265e --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java @@ -0,0 +1,8 @@ +package me.aurium.tick.container; + +public interface ContainerManager extends AutoCloseable { + + //TODO needs to be some kind of guaruntee that this image exists on the local client, if not, it needs to be accessed + TickContainer produceContainer(CreationTerms terms); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java b/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java new file mode 100644 index 0000000..d15742a --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java @@ -0,0 +1,42 @@ +package me.aurium.tick.container; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; + +import java.util.HashSet; +import java.util.Set; + +public class ContainerManagerImpl implements ContainerManager { + + //might need to make things threaded in the future + + private final DockerClient client; + private final Set tickContainers; + + private final ContainerOptions options; + + public ContainerManagerImpl(DockerClient client, ContainerOptions options) { + this.client = client; + this.options = options; + this.tickContainers = new HashSet<>(); //maybe concurrent stuff will make this worse in the future but for now as we are sync this is fine + } + + @Override + public TickContainer produceContainer(CreationTerms terms) { + CreateContainerResponse rep = terms.creation(client); + + TickContainer container = new ClientTickContainer(client, rep.getId(), options); + + tickContainers.add(container); + + return container; + } + + @Override + public void close() throws Exception { + for (TickContainer container : tickContainers) { + container.close(); //should closed containers remain in the set? + // not the ones here but if a container is manually stopped. I think it should, but that's what reviews are for - another opinion + } + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerOptions.java b/tick-api/src/main/java/me/aurium/tick/container/ContainerOptions.java new file mode 100644 index 0000000..b234363 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/ContainerOptions.java @@ -0,0 +1,15 @@ +package me.aurium.tick.container; + +//todo make this more useful +public class ContainerOptions { + + private final int containerShutdownWait; + + public ContainerOptions(int containerShutdownWait) { + this.containerShutdownWait = containerShutdownWait; + } + + public int getContainerShutdownWait() { + return containerShutdownWait; + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java b/tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java new file mode 100644 index 0000000..3fb8dd4 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java @@ -0,0 +1,9 @@ +package me.aurium.tick.container; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; + +public interface CreationTerms { + + CreateContainerResponse creation(DockerClient client); +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/TickContainer.java b/tick-api/src/main/java/me/aurium/tick/container/TickContainer.java new file mode 100644 index 0000000..fe2c0d6 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/TickContainer.java @@ -0,0 +1,13 @@ +package me.aurium.tick.container; + +/** + * Represents an already created Container that can start and stop itself + */ +public interface TickContainer extends AutoCloseable { + + String containerID(); + + void start(); + void stop(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java b/tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java new file mode 100644 index 0000000..a9d53cc --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java @@ -0,0 +1,11 @@ +package me.aurium.tick.container.jdbc; + +import me.aurium.tick.container.TickContainer; + +public interface JDBCTickContainer extends TickContainer { + + String getJDBCUrl(); + + String getExposedJDBCUrl(); //figure this out later + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java b/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java new file mode 100644 index 0000000..0dd86e9 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java @@ -0,0 +1,32 @@ +package me.aurium.tick.container.terms; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import me.aurium.tick.container.CreationTerms; + +public abstract class JDBCTerms implements CreationTerms { + + private final String db_name; + private final String db_username; + private final String db_password; + + protected JDBCTerms(String db_name, String db_username, String db_password) { + this.db_name = db_name; + this.db_username = db_username; + this.db_password = db_password; + } + + protected String getDb_name() { + return db_name; + } + + protected String getDb_username() { + return db_username; + } + + protected String getDb_password() { + return db_password; + } + + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java b/tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java new file mode 100644 index 0000000..91ad6b0 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java @@ -0,0 +1,17 @@ +package me.aurium.tick.container.terms; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import me.aurium.tick.container.CreationTerms; + +public class MariaDBTerms extends JDBCTerms { + + protected MariaDBTerms(String db_name, String db_username, String db_password) { + super(db_name, db_username, db_password); + } + + @Override + public CreateContainerResponse creation(DockerClient client) { + return null; + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/ClientOptions.java b/tick-api/src/main/java/me/aurium/tick/docker/ClientOptions.java new file mode 100644 index 0000000..e60db94 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/ClientOptions.java @@ -0,0 +1,15 @@ +package me.aurium.tick.docker; + +//TODO make this more useful +public class ClientOptions { + + private final boolean withTLS; + + public ClientOptions(boolean withTLS) { + this.withTLS = withTLS; + } + + public boolean isWithTLS() { + return withTLS; + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerClientProducer.java b/tick-api/src/main/java/me/aurium/tick/docker/DockerClientProducer.java new file mode 100644 index 0000000..447a7f3 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/DockerClientProducer.java @@ -0,0 +1,34 @@ +package me.aurium.tick.docker; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; +import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; +import com.github.dockerjava.transport.DockerHttpClient; + +public class DockerClientProducer { + + private final DockerSource source; + + public DockerClientProducer(DockerSource source) { + this.source = source; + } + + public DockerClient produce(ClientOptions options) { + DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withDockerHost(source.getSourceURL()) + .withDockerTlsVerify(options.isWithTLS()) + .build(); + + DockerHttpClient client = new ApacheDockerHttpClient.Builder() + .dockerHost(config.getDockerHost()) + .sslConfig(config.getSSLConfig()) + .build(); + + //initialize! + + return DockerClientImpl.getInstance(config,client); //now we have le docker + } + +} diff --git a/tick-api/src/main/java/me/aurium/tick/DockerHolder.java b/tick-api/src/main/java/me/aurium/tick/docker/DockerHolder.java similarity index 53% rename from tick-api/src/main/java/me/aurium/tick/DockerHolder.java rename to tick-api/src/main/java/me/aurium/tick/docker/DockerHolder.java index 685d8ec..3392507 100644 --- a/tick-api/src/main/java/me/aurium/tick/DockerHolder.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/DockerHolder.java @@ -1,4 +1,4 @@ -package me.aurium.tick; +package me.aurium.tick.docker; public interface DockerHolder { } diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerSource.java b/tick-api/src/main/java/me/aurium/tick/docker/DockerSource.java new file mode 100644 index 0000000..82a1461 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/DockerSource.java @@ -0,0 +1,8 @@ +package me.aurium.tick.docker; + +public interface DockerSource { + + String getSourceURL(); + String getSourceIP(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerSourceProvider.java b/tick-api/src/main/java/me/aurium/tick/docker/DockerSourceProvider.java new file mode 100644 index 0000000..cf1f2a0 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/DockerSourceProvider.java @@ -0,0 +1,9 @@ +package me.aurium.tick.docker; + +import java.util.Optional; + +public interface DockerSourceProvider { + + Optional source(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineDockerSource.java b/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineDockerSource.java new file mode 100644 index 0000000..e0d53eb --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineDockerSource.java @@ -0,0 +1,54 @@ +package me.aurium.tick.docker.machine; + +import me.aurium.tick.docker.DockerSource; +import org.zeroturnaround.exec.ProcessExecutor; +import org.zeroturnaround.exec.ProcessResult; + +import java.io.IOException; +import java.util.concurrent.TimeoutException; + +public class MachineDockerSource implements DockerSource { + + private final String executableName; + private final String machineToUse; + + public MachineDockerSource(String executableName, String machineToUse) { + this.executableName = executableName; + this.machineToUse = machineToUse; + } + + + @Override + public String getSourceURL() { + + try { + ProcessResult result = new ProcessExecutor() + .command(executableName,"url", machineToUse) + .readOutput(true) + .exitValueNormal() + .execute(); + + return result.outputUTF8(); + + } catch (InterruptedException | IOException | TimeoutException e) { + throw new ShellExecutionException(e); + } + + } + + @Override + public String getSourceIP() { + try { + ProcessResult result = new ProcessExecutor() + .command(executableName,"ip", machineToUse) + .readOutput(true) + .exitValueNormal() + .execute(); + + return result.outputUTF8(); + + } catch (InterruptedException | IOException | TimeoutException e) { + throw new ShellExecutionException(e); + } + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineSourceProvider.java b/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineSourceProvider.java new file mode 100644 index 0000000..d4354a5 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineSourceProvider.java @@ -0,0 +1,91 @@ +package me.aurium.tick.docker.machine; + +import me.aurium.tick.docker.DockerSource; +import me.aurium.tick.docker.DockerSourceProvider; +import org.apache.commons.lang.SystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.zeroturnaround.exec.ProcessExecutor; +import org.zeroturnaround.exec.ProcessResult; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeoutException; +import java.util.regex.Pattern; + +public class MachineSourceProvider implements DockerSourceProvider { + + private final String preferredDockerProvider; + + private static final String DEFAULT = "default"; + + private final Logger logger = LoggerFactory.getLogger(MachineSourceProvider.class); + + public MachineSourceProvider(String preferredDockerProvider) { + this.preferredDockerProvider = preferredDockerProvider; + } + + @Override + public Optional source() { + //TODO: make this better somehow. I don't know how, since at some point everything has to be stringly typed. + + logger.info("Attempting to produce MachineDockerSource using commandline!"); + + String executableName = "docker-machine"; + if (SystemUtils.IS_OS_WINDOWS) { + executableName="docker-machine.exe"; + } + + if (!executableExists(executableName)) return Optional.empty(); + + try { + ProcessResult result = new ProcessExecutor() + .command(executableName,"ls","-q", "--filter state=\"Running\"") + .readOutput(true) + .exitValueNormal() + .execute(); + + List executables = List.of(result.outputUTF8().split("\n")); + + if (executables.contains(preferredDockerProvider)) { + logger.info("Preferred docker instance found on DockerMachine! Using instance: " + preferredDockerProvider); + + return Optional.of(new MachineDockerSource(executableName,preferredDockerProvider)); + } else if (executables.contains(DEFAULT)) { + logger.info("Preferred docker instance was not found, using default instance!"); + + return Optional.of(new MachineDockerSource(executableName,DEFAULT)); + } else { + logger.error("No running docker was found!"); + + return Optional.empty(); + } + + } catch (IOException | InterruptedException | TimeoutException e) { + throw new ShellExecutionException(e); + } + + } + + private boolean executableExists(String executable) { + + File directFile = new File(executable); + if (directFile.exists() && directFile.canExecute()) { + return true; + } + + for (String pathString : System.getenv("PATH").split(Pattern.quote(File.pathSeparator))) { + Path path = Paths.get(pathString); + if (Files.exists(path.resolve(executable)) && Files.isExecutable(path.resolve(executable))) { + return true; + } + } + + return false; + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/machine/ShellExecutionException.java b/tick-api/src/main/java/me/aurium/tick/docker/machine/ShellExecutionException.java new file mode 100644 index 0000000..bc7ed1d --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/machine/ShellExecutionException.java @@ -0,0 +1,13 @@ +package me.aurium.tick.docker.machine; + +public class ShellExecutionException extends RuntimeException{ + + ShellExecutionException(Throwable throwable) { + super(throwable); + } + + ShellExecutionException(String string) { + super(string); + } + +} diff --git a/tick-full/pom.xml b/tick-full/pom.xml index 8ff90fe..b06c129 100644 --- a/tick-full/pom.xml +++ b/tick-full/pom.xml @@ -13,7 +13,7 @@ tick-full - 1.0.1 + 1.0.2 ${compiler.version} diff --git a/tick-rapid/pom.xml b/tick-rapid/pom.xml index 883ea0c..94f0e53 100644 --- a/tick-rapid/pom.xml +++ b/tick-rapid/pom.xml @@ -13,7 +13,7 @@ maven-plugin - 1.0.0 + 1.0.2 ${compiler.version} From 0dc153ddcafd22e836c3ee0841b21ee282404b07 Mon Sep 17 00:00:00 2001 From: Aurium Date: Mon, 22 Mar 2021 21:34:36 -0700 Subject: [PATCH 02/23] various minor api improvements --- .idea/compiler.xml | 1 + tick-api/pom.xml | 4 +- .../java/me/aurium/tick/CommonProviders.java | 11 +++ .../me/aurium/tick/CommonTickFactory.java | 8 +- .../java/me/aurium/tick/ImageManager.java | 9 +++ .../tick/container/ClientTickContainer.java | 37 --------- .../tick/container/ContainerManager.java | 5 +- .../tick/container/ContainerManagerImpl.java | 24 +++--- .../aurium/tick/container/CreationTerms.java | 9 --- .../container/AbstractJDBCContainer.java | 45 +++++++++++ .../container/container/JDBCContainer.java | 11 +++ .../container/container/MariaDBContainer.java | 58 ++++++++++++++ .../{ => container}/TickContainer.java | 4 +- .../container/jdbc/JDBCTickContainer.java | 11 --- .../tick/container/terms/CreationTerms.java | 9 +++ .../tick/container/terms/JDBCTerms.java | 32 ++------ .../tick/container/terms/MariaDBTerms.java | 78 +++++++++++++++++-- .../me/aurium/tick/docker/DockerHolder.java | 4 - .../aurium/tick/docker/network/Network.java | 7 ++ .../docker/{ => source}/ClientOptions.java | 2 +- .../{ => source}/DockerClientProducer.java | 2 +- .../tick/docker/source/DockerHolder.java | 4 + .../docker/{ => source}/DockerSource.java | 2 +- .../{ => source}/DockerSourceProvider.java | 2 +- .../machine/MachineDockerSource.java | 4 +- .../machine/MachineSourceProvider.java | 12 +-- .../machine/ShellExecutionException.java | 2 +- .../me/aurium/tick/driver/TickDriver.java | 54 +++++++++++++ 28 files changed, 327 insertions(+), 124 deletions(-) create mode 100644 tick-api/src/main/java/me/aurium/tick/CommonProviders.java create mode 100644 tick-api/src/main/java/me/aurium/tick/ImageManager.java delete mode 100644 tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java delete mode 100644 tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/container/AbstractJDBCContainer.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/container/JDBCContainer.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/container/MariaDBContainer.java rename tick-api/src/main/java/me/aurium/tick/container/{ => container}/TickContainer.java (71%) delete mode 100644 tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java create mode 100644 tick-api/src/main/java/me/aurium/tick/container/terms/CreationTerms.java delete mode 100644 tick-api/src/main/java/me/aurium/tick/docker/DockerHolder.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/network/Network.java rename tick-api/src/main/java/me/aurium/tick/docker/{ => source}/ClientOptions.java (86%) rename tick-api/src/main/java/me/aurium/tick/docker/{ => source}/DockerClientProducer.java (96%) create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/source/DockerHolder.java rename tick-api/src/main/java/me/aurium/tick/docker/{ => source}/DockerSource.java (70%) rename tick-api/src/main/java/me/aurium/tick/docker/{ => source}/DockerSourceProvider.java (74%) rename tick-api/src/main/java/me/aurium/tick/docker/{ => source}/machine/MachineDockerSource.java (93%) rename tick-api/src/main/java/me/aurium/tick/docker/{ => source}/machine/MachineSourceProvider.java (85%) rename tick-api/src/main/java/me/aurium/tick/docker/{ => source}/machine/ShellExecutionException.java (83%) create mode 100644 tick-api/src/main/java/me/aurium/tick/driver/TickDriver.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 08de2d0..056f65e 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -9,6 +9,7 @@ + diff --git a/tick-api/pom.xml b/tick-api/pom.xml index 684ed6e..c698f63 100644 --- a/tick-api/pom.xml +++ b/tick-api/pom.xml @@ -36,8 +36,8 @@ org.slf4j - slf4j-simple - 1.7.30 + slf4j-api + 2.0.0-alpha1 diff --git a/tick-api/src/main/java/me/aurium/tick/CommonProviders.java b/tick-api/src/main/java/me/aurium/tick/CommonProviders.java new file mode 100644 index 0000000..bd7dac2 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/CommonProviders.java @@ -0,0 +1,11 @@ +package me.aurium.tick; + +import me.aurium.tick.docker.source.DockerSourceProvider; + +public class CommonProviders { + + public static DockerSourceProvider find() { + return null; + } + +} diff --git a/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java b/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java index cab72fc..92f75cc 100644 --- a/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java +++ b/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java @@ -4,10 +4,10 @@ import me.aurium.tick.container.ContainerManager; import me.aurium.tick.container.ContainerManagerImpl; import me.aurium.tick.container.ContainerOptions; -import me.aurium.tick.docker.ClientOptions; -import me.aurium.tick.docker.DockerClientProducer; -import me.aurium.tick.docker.DockerSource; -import me.aurium.tick.docker.DockerSourceProvider; +import me.aurium.tick.docker.source.ClientOptions; +import me.aurium.tick.docker.source.DockerClientProducer; +import me.aurium.tick.docker.source.DockerSource; +import me.aurium.tick.docker.source.DockerSourceProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/tick-api/src/main/java/me/aurium/tick/ImageManager.java b/tick-api/src/main/java/me/aurium/tick/ImageManager.java new file mode 100644 index 0000000..66eb278 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/ImageManager.java @@ -0,0 +1,9 @@ +package me.aurium.tick; + +import java.util.concurrent.CompletableFuture; + +public interface ImageManager { + + CompletableFuture loadImageID(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java b/tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java deleted file mode 100644 index add9341..0000000 --- a/tick-api/src/main/java/me/aurium/tick/container/ClientTickContainer.java +++ /dev/null @@ -1,37 +0,0 @@ -package me.aurium.tick.container; - -import com.github.dockerjava.api.DockerClient; - -public class ClientTickContainer implements TickContainer { - - private final DockerClient initializedClient; - private final String containerIdentifier; - private final int shutdownWait; - - public ClientTickContainer(DockerClient initializedClient, String containerIdentifier, ContainerOptions options) { - this.initializedClient = initializedClient; - this.containerIdentifier = containerIdentifier; - this.shutdownWait = options.getContainerShutdownWait(); - } - - @Override - public String containerID() { - return containerIdentifier; - } - - @Override - public void start() { - initializedClient.startContainerCmd(containerIdentifier).exec(); - } - - @Override - public void stop() { - //probably a good spot for things like cooloff - initializedClient.stopContainerCmd(containerIdentifier).withTimeout(shutdownWait).exec(); - } - - @Override - public void close() throws Exception { - this.stop(); - } -} diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java b/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java index 22d265e..8244f6f 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java +++ b/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java @@ -1,8 +1,11 @@ package me.aurium.tick.container; +import me.aurium.tick.container.container.TickContainer; +import me.aurium.tick.container.terms.CreationTerms; + public interface ContainerManager extends AutoCloseable { //TODO needs to be some kind of guaruntee that this image exists on the local client, if not, it needs to be accessed - TickContainer produceContainer(CreationTerms terms); + T produceContainer(CreationTerms terms); } diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java b/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java index d15742a..d1a6bb5 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java +++ b/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java @@ -1,7 +1,8 @@ package me.aurium.tick.container; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.CreateContainerResponse; +import me.aurium.tick.container.container.TickContainer; +import me.aurium.tick.container.terms.CreationTerms; import java.util.HashSet; import java.util.Set; @@ -21,17 +22,6 @@ public ContainerManagerImpl(DockerClient client, ContainerOptions options) { this.tickContainers = new HashSet<>(); //maybe concurrent stuff will make this worse in the future but for now as we are sync this is fine } - @Override - public TickContainer produceContainer(CreationTerms terms) { - CreateContainerResponse rep = terms.creation(client); - - TickContainer container = new ClientTickContainer(client, rep.getId(), options); - - tickContainers.add(container); - - return container; - } - @Override public void close() throws Exception { for (TickContainer container : tickContainers) { @@ -39,4 +29,14 @@ public void close() throws Exception { // not the ones here but if a container is manually stopped. I think it should, but that's what reviews are for - another opinion } } + + @Override + public T produceContainer(CreationTerms terms) { + + T container = terms.creation(client,options); + + tickContainers.add(container); + + return container; + } } diff --git a/tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java b/tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java deleted file mode 100644 index 3fb8dd4..0000000 --- a/tick-api/src/main/java/me/aurium/tick/container/CreationTerms.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.aurium.tick.container; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.CreateContainerResponse; - -public interface CreationTerms { - - CreateContainerResponse creation(DockerClient client); -} diff --git a/tick-api/src/main/java/me/aurium/tick/container/container/AbstractJDBCContainer.java b/tick-api/src/main/java/me/aurium/tick/container/container/AbstractJDBCContainer.java new file mode 100644 index 0000000..b94af3d --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/container/AbstractJDBCContainer.java @@ -0,0 +1,45 @@ +package me.aurium.tick.container.container; + +import com.github.dockerjava.api.DockerClient; +import me.aurium.tick.container.ContainerOptions; +import me.aurium.tick.container.terms.JDBCTerms; + +public abstract class AbstractJDBCContainer implements JDBCContainer { + + private final DockerClient client; + private final ContainerOptions options; + private final String containerID; + private final JDBCTerms terms; + + protected AbstractJDBCContainer(DockerClient client, ContainerOptions options, String containerID, JDBCTerms terms) { + this.client = client; + this.options = options; + this.containerID = containerID; + this.terms = terms; + } + + @Override + public String managedContainerName() { + return terms.containerName(); + } + + @Override + public String containerID() { + return containerID; + } + + @Override + public void start() { + client.startContainerCmd(containerID).exec(); + } + + @Override + public void stop() { + client.stopContainerCmd(containerID).withTimeout(options.getContainerShutdownWait()).exec(); + } + + @Override + public void close() throws Exception { + stop(); + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/container/JDBCContainer.java b/tick-api/src/main/java/me/aurium/tick/container/container/JDBCContainer.java new file mode 100644 index 0000000..09da18b --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/container/JDBCContainer.java @@ -0,0 +1,11 @@ +package me.aurium.tick.container.container; + +public interface JDBCContainer extends TickContainer { + + String getJDBCUrl(); + String getExposedJDBCUrl(); //figure this out later + + //String driverClass; + //String + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/container/MariaDBContainer.java b/tick-api/src/main/java/me/aurium/tick/container/container/MariaDBContainer.java new file mode 100644 index 0000000..e552c48 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/container/MariaDBContainer.java @@ -0,0 +1,58 @@ +package me.aurium.tick.container.container; + +import com.github.dockerjava.api.DockerClient; +import me.aurium.tick.container.ContainerOptions; +import me.aurium.tick.container.terms.MariaDBTerms; + +public class MariaDBContainer implements JDBCContainer { + + private final DockerClient client; + private final ContainerOptions options; + private final String containerID; + private final MariaDBTerms terms; + + public MariaDBContainer(DockerClient client, ContainerOptions options, String containerID, MariaDBTerms terms) { + this.client = client; + this.options = options; + this.containerID = containerID; + this.terms = terms; + } + + @Override + public String getJDBCUrl() { + return null; + } + + @Override + public String getExposedJDBCUrl() { + return null; + } + + @Override + public String managedContainerName() { + return terms.getDockerName(); + } + + @Override + public String containerID() { + return containerID; + } + + @Override + public void start() { + client.startContainerCmd(containerID).exec(); + } + + @Override + public void stop() { + //TODO a248 what you were saying about idempotcy: I believe this should be safe but i'm not 100% sure, do you + //think it'd be best to just leave a check to see if the container is stopped? I think this command + //fails safely if the container is already stopped, but i'm not sure. + client.stopContainerCmd(containerID).withTimeout(options.getContainerShutdownWait()).exec(); + } + + @Override + public void close() throws Exception { + this.stop(); + } +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/TickContainer.java b/tick-api/src/main/java/me/aurium/tick/container/container/TickContainer.java similarity index 71% rename from tick-api/src/main/java/me/aurium/tick/container/TickContainer.java rename to tick-api/src/main/java/me/aurium/tick/container/container/TickContainer.java index fe2c0d6..a648335 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/TickContainer.java +++ b/tick-api/src/main/java/me/aurium/tick/container/container/TickContainer.java @@ -1,10 +1,12 @@ -package me.aurium.tick.container; +package me.aurium.tick.container.container; /** * Represents an already created Container that can start and stop itself */ public interface TickContainer extends AutoCloseable { + String managedContainerName(); + String containerID(); void start(); diff --git a/tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java b/tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java deleted file mode 100644 index a9d53cc..0000000 --- a/tick-api/src/main/java/me/aurium/tick/container/jdbc/JDBCTickContainer.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.aurium.tick.container.jdbc; - -import me.aurium.tick.container.TickContainer; - -public interface JDBCTickContainer extends TickContainer { - - String getJDBCUrl(); - - String getExposedJDBCUrl(); //figure this out later - -} diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/CreationTerms.java b/tick-api/src/main/java/me/aurium/tick/container/terms/CreationTerms.java new file mode 100644 index 0000000..918f86d --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/container/terms/CreationTerms.java @@ -0,0 +1,9 @@ +package me.aurium.tick.container.terms; + +import com.github.dockerjava.api.DockerClient; +import me.aurium.tick.container.ContainerOptions; +import me.aurium.tick.container.container.TickContainer; + +public interface CreationTerms { + T creation(DockerClient client, ContainerOptions options); +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java b/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java index 0dd86e9..c5f69c3 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java +++ b/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java @@ -1,32 +1,16 @@ package me.aurium.tick.container.terms; -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.CreateContainerResponse; -import me.aurium.tick.container.CreationTerms; +import me.aurium.tick.container.container.JDBCContainer; -public abstract class JDBCTerms implements CreationTerms { +public interface JDBCTerms extends CreationTerms { - private final String db_name; - private final String db_username; - private final String db_password; + int externalPort(); - protected JDBCTerms(String db_name, String db_username, String db_password) { - this.db_name = db_name; - this.db_username = db_username; - this.db_password = db_password; - } - - protected String getDb_name() { - return db_name; - } - - protected String getDb_username() { - return db_username; - } - - protected String getDb_password() { - return db_password; - } + String rootPassword(); + String databaseUsername(); + String databasePassword(); + String databaseName(); + String containerName(); } diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java b/tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java index 91ad6b0..350a86a 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java +++ b/tick-api/src/main/java/me/aurium/tick/container/terms/MariaDBTerms.java @@ -2,16 +2,82 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerResponse; -import me.aurium.tick.container.CreationTerms; +import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; +import me.aurium.tick.container.ContainerOptions; +import me.aurium.tick.container.container.JDBCContainer; +import me.aurium.tick.container.container.MariaDBContainer; -public class MariaDBTerms extends JDBCTerms { +/** + * mariadb + * + * external port is the exposed port of the mariadb container, but still + */ +public class MariaDBTerms implements JDBCTerms { - protected MariaDBTerms(String db_name, String db_username, String db_password) { - super(db_name, db_username, db_password); + private final String rootPassword; + private final String databaseUsername; + private final String databasePassword; + private final String databaseName; + private final String containerName; + + private final int portBinding; + + public MariaDBTerms(String rootPassword, String databaseUsername, String databasePassword, String databaseName, String containerName, int portBinding) { + this.rootPassword = rootPassword; + this.databaseUsername = databaseUsername; + this.databasePassword = databasePassword; + this.databaseName = databaseName; + this.containerName = containerName; + this.portBinding = portBinding; + } + + @Override + public int externalPort() { + return portBinding; + } + + @Override + public String rootPassword() { + return rootPassword; + } + + @Override + public String databaseUsername() { + return databaseUsername; } @Override - public CreateContainerResponse creation(DockerClient client) { - return null; + public String databasePassword() { + return databasePassword; } + + @Override + public String databaseName() { + return databaseName; + } + + @Override + public String containerName() { + return containerName; + } + + @Override + public JDBCContainer creation(DockerClient client, ContainerOptions options) { + CreateContainerResponse response = client.createContainerCmd("mariadb:10.5.9") + .withName(containerName) + .withEnv( + "MYSQL_ROOT=" + rootPassword, + "MYSQL_DATABASE=" + databaseName, + "MYSQL_USER=" + databaseUsername, + "MYSQL_PASSWORD=" + databasePassword + ) + .withHostConfig(new HostConfig() + .withPortBindings(PortBinding.parse(portBinding + ":3306")) + ) + .exec(); + + return new MariaDBContainer(client, options, response.getId(), this); + } + } diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerHolder.java b/tick-api/src/main/java/me/aurium/tick/docker/DockerHolder.java deleted file mode 100644 index 3392507..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/DockerHolder.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.aurium.tick.docker; - -public interface DockerHolder { -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/network/Network.java b/tick-api/src/main/java/me/aurium/tick/docker/network/Network.java new file mode 100644 index 0000000..fa90b39 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/network/Network.java @@ -0,0 +1,7 @@ +package me.aurium.tick.docker.network; + +public interface Network extends AutoCloseable{ + + String getNetworkName(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/ClientOptions.java b/tick-api/src/main/java/me/aurium/tick/docker/source/ClientOptions.java similarity index 86% rename from tick-api/src/main/java/me/aurium/tick/docker/ClientOptions.java rename to tick-api/src/main/java/me/aurium/tick/docker/source/ClientOptions.java index e60db94..f29c725 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/ClientOptions.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/ClientOptions.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker; +package me.aurium.tick.docker.source; //TODO make this more useful public class ClientOptions { diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerClientProducer.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerClientProducer.java similarity index 96% rename from tick-api/src/main/java/me/aurium/tick/docker/DockerClientProducer.java rename to tick-api/src/main/java/me/aurium/tick/docker/source/DockerClientProducer.java index 447a7f3..c8b5325 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/DockerClientProducer.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerClientProducer.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker; +package me.aurium.tick.docker.source; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.core.DefaultDockerClientConfig; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerHolder.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerHolder.java new file mode 100644 index 0000000..61cd52d --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerHolder.java @@ -0,0 +1,4 @@ +package me.aurium.tick.docker.source; + +public interface DockerHolder { +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerSource.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSource.java similarity index 70% rename from tick-api/src/main/java/me/aurium/tick/docker/DockerSource.java rename to tick-api/src/main/java/me/aurium/tick/docker/source/DockerSource.java index 82a1461..f0c652e 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/DockerSource.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSource.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker; +package me.aurium.tick.docker.source; public interface DockerSource { diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerSourceProvider.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSourceProvider.java similarity index 74% rename from tick-api/src/main/java/me/aurium/tick/docker/DockerSourceProvider.java rename to tick-api/src/main/java/me/aurium/tick/docker/source/DockerSourceProvider.java index cf1f2a0..7c2fbe0 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/DockerSourceProvider.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSourceProvider.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker; +package me.aurium.tick.docker.source; import java.util.Optional; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineDockerSource.java b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineDockerSource.java similarity index 93% rename from tick-api/src/main/java/me/aurium/tick/docker/machine/MachineDockerSource.java rename to tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineDockerSource.java index e0d53eb..2d71bb6 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineDockerSource.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineDockerSource.java @@ -1,6 +1,6 @@ -package me.aurium.tick.docker.machine; +package me.aurium.tick.docker.source.machine; -import me.aurium.tick.docker.DockerSource; +import me.aurium.tick.docker.source.DockerSource; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.ProcessResult; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineSourceProvider.java b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineSourceProvider.java similarity index 85% rename from tick-api/src/main/java/me/aurium/tick/docker/machine/MachineSourceProvider.java rename to tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineSourceProvider.java index d4354a5..956c920 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/machine/MachineSourceProvider.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineSourceProvider.java @@ -1,7 +1,7 @@ -package me.aurium.tick.docker.machine; +package me.aurium.tick.docker.source.machine; -import me.aurium.tick.docker.DockerSource; -import me.aurium.tick.docker.DockerSourceProvider; +import me.aurium.tick.docker.source.DockerSource; +import me.aurium.tick.docker.source.DockerSourceProvider; import org.apache.commons.lang.SystemUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,7 +24,7 @@ public class MachineSourceProvider implements DockerSourceProvider { private static final String DEFAULT = "default"; - private final Logger logger = LoggerFactory.getLogger(MachineSourceProvider.class); + private final Logger logger = LoggerFactory.getLogger(getClass()); public MachineSourceProvider(String preferredDockerProvider) { this.preferredDockerProvider = preferredDockerProvider; @@ -55,11 +55,11 @@ public Optional source() { if (executables.contains(preferredDockerProvider)) { logger.info("Preferred docker instance found on DockerMachine! Using instance: " + preferredDockerProvider); - return Optional.of(new MachineDockerSource(executableName,preferredDockerProvider)); + return Optional.of(new me.aurium.tick.docker.source.machine.MachineDockerSource(executableName,preferredDockerProvider)); } else if (executables.contains(DEFAULT)) { logger.info("Preferred docker instance was not found, using default instance!"); - return Optional.of(new MachineDockerSource(executableName,DEFAULT)); + return Optional.of(new me.aurium.tick.docker.source.machine.MachineDockerSource(executableName,DEFAULT)); } else { logger.error("No running docker was found!"); diff --git a/tick-api/src/main/java/me/aurium/tick/docker/machine/ShellExecutionException.java b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/ShellExecutionException.java similarity index 83% rename from tick-api/src/main/java/me/aurium/tick/docker/machine/ShellExecutionException.java rename to tick-api/src/main/java/me/aurium/tick/docker/source/machine/ShellExecutionException.java index bc7ed1d..fdfc8c4 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/machine/ShellExecutionException.java +++ b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/ShellExecutionException.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.machine; +package me.aurium.tick.docker.source.machine; public class ShellExecutionException extends RuntimeException{ diff --git a/tick-api/src/main/java/me/aurium/tick/driver/TickDriver.java b/tick-api/src/main/java/me/aurium/tick/driver/TickDriver.java new file mode 100644 index 0000000..fc3d8c7 --- /dev/null +++ b/tick-api/src/main/java/me/aurium/tick/driver/TickDriver.java @@ -0,0 +1,54 @@ +package me.aurium.tick.driver; + +import me.aurium.tick.container.container.JDBCContainer; + +import java.sql.*; +import java.util.Properties; +import java.util.Set; +import java.util.logging.Logger; + +public class TickDriver implements Driver { + + private final Set containerSet; + + public TickDriver(Set containerSet) { + this.containerSet = containerSet; + + //(move this elswhere duh) DriverManager DriverManager.registerDriver(new TickDriver); + } + + @Override + public Connection connect(String s, Properties properties) throws SQLException { + return null; + } + + @Override + public boolean acceptsURL(String s) throws SQLException { + return s.startsWith("jdbc:tick:"); + } + + @Override + public DriverPropertyInfo[] getPropertyInfo(String s, Properties properties) throws SQLException { + return new DriverPropertyInfo[0]; + } + + @Override + public int getMajorVersion() { + return 0; + } + + @Override + public int getMinorVersion() { + return 0; + } + + @Override + public boolean jdbcCompliant() { + return false; + } + + @Override + public Logger getParentLogger() throws SQLFeatureNotSupportedException { + return null; + } +} From ddfe0d47a2ad70fb45280c867137847d546c0747 Mon Sep 17 00:00:00 2001 From: Aurium Date: Tue, 23 Mar 2021 16:59:51 -0700 Subject: [PATCH 03/23] commit changes and build --- .idea/compiler.xml | 2 +- .idea/misc.xml | 1 + .../me/aurium/tick/CommonTickFactory.java | 11 +++-- .../java/me/aurium/tick/ImageManager.java | 9 +++- .../tick/container/ContainerManagerImpl.java | 9 ++-- .../aurium/tick/container/JDBCUrlBuilder.java | 40 +++++++++++++++++ .../container/AbstractJDBCContainer.java | 45 ------------------- .../container/container/JDBCContainer.java | 1 - .../container/container/MariaDBContainer.java | 24 +++++----- .../tick/container/terms/CreationTerms.java | 3 +- .../tick/container/terms/MariaDBTerms.java | 5 ++- .../tick/docker/DockerLocationImpl.java | 23 ++++++++++ .../docker/source/DockerClientProducer.java | 6 +-- .../tick/docker/source/DockerLocation.java | 9 ++++ .../tick/docker/source/JDBCUrlProvider.java | 8 ++++ .../source/machine/MachineSourceProvider.java | 6 +-- 16 files changed, 125 insertions(+), 77 deletions(-) create mode 100644 tick-api/src/main/java/me/aurium/tick/container/JDBCUrlBuilder.java delete mode 100644 tick-api/src/main/java/me/aurium/tick/container/container/AbstractJDBCContainer.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/DockerLocationImpl.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/source/DockerLocation.java create mode 100644 tick-api/src/main/java/me/aurium/tick/docker/source/JDBCUrlProvider.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 056f65e..e44c99b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -9,10 +9,10 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index d7270e9..3b2f416 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -9,6 +9,7 @@ diff --git a/pom.xml b/pom.xml index c0e9e98..88431c4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,20 +4,22 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - me.aurium - tick + + xyz.auriium + insect + 0.3.0 + + + tickbox-parent 1.0.0 - tick-api - tick-rapid - tick-integrated - tick-tests + tickbox-api + tickbox-integrated + tickbox-integrated-tests - 11 - ${compiler.version} ${compiler.version} @@ -25,7 +27,7 @@ 3.6.0 3.6.3 - 1.15.2 + 3.2.7 @@ -53,13 +55,23 @@ - + + + + xyz.auriium + tickbox-api + 1.0.0 + + + + + - repsy - ElytraForceRepo - https://repo.repsy.io/mvn/elytraforce/default + central-repo + https://repo.auriium.xyz/releases - + + + - \ No newline at end of file diff --git a/readme.md b/readme.md index 8938292..08e703c 100644 --- a/readme.md +++ b/readme.md @@ -1,16 +1,21 @@ -Maven plugin that handles automatic code generation with Flyway, JOOQ, and TestContainers +Dockerized Database Container creation system + maven plugins. -Currently only supports MariaDB, if you want something else, make a pull request or an issue +Meant for developers who really really don't want to use the mess that is TestContainers. +"TickBox" as in "Tick", a parasite that hooks onto something (docker) and "Box", as in a container. ``` + + + xyz.auriium + tickbox-api + 1.0.0 + + + - repsy - ElytraForceRepo - https://repo.repsy.io/mvn/elytraforce/default + central-repo + https://repo.auriium.xyz/releases - - - ``` \ No newline at end of file diff --git a/tick-api/src/main/java/me/aurium/tick/CommonProviders.java b/tick-api/src/main/java/me/aurium/tick/CommonProviders.java deleted file mode 100644 index bd7dac2..0000000 --- a/tick-api/src/main/java/me/aurium/tick/CommonProviders.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.aurium.tick; - -import me.aurium.tick.docker.source.DockerSourceProvider; - -public class CommonProviders { - - public static DockerSourceProvider find() { - return null; - } - -} diff --git a/tick-api/src/main/java/me/aurium/tick/TickFactory.java b/tick-api/src/main/java/me/aurium/tick/TickFactory.java deleted file mode 100644 index cf60a38..0000000 --- a/tick-api/src/main/java/me/aurium/tick/TickFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package me.aurium.tick; - -/** - * Represents something that can make Ticks - */ -public interface TickFactory { - - Tick produce(); - -} diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/CreationTerms.java b/tick-api/src/main/java/me/aurium/tick/container/terms/CreationTerms.java deleted file mode 100644 index 3f5295e..0000000 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/CreationTerms.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.aurium.tick.container.terms; - -import com.github.dockerjava.api.DockerClient; -import me.aurium.tick.container.ContainerOptions; -import me.aurium.tick.container.container.TickContainer; -import me.aurium.tick.container.terms.termParts.Arguments; -import me.aurium.tick.container.terms.termParts.ArgumentsObject; -import me.aurium.tick.docker.source.DockerLocation; - -public interface CreationTerms { - - Arguments creationArguments(); - - T creation(DockerLocation location, DockerClient client, ContainerOptions options, String dockerID); -} diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java b/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java deleted file mode 100644 index cb574c7..0000000 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/JDBCTerms.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.aurium.tick.container.terms; - -import me.aurium.tick.container.container.JDBCContainer; - -public interface JDBCTerms extends CreationTerms { - - - -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/network/Network.java b/tick-api/src/main/java/me/aurium/tick/docker/network/Network.java deleted file mode 100644 index fa90b39..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/network/Network.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.aurium.tick.docker.network; - -public interface Network extends AutoCloseable{ - - String getNetworkName(); - -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/ClientOptions.java b/tick-api/src/main/java/me/aurium/tick/docker/source/ClientOptions.java deleted file mode 100644 index f29c725..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/ClientOptions.java +++ /dev/null @@ -1,15 +0,0 @@ -package me.aurium.tick.docker.source; - -//TODO make this more useful -public class ClientOptions { - - private final boolean withTLS; - - public ClientOptions(boolean withTLS) { - this.withTLS = withTLS; - } - - public boolean isWithTLS() { - return withTLS; - } -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerClientProducer.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerClientProducer.java deleted file mode 100644 index 71baa12..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerClientProducer.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.aurium.tick.docker.source; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.core.DefaultDockerClientConfig; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.DockerClientImpl; -import com.github.dockerjava.core.SSLConfig; -import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; -import com.github.dockerjava.transport.DockerHttpClient; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class DockerClientProducer { - - private final DockerLocation source; - private final Logger logger = LoggerFactory.getLogger(getClass()); - - public DockerClientProducer(DockerLocation source) { - this.source = source; - } - - public DockerClient produce(ClientOptions options) { - - logger.info("(TICK) Url is: " + source.getUrl()); - - DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withDockerHost(source.getUrl()) - .withDockerTlsVerify(options.isWithTLS()) - .withCustomSslConfig((SSLConfig) source.getSSLConfig()) //fucking weird ass shit, - // theres 2 sslconfigs and for some reason this only takes the deprecated version. Please advise. - .build(); - - DockerHttpClient client = new ApacheDockerHttpClient.Builder() - .dockerHost(config.getDockerHost()) - .sslConfig(config.getSSLConfig()) - .build(); - - //initialize! - - return DockerClientImpl.getInstance(config,client); //now we have le docker - } - -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerHolder.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerHolder.java deleted file mode 100644 index 61cd52d..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerHolder.java +++ /dev/null @@ -1,4 +0,0 @@ -package me.aurium.tick.docker.source; - -public interface DockerHolder { -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSource.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSource.java deleted file mode 100644 index 55d525d..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSource.java +++ /dev/null @@ -1,12 +0,0 @@ -package me.aurium.tick.docker.source; - -import com.github.dockerjava.transport.SSLConfig; - -public interface DockerSource { - - String getSourceURL(); - String getSourceIP(); - - SSLConfig getSSLConfig(); - -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSourceProvider.java b/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSourceProvider.java deleted file mode 100644 index 7c2fbe0..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerSourceProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.aurium.tick.docker.source; - -import java.util.Optional; - -public interface DockerSourceProvider { - - Optional source(); - -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineDockerSource.java b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineDockerSource.java deleted file mode 100644 index a4b0c83..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineDockerSource.java +++ /dev/null @@ -1,62 +0,0 @@ -package me.aurium.tick.docker.source.machine; - -import com.github.dockerjava.core.LocalDirectorySSLConfig; -import com.github.dockerjava.transport.SSLConfig; -import me.aurium.tick.docker.source.DockerSource; -import org.zeroturnaround.exec.ProcessExecutor; -import org.zeroturnaround.exec.ProcessResult; - -import java.io.IOException; -import java.nio.file.Paths; -import java.util.concurrent.TimeoutException; - -public class MachineDockerSource implements DockerSource { - - private final String executableName; - private final String machineToUse; - - public MachineDockerSource(String executableName, String machineToUse) { - this.executableName = executableName; - this.machineToUse = machineToUse; - } - - - @Override - public String getSourceURL() { - - try { - ProcessResult result = new ProcessExecutor() - .command(executableName,"url", machineToUse) - .readOutput(true) - .exitValueNormal() - .execute(); - - return result.outputString().replaceAll("\n",""); - - } catch (InterruptedException | IOException | TimeoutException e) { - throw new ShellExecutionException(e); - } - - } - - @Override - public String getSourceIP() { - try { - ProcessResult result = new ProcessExecutor() - .command(executableName,"ip", machineToUse) - .readOutput(true) - .exitValueNormal() - .execute(); - - return result.outputString().replaceAll("\n",""); - - } catch (InterruptedException | IOException | TimeoutException e) { - throw new ShellExecutionException(e); - } - } - - public SSLConfig getSSLConfig() { - //copied this from testcontainers, a248 please advise. - return new LocalDirectorySSLConfig(Paths.get(System.getProperty("user.home") + "/.docker/machine/certs/").toString()); - } -} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineSourceProvider.java b/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineSourceProvider.java deleted file mode 100644 index df8366a..0000000 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/machine/MachineSourceProvider.java +++ /dev/null @@ -1,91 +0,0 @@ -package me.aurium.tick.docker.source.machine; - -import me.aurium.tick.docker.source.DockerSource; -import me.aurium.tick.docker.source.DockerSourceProvider; -import org.apache.commons.lang.SystemUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.zeroturnaround.exec.ProcessExecutor; -import org.zeroturnaround.exec.ProcessResult; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.TimeoutException; -import java.util.regex.Pattern; - -public class MachineSourceProvider implements DockerSourceProvider { - - private final String preferredDockerProvider; - - private static final String DEFAULT = "default"; - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - public MachineSourceProvider(String preferredDockerProvider) { - this.preferredDockerProvider = preferredDockerProvider; - } - - @Override - public Optional source() { - //TODO: make this better somehow. I don't know how, since at some point everything has to be stringly typed. - - logger.info("Attempting to produce MachineDockerSource using commandline!"); - - String executableName = "docker-machine"; - if (SystemUtils.IS_OS_WINDOWS) { - executableName="docker-machine.exe"; - } - - if (!executableExists(executableName)) return Optional.empty(); - - try { - ProcessResult result = new ProcessExecutor() - .command(executableName,"ls","-q", "--filter", "state=Running") - .readOutput(true) - .exitValueNormal() - .execute(); - - List executables = List.of(result.outputUTF8().split("\n")); - - if (executables.contains(preferredDockerProvider)) { - logger.info("Preferred docker instance found on DockerMachine! Using instance: " + preferredDockerProvider); - - return Optional.of(new me.aurium.tick.docker.source.machine.MachineDockerSource(executableName,preferredDockerProvider)); - } else if (executables.contains(DEFAULT)) { - logger.info("Preferred docker instance was not found, using default instance!"); - - return Optional.of(new me.aurium.tick.docker.source.machine.MachineDockerSource(executableName,DEFAULT)); - } else { - logger.error("No running docker was found!"); - - return Optional.empty(); - } - - } catch (IOException | InterruptedException | TimeoutException e) { - throw new ShellExecutionException(e); - } - - } - - private boolean executableExists(String executable) { - - Path directFile = Path.of(executable); - if (Files.isExecutable(directFile)) { - return true; - } - - for (String pathString : System.getenv("PATH").split(Pattern.quote(File.pathSeparator))) { - Path path = Paths.get(pathString); - if (Files.isExecutable(path.resolve(executable))) { - return true; - } - } - - return false; - } -} diff --git a/tick-api/tick-api.iml b/tick-api/tick-api.iml deleted file mode 100644 index 78b2cc5..0000000 --- a/tick-api/tick-api.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/tick-rapid/pom.xml b/tick-rapid/pom.xml deleted file mode 100644 index 94f0e53..0000000 --- a/tick-rapid/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - tick - me.aurium - 1.0.0 - - 4.0.0 - - tick-rapid - - maven-plugin - - 1.0.2 - - - ${compiler.version} - ${compiler.version} - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven.jarplugin.version} - - - org.apache.maven.plugins - maven-plugin-plugin - 3.6.0 - - tick-rapid - true - - - - - - - - org.testcontainers - testcontainers - 1.15.2 - - - org.testcontainers - mariadb - 1.11.4 - - - - \ No newline at end of file diff --git a/tick-rapid/src/main/java/me/aurium/tick/rapid/AbstractTickMojo.java b/tick-rapid/src/main/java/me/aurium/tick/rapid/AbstractTickMojo.java deleted file mode 100644 index 473b896..0000000 --- a/tick-rapid/src/main/java/me/aurium/tick/rapid/AbstractTickMojo.java +++ /dev/null @@ -1,39 +0,0 @@ -package me.aurium.tick.rapid; - -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugins.annotations.Parameter; -import org.apache.maven.project.MavenProject; - -public abstract class AbstractTickMojo extends AbstractMojo { - - protected final DBSingleton singleton = DBSingleton.get(); - - @Parameter(defaultValue = "MARIADB") - protected CommonInitializers initializer; - @Parameter(defaultValue = "${project}", readonly = true, required = true) - protected MavenProject project; - - @Parameter(defaultValue = "tick.jdbc_port") - protected String internalJDBCPort; - @Parameter(defaultValue = "tick.docker_port") - protected String externalDockerPort; - @Parameter(defaultValue = "tick.jdbc_url") - protected String internalJDBCUrl; - @Parameter(defaultValue = "tick.docker_ip") - protected String externalDockerAddress; - - @Parameter(defaultValue = "sandbox") - protected String sandboxName; - @Parameter(defaultValue = "sandboxUser") - protected String sandboxPassword; - @Parameter(defaultValue = "sandboxPassword") - protected String sandboxUser; - - protected void setParameter(String param, String toSet) { - assert param != null; - assert toSet != null; - - project.getProperties().put( param, toSet ); - } - -} diff --git a/tick-rapid/src/main/java/me/aurium/tick/rapid/CommonInitializers.java b/tick-rapid/src/main/java/me/aurium/tick/rapid/CommonInitializers.java deleted file mode 100644 index 653004e..0000000 --- a/tick-rapid/src/main/java/me/aurium/tick/rapid/CommonInitializers.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.aurium.tick.rapid; - -import org.testcontainers.containers.JdbcDatabaseContainer; -import org.testcontainers.containers.MariaDBContainer; - -public enum CommonInitializers implements JDBCInitializer { - MARIADB(new MariaDBContainer<>(),"org.jooq.meta.mariadb.MariaDBDatabase"); - - private final JdbcDatabaseContainer consumer; - private final String jooqClassName; - - CommonInitializers(JdbcDatabaseContainer consumer, String jooqClassName) { - this.consumer = consumer; - this.jooqClassName = jooqClassName; - } - - @Override - public JdbcDatabaseContainer initializeContainer(String username, String password, String databaseName) { - return consumer.withDatabaseName(databaseName).withUsername(username).withPassword(password); - } - - @Override - public String correspondingJooqClassName() { - return jooqClassName; - } -} diff --git a/tick-rapid/src/main/java/me/aurium/tick/rapid/DBSingleton.java b/tick-rapid/src/main/java/me/aurium/tick/rapid/DBSingleton.java deleted file mode 100644 index 1b82974..0000000 --- a/tick-rapid/src/main/java/me/aurium/tick/rapid/DBSingleton.java +++ /dev/null @@ -1,28 +0,0 @@ -package me.aurium.tick.rapid; - -import org.testcontainers.containers.JdbcDatabaseContainer; - -import java.util.Optional; - -public class DBSingleton { - - private static DBSingleton instance; - - private JdbcDatabaseContainer container; - - public void setContainer(JdbcDatabaseContainer container) { - this.container = container; - } - - public Optional> getContainer() { - return Optional.ofNullable(container); - } - - public static DBSingleton get() { - if (instance == null) { - return instance = new DBSingleton(); - } else { - return instance; - } - } -} diff --git a/tick-rapid/src/main/java/me/aurium/tick/rapid/InitializeGoalMojo.java b/tick-rapid/src/main/java/me/aurium/tick/rapid/InitializeGoalMojo.java deleted file mode 100644 index 501a6d3..0000000 --- a/tick-rapid/src/main/java/me/aurium/tick/rapid/InitializeGoalMojo.java +++ /dev/null @@ -1,42 +0,0 @@ -package me.aurium.tick.rapid; - -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; -import org.testcontainers.containers.JdbcDatabaseContainer; - -@Mojo(name = "initialize", defaultPhase = LifecyclePhase.INITIALIZE) -public class InitializeGoalMojo extends AbstractTickMojo{ - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - JdbcDatabaseContainer container = initializer.initializeContainer(sandboxUser,sandboxPassword,sandboxName); - - getLog().info("(TICK) Starting container!"); - - container.start(); - - getLog().info("(TICK) Setting external access port: " + container.getFirstMappedPort()); - - setParameter(externalDockerPort,container.getFirstMappedPort().toString()); - - getLog().info("(TICK) Setting internal access ports: " + container.getExposedPorts()); - - //TODO - - getLog().info("(TICK) Setting external docker ip: " + container.getContainerIpAddress()); - - setParameter(externalDockerAddress,container.getContainerIpAddress()); - - getLog().info("(TICK) Host: " + container.getHost()); - - getLog().info("(TICK) Setting internal JDBC Url: " + container.getJdbcUrl()); - - setParameter(internalJDBCUrl,container.getJdbcUrl()); - - getLog().info("(TICK) Setting access"); - - singleton.setContainer(container); - } -} diff --git a/tick-rapid/src/main/java/me/aurium/tick/rapid/JDBCInitializer.java b/tick-rapid/src/main/java/me/aurium/tick/rapid/JDBCInitializer.java deleted file mode 100644 index 2781aab..0000000 --- a/tick-rapid/src/main/java/me/aurium/tick/rapid/JDBCInitializer.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.aurium.tick.rapid; - -import org.testcontainers.containers.JdbcDatabaseContainer; - -public interface JDBCInitializer { - - JdbcDatabaseContainer initializeContainer(String username, String password, String databaseName); - - String correspondingJooqClassName(); - -} diff --git a/tick-rapid/src/main/java/me/aurium/tick/rapid/TeardownGoalMojo.java b/tick-rapid/src/main/java/me/aurium/tick/rapid/TeardownGoalMojo.java deleted file mode 100644 index b549f2e..0000000 --- a/tick-rapid/src/main/java/me/aurium/tick/rapid/TeardownGoalMojo.java +++ /dev/null @@ -1,33 +0,0 @@ -package me.aurium.tick.rapid; - -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; -import org.testcontainers.containers.JdbcDatabaseContainer; -import org.testcontainers.utility.ResourceReaper; - -import java.util.Optional; - -@Mojo(name = "teardown", defaultPhase = LifecyclePhase.GENERATE_SOURCES) -public class TeardownGoalMojo extends AbstractTickMojo{ - - @Override - public void execute() throws MojoExecutionException, MojoFailureException { - - getLog().info("(TICK) Attempting to retrieve container!"); - - Optional> optional = singleton.getContainer(); - - if (optional.isPresent()) { - getLog().info("(TICK) Retrieved optional, attempting teardown!"); - - ResourceReaper.instance().stopAndRemoveContainer(optional.get().getContainerId()); - - getLog().info("(TICK) Teardown successful!"); - } else { - throw new MojoFailureException("No container found to teardown!"); - } - - } -} diff --git a/tick-rapid/tick-rapid.iml b/tick-rapid/tick-rapid.iml deleted file mode 100644 index 78b2cc5..0000000 --- a/tick-rapid/tick-rapid.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/tick-tests/pom.xml b/tick-tests/pom.xml deleted file mode 100644 index a28d2a6..0000000 --- a/tick-tests/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - tick - me.aurium - 1.0.0 - - 4.0.0 - - tick-tests - - - ${compiler.version} - ${compiler.version} - - - - - - - - org.mariadb.jdbc - mariadb-java-client - 2.7.2 - - - - - MARIA_DB - - shut up - - - - me.aurium - tick-integrated - 1.0.0 - - - - initialize - initialize - - generate - - - - - - - - - - aurium - https://repo.repsy.io/mvn/elytraforce/default - - - \ No newline at end of file diff --git a/tick.iml b/tick.iml deleted file mode 100644 index 78b2cc5..0000000 --- a/tick.iml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/tick-api/pom.xml b/tickbox-api/pom.xml similarity index 91% rename from tick-api/pom.xml rename to tickbox-api/pom.xml index f6938f9..8bb2f6a 100644 --- a/tick-api/pom.xml +++ b/tickbox-api/pom.xml @@ -3,15 +3,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - tick - me.aurium + tickbox-parent + xyz.auriium 1.0.0 4.0.0 - tick-api - - 1.0.0 + tickbox-api ${compiler.version} diff --git a/tick-api/src/main/java/me/aurium/tick/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java similarity index 77% rename from tick-api/src/main/java/me/aurium/tick/CommonTick.java rename to tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java index 786d384..340ee21 100644 --- a/tick-api/src/main/java/me/aurium/tick/CommonTick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java @@ -1,6 +1,6 @@ -package me.aurium.tick; +package xyz.auriium.tick; -import me.aurium.tick.container.ContainerManager; +import xyz.auriium.tick.container.ContainerManager; public class CommonTick implements Tick{ diff --git a/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java similarity index 64% rename from tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java rename to tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java index 8876e87..e922ecd 100644 --- a/tick-api/src/main/java/me/aurium/tick/CommonTickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java @@ -1,15 +1,15 @@ -package me.aurium.tick; +package xyz.auriium.tick; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Version; -import me.aurium.tick.container.ContainerManager; -import me.aurium.tick.container.ContainerManagerImpl; -import me.aurium.tick.container.ContainerOptions; -import me.aurium.tick.docker.DockerLocationImpl; -import me.aurium.tick.docker.image.PullStrategyProvider; -import me.aurium.tick.docker.source.*; +import xyz.auriium.tick.container.ContainerManager; +import xyz.auriium.tick.container.ContainerManagerImpl; +import xyz.auriium.tick.container.ContainerOptions; +import xyz.auriium.tick.docker.DockerLocationImpl; +import xyz.auriium.tick.docker.image.PullStrategyProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import xyz.auriium.tick.docker.source.*; public class CommonTickFactory implements TickFactory{ @@ -29,15 +29,11 @@ public CommonTickFactory(DockerSourceProvider provider, PullStrategyProvider } @Override - public Tick produce() { + public Tick produce() throws SourceProvideException { logger.info("(TICK) Attempting to produce a Tick! Producing DockerClient now..."); - DockerSource source = provider.source().orElseThrow(InvalidProviderException::new); - - //ensure accurcy - - DockerLocation location = new DockerLocationImpl(source.getSourceIP(), source.getSourceURL(), source.getSSLConfig()); //cache - DockerClient client = new DockerClientProducer(location).produce(clientOptions); + DockerSource source = provider.source(clientOptions); + DockerClient client = source.getClient(); Version dockerVersion = client.versionCmd().exec(); @@ -48,7 +44,7 @@ public Tick produce() { logger.info("(TICK) Setting up a ContainerManager..."); - ContainerManager manager = new ContainerManagerImpl(location, client, strategy.getStrategy(client), containerOptions); + ContainerManager manager = new ContainerManagerImpl(source, client, strategy.getStrategy(client), containerOptions); logger.info("(TICK) ContainerManager set up correctly! Tick is now ready for use!"); diff --git a/tick-api/src/main/java/me/aurium/tick/ImageManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/ImageManager.java similarity index 93% rename from tick-api/src/main/java/me/aurium/tick/ImageManager.java rename to tickbox-api/src/main/java/xyz/auriium/tick/ImageManager.java index a328919..98d2130 100644 --- a/tick-api/src/main/java/me/aurium/tick/ImageManager.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/ImageManager.java @@ -1,4 +1,4 @@ -package me.aurium.tick; +package xyz.auriium.tick; import java.util.concurrent.CompletableFuture; diff --git a/tick-api/src/main/java/me/aurium/tick/InvalidProviderException.java b/tickbox-api/src/main/java/xyz/auriium/tick/InvalidProviderException.java similarity index 89% rename from tick-api/src/main/java/me/aurium/tick/InvalidProviderException.java rename to tickbox-api/src/main/java/xyz/auriium/tick/InvalidProviderException.java index ee7a766..1d8ff13 100644 --- a/tick-api/src/main/java/me/aurium/tick/InvalidProviderException.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/InvalidProviderException.java @@ -1,4 +1,4 @@ -package me.aurium.tick; +package xyz.auriium.tick; public class InvalidProviderException extends RuntimeException { diff --git a/tick-api/src/main/java/me/aurium/tick/Tick.java b/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java similarity index 64% rename from tick-api/src/main/java/me/aurium/tick/Tick.java rename to tickbox-api/src/main/java/xyz/auriium/tick/Tick.java index b6d1fa3..9bf2bdd 100644 --- a/tick-api/src/main/java/me/aurium/tick/Tick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java @@ -1,6 +1,6 @@ -package me.aurium.tick; +package xyz.auriium.tick; -import me.aurium.tick.container.ContainerManager; +import xyz.auriium.tick.container.ContainerManager; /** * Represents a prestarted Tick that can provide multiple containers diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java new file mode 100644 index 0000000..82eb320 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java @@ -0,0 +1,12 @@ +package xyz.auriium.tick; + +import xyz.auriium.tick.docker.source.SourceProvideException; + +/** + * Represents something that can make Ticks + */ +public interface TickFactory { + + Tick produce() throws SourceProvideException; + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManager.java similarity index 52% rename from tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManager.java index af8f80e..ed3b265 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/ContainerManager.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManager.java @@ -1,10 +1,7 @@ -package me.aurium.tick.container; +package xyz.auriium.tick.container; -import com.github.dockerjava.api.DockerClient; -import me.aurium.tick.container.container.TickContainer; -import me.aurium.tick.container.terms.CreationTerms; - -import java.util.concurrent.CompletableFuture; +import xyz.auriium.tick.container.container.TickContainer; +import xyz.auriium.tick.container.terms.CreationTerms; public interface ContainerManager { diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManagerImpl.java similarity index 75% rename from tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManagerImpl.java index 9df7294..788138c 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/ContainerManagerImpl.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManagerImpl.java @@ -1,18 +1,15 @@ -package me.aurium.tick.container; +package xyz.auriium.tick.container; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.command.PullImageResultCallback; import com.github.dockerjava.api.model.HostConfig; -import me.aurium.tick.container.container.TickContainer; -import me.aurium.tick.container.terms.CreationTerms; -import me.aurium.tick.container.terms.termParts.Arguments; -import me.aurium.tick.docker.image.PullStrategy; -import me.aurium.tick.docker.source.DockerLocation; +import xyz.auriium.tick.container.container.TickContainer; +import xyz.auriium.tick.container.terms.CreationTerms; +import xyz.auriium.tick.container.terms.termParts.Arguments; +import xyz.auriium.tick.docker.image.PullStrategy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - -import java.util.concurrent.TimeUnit; +import xyz.auriium.tick.docker.source.DockerSource; public class ContainerManagerImpl implements ContainerManager { @@ -20,13 +17,13 @@ public class ContainerManagerImpl implements ContainerManager { private final Logger logger = LoggerFactory.getLogger(getClass()); - private final DockerLocation location; + private final DockerSource location; private final DockerClient client; private final PullStrategy strategy; private final ContainerOptions options; - public ContainerManagerImpl(DockerLocation location, DockerClient client, PullStrategy strategy, ContainerOptions options) { + public ContainerManagerImpl(DockerSource location, DockerClient client, PullStrategy strategy, ContainerOptions options) { this.location = location; this.client = client; this.strategy = strategy; diff --git a/tick-api/src/main/java/me/aurium/tick/container/ContainerOptions.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java similarity index 89% rename from tick-api/src/main/java/me/aurium/tick/container/ContainerOptions.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java index b234363..9962790 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/ContainerOptions.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container; +package xyz.auriium.tick.container; //todo make this more useful public class ContainerOptions { diff --git a/tick-api/src/main/java/me/aurium/tick/container/JDBCUrlBuilder.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/JDBCUrlBuilder.java similarity index 95% rename from tick-api/src/main/java/me/aurium/tick/container/JDBCUrlBuilder.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/JDBCUrlBuilder.java index cdef4ef..e6f148a 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/JDBCUrlBuilder.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/JDBCUrlBuilder.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container; +package xyz.auriium.tick.container; import java.util.Objects; diff --git a/tick-api/src/main/java/me/aurium/tick/container/container/JDBCContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/JDBCContainer.java similarity index 73% rename from tick-api/src/main/java/me/aurium/tick/container/container/JDBCContainer.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/container/JDBCContainer.java index 67ac8a6..237563b 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/container/JDBCContainer.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/JDBCContainer.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container.container; +package xyz.auriium.tick.container.container; public interface JDBCContainer extends TickContainer { diff --git a/tick-api/src/main/java/me/aurium/tick/container/container/MariaDBContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java similarity index 69% rename from tick-api/src/main/java/me/aurium/tick/container/container/MariaDBContainer.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java index a1ef50a..edf1acc 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/container/MariaDBContainer.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java @@ -1,21 +1,21 @@ -package me.aurium.tick.container.container; +package xyz.auriium.tick.container.container; import com.github.dockerjava.api.DockerClient; -import me.aurium.tick.container.ContainerOptions; -import me.aurium.tick.container.JDBCUrlBuilder; -import me.aurium.tick.container.terms.mariadb.JDBCConfig; -import me.aurium.tick.docker.source.DockerLocation; +import xyz.auriium.tick.container.ContainerOptions; +import xyz.auriium.tick.container.JDBCUrlBuilder; +import xyz.auriium.tick.container.terms.mariadb.JDBCConfig; +import xyz.auriium.tick.docker.source.DockerSource; public class MariaDBContainer implements JDBCContainer { - private final DockerLocation location; + private final DockerSource location; private final DockerClient client; private final ContainerOptions options; private final String containerID; private final JDBCConfig config; - public MariaDBContainer(DockerLocation location, DockerClient client, ContainerOptions options, String containerID, JDBCConfig config) { + public MariaDBContainer(DockerSource location, DockerClient client, ContainerOptions options, String containerID, JDBCConfig config) { this.location = location; this.client = client; this.options = options; @@ -28,7 +28,7 @@ public String getJDBCUrl() { return new JDBCUrlBuilder() .withDBName(config.getDatabaseName()) .withDriver("mariadb") - .withIP(location.getIp()) + .withIP(location.getSourceHost()) .withPort(config.getPortBinding()).build(); } diff --git a/tick-api/src/main/java/me/aurium/tick/container/container/TickContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/TickContainer.java similarity index 86% rename from tick-api/src/main/java/me/aurium/tick/container/container/TickContainer.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/container/TickContainer.java index b2db457..db8e518 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/container/TickContainer.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/TickContainer.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container.container; +package xyz.auriium.tick.container.container; /** * Represents an already created Container that can start and stop itself diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/CreationTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/CreationTerms.java new file mode 100644 index 0000000..1bf6bbd --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/CreationTerms.java @@ -0,0 +1,14 @@ +package xyz.auriium.tick.container.terms; + +import com.github.dockerjava.api.DockerClient; +import xyz.auriium.tick.container.ContainerOptions; +import xyz.auriium.tick.container.container.TickContainer; +import xyz.auriium.tick.container.terms.termParts.Arguments; +import xyz.auriium.tick.docker.source.DockerSource; + +public interface CreationTerms { + + Arguments creationArguments(); + + T creation(DockerSource location, DockerClient client, ContainerOptions options, String dockerID); +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/JDBCTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/JDBCTerms.java new file mode 100644 index 0000000..d57019b --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/JDBCTerms.java @@ -0,0 +1,9 @@ +package xyz.auriium.tick.container.terms; + +import xyz.auriium.tick.container.container.JDBCContainer; + +public interface JDBCTerms extends CreationTerms { + + + +} diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/mariadb/JDBCConfig.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/JDBCConfig.java similarity index 95% rename from tick-api/src/main/java/me/aurium/tick/container/terms/mariadb/JDBCConfig.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/JDBCConfig.java index 775186c..9ab5278 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/mariadb/JDBCConfig.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/JDBCConfig.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container.terms.mariadb; +package xyz.auriium.tick.container.terms.mariadb; public class JDBCConfig { diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/mariadb/MariaDBTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/MariaDBTerms.java similarity index 66% rename from tick-api/src/main/java/me/aurium/tick/container/terms/mariadb/MariaDBTerms.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/MariaDBTerms.java index 22907dc..d4bd64e 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/mariadb/MariaDBTerms.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/MariaDBTerms.java @@ -1,16 +1,14 @@ -package me.aurium.tick.container.terms.mariadb; +package xyz.auriium.tick.container.terms.mariadb; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.PortBinding; -import me.aurium.tick.container.ContainerOptions; -import me.aurium.tick.container.container.JDBCContainer; -import me.aurium.tick.container.container.MariaDBContainer; -import me.aurium.tick.container.terms.JDBCTerms; -import me.aurium.tick.container.terms.termParts.Arguments; -import me.aurium.tick.container.terms.termParts.ArgumentsObject; -import me.aurium.tick.docker.source.DockerLocation; +import xyz.auriium.tick.container.ContainerOptions; +import xyz.auriium.tick.container.container.JDBCContainer; +import xyz.auriium.tick.container.container.MariaDBContainer; +import xyz.auriium.tick.container.terms.JDBCTerms; +import xyz.auriium.tick.container.terms.termParts.Arguments; +import xyz.auriium.tick.container.terms.termParts.ArgumentsObject; +import xyz.auriium.tick.docker.source.DockerSource; /** * mariadb @@ -48,7 +46,7 @@ public Arguments creationArguments() { } @Override - public JDBCContainer creation(DockerLocation location, DockerClient client, ContainerOptions options, String id) { + public JDBCContainer creation(DockerSource location, DockerClient client, ContainerOptions options, String id) { return new MariaDBContainer(location, client, options, id, config); } diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/termParts/Arguments.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/Arguments.java similarity index 80% rename from tick-api/src/main/java/me/aurium/tick/container/terms/termParts/Arguments.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/Arguments.java index 5c13d94..e664ae7 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/termParts/Arguments.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/Arguments.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container.terms.termParts; +package xyz.auriium.tick.container.terms.termParts; import com.github.dockerjava.api.model.PortBinding; diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/termParts/ArgumentsObject.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ArgumentsObject.java similarity index 97% rename from tick-api/src/main/java/me/aurium/tick/container/terms/termParts/ArgumentsObject.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ArgumentsObject.java index 501c8d7..7e6df72 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/termParts/ArgumentsObject.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ArgumentsObject.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container.terms.termParts; +package xyz.auriium.tick.container.terms.termParts; import com.github.dockerjava.api.model.PortBinding; diff --git a/tick-api/src/main/java/me/aurium/tick/container/terms/termParts/ImageToken.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ImageToken.java similarity index 54% rename from tick-api/src/main/java/me/aurium/tick/container/terms/termParts/ImageToken.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ImageToken.java index aa88100..cc5de4b 100644 --- a/tick-api/src/main/java/me/aurium/tick/container/terms/termParts/ImageToken.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ImageToken.java @@ -1,4 +1,4 @@ -package me.aurium.tick.container.terms.termParts; +package xyz.auriium.tick.container.terms.termParts; public interface ImageToken { diff --git a/tick-api/src/main/java/me/aurium/tick/docker/DockerLocationImpl.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/DockerLocationImpl.java similarity index 86% rename from tick-api/src/main/java/me/aurium/tick/docker/DockerLocationImpl.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/DockerLocationImpl.java index 8094d77..60b14c8 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/DockerLocationImpl.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/DockerLocationImpl.java @@ -1,7 +1,7 @@ -package me.aurium.tick.docker; +package xyz.auriium.tick.docker; import com.github.dockerjava.transport.SSLConfig; -import me.aurium.tick.docker.source.DockerLocation; +import xyz.auriium.tick.docker.source.DockerLocation; public class DockerLocationImpl implements DockerLocation { diff --git a/tick-api/src/main/java/me/aurium/tick/docker/adapter/FutureAdapter.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/FutureAdapter.java similarity index 75% rename from tick-api/src/main/java/me/aurium/tick/docker/adapter/FutureAdapter.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/FutureAdapter.java index 2c6de5b..553fbe9 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/adapter/FutureAdapter.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/FutureAdapter.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.adapter; +package xyz.auriium.tick.docker.adapter; import java.util.concurrent.CompletableFuture; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/adapter/FutureCallbackAdapter.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/FutureCallbackAdapter.java similarity index 97% rename from tick-api/src/main/java/me/aurium/tick/docker/adapter/FutureCallbackAdapter.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/FutureCallbackAdapter.java index 19bf62b..770acf1 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/adapter/FutureCallbackAdapter.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/FutureCallbackAdapter.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.adapter; +package xyz.auriium.tick.docker.adapter; import com.github.dockerjava.api.command.PullImageResultCallback; import com.github.dockerjava.api.model.PullResponseItem; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/adapter/OrThrowable.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/OrThrowable.java similarity index 96% rename from tick-api/src/main/java/me/aurium/tick/docker/adapter/OrThrowable.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/OrThrowable.java index 44b176b..e235b8e 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/adapter/OrThrowable.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/adapter/OrThrowable.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.adapter; +package xyz.auriium.tick.docker.adapter; import java.util.concurrent.CompletableFuture; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/image/CachedPullStrategy.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategy.java similarity index 91% rename from tick-api/src/main/java/me/aurium/tick/docker/image/CachedPullStrategy.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategy.java index d309630..10b0dec 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/image/CachedPullStrategy.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategy.java @@ -1,7 +1,6 @@ -package me.aurium.tick.docker.image; +package xyz.auriium.tick.docker.image; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.PullImageResultCallback; import com.github.dockerjava.api.exception.NotFoundException; import java.util.concurrent.TimeUnit; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/image/CachedPullStrategyProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategyProvider.java similarity index 87% rename from tick-api/src/main/java/me/aurium/tick/docker/image/CachedPullStrategyProvider.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategyProvider.java index 2e13ab8..500e9b2 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/image/CachedPullStrategyProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategyProvider.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.image; +package xyz.auriium.tick.docker.image; import com.github.dockerjava.api.DockerClient; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/image/LoggingPullResultCallback.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java similarity index 99% rename from tick-api/src/main/java/me/aurium/tick/docker/image/LoggingPullResultCallback.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java index b150f05..af28fe4 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/image/LoggingPullResultCallback.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.image; +package xyz.auriium.tick.docker.image; import com.github.dockerjava.api.command.PullImageResultCallback; import com.github.dockerjava.api.model.PullResponseItem; diff --git a/tick-api/src/main/java/me/aurium/tick/docker/image/PullStrategy.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategy.java similarity index 88% rename from tick-api/src/main/java/me/aurium/tick/docker/image/PullStrategy.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategy.java index f348eb3..c26b79e 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/image/PullStrategy.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategy.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.image; +package xyz.auriium.tick.docker.image; public interface PullStrategy { diff --git a/tick-api/src/main/java/me/aurium/tick/docker/image/PullStrategyProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java similarity index 80% rename from tick-api/src/main/java/me/aurium/tick/docker/image/PullStrategyProvider.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java index cca02fa..2cf0422 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/image/PullStrategyProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.image; +package xyz.auriium.tick.docker.image; import com.github.dockerjava.api.DockerClient; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ApplicableResult.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ApplicableResult.java new file mode 100644 index 0000000..0ab7106 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ApplicableResult.java @@ -0,0 +1,34 @@ +package xyz.auriium.tick.docker.source; + +import java.util.Optional; + +public class ApplicableResult { + + public boolean isApplicable() { + return result; + } + + public String getReason() { + if (result) { + throw new IllegalStateException("The result is successful, there will not be a reason!"); + } else { + return reason; + } + } + + private final boolean result; + private final String reason; + + ApplicableResult(boolean result, String reason) { + this.result = result; + this.reason = reason; + } + + public static ApplicableResult success() { + return new ApplicableResult(true,null); + } + + public static ApplicableResult fail(String reason) { + return new ApplicableResult(false,reason); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ClientOptions.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ClientOptions.java new file mode 100644 index 0000000..db03676 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ClientOptions.java @@ -0,0 +1,21 @@ +package xyz.auriium.tick.docker.source; + +//TODO make this more useful +public class ClientOptions { + + private final boolean withTLS; + private final String preferredDockerMachineName; + + public ClientOptions(boolean withTLS, String preferredDockerMachineName) { + this.withTLS = withTLS; + this.preferredDockerMachineName = preferredDockerMachineName; + } + + public boolean isWithTLS() { + return withTLS; + } + + public String getPreferredDockerMachineName() { + return preferredDockerMachineName; + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerHolder.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerHolder.java new file mode 100644 index 0000000..46e5c6d --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerHolder.java @@ -0,0 +1,4 @@ +package xyz.auriium.tick.docker.source; + +public interface DockerHolder { +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerLocation.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerLocation.java similarity index 80% rename from tick-api/src/main/java/me/aurium/tick/docker/source/DockerLocation.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerLocation.java index 2783e79..c38df4a 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/DockerLocation.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerLocation.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.source; +package xyz.auriium.tick.docker.source; import com.github.dockerjava.transport.SSLConfig; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSource.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSource.java new file mode 100644 index 0000000..d86346a --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSource.java @@ -0,0 +1,36 @@ +package xyz.auriium.tick.docker.source; + +import com.github.dockerjava.api.DockerClient; + +import java.net.URI; + +/** + * Wrapper interface for DockerClient + */ +public interface DockerSource { + + /** + * Gets the full connection URI (Think https://127.0.0.1/) + * + * This is NOT a mysql/postgresql/whatever the fuck you want/jdbc connection uri. Those are created elsewhere. + * + * @return the URI of this source + */ + URI getSourceURI(); + + /** + * Get just the host address of this source (Think 127.0.0.1) + * + * Typically what gets plugged into + * + * @return the host address of this source. + */ + String getSourceHost(); + + /** + * Get the client. + * @return cluwne + */ + DockerClient getClient(); + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java new file mode 100644 index 0000000..04c2f66 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java @@ -0,0 +1,21 @@ +package xyz.auriium.tick.docker.source; + +public interface DockerSourceProvider { + + String name(); + Integer priority(); + + /** + * Attempts to generate a DockerSource. Typically calls {@link #isApplicable()} internally. + * @return a docker source. + * @throws SourceProvideException if an error occurs attempting to generate the dockersource outlined. + */ + DockerSource source(ClientOptions options) throws SourceProvideException; + + /** + * Checks whether or not the DockerSourceProvider can effectively provide a DockerSource + * @return Result containing whether or not a Source can be provided and a reason for it. + */ + ApplicableResult isApplicable(); + +} diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/JDBCUrlProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/JDBCUrlProvider.java similarity index 65% rename from tick-api/src/main/java/me/aurium/tick/docker/source/JDBCUrlProvider.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/source/JDBCUrlProvider.java index b125d77..c377bc0 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/JDBCUrlProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/JDBCUrlProvider.java @@ -1,4 +1,4 @@ -package me.aurium.tick.docker.source; +package xyz.auriium.tick.docker.source; //TODO public interface JDBCUrlProvider { diff --git a/tick-api/src/main/java/me/aurium/tick/docker/source/machine/ShellExecutionException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ShellExecutionException.java similarity index 50% rename from tick-api/src/main/java/me/aurium/tick/docker/source/machine/ShellExecutionException.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ShellExecutionException.java index 20d0c9a..1eb7e51 100644 --- a/tick-api/src/main/java/me/aurium/tick/docker/source/machine/ShellExecutionException.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ShellExecutionException.java @@ -1,6 +1,8 @@ -package me.aurium.tick.docker.source.machine; +package xyz.auriium.tick.docker.source; -public class ShellExecutionException extends RuntimeException{ +import xyz.auriium.tick.docker.source.SourceProvideException; + +public class ShellExecutionException extends SourceProvideException { public ShellExecutionException(Throwable throwable) { super(throwable); diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/SourceProvideException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/SourceProvideException.java new file mode 100644 index 0000000..b0191e8 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/SourceProvideException.java @@ -0,0 +1,13 @@ +package xyz.auriium.tick.docker.source; + +public class SourceProvideException extends Exception { + + public SourceProvideException(String reason) { + super(reason); + } + + public SourceProvideException(Throwable throwable) { + super(throwable); + } + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java new file mode 100644 index 0000000..acec670 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java @@ -0,0 +1,47 @@ +package xyz.auriium.tick.docker.source.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.docker.source.ApplicableResult; +import xyz.auriium.tick.docker.source.DockerSourceProvider; + +import java.util.Comparator; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + +public class CommonProviders { + + CommonProviders() {} + + public static final CommonProviders INSTANCE = new CommonProviders(); //Limit instances, use ugly static pattern to allow outside + private static final Logger logger = LoggerFactory.getLogger("TickBox - Docker Providers"); + //classes to insert their own providers + private final Set providers = new HashSet<>(); + + public CommonProviders install(DockerSourceProvider provider) { + providers.add(provider); + + return this; + } + + public DockerSourceProvider find() { + + for (DockerSourceProvider provider : providers.stream() + .sorted(Comparator.comparing(DockerSourceProvider::priority)) + .collect(Collectors.toList())) { + + ApplicableResult result = provider.isApplicable(); + + if (result.isApplicable()) { + return provider; + } else { + logger.warn(String.format("Attempt to produce valid DockerClient failure for provider [%s], Reason: [%s]", provider.name(), result.getReason())); + } + } + + + throw new IllegalStateException("No providers exist in the CommonProviders library that will work on your system!"); + } + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/DockerSourceImpl.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/DockerSourceImpl.java new file mode 100644 index 0000000..3e7ac56 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/DockerSourceImpl.java @@ -0,0 +1,34 @@ +package xyz.auriium.tick.docker.source.impl; + +import com.github.dockerjava.api.DockerClient; +import xyz.auriium.tick.docker.source.DockerSource; + +import java.net.URI; + +public class DockerSourceImpl implements DockerSource { + + private final URI sourceURI; + private final DockerClient client; + + public DockerSourceImpl(URI sourceURI, DockerClient client) { + this.sourceURI = sourceURI; + this.client = client; + } + + @Override + public URI getSourceURI() { + return sourceURI; + } + + @Override + public String getSourceHost() { + return sourceURI.getHost(); + } + + @Override + public DockerClient getClient() { + return client; + } + + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java new file mode 100644 index 0000000..078c652 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java @@ -0,0 +1,149 @@ +package xyz.auriium.tick.docker.source.impl; + +import org.apache.commons.lang.SystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.zeroturnaround.exec.ProcessExecutor; +import org.zeroturnaround.exec.ProcessResult; +import xyz.auriium.tick.docker.source.*; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeoutException; +import java.util.regex.Pattern; + +public class MachineSourceProvider extends SimpleSourceProvider { + + private static final Logger logger = LoggerFactory.getLogger(MachineSourceProvider.class); + private static final String DEFAULT = "default"; + + @Override + public String name() { + return "MachineSourceProvider"; + } + + @Override + public Integer priority() { + return 100; + } + + @Override + public ApplicableResult isApplicable() { + String executableName = "docker-machine"; + if (SystemUtils.IS_OS_WINDOWS) { + executableName="docker-machine.exe"; + } + + if (!executableExists(executableName)) return ApplicableResult.fail("DockerMachine is not present on this system!"); + + try { + ProcessResult result = new ProcessExecutor() + .command(executableName,"ls","-q", "--filter", "state=Running") + .readOutput(true) + .exitValueNormal() + .execute(); + + Optional toUse = getToUse("ignored", List.of(result.outputUTF8().split("\n"))); + + if (toUse.isEmpty()) return ApplicableResult.fail("No usable DockerMachine system is active. Please create one and try again."); + + String url = new ProcessExecutor() + .command(executableName,"url", toUse.get()) + .readOutput(true) + .exitValueNormal() + .execute().outputString().replaceAll("\n",""); + + String ip = new ProcessExecutor() + .command(executableName,"ip", toUse.get()) + .readOutput(true) + .exitValueNormal() + .execute().outputString().replaceAll("\n",""); + + return ApplicableResult.success(); + + + } catch (IOException | InterruptedException | TimeoutException e) { + return ApplicableResult.fail(e.getMessage()); + } + } + + @Override + public Pair makeURI(ClientOptions options) throws SourceProvideException { + + String preferredProvider = options.getPreferredDockerMachineName(); + + logger.info("Attempting to produce DockerSource using docker machine commandline!"); + + String executableName = "docker-machine"; + if (SystemUtils.IS_OS_WINDOWS) { + executableName="docker-machine.exe"; + } + + if (!executableExists(executableName)) throw new SourceProvideException("DockerMachine executable not found on this system!"); + + try { + ProcessResult result = new ProcessExecutor() + .command(executableName,"ls","-q", "--filter", "state=Running") + .readOutput(true) + .exitValueNormal() + .execute(); + + String toUse = getToUse(preferredProvider, List.of(result.outputUTF8().split("\n"))).orElseThrow(() -> new SourceProvideException("No default machine present on this system!")); + + logger.info(String.format("Using docker-machine with system %s (selected machine %s). If these do not match machine %s was likely ineligible for use.", toUse, preferredProvider, preferredProvider)); + + /*URI url = new ProcessExecutor() + .command(executableName,"url", toUse) + .readOutput(true) + .exitValueNormal() + .execute().outputString().replaceAll("\n","");*/ + + String ip = new ProcessExecutor() + .command(executableName,"ip", toUse) + .readOutput(true) + .exitValueNormal() + .execute().outputString().replaceAll("\n",""); + + return new Pair(ip,null); + + + } catch (IOException | InterruptedException | TimeoutException e) { + throw new ShellExecutionException(e); + } + + } + + private Optional getToUse(String preferredProvider, Collection strings) { + if (strings.contains(preferredProvider)) { + return Optional.of(preferredProvider); + } else if (strings.contains(DEFAULT)) { + return Optional.of(DEFAULT); + } else { + return Optional.empty(); + } + } + + private boolean executableExists(String executable) { + + Path directFile = Path.of(executable); + if (Files.isExecutable(directFile)) { + return true; + } + + for (String pathString : System.getenv("PATH").split(Pattern.quote(File.pathSeparator))) { + Path path = Paths.get(pathString); + if (Files.isExecutable(path.resolve(executable))) { + return true; + } + } + + return false; + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java new file mode 100644 index 0000000..30a4a21 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java @@ -0,0 +1,41 @@ +package xyz.auriium.tick.docker.source.impl; + +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientConfig; +import com.github.dockerjava.core.DockerClientImpl; +import com.github.dockerjava.core.LocalDirectorySSLConfig; +import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; +import com.github.dockerjava.transport.DockerHttpClient; +import xyz.auriium.tick.docker.source.ClientOptions; +import xyz.auriium.tick.docker.source.DockerSource; +import xyz.auriium.tick.docker.source.DockerSourceProvider; +import xyz.auriium.tick.docker.source.SourceProvideException; + +import java.net.URI; +import java.nio.file.Paths; + +public abstract class SimpleSourceProvider implements DockerSourceProvider { + + @Override + public DockerSource source(ClientOptions options) throws SourceProvideException { + + URI pair = makeURI(options); + + DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() + .withDockerHost(pair.getHost()) + .withDockerTlsVerify(options.isWithTLS()) + .withCustomSslConfig(new LocalDirectorySSLConfig(Paths.get(System.getProperty("user.home") + "/.docker/machine/certs/").toString())) //fucking weird ass shit, + // theres 2 sslconfigs and for some reason this only takes the deprecated version. Please advise. + .build(); + + DockerHttpClient client = new ApacheDockerHttpClient.Builder() + .dockerHost(config.getDockerHost()) + .sslConfig(config.getSSLConfig()) + .build(); + + return new DockerSourceImpl(pair, DockerClientImpl.getInstance(config,client)); + } + + public abstract URI makeURI(ClientOptions options) throws SourceProvideException; + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java new file mode 100644 index 0000000..98cc500 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java @@ -0,0 +1,32 @@ +package xyz.auriium.tick.docker.source.impl; + +import com.github.dockerjava.core.DefaultDockerClientConfig; +import com.github.dockerjava.core.DockerClientConfig; +import xyz.auriium.tick.docker.source.*; + +public class SystemEnvSourceProvider implements DockerSourceProvider { + @Override + public String name() { + return "SystemEnvSourceProvider"; + } + + @Override + public Integer priority() { + return 50; + } + + @Override + public DockerSource source(ClientOptions options) throws SourceProvideException { + + DefaultDockerClientConfig.createDefaultConfigBuilder(); + + return null; + } + + @Override + public ApplicableResult isApplicable() { + return null; + } + + +} diff --git a/tick-api/src/main/java/me/aurium/tick/driver/TickDriver.java b/tickbox-api/src/main/java/xyz/auriium/tick/driver/TickDriver.java similarity index 77% rename from tick-api/src/main/java/me/aurium/tick/driver/TickDriver.java rename to tickbox-api/src/main/java/xyz/auriium/tick/driver/TickDriver.java index fc3d8c7..386db75 100644 --- a/tick-api/src/main/java/me/aurium/tick/driver/TickDriver.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/driver/TickDriver.java @@ -1,6 +1,7 @@ -package me.aurium.tick.driver; +package xyz.auriium.tick.driver; -import me.aurium.tick.container.container.JDBCContainer; +import xyz.auriium.tick.container.ContainerManager; +import xyz.auriium.tick.container.container.JDBCContainer; import java.sql.*; import java.util.Properties; @@ -10,11 +11,11 @@ public class TickDriver implements Driver { private final Set containerSet; + private final ContainerManager manager; - public TickDriver(Set containerSet) { + public TickDriver(Set containerSet, ContainerManager manager) { this.containerSet = containerSet; - - //(move this elswhere duh) DriverManager DriverManager.registerDriver(new TickDriver); + this.manager = manager; } @Override diff --git a/tick-api/src/test/java/me/aurium/tick/DockerStartupTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/DockerStartupTest.java similarity index 58% rename from tick-api/src/test/java/me/aurium/tick/DockerStartupTest.java rename to tickbox-api/src/test/java/xyz/auriium/tick/DockerStartupTest.java index 582ed85..9e729e9 100644 --- a/tick-api/src/test/java/me/aurium/tick/DockerStartupTest.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/DockerStartupTest.java @@ -1,4 +1,4 @@ -package me.aurium.tick; +package xyz.auriium.tick; public class DockerStartupTest { } diff --git a/tickbox-integrated-tests/pom.xml b/tickbox-integrated-tests/pom.xml new file mode 100644 index 0000000..14bc969 --- /dev/null +++ b/tickbox-integrated-tests/pom.xml @@ -0,0 +1,19 @@ + + + + tickbox-parent + xyz.auriium + 1.0.0 + + 4.0.0 + + tickbox-integrated-tests + + + 16 + 16 + + + \ No newline at end of file diff --git a/tick-integrated/pom.xml b/tickbox-integrated/pom.xml similarity index 86% rename from tick-integrated/pom.xml rename to tickbox-integrated/pom.xml index c57a101..fd5cf8f 100644 --- a/tick-integrated/pom.xml +++ b/tickbox-integrated/pom.xml @@ -3,18 +3,16 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - tick - me.aurium + tickbox-parent + xyz.auriium 1.0.0 4.0.0 - tick-integrated + tickbox-integrated maven-plugin - 1.0.0 - ${compiler.version} ${compiler.version} @@ -42,10 +40,10 @@ - me.aurium - tick-api - 1.0.0 + xyz.auriium + tickbox-api + org.flywaydb flyway-core diff --git a/tick-integrated/src/main/java/me/aurium/tick/integrated/AbstractTickMojo.java b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/AbstractTickMojo.java similarity index 88% rename from tick-integrated/src/main/java/me/aurium/tick/integrated/AbstractTickMojo.java rename to tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/AbstractTickMojo.java index 85fd411..a9806bf 100644 --- a/tick-integrated/src/main/java/me/aurium/tick/integrated/AbstractTickMojo.java +++ b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/AbstractTickMojo.java @@ -1,10 +1,13 @@ -package me.aurium.tick.integrated; +package xyz.auriium.tick.integrated; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugins.annotations.Parameter; public abstract class AbstractTickMojo extends AbstractMojo { + @Parameter(defaultValue = "none") + protected String defaultDockerMachine; + @Parameter(defaultValue = "MARIA_DB") protected CommonInits initializer; diff --git a/tick-integrated/src/main/java/me/aurium/tick/integrated/CommonInits.java b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/CommonInits.java similarity index 54% rename from tick-integrated/src/main/java/me/aurium/tick/integrated/CommonInits.java rename to tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/CommonInits.java index c783118..5731548 100644 --- a/tick-integrated/src/main/java/me/aurium/tick/integrated/CommonInits.java +++ b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/CommonInits.java @@ -1,4 +1,4 @@ -package me.aurium.tick.integrated; +package xyz.auriium.tick.integrated; public enum CommonInits { diff --git a/tick-integrated/src/main/java/me/aurium/tick/integrated/Initializer.java b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/Initializer.java similarity index 59% rename from tick-integrated/src/main/java/me/aurium/tick/integrated/Initializer.java rename to tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/Initializer.java index c9bb577..b7e7da6 100644 --- a/tick-integrated/src/main/java/me/aurium/tick/integrated/Initializer.java +++ b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/Initializer.java @@ -1,6 +1,6 @@ -package me.aurium.tick.integrated; +package xyz.auriium.tick.integrated; -import me.aurium.tick.container.terms.JDBCTerms; +import xyz.auriium.tick.container.terms.JDBCTerms; public interface Initializer { diff --git a/tick-integrated/src/main/java/me/aurium/tick/integrated/MariaDBInitializer.java b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/MariaDBInitializer.java similarity index 63% rename from tick-integrated/src/main/java/me/aurium/tick/integrated/MariaDBInitializer.java rename to tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/MariaDBInitializer.java index 13d5608..dc7f812 100644 --- a/tick-integrated/src/main/java/me/aurium/tick/integrated/MariaDBInitializer.java +++ b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/MariaDBInitializer.java @@ -1,7 +1,7 @@ -package me.aurium.tick.integrated; +package xyz.auriium.tick.integrated; -import me.aurium.tick.container.terms.JDBCTerms; -import me.aurium.tick.container.terms.mariadb.MariaDBTerms; +import xyz.auriium.tick.container.terms.JDBCTerms; +import xyz.auriium.tick.container.terms.mariadb.MariaDBTerms; public class MariaDBInitializer implements Initializer{ @Override diff --git a/tick-integrated/src/main/java/me/aurium/tick/integrated/PopulateGoalMojo.java b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/PopulateGoalMojo.java similarity index 69% rename from tick-integrated/src/main/java/me/aurium/tick/integrated/PopulateGoalMojo.java rename to tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/PopulateGoalMojo.java index a6ac7a0..d8b0214 100644 --- a/tick-integrated/src/main/java/me/aurium/tick/integrated/PopulateGoalMojo.java +++ b/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/PopulateGoalMojo.java @@ -1,19 +1,19 @@ -package me.aurium.tick.integrated; - -import me.aurium.tick.CommonTickFactory; -import me.aurium.tick.Tick; -import me.aurium.tick.TickFactory; -import me.aurium.tick.container.ContainerOptions; -import me.aurium.tick.container.container.JDBCContainer; -import me.aurium.tick.container.terms.JDBCTerms; -import me.aurium.tick.docker.image.CachedPullStrategyProvider; -import me.aurium.tick.docker.source.ClientOptions; -import me.aurium.tick.docker.source.machine.MachineSourceProvider; +package xyz.auriium.tick.integrated; + +import xyz.auriium.tick.CommonTickFactory; +import xyz.auriium.tick.Tick; +import xyz.auriium.tick.TickFactory; +import xyz.auriium.tick.container.ContainerOptions; +import xyz.auriium.tick.container.container.JDBCContainer; +import xyz.auriium.tick.container.terms.JDBCTerms; +import xyz.auriium.tick.docker.image.CachedPullStrategyProvider; +import xyz.auriium.tick.docker.source.ClientOptions; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import xyz.auriium.tick.docker.source.impl.MachineSourceProvider; @Mojo(name = "generate", defaultPhase = LifecyclePhase.INITIALIZE) public class PopulateGoalMojo extends AbstractTickMojo{ @@ -24,7 +24,7 @@ public class PopulateGoalMojo extends AbstractTickMojo{ public void execute() throws MojoFailureException { TickFactory factory = new CommonTickFactory( new MachineSourceProvider(defaultDockerName), - new CachedPullStrategyProvider(), new ClientOptions(true), + new CachedPullStrategyProvider(), new ClientOptions(true, defaultDockerMachine), new ContainerOptions(300) ); @@ -45,7 +45,7 @@ public void execute() throws MojoFailureException { } catch (Exception e) { - logger.error("Error occured during lifecycle: ", e); + logger.error("Error occurred during lifecycle: ", e); } } From 4278afe7c8cd29b21920ba65836419d95a98511a Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 6 Jul 2021 19:10:46 -0700 Subject: [PATCH 09/23] refactor MachineSourceProvider --- .../tick/docker/source/impl/MachineSourceProvider.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java index 078c652..641db02 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java @@ -75,7 +75,7 @@ public ApplicableResult isApplicable() { } @Override - public Pair makeURI(ClientOptions options) throws SourceProvideException { + public URI makeURI(ClientOptions options) throws SourceProvideException { String preferredProvider = options.getPreferredDockerMachineName(); @@ -105,13 +105,7 @@ public Pair makeURI(ClientOptions options) throws SourceProvideException { .exitValueNormal() .execute().outputString().replaceAll("\n","");*/ - String ip = new ProcessExecutor() - .command(executableName,"ip", toUse) - .readOutput(true) - .exitValueNormal() - .execute().outputString().replaceAll("\n",""); - - return new Pair(ip,null); + return null; } catch (IOException | InterruptedException | TimeoutException e) { From 0b0683622395fbd793aa9862bb2c1c7b91807812 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 12 Jul 2021 19:54:10 -0700 Subject: [PATCH 10/23] Add gitignore back --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57f1cb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea/ \ No newline at end of file From f7b5c40ca01f3efb5e61fee30902c4fb1b06984d Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 13 Jul 2021 15:49:46 -0700 Subject: [PATCH 11/23] Rename module integrated to module plugin, establish new documentation --- .idea/compiler.xml | 8 +-- .idea/encodings.xml | 4 +- .idea/jarRepositories.xml | 10 ++++ readme.md | 37 ++++++++++-- tickbox-api/pom.xml | 6 ++ .../java/xyz/auriium/tick/CommonTick.java | 53 ++++++++++++++-- .../xyz/auriium/tick/CommonTickFactory.java | 9 +-- .../src/main/java/xyz/auriium/tick/Tick.java | 5 +- .../tick/container/ContainerManager.java | 11 ---- .../tick/container/ContainerManagerImpl.java | 60 ------------------- .../docker/source/impl/CommonProviders.java | 23 ++++++- .../source/impl/MachineSourceProvider.java | 12 +++- .../source/impl/SystemEnvSourceProvider.java | 7 ++- .../xyz/auriium/tick/driver/TickDriver.java | 55 ----------------- .../xyz/auriium/tick/DockerStartupTest.java | 4 -- .../test/java/xyz/auriium/tick/StartupIT.java | 18 ++++++ .../pom.xml | 0 .../tick/plugin}/AbstractTickMojo.java | 2 +- .../xyz/auriium/tick/plugin}/CommonInits.java | 2 +- .../xyz/auriium/tick/plugin}/Initializer.java | 2 +- .../tick/plugin}/MariaDBInitializer.java | 2 +- .../tick/plugin}/PopulateGoalMojo.java | 2 +- 22 files changed, 165 insertions(+), 167 deletions(-) delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManager.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManagerImpl.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/driver/TickDriver.java delete mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/DockerStartupTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java rename {tickbox-integrated => tickbox-plugin}/pom.xml (100%) rename {tickbox-integrated/src/main/java/xyz/auriium/tick/integrated => tickbox-plugin/src/main/java/xyz/auriium/tick/plugin}/AbstractTickMojo.java (96%) rename {tickbox-integrated/src/main/java/xyz/auriium/tick/integrated => tickbox-plugin/src/main/java/xyz/auriium/tick/plugin}/CommonInits.java (54%) rename {tickbox-integrated/src/main/java/xyz/auriium/tick/integrated => tickbox-plugin/src/main/java/xyz/auriium/tick/plugin}/Initializer.java (82%) rename {tickbox-integrated/src/main/java/xyz/auriium/tick/integrated => tickbox-plugin/src/main/java/xyz/auriium/tick/plugin}/MariaDBInitializer.java (91%) rename {tickbox-integrated/src/main/java/xyz/auriium/tick/integrated => tickbox-plugin/src/main/java/xyz/auriium/tick/plugin}/PopulateGoalMojo.java (98%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index e2b170d..8843d27 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -8,16 +8,16 @@ - + - + - + - + diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 09f8e80..39294b2 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -2,8 +2,6 @@ - - - + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml index 2707b2d..84c543b 100644 --- a/.idea/jarRepositories.xml +++ b/.idea/jarRepositories.xml @@ -1,11 +1,21 @@ + + + + \ No newline at end of file diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java index 340ee21..d6c2997 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java @@ -1,17 +1,58 @@ package xyz.auriium.tick; -import xyz.auriium.tick.container.ContainerManager; +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.HostConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.container.ContainerOptions; +import xyz.auriium.tick.container.container.TickContainer; +import xyz.auriium.tick.container.terms.CreationTerms; +import xyz.auriium.tick.container.terms.termParts.Arguments; +import xyz.auriium.tick.docker.image.PullStrategy; +import xyz.auriium.tick.docker.source.DockerSource; public class CommonTick implements Tick{ - private final ContainerManager manager; + private final Logger logger = LoggerFactory.getLogger(getClass()); - public CommonTick(ContainerManager manager) { - this.manager = manager; + private final DockerSource location; + private final DockerClient client; + + private final PullStrategy strategy; + private final ContainerOptions options; + + public CommonTick(DockerSource location, DockerClient client, PullStrategy strategy, ContainerOptions options) { + this.location = location; + this.client = client; + this.strategy = strategy; + this.options = options; } @Override - public ContainerManager getManager() { - return manager; + public T startupContainer(CreationTerms termActual) throws InterruptedException { + Arguments terms = termActual.creationArguments(); + + if (strategy.shouldLoad(terms.getDockerImageName())) { + logger.info("(TICK) Attempting to pull image with name: " + terms.getDockerImageName()); + + strategy.loadBlocking(terms.getDockerImageName()); + + logger.info("(TICK) image load finished!"); + } + + logger.info("(TICK) Initializing container with image: " + terms.getDockerImageName() + "! Assuming image is present!"); + + CreateContainerResponse response = client.createContainerCmd(terms.getDockerImageName()) + .withName(terms.getCreationName()) + .withEnv(terms.getParameters()) + .withHostConfig(new HostConfig() + .withPortBindings(terms.getBinding()) + ) + .exec(); + + client.startContainerCmd(response.getId()).exec(); + + return termActual.creation(location,client,options,response.getId()); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java index e922ecd..56df82e 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java @@ -2,10 +2,7 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Version; -import xyz.auriium.tick.container.ContainerManager; -import xyz.auriium.tick.container.ContainerManagerImpl; import xyz.auriium.tick.container.ContainerOptions; -import xyz.auriium.tick.docker.DockerLocationImpl; import xyz.auriium.tick.docker.image.PullStrategyProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,12 +39,8 @@ public Tick produce() throws SourceProvideException { "Docker version: " + dockerVersion.getVersion() + "\n" + "OS: " + dockerVersion.getOperatingSystem()); - logger.info("(TICK) Setting up a ContainerManager..."); - - ContainerManager manager = new ContainerManagerImpl(source, client, strategy.getStrategy(client), containerOptions); - logger.info("(TICK) ContainerManager set up correctly! Tick is now ready for use!"); - return new CommonTick(manager); + return new CommonTick(source, client, strategy.getStrategy(client), containerOptions); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java b/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java index 9bf2bdd..10f4d66 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java @@ -1,12 +1,13 @@ package xyz.auriium.tick; -import xyz.auriium.tick.container.ContainerManager; +import xyz.auriium.tick.container.container.TickContainer; +import xyz.auriium.tick.container.terms.CreationTerms; /** * Represents a prestarted Tick that can provide multiple containers */ public interface Tick { - ContainerManager getManager(); + T startupContainer(CreationTerms terms) throws InterruptedException; } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManager.java deleted file mode 100644 index ed3b265..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManager.java +++ /dev/null @@ -1,11 +0,0 @@ -package xyz.auriium.tick.container; - -import xyz.auriium.tick.container.container.TickContainer; -import xyz.auriium.tick.container.terms.CreationTerms; - -public interface ContainerManager { - - //TODO needs to be some kind of guaruntee that this image exists on the local client, if not, it needs to be accessed - T startupContainer(CreationTerms terms) throws InterruptedException; - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManagerImpl.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManagerImpl.java deleted file mode 100644 index 788138c..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerManagerImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package xyz.auriium.tick.container; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.model.HostConfig; -import xyz.auriium.tick.container.container.TickContainer; -import xyz.auriium.tick.container.terms.CreationTerms; -import xyz.auriium.tick.container.terms.termParts.Arguments; -import xyz.auriium.tick.docker.image.PullStrategy; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import xyz.auriium.tick.docker.source.DockerSource; - -public class ContainerManagerImpl implements ContainerManager { - - //might need to make things threaded in the future - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - private final DockerSource location; - private final DockerClient client; - - private final PullStrategy strategy; - private final ContainerOptions options; - - public ContainerManagerImpl(DockerSource location, DockerClient client, PullStrategy strategy, ContainerOptions options) { - this.location = location; - this.client = client; - this.strategy = strategy; - this.options = options; - } - - @Override - public T startupContainer(CreationTerms termActual) throws InterruptedException { - Arguments terms = termActual.creationArguments(); - - if (strategy.shouldLoad(terms.getDockerImageName())) { - logger.info("(TICK) Attempting to pull image with name: " + terms.getDockerImageName()); - - strategy.loadBlocking(terms.getDockerImageName()); - - logger.info("(TICK) image load finished!"); - } - - logger.info("(TICK) Initializing container with image: " + terms.getDockerImageName() + "! Assuming image is present!"); - - CreateContainerResponse response = client.createContainerCmd(terms.getDockerImageName()) - .withName(terms.getCreationName()) - .withEnv(terms.getParameters()) - .withHostConfig(new HostConfig() - .withPortBindings(terms.getBinding()) - ) - .exec(); - - client.startContainerCmd(response.getId()).exec(); - - return termActual.creation(location,client,options,response.getId()); - } - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java index acec670..92bd88d 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java @@ -25,6 +25,27 @@ public CommonProviders install(DockerSourceProvider provider) { return this; } + /** + * Attempts to find a DockerProvider with the name given, or returns a default name and logs. + * @param preferred the preferred Provider identifier to use + * @return a provider + * @throws IllegalStateException if no providers can be found + */ + public DockerSourceProvider find(String preferred) { + for (DockerSourceProvider provider : providers) { + if (provider.name().equalsIgnoreCase(preferred)) { + return provider; + } + } + + return find(); + } + + /** + * Attempts to find a DockerProvider using the first available highest priority provider + * @return a provider + * @throws IllegalStateException if no providers can be found. + */ public DockerSourceProvider find() { for (DockerSourceProvider provider : providers.stream() @@ -36,7 +57,7 @@ public DockerSourceProvider find() { if (result.isApplicable()) { return provider; } else { - logger.warn(String.format("Attempt to produce valid DockerClient failure for provider [%s], Reason: [%s]", provider.name(), result.getReason())); + logger.warn(String.format("Attempt to produce valid DockerClient failure \nwith provider [%s], \nReason: [%s]", provider.name(), result.getReason())); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java index 641db02..b9c8cb6 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java @@ -19,6 +19,12 @@ import java.util.concurrent.TimeoutException; import java.util.regex.Pattern; +/** + * DO NOT USE THIS as it does not currently work correctly lmao + * + * (Startup works, connection does not.) + */ +@Deprecated public class MachineSourceProvider extends SimpleSourceProvider { private static final Logger logger = LoggerFactory.getLogger(MachineSourceProvider.class); @@ -99,13 +105,13 @@ public URI makeURI(ClientOptions options) throws SourceProvideException { logger.info(String.format("Using docker-machine with system %s (selected machine %s). If these do not match machine %s was likely ineligible for use.", toUse, preferredProvider, preferredProvider)); - /*URI url = new ProcessExecutor() + String url = new ProcessExecutor() .command(executableName,"url", toUse) .readOutput(true) .exitValueNormal() - .execute().outputString().replaceAll("\n","");*/ + .execute().outputString().replaceAll("\n",""); - return null; + return URI.create(url); } catch (IOException | InterruptedException | TimeoutException e) { diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java index 98cc500..ff2cfb6 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java @@ -4,6 +4,11 @@ import com.github.dockerjava.core.DockerClientConfig; import xyz.auriium.tick.docker.source.*; +/** + * Provider that attempts to use system variables in order to provide a docker source + * + * Analogous to TestContainer's EnvironmentAndSystemPropertyClientProviderStrategy (geez) + */ public class SystemEnvSourceProvider implements DockerSourceProvider { @Override public String name() { @@ -25,7 +30,7 @@ public DockerSource source(ClientOptions options) throws SourceProvideException @Override public ApplicableResult isApplicable() { - return null; + return System.getenv("DOCKER_HOST") != null ? ApplicableResult.success() : ApplicableResult.fail("System Environment Variables for docker could not be located or are null! Please fill them out!"); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/driver/TickDriver.java b/tickbox-api/src/main/java/xyz/auriium/tick/driver/TickDriver.java deleted file mode 100644 index 386db75..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/driver/TickDriver.java +++ /dev/null @@ -1,55 +0,0 @@ -package xyz.auriium.tick.driver; - -import xyz.auriium.tick.container.ContainerManager; -import xyz.auriium.tick.container.container.JDBCContainer; - -import java.sql.*; -import java.util.Properties; -import java.util.Set; -import java.util.logging.Logger; - -public class TickDriver implements Driver { - - private final Set containerSet; - private final ContainerManager manager; - - public TickDriver(Set containerSet, ContainerManager manager) { - this.containerSet = containerSet; - this.manager = manager; - } - - @Override - public Connection connect(String s, Properties properties) throws SQLException { - return null; - } - - @Override - public boolean acceptsURL(String s) throws SQLException { - return s.startsWith("jdbc:tick:"); - } - - @Override - public DriverPropertyInfo[] getPropertyInfo(String s, Properties properties) throws SQLException { - return new DriverPropertyInfo[0]; - } - - @Override - public int getMajorVersion() { - return 0; - } - - @Override - public int getMinorVersion() { - return 0; - } - - @Override - public boolean jdbcCompliant() { - return false; - } - - @Override - public Logger getParentLogger() throws SQLFeatureNotSupportedException { - return null; - } -} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/DockerStartupTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/DockerStartupTest.java deleted file mode 100644 index 9e729e9..0000000 --- a/tickbox-api/src/test/java/xyz/auriium/tick/DockerStartupTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package xyz.auriium.tick; - -public class DockerStartupTest { -} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java b/tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java new file mode 100644 index 0000000..c7cf42f --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java @@ -0,0 +1,18 @@ +package xyz.auriium.tick; + + +import org.junit.jupiter.api.Test; + +/** + * Test that tests startup and initialization for each existing strategy + */ +public class StartupIT { + + @Test + public void initializeTick() { + Tick tick = new CommonTickFactory(null,null,null,null).produce(); + } + + + +} diff --git a/tickbox-integrated/pom.xml b/tickbox-plugin/pom.xml similarity index 100% rename from tickbox-integrated/pom.xml rename to tickbox-plugin/pom.xml diff --git a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/AbstractTickMojo.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/AbstractTickMojo.java similarity index 96% rename from tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/AbstractTickMojo.java rename to tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/AbstractTickMojo.java index a9806bf..d77de89 100644 --- a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/AbstractTickMojo.java +++ b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/AbstractTickMojo.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.integrated; +package xyz.auriium.tick.plugin; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugins.annotations.Parameter; diff --git a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/CommonInits.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonInits.java similarity index 54% rename from tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/CommonInits.java rename to tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonInits.java index 5731548..a868ad5 100644 --- a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/CommonInits.java +++ b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonInits.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.integrated; +package xyz.auriium.tick.plugin; public enum CommonInits { diff --git a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/Initializer.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/Initializer.java similarity index 82% rename from tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/Initializer.java rename to tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/Initializer.java index b7e7da6..f3bab32 100644 --- a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/Initializer.java +++ b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/Initializer.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.integrated; +package xyz.auriium.tick.plugin; import xyz.auriium.tick.container.terms.JDBCTerms; diff --git a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/MariaDBInitializer.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/MariaDBInitializer.java similarity index 91% rename from tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/MariaDBInitializer.java rename to tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/MariaDBInitializer.java index dc7f812..a77fadb 100644 --- a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/MariaDBInitializer.java +++ b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/MariaDBInitializer.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.integrated; +package xyz.auriium.tick.plugin; import xyz.auriium.tick.container.terms.JDBCTerms; import xyz.auriium.tick.container.terms.mariadb.MariaDBTerms; diff --git a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/PopulateGoalMojo.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java similarity index 98% rename from tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/PopulateGoalMojo.java rename to tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java index d8b0214..1e9cab6 100644 --- a/tickbox-integrated/src/main/java/xyz/auriium/tick/integrated/PopulateGoalMojo.java +++ b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.integrated; +package xyz.auriium.tick.plugin; import xyz.auriium.tick.CommonTickFactory; import xyz.auriium.tick.Tick; From 0427b63032b1acb11c2d353ea00a77920af5caa9 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 13 Jul 2021 16:46:49 -0700 Subject: [PATCH 12/23] Change logger format --- .idea/compiler.xml | 2 +- .../java/xyz/auriium/tick/CommonTick.java | 10 ++-- .../xyz/auriium/tick/CommonTickFactory.java | 56 +++++++++++++++---- .../java/xyz/auriium/tick/ImageManager.java | 16 ------ .../java/xyz/auriium/tick/TickFactory.java | 2 +- .../tick/container/ContainerOptions.java | 8 ++- .../image/LoggingPullResultCallback.java | 2 +- .../tick/docker/source/ClientOptions.java | 21 ------- .../tick/docker/source/CreationOptions.java | 36 ++++++++++++ .../docker/source/DockerSourceProvider.java | 4 +- .../source/impl/MachineSourceProvider.java | 10 ++-- .../source/impl/ManualSourceProvider.java | 37 ++++++++++++ .../source/impl/SimpleSourceProvider.java | 7 +-- .../source/impl/SystemEnvSourceProvider.java | 3 +- .../pom.xml | 0 .../auriium/tick/plugin}/CommonProviders.java | 9 ++- .../auriium/tick/plugin/PopulateGoalMojo.java | 4 +- 17 files changed, 152 insertions(+), 75 deletions(-) delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/ImageManager.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ClientOptions.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationOptions.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java rename {tickbox-integrated-tests => tickbox-plugin-tests}/pom.xml (100%) rename {tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl => tickbox-plugin/src/main/java/xyz/auriium/tick/plugin}/CommonProviders.java (86%) diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 8843d27..784da1b 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,8 +6,8 @@ - + diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java index d6c2997..20f8a97 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java @@ -14,7 +14,7 @@ public class CommonTick implements Tick{ - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final Logger logger = LoggerFactory.getLogger("(TICK | MANAGER)"); private final DockerSource location; private final DockerClient client; @@ -34,14 +34,14 @@ public T startupContainer(CreationTerms termActual) Arguments terms = termActual.creationArguments(); if (strategy.shouldLoad(terms.getDockerImageName())) { - logger.info("(TICK) Attempting to pull image with name: " + terms.getDockerImageName()); + logger.info("Attempting to pull image with name: " + terms.getDockerImageName()); - strategy.loadBlocking(terms.getDockerImageName()); + strategy.loadBlocking(terms.getDockerImageName()); //todo - logger.info("(TICK) image load finished!"); + logger.info("Image load finished!"); } - logger.info("(TICK) Initializing container with image: " + terms.getDockerImageName() + "! Assuming image is present!"); + logger.info("Initializing container with image: " + terms.getDockerImageName() + "! Assuming image is present!"); CreateContainerResponse response = client.createContainerCmd(terms.getDockerImageName()) .withName(terms.getCreationName()) diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java index 56df82e..0882e7d 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java @@ -12,35 +12,69 @@ public class CommonTickFactory implements TickFactory{ private final DockerSourceProvider provider; private final PullStrategyProvider strategy; - private final ClientOptions clientOptions; + private final CreationOptions creationOptions; private final ContainerOptions containerOptions; - private final Logger logger = LoggerFactory.getLogger(CommonTickFactory.class); + private final Logger logger = LoggerFactory.getLogger("(TICK | FACTORY)"); - //TODO builder - public CommonTickFactory(DockerSourceProvider provider, PullStrategyProvider strategy, ClientOptions clientOptions, ContainerOptions containerOptions) { + /** + * Create a new TickFactory that initializes Ticks with default specs + * @param provider the docker source provider to use in order to get a DockerClient instance + * @param strategy the pull strategy to use in order to handle pulling new images + * @param creationOptions client creation options that pertain to how {@param provider} can be called + * @param containerOptions options that are used once a client is created and a container is required. + */ + public CommonTickFactory(DockerSourceProvider provider, PullStrategyProvider strategy, CreationOptions creationOptions, ContainerOptions containerOptions) { this.provider = provider; this.strategy = strategy; - this.clientOptions = clientOptions; + this.creationOptions = creationOptions; this.containerOptions = containerOptions; } + /** + * Creates a new TickFactory with default settings + * @param provider the docker source provider to use in order to get a DockerClient instance + * @param strategy the pull strategy to use in order to handle pulling new images + */ + public CommonTickFactory(DockerSourceProvider provider, PullStrategyProvider strategy) { + this(provider,strategy, CreationOptions.defaults(),ContainerOptions.defaults()); + } + @Override - public Tick produce() throws SourceProvideException { - logger.info("(TICK) Attempting to produce a Tick! Producing DockerClient now..."); + public Tick produce() { + logger.info("Initializing tick startup, performing DockerSourceProvider pre-check!"); + + ApplicableResult result = provider.isApplicable(); - DockerSource source = provider.source(clientOptions); + if (!result.isApplicable()) { + logger.error(String.format("Attempt to check valid DockerClient using [%s] failed!", provider.name())); + logger.error(String.format("Reason: [%s]", result.getReason())); + throw new InvalidProviderException(); + } + + logger.info("Pre-check successful! Attempting to produce a DockerClient now."); + + DockerSource source = provider.source(creationOptions); DockerClient client = source.getClient(); + logger.info("Client produced successfully! Executing final startup activities..."); + + //TODO test the dockersource - run multiple client commands and a test startup/shutdown on it + if (creationOptions.isUsePostCreationTest()) { + logger.debug("Test would occur here!"); + } + Version dockerVersion = client.versionCmd().exec(); - logger.info("(TICK) DockerClient startup successful!" + + logger.info("(DockerClient startup successful!" + "\n" + "API version: " + dockerVersion.getApiVersion() + "\n" + "Docker version: " + dockerVersion.getVersion() + "\n" + "OS: " + dockerVersion.getOperatingSystem()); - logger.info("(TICK) ContainerManager set up correctly! Tick is now ready for use!"); - return new CommonTick(source, client, strategy.getStrategy(client), containerOptions); + + + + } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/ImageManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/ImageManager.java deleted file mode 100644 index 98d2130..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/ImageManager.java +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.auriium.tick; - -import java.util.concurrent.CompletableFuture; - -public interface ImageManager { - - /** - * CALLER IS RESPONSIBLE FOR MISSING IMAGE ID EXCEPTIONS. - * - * Installs the image id onto the docker-client and tries to give t he image name - * @param imageName - * @return - */ - CompletableFuture loadImageID(String imageName); - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java index 82eb320..c0a4cdd 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java @@ -7,6 +7,6 @@ */ public interface TickFactory { - Tick produce() throws SourceProvideException; + Tick produce(); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java index 9962790..aeb4888 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java @@ -1,6 +1,8 @@ package xyz.auriium.tick.container; -//todo make this more useful +/** + * Options that pertain to the creation of containers + */ public class ContainerOptions { private final int containerShutdownWait; @@ -12,4 +14,8 @@ public ContainerOptions(int containerShutdownWait) { public int getContainerShutdownWait() { return containerShutdownWait; } + + public static ContainerOptions defaults() { + return new ContainerOptions(500); + } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java index af28fe4..48367e0 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java @@ -26,7 +26,7 @@ public class LoggingPullResultCallback extends PullImageResultCallback { private final Map totalSizes = new HashMap<>(); private final Map currentSizes = new HashMap<>(); - private final Logger logger = LoggerFactory.getLogger(getClass()); + private final Logger logger = LoggerFactory.getLogger("(TICK | IMAGE PULL)"); private boolean completed = false; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ClientOptions.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ClientOptions.java deleted file mode 100644 index db03676..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ClientOptions.java +++ /dev/null @@ -1,21 +0,0 @@ -package xyz.auriium.tick.docker.source; - -//TODO make this more useful -public class ClientOptions { - - private final boolean withTLS; - private final String preferredDockerMachineName; - - public ClientOptions(boolean withTLS, String preferredDockerMachineName) { - this.withTLS = withTLS; - this.preferredDockerMachineName = preferredDockerMachineName; - } - - public boolean isWithTLS() { - return withTLS; - } - - public String getPreferredDockerMachineName() { - return preferredDockerMachineName; - } -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationOptions.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationOptions.java new file mode 100644 index 0000000..1615f32 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationOptions.java @@ -0,0 +1,36 @@ +package xyz.auriium.tick.docker.source; + +/** + * Options that pertain to the creation of the docker client + */ +public class CreationOptions { + + private final boolean usePostCreationTest; + private final boolean withTLS; + + /** + * Option details for client options + * @param usePostCreationTest whether to use the post creation test + * to check if a completed docker client actually works. + * This is tested by creating a new container and immediately killing it. + * + * @param withTLS whether to use TLS with created containers or not + * + */ + public CreationOptions(boolean usePostCreationTest, boolean withTLS) { + this.usePostCreationTest = usePostCreationTest; + this.withTLS = withTLS; + } + + public boolean isUsePostCreationTest() { + return usePostCreationTest; + } + + public boolean isWithTLS() { + return withTLS; + } + + public static CreationOptions defaults() { + return new CreationOptions(true, false); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java index 04c2f66..2195b1a 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java @@ -8,9 +8,9 @@ public interface DockerSourceProvider { /** * Attempts to generate a DockerSource. Typically calls {@link #isApplicable()} internally. * @return a docker source. - * @throws SourceProvideException if an error occurs attempting to generate the dockersource outlined. + * @throws IllegalStateException if an error occurs attempting to generate the dockersource outlined. */ - DockerSource source(ClientOptions options) throws SourceProvideException; + DockerSource source(CreationOptions options); /** * Checks whether or not the DockerSourceProvider can effectively provide a DockerSource diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java index b9c8cb6..e89c196 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java @@ -27,7 +27,7 @@ @Deprecated public class MachineSourceProvider extends SimpleSourceProvider { - private static final Logger logger = LoggerFactory.getLogger(MachineSourceProvider.class); + private static final Logger logger = LoggerFactory.getLogger("(TICK | DOCKER-MACHINE PROVIDER)"); private static final String DEFAULT = "default"; @Override @@ -81,7 +81,7 @@ public ApplicableResult isApplicable() { } @Override - public URI makeURI(ClientOptions options) throws SourceProvideException { + public URI makeURI(CreationOptions options) { String preferredProvider = options.getPreferredDockerMachineName(); @@ -92,7 +92,7 @@ public URI makeURI(ClientOptions options) throws SourceProvideException { executableName="docker-machine.exe"; } - if (!executableExists(executableName)) throw new SourceProvideException("DockerMachine executable not found on this system!"); + if (!executableExists(executableName)) throw new IllegalStateException("DockerMachine executable not found on this system!"); try { ProcessResult result = new ProcessExecutor() @@ -101,7 +101,7 @@ public URI makeURI(ClientOptions options) throws SourceProvideException { .exitValueNormal() .execute(); - String toUse = getToUse(preferredProvider, List.of(result.outputUTF8().split("\n"))).orElseThrow(() -> new SourceProvideException("No default machine present on this system!")); + String toUse = getToUse(preferredProvider, List.of(result.outputUTF8().split("\n"))).orElseThrow(() -> new IllegalStateException("No default machine present on this system!")); logger.info(String.format("Using docker-machine with system %s (selected machine %s). If these do not match machine %s was likely ineligible for use.", toUse, preferredProvider, preferredProvider)); @@ -115,7 +115,7 @@ public URI makeURI(ClientOptions options) throws SourceProvideException { } catch (IOException | InterruptedException | TimeoutException e) { - throw new ShellExecutionException(e); + throw new IllegalStateException(e); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java new file mode 100644 index 0000000..bfcd541 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java @@ -0,0 +1,37 @@ +package xyz.auriium.tick.docker.source.impl; + +import xyz.auriium.tick.docker.source.*; + +import java.net.URI; + +/** + * Manual provider that provides a source using a given URI. Use this if you + */ +public class ManualSourceProvider implements DockerSourceProvider { + + private final URI hostURI; + + public ManualSourceProvider(URI hostURI) { + this.hostURI = hostURI; + } + + @Override + public String name() { + return null; + } + + @Override + public Integer priority() { + return null; + } + + @Override + public DockerSource source(CreationOptions options) { + return null; + } + + @Override + public ApplicableResult isApplicable() { + return null; + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java index 30a4a21..a97128a 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java @@ -6,10 +6,9 @@ import com.github.dockerjava.core.LocalDirectorySSLConfig; import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; import com.github.dockerjava.transport.DockerHttpClient; -import xyz.auriium.tick.docker.source.ClientOptions; +import xyz.auriium.tick.docker.source.CreationOptions; import xyz.auriium.tick.docker.source.DockerSource; import xyz.auriium.tick.docker.source.DockerSourceProvider; -import xyz.auriium.tick.docker.source.SourceProvideException; import java.net.URI; import java.nio.file.Paths; @@ -17,7 +16,7 @@ public abstract class SimpleSourceProvider implements DockerSourceProvider { @Override - public DockerSource source(ClientOptions options) throws SourceProvideException { + public DockerSource source(CreationOptions options) { URI pair = makeURI(options); @@ -36,6 +35,6 @@ public DockerSource source(ClientOptions options) throws SourceProvideException return new DockerSourceImpl(pair, DockerClientImpl.getInstance(config,client)); } - public abstract URI makeURI(ClientOptions options) throws SourceProvideException; + public abstract URI makeURI(CreationOptions options); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java index ff2cfb6..ba6a6a0 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java @@ -1,7 +1,6 @@ package xyz.auriium.tick.docker.source.impl; import com.github.dockerjava.core.DefaultDockerClientConfig; -import com.github.dockerjava.core.DockerClientConfig; import xyz.auriium.tick.docker.source.*; /** @@ -21,7 +20,7 @@ public Integer priority() { } @Override - public DockerSource source(ClientOptions options) throws SourceProvideException { + public DockerSource source(CreationOptions options) { DefaultDockerClientConfig.createDefaultConfigBuilder(); diff --git a/tickbox-integrated-tests/pom.xml b/tickbox-plugin-tests/pom.xml similarity index 100% rename from tickbox-integrated-tests/pom.xml rename to tickbox-plugin-tests/pom.xml diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonProviders.java similarity index 86% rename from tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java rename to tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonProviders.java index 92bd88d..3398042 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/CommonProviders.java +++ b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonProviders.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.docker.source.impl; +package xyz.auriium.tick.plugin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,12 +10,15 @@ import java.util.Set; import java.util.stream.Collectors; +/** + * Class used to search for a valid provider - Unique to the maven plugin! + */ public class CommonProviders { CommonProviders() {} public static final CommonProviders INSTANCE = new CommonProviders(); //Limit instances, use ugly static pattern to allow outside - private static final Logger logger = LoggerFactory.getLogger("TickBox - Docker Providers"); + private static final Logger logger = LoggerFactory.getLogger("(TICK | PROVIDER SEARCHER)"); //classes to insert their own providers private final Set providers = new HashSet<>(); @@ -57,7 +60,7 @@ public DockerSourceProvider find() { if (result.isApplicable()) { return provider; } else { - logger.warn(String.format("Attempt to produce valid DockerClient failure \nwith provider [%s], \nReason: [%s]", provider.name(), result.getReason())); + logger.debug(String.format("Attempt to produce valid DockerClient failure \nwith provider [%s], \nReason: [%s]", provider.name(), result.getReason())); } } diff --git a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java index 1e9cab6..a17d6ed 100644 --- a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java +++ b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java @@ -7,7 +7,7 @@ import xyz.auriium.tick.container.container.JDBCContainer; import xyz.auriium.tick.container.terms.JDBCTerms; import xyz.auriium.tick.docker.image.CachedPullStrategyProvider; -import xyz.auriium.tick.docker.source.ClientOptions; +import xyz.auriium.tick.docker.source.CreationOptions; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; @@ -24,7 +24,7 @@ public class PopulateGoalMojo extends AbstractTickMojo{ public void execute() throws MojoFailureException { TickFactory factory = new CommonTickFactory( new MachineSourceProvider(defaultDockerName), - new CachedPullStrategyProvider(), new ClientOptions(true, defaultDockerMachine), + new CachedPullStrategyProvider(), new CreationOptions(usePostCreationTest, true), new ContainerOptions(300) ); From dcefbccc7715be13dbf16e523970fa1e06d815ab Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 13 Jul 2021 19:39:59 -0700 Subject: [PATCH 13/23] Create new providers --- .idea/compiler.xml | 3 +- pom.xml | 4 +- tickbox-api/pom.xml | 6 + .../java/xyz/auriium/tick/CommonTick.java | 12 ++ .../src/main/java/xyz/auriium/tick/Tick.java | 18 ++- .../java/xyz/auriium/tick/TickFactory.java | 2 - .../container/ContainerStateManager.java | 11 ++ .../container/container/DebianContainer.java | 4 + .../container/container/MariaDBContainer.java | 2 +- .../tick/docker/source/CreationException.java | 12 ++ .../docker/source/DockerSourceProvider.java | 2 +- .../source/ShellExecutionException.java | 15 --- .../docker/source/SourceProvideException.java | 13 --- .../source/impl/MachineSourceProvider.java | 12 +- .../source/impl/ManualSourceProvider.java | 31 ++++-- .../source/impl/RootlessSourceProvider.java | 103 ++++++++++++++++++ .../source/impl/SimpleSourceProvider.java | 3 + .../source/impl/SystemEnvSourceProvider.java | 18 ++- .../source/impl/UnixSourceProvider.java | 57 ++++++++++ .../source/impl/WindowsSourceProvider.java | 38 +++++++ .../test/java/xyz/auriium/tick/StartupIT.java | 18 --- .../xyz/auriium/tick/TickCreationTest.java | 56 ++++++++++ .../tick/provider/UnixProviderTest.java | 52 +++++++++ 23 files changed, 417 insertions(+), 75 deletions(-) create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationException.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ShellExecutionException.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/SourceProvideException.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java delete mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 784da1b..b932602 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,8 +6,8 @@ + - @@ -21,6 +21,7 @@ + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 88431c4..9fa5af0 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,8 @@ tickbox-api - tickbox-integrated - tickbox-integrated-tests + tickbox-plugin + tickbox-plugin-tests diff --git a/tickbox-api/pom.xml b/tickbox-api/pom.xml index 22c5f50..f1e7934 100644 --- a/tickbox-api/pom.xml +++ b/tickbox-api/pom.xml @@ -49,6 +49,12 @@ 5.7.0 test + + ch.qos.logback + logback-classic + 1.3.0-alpha5 + test + \ No newline at end of file diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java index 20f8a97..85ba124 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java @@ -12,6 +12,8 @@ import xyz.auriium.tick.docker.image.PullStrategy; import xyz.auriium.tick.docker.source.DockerSource; +import java.io.IOException; + public class CommonTick implements Tick{ private final Logger logger = LoggerFactory.getLogger("(TICK | MANAGER)"); @@ -29,6 +31,11 @@ public CommonTick(DockerSource location, DockerClient client, PullStrategy strat this.options = options; } + @Override + public DockerSource getSource() { + return location; + } + @Override public T startupContainer(CreationTerms termActual) throws InterruptedException { Arguments terms = termActual.creationArguments(); @@ -55,4 +62,9 @@ public T startupContainer(CreationTerms termActual) return termActual.creation(location,client,options,response.getId()); } + + @Override + public void close() throws IOException { + + } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java b/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java index 10f4d66..7fcb03e 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java @@ -2,12 +2,28 @@ import xyz.auriium.tick.container.container.TickContainer; import xyz.auriium.tick.container.terms.CreationTerms; +import xyz.auriium.tick.docker.source.DockerSource; + +import java.io.Closeable; /** * Represents a prestarted Tick that can provide multiple containers */ -public interface Tick { +public interface Tick extends Closeable { + + /** + * Gets the relevant source being used by this tick system + * @return the source + */ + DockerSource getSource(); + /** + * Starts a container used + * @param terms + * @param + * @return + * @throws InterruptedException + */ T startupContainer(CreationTerms terms) throws InterruptedException; } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java index c0a4cdd..010ee36 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java @@ -1,7 +1,5 @@ package xyz.auriium.tick; -import xyz.auriium.tick.docker.source.SourceProvideException; - /** * Represents something that can make Ticks */ diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java new file mode 100644 index 0000000..7f3b73f --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java @@ -0,0 +1,11 @@ +package xyz.auriium.tick.container.container; + +import java.util.Set; + +public interface ContainerStateManager { + + Set getAllContainerIDs(); + + void stop(); + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java new file mode 100644 index 0000000..4a542c9 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java @@ -0,0 +1,4 @@ +package xyz.auriium.tick.container.container; + +public class DebianContainer { +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java index edf1acc..9afde35 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java @@ -43,7 +43,7 @@ public String containerID() { } @Override - public void close() throws Exception { + public void close() { client.stopContainerCmd(containerID).withTimeout(options.getContainerShutdownWait()).exec(); client.removeContainerCmd(containerID).exec(); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationException.java new file mode 100644 index 0000000..bba200e --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationException.java @@ -0,0 +1,12 @@ +package xyz.auriium.tick.docker.source; + +public class CreationException extends RuntimeException{ + + public CreationException(String message) { + super(message); + } + + public CreationException(Throwable cause) { + super(cause); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java index 2195b1a..9ec1bcc 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java @@ -6,7 +6,7 @@ public interface DockerSourceProvider { Integer priority(); /** - * Attempts to generate a DockerSource. Typically calls {@link #isApplicable()} internally. + * Attempts to generate a DockerSource. Do not call this without calling {@link #isApplicable()} * @return a docker source. * @throws IllegalStateException if an error occurs attempting to generate the dockersource outlined. */ diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ShellExecutionException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ShellExecutionException.java deleted file mode 100644 index 1eb7e51..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ShellExecutionException.java +++ /dev/null @@ -1,15 +0,0 @@ -package xyz.auriium.tick.docker.source; - -import xyz.auriium.tick.docker.source.SourceProvideException; - -public class ShellExecutionException extends SourceProvideException { - - public ShellExecutionException(Throwable throwable) { - super(throwable); - } - - public ShellExecutionException(String string) { - super(string); - } - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/SourceProvideException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/SourceProvideException.java deleted file mode 100644 index b0191e8..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/SourceProvideException.java +++ /dev/null @@ -1,13 +0,0 @@ -package xyz.auriium.tick.docker.source; - -public class SourceProvideException extends Exception { - - public SourceProvideException(String reason) { - super(reason); - } - - public SourceProvideException(Throwable throwable) { - super(throwable); - } - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java index e89c196..5af6300 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java @@ -30,6 +30,12 @@ public class MachineSourceProvider extends SimpleSourceProvider { private static final Logger logger = LoggerFactory.getLogger("(TICK | DOCKER-MACHINE PROVIDER)"); private static final String DEFAULT = "default"; + private final String preferredName; + + public MachineSourceProvider(String preferredName) { + this.preferredName = preferredName; + } + @Override public String name() { return "MachineSourceProvider"; @@ -83,8 +89,6 @@ public ApplicableResult isApplicable() { @Override public URI makeURI(CreationOptions options) { - String preferredProvider = options.getPreferredDockerMachineName(); - logger.info("Attempting to produce DockerSource using docker machine commandline!"); String executableName = "docker-machine"; @@ -101,9 +105,9 @@ public URI makeURI(CreationOptions options) { .exitValueNormal() .execute(); - String toUse = getToUse(preferredProvider, List.of(result.outputUTF8().split("\n"))).orElseThrow(() -> new IllegalStateException("No default machine present on this system!")); + String toUse = getToUse(preferredName, List.of(result.outputUTF8().split("\n"))).orElseThrow(() -> new IllegalStateException("No default machine present on this system!")); - logger.info(String.format("Using docker-machine with system %s (selected machine %s). If these do not match machine %s was likely ineligible for use.", toUse, preferredProvider, preferredProvider)); + logger.info(String.format("Using docker-machine with system %s (selected machine %s). If these do not match machine %s was likely ineligible for use.", toUse, preferredName, preferredName)); String url = new ProcessExecutor() .command(executableName,"url", toUse) diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java index bfcd541..cdc84e8 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java @@ -3,35 +3,52 @@ import xyz.auriium.tick.docker.source.*; import java.net.URI; +import java.util.function.Supplier; /** - * Manual provider that provides a source using a given URI. Use this if you + * Manual provider that provides a source using a given URI. */ -public class ManualSourceProvider implements DockerSourceProvider { +public class ManualSourceProvider extends SimpleSourceProvider { private final URI hostURI; + private final Supplier success; + + /** + * A manual provider that provides a source using given URI. + * @param hostURI the URI to use when creating the source handle + * @param success a lambda function that determines whether the URI is usable or not. + */ + public ManualSourceProvider(URI hostURI, Supplier success) { + this.hostURI = hostURI; + this.success = success; + } + /** + * Default constructor for provider + * @param hostURI the URI to use when creating the source handle + */ public ManualSourceProvider(URI hostURI) { this.hostURI = hostURI; + this.success = ApplicableResult::success; } @Override public String name() { - return null; + return "ManualSourceProvider"; } @Override public Integer priority() { - return null; + return -100000; } @Override - public DockerSource source(CreationOptions options) { - return null; + public URI makeURI(CreationOptions options) { + return hostURI; } @Override public ApplicableResult isApplicable() { - return null; + return success.get(); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java new file mode 100644 index 0000000..31d5c9d --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java @@ -0,0 +1,103 @@ +package xyz.auriium.tick.docker.source.impl; + +import com.sun.jna.Library; +import com.sun.jna.Native; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.SystemUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.docker.source.ApplicableResult; +import xyz.auriium.tick.docker.source.CreationOptions; + +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + +/** + * UNIX only SourceProvider that attempts to run docker regardless of whether it has permission to or not + * + * This was copy pasted from testcontainers and adapted to the tickbox format. I have no idea whether + * or not it actually functions. + */ +@Deprecated +public class RootlessSourceProvider extends SimpleSourceProvider{ + + private static final Logger logger = LoggerFactory.getLogger("(TICK | ROOTLESS DOCKER PROVIDER)"); + + private Path resolveSocketPath() { + return tryEnv().orElseGet(() -> { + Path homePath = Paths.get(System.getProperty("user.home")).resolve(".docker").resolve("run"); + return tryFolder(homePath).orElseGet(() -> { + Path implicitPath = Paths.get("/run/user/" + LibC.INSTANCE.getUUID()); + return tryFolder(implicitPath).orElse(null); + }); + }); + } + + private Optional tryEnv() { + String xdgRuntimeDir = System.getenv("XDG_RUNTIME_DIR"); + if (StringUtils.isBlank(xdgRuntimeDir)) { + logger.debug("$XDG_RUNTIME_DIR is not set."); + return Optional.empty(); + } + Path path = Paths.get(xdgRuntimeDir); + if (!Files.exists(path)) { + logger.debug("$XDG_RUNTIME_DIR is set to '{}' but the folder does not exist.", path); + return Optional.empty(); + } + Path socketPath = path.resolve("docker.sock"); + if (!Files.exists(socketPath)) { + logger.debug("$XDG_RUNTIME_DIR is set but '{}' does not exist.", socketPath); + return Optional.empty(); + } + return Optional.of(socketPath); + } + + private Optional tryFolder(Path path) { + if (!Files.exists(path)) { + logger.debug("'{}' does not exist.", path); + return Optional.empty(); + } + Path socketPath = path.resolve("docker.sock"); + if (!Files.exists(socketPath)) { + logger.debug("'{}' does not exist.", socketPath); + return Optional.empty(); + } + return Optional.of(socketPath); + } + + @Override + public String name() { + return "RootlessSourceProvider"; + } + + @Override + public Integer priority() { + return 5; + } + + @Override + public ApplicableResult isApplicable() { + if (!SystemUtils.IS_OS_LINUX) return ApplicableResult.fail("Must use linux!"); + Path resolve = resolveSocketPath(); + + if (resolve == null || !Files.exists(resolve)) return ApplicableResult.fail("Cannot find library used to run rootless!"); + + return ApplicableResult.success(); + } + + @Override + public URI makeURI(CreationOptions options) { + return URI.create("unix://" + resolveSocketPath().toString()); + } + + private interface LibC extends Library { + + LibC INSTANCE = Native.loadLibrary("c", LibC.class); + + int getUUID(); + } + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java index a97128a..94d60eb 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java @@ -13,6 +13,9 @@ import java.net.URI; import java.nio.file.Paths; +/** + * Client abstraction to allow source providers to only provide a URI + */ public abstract class SimpleSourceProvider implements DockerSourceProvider { @Override diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java index ba6a6a0..e11bfee 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java @@ -3,12 +3,15 @@ import com.github.dockerjava.core.DefaultDockerClientConfig; import xyz.auriium.tick.docker.source.*; +import java.net.URI; + /** * Provider that attempts to use system variables in order to provide a docker source * * Analogous to TestContainer's EnvironmentAndSystemPropertyClientProviderStrategy (geez) */ -public class SystemEnvSourceProvider implements DockerSourceProvider { +public class SystemEnvSourceProvider extends SimpleSourceProvider { + @Override public String name() { return "SystemEnvSourceProvider"; @@ -19,18 +22,13 @@ public Integer priority() { return 50; } - @Override - public DockerSource source(CreationOptions options) { - - DefaultDockerClientConfig.createDefaultConfigBuilder(); - - return null; - } - @Override public ApplicableResult isApplicable() { return System.getenv("DOCKER_HOST") != null ? ApplicableResult.success() : ApplicableResult.fail("System Environment Variables for docker could not be located or are null! Please fill them out!"); } - + @Override + public URI makeURI(CreationOptions options) { + return DefaultDockerClientConfig.createDefaultConfigBuilder().build().getDockerHost(); + } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java new file mode 100644 index 0000000..9e18c60 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java @@ -0,0 +1,57 @@ +package xyz.auriium.tick.docker.source.impl; + +import org.apache.commons.lang.SystemUtils; +import xyz.auriium.tick.docker.source.ApplicableResult; +import xyz.auriium.tick.docker.source.CreationOptions; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * Provider that uses unix's socket in order to provide a source handle + * + * Ripped from TestContainers + */ +public class UnixSourceProvider extends SimpleSourceProvider { + + protected static final String DOCKER_SOCK_PATH = "/var/run/docker.sock"; + private static final String SOCKET_LOCATION = "unix://" + DOCKER_SOCK_PATH; + private static final int SOCKET_FILE_MODE_MASK = 0xc000; + + + @Override + public String name() { + return "UnixSourceProvider"; + } + + @Override + public Integer priority() { + return 21; + } + + @Override + public ApplicableResult isApplicable() { + if (!(SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC)) return ApplicableResult.fail("System is not UNIX based!"); + + Integer mode; + try { + mode = (Integer) Files.getAttribute(Paths.get(DOCKER_SOCK_PATH), "unix:mode"); + } catch (IOException e) { + return ApplicableResult.fail("Could not find unix domain socket!"); + } + + if ((mode & 0xc000) != SOCKET_FILE_MODE_MASK) { + return ApplicableResult.fail("Found docker unix domain socket but file mode was not as expected (expected: srwxr-xr-x). This problem is possibly due to occurrence of this issue in the past: https://github.com/docker/docker/issues/13121"); + } + + return ApplicableResult.success(); + } + + @Override + public URI makeURI(CreationOptions options) { + return URI.create(SOCKET_LOCATION); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java new file mode 100644 index 0000000..cc88d6e --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java @@ -0,0 +1,38 @@ +package xyz.auriium.tick.docker.source.impl; + +import org.apache.commons.lang.SystemUtils; +import xyz.auriium.tick.docker.source.ApplicableResult; +import xyz.auriium.tick.docker.source.CreationOptions; + +import java.net.URI; + +/** + * Windows only Source Provider that uses npipe socket to provide a docker source handle + * + * Literally copy and pasted from TestContainers + */ +public class WindowsSourceProvider extends SimpleSourceProvider { + + protected static final String DOCKER_SOCK_PATH = "//./pipe/docker_engine"; + private static final String SOCKET_LOCATION = "npipe://" + DOCKER_SOCK_PATH; + + @Override + public String name() { + return "WindowsSourceProvider"; + } + + @Override + public Integer priority() { + return 20; + } + + @Override + public ApplicableResult isApplicable() { + return SystemUtils.IS_OS_WINDOWS ? ApplicableResult.success() : ApplicableResult.fail("OS must be windows to use NPIPE!"); + } + + @Override + public URI makeURI(CreationOptions options) { + return URI.create(SOCKET_LOCATION); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java b/tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java deleted file mode 100644 index c7cf42f..0000000 --- a/tickbox-api/src/test/java/xyz/auriium/tick/StartupIT.java +++ /dev/null @@ -1,18 +0,0 @@ -package xyz.auriium.tick; - - -import org.junit.jupiter.api.Test; - -/** - * Test that tests startup and initialization for each existing strategy - */ -public class StartupIT { - - @Test - public void initializeTick() { - Tick tick = new CommonTickFactory(null,null,null,null).produce(); - } - - - -} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java new file mode 100644 index 0000000..f85226c --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java @@ -0,0 +1,56 @@ +package xyz.auriium.tick; + + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.docker.image.CachedPullStrategyProvider; +import xyz.auriium.tick.docker.source.DockerSourceProvider; +import xyz.auriium.tick.docker.source.impl.ManualSourceProvider; +import xyz.auriium.tick.docker.source.impl.SystemEnvSourceProvider; + +import java.util.stream.Stream; + +/** + * Test that tests startup and initialization for each existing strategy + */ +public class TickCreationTest { + + private static final Logger logger = LoggerFactory.getLogger(TickCreationTest.class); + + @BeforeEach + void setUp(TestInfo testInfo) { + logger.info(String.format("test started: %s", testInfo.getDisplayName()); + } + @AfterEach + void tearDown(TestInfo testInfo) { + logger.info(String.format("test finished: %s", testInfo.getDisplayName()); + } + + @Test + public void shouldHandleBadProvider() { + Assertions.assertThrows + Tick tick = new CommonTickFactory(new ManualSourceProvider("fail"), ) + } + + @ParameterizedTest + @MethodSource("strategyParams") + public void produceTick(DockerSourceProvider provider) { + Tick tick = new CommonTickFactory(provider,new CachedPullStrategyProvider()).produce(); + } + + private static Stream strategyParams() { + return Stream.of( + Arguments.of(new SystemEnvSourceProvider()) + ); + } + + + +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java new file mode 100644 index 0000000..a50de44 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java @@ -0,0 +1,52 @@ +package xyz.auriium.tick.provider; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.CommonTickFactory; +import xyz.auriium.tick.Tick; +import xyz.auriium.tick.TickFactory; +import xyz.auriium.tick.container.container.JDBCContainer; +import xyz.auriium.tick.container.container.MariaDBContainer; +import xyz.auriium.tick.container.terms.mariadb.MariaDBTerms; +import xyz.auriium.tick.docker.image.CachedPullStrategyProvider; +import xyz.auriium.tick.docker.source.impl.UnixSourceProvider; + +import java.io.IOException; + +@EnabledOnOs({OS.LINUX, OS.MAC}) +public class UnixProviderTest { + + private static volatile Tick tick; + private static final Logger logger = LoggerFactory.getLogger(UnixProviderTest.class); + + @Test + @BeforeAll + public static void initializeTick() { + logger.info("Starting tick using UnixSourceProvider!"); + + tick = new CommonTickFactory(new UnixSourceProvider(), new CachedPullStrategyProvider()).produce(); + } + + @Test + public void createContainer() { + + logger.info("Creating a MariaDB Container!"); + + MariaDBTerms terms = new MariaDBTerms("root", "user", "pass", + "name", "container", 2); + + try (JDBCContainer container = tick.startupContainer(terms)) { + logger.info("Container started successfully! ID: " + container.getJDBCUrl()); + } catch (Exception e) { + throw new IllegalStateException(e); + } + + } + + +} From 3f6319ef692ae1e70169cc4b64bd7390d649b1e5 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 17 Jul 2021 18:16:31 -0700 Subject: [PATCH 14/23] implement resource management --- .idea/compiler.xml | 7 +- .idea/encodings.xml | 3 +- .idea/misc.xml | 2 + pom.xml | 3 +- readme.md | 22 +++++ .../java/xyz/auriium/tick/CommonTick.java | 70 -------------- .../xyz/auriium/tick/CommonTickFactory.java | 80 ---------------- .../src/main/java/xyz/auriium/tick/Tick.java | 29 ------ .../auriium/tick/centralized/CommonTick.java | 62 ++++++++++++ .../tick/centralized/CommonTickFactory.java | 95 +++++++++++++++++++ .../centralized/EmptyResourceManager.java | 36 +++++++ .../tick/centralized/HookResourceManager.java | 87 +++++++++++++++++ .../tick/centralized/ResourceManager.java | 19 ++++ .../centralized/ResourceManagerProvider.java | 9 ++ .../xyz/auriium/tick/centralized/Tick.java | 21 ++++ .../tick/{ => centralized}/TickFactory.java | 2 +- .../ArgumentsObject.java => Arguments.java} | 12 +-- .../tick/container/ContainerOptions.java | 21 ---- .../source => container}/CreationOptions.java | 19 +--- .../auriium/tick/container/CreationTerms.java | 26 +++++ .../auriium/tick/container/TickContainer.java | 26 +++++ .../container/ContainerStateManager.java | 11 --- .../container/container/DebianContainer.java | 4 - .../container/container/TickContainer.java | 13 --- .../tick/container/terms/CreationTerms.java | 14 --- .../tick/container/terms/JDBCTerms.java | 9 -- .../container/terms/termParts/Arguments.java | 15 --- .../container/terms/termParts/ImageToken.java | 7 -- .../tick/docker/DockerLocationImpl.java | 31 ------ .../InvalidProviderException.java | 4 +- .../tick/docker/image/CachedPullStrategy.java | 35 ------- .../image/CachedPullStrategyProvider.java | 10 -- .../tick/docker/image/CommonPoolStrategy.java | 59 ++++++++++++ .../tick/docker/image/PullStrategy.java | 12 ++- .../docker/image/PullStrategyProvider.java | 9 +- .../docker/source/DockerSourceProvider.java | 2 + .../source/impl/MachineSourceProvider.java | 1 + .../source/impl/ManualSourceProvider.java | 1 + .../source/impl/RootlessSourceProvider.java | 2 +- .../source/impl/SimpleSourceProvider.java | 2 +- .../source/impl/SystemEnvSourceProvider.java | 1 + .../source/impl/UnixSourceProvider.java | 3 +- .../source/impl/WindowsSourceProvider.java | 2 +- .../xyz/auriium/tick/model/Stoppable.java | 26 +++++ .../xyz/auriium/tick/ShutdownHookTest.java | 27 ++++++ .../src/test/java/xyz/auriium/tick/Test.java | 27 ++++++ .../xyz/auriium/tick/TickCreationTest.java | 56 ----------- .../auriium/tick/container/ArchContainer.java | 31 ++++++ .../xyz/auriium/tick/container/ArchTerms.java | 39 ++++++++ .../tick/provider/UnixProviderTest.java | 52 ---------- .../pom.xml | 13 ++- .../tick/containers/sql}/JDBCConfig.java | 2 +- .../tick/containers/sql}/JDBCContainer.java | 4 +- .../tick/containers/sql/JDBCTerms.java | 12 +++ .../sql/mariadb}/MariaDBContainer.java | 25 +++-- .../containers/sql}/mariadb/MariaDBTerms.java | 38 +++++--- tickbox-plugin/pom.xml | 59 ------------ .../auriium/tick/plugin/AbstractTickMojo.java | 38 -------- .../xyz/auriium/tick/plugin/CommonInits.java | 6 -- .../auriium/tick/plugin/CommonProviders.java | 71 -------------- .../xyz/auriium/tick/plugin/Initializer.java | 9 -- .../tick/plugin/MariaDBInitializer.java | 11 --- .../auriium/tick/plugin/PopulateGoalMojo.java | 52 ---------- 63 files changed, 724 insertions(+), 772 deletions(-) delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/Tick.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManagerProvider.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java rename tickbox-api/src/main/java/xyz/auriium/tick/{ => centralized}/TickFactory.java (73%) rename tickbox-api/src/main/java/xyz/auriium/tick/container/{terms/termParts/ArgumentsObject.java => Arguments.java} (80%) delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java rename tickbox-api/src/main/java/xyz/auriium/tick/{docker/source => container}/CreationOptions.java (51%) create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/container/TickContainer.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/terms/CreationTerms.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/terms/JDBCTerms.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/Arguments.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ImageToken.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/DockerLocationImpl.java rename tickbox-api/src/main/java/xyz/auriium/tick/{ => docker}/InvalidProviderException.java (72%) delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategy.java delete mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategyProvider.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CommonPoolStrategy.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/model/Stoppable.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/Test.java delete mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/container/ArchContainer.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/container/ArchTerms.java delete mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java rename {tickbox-plugin-tests => tickbox-containers-sql}/pom.xml (56%) rename {tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb => tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql}/JDBCConfig.java (95%) rename {tickbox-api/src/main/java/xyz/auriium/tick/container/container => tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql}/JDBCContainer.java (57%) create mode 100644 tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCTerms.java rename {tickbox-api/src/main/java/xyz/auriium/tick/container/container => tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb}/MariaDBContainer.java (54%) rename {tickbox-api/src/main/java/xyz/auriium/tick/container/terms => tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql}/mariadb/MariaDBTerms.java (56%) delete mode 100644 tickbox-plugin/pom.xml delete mode 100644 tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/AbstractTickMojo.java delete mode 100644 tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonInits.java delete mode 100644 tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonProviders.java delete mode 100644 tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/Initializer.java delete mode 100644 tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/MariaDBInitializer.java delete mode 100644 tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b932602..f652973 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -6,9 +6,8 @@ - - + @@ -21,7 +20,9 @@ - + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml index 39294b2..062fe59 100644 --- a/.idea/encodings.xml +++ b/.idea/encodings.xml @@ -2,6 +2,7 @@ - + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index ba2cd94..4a61276 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -17,6 +17,8 @@ diff --git a/pom.xml b/pom.xml index 9fa5af0..d1c0b92 100644 --- a/pom.xml +++ b/pom.xml @@ -15,8 +15,7 @@ tickbox-api - tickbox-plugin - tickbox-plugin-tests + tickbox-containers-sql diff --git a/readme.md b/readme.md index 85e7b7c..1401ae1 100644 --- a/readme.md +++ b/readme.md @@ -12,6 +12,28 @@ multiple tests.) # Warning +TickBox is not TestContainers. It isn't really even meant to fill the same role that testcontainers fills. +Tick is a general purpose container creation library fit for use with JDBC. TestContainers is explicitly for testing. + +While Tick is also very useful in the testing environment, Tick explicitly avoids hackery and "magic code" +that applications like TestContainers may implement in order to smoothen the testing experience. +In TestContainers, various reflective hacks are done in order to allow containers to stop at the end of a JUnit test. +A separate docker container is deployed just to make sure resources do not escape. (ryuk) + +In TestContainers, I try to explicitly avoid magic code/hackery/static abuse while also offering you the option of choice. +TestContainers is brittle and static in design, and if you want to change something you'll have to dig deep into +the archaic, bloated source code and edit it in yourself. If you want to change something in TickBox, write a new +implementation of a single interface, or change a value in a configuration object. + +The biggest part of TestContainers for me that I attempt to give choice with is the ResourceReaper, +or in our case, the ResourceManager. In TestContainers, it is a static part of the program +that is essential, forcing Ryuk and runtime shutdown hooks down your throat. Here, you may choose +if you would like the HookResourceManager (Features both automatic closing of containers on jvm shutdown +as well as closing of containers and images when the main Tick instance is closed) or the EmptyResourceManager +(which allows you to manually and explicitly remove resources left behind) + +# Unix Info + If you want to use TickBox on Unix (MacOS or Linux) make sure that Docker is set up so it does not need the sudo command to run. TickBox (And TestContainers) use console commands internally to interact with Docker and if access to Docker is limited you will get an error like so: diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java deleted file mode 100644 index 85ba124..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTick.java +++ /dev/null @@ -1,70 +0,0 @@ -package xyz.auriium.tick; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.CreateContainerResponse; -import com.github.dockerjava.api.model.HostConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import xyz.auriium.tick.container.ContainerOptions; -import xyz.auriium.tick.container.container.TickContainer; -import xyz.auriium.tick.container.terms.CreationTerms; -import xyz.auriium.tick.container.terms.termParts.Arguments; -import xyz.auriium.tick.docker.image.PullStrategy; -import xyz.auriium.tick.docker.source.DockerSource; - -import java.io.IOException; - -public class CommonTick implements Tick{ - - private final Logger logger = LoggerFactory.getLogger("(TICK | MANAGER)"); - - private final DockerSource location; - private final DockerClient client; - - private final PullStrategy strategy; - private final ContainerOptions options; - - public CommonTick(DockerSource location, DockerClient client, PullStrategy strategy, ContainerOptions options) { - this.location = location; - this.client = client; - this.strategy = strategy; - this.options = options; - } - - @Override - public DockerSource getSource() { - return location; - } - - @Override - public T startupContainer(CreationTerms termActual) throws InterruptedException { - Arguments terms = termActual.creationArguments(); - - if (strategy.shouldLoad(terms.getDockerImageName())) { - logger.info("Attempting to pull image with name: " + terms.getDockerImageName()); - - strategy.loadBlocking(terms.getDockerImageName()); //todo - - logger.info("Image load finished!"); - } - - logger.info("Initializing container with image: " + terms.getDockerImageName() + "! Assuming image is present!"); - - CreateContainerResponse response = client.createContainerCmd(terms.getDockerImageName()) - .withName(terms.getCreationName()) - .withEnv(terms.getParameters()) - .withHostConfig(new HostConfig() - .withPortBindings(terms.getBinding()) - ) - .exec(); - - client.startContainerCmd(response.getId()).exec(); - - return termActual.creation(location,client,options,response.getId()); - } - - @Override - public void close() throws IOException { - - } -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java deleted file mode 100644 index 0882e7d..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/CommonTickFactory.java +++ /dev/null @@ -1,80 +0,0 @@ -package xyz.auriium.tick; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.model.Version; -import xyz.auriium.tick.container.ContainerOptions; -import xyz.auriium.tick.docker.image.PullStrategyProvider; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import xyz.auriium.tick.docker.source.*; - -public class CommonTickFactory implements TickFactory{ - - private final DockerSourceProvider provider; - private final PullStrategyProvider strategy; - private final CreationOptions creationOptions; - private final ContainerOptions containerOptions; - - private final Logger logger = LoggerFactory.getLogger("(TICK | FACTORY)"); - - /** - * Create a new TickFactory that initializes Ticks with default specs - * @param provider the docker source provider to use in order to get a DockerClient instance - * @param strategy the pull strategy to use in order to handle pulling new images - * @param creationOptions client creation options that pertain to how {@param provider} can be called - * @param containerOptions options that are used once a client is created and a container is required. - */ - public CommonTickFactory(DockerSourceProvider provider, PullStrategyProvider strategy, CreationOptions creationOptions, ContainerOptions containerOptions) { - this.provider = provider; - this.strategy = strategy; - this.creationOptions = creationOptions; - this.containerOptions = containerOptions; - } - - /** - * Creates a new TickFactory with default settings - * @param provider the docker source provider to use in order to get a DockerClient instance - * @param strategy the pull strategy to use in order to handle pulling new images - */ - public CommonTickFactory(DockerSourceProvider provider, PullStrategyProvider strategy) { - this(provider,strategy, CreationOptions.defaults(),ContainerOptions.defaults()); - } - - @Override - public Tick produce() { - logger.info("Initializing tick startup, performing DockerSourceProvider pre-check!"); - - ApplicableResult result = provider.isApplicable(); - - if (!result.isApplicable()) { - logger.error(String.format("Attempt to check valid DockerClient using [%s] failed!", provider.name())); - logger.error(String.format("Reason: [%s]", result.getReason())); - throw new InvalidProviderException(); - } - - logger.info("Pre-check successful! Attempting to produce a DockerClient now."); - - DockerSource source = provider.source(creationOptions); - DockerClient client = source.getClient(); - - logger.info("Client produced successfully! Executing final startup activities..."); - - //TODO test the dockersource - run multiple client commands and a test startup/shutdown on it - if (creationOptions.isUsePostCreationTest()) { - logger.debug("Test would occur here!"); - } - - Version dockerVersion = client.versionCmd().exec(); - - logger.info("(DockerClient startup successful!" + "\n" + - "API version: " + dockerVersion.getApiVersion() + "\n" + - "Docker version: " + dockerVersion.getVersion() + "\n" + - "OS: " + dockerVersion.getOperatingSystem()); - - return new CommonTick(source, client, strategy.getStrategy(client), containerOptions); - - - - - } -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java b/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java deleted file mode 100644 index 7fcb03e..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/Tick.java +++ /dev/null @@ -1,29 +0,0 @@ -package xyz.auriium.tick; - -import xyz.auriium.tick.container.container.TickContainer; -import xyz.auriium.tick.container.terms.CreationTerms; -import xyz.auriium.tick.docker.source.DockerSource; - -import java.io.Closeable; - -/** - * Represents a prestarted Tick that can provide multiple containers - */ -public interface Tick extends Closeable { - - /** - * Gets the relevant source being used by this tick system - * @return the source - */ - DockerSource getSource(); - - /** - * Starts a container used - * @param terms - * @param - * @return - * @throws InterruptedException - */ - T startupContainer(CreationTerms terms) throws InterruptedException; - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java new file mode 100644 index 0000000..66c375e --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java @@ -0,0 +1,62 @@ +package xyz.auriium.tick.centralized; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.model.HostConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.container.CreationTerms; +import xyz.auriium.tick.container.TickContainer; +import xyz.auriium.tick.docker.image.PullStrategy; +import xyz.auriium.tick.docker.source.DockerSource; + +public class CommonTick implements Tick{ + + private final Logger logger = LoggerFactory.getLogger("(TICK | MANAGER)"); + + private final DockerSource location; + private final DockerClient client; + + private final PullStrategy strategy; + private final ResourceManager manager; + + public CommonTick(DockerSource location, PullStrategy strategy, ResourceManager manager) { + this.location = location; + this.client = location.getClient(); + this.strategy = strategy; + this.manager = manager; + } + + @Override + public T createContainer(CreationTerms terms) { + + strategy.shouldLoad(terms.getDockerImageName()); + + logger.info("Initializing container with image: " + terms.getDockerImageName() + "! Assuming image is present!"); + + CreateContainerResponse response = client.createContainerCmd(terms.getDockerImageName()) + .withName(terms.getContainerName()) + .withEnv(terms.getParameters()) + .withHostConfig(new HostConfig() + .withPortBindings(terms.getBinding()) + ) + .exec(); + + String id = response.getId(); + + manager.submitContainer(id,false); + logger.info("Container created! Starting container now."); + + + client.startContainerCmd(response.getId()).exec(); + manager.submitContainer(id,true); + logger.info("Container has been started successfully!"); + + return terms.instantiateHolder(location,manager,response.getId()); + } + + @Override + public void stop() { + manager.stop(); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java new file mode 100644 index 0000000..46ac93a --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java @@ -0,0 +1,95 @@ +package xyz.auriium.tick.centralized; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Version; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.container.CreationOptions; +import xyz.auriium.tick.docker.InvalidProviderException; +import xyz.auriium.tick.docker.image.PullStrategyProvider; +import xyz.auriium.tick.docker.source.*; + +/** + * Common implementation of the tick factory + */ +public class CommonTickFactory implements TickFactory{ + + private final DockerSourceProvider sourceProvider; + private final PullStrategyProvider strategyProvider; + private final ResourceManagerProvider resourceManager; + private final CreationOptions creationOptions; + + private final Logger logger = LoggerFactory.getLogger("(TICK | FACTORY)"); + + /** + * Create a new TickFactory that initializes Ticks with default specs + * @param sourceProvider the docker source provider to use in order to get a DockerClient instance + * @param strategyProvider the pull strategy to use in order to handle pulling new images + * @param resourceManager the resource manager which handles destroying docker containers on tick shutdown. + * If you do not want to use one of these, use the {@link EmptyResourceManager} + * @param creationOptions client creation options that pertain to how {@param provider} can be called + */ + public CommonTickFactory(DockerSourceProvider sourceProvider, PullStrategyProvider strategyProvider, ResourceManagerProvider resourceManager, CreationOptions creationOptions) { + this.sourceProvider = sourceProvider; + this.strategyProvider = strategyProvider; + this.resourceManager = resourceManager; + this.creationOptions = creationOptions; + } + + /** + * Creates a new TickFactory with default settings + * @param manager the resource manager to use. If you are looking for the suggested default, use {@link HookResourceManager.Provider} + * However, if you want a resource manager that does not use a shutdown hook in order + * to produce a maven plugin, use {@link EmptyResourceManager.Provider} + * + * @param sourceProvider the docker source provider to use in order to get a DockerClient instance + * @param strategyProvider the pull strategy to use in order to handle pulling new images + */ + public CommonTickFactory(ResourceManagerProvider manager, DockerSourceProvider sourceProvider, PullStrategyProvider strategyProvider) { + this(sourceProvider, strategyProvider, manager, CreationOptions.defaults()); + } + + @Override + public Tick produce() { + logger.info("Initializing tick startup, performing DockerSourceProvider pre-check!"); + + ApplicableResult result = sourceProvider.isApplicable(); + + if (!result.isApplicable()) { + logger.error(String.format("Attempt to check valid DockerClient using [%s] failed!", sourceProvider.name())); + logger.error(String.format("Reason: [%s]", result.getReason())); + throw new InvalidProviderException(); + } + + logger.info("Pre-check successful! Attempting to produce a DockerClient now."); + + DockerSource source = sourceProvider.source(creationOptions); + DockerClient client = source.getClient(); + + logger.info("Client produced successfully! Executing final startup activities..."); + + //TODO test the dockersource - run multiple client commands and a test startup/shutdown on it + if (creationOptions.isUsePostCreationTest()) { + logger.debug("Test would occur here!"); + } + + Version dockerVersion = client.versionCmd().exec(); + + logger.info("(DockerClient startup successful!" + "\n" + + "API version: " + dockerVersion.getApiVersion() + "\n" + + "Docker version: " + dockerVersion.getVersion() + "\n" + + "OS: " + dockerVersion.getOperatingSystem()); + + logger.info("Starting up resource manager implementation!"); + + ResourceManager manager = resourceManager.make(source); + + logger.info("Resource manager online!"); + + return new CommonTick(source, strategyProvider.provide(client, manager), manager); + + + + + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java new file mode 100644 index 0000000..7a7bd59 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java @@ -0,0 +1,36 @@ +package xyz.auriium.tick.centralized; + +import xyz.auriium.tick.docker.source.DockerSource; + +public class EmptyResourceManager implements ResourceManager{ + + EmptyResourceManager() {} + + @Override + public void submitContainer(String id, boolean val) { + + } + + @Override + public void destroyContainer(String id) { + + } + + @Override + public void submitImage(String imageName) { + + } + + @Override + public void stop() { + + } + + public static class Provider implements ResourceManagerProvider { + + @Override + public ResourceManager make(DockerSource source) { + return new EmptyResourceManager(); + } + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java new file mode 100644 index 0000000..5260f1a --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java @@ -0,0 +1,87 @@ +package xyz.auriium.tick.centralized; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.docker.source.DockerSource; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class HookResourceManager implements ResourceManager { //toInterface + + private final Map containers = new ConcurrentHashMap<>(); + private final Set images = ConcurrentHashMap.newKeySet(); + + private final Logger logger = LoggerFactory.getLogger("(TICK | HookResourceManager)"); + private final DockerSource dockerSource; + + HookResourceManager(DockerSource dockerSource) { + this.dockerSource = dockerSource; + } + + /** + * Sets the state of a container into the manager + * @param id the id of the container + * @param val true if the container is started, false if it is not. + */ + @Override + public void submitContainer(String id, boolean val) { + this.containers.put(id,val); + } + + @Override + public void submitImage(String imageName) { + this.images.add(imageName); + } + + /** + * Shuts down a container if it is not already shut down. + * @param id the identification number of the container to destroy + */ + @Override + public void destroyContainer(String id) { + boolean shutDown = this.containers.remove(id); + + if (shutDown) { + + logger.info("Stopping container: {}", id); + dockerSource.getClient().killContainerCmd(id).exec(); + logger.info("Stopped container!"); + + } + + logger.info("Removing container: {}", id); + dockerSource.getClient().removeContainerCmd(id).withRemoveVolumes(true).withForce(true).exec(); + logger.info("Removed container and associated volume(s)!"); + } + + public void stop() { + containers.forEach((str, aBoolean) -> destroyContainer(str)); + } + + public static class Provider implements ResourceManagerProvider { + + private final Logger logger = LoggerFactory.getLogger("(TICK | HookResourceProvider)"); + private final boolean useShutdownHook; + + public Provider(boolean useShutdownHook) { + this.useShutdownHook = useShutdownHook; + } + + @Override + public ResourceManager make(DockerSource source) { + ResourceManager manager = new HookResourceManager(source); + + if (useShutdownHook) { + logger.info("Attempting to attach shutdown hook now!"); + Runtime.getRuntime().addShutdownHook(new Thread(manager::stop)); + } + + return manager; + } + } + + + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java new file mode 100644 index 0000000..c098b6c --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java @@ -0,0 +1,19 @@ +package xyz.auriium.tick.centralized; + +import xyz.auriium.tick.model.Stoppable; + +/** + * Manages resources for the tick system + */ +public interface ResourceManager extends Stoppable { + + void submitContainer(String id, boolean val); + void destroyContainer(String id); + + /** + * Inserts an image into the manager for later cleanup + * @param imageName the name of the image + */ + void submitImage(String imageName); + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManagerProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManagerProvider.java new file mode 100644 index 0000000..3852bfa --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManagerProvider.java @@ -0,0 +1,9 @@ +package xyz.auriium.tick.centralized; + +import xyz.auriium.tick.docker.source.DockerSource; + +public interface ResourceManagerProvider { + + ResourceManager make(DockerSource source); + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java new file mode 100644 index 0000000..cef98d5 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java @@ -0,0 +1,21 @@ +package xyz.auriium.tick.centralized; + +import xyz.auriium.tick.container.CreationTerms; +import xyz.auriium.tick.container.TickContainer; +import xyz.auriium.tick.model.Stoppable; + +/** + * Entry point into the tick api, allows for the creation of dockerized containers. + * Must be stopped manually if you don't use a resource manager + */ +public interface Tick extends Stoppable { + + /** + * Creates and starts a new container according to the terms provided + * @param terms the terms of creation used to generate the tick + * @param the type of container + * @return a new container + */ + T createContainer(CreationTerms terms); + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/TickFactory.java similarity index 73% rename from tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java rename to tickbox-api/src/main/java/xyz/auriium/tick/centralized/TickFactory.java index 010ee36..6882ab7 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/TickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/TickFactory.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick; +package xyz.auriium.tick.centralized; /** * Represents something that can make Ticks diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ArgumentsObject.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/Arguments.java similarity index 80% rename from tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ArgumentsObject.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/Arguments.java index 7e6df72..7fc1c75 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ArgumentsObject.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/Arguments.java @@ -1,17 +1,17 @@ -package xyz.auriium.tick.container.terms.termParts; +package xyz.auriium.tick.container; import com.github.dockerjava.api.model.PortBinding; import java.util.Objects; -public class ArgumentsObject implements Arguments { +public class Arguments { private final String creationName; private final String dockerImageName; private final String[] parameters; private final PortBinding binding; - public ArgumentsObject(String creationName, String dockerImageName, String[] parameters, PortBinding binding) { + public Arguments(String creationName, String dockerImageName, String[] parameters, PortBinding binding) { this.creationName = creationName; this.dockerImageName = dockerImageName; this.parameters = parameters; @@ -30,7 +30,7 @@ public PortBinding getBinding() { return this.binding; } - public String getCreationName() { + public String getContainerName() { return this.creationName; } @@ -67,13 +67,13 @@ public Builder withCreationName(String name) { return this; } - public ArgumentsObject build() { + public Arguments build() { Objects.requireNonNull(dockerImageName); Objects.requireNonNull(params); Objects.requireNonNull(biniding); Objects.requireNonNull(creationName); - return new ArgumentsObject(creationName, dockerImageName,params, biniding); + return new Arguments(creationName, dockerImageName,params, biniding); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java deleted file mode 100644 index aeb4888..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/ContainerOptions.java +++ /dev/null @@ -1,21 +0,0 @@ -package xyz.auriium.tick.container; - -/** - * Options that pertain to the creation of containers - */ -public class ContainerOptions { - - private final int containerShutdownWait; - - public ContainerOptions(int containerShutdownWait) { - this.containerShutdownWait = containerShutdownWait; - } - - public int getContainerShutdownWait() { - return containerShutdownWait; - } - - public static ContainerOptions defaults() { - return new ContainerOptions(500); - } -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationOptions.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationOptions.java similarity index 51% rename from tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationOptions.java rename to tickbox-api/src/main/java/xyz/auriium/tick/container/CreationOptions.java index 1615f32..f3e3c17 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/CreationOptions.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationOptions.java @@ -1,27 +1,16 @@ -package xyz.auriium.tick.docker.source; +package xyz.auriium.tick.container; -/** - * Options that pertain to the creation of the docker client - */ public class CreationOptions { + + private final boolean usePostCreationTest; private final boolean withTLS; - /** - * Option details for client options - * @param usePostCreationTest whether to use the post creation test - * to check if a completed docker client actually works. - * This is tested by creating a new container and immediately killing it. - * - * @param withTLS whether to use TLS with created containers or not - * - */ public CreationOptions(boolean usePostCreationTest, boolean withTLS) { this.usePostCreationTest = usePostCreationTest; this.withTLS = withTLS; } - public boolean isUsePostCreationTest() { return usePostCreationTest; } @@ -30,7 +19,9 @@ public boolean isWithTLS() { return withTLS; } + public static CreationOptions defaults() { return new CreationOptions(true, false); } + } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java new file mode 100644 index 0000000..f6be054 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java @@ -0,0 +1,26 @@ +package xyz.auriium.tick.container; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.PortBinding; +import xyz.auriium.tick.centralized.ResourceManager; +import xyz.auriium.tick.docker.source.DockerSource; + +public interface CreationTerms { + + String getDockerImageName(); + + String[] getParameters(); + + PortBinding getBinding(); + + String getContainerName(); + + /** + * Method used to describe the creation of the actual container + * + * @param location the dockersource used + * @param dockerID the identifier of the container + * @return a new container object + */ + T instantiateHolder(DockerSource location, ResourceManager manager, String dockerID); +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java new file mode 100644 index 0000000..c73804a --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java @@ -0,0 +1,26 @@ +package xyz.auriium.tick.container; + +import xyz.auriium.tick.model.Stoppable; + +/** + * Represents an already created Container that can start and stop itself + */ +public interface TickContainer extends AutoCloseable{ + + String containerName(); + String containerID(); + + /** + * Calling this method will stop and then destroy this tick container docker-side. + * After the container is destroyed do not attempt to invoke it. + */ + void destroy(); + + /** + * Invokes {@link TickContainer#destroy()} + */ + default void close() { + destroy(); + } + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java deleted file mode 100644 index 7f3b73f..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/ContainerStateManager.java +++ /dev/null @@ -1,11 +0,0 @@ -package xyz.auriium.tick.container.container; - -import java.util.Set; - -public interface ContainerStateManager { - - Set getAllContainerIDs(); - - void stop(); - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java deleted file mode 100644 index 4a542c9..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/DebianContainer.java +++ /dev/null @@ -1,4 +0,0 @@ -package xyz.auriium.tick.container.container; - -public class DebianContainer { -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/TickContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/container/TickContainer.java deleted file mode 100644 index db8e518..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/TickContainer.java +++ /dev/null @@ -1,13 +0,0 @@ -package xyz.auriium.tick.container.container; - -/** - * Represents an already created Container that can start and stop itself - * - * TODO some kind of idempotcy checks to make sure that when a container is closed it's removed - */ -public interface TickContainer extends AutoCloseable { - - String managedContainerName(); - String containerID(); - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/CreationTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/CreationTerms.java deleted file mode 100644 index 1bf6bbd..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/CreationTerms.java +++ /dev/null @@ -1,14 +0,0 @@ -package xyz.auriium.tick.container.terms; - -import com.github.dockerjava.api.DockerClient; -import xyz.auriium.tick.container.ContainerOptions; -import xyz.auriium.tick.container.container.TickContainer; -import xyz.auriium.tick.container.terms.termParts.Arguments; -import xyz.auriium.tick.docker.source.DockerSource; - -public interface CreationTerms { - - Arguments creationArguments(); - - T creation(DockerSource location, DockerClient client, ContainerOptions options, String dockerID); -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/JDBCTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/JDBCTerms.java deleted file mode 100644 index d57019b..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/JDBCTerms.java +++ /dev/null @@ -1,9 +0,0 @@ -package xyz.auriium.tick.container.terms; - -import xyz.auriium.tick.container.container.JDBCContainer; - -public interface JDBCTerms extends CreationTerms { - - - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/Arguments.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/Arguments.java deleted file mode 100644 index e664ae7..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/Arguments.java +++ /dev/null @@ -1,15 +0,0 @@ -package xyz.auriium.tick.container.terms.termParts; - -import com.github.dockerjava.api.model.PortBinding; - -public interface Arguments { - - String getDockerImageName(); - - String[] getParameters(); - - PortBinding getBinding(); - - String getCreationName(); - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ImageToken.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ImageToken.java deleted file mode 100644 index cc5de4b..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/termParts/ImageToken.java +++ /dev/null @@ -1,7 +0,0 @@ -package xyz.auriium.tick.container.terms.termParts; - -public interface ImageToken { - - String toImageString(); - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/DockerLocationImpl.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/DockerLocationImpl.java deleted file mode 100644 index 60b14c8..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/DockerLocationImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package xyz.auriium.tick.docker; - -import com.github.dockerjava.transport.SSLConfig; -import xyz.auriium.tick.docker.source.DockerLocation; - -public class DockerLocationImpl implements DockerLocation { - - private final String ip; - private final String url; - private final SSLConfig config; - - public DockerLocationImpl(String ip, String url, SSLConfig config) { - this.ip = ip; - this.url = url; - this.config = config; - } - - public String getIp() { - return ip; - } - - public String getUrl() { - return url; - } - - @Override - public SSLConfig getSSLConfig() { - return config; - } - -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/InvalidProviderException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/InvalidProviderException.java similarity index 72% rename from tickbox-api/src/main/java/xyz/auriium/tick/InvalidProviderException.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/InvalidProviderException.java index 1d8ff13..2762277 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/InvalidProviderException.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/InvalidProviderException.java @@ -1,8 +1,8 @@ -package xyz.auriium.tick; +package xyz.auriium.tick.docker; public class InvalidProviderException extends RuntimeException { - InvalidProviderException() { + public InvalidProviderException() { super("A provider that was provided was unable to meet it's requirements for launch! See logs for details."); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategy.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategy.java deleted file mode 100644 index 10b0dec..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategy.java +++ /dev/null @@ -1,35 +0,0 @@ -package xyz.auriium.tick.docker.image; - -import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.exception.NotFoundException; - -import java.util.concurrent.TimeUnit; - -public class CachedPullStrategy implements PullStrategy{ - //This is blocking. I don't want it to be blocking, but docker-java-api's callbacks are gross and i'd rather work - //with futures. Adapting their callbacks to futures will be ugly and shitty and i don't want to. - - private final DockerClient client; - - public CachedPullStrategy(DockerClient client) { - this.client = client; - } - - @Override - public boolean shouldLoad(String dockerImageName) { - //any suggestions on how to improve this logic? - try { - client.inspectImageCmd(dockerImageName).exec(); - - return true; - } catch (NotFoundException exception) { - return false; - } - } - - @Override - public void loadBlocking(String dockerImageName) throws InterruptedException { - client.pullImageCmd(dockerImageName).exec(new LoggingPullResultCallback()) - .awaitCompletion(30, TimeUnit.SECONDS); //blocking - } -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategyProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategyProvider.java deleted file mode 100644 index 500e9b2..0000000 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CachedPullStrategyProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package xyz.auriium.tick.docker.image; - -import com.github.dockerjava.api.DockerClient; - -public class CachedPullStrategyProvider implements PullStrategyProvider{ - @Override - public CachedPullStrategy getStrategy(DockerClient client) { - return new CachedPullStrategy(client); - } -} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CommonPoolStrategy.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CommonPoolStrategy.java new file mode 100644 index 0000000..3f5adf6 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CommonPoolStrategy.java @@ -0,0 +1,59 @@ +package xyz.auriium.tick.docker.image; + +import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.exception.NotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import xyz.auriium.tick.centralized.ResourceManager; + +import java.util.concurrent.TimeUnit; + +public class CommonPoolStrategy implements PullStrategy { + + private final Logger logger = LoggerFactory.getLogger("(TICK | Cached Blocking Strategy)"); + + private final DockerClient client; + private final ResourceManager manager; + + public CommonPoolStrategy(DockerClient client, ResourceManager manager) { + this.client = client; + this.manager = manager; + } + + @Override + public boolean shouldLoad(String dockerImageName) { + try { + client.inspectImageCmd(dockerImageName).exec(); + return true; + } catch (NotFoundException exception) { + return false; + } + } + + @Override + public void load(String dockerImageName) { + + logger.info("Attempting to pull image with name: " + dockerImageName); + + try { + + client.pullImageCmd(dockerImageName).exec(new LoggingPullResultCallback()) + .awaitCompletion(30, TimeUnit.SECONDS); + + manager.submitImage(dockerImageName); + + logger.info("Image load finished!"); + } catch (InterruptedException exception) { + logger.error("An exception occurred while loading an image: ", exception); + } + + } + + public static class Provider implements PullStrategyProvider { + @Override + public CommonPoolStrategy provide(DockerClient client, ResourceManager manager) { + return new CommonPoolStrategy(client, manager); + } + } + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategy.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategy.java index c26b79e..da02fc6 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategy.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategy.java @@ -1,9 +1,17 @@ package xyz.auriium.tick.docker.image; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + public interface PullStrategy { boolean shouldLoad(String dockerImageName); - void loadBlocking(String dockerImageName) throws InterruptedException; //TODO not blocking (This would be a hell of a lot - // easier if the docker-java api simply used futures and not this convoluted callback system) + void load(String dockerImageName); + + default void loadIfRequired(String name) { + if (shouldLoad(name)) { + load(name); + } + } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java index 2cf0422..6abd567 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java @@ -1,9 +1,14 @@ package xyz.auriium.tick.docker.image; import com.github.dockerjava.api.DockerClient; +import xyz.auriium.tick.centralized.ResourceManager; -public interface PullStrategyProvider { +/** + * Provider that exists in order to allow user to specify a strategy without actually initializing one + * since client initialization is done tick-side + */ +public interface PullStrategyProvider { - T getStrategy(DockerClient client); + CommonPoolStrategy provide(DockerClient client, ResourceManager manager); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java index 9ec1bcc..f1344cc 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java @@ -1,5 +1,7 @@ package xyz.auriium.tick.docker.source; +import xyz.auriium.tick.container.CreationOptions; + public interface DockerSourceProvider { String name(); diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java index 5af6300..9f0a57c 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import org.zeroturnaround.exec.ProcessExecutor; import org.zeroturnaround.exec.ProcessResult; +import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.*; import java.io.File; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java index cdc84e8..d917b19 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ManualSourceProvider.java @@ -1,5 +1,6 @@ package xyz.auriium.tick.docker.source.impl; +import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.*; import java.net.URI; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java index 31d5c9d..b8152a9 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java @@ -6,8 +6,8 @@ import org.apache.commons.lang.SystemUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.ApplicableResult; -import xyz.auriium.tick.docker.source.CreationOptions; import java.net.URI; import java.nio.file.Files; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java index 94d60eb..409d703 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java @@ -6,7 +6,7 @@ import com.github.dockerjava.core.LocalDirectorySSLConfig; import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; import com.github.dockerjava.transport.DockerHttpClient; -import xyz.auriium.tick.docker.source.CreationOptions; +import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.DockerSource; import xyz.auriium.tick.docker.source.DockerSourceProvider; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java index e11bfee..433700b 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SystemEnvSourceProvider.java @@ -1,6 +1,7 @@ package xyz.auriium.tick.docker.source.impl; import com.github.dockerjava.core.DefaultDockerClientConfig; +import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.*; import java.net.URI; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java index 9e18c60..bf65898 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java @@ -1,13 +1,12 @@ package xyz.auriium.tick.docker.source.impl; import org.apache.commons.lang.SystemUtils; +import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.ApplicableResult; -import xyz.auriium.tick.docker.source.CreationOptions; import java.io.IOException; import java.net.URI; import java.nio.file.Files; -import java.nio.file.Path; import java.nio.file.Paths; /** diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java index cc88d6e..0dcae36 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java @@ -1,8 +1,8 @@ package xyz.auriium.tick.docker.source.impl; import org.apache.commons.lang.SystemUtils; +import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.ApplicableResult; -import xyz.auriium.tick.docker.source.CreationOptions; import java.net.URI; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/model/Stoppable.java b/tickbox-api/src/main/java/xyz/auriium/tick/model/Stoppable.java new file mode 100644 index 0000000..535f26e --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/model/Stoppable.java @@ -0,0 +1,26 @@ +package xyz.auriium.tick.model; + +import java.io.Closeable; +import java.io.IOException; + +/** + * Simple interface that offers a more definite term than closeable + * (Stop offers more context to a running service than close) + * + * Implements closeable in order to provide autocloseable functionality. + */ +public interface Stoppable extends Closeable { + + /** + * Stops the service + */ + void stop(); + + /** + * auto invoke + */ + @Override + default void close() throws IOException { + stop(); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java new file mode 100644 index 0000000..6008ea6 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java @@ -0,0 +1,27 @@ +package xyz.auriium.tick; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.centralized.Tick; +import xyz.auriium.tick.docker.image.CommonPoolStrategy; +import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; + +@EnabledOnOs(OS.LINUX) +public class ShutdownHookTest { + + private static volatile Tick tick; + + @BeforeAll + public static void startup() { + tick = new CommonTickFactory( + new HookResourceManager.Provider(true), + new WindowsSourceProvider(), + new CommonPoolStrategy.Provider()).produce(); + } + + +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/Test.java b/tickbox-api/src/test/java/xyz/auriium/tick/Test.java new file mode 100644 index 0000000..a82bc5d --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/Test.java @@ -0,0 +1,27 @@ +package xyz.auriium.tick; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.centralized.Tick; +import xyz.auriium.tick.docker.image.CommonPoolStrategy; +import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; + +public class Test { + + private static volatile Tick tick; + + @BeforeAll + public static void startup() { + tick = new CommonTickFactory( + new HookResourceManager.Provider(true), + new WindowsSourceProvider(), + new CommonPoolStrategy.Provider()).produce(); + } + + @AfterAll + public static void teardown() { + tick.stop(); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java deleted file mode 100644 index f85226c..0000000 --- a/tickbox-api/src/test/java/xyz/auriium/tick/TickCreationTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package xyz.auriium.tick; - - -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.TestInfo; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import xyz.auriium.tick.docker.image.CachedPullStrategyProvider; -import xyz.auriium.tick.docker.source.DockerSourceProvider; -import xyz.auriium.tick.docker.source.impl.ManualSourceProvider; -import xyz.auriium.tick.docker.source.impl.SystemEnvSourceProvider; - -import java.util.stream.Stream; - -/** - * Test that tests startup and initialization for each existing strategy - */ -public class TickCreationTest { - - private static final Logger logger = LoggerFactory.getLogger(TickCreationTest.class); - - @BeforeEach - void setUp(TestInfo testInfo) { - logger.info(String.format("test started: %s", testInfo.getDisplayName()); - } - @AfterEach - void tearDown(TestInfo testInfo) { - logger.info(String.format("test finished: %s", testInfo.getDisplayName()); - } - - @Test - public void shouldHandleBadProvider() { - Assertions.assertThrows - Tick tick = new CommonTickFactory(new ManualSourceProvider("fail"), ) - } - - @ParameterizedTest - @MethodSource("strategyParams") - public void produceTick(DockerSourceProvider provider) { - Tick tick = new CommonTickFactory(provider,new CachedPullStrategyProvider()).produce(); - } - - private static Stream strategyParams() { - return Stream.of( - Arguments.of(new SystemEnvSourceProvider()) - ); - } - - - -} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchContainer.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchContainer.java new file mode 100644 index 0000000..a063dda --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchContainer.java @@ -0,0 +1,31 @@ +package xyz.auriium.tick.container; + +import xyz.auriium.tick.centralized.ResourceManager; + +public class ArchContainer implements TickContainer{ + + private final ResourceManager manager; + private final String name; + private final String id; + + public ArchContainer(ResourceManager manager, String name, String id) { + this.manager = manager; + this.name = name; + this.id = id; + } + + @Override + public String containerName() { + return name; + } + + @Override + public String containerID() { + return id; + } + + @Override + public void destroy() { + manager.destroyContainer(id); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchTerms.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchTerms.java new file mode 100644 index 0000000..32a8a24 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchTerms.java @@ -0,0 +1,39 @@ +package xyz.auriium.tick.container; + +import com.github.dockerjava.api.model.PortBinding; +import xyz.auriium.tick.centralized.ResourceManager; +import xyz.auriium.tick.docker.source.DockerSource; + +public class ArchTerms implements CreationTerms{ + + private final String name; + + public ArchTerms(String name) { + this.name = name; + } + + @Override + public String getDockerImageName() { + return "archlinux:latest"; + } + + @Override + public String[] getParameters() { + return new String[0]; + } + + @Override + public PortBinding getBinding() { + return PortBinding.parse(""); + } + + @Override + public String getContainerName() { + return name; + } + + @Override + public ArchContainer instantiateHolder(DockerSource location, ResourceManager manager, String dockerID) { + return new ArchContainer(manager, name, dockerID); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java deleted file mode 100644 index a50de44..0000000 --- a/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package xyz.auriium.tick.provider; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.condition.EnabledOnOs; -import org.junit.jupiter.api.condition.OS; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import xyz.auriium.tick.CommonTickFactory; -import xyz.auriium.tick.Tick; -import xyz.auriium.tick.TickFactory; -import xyz.auriium.tick.container.container.JDBCContainer; -import xyz.auriium.tick.container.container.MariaDBContainer; -import xyz.auriium.tick.container.terms.mariadb.MariaDBTerms; -import xyz.auriium.tick.docker.image.CachedPullStrategyProvider; -import xyz.auriium.tick.docker.source.impl.UnixSourceProvider; - -import java.io.IOException; - -@EnabledOnOs({OS.LINUX, OS.MAC}) -public class UnixProviderTest { - - private static volatile Tick tick; - private static final Logger logger = LoggerFactory.getLogger(UnixProviderTest.class); - - @Test - @BeforeAll - public static void initializeTick() { - logger.info("Starting tick using UnixSourceProvider!"); - - tick = new CommonTickFactory(new UnixSourceProvider(), new CachedPullStrategyProvider()).produce(); - } - - @Test - public void createContainer() { - - logger.info("Creating a MariaDB Container!"); - - MariaDBTerms terms = new MariaDBTerms("root", "user", "pass", - "name", "container", 2); - - try (JDBCContainer container = tick.startupContainer(terms)) { - logger.info("Container started successfully! ID: " + container.getJDBCUrl()); - } catch (Exception e) { - throw new IllegalStateException(e); - } - - } - - -} diff --git a/tickbox-plugin-tests/pom.xml b/tickbox-containers-sql/pom.xml similarity index 56% rename from tickbox-plugin-tests/pom.xml rename to tickbox-containers-sql/pom.xml index 14bc969..f78d1ec 100644 --- a/tickbox-plugin-tests/pom.xml +++ b/tickbox-containers-sql/pom.xml @@ -9,11 +9,18 @@ 4.0.0 - tickbox-integrated-tests + tickbox-containers-sql - 16 - 16 + ${compiler.version} + ${compiler.version} + + + xyz.auriium + tickbox-api + + + \ No newline at end of file diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/JDBCConfig.java b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCConfig.java similarity index 95% rename from tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/JDBCConfig.java rename to tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCConfig.java index 9ab5278..a227ba3 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/JDBCConfig.java +++ b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCConfig.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.container.terms.mariadb; +package xyz.auriium.tick.containers.sql; public class JDBCConfig { diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/JDBCContainer.java b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCContainer.java similarity index 57% rename from tickbox-api/src/main/java/xyz/auriium/tick/container/container/JDBCContainer.java rename to tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCContainer.java index 237563b..085e103 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/JDBCContainer.java +++ b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCContainer.java @@ -1,4 +1,6 @@ -package xyz.auriium.tick.container.container; +package xyz.auriium.tick.containers.sql; + +import xyz.auriium.tick.container.TickContainer; public interface JDBCContainer extends TickContainer { diff --git a/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCTerms.java b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCTerms.java new file mode 100644 index 0000000..cddb6c7 --- /dev/null +++ b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/JDBCTerms.java @@ -0,0 +1,12 @@ +package xyz.auriium.tick.containers.sql; + +import xyz.auriium.tick.container.CreationTerms; + +/** + * Marker interface for terms that use jdbc + */ +public interface JDBCTerms extends CreationTerms { + + + +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBContainer.java similarity index 54% rename from tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java rename to tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBContainer.java index 9afde35..5bd9d53 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/container/MariaDBContainer.java +++ b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBContainer.java @@ -1,28 +1,27 @@ -package xyz.auriium.tick.container.container; +package xyz.auriium.tick.containers.sql.mariadb; -import com.github.dockerjava.api.DockerClient; -import xyz.auriium.tick.container.ContainerOptions; +import xyz.auriium.tick.centralized.ResourceManager; import xyz.auriium.tick.container.JDBCUrlBuilder; -import xyz.auriium.tick.container.terms.mariadb.JDBCConfig; +import xyz.auriium.tick.containers.sql.JDBCConfig; +import xyz.auriium.tick.containers.sql.JDBCContainer; import xyz.auriium.tick.docker.source.DockerSource; public class MariaDBContainer implements JDBCContainer { + private final ResourceManager manager; private final DockerSource location; - private final DockerClient client; - private final ContainerOptions options; private final String containerID; private final JDBCConfig config; - public MariaDBContainer(DockerSource location, DockerClient client, ContainerOptions options, String containerID, JDBCConfig config) { + public MariaDBContainer(ResourceManager manager, DockerSource location, String containerID, JDBCConfig config) { + this.manager = manager; this.location = location; - this.client = client; - this.options = options; this.containerID = containerID; this.config = config; } + @Override public String getJDBCUrl() { return new JDBCUrlBuilder() @@ -33,7 +32,7 @@ public String getJDBCUrl() { } @Override - public String managedContainerName() { + public String containerName() { return config.getContainerName(); } @@ -43,8 +42,8 @@ public String containerID() { } @Override - public void close() { - client.stopContainerCmd(containerID).withTimeout(options.getContainerShutdownWait()).exec(); - client.removeContainerCmd(containerID).exec(); + public void destroy() { + manager.destroyContainer(containerID); } + } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/MariaDBTerms.java b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java similarity index 56% rename from tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/MariaDBTerms.java rename to tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java index d4bd64e..3332ecc 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/terms/mariadb/MariaDBTerms.java +++ b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java @@ -1,13 +1,11 @@ -package xyz.auriium.tick.container.terms.mariadb; +package xyz.auriium.tick.containers.sql.mariadb; -import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.PortBinding; -import xyz.auriium.tick.container.ContainerOptions; -import xyz.auriium.tick.container.container.JDBCContainer; -import xyz.auriium.tick.container.container.MariaDBContainer; -import xyz.auriium.tick.container.terms.JDBCTerms; -import xyz.auriium.tick.container.terms.termParts.Arguments; -import xyz.auriium.tick.container.terms.termParts.ArgumentsObject; +import xyz.auriium.tick.centralized.ResourceManager; +import xyz.auriium.tick.containers.sql.JDBCConfig; +import xyz.auriium.tick.containers.sql.JDBCContainer; +import xyz.auriium.tick.containers.sql.JDBCTerms; +import xyz.auriium.tick.container.Arguments; import xyz.auriium.tick.docker.source.DockerSource; /** @@ -25,7 +23,7 @@ public class MariaDBTerms implements JDBCTerms { public MariaDBTerms(String rootPassword, String databaseUsername, String databasePassword, String databaseName, String containerName, int portBinding) { this.config = new JDBCConfig(rootPassword, databaseUsername, databasePassword, databaseName, containerName, portBinding); - this.args = new ArgumentsObject.Builder() + this.args = new Arguments.Builder() .withBinding(PortBinding.parse(portBinding + ":3306")) .withImage("mariadb:10.5.9") .withParams( @@ -39,15 +37,29 @@ public MariaDBTerms(String rootPassword, String databaseUsername, String databas } + @Override + public String getDockerImageName() { + return args.getDockerImageName(); + } + + @Override + public String[] getParameters() { + return args.getParameters(); + } + + @Override + public PortBinding getBinding() { + return args.getBinding(); + } @Override - public Arguments creationArguments() { - return args; + public String getContainerName() { + return args.getContainerName(); } @Override - public JDBCContainer creation(DockerSource location, DockerClient client, ContainerOptions options, String id) { - return new MariaDBContainer(location, client, options, id, config); + public JDBCContainer instantiateHolder(DockerSource location, ResourceManager manager, String id) { + return new MariaDBContainer(manager, location, id, config); } } diff --git a/tickbox-plugin/pom.xml b/tickbox-plugin/pom.xml deleted file mode 100644 index fd5cf8f..0000000 --- a/tickbox-plugin/pom.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - tickbox-parent - xyz.auriium - 1.0.0 - - 4.0.0 - - tickbox-integrated - - maven-plugin - - - ${compiler.version} - ${compiler.version} - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven.jarplugin.version} - - - org.apache.maven.plugins - maven-plugin-plugin - 3.6.0 - - tick-integrated - true - - - - - - - - - xyz.auriium - tickbox-api - - - - org.flywaydb - flyway-core - 7.5.0 - - - org.jooq - jooq-codegen - 3.14.3 - - - - \ No newline at end of file diff --git a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/AbstractTickMojo.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/AbstractTickMojo.java deleted file mode 100644 index d77de89..0000000 --- a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/AbstractTickMojo.java +++ /dev/null @@ -1,38 +0,0 @@ -package xyz.auriium.tick.plugin; - -import org.apache.maven.plugin.AbstractMojo; -import org.apache.maven.plugins.annotations.Parameter; - -public abstract class AbstractTickMojo extends AbstractMojo { - - @Parameter(defaultValue = "none") - protected String defaultDockerMachine; - - @Parameter(defaultValue = "MARIA_DB") - protected CommonInits initializer; - - @Parameter(required = true) - protected String[] locations; - - @Parameter(defaultValue = "target/generated-sources") - protected String outputDirectory; - - @Parameter(defaultValue = "me.aurium.tick.sources") - protected String packageName; - - @Parameter(defaultValue = "default") - protected String defaultDockerName; - - @Parameter(defaultValue = "sandbox") - protected String dbName; - - @Parameter(defaultValue = "sandboxPassword") - protected String dbPassword; - - @Parameter(defaultValue = "sandboxUsername") - protected String dbUsername; - - @Parameter(defaultValue = "50000") - protected int dbPort; - -} diff --git a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonInits.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonInits.java deleted file mode 100644 index a868ad5..0000000 --- a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonInits.java +++ /dev/null @@ -1,6 +0,0 @@ -package xyz.auriium.tick.plugin; - -public enum CommonInits { - - MARIA_DB; -} diff --git a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonProviders.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonProviders.java deleted file mode 100644 index 3398042..0000000 --- a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/CommonProviders.java +++ /dev/null @@ -1,71 +0,0 @@ -package xyz.auriium.tick.plugin; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import xyz.auriium.tick.docker.source.ApplicableResult; -import xyz.auriium.tick.docker.source.DockerSourceProvider; - -import java.util.Comparator; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * Class used to search for a valid provider - Unique to the maven plugin! - */ -public class CommonProviders { - - CommonProviders() {} - - public static final CommonProviders INSTANCE = new CommonProviders(); //Limit instances, use ugly static pattern to allow outside - private static final Logger logger = LoggerFactory.getLogger("(TICK | PROVIDER SEARCHER)"); - //classes to insert their own providers - private final Set providers = new HashSet<>(); - - public CommonProviders install(DockerSourceProvider provider) { - providers.add(provider); - - return this; - } - - /** - * Attempts to find a DockerProvider with the name given, or returns a default name and logs. - * @param preferred the preferred Provider identifier to use - * @return a provider - * @throws IllegalStateException if no providers can be found - */ - public DockerSourceProvider find(String preferred) { - for (DockerSourceProvider provider : providers) { - if (provider.name().equalsIgnoreCase(preferred)) { - return provider; - } - } - - return find(); - } - - /** - * Attempts to find a DockerProvider using the first available highest priority provider - * @return a provider - * @throws IllegalStateException if no providers can be found. - */ - public DockerSourceProvider find() { - - for (DockerSourceProvider provider : providers.stream() - .sorted(Comparator.comparing(DockerSourceProvider::priority)) - .collect(Collectors.toList())) { - - ApplicableResult result = provider.isApplicable(); - - if (result.isApplicable()) { - return provider; - } else { - logger.debug(String.format("Attempt to produce valid DockerClient failure \nwith provider [%s], \nReason: [%s]", provider.name(), result.getReason())); - } - } - - - throw new IllegalStateException("No providers exist in the CommonProviders library that will work on your system!"); - } - -} diff --git a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/Initializer.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/Initializer.java deleted file mode 100644 index f3bab32..0000000 --- a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/Initializer.java +++ /dev/null @@ -1,9 +0,0 @@ -package xyz.auriium.tick.plugin; - -import xyz.auriium.tick.container.terms.JDBCTerms; - -public interface Initializer { - - JDBCTerms getTerms(String dbname, String username, String password, int exposedPort); - -} diff --git a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/MariaDBInitializer.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/MariaDBInitializer.java deleted file mode 100644 index a77fadb..0000000 --- a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/MariaDBInitializer.java +++ /dev/null @@ -1,11 +0,0 @@ -package xyz.auriium.tick.plugin; - -import xyz.auriium.tick.container.terms.JDBCTerms; -import xyz.auriium.tick.container.terms.mariadb.MariaDBTerms; - -public class MariaDBInitializer implements Initializer{ - @Override - public JDBCTerms getTerms(String dbname, String username, String password, int exposedPort) { - return new MariaDBTerms("ignored",username,password,dbname,dbname,exposedPort); - } -} diff --git a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java b/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java deleted file mode 100644 index a17d6ed..0000000 --- a/tickbox-plugin/src/main/java/xyz/auriium/tick/plugin/PopulateGoalMojo.java +++ /dev/null @@ -1,52 +0,0 @@ -package xyz.auriium.tick.plugin; - -import xyz.auriium.tick.CommonTickFactory; -import xyz.auriium.tick.Tick; -import xyz.auriium.tick.TickFactory; -import xyz.auriium.tick.container.ContainerOptions; -import xyz.auriium.tick.container.container.JDBCContainer; -import xyz.auriium.tick.container.terms.JDBCTerms; -import xyz.auriium.tick.docker.image.CachedPullStrategyProvider; -import xyz.auriium.tick.docker.source.CreationOptions; -import org.apache.maven.plugin.MojoFailureException; -import org.apache.maven.plugins.annotations.LifecyclePhase; -import org.apache.maven.plugins.annotations.Mojo; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import xyz.auriium.tick.docker.source.impl.MachineSourceProvider; - -@Mojo(name = "generate", defaultPhase = LifecyclePhase.INITIALIZE) -public class PopulateGoalMojo extends AbstractTickMojo{ - - private final Logger logger = LoggerFactory.getLogger(getClass()); - - @Override - public void execute() throws MojoFailureException { - TickFactory factory = new CommonTickFactory( - new MachineSourceProvider(defaultDockerName), - new CachedPullStrategyProvider(), new CreationOptions(usePostCreationTest, true), - new ContainerOptions(300) - ); - - Initializer init = null; - - //i hate this but it doesnt let me use lambdas because its fucking retarded - if (initializer.equals(CommonInits.MARIA_DB)) { - init = new MariaDBInitializer(); - } else { - throw new MojoFailureException("incorrect init provided, no such init exists!"); - } - - JDBCTerms terms = init.getTerms(dbName,dbUsername,dbPassword,dbPort); - - Tick tick = factory.produce(); - try (JDBCContainer container = tick.getManager().startupContainer(terms)) { - logger.info(container.getJDBCUrl()); - - - } catch (Exception e) { - logger.error("Error occurred during lifecycle: ", e); - } - - } -} From f108316320a64dac50af756fbf9ed3b392b4ab94 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 17 Jul 2021 18:46:47 -0700 Subject: [PATCH 15/23] switch to okhttp --- tickbox-api/pom.xml | 4 +- .../tick/docker/source/impl/ConfigUtils.java | 70 +++++++++++++++++++ .../docker/source/impl/DockerSourceImpl.java | 28 +++++++- .../source/impl/SimpleSourceProvider.java | 26 +++---- .../source/impl/WindowsSourceProvider.java | 3 + ...{Test.java => PrimeFunctionalityTest.java} | 8 ++- 6 files changed, 120 insertions(+), 19 deletions(-) create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ConfigUtils.java rename tickbox-api/src/test/java/xyz/auriium/tick/{Test.java => PrimeFunctionalityTest.java} (86%) diff --git a/tickbox-api/pom.xml b/tickbox-api/pom.xml index f1e7934..7319bb0 100644 --- a/tickbox-api/pom.xml +++ b/tickbox-api/pom.xml @@ -24,8 +24,8 @@ com.github.docker-java - docker-java-transport-httpclient5 - 3.2.7 + docker-java-transport-okhttp + 3.2.11 org.zeroturnaround diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ConfigUtils.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ConfigUtils.java new file mode 100644 index 0000000..e5121fa --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ConfigUtils.java @@ -0,0 +1,70 @@ +package xyz.auriium.tick.docker.source.impl; + +import org.apache.commons.lang.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.net.URI; +import java.util.Optional; + +import static java.util.concurrent.TimeUnit.SECONDS; + +//TODO de-testcontainers this + +/* +public class ConfigUtils { + + public static final boolean IN_A_CONTAINER = new File("/.dockerenv").exists(); + + private static final Optional defaultGateway = Optional + .ofNullable(DockerClientFactory.instance().runInsideDocker( + cmd -> cmd.withCmd("sh", "-c", "ip route|awk '/default/ { print $3 }'"), + (client, id) -> { + try { + LogToStringContainerCallback loggingCallback = new LogToStringContainerCallback(); + client.logContainerCmd(id).withStdOut(true) + .withFollowStream(true) + .exec(loggingCallback) + .awaitStarted(); + loggingCallback.awaitCompletion(3, SECONDS); + return loggingCallback.toString(); + } catch (Exception e) { + log.warn("Can't parse the default gateway IP", e); + return null; + } + } + )) + .map(StringUtils::trimToEmpty) + .filter(StringUtils::isNotBlank); + private static final Logger log = LoggerFactory.getLogger("(TICK | Experimental)"); + + */ +/** + * @deprecated use {@link DockerClientProviderStrategy#getDockerHostIpAddress()} + *//* + + @Deprecated + public static String getDockerHostIpAddress(URI dockerHost) { + switch (dockerHost.getScheme()) { + case "http": + case "https": + case "tcp": + return dockerHost.getHost(); + case "unix": + case "npipe": + if (IN_A_CONTAINER) { + return getDefaultGateway().orElse("localhost"); + } + return "localhost"; + default: + return null; + } + } + + public static Optional getDefaultGateway() { + return DockerClientConfigUtils.defaultGateway; + } + +} +*/ diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/DockerSourceImpl.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/DockerSourceImpl.java index 3e7ac56..568e3e2 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/DockerSourceImpl.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/DockerSourceImpl.java @@ -1,6 +1,7 @@ package xyz.auriium.tick.docker.source.impl; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Network; import xyz.auriium.tick.docker.source.DockerSource; import java.net.URI; @@ -22,7 +23,32 @@ public URI getSourceURI() { @Override public String getSourceHost() { - return sourceURI.getHost(); + switch (sourceURI.getScheme()) { + case "http": + case "https": + case "tcp": + return sourceURI.getHost(); + case "unix": + case "npipe": + /*if (DockerClientConfigUtils.IN_A_CONTAINER) { //TODO de-testcontainers this + return client.inspectNetworkCmd() + .withNetworkId("bridge") + .exec() + .getIpam() + .getConfig() + .stream() + .filter(it -> it.getGateway() != null) + .findAny() + .map(Network.Ipam.Config::getGateway) + .orElseGet(() -> { + return DockerClientConfigUtils.getDefaultGateway().orElse("localhost"); + }); + }*/ + return "localhost"; + default: + throw new IllegalStateException("Unusual scheme used: Cannot interpret scheme: " + sourceURI.getScheme()); + } + } @Override diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java index 409d703..0b227a7 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/SimpleSourceProvider.java @@ -1,10 +1,7 @@ package xyz.auriium.tick.docker.source.impl; -import com.github.dockerjava.core.DefaultDockerClientConfig; -import com.github.dockerjava.core.DockerClientConfig; -import com.github.dockerjava.core.DockerClientImpl; -import com.github.dockerjava.core.LocalDirectorySSLConfig; -import com.github.dockerjava.httpclient5.ApacheDockerHttpClient; +import com.github.dockerjava.core.*; +import com.github.dockerjava.okhttp.OkDockerHttpClient; import com.github.dockerjava.transport.DockerHttpClient; import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.DockerSource; @@ -23,19 +20,18 @@ public DockerSource source(CreationOptions options) { URI pair = makeURI(options); - DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder() - .withDockerHost(pair.getHost()) - .withDockerTlsVerify(options.isWithTLS()) - .withCustomSslConfig(new LocalDirectorySSLConfig(Paths.get(System.getProperty("user.home") + "/.docker/machine/certs/").toString())) //fucking weird ass shit, - // theres 2 sslconfigs and for some reason this only takes the deprecated version. Please advise. + DockerHttpClient client = new OkDockerHttpClient.Builder() + .dockerHost(pair) + .sslConfig(new LocalDirectorySSLConfig(Paths.get(System.getProperty("user.home") + "/.docker/machine/certs/").toString())) .build(); - DockerHttpClient client = new ApacheDockerHttpClient.Builder() - .dockerHost(config.getDockerHost()) - .sslConfig(config.getSSLConfig()) - .build(); + DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder(); + + if (configBuilder.build().getApiVersion() == RemoteApiVersion.UNKNOWN_VERSION) { + configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_30); + } - return new DockerSourceImpl(pair, DockerClientImpl.getInstance(config,client)); + return new DockerSourceImpl(pair, DockerClientImpl.getInstance(configBuilder.withDockerHost(pair.toString()).build(),client)); } public abstract URI makeURI(CreationOptions options); diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java index 0dcae36..18a71b7 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java @@ -33,6 +33,9 @@ public ApplicableResult isApplicable() { @Override public URI makeURI(CreationOptions options) { + + System.out.println(URI.create(SOCKET_LOCATION)); + return URI.create(SOCKET_LOCATION); } } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/Test.java b/tickbox-api/src/test/java/xyz/auriium/tick/PrimeFunctionalityTest.java similarity index 86% rename from tickbox-api/src/test/java/xyz/auriium/tick/Test.java rename to tickbox-api/src/test/java/xyz/auriium/tick/PrimeFunctionalityTest.java index a82bc5d..d8dedd1 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/Test.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/PrimeFunctionalityTest.java @@ -2,13 +2,14 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import xyz.auriium.tick.centralized.CommonTickFactory; import xyz.auriium.tick.centralized.HookResourceManager; import xyz.auriium.tick.centralized.Tick; import xyz.auriium.tick.docker.image.CommonPoolStrategy; import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; -public class Test { +public class PrimeFunctionalityTest { private static volatile Tick tick; @@ -20,6 +21,11 @@ public static void startup() { new CommonPoolStrategy.Provider()).produce(); } + @Test + public void test() { + + } + @AfterAll public static void teardown() { tick.stop(); From 1027589a69f552a6ab924dee6c86cd2ccbb962d9 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 22 Jul 2021 18:40:47 -0700 Subject: [PATCH 16/23] work on implementing tests --- tickbox-api/pom.xml | 2 +- .../auriium/tick/centralized/CommonTick.java | 48 +++++++++++++++---- .../tick/centralized/CommonTickFactory.java | 5 -- .../centralized/EmptyResourceManager.java | 5 ++ .../tick/centralized/HookResourceManager.java | 30 ++++++++---- .../tick/centralized/ResourceManager.java | 1 + .../auriium/tick/container/CreationTerms.java | 4 +- .../auriium/tick/container/TickContainer.java | 1 + ...Callback.java => DefaultPullCallback.java} | 11 +++-- ...Strategy.java => DefaultPullStrategy.java} | 25 ++++++---- .../docker/image/PullStrategyProvider.java | 2 +- .../xyz/auriium/tick/ShutdownHookTest.java | 5 +- ...lityTest.java => WindowsProviderTest.java} | 10 ++-- ...rchContainer.java => AlpineContainer.java} | 5 +- .../{ArchTerms.java => AlpineTerms.java} | 16 ++++--- .../java/xyz/auriium/tick/logback-test.xml | 14 ++++++ .../tick/startup/BadSourceProvider.java | 33 +++++++++++++ .../auriium/tick/startup/BadStartupTests.java | 16 +++++++ .../containers/sql/mariadb/MariaDBTerms.java | 6 ++- 19 files changed, 185 insertions(+), 54 deletions(-) rename tickbox-api/src/main/java/xyz/auriium/tick/docker/image/{LoggingPullResultCallback.java => DefaultPullCallback.java} (93%) rename tickbox-api/src/main/java/xyz/auriium/tick/docker/image/{CommonPoolStrategy.java => DefaultPullStrategy.java} (70%) rename tickbox-api/src/test/java/xyz/auriium/tick/{PrimeFunctionalityTest.java => WindowsProviderTest.java} (67%) rename tickbox-api/src/test/java/xyz/auriium/tick/container/{ArchContainer.java => AlpineContainer.java} (72%) rename tickbox-api/src/test/java/xyz/auriium/tick/container/{ArchTerms.java => AlpineTerms.java} (56%) create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/logback-test.xml create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/startup/BadSourceProvider.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java diff --git a/tickbox-api/pom.xml b/tickbox-api/pom.xml index 7319bb0..6b8b2c9 100644 --- a/tickbox-api/pom.xml +++ b/tickbox-api/pom.xml @@ -20,7 +20,7 @@ com.github.docker-java docker-java-core - 3.2.7 + 3.2.11 com.github.docker-java diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java index 66c375e..323140b 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java @@ -2,7 +2,10 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.HostConfig; +import com.github.dockerjava.api.model.PortBinding; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import xyz.auriium.tick.container.CreationTerms; @@ -10,6 +13,8 @@ import xyz.auriium.tick.docker.image.PullStrategy; import xyz.auriium.tick.docker.source.DockerSource; +import java.util.Arrays; + public class CommonTick implements Tick{ private final Logger logger = LoggerFactory.getLogger("(TICK | MANAGER)"); @@ -30,26 +35,52 @@ public CommonTick(DockerSource location, PullStrategy strategy, ResourceManager @Override public T createContainer(CreationTerms terms) { - strategy.shouldLoad(terms.getDockerImageName()); + strategy.loadIfRequired(terms.getDockerImageName()); + + logger.info("Initializing container!"); + logger.info("Using image: {}", terms.getDockerImageName()); + logger.info("Using container name: {}", terms.getContainerName()); + logger.info("Using params: {}", Arrays.toString(terms.getParameters())); + + HostConfig config = new HostConfig(); - logger.info("Initializing container with image: " + terms.getDockerImageName() + "! Assuming image is present!"); + terms.getBinding().ifPresent(config::withPortBindings); CreateContainerResponse response = client.createContainerCmd(terms.getDockerImageName()) .withName(terms.getContainerName()) + .withHostName("tick") .withEnv(terms.getParameters()) - .withHostConfig(new HostConfig() - .withPortBindings(terms.getBinding()) - ) + .withHostConfig(config) .exec(); String id = response.getId(); - manager.submitContainer(id,false); + //manager.submitContainer(id,false); logger.info("Container created! Starting container now."); - client.startContainerCmd(response.getId()).exec(); - manager.submitContainer(id,true); + client.startContainerCmd(id).exec(); + + //TEST + CreateContainerResponse container + = client.createContainerCmd("alpine:latest") + .withName("control-variable") + .withHostName("baeldung") + .withEnv("MONGO_LATEST_VERSION=3.6") + .withPortBindings(PortBinding.parse("9999:27017")) + .withBinds(Bind.parse("/Users/baeldung/mongo/data/db:/data/db")).exec(); + + client.startContainerCmd(container.getId()).exec(); + + + InspectContainerResponse response1 = client.inspectContainerCmd(id).exec(); + + if (!response1.getState().getRunning()) { + logger.error(response1.toString()); + throw new IllegalStateException("Executed container start command but container is not marked as started in docker! Including exception above."); + } + + //manager.submitContainer(id,true); logger.info("Container has been started successfully!"); return terms.instantiateHolder(location,manager,response.getId()); @@ -57,6 +88,7 @@ public T createContainer(CreationTerms terms) { @Override public void stop() { + logger.info("Stopping TickBox now! Goodnight!"); manager.stop(); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java index 46ac93a..a1ca635 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java @@ -68,11 +68,6 @@ public Tick produce() { logger.info("Client produced successfully! Executing final startup activities..."); - //TODO test the dockersource - run multiple client commands and a test startup/shutdown on it - if (creationOptions.isUsePostCreationTest()) { - logger.debug("Test would occur here!"); - } - Version dockerVersion = client.versionCmd().exec(); logger.info("(DockerClient startup successful!" + "\n" + diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java index 7a7bd59..9058bb0 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/EmptyResourceManager.java @@ -21,6 +21,11 @@ public void submitImage(String imageName) { } + @Override + public void destroyImage(String imageName) { + + } + @Override public void stop() { diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java index 5260f1a..ad38aee 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/HookResourceManager.java @@ -1,5 +1,6 @@ package xyz.auriium.tick.centralized; +import com.github.dockerjava.api.command.InspectContainerResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import xyz.auriium.tick.docker.source.DockerSource; @@ -13,7 +14,7 @@ public class HookResourceManager implements ResourceManager { //toInterface private final Map containers = new ConcurrentHashMap<>(); private final Set images = ConcurrentHashMap.newKeySet(); - private final Logger logger = LoggerFactory.getLogger("(TICK | HookResourceManager)"); + private final Logger logger = LoggerFactory.getLogger("(TICK | RESOURCE MANAGER)"); private final DockerSource dockerSource; HookResourceManager(DockerSource dockerSource) { @@ -27,42 +28,55 @@ public class HookResourceManager implements ResourceManager { //toInterface */ @Override public void submitContainer(String id, boolean val) { + logger.debug("Added container with ID: " + id + " to manager!"); this.containers.put(id,val); } @Override public void submitImage(String imageName) { + logger.debug("Added image with name: " + imageName + " to manager!"); this.images.add(imageName); } + @Override + public void destroyImage(String imageName) { + logger.info("Removing image: {}", imageName); + dockerSource.getClient().removeImageCmd(imageName); + logger.debug("Removed image!"); + } + /** * Shuts down a container if it is not already shut down. * @param id the identification number of the container to destroy */ @Override public void destroyContainer(String id) { - boolean shutDown = this.containers.remove(id); + boolean running = this.containers.remove(id); - if (shutDown) { + InspectContainerResponse.ContainerState state = dockerSource.getClient().inspectContainerCmd(id).exec().getState(); + if (!state.getRunning() && running) { + logger.error("Container is marked as running in ResourceManager yet docker says it is not running! Please report this to tickbox!"); + logger.error("Attempting to remove container anyways"); + } else if (running) { logger.info("Stopping container: {}", id); dockerSource.getClient().killContainerCmd(id).exec(); - logger.info("Stopped container!"); - + logger.debug("Stopped container!"); } logger.info("Removing container: {}", id); dockerSource.getClient().removeContainerCmd(id).withRemoveVolumes(true).withForce(true).exec(); - logger.info("Removed container and associated volume(s)!"); + logger.debug("Removed container and associated volume(s)!"); } public void stop() { - containers.forEach((str, aBoolean) -> destroyContainer(str)); + containers.keySet().forEach(this::destroyContainer); + images.forEach(this::destroyImage); } public static class Provider implements ResourceManagerProvider { - private final Logger logger = LoggerFactory.getLogger("(TICK | HookResourceProvider)"); + private final Logger logger = LoggerFactory.getLogger("(TICK | RESOURCE PROVIDER)"); private final boolean useShutdownHook; public Provider(boolean useShutdownHook) { diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java index c098b6c..7181d5d 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java @@ -15,5 +15,6 @@ public interface ResourceManager extends Stoppable { * @param imageName the name of the image */ void submitImage(String imageName); + void destroyImage(String imageName); } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java index f6be054..47f6685 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java @@ -5,13 +5,15 @@ import xyz.auriium.tick.centralized.ResourceManager; import xyz.auriium.tick.docker.source.DockerSource; +import java.util.Optional; + public interface CreationTerms { String getDockerImageName(); String[] getParameters(); - PortBinding getBinding(); + Optional getBinding(); String getContainerName(); diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java index c73804a..5e5bea9 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java @@ -1,5 +1,6 @@ package xyz.auriium.tick.container; +import com.github.dockerjava.api.command.InspectContainerResponse; import xyz.auriium.tick.model.Stoppable; /** diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/DefaultPullCallback.java similarity index 93% rename from tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/image/DefaultPullCallback.java index 48367e0..6dec9bd 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/LoggingPullResultCallback.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/DefaultPullCallback.java @@ -3,7 +3,6 @@ import com.github.dockerjava.api.command.PullImageResultCallback; import com.github.dockerjava.api.model.PullResponseItem; import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.Closeable; import java.time.Duration; @@ -14,9 +13,9 @@ import static org.apache.commons.io.FileUtils.byteCountToDisplaySize; /** - * Credit where credit is due: Some of this stuff is from TestContainers + * Credit where credit is due: this stuff is from TestContainers */ -public class LoggingPullResultCallback extends PullImageResultCallback { +public class DefaultPullCallback extends PullImageResultCallback { private Instant start; @@ -26,10 +25,14 @@ public class LoggingPullResultCallback extends PullImageResultCallback { private final Map totalSizes = new HashMap<>(); private final Map currentSizes = new HashMap<>(); - private final Logger logger = LoggerFactory.getLogger("(TICK | IMAGE PULL)"); + private final Logger logger; private boolean completed = false; + public DefaultPullCallback(Logger logger) { + this.logger = logger; + } + @Override public void onStart(Closeable stream) { super.onStart(stream); diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CommonPoolStrategy.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/DefaultPullStrategy.java similarity index 70% rename from tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CommonPoolStrategy.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/image/DefaultPullStrategy.java index 3f5adf6..1638d92 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/CommonPoolStrategy.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/DefaultPullStrategy.java @@ -8,25 +8,34 @@ import java.util.concurrent.TimeUnit; -public class CommonPoolStrategy implements PullStrategy { +public class DefaultPullStrategy implements PullStrategy { - private final Logger logger = LoggerFactory.getLogger("(TICK | Cached Blocking Strategy)"); + private final Logger logger = LoggerFactory.getLogger("(TICK | DefaultPullStrategy)"); private final DockerClient client; private final ResourceManager manager; - public CommonPoolStrategy(DockerClient client, ResourceManager manager) { + public DefaultPullStrategy(DockerClient client, ResourceManager manager) { this.client = client; this.manager = manager; } @Override public boolean shouldLoad(String dockerImageName) { + + logger.debug("Testing whether image should be loaded..."); + try { client.inspectImageCmd(dockerImageName).exec(); - return true; - } catch (NotFoundException exception) { + + logger.debug("Image is present!"); + return false; + } catch (NotFoundException exception) { + + logger.debug("Image is not present!"); + + return true; } } @@ -37,7 +46,7 @@ public void load(String dockerImageName) { try { - client.pullImageCmd(dockerImageName).exec(new LoggingPullResultCallback()) + client.pullImageCmd(dockerImageName).exec(new DefaultPullCallback(logger)) .awaitCompletion(30, TimeUnit.SECONDS); manager.submitImage(dockerImageName); @@ -51,8 +60,8 @@ public void load(String dockerImageName) { public static class Provider implements PullStrategyProvider { @Override - public CommonPoolStrategy provide(DockerClient client, ResourceManager manager) { - return new CommonPoolStrategy(client, manager); + public DefaultPullStrategy provide(DockerClient client, ResourceManager manager) { + return new DefaultPullStrategy(client, manager); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java index 6abd567..e81afbc 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/image/PullStrategyProvider.java @@ -9,6 +9,6 @@ */ public interface PullStrategyProvider { - CommonPoolStrategy provide(DockerClient client, ResourceManager manager); + DefaultPullStrategy provide(DockerClient client, ResourceManager manager); } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java index 6008ea6..811bc0d 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java @@ -1,13 +1,12 @@ package xyz.auriium.tick; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; import xyz.auriium.tick.centralized.CommonTickFactory; import xyz.auriium.tick.centralized.HookResourceManager; import xyz.auriium.tick.centralized.Tick; -import xyz.auriium.tick.docker.image.CommonPoolStrategy; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; @EnabledOnOs(OS.LINUX) @@ -20,7 +19,7 @@ public static void startup() { tick = new CommonTickFactory( new HookResourceManager.Provider(true), new WindowsSourceProvider(), - new CommonPoolStrategy.Provider()).produce(); + new DefaultPullStrategy.Provider()).produce(); } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/PrimeFunctionalityTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/WindowsProviderTest.java similarity index 67% rename from tickbox-api/src/test/java/xyz/auriium/tick/PrimeFunctionalityTest.java rename to tickbox-api/src/test/java/xyz/auriium/tick/WindowsProviderTest.java index d8dedd1..200144a 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/PrimeFunctionalityTest.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/WindowsProviderTest.java @@ -6,10 +6,12 @@ import xyz.auriium.tick.centralized.CommonTickFactory; import xyz.auriium.tick.centralized.HookResourceManager; import xyz.auriium.tick.centralized.Tick; -import xyz.auriium.tick.docker.image.CommonPoolStrategy; +import xyz.auriium.tick.container.AlpineTerms; +import xyz.auriium.tick.container.TickContainer; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; -public class PrimeFunctionalityTest { +public class WindowsProviderTest { private static volatile Tick tick; @@ -18,12 +20,12 @@ public static void startup() { tick = new CommonTickFactory( new HookResourceManager.Provider(true), new WindowsSourceProvider(), - new CommonPoolStrategy.Provider()).produce(); + new DefaultPullStrategy.Provider()).produce(); } @Test public void test() { - + TickContainer container = tick.createContainer(new AlpineTerms("the-cheese-man")); } @AfterAll diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchContainer.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineContainer.java similarity index 72% rename from tickbox-api/src/test/java/xyz/auriium/tick/container/ArchContainer.java rename to tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineContainer.java index a063dda..1c0c38c 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchContainer.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineContainer.java @@ -1,14 +1,15 @@ package xyz.auriium.tick.container; +import com.github.dockerjava.api.command.InspectContainerResponse; import xyz.auriium.tick.centralized.ResourceManager; -public class ArchContainer implements TickContainer{ +public class AlpineContainer implements TickContainer{ private final ResourceManager manager; private final String name; private final String id; - public ArchContainer(ResourceManager manager, String name, String id) { + public AlpineContainer(ResourceManager manager, String name, String id) { this.manager = manager; this.name = name; this.id = id; diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchTerms.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineTerms.java similarity index 56% rename from tickbox-api/src/test/java/xyz/auriium/tick/container/ArchTerms.java rename to tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineTerms.java index 32a8a24..0eb3153 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/ArchTerms.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineTerms.java @@ -4,17 +4,19 @@ import xyz.auriium.tick.centralized.ResourceManager; import xyz.auriium.tick.docker.source.DockerSource; -public class ArchTerms implements CreationTerms{ +import java.util.Optional; + +public class AlpineTerms implements CreationTerms{ private final String name; - public ArchTerms(String name) { + public AlpineTerms(String name) { this.name = name; } @Override public String getDockerImageName() { - return "archlinux:latest"; + return "alpine:latest"; } @Override @@ -23,8 +25,8 @@ public String[] getParameters() { } @Override - public PortBinding getBinding() { - return PortBinding.parse(""); + public Optional getBinding() { + return Optional.empty(); } @Override @@ -33,7 +35,7 @@ public String getContainerName() { } @Override - public ArchContainer instantiateHolder(DockerSource location, ResourceManager manager, String dockerID) { - return new ArchContainer(manager, name, dockerID); + public AlpineContainer instantiateHolder(DockerSource location, ResourceManager manager, String dockerID) { + return new AlpineContainer(manager, name, dockerID); } } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/logback-test.xml b/tickbox-api/src/test/java/xyz/auriium/tick/logback-test.xml new file mode 100644 index 0000000..898887f --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/logback-test.xml @@ -0,0 +1,14 @@ + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + \ No newline at end of file diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadSourceProvider.java b/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadSourceProvider.java new file mode 100644 index 0000000..daa17dd --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadSourceProvider.java @@ -0,0 +1,33 @@ +package xyz.auriium.tick.startup; + +import xyz.auriium.tick.container.CreationOptions; +import xyz.auriium.tick.docker.source.ApplicableResult; +import xyz.auriium.tick.docker.source.DockerSourceProvider; +import xyz.auriium.tick.docker.source.impl.SimpleSourceProvider; + +import java.net.URI; + +/** + * Represents a malfunctioning source provider that cannot tell if it is accurately providing valid fields + */ +public class BadSourceProvider extends SimpleSourceProvider { + @Override + public String name() { + return "BadSourceProvider"; + } + + @Override + public Integer priority() { + return 1; + } + + @Override + public ApplicableResult isApplicable() { + return ApplicableResult.success(); //always true to simulate fallacy + } + + @Override + public URI makeURI(CreationOptions options) { + return URI.create("https://i.shit.my.pants.com"); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java b/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java new file mode 100644 index 0000000..dfabe72 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java @@ -0,0 +1,16 @@ +package xyz.auriium.tick.startup; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; + +public class BadStartupTests { + + @Test + public void badStartupTest() { + new CommonTickFactory(new HookResourceManager.Provider(false), new BadSourceProvider(), new DefaultPullStrategy.Provider()).produce(); + } + +} diff --git a/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java index 3332ecc..7dba43d 100644 --- a/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java +++ b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java @@ -8,6 +8,8 @@ import xyz.auriium.tick.container.Arguments; import xyz.auriium.tick.docker.source.DockerSource; +import java.util.Optional; + /** * mariadb * @@ -48,8 +50,8 @@ public String[] getParameters() { } @Override - public PortBinding getBinding() { - return args.getBinding(); + public Optional getBinding() { + return Optional.of(args.getBinding()); } @Override From 13c8fff97b92664affaaf6390753ed7453c8d73e Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 24 Jul 2021 19:55:19 -0700 Subject: [PATCH 17/23] various tests, closes #5, #2 --- pom.xml | 7 ++ tickbox-api/pom.xml | 5 ++ .../tick/PostCreationTestException.java | 8 ++ .../java/xyz/auriium/tick/TickException.java | 10 +++ .../auriium/tick/centralized/CommonTick.java | 73 +++++++++++++------ .../tick/centralized/CommonTickFactory.java | 10 +++ .../tick/centralized/ResourceManager.java | 2 +- .../tick/centralized/ShutdownException.java | 9 +++ .../xyz/auriium/tick/centralized/Tick.java | 9 ++- .../auriium/tick/container/CreationTerms.java | 10 ++- .../auriium/tick/container/TickContainer.java | 11 ++- .../tick/docker/InvalidProviderException.java | 4 +- .../docker/source/{impl => }/ConfigUtils.java | 2 +- .../docker/source/DockerSourceProvider.java | 13 +++- .../source/impl/AutoSourceProvider.java | 48 ++++++++++++ .../source/impl/MachineSourceProvider.java | 2 +- .../source/impl/NoProviderException.java | 14 ++++ .../source/impl/RootlessSourceProvider.java | 3 +- .../source/impl/UnixSourceProvider.java | 2 +- .../source/impl/WindowsSourceProvider.java | 6 +- .../xyz/auriium/tick/utils/Optionals.java | 24 ++++++ .../tick/{model => utils}/Stoppable.java | 2 +- .../test/java/xyz/auriium/tick/BaseTest.java | 30 ++++++++ .../tick/container/BadContainerTest.java | 60 +++++++++++++++ ...lpineContainer.java => TinyContainer.java} | 4 +- .../{AlpineTerms.java => TinyImageTerms.java} | 22 ++++-- .../tick/container/TinyMessedUpPorts.java | 17 +++++ .../tick/provider/AutoProviderTest.java | 4 + .../tick/provider/SystemEnvProviderTest.java | 22 ++++++ .../tick/provider/UnixProviderTest.java | 40 ++++++++++ .../{ => provider}/WindowsProviderTest.java | 26 ++++--- .../tick/{ => shutdown}/ShutdownHookTest.java | 10 ++- .../tick/shutdown/TickClosureTest.java | 62 ++++++++++++++++ .../auriium/tick/startup/BadStartupTest.java | 25 +++++++ .../auriium/tick/startup/BadStartupTests.java | 16 ---- .../tick => resources}/logback-test.xml | 2 +- .../containers/sql/mariadb/MariaDBTerms.java | 18 ++++- 37 files changed, 555 insertions(+), 77 deletions(-) create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/PostCreationTestException.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/TickException.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/centralized/ShutdownException.java rename tickbox-api/src/main/java/xyz/auriium/tick/docker/source/{impl => }/ConfigUtils.java (98%) create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/AutoSourceProvider.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/NoProviderException.java create mode 100644 tickbox-api/src/main/java/xyz/auriium/tick/utils/Optionals.java rename tickbox-api/src/main/java/xyz/auriium/tick/{model => utils}/Stoppable.java (93%) create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/BaseTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java rename tickbox-api/src/test/java/xyz/auriium/tick/container/{AlpineContainer.java => TinyContainer.java} (81%) rename tickbox-api/src/test/java/xyz/auriium/tick/container/{AlpineTerms.java => TinyImageTerms.java} (50%) create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/container/TinyMessedUpPorts.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/provider/AutoProviderTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/provider/SystemEnvProviderTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java rename tickbox-api/src/test/java/xyz/auriium/tick/{ => provider}/WindowsProviderTest.java (61%) rename tickbox-api/src/test/java/xyz/auriium/tick/{ => shutdown}/ShutdownHookTest.java (86%) create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/shutdown/TickClosureTest.java create mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTest.java delete mode 100644 tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java rename tickbox-api/src/test/{java/xyz/auriium/tick => resources}/logback-test.xml (94%) diff --git a/pom.xml b/pom.xml index d1c0b92..d12c620 100644 --- a/pom.xml +++ b/pom.xml @@ -13,6 +13,13 @@ tickbox-parent 1.0.0 + TickBox + Testcontainers alternative + + + scm:git:https://github.com/Auriium/TickBox.git + + tickbox-api tickbox-containers-sql diff --git a/tickbox-api/pom.xml b/tickbox-api/pom.xml index 6b8b2c9..fde8bfc 100644 --- a/tickbox-api/pom.xml +++ b/tickbox-api/pom.xml @@ -37,6 +37,11 @@ slf4j-api 2.0.0-alpha1 + + com.google.code.gson + gson + 2.8.7 + org.junit.jupiter junit-jupiter-engine diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/PostCreationTestException.java b/tickbox-api/src/main/java/xyz/auriium/tick/PostCreationTestException.java new file mode 100644 index 0000000..4a3d97f --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/PostCreationTestException.java @@ -0,0 +1,8 @@ +package xyz.auriium.tick; + +public class PostCreationTestException extends TickException { + + public PostCreationTestException(Throwable cause) { + super("An exception was thrown even though your docker provider reported valid! Please check your provider. Exception: " + cause); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/TickException.java b/tickbox-api/src/main/java/xyz/auriium/tick/TickException.java new file mode 100644 index 0000000..a682119 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/TickException.java @@ -0,0 +1,10 @@ +package xyz.auriium.tick; + +/** + * Common parent exception + */ +public class TickException extends RuntimeException{ + public TickException(String s) { + super(s); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java index 323140b..7403862 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java @@ -1,8 +1,11 @@ package xyz.auriium.tick.centralized; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.exception.ConflictException; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.PortBinding; @@ -13,6 +16,7 @@ import xyz.auriium.tick.docker.image.PullStrategy; import xyz.auriium.tick.docker.source.DockerSource; +import java.io.IOException; import java.util.Arrays; public class CommonTick implements Tick{ @@ -25,7 +29,7 @@ public class CommonTick implements Tick{ private final PullStrategy strategy; private final ResourceManager manager; - public CommonTick(DockerSource location, PullStrategy strategy, ResourceManager manager) { + CommonTick(DockerSource location, PullStrategy strategy, ResourceManager manager) { this.location = location; this.client = location.getClient(); this.strategy = strategy; @@ -43,35 +47,26 @@ public T createContainer(CreationTerms terms) { logger.info("Using params: {}", Arrays.toString(terms.getParameters())); HostConfig config = new HostConfig(); + terms.getPortBindings().ifPresent(config::withPortBindings); + terms.getBinds().ifPresent(config::withBinds); - terms.getBinding().ifPresent(config::withPortBindings); - - CreateContainerResponse response = client.createContainerCmd(terms.getDockerImageName()) - .withName(terms.getContainerName()) + CreateContainerCmd cmd = client.createContainerCmd(terms.getDockerImageName()) .withHostName("tick") + .withName(terms.getContainerName()) .withEnv(terms.getParameters()) - .withHostConfig(config) - .exec(); + .withHostConfig(config); - String id = response.getId(); - - //manager.submitContainer(id,false); - logger.info("Container created! Starting container now."); + terms.getCommands().ifPresent(cmd::withCmd); - client.startContainerCmd(id).exec(); + CreateContainerResponse response = execDirtyHandlingException(cmd); - //TEST - CreateContainerResponse container - = client.createContainerCmd("alpine:latest") - .withName("control-variable") - .withHostName("baeldung") - .withEnv("MONGO_LATEST_VERSION=3.6") - .withPortBindings(PortBinding.parse("9999:27017")) - .withBinds(Bind.parse("/Users/baeldung/mongo/data/db:/data/db")).exec(); + String id = response.getId(); - client.startContainerCmd(container.getId()).exec(); + manager.submitContainer(id,false); + logger.info("Container created! Starting container now."); + client.startContainerCmd(id).exec(); InspectContainerResponse response1 = client.inspectContainerCmd(id).exec(); @@ -80,15 +75,49 @@ public T createContainer(CreationTerms terms) { throw new IllegalStateException("Executed container start command but container is not marked as started in docker! Including exception above."); } - //manager.submitContainer(id,true); + manager.submitContainer(id,true); logger.info("Container has been started successfully!"); return terms.instantiateHolder(location,manager,response.getId()); + + + } + + @Override + public DockerSource expose() { + return location; + } + + //A try/catch is required here in order for container to not persist and be effectively removed. + //all of this is hacky and gross so if anyone finds a better way please make a PR + CreateContainerResponse execDirtyHandlingException(CreateContainerCmd cmd) { + try { + return cmd.exec(); + } catch (ConflictException e) { + logger.error("Error during execution: Two containers of the same name exist. Attempting to resolve. Printing stacktrace below:"); + + String s = e.getMessage(); + + s = s.substring(s.indexOf("r \\\"") + 4); + s = s.substring(0, s.indexOf("\\\".")); + + manager.destroyContainer(s); + logger.error("Removed bad container. Exiting now! Sorry!"); + + throw new IllegalStateException(e.getMessage()); + } } @Override public void stop() { logger.info("Stopping TickBox now! Goodnight!"); + manager.stop(); + + try { + client.close(); + } catch (IOException e) { + throw new ShutdownException("An exception occurred while closing the connection to DockerClient: " + e); + } } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java index a1ca635..098b98f 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTickFactory.java @@ -1,9 +1,11 @@ package xyz.auriium.tick.centralized; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.Version; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import xyz.auriium.tick.PostCreationTestException; import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.InvalidProviderException; import xyz.auriium.tick.docker.image.PullStrategyProvider; @@ -66,6 +68,14 @@ public Tick produce() { DockerSource source = sourceProvider.source(creationOptions); DockerClient client = source.getClient(); + if (creationOptions.isUsePostCreationTest()) { + try { + client.versionCmd().exec(); + } catch (DockerClientException exception) { + throw new PostCreationTestException(exception); + } + } + logger.info("Client produced successfully! Executing final startup activities..."); Version dockerVersion = client.versionCmd().exec(); diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java index 7181d5d..e162c9e 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ResourceManager.java @@ -1,6 +1,6 @@ package xyz.auriium.tick.centralized; -import xyz.auriium.tick.model.Stoppable; +import xyz.auriium.tick.utils.Stoppable; /** * Manages resources for the tick system diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ShutdownException.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ShutdownException.java new file mode 100644 index 0000000..01533f8 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/ShutdownException.java @@ -0,0 +1,9 @@ +package xyz.auriium.tick.centralized; + +import xyz.auriium.tick.TickException; + +public class ShutdownException extends TickException { + public ShutdownException(String s) { + super(s); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java index cef98d5..5a09774 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/Tick.java @@ -2,7 +2,8 @@ import xyz.auriium.tick.container.CreationTerms; import xyz.auriium.tick.container.TickContainer; -import xyz.auriium.tick.model.Stoppable; +import xyz.auriium.tick.docker.source.DockerSource; +import xyz.auriium.tick.utils.Stoppable; /** * Entry point into the tick api, allows for the creation of dockerized containers. @@ -18,4 +19,10 @@ public interface Tick extends Stoppable { */ T createContainer(CreationTerms terms); + /** + * Testing + * @return testing + */ + DockerSource expose(); + } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java index 47f6685..ce5d5fb 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/CreationTerms.java @@ -1,6 +1,7 @@ package xyz.auriium.tick.container; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.PortBinding; import xyz.auriium.tick.centralized.ResourceManager; import xyz.auriium.tick.docker.source.DockerSource; @@ -13,13 +14,20 @@ public interface CreationTerms { String[] getParameters(); - Optional getBinding(); + Optional getBinds(); + + Optional getPortBindings(); + + Optional getCommands(); String getContainerName(); + /** * Method used to describe the creation of the actual container * + * Can also be used as a callback for post container startup + * * @param location the dockersource used * @param dockerID the identifier of the container * @return a new container object diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java b/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java index 5e5bea9..2e79d74 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/container/TickContainer.java @@ -1,10 +1,15 @@ package xyz.auriium.tick.container; -import com.github.dockerjava.api.command.InspectContainerResponse; -import xyz.auriium.tick.model.Stoppable; - /** * Represents an already created Container that can start and stop itself + * + * TODO add more methods to this barebones ass cringe bullshit + * + * some ideas: + * + * runShell(str) for a linux extension of this interface + * getStatus() + * get.. idk everything that dockerjava provides for us ;) */ public interface TickContainer extends AutoCloseable{ diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/InvalidProviderException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/InvalidProviderException.java index 2762277..43e0678 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/InvalidProviderException.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/InvalidProviderException.java @@ -1,6 +1,8 @@ package xyz.auriium.tick.docker; -public class InvalidProviderException extends RuntimeException { +import xyz.auriium.tick.TickException; + +public class InvalidProviderException extends TickException { public InvalidProviderException() { super("A provider that was provided was unable to meet it's requirements for launch! See logs for details."); diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ConfigUtils.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ConfigUtils.java similarity index 98% rename from tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ConfigUtils.java rename to tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ConfigUtils.java index e5121fa..0c7039a 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/ConfigUtils.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/ConfigUtils.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.docker.source.impl; +package xyz.auriium.tick.docker.source; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java index f1344cc..13d19d8 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/DockerSourceProvider.java @@ -2,9 +2,16 @@ import xyz.auriium.tick.container.CreationOptions; -public interface DockerSourceProvider { +public interface DockerSourceProvider extends Comparable { String name(); + + /** + * Priority to be tested by {@link xyz.auriium.tick.docker.source.impl.AutoSourceProvider} + * The higher the number the earlier it is tested. + * + * @return + */ Integer priority(); /** @@ -20,4 +27,8 @@ public interface DockerSourceProvider { */ ApplicableResult isApplicable(); + @Override + default int compareTo(DockerSourceProvider o) { + return this.priority().compareTo(o.priority()); + } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/AutoSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/AutoSourceProvider.java new file mode 100644 index 0000000..21d8be9 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/AutoSourceProvider.java @@ -0,0 +1,48 @@ +package xyz.auriium.tick.docker.source.impl; + +import xyz.auriium.tick.container.CreationOptions; +import xyz.auriium.tick.docker.source.ApplicableResult; +import xyz.auriium.tick.docker.source.DockerSource; +import xyz.auriium.tick.docker.source.DockerSourceProvider; + +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Automatic source provider that loops through a list of all existing providers in order to attempt delegation + */ +public class AutoSourceProvider { + + private static final Set providers = new HashSet<>(); + + static { + providers.add(new WindowsSourceProvider()); + providers.add(new RootlessSourceProvider()); + providers.add(new UnixSourceProvider()); + providers.add(new SystemEnvSourceProvider()); + } + + + /** + * Attempts to get a docker source provider that will work with your machine. + * @return a docker source provider + * @throws NoProviderException if no valid provider can be found for use on your machine. + */ + public DockerSourceProvider provide() { + + List sorted = providers.stream().sorted((a, b) -> b.priority().compareTo(a.priority())).collect(Collectors.toList()); + + for (DockerSourceProvider provider : sorted) { + ApplicableResult result = provider.isApplicable(); { + if (!result.isApplicable()) continue; + + return provider; + } + } + + throw new NoProviderException(); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java index 9f0a57c..bf5ed0c 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/MachineSourceProvider.java @@ -44,7 +44,7 @@ public String name() { @Override public Integer priority() { - return 100; + return -9999999; } @Override diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/NoProviderException.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/NoProviderException.java new file mode 100644 index 0000000..8cde6f5 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/NoProviderException.java @@ -0,0 +1,14 @@ +package xyz.auriium.tick.docker.source.impl; + +import xyz.auriium.tick.TickException; + +/** + * Exception thrown when there is no valid provider for the {@link AutoSourceProvider} + */ +public class NoProviderException extends TickException { + + + public NoProviderException() { + super("No valid provider could be found for use with your system!"); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java index b8152a9..c27ed4f 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/RootlessSourceProvider.java @@ -21,7 +21,6 @@ * This was copy pasted from testcontainers and adapted to the tickbox format. I have no idea whether * or not it actually functions. */ -@Deprecated public class RootlessSourceProvider extends SimpleSourceProvider{ private static final Logger logger = LoggerFactory.getLogger("(TICK | ROOTLESS DOCKER PROVIDER)"); @@ -75,7 +74,7 @@ public String name() { @Override public Integer priority() { - return 5; + return 29; } @Override diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java index bf65898..b7ceac0 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java @@ -28,7 +28,7 @@ public String name() { @Override public Integer priority() { - return 21; + return 30; } @Override diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java index 18a71b7..e0ded68 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/WindowsSourceProvider.java @@ -1,6 +1,6 @@ package xyz.auriium.tick.docker.source.impl; -import org.apache.commons.lang.SystemUtils; +import org.apache.commons.lang3.SystemUtils; import xyz.auriium.tick.container.CreationOptions; import xyz.auriium.tick.docker.source.ApplicableResult; @@ -11,6 +11,7 @@ * * Literally copy and pasted from TestContainers */ + public class WindowsSourceProvider extends SimpleSourceProvider { protected static final String DOCKER_SOCK_PATH = "//./pipe/docker_engine"; @@ -33,9 +34,6 @@ public ApplicableResult isApplicable() { @Override public URI makeURI(CreationOptions options) { - - System.out.println(URI.create(SOCKET_LOCATION)); - return URI.create(SOCKET_LOCATION); } } diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/utils/Optionals.java b/tickbox-api/src/main/java/xyz/auriium/tick/utils/Optionals.java new file mode 100644 index 0000000..6bfd7a9 --- /dev/null +++ b/tickbox-api/src/main/java/xyz/auriium/tick/utils/Optionals.java @@ -0,0 +1,24 @@ +package xyz.auriium.tick.utils; + +import java.util.Optional; + +/** + * lazy class for lazy developer + * + * please everything else is held to a higher standard than TestContainers just lemme get away with this one + */ +public class Optionals { + + + /** + * I hate my life + * @param vars unsafe varargs + * @param unsafe + * @return un safe + * i wish arrays[]{"weren't so annoying to create"} + */ + @SafeVarargs + public static Optional supply(T... vars) { + return Optional.of(vars); + } +} diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/model/Stoppable.java b/tickbox-api/src/main/java/xyz/auriium/tick/utils/Stoppable.java similarity index 93% rename from tickbox-api/src/main/java/xyz/auriium/tick/model/Stoppable.java rename to tickbox-api/src/main/java/xyz/auriium/tick/utils/Stoppable.java index 535f26e..36de488 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/model/Stoppable.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/utils/Stoppable.java @@ -1,4 +1,4 @@ -package xyz.auriium.tick.model; +package xyz.auriium.tick.utils; import java.io.Closeable; import java.io.IOException; diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/BaseTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/BaseTest.java new file mode 100644 index 0000000..f7215d2 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/BaseTest.java @@ -0,0 +1,30 @@ +package xyz.auriium.tick; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.TestInfo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class BaseTest { + + protected static final Logger logger = LoggerFactory.getLogger("(TICK TESTING)"); + + @BeforeEach + void beforeEach(TestInfo testInfo) { + + testInfo.getTestClass().orElseThrow().getName(); + + logger.info(String.format("\n <<< Test started: %s", testInfo.getDisplayName() + ">>> \n")); + } + + @AfterEach + void afterEach(TestInfo testInfo) { + + testInfo.getTestClass().orElseThrow().getName(); + + logger.info(String.format("\n\n <<< Test stopped: %s", testInfo.getDisplayName() + ">>> \n")); + } + +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java new file mode 100644 index 0000000..be3c121 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java @@ -0,0 +1,60 @@ +package xyz.auriium.tick.container; + +import com.github.dockerjava.api.exception.NotFoundException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import xyz.auriium.tick.BaseTest; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.centralized.Tick; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; +import xyz.auriium.tick.docker.source.DockerSource; +import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +@EnabledOnOs(OS.WINDOWS) //TODO autoprovider for all platforms +public class BadContainerTest extends BaseTest { + + private static volatile Tick testingTick; + private static volatile DockerSource notClosedSource; + + @BeforeAll + public static void startup() { + testingTick = new CommonTickFactory( + new HookResourceManager.Provider(false), + new WindowsSourceProvider(), + new DefaultPullStrategy.Provider()).produce(); //safe + + notClosedSource = new WindowsSourceProvider().source(CreationOptions.defaults()); + } + + @AfterAll + public static void teardown() throws IOException { + testingTick.stop(); + + notClosedSource.getClient().close(); + } + + @Test + public void When_ContainerNameDuplicates_ThrowCE() { + + + assertThrows(IllegalStateException.class, () -> { + testingTick.createContainer(new TinyImageTerms("the-same")); + testingTick.createContainer(new TinyImageTerms("the-same")); + }); + + assertThrows(NotFoundException.class, () -> { + testingTick.expose().getClient().inspectContainerCmd("the-same").exec(); //removed + }); + + + } + +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineContainer.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyContainer.java similarity index 81% rename from tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineContainer.java rename to tickbox-api/src/test/java/xyz/auriium/tick/container/TinyContainer.java index 1c0c38c..545032e 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineContainer.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyContainer.java @@ -3,13 +3,13 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import xyz.auriium.tick.centralized.ResourceManager; -public class AlpineContainer implements TickContainer{ +public class TinyContainer implements TickContainer{ private final ResourceManager manager; private final String name; private final String id; - public AlpineContainer(ResourceManager manager, String name, String id) { + public TinyContainer(ResourceManager manager, String name, String id) { this.manager = manager; this.name = name; this.id = id; diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineTerms.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java similarity index 50% rename from tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineTerms.java rename to tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java index 0eb3153..fa96790 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/AlpineTerms.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java @@ -1,16 +1,18 @@ package xyz.auriium.tick.container; +import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.PortBinding; import xyz.auriium.tick.centralized.ResourceManager; import xyz.auriium.tick.docker.source.DockerSource; +import xyz.auriium.tick.utils.Optionals; import java.util.Optional; -public class AlpineTerms implements CreationTerms{ +public class TinyImageTerms implements CreationTerms{ private final String name; - public AlpineTerms(String name) { + public TinyImageTerms(String name) { this.name = name; } @@ -25,17 +27,27 @@ public String[] getParameters() { } @Override - public Optional getBinding() { + public Optional getBinds() { return Optional.empty(); } + @Override + public Optional getPortBindings() { + return Optional.empty(); + } + + @Override + public Optional getCommands() { + return Optionals.supply("top"); + } + @Override public String getContainerName() { return name; } @Override - public AlpineContainer instantiateHolder(DockerSource location, ResourceManager manager, String dockerID) { - return new AlpineContainer(manager, name, dockerID); + public TinyContainer instantiateHolder(DockerSource location, ResourceManager manager, String dockerID) { + return new TinyContainer(manager, name, dockerID); } } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyMessedUpPorts.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyMessedUpPorts.java new file mode 100644 index 0000000..f4cc6c6 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyMessedUpPorts.java @@ -0,0 +1,17 @@ +package xyz.auriium.tick.container; + +import com.github.dockerjava.api.model.PortBinding; +import xyz.auriium.tick.utils.Optionals; + +import java.util.Optional; + +public class TinyMessedUpPorts extends TinyImageTerms{ + public TinyMessedUpPorts(String name) { + super(name); + } + + @Override + public Optional getPortBindings() { + return Optionals.supply(PortBinding.parse("55:55"), PortBinding.parse("55:55")); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/provider/AutoProviderTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/provider/AutoProviderTest.java new file mode 100644 index 0000000..713254c --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/provider/AutoProviderTest.java @@ -0,0 +1,4 @@ +package xyz.auriium.tick.provider; + +public class AutoProviderTest { +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/provider/SystemEnvProviderTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/provider/SystemEnvProviderTest.java new file mode 100644 index 0000000..6a8a12a --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/provider/SystemEnvProviderTest.java @@ -0,0 +1,22 @@ +package xyz.auriium.tick.provider; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.centralized.Tick; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; +import xyz.auriium.tick.docker.source.impl.SystemEnvSourceProvider; + +@Disabled //TODO mocking system envs +public class SystemEnvProviderTest { + + @Test + public void startup() { + Tick tick = new CommonTickFactory( + new HookResourceManager.Provider(false), + new SystemEnvSourceProvider(), + new DefaultPullStrategy.Provider()).produce(); + } + +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java new file mode 100644 index 0000000..01fc32f --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java @@ -0,0 +1,40 @@ +package xyz.auriium.tick.provider; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import xyz.auriium.tick.BaseTest; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.centralized.Tick; +import xyz.auriium.tick.container.TickContainer; +import xyz.auriium.tick.container.TinyImageTerms; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; +import xyz.auriium.tick.docker.source.impl.UnixSourceProvider; +import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; + +@EnabledOnOs(OS.LINUX) +public class UnixProviderTest extends BaseTest { + + private static volatile Tick tick; + + @BeforeAll + public static void startup() { + tick = new CommonTickFactory( + new HookResourceManager.Provider(false), + new UnixSourceProvider(), + new DefaultPullStrategy.Provider()).produce(); + } + + @AfterAll + public static void teardown() { + tick.stop(); + } + + @Test + public void whenCreated_ContainerWorksFine() { + TickContainer container = tick.createContainer(new TinyImageTerms("unix-test")); + } +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/WindowsProviderTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/provider/WindowsProviderTest.java similarity index 61% rename from tickbox-api/src/test/java/xyz/auriium/tick/WindowsProviderTest.java rename to tickbox-api/src/test/java/xyz/auriium/tick/provider/WindowsProviderTest.java index 200144a..3ff6a2b 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/WindowsProviderTest.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/provider/WindowsProviderTest.java @@ -1,35 +1,43 @@ -package xyz.auriium.tick; +package xyz.auriium.tick.provider; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import xyz.auriium.tick.BaseTest; import xyz.auriium.tick.centralized.CommonTickFactory; import xyz.auriium.tick.centralized.HookResourceManager; import xyz.auriium.tick.centralized.Tick; -import xyz.auriium.tick.container.AlpineTerms; import xyz.auriium.tick.container.TickContainer; +import xyz.auriium.tick.container.TinyImageTerms; import xyz.auriium.tick.docker.image.DefaultPullStrategy; import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; -public class WindowsProviderTest { +@EnabledOnOs(OS.WINDOWS) +public class WindowsProviderTest extends BaseTest { private static volatile Tick tick; @BeforeAll public static void startup() { + + tick = new CommonTickFactory( - new HookResourceManager.Provider(true), + new HookResourceManager.Provider(false), new WindowsSourceProvider(), new DefaultPullStrategy.Provider()).produce(); } - @Test - public void test() { - TickContainer container = tick.createContainer(new AlpineTerms("the-cheese-man")); - } - @AfterAll public static void teardown() { tick.stop(); } + + @Test + public void whenCreated_ContainerWorksFine() { + TickContainer container = tick.createContainer(new TinyImageTerms("windows-test")); + } + + } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/shutdown/ShutdownHookTest.java similarity index 86% rename from tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java rename to tickbox-api/src/test/java/xyz/auriium/tick/shutdown/ShutdownHookTest.java index 811bc0d..7bef965 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/ShutdownHookTest.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/shutdown/ShutdownHookTest.java @@ -1,6 +1,7 @@ -package xyz.auriium.tick; +package xyz.auriium.tick.shutdown; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.condition.EnabledOnOs; import org.junit.jupiter.api.condition.OS; import xyz.auriium.tick.centralized.CommonTickFactory; @@ -9,7 +10,7 @@ import xyz.auriium.tick.docker.image.DefaultPullStrategy; import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; -@EnabledOnOs(OS.LINUX) +@Disabled //TODO how do we mock system? public class ShutdownHookTest { private static volatile Tick tick; @@ -23,4 +24,9 @@ public static void startup() { } + + + + + } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/shutdown/TickClosureTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/shutdown/TickClosureTest.java new file mode 100644 index 0000000..d4c709a --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/shutdown/TickClosureTest.java @@ -0,0 +1,62 @@ +package xyz.auriium.tick.shutdown; + +import com.github.dockerjava.api.exception.NotFoundException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import xyz.auriium.tick.BaseTest; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.centralized.Tick; +import xyz.auriium.tick.container.CreationOptions; +import xyz.auriium.tick.container.TinyImageTerms; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; +import xyz.auriium.tick.docker.source.DockerSource; +import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@EnabledOnOs(OS.WINDOWS) +public class TickClosureTest extends BaseTest { + + private static volatile DockerSource notClosedSource; + + @BeforeAll + public static void startup() { + notClosedSource = new WindowsSourceProvider().source(CreationOptions.defaults()); + } + + @AfterAll + public static void teardown() throws IOException { + notClosedSource.getClient().close(); + } + + @Test + public void whenStopped_ContainerShouldNotExist() { + Tick tick = new CommonTickFactory(new HookResourceManager.Provider(false), new WindowsSourceProvider(), new DefaultPullStrategy.Provider()).produce(); + + tick.createContainer(new TinyImageTerms("should-not-exist")); + + tick.stop(); + + assertThrows(NotFoundException.class, () -> { + notClosedSource.getClient().inspectContainerCmd("should-not-exist").exec(); + }); + } + + @Test + public void whenStopped_ContainerShouldNotAllowExpose() { + Tick tick = new CommonTickFactory(new HookResourceManager.Provider(false), new WindowsSourceProvider(), new DefaultPullStrategy.Provider()).produce(); + + tick.createContainer(new TinyImageTerms("should-not-expose")); + + tick.stop(); + } + + +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTest.java new file mode 100644 index 0000000..469fdb3 --- /dev/null +++ b/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTest.java @@ -0,0 +1,25 @@ +package xyz.auriium.tick.startup; + +import com.github.dockerjava.api.exception.DockerClientException; +import org.apache.http.client.ClientProtocolException; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import xyz.auriium.tick.PostCreationTestException; +import xyz.auriium.tick.centralized.CommonTickFactory; +import xyz.auriium.tick.centralized.HookResourceManager; +import xyz.auriium.tick.docker.image.DefaultPullStrategy; +import xyz.auriium.tick.startup.BadSourceProvider; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class BadStartupTest { + + @Test + public void shouldThrowWhenBadSourceProvided() { + assertThrows(DockerClientException.class, () -> { + new CommonTickFactory(new HookResourceManager.Provider(false), new BadSourceProvider(), new DefaultPullStrategy.Provider()).produce(); + }); + + } + +} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java b/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java deleted file mode 100644 index dfabe72..0000000 --- a/tickbox-api/src/test/java/xyz/auriium/tick/startup/BadStartupTests.java +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.auriium.tick.startup; - -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import xyz.auriium.tick.centralized.CommonTickFactory; -import xyz.auriium.tick.centralized.HookResourceManager; -import xyz.auriium.tick.docker.image.DefaultPullStrategy; - -public class BadStartupTests { - - @Test - public void badStartupTest() { - new CommonTickFactory(new HookResourceManager.Provider(false), new BadSourceProvider(), new DefaultPullStrategy.Provider()).produce(); - } - -} diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/logback-test.xml b/tickbox-api/src/test/resources/logback-test.xml similarity index 94% rename from tickbox-api/src/test/java/xyz/auriium/tick/logback-test.xml rename to tickbox-api/src/test/resources/logback-test.xml index 898887f..afaebf8 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/logback-test.xml +++ b/tickbox-api/src/test/resources/logback-test.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java index 7dba43d..c14620c 100644 --- a/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java +++ b/tickbox-containers-sql/src/main/java/xyz/auriium/tick/containers/sql/mariadb/MariaDBTerms.java @@ -1,5 +1,6 @@ package xyz.auriium.tick.containers.sql.mariadb; +import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.PortBinding; import xyz.auriium.tick.centralized.ResourceManager; import xyz.auriium.tick.containers.sql.JDBCConfig; @@ -15,6 +16,9 @@ * * external port is the exposed port of the mariadb container, but still * + * + * EVERYTHING HERE NEEDS A TON OF WORK. JDBC SUPPORT FOR TESTCONTAINERS IS SOMETHING I AM ADDING TOMORROW NOT TONIGHT. + * * TODO: image searching and guaruntees */ public class MariaDBTerms implements JDBCTerms { @@ -50,8 +54,18 @@ public String[] getParameters() { } @Override - public Optional getBinding() { - return Optional.of(args.getBinding()); + public Optional getBinds() { + return Optional.empty(); + } + + @Override + public Optional getPortBindings() { + return Optional.of(new PortBinding[]{args.getBinding()}); + } + + @Override + public Optional getCommands() { + return Optional.empty(); } @Override From 3d27f2548ba599de0067b68c0b9cd85fecac1da6 Mon Sep 17 00:00:00 2001 From: "Aurium_ @SolarMC" Date: Sat, 24 Jul 2021 20:19:48 -0700 Subject: [PATCH 18/23] Delete .idea directory --- .idea/.gitignore | 3 - .idea/codeStyles/Project.xml | 7 -- .idea/codeStyles/codeStyleConfig.xml | 5 -- .idea/compiler.xml | 28 ------ .idea/discord.xml | 6 -- .idea/encodings.xml | 8 -- .idea/jarRepositories.xml | 55 ------------ .idea/misc.xml | 28 ------ .idea/uiDesigner.xml | 124 --------------------------- .idea/vcs.xml | 6 -- 10 files changed, 270 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/codeStyles/Project.xml delete mode 100644 .idea/codeStyles/codeStyleConfig.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/discord.xml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/uiDesigner.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d3352..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 919ce1f..0000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a1..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index f652973..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml deleted file mode 100644 index cd711a0..0000000 --- a/.idea/discord.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 062fe59..0000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index 84c543b..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 4a61276..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index e96534f..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 61b1cc1850a1305c38cc962a244200aa45872519 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 26 Jul 2021 18:55:55 -0700 Subject: [PATCH 19/23] switch to redis so github actions doesnt have a stroke --- .../auriium/tick/centralized/CommonTick.java | 37 ++++++++++++++----- .../tick/container/BadContainerTest.java | 8 ++++ .../tick/container/TinyImageTerms.java | 11 +++++- .../tick/provider/UnixProviderTest.java | 1 - 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java index 7403862..9b1f1ea 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/centralized/CommonTick.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.command.CreateContainerCmd; import com.github.dockerjava.api.command.CreateContainerResponse; import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.exception.BadRequestException; import com.github.dockerjava.api.exception.ConflictException; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.model.Bind; @@ -41,6 +42,7 @@ public T createContainer(CreationTerms terms) { strategy.loadIfRequired(terms.getDockerImageName()); + logger.info("Initializing container!"); logger.info("Using image: {}", terms.getDockerImageName()); logger.info("Using container name: {}", terms.getContainerName()); @@ -66,7 +68,18 @@ public T createContainer(CreationTerms terms) { manager.submitContainer(id,false); logger.info("Container created! Starting container now."); - client.startContainerCmd(id).exec(); + try { + client.startContainerCmd(id).exec(); + } catch (BadRequestException exception) { + + //time to remove + logger.error("Error during startup of container. Exiting early. Printing stacktrace below."); + manager.destroyContainer(id); + logger.error("Removed bad container. Exiting now! Sorry!"); + + throw new IllegalStateException("An exception occurred while trying to start the container: " + exception); + } + InspectContainerResponse response1 = client.inspectContainerCmd(id).exec(); @@ -88,24 +101,30 @@ public DockerSource expose() { return location; } + //this all sucks i hate it //A try/catch is required here in order for container to not persist and be effectively removed. //all of this is hacky and gross so if anyone finds a better way please make a PR CreateContainerResponse execDirtyHandlingException(CreateContainerCmd cmd) { try { return cmd.exec(); } catch (ConflictException e) { - logger.error("Error during execution: Two containers of the same name exist. Attempting to resolve. Printing stacktrace below:"); + logger.error("Error during execution: Two containers of the same name exist. Destroying container and exiting early. Printing stacktrace below:"); + + return getCreateContainerResponse(e, e.getMessage()); + } + } - String s = e.getMessage(); + //destroy an invalid container + CreateContainerResponse getCreateContainerResponse(ConflictException e2, String message) { + String s = e2.getMessage(); - s = s.substring(s.indexOf("r \\\"") + 4); - s = s.substring(0, s.indexOf("\\\".")); + s = s.substring(s.indexOf("r \\\"") + 4); + s = s.substring(0, s.indexOf("\\\".")); - manager.destroyContainer(s); - logger.error("Removed bad container. Exiting now! Sorry!"); + manager.destroyContainer(s); + logger.error("Removed bad container. Exiting now! Sorry!"); - throw new IllegalStateException(e.getMessage()); - } + throw new IllegalStateException(message); } @Override diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java index be3c121..f722903 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/BadContainerTest.java @@ -57,4 +57,12 @@ public void When_ContainerNameDuplicates_ThrowCE() { } + public void When_BadImage_PurgesSafely() { + + assertThrows(IllegalStateException.class, () -> { + testingTick.createContainer(new TinyImageTerms("the-same", "hello-world")); + }); + + } + } diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java index fa96790..9d8f407 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java @@ -11,14 +11,21 @@ public class TinyImageTerms implements CreationTerms{ private final String name; + private final String image; + + public TinyImageTerms(String name, String image) { + this.name = name; + this.image = image; + } public TinyImageTerms(String name) { this.name = name; + this.image = "redis:latest"; } @Override public String getDockerImageName() { - return "alpine:latest"; + return image; } @Override @@ -38,7 +45,7 @@ public Optional getPortBindings() { @Override public Optional getCommands() { - return Optionals.supply("top"); + return Optional.empty(); } @Override diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java b/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java index 01fc32f..742cba9 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/provider/UnixProviderTest.java @@ -13,7 +13,6 @@ import xyz.auriium.tick.container.TinyImageTerms; import xyz.auriium.tick.docker.image.DefaultPullStrategy; import xyz.auriium.tick.docker.source.impl.UnixSourceProvider; -import xyz.auriium.tick.docker.source.impl.WindowsSourceProvider; @EnabledOnOs(OS.LINUX) public class UnixProviderTest extends BaseTest { From bf90b0bcd778ac0f0917b6d64d93881c37856bfb Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 26 Jul 2021 19:29:31 -0700 Subject: [PATCH 20/23] please github actions please work --- .../test/java/xyz/auriium/tick/container/TinyImageTerms.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java index 9d8f407..195e7d5 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java @@ -20,7 +20,7 @@ public TinyImageTerms(String name, String image) { public TinyImageTerms(String name) { this.name = name; - this.image = "redis:latest"; + this.image = "mongo:latest"; } @Override From 7a7da6366cb784b1d14f0c5573f4ce362ea61156 Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 26 Jul 2021 19:36:01 -0700 Subject: [PATCH 21/23] fuck it figure it out later --- .../test/java/xyz/auriium/tick/container/TinyImageTerms.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java index 195e7d5..f417f30 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java @@ -20,7 +20,7 @@ public TinyImageTerms(String name, String image) { public TinyImageTerms(String name) { this.name = name; - this.image = "mongo:latest"; + this.image = "alpine:latest"; } @Override From 10c058cf3828b3279e600b448a0dc1008687c28d Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 26 Jul 2021 19:38:39 -0700 Subject: [PATCH 22/23] how the fuck did it turn into windows windows is not unix based --- .../xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java index b7ceac0..b3f0000 100644 --- a/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java +++ b/tickbox-api/src/main/java/xyz/auriium/tick/docker/source/impl/UnixSourceProvider.java @@ -33,7 +33,7 @@ public Integer priority() { @Override public ApplicableResult isApplicable() { - if (!(SystemUtils.IS_OS_WINDOWS || SystemUtils.IS_OS_MAC)) return ApplicableResult.fail("System is not UNIX based!"); + if (!(SystemUtils.IS_OS_LINUX || SystemUtils.IS_OS_MAC)) return ApplicableResult.fail("System is not UNIX based!"); Integer mode; try { From 42a1b0be8ed5615bf5660625bd5e349beebdd080 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 27 Jul 2021 11:03:57 -0700 Subject: [PATCH 23/23] add top command back --- .../test/java/xyz/auriium/tick/container/TinyImageTerms.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java index f417f30..6047eb9 100644 --- a/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java +++ b/tickbox-api/src/test/java/xyz/auriium/tick/container/TinyImageTerms.java @@ -45,7 +45,7 @@ public Optional getPortBindings() { @Override public Optional getCommands() { - return Optional.empty(); + return Optionals.supply("top"); } @Override