From 994bcf80465e4fa5907c39935b54066c884544fa Mon Sep 17 00:00:00 2001 From: Josh Stark Date: Sat, 27 Jun 2020 11:24:49 +0100 Subject: [PATCH] New favicon and tag finger enhancement - Updated the favicon to new LSIO logo - Updated TagFinder so it checks against full digest parity rather than image size. --- .../fleet/dockerhub/util/DockerTagFinder.java | 40 +++++++- .../fleet/v2/types/docker/DockerTag.java | 8 ++ .../types/docker/DockerTagManifestDigest.java | 4 + .../static/assets/images/favicon-32x32.png | Bin 1314 -> 2251 bytes .../static/assets/images/favicon.ico | Bin 15086 -> 15086 bytes .../resources/static/assets/images/logo.png | Bin 23560 -> 19122 bytes src/main/resources/version.properties | 4 +- src/main/resources/views/pages/image.ftl | 11 ++- .../dockerhub/util/DockerTagFinderTest.java | 86 ++++++++++++++++++ 9 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 src/test/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinderTest.java diff --git a/src/main/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinder.java b/src/main/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinder.java index bd8e57f..82a7fe1 100644 --- a/src/main/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinder.java +++ b/src/main/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinder.java @@ -18,8 +18,11 @@ package io.linuxserver.fleet.dockerhub.util; import io.linuxserver.fleet.v2.types.docker.DockerTag; +import io.linuxserver.fleet.v2.types.docker.DockerTagManifestDigest; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; public class DockerTagFinder { @@ -32,11 +35,46 @@ public class DockerTagFinder { DockerTag namedTagForBranch = tagBranchName.get(); Optional versionedLatestTag = tags.stream() - .filter(tag -> !tag.equals(namedTagForBranch) && tag.getSize() == namedTagForBranch.getSize()).findFirst(); + .filter(tag -> !tag.equals(namedTagForBranch) && allManifestsMatch(namedTagForBranch, tag)).findFirst(); return versionedLatestTag.orElse(namedTagForBranch); } return tags.isEmpty() ? null : tags.get(0); } + + private static boolean allManifestsMatch(final DockerTag namedTag, final DockerTag toCheck) { + + final List namedDigests = namedTag.getDigests(); + final List digestsToCheck = toCheck.getDigests(); + + boolean allMatch = true; + + if (namedDigests.size() == digestsToCheck.size()) { + + final Map namedDigestsAsMap = toMapKeyedByArch(namedDigests); + + for (DockerTagManifestDigest digestToCheck : digestsToCheck) { + + final String archPlusVariant = digestToCheck.getArchitecture() + digestToCheck.getArchVariant(); + final String foundDigest = namedDigestsAsMap.get(archPlusVariant); + + allMatch = allMatch && (null != foundDigest) && foundDigest.equals(digestToCheck.getDigest()); + } + + } else { + allMatch = false; + } + + return allMatch; + } + + private static Map toMapKeyedByArch(final List initialList) { + + final Map map = new HashMap<>(); + for (DockerTagManifestDigest digest : initialList) { + map.put(digest.getArchitecture() + digest.getArchVariant(), digest.getDigest()); + } + return map; + } } diff --git a/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTag.java b/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTag.java index f1b240b..e3312fd 100644 --- a/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTag.java +++ b/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTag.java @@ -17,6 +17,9 @@ package io.linuxserver.fleet.v2.types.docker; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -55,4 +58,9 @@ public class DockerTag { public LocalDateTime getBuildDate() { return buildDate; } + + @Override + public final String toString() { + return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); + } } diff --git a/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTagManifestDigest.java b/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTagManifestDigest.java index 8f5562a..e2570a5 100644 --- a/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTagManifestDigest.java +++ b/src/main/java/io/linuxserver/fleet/v2/types/docker/DockerTagManifestDigest.java @@ -48,4 +48,8 @@ public class DockerTagManifestDigest { return archVariant; } + @Override + public final String toString() { + return architecture + "/" + archVariant + "[" + digest + "]"; + } } diff --git a/src/main/resources/static/assets/images/favicon-32x32.png b/src/main/resources/static/assets/images/favicon-32x32.png index e6d294753e3687df6ede416e0b5393962cd26e0b..79387cfb06fffb9280809ba30fa17441c507f4df 100644 GIT binary patch delta 2066 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 delta 1139 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 IRRZYy|DuJeApigX literal 15086 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 literal 23560 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 n^PN$} <@table.halfDisplayRow title="Docker Hub" value=' ${image.fullName}' link="https://hub.docker.com/r/${image.fullName}" /> <@table.halfDisplayRow title="Build Time" value=image.lastUpdatedAsString /> + <#if image.metaData.baseImage?has_content> <@table.halfDisplayRow title="Base Image" value=image.metaData.baseImage?html /> + + <#if image.metaData.category?has_content> + <@table.halfDisplayRow title="Category" value=image.metaData.category?html /> + + <@table.halfDisplayRow title="Synchronised" value=image.syncEnabled?string("Yes", "No") /> <@table.halfDisplayRow title="Stable" value=image.stable?string("Yes", "No") /> <@table.halfDisplayRow title="Deprecated" value=image.deprecated?string("Yes", "No") /> + @@ -141,10 +148,6 @@ - <#if image.metaData.category?has_content> - <@table.halfDisplayRow title="Category" value=image.metaData.category /> - - <#-- Any set external Urls --> <#list image.metaData.externalUrls as url> diff --git a/src/test/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinderTest.java b/src/test/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinderTest.java new file mode 100644 index 0000000..85d4634 --- /dev/null +++ b/src/test/java/io/linuxserver/fleet/dockerhub/util/DockerTagFinderTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2020 LinuxServer.io + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package io.linuxserver.fleet.dockerhub.util; + +import io.linuxserver.fleet.v2.types.docker.DockerTag; +import io.linuxserver.fleet.v2.types.docker.DockerTagManifestDigest; +import org.junit.Before; +import org.junit.Test; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class DockerTagFinderTest { + + @Test + public void shouldFindCorrectTagIfAllDigestsMatch() { + + final DockerTag named = new DockerTag("latest", 1234L, LocalDateTime.now()); + named.addDigest(new DockerTagManifestDigest(1234L, "digest1", "arch", "variant1")); + named.addDigest(new DockerTagManifestDigest(1234L, "digest2", "arch", "variant2")); + named.addDigest(new DockerTagManifestDigest(1234L, "digest3", "arch", "variant3")); + + final DockerTag shouldMatch = new DockerTag("v1234", 1234L, LocalDateTime.now()); + shouldMatch.addDigest(new DockerTagManifestDigest(1234L, "digest1", "arch", "variant1")); + shouldMatch.addDigest(new DockerTagManifestDigest(1234L, "digest2", "arch", "variant2")); + shouldMatch.addDigest(new DockerTagManifestDigest(1234L, "digest3", "arch", "variant3")); + + final DockerTag shouldNotMatch = new DockerTag("v1234", 1234L, LocalDateTime.now()); + shouldNotMatch.addDigest(new DockerTagManifestDigest(1234L, "digest1", "arch", "variant1")); + shouldNotMatch.addDigest(new DockerTagManifestDigest(1234L, "digest4", "arch", "variant2")); + shouldNotMatch.addDigest(new DockerTagManifestDigest(1234L, "digest3", "arch", "variant3")); + + final List tags = new ArrayList<>(); + tags.add(named); + tags.add(shouldMatch); + tags.add(shouldNotMatch); + + assertThat(DockerTagFinder.findVersionedTagMatchingBranch(tags, "latest"), is(equalTo(shouldMatch))); + } + + @Test + public void shouldReturnFoundNamedTagIfNoOthersMatchFully() { + + final DockerTag named = new DockerTag("latest", 1234L, LocalDateTime.now()); + named.addDigest(new DockerTagManifestDigest(1234L, "digest1", "arch", "variant1")); + named.addDigest(new DockerTagManifestDigest(1234L, "digest2", "arch", "variant2")); + named.addDigest(new DockerTagManifestDigest(1234L, "digest3", "arch", "variant3")); + + final DockerTag shouldMatch = new DockerTag("v1234", 1234L, LocalDateTime.now()); + shouldMatch.addDigest(new DockerTagManifestDigest(1234L, "digest1", "arch", "variant1")); + shouldMatch.addDigest(new DockerTagManifestDigest(1234L, "digest5", "arch", "variant2")); + shouldMatch.addDigest(new DockerTagManifestDigest(1234L, "digest3", "arch", "variant3")); + + final DockerTag shouldNotMatch = new DockerTag("v1234", 1234L, LocalDateTime.now()); + shouldNotMatch.addDigest(new DockerTagManifestDigest(1234L, "digest1", "arch", "variant1")); + shouldNotMatch.addDigest(new DockerTagManifestDigest(1234L, "digest4", "arch", "variant2")); + shouldNotMatch.addDigest(new DockerTagManifestDigest(1234L, "digest3", "arch", "variant3")); + + final List tags = new ArrayList<>(); + tags.add(named); + tags.add(shouldMatch); + tags.add(shouldNotMatch); + + assertThat(DockerTagFinder.findVersionedTagMatchingBranch(tags, "latest"), is(equalTo(named))); + } +}