summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorValerij Fredriksen <freva@users.noreply.github.com>2022-05-12 10:51:50 +0200
committerValerij Fredriksen <valerijf@yahooinc.com>2022-05-12 11:01:41 +0200
commit4c2c774705bf1aa34491f57fbe51c02e9c0c0e3f (patch)
tree2f3c84a2c8dad495da92b89ff38b1127892328e9 /config-provisioning
parent32e26201ca86681150eb47661ae551a1c188c594 (diff)
Only treat the last 2 path segments as repository
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java26
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java15
2 files changed, 26 insertions, 15 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..b9693685cf6 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.isBlank()) throw new IllegalArgumentException("Registry cannot be empty");
+ if (registry.charAt(registry.length() - 1) == '/') throw new IllegalArgumentException("Registry cannot end with '/': " + registry);
return new DockerImage(registry, repository, tag);
}
@@ -86,26 +91,21 @@ 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;
- int firstPathSeparator = s.indexOf('/');
- if (firstPathSeparator < 0) throw new IllegalArgumentException("Missing path separator in '" + s + "'");
+ int repositoryStart = s.lastIndexOf('/', s.lastIndexOf('/') - 1);
+ if (repositoryStart < 0) throw new IllegalArgumentException("Expected to find at least 2 path segments in: " + s);
- 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 + "'");
+ String registry = s.substring(0, repositoryStart);
+ String repository = s.substring(repositoryStart + 1);
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..2e0de192f03 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;
/**
@@ -22,7 +23,8 @@ public class DockerImageTest {
"registry.example.com:9999/vespa/vespa:7.42", new DockerImage("registry.example.com:9999", "vespa/vespa", Optional.of("7.42")),
"registry.example.com/vespa/vespa:7.42", new DockerImage("registry.example.com", "vespa/vespa", Optional.of("7.42")),
"registry.example.com:9999/vespa/vespa", new DockerImage("registry.example.com:9999", "vespa/vespa", Optional.empty()),
- "registry.example.com/vespa/vespa", new DockerImage("registry.example.com", "vespa/vespa", Optional.empty())
+ "registry.example.com/vespa/vespa", new DockerImage("registry.example.com", "vespa/vespa", Optional.empty()),
+ "registry.example.com/project/repo/vespa/vespa", new DockerImage("registry.example.com/project/repo", "vespa/vespa", Optional.empty())
);
tests.forEach((value, expected) -> {
DockerImage parsed = DockerImage.fromString(value);
@@ -36,17 +38,26 @@ public class DockerImageTest {
}
@Test
+ public void registry_cannot_contain_slash() {
+ DockerImage image = DockerImage.fromString("registry.example.com/vespa/vespa");
+ assertThrows(IllegalArgumentException.class, () -> image.withRegistry(""));
+ 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",
+ "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) {
}
}