diff options
-rw-r--r-- | config-provisioning/abi-spec.json | 13 | ||||
-rw-r--r-- | config-provisioning/src/main/java/com/yahoo/config/provision/DockerImage.java | 64 |
2 files changed, 63 insertions, 14 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json index af61fb46e50..80680a4d095 100644 --- a/config-provisioning/abi-spec.json +++ b/config-provisioning/abi-spec.json @@ -309,12 +309,19 @@ "public" ], "methods": [ - "public void <init>(java.lang.String)", + "public java.lang.String repository()", + "public java.util.Optional tag()", "public com.yahoo.component.Version tagAsVersion()", "public com.yahoo.config.provision.DockerImage withTag(com.yahoo.component.Version)", - "public java.lang.String asString()" + "public java.lang.String asString()", + "public java.lang.String toString()", + "public boolean equals(java.lang.Object)", + "public int hashCode()", + "public static com.yahoo.config.provision.DockerImage fromString(java.lang.String)" ], - "fields": [] + "fields": [ + "public static final com.yahoo.config.provision.DockerImage EMPTY" + ] }, "com.yahoo.config.provision.Environment": { "superClass": "java.lang.Enum", 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()); + } } |