diff options
author | axtloss <axtlos@getcryst.al> | 2023-05-23 09:21:20 +0200 |
---|---|---|
committer | axtloss <axtlos@getcryst.al> | 2023-05-23 09:21:20 +0200 |
commit | 00b6b9f59e35d01abff7c6c4435c1ce4b30b766c (patch) | |
tree | 85be1e317ee3db834e2b5005b436d71ee08f00b9 /src/main/java/io/github/jshipit | |
parent | a4fa9a8622ddf1226db706556db9e96853ea4e28 (diff) | |
download | jshipit-00b6b9f59e35d01abff7c6c4435c1ce4b30b766c.tar.gz jshipit-00b6b9f59e35d01abff7c6c4435c1ce4b30b766c.tar.bz2 |
Add stuff
Diffstat (limited to 'src/main/java/io/github/jshipit')
-rwxr-xr-x | src/main/java/io/github/jshipit/ImageBuilder.java | 19 | ||||
-rwxr-xr-x | src/main/java/io/github/jshipit/JshipIT.java | 6 | ||||
-rwxr-xr-x | src/main/java/io/github/jshipit/OCIDataStore.java | 132 |
3 files changed, 157 insertions, 0 deletions
diff --git a/src/main/java/io/github/jshipit/ImageBuilder.java b/src/main/java/io/github/jshipit/ImageBuilder.java new file mode 100755 index 0000000..743ff1a --- /dev/null +++ b/src/main/java/io/github/jshipit/ImageBuilder.java @@ -0,0 +1,19 @@ +package io.github.jshipit;
+
+public class ImageBuilder {
+
+ private String[] layers;
+
+ public ImageBuilder(String[] layers) {
+ this.layers = layers;
+ }
+
+ /*
+ * Assembles a tarball from the layers
+ */
+ public void assemble() {
+
+ System.out.println("Assembling image");
+ }
+
+}
diff --git a/src/main/java/io/github/jshipit/JshipIT.java b/src/main/java/io/github/jshipit/JshipIT.java index 4044a39..165d0bd 100755 --- a/src/main/java/io/github/jshipit/JshipIT.java +++ b/src/main/java/io/github/jshipit/JshipIT.java @@ -9,6 +9,7 @@ import java.nio.file.Path; public class JshipIT { public JshipIT() { + /* DockerAPIHelper api = new DockerAPIHelper("registry.getcryst.al","crystal/misc", "docker", "latest"); JsonNode manifest = null; @@ -38,5 +39,10 @@ public class JshipIT { e.printStackTrace(); } } + + */ + + OCIDataStore dataStore = new OCIDataStore("./tmp"); + dataStore.createImage("registry.getcryst.al","crystal/misc", "docker", "latest"); } }
\ No newline at end of file diff --git a/src/main/java/io/github/jshipit/OCIDataStore.java b/src/main/java/io/github/jshipit/OCIDataStore.java new file mode 100755 index 0000000..eaceff4 --- /dev/null +++ b/src/main/java/io/github/jshipit/OCIDataStore.java @@ -0,0 +1,132 @@ +package io.github.jshipit;
+
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.file.FileAlreadyExistsException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class OCIDataStore {
+
+ private String path;
+ private String databasePath;
+
+ public OCIDataStore(String path) {
+ this.path = path;
+ this.databasePath = path + "/datstore.db";
+ createStore();
+ try {
+ createStoreDatabase();
+ } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ private void createStore() {
+ System.out.println("Creating OCI Data Store");
+ Path path = Path.of(this.path);
+ try {
+ Files.createDirectory(path);
+ } catch (IOException e) {
+ System.out.println("Failed to create directory: " + path);
+ e.printStackTrace();
+ }
+ }
+
+ private void createStoreDatabase() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
+ String url = "jdbc:sqlite:" + this.databasePath;
+
+ try (Connection conn = DriverManager.getConnection(url)) {
+ if (conn != null) {
+ DatabaseMetaData meta = conn.getMetaData();
+ Statement statement = conn.createStatement();
+ statement.setQueryTimeout(30); // set timeout to 30 sec.
+
+ statement.executeUpdate("CREATE TABLE IF NOT EXISTS blobs (id INTEGER PRIMARY KEY AUTOINCREMENT, digest TEXT, path TEXT)");
+ System.out.println("A new database has been created.");
+ }
+
+ } catch (SQLException e) {
+ System.out.println(e.getMessage());
+ }
+ }
+
+ public void createImage(String apiRepo, String repo, String image, String tag) {
+
+ Path imgPath = Path.of(this.path+"/"+image);
+ try {
+ Files.createDirectory(imgPath);
+ } catch (IOException e) {
+ System.out.println("Failed to create directory: " + imgPath);
+ }
+
+ Path tagPath = Path.of(this.path+"/"+image+"/"+tag);
+ try {
+ Files.createDirectory(tagPath);
+ } catch (IOException e) {
+ System.out.println("Failed to create directory: " + tagPath);
+ e.printStackTrace();
+ return;
+ }
+
+ DockerAPIHelper api = new DockerAPIHelper(apiRepo, repo, image, tag);
+ JsonNode manifest = null;
+
+ try {
+ manifest = api.fetchManifestJson();
+ } catch (IOException ignored) {} // Proper error handling is bloat
+
+ System.out.println("Manifest: " + manifest);
+
+ Path path = Path.of(this.path+"/"+api.getImage()+"/"+api.getTag());
+ try {
+ Files.createDirectory(path);
+ } catch (IOException e) {
+ if (!(e instanceof FileAlreadyExistsException)) {
+ System.out.println("Failed to create directory: " + path);
+ e.printStackTrace();
+ return;
+ }
+ }
+
+ assert manifest != null;
+ JsonNode layers = manifest.get("layers");
+ List<String> digests = new ArrayList<String>();
+ String layerpath = this.path+"/blobs";
+ try {
+ Files.createDirectory(Path.of(layerpath));
+ } catch (IOException e) {
+ if (!(e instanceof FileAlreadyExistsException)) {
+ System.out.println("Failed to create directory: " + layerpath);
+ e.printStackTrace();
+ return;
+ }
+ }
+ for (JsonNode layer : layers) {
+ System.out.println("Layer: " + layer);
+
+ try {
+ api.fetchBlob(layer.get("digest").asText(), layerpath);
+ digests.add(layer.get("digest").asText());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ FileWriter writer = null;
+ try {
+ writer = new FileWriter(this.path+"/"+image+"/"+tag+"/layers");
+ writer.write(String.join("\n", digests));
+ writer.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
|