Skip to content
Closed
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
10 changes: 10 additions & 0 deletions src/main/java/land/oras/Index.java
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,16 @@ public Subject getSubject() {
return subject;
}

/**
* Return a new index with the given artifact type
* @param artifactType The artifact type
* @return The index
*/
public Index withArtifactType(String artifactType) {
return new Index(
schemaVersion, mediaType, artifactType, manifests, annotations, subject, descriptor, registry, json);
}

/**
* Return a new index with the given subject
* @param subject The subject
Expand Down
11 changes: 11 additions & 0 deletions src/test/java/land/oras/IndexTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,17 @@ void shouldAddManifests() {
assertNull(notFound);
}

@Test
void shouldAddArtifactType() {
Index index = Index.fromManifests(List.of());
index = index.withArtifactType("application/vnd.opentofu.provider");
assertNotNull(index.getArtifactType());
assertEquals("application/vnd.opentofu.provider", index.getArtifactType().getMediaType());
assertEquals(
"{\"schemaVersion\":2,\"mediaType\":\"application/vnd.oci.image.index.v1+json\",\"artifactType\":\"application/vnd.opentofu.provider\",\"manifests\":[]}",
index.toJson());
}

@Test
void shouldAddSubject() {
Index index = Index.fromManifests(List.of());
Expand Down
93 changes: 93 additions & 0 deletions src/test/java/land/oras/OpenTofuITCase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
/*-
* =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 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 demonstrates how to assemble an OpenTofu provider OCI artifact.
* See https://opentofu.org/docs/cli/oci_registries/provider-mirror/ for the specification.
*/
@Test
void shouldAssembleOpenTofuProviderArtifact() {

// The provider zip archive for linux/amd64
Path providerZip = Paths.get("src/test/resources/archives")
.resolve("terraform-provider-aws_5.0.0_linux_amd64.zip");
String artifactType = "application/vnd.opentofu.provider";
String contentMediaType = "application/zip";

// Create objects for the linux/amd64 platform manifest
// The artifact type identifies the manifest as an OpenTofu provider; config is left empty
Config config = Config.empty();
Layer layer = Layer.fromFile(providerZip).withMediaType(contentMediaType);
Manifest manifest = Manifest.empty()
.withArtifactType(ArtifactType.from(artifactType))
.withConfig(config)
.withLayers(List.of(layer));

// Push config, layer and manifest to registry
Registry registry = Registry.builder()
.insecure()
.withRegistry(unsecureRegistry.getRegistry())
.build();

// The manifest is pushed without a version tag; the index will be tagged
ContainerRef manifestRef = ContainerRef.parse("terraform-provider-aws:5.0.0-linux-amd64");
registry.pushConfig(manifestRef, config);
registry.pushBlob(manifestRef, providerZip);
Manifest pushedManifest = registry.pushManifest(manifestRef, manifest);

// Ensure the manifest was pushed successfully
assertNotNull(pushedManifest);

// Build the index with the manifest descriptor, annotated with the linux/amd64 platform
// The index artifact type also identifies the whole provider release as an OpenTofu provider
ManifestDescriptor manifestDescriptor =
pushedManifest.getDescriptor().withPlatform(Platform.linuxAmd64());
Index index = Index.fromManifests(List.of(manifestDescriptor)).withArtifactType(artifactType);

// Push the index with the provider version tag
ContainerRef indexRef = ContainerRef.parse("terraform-provider-aws:5.0.0");
Index pushedIndex = registry.pushIndex(indexRef, index);

// Ensure the index was pushed and contains the linux/amd64 manifest
assertNotNull(pushedIndex);
assertNotNull(pushedIndex.findUnique(Platform.linuxAmd64()));
}
}
Binary file not shown.
Loading