From 604eb9c8c74a77f963bf1fddf7877bef01f53d82 Mon Sep 17 00:00:00 2001 From: Devashishbasu Date: Fri, 9 Feb 2024 00:45:50 +0530 Subject: [PATCH] ImageName should be able to parse image names with IPv6 address literals 1.added IPv6 address 2.uncommented the related tests --- .../jkube/kit/config/image/ImageName.java | 20 +++++++++++++++---- .../ImageNameDistributionReferenceTest.java | 16 +++++++-------- .../image/ImageNameORASReferenceTest.java | 2 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java index 05a143b6a9..ee8ab5c1d1 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java @@ -275,7 +275,7 @@ private void doValidate() { String user = inferUser(); String image = user != null ? repository.substring(user.length() + 1) : repository; Object[] checks = new Object[] { - "registry", DOMAIN_REGEXP, registry, + "registry", REGISTRY_REGEXP, registry, "image", IMAGE_NAME_REGEXP, image, "user", NAME_COMP_REGEXP, user, "tag", TAG_REGEXP, tag, @@ -323,7 +323,7 @@ private void parseComponentsBeforeTag(String rest) { } private boolean isValidDomain(String str) { - return containsPeriodOrColon(str) && DOMAIN_REGEXP.matcher(str).matches(); + return containsPeriodOrColon(str) && REGISTRY_REGEXP.matcher(str).matches(); } private boolean isRegistryValidPathComponent() { @@ -343,6 +343,9 @@ private boolean isRegistryValidPathComponent() { // https://github.com/docker/docker/blob/04da4041757370fb6f85510c8977c5a18ddae380/vendor/github.com/docker/distribution/reference/regexp.go#L25 private static final String DOMAIN_COMPONENT_REGEXP = "(?:[a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])"; + //https://github.com/distribution/reference/blob/8507c7fcf0da9f570540c958ea7b972c30eeaeca/regexp.go#L91 + private static final String IPV6_ADDRESS_REGEXP = "\\[[a-fA-F0-9:]+\\]"; + // ========================================================== // https://github.com/docker/docker/blob/04da4041757370fb6f85510c8977c5a18ddae380/vendor/github.com/docker/distribution/reference/regexp.go#L18 @@ -351,8 +354,17 @@ private boolean isRegistryValidPathComponent() { // https://github.com/docker/docker/blob/04da4041757370fb6f85510c8977c5a18ddae380/vendor/github.com/docker/distribution/reference/regexp.go#L53 private static final Pattern IMAGE_NAME_REGEXP = Pattern.compile(NAME_COMPONENT_REGEXP + "(?:(?:/" + NAME_COMPONENT_REGEXP + ")+)?"); - // https://github.com/docker/docker/blob/04da4041757370fb6f85510c8977c5a18ddae380/vendor/github.com/docker/distribution/reference/regexp.go#L31 - private static final Pattern DOMAIN_REGEXP = Pattern.compile("^" + DOMAIN_COMPONENT_REGEXP + "(?:\\." + DOMAIN_COMPONENT_REGEXP + ")*(?::[0-9]+)?$"); + // https://github.com/distribution/reference/blob/8507c7fcf0da9f570540c958ea7b972c30eeaeca/regexp.go#L65 + private static final String OPTIONAL_PORT_REGEXP = "(?::[0-9]+)?"; + + // https://github.com/distribution/reference/blob/8507c7fcf0da9f570540c958ea7b972c30eeaeca/regexp.go#L99 + private static final String DOMAIN_NAME_REGEXP = DOMAIN_COMPONENT_REGEXP + "(?:\\." + DOMAIN_COMPONENT_REGEXP + ")*"; + + // https://github.com/distribution/reference/blob/8507c7fcf0da9f570540c958ea7b972c30eeaeca/regexp.go#L106 + private static final String REGISTRY_HOST_REGEXP = "^(?:" + IPV6_ADDRESS_REGEXP + "|" + DOMAIN_NAME_REGEXP + ")"; + + // https://github.com/distribution/reference/blob/8507c7fcf0da9f570540c958ea7b972c30eeaeca/regexp.go#L110 + private static final Pattern REGISTRY_REGEXP = Pattern.compile(REGISTRY_HOST_REGEXP + OPTIONAL_PORT_REGEXP); // https://github.com/docker/docker/blob/04da4041757370fb6f85510c8977c5a18ddae380/vendor/github.com/docker/distribution/reference/regexp.go#L37 private static final Pattern TAG_REGEXP = Pattern.compile("^[\\w][\\w.-]{0,127}$"); diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameDistributionReferenceTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameDistributionReferenceTest.java index 46ac1d89e1..c2f5bf70c5 100644 --- a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameDistributionReferenceTest.java +++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameDistributionReferenceTest.java @@ -72,14 +72,14 @@ class ImageNameDistributionReferenceTest { "192.168.0.1:8/debian", "192.168.0.2:25000/debian", "docker.io/1a3f5e7d9c1b3a5f7e9d1c3b5a7f9e1d3c5b7a9f1e3d5d7c9b1a3f5e7d9c1b3a", - //"[2001:db8::1]/repo", // https://github.com/eclipse/jkube/issues/2541 - //"[2001:db8:1:2:3:4:5:6]/repo:tag", // https://github.com/eclipse/jkube/issues/2541 - //"[2001:db8::1]:5000/repo", // https://github.com/eclipse/jkube/issues/2541 - //"[2001:db8::1]:5000/repo:tag", // https://github.com/eclipse/jkube/issues/2541 - //"[2001:db8::1]:5000/repo@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // https://github.com/eclipse/jkube/issues/2541 - //"[2001:db8::1]:5000/repo:tag@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // https://github.com/eclipse/jkube/issues/2541 - //"[2001:db8::]:5000/repo", // https://github.com/eclipse/jkube/issues/2541 - //"[::1]:5000/repo", // https://github.com/eclipse/jkube/issues/2541 + "[2001:db8::1]/repo", + "[2001:db8:1:2:3:4:5:6]/repo:tag", + "[2001:db8::1]:5000/repo", + "[2001:db8::1]:5000/repo:tag", + "[2001:db8::1]:5000/repo@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "[2001:db8::1]:5000/repo:tag@sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "[2001:db8::]:5000/repo", + "[::1]:5000/repo", }) void validNames(String name) { // Given diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameORASReferenceTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameORASReferenceTest.java index 7795afedd9..dc4c1fab17 100644 --- a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameORASReferenceTest.java +++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameORASReferenceTest.java @@ -42,7 +42,7 @@ class ImageNameORASReferenceTest { "registry.example.com/hello-world:v2@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", "localhost:5000/hello-world:v2@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", "127.0.0.1:5000/hello-world:v2@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", - //"[::1]:5000/hello-world:v1", // https://github.com/eclipse/jkube/issues/2541 + "[::1]:5000/hello-world:v1", //"registry.example.com/hello-world:@sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", // https://github.com/eclipse/jkube/issues/2545 }) void validImageNamesCompatibleWithAll(String name) {