From 7150b2c3a9db2eb2eb4af30b245255acdc749f72 Mon Sep 17 00:00:00 2001 From: Josh Stark Date: Sun, 1 Nov 2020 11:29:03 +0000 Subject: [PATCH] Quick refactor to introduce abstract base class for docker registry clients --- .../docker/AbstractDockerApiClient.java | 60 ++++++++++++ .../AbstractDockerResponseConverter.java} | 13 ++- .../docker/dockerhub/DockerHubApiClient.java | 98 ++++++++----------- .../dockerhub/DockerHubImageConverter.java | 17 ++-- .../dockerhub/DockerHubTagConverter.java | 13 +-- .../github/GitHubContainerRegistryClient.java | 51 ++++++++++ .../docker/github/GitHubImageConverter.java | 35 +++++++ .../docker/github/GitHubTagConverter.java | 35 +++++++ .../docker/github/model/GitHubImage.java | 21 ++++ .../client/docker/github/model/GitHubTag.java | 21 ++++ src/main/resources/version.properties | 4 +- 11 files changed, 287 insertions(+), 81 deletions(-) create mode 100644 src/main/java/io/linuxserver/fleet/v2/client/docker/AbstractDockerApiClient.java rename src/main/java/io/linuxserver/fleet/v2/client/docker/{dockerhub/AbstractDockerHubConverter.java => converter/AbstractDockerResponseConverter.java} (76%) create mode 100644 src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubContainerRegistryClient.java create mode 100644 src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubImageConverter.java create mode 100644 src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubTagConverter.java create mode 100644 src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubImage.java create mode 100644 src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubTag.java diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/AbstractDockerApiClient.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/AbstractDockerApiClient.java new file mode 100644 index 0000000..bfb5b18 --- /dev/null +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/AbstractDockerApiClient.java @@ -0,0 +1,60 @@ +/* + * 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.v2.client.docker; + +import io.linuxserver.fleet.v2.client.docker.converter.DockerResponseConverter; +import io.linuxserver.fleet.v2.types.docker.DockerImage; +import io.linuxserver.fleet.v2.types.docker.DockerTag; + +import java.util.List; +import java.util.stream.Collectors; + +public abstract class AbstractDockerApiClient, TC extends DockerResponseConverter> implements DockerApiClient { + + private final IC imageConverter; + private final TC tagConverter; + + public AbstractDockerApiClient(final IC imageConverter, final TC tagConverter) { + this.imageConverter = imageConverter; + this.tagConverter = tagConverter; + } + + @Override + public final DockerImage fetchImage(String imageName) { + + final D dockerModel = fetchImageFromApi(imageName); + if (null == dockerModel) { + return null; + } + return imageConverter.convert(dockerModel); + } + + @Override + public final List fetchAllImages(String repositoryName) { + return fetchAllImagesFromApi(repositoryName).stream().map(imageConverter::convert).collect(Collectors.toList()); + } + + @Override + public final List fetchImageTags(String imageName) { + return fetchTagsFromApi(imageName).stream().map(tagConverter::convert).collect(Collectors.toList()); + } + + protected abstract D fetchImageFromApi(final String imageName); + protected abstract List fetchAllImagesFromApi(final String repositoryName); + protected abstract List fetchTagsFromApi(final String imageName); +} diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/AbstractDockerHubConverter.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/converter/AbstractDockerResponseConverter.java similarity index 76% rename from src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/AbstractDockerHubConverter.java rename to src/main/java/io/linuxserver/fleet/v2/client/docker/converter/AbstractDockerResponseConverter.java index 1c47fd6..b5e8d61 100644 --- a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/AbstractDockerHubConverter.java +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/converter/AbstractDockerResponseConverter.java @@ -15,28 +15,27 @@ * along with this program. If not, see . */ -package io.linuxserver.fleet.v2.client.docker.dockerhub; +package io.linuxserver.fleet.v2.client.docker.converter; -import io.linuxserver.fleet.v2.client.docker.converter.DockerResponseConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.time.LocalDateTime; import java.time.format.DateTimeParseException; -public abstract class AbstractDockerHubConverter implements DockerResponseConverter { +public abstract class AbstractDockerResponseConverter implements DockerResponseConverter { private final Logger LOGGER = LoggerFactory.getLogger(getClass()); @Override - public final INTERNAL convert(final DOCKER_HUB dockerHubV2Image) { + public final I convert(final D dockerModel) { try { - if (null == dockerHubV2Image) { + if (null == dockerModel) { LOGGER.warn("Attempted to convert null image"); } else { - return doPlainConvert(dockerHubV2Image); + return doPlainConvert(dockerModel); } } catch (Exception e) { @@ -46,7 +45,7 @@ public abstract class AbstractDockerHubConverter implement return null; } - protected abstract INTERNAL doPlainConvert(final DOCKER_HUB dockerHubV2Image); + protected abstract I doPlainConvert(final D dockerApiImage); protected final LocalDateTime parseDockerHubDate(String date) { diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubApiClient.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubApiClient.java index 2a9afc2..1329f1e 100644 --- a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubApiClient.java +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubApiClient.java @@ -20,38 +20,62 @@ package io.linuxserver.fleet.v2.client.docker.dockerhub; import io.linuxserver.fleet.dockerhub.DockerHubException; import io.linuxserver.fleet.dockerhub.model.DockerHubV2Image; import io.linuxserver.fleet.dockerhub.model.DockerHubV2ImageListResult; +import io.linuxserver.fleet.dockerhub.model.DockerHubV2Tag; import io.linuxserver.fleet.dockerhub.model.DockerHubV2TagListResult; -import io.linuxserver.fleet.v2.client.docker.DockerApiClient; +import io.linuxserver.fleet.v2.client.docker.AbstractDockerApiClient; import io.linuxserver.fleet.v2.client.rest.HttpException; import io.linuxserver.fleet.v2.client.rest.RestClient; import io.linuxserver.fleet.v2.client.rest.RestResponse; -import io.linuxserver.fleet.v2.types.docker.DockerImage; -import io.linuxserver.fleet.v2.types.docker.DockerTag; import java.util.ArrayList; import java.util.List; -public class DockerHubApiClient implements DockerApiClient { +public class DockerHubApiClient extends AbstractDockerApiClient { private static final String DockerHubApiUrl = "https://hub.docker.com/v2"; private static final int DefaultPageSize = 1000; private final RestClient restClient; - private final DockerHubImageConverter imageConverter; - private final DockerHubTagConverter tagConverter; - public DockerHubApiClient() { - + super(new DockerHubImageConverter(), new DockerHubTagConverter()); restClient = new RestClient(); - imageConverter = new DockerHubImageConverter(); - tagConverter = new DockerHubTagConverter(); } @Override - public List fetchAllImages(String repositoryName) { + public final boolean isRepositoryValid(String repositoryName) { - final List images = new ArrayList<>(); + try { + return !fetchAllImages(repositoryName).isEmpty(); + } catch (HttpException e) { + throw new DockerHubException("Unable to verify repository " + repositoryName, e); + } + } + + @Override + protected final DockerHubV2Image fetchImageFromApi(String imageName) { + + try { + + final String absoluteUrl = DockerHubApiUrl + "/repositories/" + imageName + "/"; + + final RestResponse restResponse = doCall(absoluteUrl, DockerHubV2Image.class); + + if (isResponseOK(restResponse)) { + return restResponse.getPayload(); + } + + return null; + + } catch (HttpException e) { + throw new DockerHubException("Unable to get images for " + imageName, e); + } + } + + @Override + protected final List fetchAllImagesFromApi(String repositoryName) { + + final List images = new ArrayList<>(); try { @@ -63,13 +87,7 @@ public class DockerHubApiClient implements DockerApiClient { if (isResponseOK(response)) { DockerHubV2ImageListResult payload = response.getPayload(); - payload.getResults().forEach(i -> { - - final DockerImage converted = imageConverter.convert(i); - if (null != converted) { - images.add(converted); - } - }); + images.addAll(payload.getResults()); url = payload.getNext(); } @@ -83,41 +101,11 @@ public class DockerHubApiClient implements DockerApiClient { } @Override - public boolean isRepositoryValid(String repositoryName) { - - try { - return !fetchAllImages(repositoryName).isEmpty(); - } catch (HttpException e) { - throw new DockerHubException("Unable to verify repository " + repositoryName, e); - } - } - - @Override - public DockerImage fetchImage(String imageName) { + protected final List fetchTagsFromApi(String imageName) { try { - final String absoluteUrl = DockerHubApiUrl + "/repositories/" + imageName + "/"; - - final RestResponse restResponse = doCall(absoluteUrl, DockerHubV2Image.class); - - if (isResponseOK(restResponse)) { - return imageConverter.convert(restResponse.getPayload()); - } - - return null; - - } catch (HttpException e) { - throw new DockerHubException("Unable to get images for " + imageName, e); - } - } - - @Override - public List fetchImageTags(String imageName) { - - try { - - List tags = new ArrayList<>(); + List tags = new ArrayList<>(); String absoluteUrl = DockerHubApiUrl + "/repositories/" + imageName + "/tags/?page_size=" + DefaultPageSize; while (absoluteUrl != null) { @@ -127,13 +115,7 @@ public class DockerHubApiClient implements DockerApiClient { if (isResponseOK(response)) { final DockerHubV2TagListResult payload = response.getPayload(); - payload.getResults().forEach(t -> { - - final DockerTag converted = tagConverter.convert(t); - if (null != converted) { - tags.add(converted); - } - }); + tags.addAll(payload.getResults()); absoluteUrl = payload.getNext(); } diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubImageConverter.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubImageConverter.java index 947433a..b47f20f 100644 --- a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubImageConverter.java +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubImageConverter.java @@ -18,19 +18,20 @@ package io.linuxserver.fleet.v2.client.docker.dockerhub; import io.linuxserver.fleet.dockerhub.model.DockerHubV2Image; +import io.linuxserver.fleet.v2.client.docker.converter.AbstractDockerResponseConverter; import io.linuxserver.fleet.v2.types.docker.DockerImage; -public class DockerHubImageConverter extends AbstractDockerHubConverter { +public class DockerHubImageConverter extends AbstractDockerResponseConverter { @Override - protected final DockerImage doPlainConvert(final DockerHubV2Image dockerHubV2Image) { + protected final DockerImage doPlainConvert(final DockerHubV2Image dockerApiImage) { - return new DockerImage(dockerHubV2Image.getName(), - dockerHubV2Image.getNamespace(), - dockerHubV2Image.getDescription(), - dockerHubV2Image.getStarCount(), - dockerHubV2Image.getPullCount(), - parseDockerHubDate(dockerHubV2Image.getLastUpdated())); + return new DockerImage(dockerApiImage.getName(), + dockerApiImage.getNamespace(), + dockerApiImage.getDescription(), + dockerApiImage.getStarCount(), + dockerApiImage.getPullCount(), + parseDockerHubDate(dockerApiImage.getLastUpdated())); } @Override diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubTagConverter.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubTagConverter.java index 1f8a7e3..55c04b3 100644 --- a/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubTagConverter.java +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/dockerhub/DockerHubTagConverter.java @@ -19,19 +19,20 @@ package io.linuxserver.fleet.v2.client.docker.dockerhub; import io.linuxserver.fleet.dockerhub.model.DockerHubV2Tag; import io.linuxserver.fleet.dockerhub.model.DockerHubV2TagDigest; +import io.linuxserver.fleet.v2.client.docker.converter.AbstractDockerResponseConverter; import io.linuxserver.fleet.v2.types.docker.DockerTag; import io.linuxserver.fleet.v2.types.docker.DockerTagManifestDigest; -public class DockerHubTagConverter extends AbstractDockerHubConverter { +public class DockerHubTagConverter extends AbstractDockerResponseConverter { @Override - protected final DockerTag doPlainConvert(final DockerHubV2Tag dockerHubV2Tag) { + protected final DockerTag doPlainConvert(final DockerHubV2Tag dockerApiImage) { - final DockerTag dockerTag = new DockerTag(dockerHubV2Tag.getName(), - dockerHubV2Tag.getFullSize(), - parseDockerHubDate(dockerHubV2Tag.getLastUpdated())); + final DockerTag dockerTag = new DockerTag(dockerApiImage.getName(), + dockerApiImage.getFullSize(), + parseDockerHubDate(dockerApiImage.getLastUpdated())); - for (DockerHubV2TagDigest tagImageDigest : dockerHubV2Tag.getImages()) { + for (DockerHubV2TagDigest tagImageDigest : dockerApiImage.getImages()) { dockerTag.addDigest(new DockerTagManifestDigest(tagImageDigest.getSize(), tagImageDigest.getDigest(), diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubContainerRegistryClient.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubContainerRegistryClient.java new file mode 100644 index 0000000..b44f3f2 --- /dev/null +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubContainerRegistryClient.java @@ -0,0 +1,51 @@ +/* + * 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.v2.client.docker.github; + +import io.linuxserver.fleet.v2.client.docker.AbstractDockerApiClient; +import io.linuxserver.fleet.v2.client.docker.github.model.GitHubImage; +import io.linuxserver.fleet.v2.client.docker.github.model.GitHubTag; + +import java.util.List; + +public class GitHubContainerRegistryClient extends AbstractDockerApiClient { + + public GitHubContainerRegistryClient() { + super(new GitHubImageConverter(), new GitHubTagConverter()); + } + + @Override + protected final GitHubImage fetchImageFromApi(String imageName) { + return null; + } + + @Override + protected final List fetchAllImagesFromApi(String repositoryName) { + return null; + } + + @Override + protected final List fetchTagsFromApi(String imageName) { + return null; + } + + @Override + public final boolean isRepositoryValid(String repositoryName) { + return false; + } +} diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubImageConverter.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubImageConverter.java new file mode 100644 index 0000000..20221a8 --- /dev/null +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubImageConverter.java @@ -0,0 +1,35 @@ +/* + * 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.v2.client.docker.github; + +import io.linuxserver.fleet.v2.client.docker.converter.AbstractDockerResponseConverter; +import io.linuxserver.fleet.v2.client.docker.github.model.GitHubImage; +import io.linuxserver.fleet.v2.types.docker.DockerImage; + +public class GitHubImageConverter extends AbstractDockerResponseConverter { + + @Override + protected final DockerImage doPlainConvert(final GitHubImage dockerApiImage) { + return null; + } + + @Override + public final Class getConverterClass() { + return GitHubImage.class; + } +} diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubTagConverter.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubTagConverter.java new file mode 100644 index 0000000..3fd8c4f --- /dev/null +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/GitHubTagConverter.java @@ -0,0 +1,35 @@ +/* + * 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.v2.client.docker.github; + +import io.linuxserver.fleet.v2.client.docker.converter.AbstractDockerResponseConverter; +import io.linuxserver.fleet.v2.client.docker.github.model.GitHubTag; +import io.linuxserver.fleet.v2.types.docker.DockerTag; + +public class GitHubTagConverter extends AbstractDockerResponseConverter { + + @Override + protected final DockerTag doPlainConvert(final GitHubTag dockerApiImage) { + return null; + } + + @Override + public final Class getConverterClass() { + return GitHubTag.class; + } +} diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubImage.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubImage.java new file mode 100644 index 0000000..395e31f --- /dev/null +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubImage.java @@ -0,0 +1,21 @@ +/* + * 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.v2.client.docker.github.model; + +public class GitHubImage { +} diff --git a/src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubTag.java b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubTag.java new file mode 100644 index 0000000..1f8142d --- /dev/null +++ b/src/main/java/io/linuxserver/fleet/v2/client/docker/github/model/GitHubTag.java @@ -0,0 +1,21 @@ +/* + * 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.v2.client.docker.github.model; + +public class GitHubTag { +} diff --git a/src/main/resources/version.properties b/src/main/resources/version.properties index 8461a70..e5c5bfb 100644 --- a/src/main/resources/version.properties +++ b/src/main/resources/version.properties @@ -1,5 +1,5 @@ -#Fri Aug 21 17:45:10 BST 2020 -app.build.date=2020-08-21T17\:45\:10 +#Sun Nov 01 11:27:50 GMT 2020 +app.build.date=2020-11-01T11\:27\:50 app.build.os=Linux app.build.user=josh app.version=2.1.1