From 33ae6acb52051d9d87f15e6dca4cdb69c21d5e6d Mon Sep 17 00:00:00 2001 From: Valentin Delaye Date: Tue, 24 Feb 2026 08:05:53 +0100 Subject: [PATCH] Add test that assemble OpenTofu provider Signed-off-by: Valentin Delaye --- .../java/land/oras/ManifestDescriptor.java | 29 ++++++ src/main/java/land/oras/Registry.java | 4 +- src/test/java/land/oras/HarborS3ITCase.java | 2 +- .../land/oras/ManifestDescriptorTest.java | 13 +++ src/test/java/land/oras/OpenTofuITCase.java | 97 ++++++++++++++++++ src/test/resources/img/opentofu.png | Bin 0 -> 24751 bytes 6 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 src/test/java/land/oras/OpenTofuITCase.java create mode 100644 src/test/resources/img/opentofu.png diff --git a/src/main/java/land/oras/ManifestDescriptor.java b/src/main/java/land/oras/ManifestDescriptor.java index 162c0b40..5bea00cb 100644 --- a/src/main/java/land/oras/ManifestDescriptor.java +++ b/src/main/java/land/oras/ManifestDescriptor.java @@ -28,6 +28,7 @@ import java.util.Objects; import land.oras.utils.Const; import land.oras.utils.JsonUtils; +import land.oras.utils.SupportedAlgorithm; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; @@ -210,6 +211,34 @@ public static ManifestDescriptor of(Descriptor descriptor) { return of(descriptor, descriptor.getDigest()); } + /** + * Utility method. Useful when assembly manifest to be added to an Index using no platform, empty annotations and default supported algorithm + * @param manifest The manifest + * @return The manifest descriptor + */ + public static ManifestDescriptor of(Manifest manifest) { + return of(manifest, Platform.empty(), Annotations.empty(), SupportedAlgorithm.getDefault()); + } + + /** + * Utility method. Useful when assembly manifest to be added to an Index + * @param manifest The manifest + * @param platform The platform + * @param annotations The annotations + * @param supportedAlgorithm The supported algorithm to calculate the digest of the manifest + * @return The manifest descriptor + */ + public static ManifestDescriptor of( + Manifest manifest, Platform platform, Annotations annotations, SupportedAlgorithm supportedAlgorithm) { + String json = manifest.toJson(); + String digest = supportedAlgorithm.digest(json.getBytes()); + long size = json.length(); + return ManifestDescriptor.of(manifest.getMediaType(), digest, size) + .withAnnotations(annotations.manifestAnnotations()) + .withPlatform(platform) + .withArtifactType(manifest.getArtifactTypeAsString()); + } + /** * Create a manifest descriptor with the given digest * @param descriptor The descriptor diff --git a/src/main/java/land/oras/Registry.java b/src/main/java/land/oras/Registry.java index 83a3c9f0..32581eeb 100644 --- a/src/main/java/land/oras/Registry.java +++ b/src/main/java/land/oras/Registry.java @@ -262,7 +262,7 @@ public Manifest pushManifest(ContainerRef containerRef, Manifest manifest) { } ContainerRef ref = containerRef.forRegistry(this).checkBlocked(this); if (ref.isInsecure(this) && !this.isInsecure()) { - return asInsecure().pushManifest(containerRef, manifest); + return asInsecure().pushManifest(ref, manifest); } URI uri = URI.create("%s://%s".formatted(getScheme(), ref.getManifestsPath(this))); byte[] manifestData = manifest.getJson() != null @@ -284,7 +284,7 @@ public Manifest pushManifest(ContainerRef containerRef, Manifest manifest) { "Subject was set on manifest but not OCI subject header was returned. Legacy flow not implemented"); } } - return getManifest(containerRef); + return getManifest(ref); } @Override diff --git a/src/test/java/land/oras/HarborS3ITCase.java b/src/test/java/land/oras/HarborS3ITCase.java index e3288ce1..4ed8c6c7 100644 --- a/src/test/java/land/oras/HarborS3ITCase.java +++ b/src/test/java/land/oras/HarborS3ITCase.java @@ -91,7 +91,7 @@ void shouldPushFluxArtifact() { // The compressed manifests Path archive = Paths.get("src/test/resources/archives").resolve("flux-manifests.tgz"); - Path image = Paths.get("src/test/resources/img").resolve("flux-cd.png"); + Path image = Paths.get("src/test/resources/img").resolve("opentofu.png"); String configMediaType = "application/vnd.cncf.flux.config.v1+json"; String contentMediaType = "application/vnd.cncf.flux.content.v1.tar+gzip"; diff --git a/src/test/java/land/oras/ManifestDescriptorTest.java b/src/test/java/land/oras/ManifestDescriptorTest.java index d1d9a8e8..621d876a 100644 --- a/src/test/java/land/oras/ManifestDescriptorTest.java +++ b/src/test/java/land/oras/ManifestDescriptorTest.java @@ -28,9 +28,22 @@ import org.junit.jupiter.api.parallel.Execution; import org.junit.jupiter.api.parallel.ExecutionMode; +/** + * Test for {@link ManifestDescriptor} + */ @Execution(ExecutionMode.CONCURRENT) class ManifestDescriptorTest { + @Test + void shouldBuildDescriptorFromManifest() { + Manifest manifest = Manifest.empty(); + ManifestDescriptor descriptor = ManifestDescriptor.of(manifest); + assertEquals("sha256:961dcd96e41989cc3cbf17141e0a9b3d39447cdcf2540b844e22b4f207a2e1f1", descriptor.getDigest()); + assertEquals(253, descriptor.getSize()); + assertEquals(Platform.empty(), descriptor.getPlatform()); + assertEquals(Map.of(), descriptor.getAnnotations()); + } + @Test void shouldSetAnnotations() { Manifest manifest = Manifest.empty(); diff --git a/src/test/java/land/oras/OpenTofuITCase.java b/src/test/java/land/oras/OpenTofuITCase.java new file mode 100644 index 00000000..b31ae39d --- /dev/null +++ b/src/test/java/land/oras/OpenTofuITCase.java @@ -0,0 +1,97 @@ +/*- + * =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.SupportedAlgorithm; +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 OpenTofuITCase { + + @Container + private final ZotUnsecureContainer unsecureRegistry = new ZotUnsecureContainer().withStartupAttempts(3); + + /** + * This test demonstrate how to assemble a Flux CD OCI Artifact + */ + @Test + void shouldAssembleProviderArtifact() { + + // The compressed manifests + Path archive = + Paths.get("src/test/resources/archives").resolve("terraform-provider-random_3.8.1_linux_amd64.zip"); + + Annotations annotations = Annotations.empty(); + ArtifactType indexArtifactType = ArtifactType.from("application/vnd.opentofu.provider"); + ArtifactType manifestArtifactType = ArtifactType.from("application/vnd.opentofu.provider-target"); + String contentMediaType = "archive/zip"; + + Path image = Paths.get("src/test/resources/img").resolve("flux-cd.png"); + + Platform linuxAmd64 = Platform.linuxAmd64(); + + // Create objects + Config config = Config.empty(); + Layer layer = Layer.fromFile(archive).withMediaType(contentMediaType); + Layer imageLayer = Layer.fromFile(image) + .withMediaType("image/png") + .withAnnotations(Map.of("io.goharbor.artifact.v1alpha1.icon", "")); + Manifest manifest = Manifest.empty() + .withArtifactType(manifestArtifactType) + .withConfig(config) + .withLayers(List.of(layer, imageLayer)); + + // Index with given platform + ManifestDescriptor manifestDescriptor = + ManifestDescriptor.of(manifest, linuxAmd64, annotations, SupportedAlgorithm.SHA256); + Index index = Index.fromManifests(List.of(manifestDescriptor)).withArtifactType(indexArtifactType); + + // Push config, layers and manifest to registry + Registry registry = Registry.builder() + .defaults() + .insecure() + .withRegistry(unsecureRegistry.getRegistry()) + .build(); + ContainerRef containerRef = ContainerRef.parse("oras/opentofu-providers/terraform-provider-random:3.8.1"); + + registry.pushConfig(containerRef, config); + registry.pushBlob(containerRef, archive); + registry.pushBlob(containerRef, image); + registry.pushManifest(containerRef.withDigest(manifestDescriptor.getDigest()), manifest); + registry.pushIndex(containerRef, index); + + // Ensure we can pull + Index createdIndex = registry.getIndex(containerRef); + assertNotNull(createdIndex); + } +} diff --git a/src/test/resources/img/opentofu.png b/src/test/resources/img/opentofu.png new file mode 100644 index 0000000000000000000000000000000000000000..c812e1a27b7a302169e96b4be5d2a5e7c42c9684 GIT binary patch literal 24751 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 F{|BxF$5sFU literal 0 HcmV?d00001