diff options
author | HÃ¥kon Hallingstad <hakon.hallingstad@gmail.com> | 2022-05-11 15:15:55 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-11 15:15:55 +0200 |
commit | 0abdec328f6c290c4175d716132bb54896f65f51 (patch) | |
tree | abe7f4b24c7a1f9fcd5642bd923c37bd7f8c21cb /config-provisioning/src | |
parent | 1f587cfa6583c16fa40d960aaa33db77478aca7a (diff) | |
parent | 72fe00a5ebd0f14d1b8d2c99e436ff35b00c4290 (diff) |
Merge pull request #22546 from vespa-engine/freva/docker-image-parse
Improve docker image validation
Diffstat (limited to 'config-provisioning/src')
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java | 18 | ||||
-rw-r--r-- | config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java | 10 |
2 files changed, 18 insertions, 10 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java b/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java index bbcf4b48c1d..1dce521b520 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java @@ -24,6 +24,9 @@ public class DockerImage { this.registry = Objects.requireNonNull(registry, "registry must be non-null"); this.repository = Objects.requireNonNull(repository, "repository must be non-null"); this.tag = Objects.requireNonNull(tag, "tag must be non-null"); + + if (tag.isPresent() && tag.get().isBlank()) + throw new IllegalArgumentException("Set tag cannot be empty"); } /** Returns the registry-part of this, i.e. the host/port of the registry. */ @@ -58,6 +61,8 @@ public class DockerImage { /** Returns a copy of this with registry set to given value */ public DockerImage withRegistry(String registry) { + if (registry.indexOf('/') >= 0) + throw new IllegalArgumentException("Registry cannot container '/'"); return new DockerImage(registry, repository, tag); } @@ -86,10 +91,6 @@ public class DockerImage { return Objects.hash(registry, repository, tag); } - public static DockerImage from(String registry, String repository) { - return new DockerImage(registry, repository, Optional.empty()); - } - public static DockerImage fromString(String s) { if (s.isEmpty()) return EMPTY; @@ -98,14 +99,13 @@ public class DockerImage { String registry = s.substring(0, firstPathSeparator); String repository = s.substring(firstPathSeparator + 1); - if (repository.isEmpty()) throw new IllegalArgumentException("Repository must be non-empty in '" + s + "'"); int tagStart = repository.indexOf(':'); - if (tagStart < 0) return new DockerImage(registry, repository, Optional.empty()); + Optional<String> tag = tagStart < 0 ? Optional.empty() : Optional.of(repository.substring(tagStart + 1)); - String tag = repository.substring(tagStart + 1); - repository = repository.substring(0, tagStart); - return new DockerImage(registry, repository, Optional.of(tag)); + if (tagStart >= 0) repository = repository.substring(0, tagStart); + if (repository.isEmpty()) throw new IllegalArgumentException("Repository must be non-empty in '" + s + "'"); + return new DockerImage(registry, repository, tag); } } diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java index 71fd453aa26..ad21c6dca3b 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Optional; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.fail; /** @@ -36,17 +37,24 @@ public class DockerImageTest { } @Test + public void registry_cannot_contain_slash() { + DockerImage image = DockerImage.fromString("registry.example.com/vespa/vespa"); + assertThrows(IllegalArgumentException.class, () -> image.withRegistry("my-registry/path")); + } + + @Test public void parse_invalid() { List<String> tests = List.of( "registry.example.com", "registry.example.com/", + "registry.example.com/repository:", "foo", "foo:1.2.3" ); for (var value : tests) { try { DockerImage.fromString(value); - fail("Expected failure"); + fail("Expected failure for: " + value); } catch (IllegalArgumentException ignored) { } } |