From 00b6b9f59e35d01abff7c6c4435c1ce4b30b766c Mon Sep 17 00:00:00 2001 From: axtloss Date: Tue, 23 May 2023 09:21:20 +0200 Subject: Add stuff --- pom.xml | 6 +- src/main/java/io/github/jshipit/ImageBuilder.java | 19 ++++ src/main/java/io/github/jshipit/JshipIT.java | 6 + src/main/java/io/github/jshipit/OCIDataStore.java | 132 ++++++++++++++++++++++ 4 files changed, 162 insertions(+), 1 deletion(-) create mode 100755 src/main/java/io/github/jshipit/ImageBuilder.java create mode 100755 src/main/java/io/github/jshipit/OCIDataStore.java diff --git a/pom.xml b/pom.xml index cb57fe8..9cf798b 100755 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,11 @@ progressbar 0.9.5 - + + org.xerial + sqlite-jdbc + 3.42.0.0 + 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 digests = new ArrayList(); + 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); + } + } + +} -- cgit v1.2.3