aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/jshipit/ContainerManager.java
diff options
context:
space:
mode:
authoraxtloss <axtlos@getcryst.al>2023-05-25 21:16:57 +0200
committeraxtloss <axtlos@getcryst.al>2023-05-25 21:16:57 +0200
commitfda79997703823e7d65e9f639a3247119a97e5b3 (patch)
tree6dae8fe59ef4b3246a2463b2bef7053387aac450 /src/main/java/io/github/jshipit/ContainerManager.java
parent88ff8a69891ad8193876bd6fcad7524a57151e80 (diff)
downloadjshipit-fda79997703823e7d65e9f639a3247119a97e5b3.tar.gz
jshipit-fda79997703823e7d65e9f639a3247119a97e5b3.tar.bz2
Add function to start container
I cannot understand any of this anymore. Oh well :shipit:
Diffstat (limited to 'src/main/java/io/github/jshipit/ContainerManager.java')
-rw-r--r--src/main/java/io/github/jshipit/ContainerManager.java72
1 files changed, 62 insertions, 10 deletions
diff --git a/src/main/java/io/github/jshipit/ContainerManager.java b/src/main/java/io/github/jshipit/ContainerManager.java
index cacf313..c22d51b 100644
--- a/src/main/java/io/github/jshipit/ContainerManager.java
+++ b/src/main/java/io/github/jshipit/ContainerManager.java
@@ -1,5 +1,9 @@
package io.github.jshipit;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
@@ -8,25 +12,31 @@ import java.util.List;
import java.util.UUID;
public class ContainerManager {
- private String containerID;
private String containerName;
private String containerRepo;
private String containerImage;
private String containerTag;
private String containerApiRepo;
- private String entryCommand;
private OCIDataStore dataStore;
- public ContainerManager(String containerName, String containerImage, String containerTag, String entryCommand, String containerApiRepo, String containerRepo, OCIDataStore dataStore) {
+ public ContainerManager(String containerName, String containerImage, String containerTag, String containerApiRepo, String containerRepo, OCIDataStore dataStore) {
this.containerName = containerName;
this.containerImage = containerImage;
this.containerTag = containerTag;
- this.entryCommand = entryCommand;
this.containerApiRepo = containerApiRepo;
this.containerRepo = containerRepo;
this.dataStore = dataStore;
}
+ public ContainerManager(String containerName, OCIDataStore dataStore) {
+ this.containerName = containerName;
+ this.containerImage = dataStore.getContainerImage(containerName);
+ this.containerTag = dataStore.getContainerTag(containerName);
+ this.containerApiRepo = dataStore.getContainerApiRepo(containerName);
+ this.containerRepo = dataStore.getContainerRepo(containerName);
+ this.dataStore = dataStore;
+ }
+
public void createContainer() {
System.out.println("Creating container");
@@ -35,11 +45,7 @@ public class ContainerManager {
return;
}
- if (this.containerID == null) {
- this.containerID = genContainerID();
- }
-
- String containerDirectory = dataStore.createContainerDirectory(this.containerImage, this.containerTag, this.containerName, this.containerID);
+ String containerDirectory = dataStore.createContainerDirectory(this.containerImage, this.containerTag, this.containerName, this.containerApiRepo, this.containerRepo);
new File(containerDirectory + "/containerOverlay").mkdirs();
new File(containerDirectory + "/root").mkdirs();
@@ -48,7 +54,7 @@ public class ContainerManager {
public void startContainer() {
- String containerDirectory = dataStore.getContainerPath(this.containerName, this.containerID);
+ String containerDirectory = dataStore.getContainerPath(this.containerName);
List<String> content = null;
try {
content = Files.readAllLines(Paths.get(this.dataStore.getPath() + "/" + this.containerImage + "/" + this.containerTag + "/layers"));
@@ -68,6 +74,52 @@ public class ContainerManager {
}
+ public void runCommand(String command) {
+ String containerDirectory = dataStore.getContainerPath(this.containerName);
+ String dataStorePath = dataStore.getPath();
+ startContainer();
+
+ File configPath = new File(dataStorePath + "/" + this.containerImage + "/" + this.containerTag + "/config");
+ String content = null;
+ try {
+ content = Files.readAllLines(Paths.get(configPath.getAbsolutePath())).toString();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ ObjectMapper mapper = new ObjectMapper();
+ List<String> env = new ArrayList<>();
+ String cmd = null;
+ String hostname = null;
+ try {
+ JsonNode config = mapper.readTree(content.toString()).get(0).get("config");
+ config.get("Env").forEach((JsonNode envVar) -> {
+ env.add(envVar.asText());
+ });
+ cmd = config.get("Cmd").get(0).asText();
+ hostname = config.get("Hostname").asText();
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+
+ // why would these be null? I don't know, but I won't bother handling this better
+ assert hostname != null;
+ assert cmd != null;
+
+ List<String> bwrapCommand = new ArrayList<>();
+
+ for(String envVar : env) {
+ bwrapCommand.add("--setenv "+envVar.split("=")[0]+" "+envVar.split("=")[1]);
+ }
+
+ bwrapCommand.add("--ro-bind "+containerDirectory+"/root / --chdir /");
+ bwrapCommand.add("--share-net");
+ bwrapCommand.add("--hostname "+ (!hostname.isBlank() ? hostname : this.containerName+"-"+this.containerImage));
+ bwrapCommand.add(cmd);
+ SysUtils sysUtils = new SysUtils();
+ sysUtils.execInBwrap(bwrapCommand.toArray(new String[0]));
+ }
+
public String genContainerID() {
return UUID.randomUUID().toString();
}