diff --git a/src/test/java/land/oras/FluxCDITCase.java b/src/test/java/land/oras/FluxCDITCase.java new file mode 100644 index 00000000..842c9729 --- /dev/null +++ b/src/test/java/land/oras/FluxCDITCase.java @@ -0,0 +1,88 @@ +/*- + * =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.io.TempDir; +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 FluxCDITCase { + + @TempDir + Path tempDir; + + @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("flux-manifests.tgz"); + String configMediaType = "application/vnd.cncf.flux.config.v1+json"; + String contentMediaType = "application/vnd.cncf.flux.content.v1.tar+gzip"; + + Map 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() + .insecure() + .withRegistry(unsecureRegistry.getRegistry()) + .build(); + ContainerRef containerRef = ContainerRef.parse("manifests: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://localhost:/manifests:latest --output . + + } +} diff --git a/src/test/java/land/oras/utils/ArchiveUtilsTest.java b/src/test/java/land/oras/utils/ArchiveUtilsTest.java index a3c1c993..e6d4feec 100644 --- a/src/test/java/land/oras/utils/ArchiveUtilsTest.java +++ b/src/test/java/land/oras/utils/ArchiveUtilsTest.java @@ -199,7 +199,7 @@ void shouldCreateTarGzAndExtractIt() throws Exception { } @ParameterizedTest - @ValueSource(strings = {"jenkins-chart.tgz", "jenkins-sources.tar.gz"}) + @ValueSource(strings = {"jenkins-chart.tgz", "jenkins-sources.tar.gz", "flux-manifests.tgz"}) @Disabled("https://issues.apache.org/jira/browse/COMPRESS-705") void shouldExtractSeveralExistingArchive(String file) { Path archive = Paths.get("src/test/resources/archives").resolve(file); diff --git a/src/test/resources/archives/flux-manifests.tgz b/src/test/resources/archives/flux-manifests.tgz new file mode 100644 index 00000000..48958000 Binary files /dev/null and b/src/test/resources/archives/flux-manifests.tgz differ