aboutsummaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorHÃ¥kon Hallingstad <hakon.hallingstad@gmail.com>2022-05-11 15:15:55 +0200
committerGitHub <noreply@github.com>2022-05-11 15:15:55 +0200
commit0abdec328f6c290c4175d716132bb54896f65f51 (patch)
treeabe7f4b24c7a1f9fcd5642bd923c37bd7f8c21cb /config-provisioning
parent1f587cfa6583c16fa40d960aaa33db77478aca7a (diff)
parent72fe00a5ebd0f14d1b8d2c99e436ff35b00c4290 (diff)
Merge pull request #22546 from vespa-engine/freva/docker-image-parse
Improve docker image validation
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java18
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java10
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) {
}
}