diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/api/DescriptorDigest.java b/jib-core/src/main/java/com/google/cloud/tools/jib/api/DescriptorDigest.java index 94dc79d08c..88bbe6f59f 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/api/DescriptorDigest.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/api/DescriptorDigest.java @@ -79,6 +79,15 @@ public static DescriptorDigest fromDigest(String digest) throws DigestException return new DescriptorDigest(hash); } + public static DescriptorDigest fromDigestOrHash(String digestOrHash) throws DigestException { + if (digestOrHash.matches(DIGEST_REGEX)) { + return fromDigest(digestOrHash); + } else if (digestOrHash.matches(HASH_REGEX)) { + return fromHash(digestOrHash); + } + throw new DigestException("Invalid digest or hash: " + digestOrHash); + } + private DescriptorDigest(String hash) { this.hash = hash; } diff --git a/jib-core/src/main/java/com/google/cloud/tools/jib/docker/CliDockerClient.java b/jib-core/src/main/java/com/google/cloud/tools/jib/docker/CliDockerClient.java index d3dcecd883..f6d8bc7b4b 100644 --- a/jib-core/src/main/java/com/google/cloud/tools/jib/docker/CliDockerClient.java +++ b/jib-core/src/main/java/com/google/cloud/tools/jib/docker/CliDockerClient.java @@ -81,7 +81,7 @@ public long getSize() { @Override public DescriptorDigest getImageId() throws DigestException { - return DescriptorDigest.fromDigest(imageId); + return DescriptorDigest.fromDigestOrHash(imageId); } /** diff --git a/jib-core/src/test/java/com/google/cloud/tools/jib/api/DescriptorDigestTest.java b/jib-core/src/test/java/com/google/cloud/tools/jib/api/DescriptorDigestTest.java index ac55ceccc3..99f582f289 100644 --- a/jib-core/src/test/java/com/google/cloud/tools/jib/api/DescriptorDigestTest.java +++ b/jib-core/src/test/java/com/google/cloud/tools/jib/api/DescriptorDigestTest.java @@ -82,6 +82,51 @@ public void testCreateFromDigest_fail() { } } + @Test + public void testCreateFromDigestOrHash_passForDigest() throws DigestException { + String goodHash = createGoodHash('a'); + String goodDigest = "sha256:" + goodHash; + + DescriptorDigest descriptorDigest = DescriptorDigest.fromDigestOrHash(goodDigest); + + Assert.assertEquals(goodHash, descriptorDigest.getHash()); + Assert.assertEquals(goodDigest, descriptorDigest.toString()); + } + + @Test + public void testCreateFromDigestOrHash_passForHash() throws DigestException { + String goodHash = createGoodHash('a'); + + DescriptorDigest descriptorDigest = DescriptorDigest.fromDigestOrHash(goodHash); + + Assert.assertEquals(goodHash, descriptorDigest.getHash()); + Assert.assertEquals("sha256:" + goodHash, descriptorDigest.toString()); + } + + @Test + public void testCreateFromDigestOrHash_failForBadDigest() { + String badDigest = "sha256:not a valid digest"; + + try { + DescriptorDigest.fromDigestOrHash(badDigest); + Assert.fail("Invalid digest should have caused digest creation failure."); + } catch (DigestException ex) { + Assert.assertEquals("Invalid digest or hash: " + badDigest, ex.getMessage()); + } + } + + @Test + public void testCreateFromDigestOrHash_failForBadHash() { + String badHash = "not a valid hash"; + + try { + DescriptorDigest.fromDigestOrHash(badHash); + Assert.fail("Invalid digest should have caused digest creation failure."); + } catch (DigestException ex) { + Assert.assertEquals("Invalid digest or hash: " + badHash, ex.getMessage()); + } + } + @Test public void testUseAsMapKey() throws DigestException { DescriptorDigest descriptorDigestA1 = DescriptorDigest.fromHash(createGoodHash('a')); diff --git a/jib-core/src/test/java/com/google/cloud/tools/jib/docker/CliDockerClientTest.java b/jib-core/src/test/java/com/google/cloud/tools/jib/docker/CliDockerClientTest.java index a88539f8c0..84a7c4c822 100644 --- a/jib-core/src/test/java/com/google/cloud/tools/jib/docker/CliDockerClientTest.java +++ b/jib-core/src/test/java/com/google/cloud/tools/jib/docker/CliDockerClientTest.java @@ -351,6 +351,17 @@ public void testDockerImageDetails() throws DigestException, IOException { results.getDiffIds()); } + @Test + public void testPodmanImageDetails_Id() throws DigestException, IOException { + // Support Podman "Id" without the "sha256:" prefix + String json = "{\"Id\":\"e8d00769c8a805a0656dbfd49d4f91cbc2e36d0199f10343d1beba36ecdcb3fd\"}\n"; + DockerImageDetails results = JsonTemplateMapper.readJson(json, DockerImageDetails.class); + Assert.assertEquals( + DescriptorDigest.fromHash( + "e8d00769c8a805a0656dbfd49d4f91cbc2e36d0199f10343d1beba36ecdcb3fd"), + results.getImageId()); + } + @Test public void testDockerImageDetails_unknownProperties() throws IOException, DigestException { String json = @@ -380,7 +391,7 @@ public void testDockerImageDetails_emptyJson() throws IOException, DigestExcepti details.getImageId(); Assert.fail(); } catch (DigestException ex) { - Assert.assertEquals("Invalid digest: ", ex.getMessage()); + Assert.assertEquals("Invalid digest or hash: ", ex.getMessage()); } }