Skip to content

Commit 620c709

Browse files
committed
Compute digest index and avoid rely on Docker-Content-Digest
Signed-off-by: Valentin Delaye <jonesbusy@users.noreply.github.com>
1 parent 8417070 commit 620c709

File tree

4 files changed

+34
-12
lines changed

4 files changed

+34
-12
lines changed

.sdkmanrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
java=17.0.14-tem
1+
java=17.0.18-tem
22
maven=3.9.12

src/main/java/land/oras/ManifestDescriptor.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,14 +188,24 @@ public static ManifestDescriptor of(String mediaType, String digest, long size)
188188
* @return The subject
189189
*/
190190
public static ManifestDescriptor of(Descriptor descriptor) {
191-
Objects.requireNonNull(descriptor.getDigest());
191+
return of(descriptor, descriptor.getDigest());
192+
}
193+
194+
/**
195+
* Create a manifest descriptor with the given digest
196+
* @param descriptor The descriptor
197+
* @param digest The digest
198+
* @return The subject
199+
*/
200+
public static ManifestDescriptor of(Descriptor descriptor, @Nullable String digest) {
192201
Objects.requireNonNull(descriptor.getSize());
202+
Objects.requireNonNull(digest);
193203
return new ManifestDescriptor(
194204
descriptor.getArtifactType() != null
195205
? descriptor.getArtifactType().getMediaType()
196206
: null,
197207
descriptor.getMediaType(),
198-
descriptor.getDigest(),
208+
digest,
199209
descriptor.getSize(),
200210
null,
201211
descriptor.getAnnotations());

src/main/java/land/oras/Registry.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,8 +572,19 @@ public Index getIndex(ContainerRef containerRef) {
572572
if (!isIndexMediaType(contentType)) {
573573
throw new OrasException("Expected index but got %s".formatted(contentType));
574574
}
575-
ManifestDescriptor manifestDescriptor = ManifestDescriptor.of(descriptor);
576-
return Index.fromJson(descriptor.getJson()).withDescriptor(manifestDescriptor);
575+
String json = descriptor.getJson();
576+
String digest = descriptor.getDigest();
577+
if (digest == null) {
578+
LOG.debug("Digest missing from header, using from reference");
579+
digest = containerRef.getDigest();
580+
if (digest == null) {
581+
LOG.debug("Digest missing from reference, computing from content");
582+
digest = containerRef.getAlgorithm().digest(json.getBytes(StandardCharsets.UTF_8));
583+
LOG.debug("Computed index digest: {}", digest);
584+
}
585+
}
586+
ManifestDescriptor manifestDescriptor = ManifestDescriptor.of(descriptor, digest);
587+
return Index.fromJson(json).withDescriptor(manifestDescriptor);
577588
}
578589

579590
@Override

src/test/java/land/oras/PublicECRITCase.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,26 @@
2222

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

25-
import java.nio.file.Path;
26-
import org.junit.jupiter.api.Disabled;
2725
import org.junit.jupiter.api.Test;
28-
import org.junit.jupiter.api.io.TempDir;
2926
import org.junit.jupiter.api.parallel.Execution;
3027
import org.junit.jupiter.api.parallel.ExecutionMode;
3128

3229
@Execution(ExecutionMode.CONCURRENT)
3330
class PublicECRITCase {
3431

35-
@TempDir
36-
Path tempDir;
37-
3832
@Test
39-
@Disabled("Failing until #514 is fixed")
4033
void shouldPullAnonymousIndex() {
34+
35+
// Via tag
4136
Registry registry = Registry.builder().build();
4237
ContainerRef containerRef1 = ContainerRef.parse("public.ecr.aws/docker/library/alpine:latest");
4338
Index index = registry.getIndex(containerRef1);
4439
assertNotNull(index);
40+
41+
// Via digest
42+
ContainerRef containerRef2 = ContainerRef.parse(
43+
"public.ecr.aws/docker/library/alpine@sha256:25109184c71bdad752c8312a8623239686a9a2071e8825f20acb8f2198c3f659");
44+
Index index2 = registry.getIndex(containerRef2);
45+
assertNotNull(index2);
4546
}
4647
}

0 commit comments

Comments
 (0)