diff options
author | Valerij Fredriksen <freva@users.noreply.github.com> | 2022-05-12 10:51:50 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-05-12 11:01:41 +0200 |
commit | 4c2c774705bf1aa34491f57fbe51c02e9c0c0e3f (patch) | |
tree | 2f3c84a2c8dad495da92b89ff38b1127892328e9 /config-provisioning/src | |
parent | 32e26201ca86681150eb47661ae551a1c188c594 (diff) |
Only treat the last 2 path segments as repository
Diffstat (limited to 'config-provisioning/src')
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java | 26 | ||||
-rw-r--r-- | config-provisioning/src/test/java/com/yahoo/config/provision/DockerImageTest.java | 15 |
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) { } } |