diff options
Diffstat (limited to 'config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java')
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java | 64 |
1 files changed, 53 insertions, 11 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 c0e5e74f110..bbf65c1cd47 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 @@ -3,6 +3,9 @@ package com.yahoo.config.provision; import com.yahoo.component.Version; +import java.util.Objects; +import java.util.Optional; + /** * A Docker image. * @@ -10,28 +13,67 @@ import com.yahoo.component.Version; */ public class DockerImage { - private final String name; + public static final DockerImage EMPTY = new DockerImage("", Optional.empty()); + + private final String repository; + private final Optional<String> tag; - public DockerImage(String name) { - this.name = name; + private DockerImage(String repository, Optional<String> tag) { + this.repository = Objects.requireNonNull(repository, "repository must be non-null"); + this.tag = Objects.requireNonNull(tag, "tag must be non-null"); } - /** Get Docker image tag as version */ + public String repository() { + return repository; + } + + public Optional<String> tag() { + return tag; + } + + /** Returns the tag as Version, {@link Version#emptyVersion} if tag is not set */ public Version tagAsVersion() { - String[] parts = asString().split(":"); - if (parts.length < 2) { - throw new IllegalArgumentException("Could not parse tag from Docker image '" + asString() + "'"); - } - return Version.fromString(parts[parts.length - 1]); + return tag.map(Version::new).orElse(Version.emptyVersion); } /** Returns the Docker image tagged with the given version */ public DockerImage withTag(Version version) { - return new DockerImage(name + ":" + version.toFullString()); + return new DockerImage(repository, Optional.of(version.toFullString())); } public String asString() { - return name; + return repository + tag.map(t -> ':' + t).orElse(""); + } + + @Override + public String toString() { + return asString(); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DockerImage that = (DockerImage) o; + return repository.equals(that.repository) && + tag.equals(that.tag); + } + + @Override + public int hashCode() { + return Objects.hash(repository, tag); + } + + public static DockerImage fromString(String name) { + if (name.isEmpty()) return EMPTY; + + int n = name.lastIndexOf(':'); + if (n < 0) return new DockerImage(name, Optional.empty()); + + String tag = name.substring(n + 1); + if (!tag.contains("/")) { + return new DockerImage(name.substring(0, n), Optional.of(tag)); + } + return new DockerImage(name, Optional.empty()); + } } |