Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/main/java/land/oras/utils/Const.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,11 @@ private Const() {
*/
public static final String ANNOTATION_TITLE = "org.opencontainers.image.title";

/**
* Annotation for the description
*/
public static final String ANNOTATION_DESCRIPTION = "org.opencontainers.image.description";

/**
* Annotation for the crated date
*/
Expand Down
4 changes: 0 additions & 4 deletions src/test/java/land/oras/FluxCDITCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@
import land.oras.utils.Const;
import land.oras.utils.ZotUnsecureContainer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
import org.testcontainers.junit.jupiter.Container;
Expand All @@ -39,9 +38,6 @@
@Execution(ExecutionMode.CONCURRENT)
class FluxCDITCase {

@TempDir
Path tempDir;

@Container
private final ZotUnsecureContainer unsecureRegistry = new ZotUnsecureContainer().withStartupAttempts(3);

Expand Down
78 changes: 78 additions & 0 deletions src/test/java/land/oras/HarborS3ITCase.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@
import static org.junit.jupiter.api.Assertions.assertNotNull;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import land.oras.utils.Const;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
Expand All @@ -40,6 +44,80 @@ class HarborS3ITCase {
@TempDir
Path tempDir;

/**
* This test demonstrate how to assemble a Flux CD OCI Artifact
*/
@Test
void shouldPushHelmArtifact() {

// The compressed manifests
Path archive = Paths.get("src/test/resources/archives").resolve("jenkins-chart.tgz");
String configMediaType = "application/vnd.cncf.helm.config.v1+json";
String contentMediaType = "application/vnd.cncf.helm.chart.content.v1.tar+gzip";

Map<String, String> annotations = Map.of(
Const.ANNOTATION_DESCRIPTION, "Test helm chart",
Const.ANNOTATION_SOURCE, "git@github.com:jonesbusy/oras-java.git",
Const.ANNOTATION_CREATED, Const.currentTimestamp());

// Create objects
Config config = Config.empty().withMediaType(configMediaType);
Layer layer = Layer.fromFile(archive).withMediaType(contentMediaType);
Manifest manifest =
Manifest.empty().withConfig(config).withLayers(List.of(layer)).withAnnotations(annotations);

// Push config, layers and manifest to registry
Registry registry = Registry.builder().defaults().build();
ContainerRef containerRef = ContainerRef.parse("demo.goharbor.io/oras/chart:0.1.0");

registry.pushConfig(containerRef, config);
registry.pushBlob(containerRef, archive);
registry.pushManifest(containerRef, manifest);

// Ensure we can pull
Manifest createdManifest = registry.getManifest(containerRef);
assertNotNull(createdManifest);

// We can test pull with helm pull oci://demo.goharbor.io/oras/chart --version 0.1.0

}

@Test
@Disabled
void shouldPushFluxArtifact() {

// The compressed manifests
Path archive = Paths.get("src/test/resources/archives").resolve("flux-manifests.tgz");
String configMediaType = "application/vnd.cncf.flux.config.v1+json";
String contentMediaType = "application/vnd.cncf.flux.content.v1.tar+gzip";

Map<String, String> annotations = Map.of(
Const.ANNOTATION_REVISION, "@sha1:6d63912ed9a9443dd01fbfd2991173a246050079",
Const.ANNOTATION_SOURCE, "git@github.com:jonesbusy/oras-java.git",
Const.ANNOTATION_CREATED, Const.currentTimestamp());

// Create objects
Config config = Config.empty().withMediaType(configMediaType);
Layer layer = Layer.fromFile(archive).withMediaType(contentMediaType);
Manifest manifest =
Manifest.empty().withConfig(config).withLayers(List.of(layer)).withAnnotations(annotations);

// Push config, layers and manifest to registry
Registry registry = Registry.builder().defaults().build();
ContainerRef containerRef = ContainerRef.parse("demo.goharbor.io/oras/flux:latest");

registry.pushConfig(containerRef, config);
registry.pushBlob(containerRef, archive);
registry.pushManifest(containerRef, manifest);

// Ensure we can pull
Manifest createdManifest = registry.getManifest(containerRef);
assertNotNull(createdManifest);

// We can test pull with flux pull artifact oci://demo.goharbor.io/oras/flux:latest --output .

}

@Test
@Disabled("Only to test with demo Harbor demo instance")
void shouldGetManifest() {
Expand Down
84 changes: 84 additions & 0 deletions src/test/java/land/oras/HelmITCase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*-
* =LICENSE=
* ORAS Java SDK
* ===
* Copyright (C) 2024 - 2026 ORAS
* ===
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* =LICENSEEND=
*/

package land.oras;

import static org.junit.jupiter.api.Assertions.assertNotNull;

import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Map;
import land.oras.utils.Const;
import land.oras.utils.ZotUnsecureContainer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.parallel.Execution;
import org.junit.jupiter.api.parallel.ExecutionMode;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
@Execution(ExecutionMode.CONCURRENT)
class HelmITCase {

@Container
private final ZotUnsecureContainer unsecureRegistry = new ZotUnsecureContainer().withStartupAttempts(3);

/**
* This test demonstrate how to assemble a Flux CD OCI Artifact
*/
@Test
void shouldAssembleArtifact() {

// The compressed manifests
Path archive = Paths.get("src/test/resources/archives").resolve("jenkins-chart.tgz");
String configMediaType = "application/vnd.cncf.helm.config.v1+json";
String contentMediaType = "application/vnd.cncf.helm.chart.content.v1.tar+gzip";

Map<String, String> annotations = Map.of(
Const.ANNOTATION_DESCRIPTION, "Test helm chart",
Const.ANNOTATION_SOURCE, "git@github.com:jonesbusy/oras-java.git",
Const.ANNOTATION_CREATED, Const.currentTimestamp());

// Create objects
Config config = Config.empty().withMediaType(configMediaType);
Layer layer = Layer.fromFile(archive).withMediaType(contentMediaType);
Manifest manifest =
Manifest.empty().withConfig(config).withLayers(List.of(layer)).withAnnotations(annotations);

// Push config, layers and manifest to registry
Registry registry = Registry.builder()
.insecure()
.withRegistry(unsecureRegistry.getRegistry())
.build();
ContainerRef containerRef = ContainerRef.parse("chart:0.1.0");

registry.pushConfig(containerRef, config);
registry.pushBlob(containerRef, archive);
registry.pushManifest(containerRef, manifest);

// Ensure we can pull
Manifest createdManifest = registry.getManifest(containerRef);
assertNotNull(createdManifest);

// We can test pull with helm pull oci://localhost:<port>/chart --plain-http --version 0.1.0

}
}