Search in sources :

Example 1 with Image

use of io.dockstore.webservice.core.Image in project dockstore by dockstore.

the class LanguageHandlerInterface method getImagesFromDockerHub.

default Set<Image> getImagesFromDockerHub(final String repo, final String tagName) {
    Set<Image> dockerHubImages = new HashSet<>();
    Map<String, String> errorMap = new HashMap<>();
    Optional<String> response;
    boolean versionFound = false;
    String repoUrl = DOCKERHUB_URL + "repositories/" + repo + "/tags?name=" + tagName;
    DockerHubTag dockerHubTag = new DockerHubTag();
    do {
        try {
            URL url = new URL(repoUrl);
            response = Optional.of(IOUtils.toString(url, StandardCharsets.UTF_8));
        } catch (IOException ex) {
            LOG.error("Unable to get DockerHub response for " + repo, ex);
            response = Optional.empty();
        }
        if (response.isPresent()) {
            final String json = response.get();
            errorMap = (Map<String, String>) GSON.fromJson(json, errorMap.getClass());
            if (errorMap.get("message") != null) {
                LOG.error("Error response from DockerHub: " + errorMap.get("message"));
                return dockerHubImages;
            }
            // DockerHub seems to give empty results if something is not found, other fields are marked as null
            dockerHubTag = GSON.fromJson(json, DockerHubTag.class);
            List<Results> results = Arrays.asList(dockerHubTag.getResults());
            if (results.isEmpty()) {
                LOG.error("Could not find any results for " + repo);
                break;
            }
            for (Results r : results) {
                if (r.getName().equals(tagName)) {
                    List<DockerHubImage> images = Arrays.asList(r.getImages());
                    // For every version, DockerHub can provide multiple images, one for each os/architecture
                    images.stream().forEach(dockerHubImage -> {
                        final String manifestDigest = dockerHubImage.getDigest();
                        Checksum checksum = new Checksum(manifestDigest.split(":")[0], manifestDigest.split(":")[1]);
                        List<Checksum> checksums = Collections.singletonList(checksum);
                        // Docker Hub appears to return null for all the "last_pushed" properties of their images.
                        // Using the result's "last_pushed" as a workaround
                        Image archImage = new Image(checksums, repo, tagName, r.getImageID(), Registry.DOCKER_HUB, dockerHubImage.getSize(), r.getLastUpdated());
                        String osInfo = formatDockerHubInfo(dockerHubImage.getOs(), dockerHubImage.getOsVersion());
                        String archInfo = formatDockerHubInfo(dockerHubImage.getArchitecture(), dockerHubImage.getVariant());
                        archImage.setOs(osInfo);
                        archImage.setArchitecture(archInfo);
                        dockerHubImages.add(archImage);
                    });
                    versionFound = true;
                    break;
                }
            }
            if (!versionFound) {
                repoUrl = dockerHubTag.getNext();
            }
        }
    } while (response.isPresent() && !versionFound && dockerHubTag.getNext() != null);
    return dockerHubImages;
}
Also used : HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) IOException(java.io.IOException) DockerHubImage(io.dockstore.webservice.core.dockerhub.DockerHubImage) Image(io.dockstore.webservice.core.Image) URL(java.net.URL) DockerHubImage(io.dockstore.webservice.core.dockerhub.DockerHubImage) Results(io.dockstore.webservice.core.dockerhub.Results) DockerHubTag(io.dockstore.webservice.core.dockerhub.DockerHubTag) Checksum(io.dockstore.webservice.core.Checksum) HashSet(java.util.HashSet)

Example 2 with Image

use of io.dockstore.webservice.core.Image in project dockstore by dockstore.

the class AbstractImageRegistry method getTagsDockerHub.

public List<Tag> getTagsDockerHub(Tool tool) {
    final String repo = tool.getNamespace() + '/' + tool.getName();
    LOG.info(" ======================= Getting tags for: {}================================", tool.getPath());
    final List<Tag> tags = new ArrayList<>();
    Optional<String> dockerHubResponse = getDockerHubToolAsString(tool);
    Map<String, String> error = new HashMap<>();
    DockerHubTag dockerHubTag;
    if (dockerHubResponse.isPresent()) {
        Gson gson = new Gson();
        final String errorJSON = dockerHubResponse.get();
        final String manifestJSON = dockerHubResponse.get();
        error = (Map<String, String>) gson.fromJson(errorJSON, error.getClass());
        if (error.get("message") != null) {
            LOG.info("Error response from DockerHub: " + error.get("message"));
            return new ArrayList<>();
        }
        dockerHubTag = gson.fromJson(manifestJSON, DockerHubTag.class);
        Results[] results = dockerHubTag.getResults();
        try {
            for (Results r : results) {
                final Tag tag = new Tag();
                tag.setName(r.getName());
                DockerHubImage[] dockerHubImages = r.getImages();
                List<Checksum> checksums = new ArrayList<>();
                // For every version, DockerHub can provide multiple images, one for each architecture
                for (DockerHubImage i : dockerHubImages) {
                    final String manifestDigest = i.getDigest();
                    checksums.add(new Checksum(manifestDigest.split(":")[0], manifestDigest.split(":")[1]));
                    Image image = new Image(checksums, repo, tag.getName(), r.getImageID(), Registry.DOCKER_HUB, i.getSize(), i.getLastPushed());
                    image.setArchitecture(i.getArchitecture());
                    tag.getImages().add(image);
                }
                tags.add(tag);
            }
        } catch (IndexOutOfBoundsException ex) {
            LOG.info("Unable to grab image and checksum information for" + tool.getNamespace() + '/' + tool.getName());
        }
        return tags;
    } else {
        LOG.info("Could not get response from DockerHub");
        return new ArrayList<>();
    }
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Gson(com.google.gson.Gson) DockerHubImage(io.dockstore.webservice.core.dockerhub.DockerHubImage) Image(io.dockstore.webservice.core.Image) DockerHubImage(io.dockstore.webservice.core.dockerhub.DockerHubImage) Results(io.dockstore.webservice.core.dockerhub.Results) DockerHubTag(io.dockstore.webservice.core.dockerhub.DockerHubTag) Checksum(io.dockstore.webservice.core.Checksum) GitLabTag(io.dockstore.webservice.core.gitlab.GitLabTag) Tag(io.dockstore.webservice.core.Tag) DockerHubTag(io.dockstore.webservice.core.dockerhub.DockerHubTag)

Example 3 with Image

use of io.dockstore.webservice.core.Image in project dockstore by dockstore.

the class AbstractImageRegistry method updateTags.

/**
 * Updates/Adds/Deletes tags for a specific tool
 *
 * @param newTags
 * @param tool
 * @param tagDAO
 * @param fileDAO
 * @param toolDAO
 */
@SuppressWarnings("checkstyle:ParameterNumber")
private void updateTags(List<Tag> newTags, @NotNull Tool tool, SourceCodeRepoInterface sourceCodeRepoInterface, final TagDAO tagDAO, final FileDAO fileDAO, final ToolDAO toolDAO, final FileFormatDAO fileFormatDAO, final EventDAO eventDAO, final User user) {
    // Get all existing tags
    List<Tag> existingTags = new ArrayList<>(tool.getWorkflowVersions());
    if (tool.getMode() != ToolMode.MANUAL_IMAGE_PATH || (tool.getRegistry().equals(Registry.QUAY_IO.getDockerPath()) && existingTags.isEmpty())) {
        if (newTags == null) {
            LOG.info(tool.getToolPath() + " : Tags for tool {} did not get updated because new tags were not found", tool.getPath());
            return;
        }
        List<Tag> toDelete = new ArrayList<>(0);
        for (Iterator<Tag> iterator = existingTags.iterator(); iterator.hasNext(); ) {
            Tag oldTag = iterator.next();
            boolean exists = false;
            for (Tag newTag : newTags) {
                if (newTag.getName().equals(oldTag.getName())) {
                    exists = true;
                    break;
                }
            }
            if (!exists) {
                toDelete.add(oldTag);
                iterator.remove();
            }
        }
        for (Tag newTag : newTags) {
            boolean exists = false;
            // Find if user already has the tag
            for (Tag oldTag : existingTags) {
                if (newTag.getName().equals(oldTag.getName())) {
                    exists = true;
                    updateImageInformation(tool, newTag, oldTag);
                    oldTag.update(newTag);
                    // Update tag with default paths if dirty bit not set
                    if (!oldTag.isDirtyBit()) {
                        // Has not been modified => set paths
                        oldTag.setCwlPath(tool.getDefaultCwlPath());
                        oldTag.setWdlPath(tool.getDefaultWdlPath());
                        oldTag.setDockerfilePath(tool.getDefaultDockerfilePath());
                        // TODO: keep an eye on this, this used to always create new test params no matter what
                        if (tool.getDefaultTestCwlParameterFile() != null && oldTag.getSourceFiles().stream().noneMatch(file -> file.getPath().equals(tool.getDefaultTestCwlParameterFile()))) {
                            oldTag.getSourceFiles().add(createSourceFile(tool.getDefaultTestCwlParameterFile(), DescriptorLanguage.FileType.CWL_TEST_JSON));
                        }
                        if (tool.getDefaultTestWdlParameterFile() != null && oldTag.getSourceFiles().stream().noneMatch(file -> file.getPath().equals(tool.getDefaultTestWdlParameterFile()))) {
                            oldTag.getSourceFiles().add(createSourceFile(tool.getDefaultTestWdlParameterFile(), DescriptorLanguage.FileType.WDL_TEST_JSON));
                        }
                    }
                    break;
                }
            }
            // Tag does not already exist
            if (!exists) {
                // this could result in the same tag being added to multiple containers with the same path, need to clone
                Tag clonedTag = new Tag();
                clonedTag.clone(newTag);
                clonedTag.getImages().addAll(newTag.getImages());
                if (tool.getDefaultTestCwlParameterFile() != null) {
                    clonedTag.getSourceFiles().add(createSourceFile(tool.getDefaultTestCwlParameterFile(), DescriptorLanguage.FileType.CWL_TEST_JSON));
                }
                if (tool.getDefaultTestWdlParameterFile() != null) {
                    clonedTag.getSourceFiles().add(createSourceFile(tool.getDefaultTestWdlParameterFile(), DescriptorLanguage.FileType.WDL_TEST_JSON));
                }
                existingTags.add(clonedTag);
            }
        }
        boolean allAutomated = true;
        for (Tag tag : existingTags) {
            // create and add a tag if it does not already exist
            if (!tool.getWorkflowVersions().contains(tag)) {
                LOG.info(tool.getToolPath() + " : Updating tag {}", tag.getName());
                tag.setParent(tool);
                long id = tagDAO.create(tag);
                tag = tagDAO.findById(id);
                eventDAO.createAddTagToEntryEvent(user, tool, tag);
                tool.addWorkflowVersion(tag);
                if (!tag.isAutomated()) {
                    allAutomated = false;
                }
            }
        }
        // delete tool if it has no users
        deleteToolWithNoUsers(tool, toDelete);
        if (tool.getMode() != ToolMode.MANUAL_IMAGE_PATH) {
            if (allAutomated) {
                tool.setMode(ToolMode.AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS);
            } else {
                tool.setMode(ToolMode.AUTO_DETECT_QUAY_TAGS_WITH_MIXED);
            }
        }
    }
    // For tools from dockerhub, grab/update the image and checksum information
    if (tool.getRegistry().equals(Registry.DOCKER_HUB.getDockerPath()) || tool.getRegistry().equals(Registry.GITLAB.getDockerPath())) {
        updateNonQuayImageInformation(newTags, tool, existingTags);
    }
    // Now grab default/main tag to grab general information (defaults to github/bitbucket "main branch")
    if (sourceCodeRepoInterface != null) {
        // Grab files for each version/tag and check if valid
        Set<Tag> tags = tool.getWorkflowVersions();
        for (Tag tag : tags) {
            // check to see whether the commit id has changed
            // TODO: calls validation eventually, may simplify if we take into account metadata parsing below
            updateFiles(tool, tag, fileDAO, sourceCodeRepoInterface, sourceCodeRepoInterface.gitUsername);
        // Grab and parse files to get tool information
        // Add for new descriptor types
        }
        if (tool.getDefaultCwlPath() != null) {
            LOG.info(tool.getToolPath() + " " + sourceCodeRepoInterface.gitUsername + " : Parsing CWL...");
            sourceCodeRepoInterface.updateEntryMetadata(tool, DescriptorLanguage.CWL);
        }
        if (tool.getDefaultWdlPath() != null) {
            LOG.info(tool.getToolPath() + " " + sourceCodeRepoInterface.gitUsername + " : Parsing WDL...");
            sourceCodeRepoInterface.updateEntryMetadata(tool, DescriptorLanguage.WDL);
        }
    }
    FileFormatHelper.updateFileFormats(tool, tool.getWorkflowVersions(), fileFormatDAO, true);
    // ensure updated tags are saved to the database, not sure why this is necessary. See GeneralIT#testImageIDUpdateDuringRefresh
    tool.getWorkflowVersions().forEach(tagDAO::create);
    toolDAO.create(tool);
}
Also used : GitLabTag(io.dockstore.webservice.core.gitlab.GitLabTag) SourceCodeRepoFactory.parseGitUrl(io.dockstore.webservice.helpers.SourceCodeRepoFactory.parseGitUrl) TypeToken(com.google.gson.reflect.TypeToken) SortedSet(java.util.SortedSet) URL(java.net.URL) Date(java.util.Date) Results(io.dockstore.webservice.core.dockerhub.Results) LoggerFactory(org.slf4j.LoggerFactory) CustomWebApplicationException(io.dockstore.webservice.CustomWebApplicationException) HttpStatus(org.apache.http.HttpStatus) GitLabContainerRegistry(io.dockstore.webservice.core.gitlab.GitLabContainerRegistry) Registry(io.dockstore.common.Registry) SourceFile(io.dockstore.webservice.core.SourceFile) Gson(com.google.gson.Gson) Map(java.util.Map) User(io.dockstore.webservice.core.User) DockerHubImage(io.dockstore.webservice.core.dockerhub.DockerHubImage) TagDAO(io.dockstore.webservice.jdbi.TagDAO) Set(java.util.Set) NotNull(javax.validation.constraints.NotNull) Tag(io.dockstore.webservice.core.Tag) Tool(io.dockstore.webservice.core.Tool) Collectors(java.util.stream.Collectors) DockerHubTag(io.dockstore.webservice.core.dockerhub.DockerHubTag) StandardCharsets(java.nio.charset.StandardCharsets) Objects(java.util.Objects) IOUtils(org.apache.commons.io.IOUtils) List(java.util.List) Type(java.lang.reflect.Type) Optional(java.util.Optional) Validation(io.dockstore.webservice.core.Validation) DescriptorLanguage(io.dockstore.common.DescriptorLanguage) VersionTypeValidation(io.dockstore.common.VersionTypeValidation) Image(io.dockstore.webservice.core.Image) HashMap(java.util.HashMap) TreeSet(java.util.TreeSet) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) LanguageHandlerFactory(io.dockstore.webservice.languages.LanguageHandlerFactory) FileFormatDAO(io.dockstore.webservice.jdbi.FileFormatDAO) Checksum(io.dockstore.webservice.core.Checksum) EventDAO(io.dockstore.webservice.jdbi.EventDAO) Token(io.dockstore.webservice.core.Token) UserDAO(io.dockstore.webservice.jdbi.UserDAO) FileDAO(io.dockstore.webservice.jdbi.FileDAO) ToolDAO(io.dockstore.webservice.jdbi.ToolDAO) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) IOException(java.io.IOException) ToolMode(io.dockstore.webservice.core.ToolMode) Collections(java.util.Collections) ArrayList(java.util.ArrayList) GitLabTag(io.dockstore.webservice.core.gitlab.GitLabTag) Tag(io.dockstore.webservice.core.Tag) DockerHubTag(io.dockstore.webservice.core.dockerhub.DockerHubTag)

Example 4 with Image

use of io.dockstore.webservice.core.Image in project dockstore by dockstore.

the class ToolsImplCommonTest method processImageDataForToolVersionTest.

@Test
public void processImageDataForToolVersionTest() {
    io.dockstore.webservice.core.Tool tool = new io.dockstore.webservice.core.Tool();
    Tag tag = new Tag();
    Image image = new Image(new ArrayList<>(), "dummy", "dummy", "a", Registry.QUAY_IO, 1L, "now");
    Image image2 = new Image(new ArrayList<>(), "dummy", "dummy", "b", Registry.QUAY_IO, 2L, "now");
    Set<Image> images = new HashSet<>();
    images.add(image);
    images.add(image2);
    tag.setImages(images);
    tool.addWorkflowVersion(tag);
    io.openapi.model.ToolVersion toolVersion = new io.openapi.model.ToolVersion();
    toolVersion.setImages(new ArrayList<>());
    ToolsImplCommon.processImageDataForToolVersion(tool, tag, toolVersion);
    Assert.assertEquals("There should be the same amount of images as the Tag", 2, toolVersion.getImages().size());
    List<Long> sortedSizes = toolVersion.getImages().stream().map(ImageData::getSize).sorted().collect(Collectors.toList());
    Assert.assertEquals(Long.valueOf(1L), sortedSizes.get(0));
    Assert.assertEquals(Long.valueOf(2L), sortedSizes.get(1));
    toolVersion = new io.openapi.model.ToolVersion();
    tag.setImages(new HashSet<>());
    tool = new io.dockstore.webservice.core.Tool();
    tool.addWorkflowVersion(tag);
    toolVersion.setImages(new ArrayList<>());
    ToolsImplCommon.processImageDataForToolVersion(tool, tag, toolVersion);
    Assert.assertEquals("There should be one default image when the Tag has none", 1, toolVersion.getImages().size());
    Assert.assertEquals(Long.valueOf(0L), toolVersion.getImages().get(0).getSize());
}
Also used : Image(io.dockstore.webservice.core.Image) ImageData(io.openapi.model.ImageData) Tag(io.dockstore.webservice.core.Tag) ToolVersion(io.swagger.model.ToolVersion) Tool(io.swagger.model.Tool) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 5 with Image

use of io.dockstore.webservice.core.Image in project dockstore by dockstore.

the class WorkflowResource method updateWorkflowVersion.

@PUT
@Timed
@UnitOfWork
@Path("/{workflowId}/workflowVersions")
@Operation(operationId = "updateWorkflowVersion", description = "Update the workflow versions linked to a workflow.", security = @SecurityRequirement(name = OPENAPI_JWT_SECURITY_DEFINITION_NAME))
@ApiOperation(value = "Update the workflow versions linked to a workflow.", authorizations = { @Authorization(value = JWT_SECURITY_DEFINITION_NAME) }, notes = "Updates workflow path, reference, and hidden attributes.", response = WorkflowVersion.class, responseContainer = "List")
public Set<WorkflowVersion> updateWorkflowVersion(@ApiParam(hidden = true) @Parameter(hidden = true, name = "user") @Auth User user, @ApiParam(value = "Workflow to modify.", required = true) @PathParam("workflowId") Long workflowId, @ApiParam(value = "List of modified workflow versions", required = true) List<WorkflowVersion> workflowVersions) {
    Workflow w = workflowDAO.findById(workflowId);
    checkEntry(w);
    checkCanWriteWorkflow(user, w);
    // create a map for quick lookup
    Map<Long, WorkflowVersion> mapOfExistingWorkflowVersions = new HashMap<>();
    for (WorkflowVersion version : w.getWorkflowVersions()) {
        mapOfExistingWorkflowVersions.put(version.getId(), version);
    }
    for (WorkflowVersion version : workflowVersions) {
        if (mapOfExistingWorkflowVersions.containsKey(version.getId())) {
            if (w.getActualDefaultVersion() != null && w.getActualDefaultVersion().getId() == version.getId() && version.isHidden()) {
                throw new CustomWebApplicationException("You cannot hide the default version.", HttpStatus.SC_BAD_REQUEST);
            }
            // remove existing copy and add the new one
            WorkflowVersion existingTag = mapOfExistingWorkflowVersions.get(version.getId());
            existingTag.setSynced(false);
            // If path changed then update dirty bit to true
            if (!existingTag.getWorkflowPath().equals(version.getWorkflowPath())) {
                String newExtension = FilenameUtils.getExtension(version.getWorkflowPath());
                String correctExtension = FilenameUtils.getExtension(w.getDefaultWorkflowPath());
                if (!Objects.equals(newExtension, correctExtension)) {
                    throw new CustomWebApplicationException("Please ensure that the workflow path uses the file extension " + correctExtension, HttpStatus.SC_BAD_REQUEST);
                }
                existingTag.setDirtyBit(true);
            }
            boolean wasFrozen = existingTag.isFrozen();
            existingTag.updateByUser(version);
            boolean nowFrozen = existingTag.isFrozen();
            // If version is snapshotted on this update, grab and store image information. Also store dag and tool table json if not available.
            if (!wasFrozen && nowFrozen) {
                Optional<String> toolsJSONTable;
                LanguageHandlerInterface lInterface = LanguageHandlerFactory.getInterface(w.getFileType());
                // Store tool table json
                if (existingTag.getToolTableJson() == null) {
                    toolsJSONTable = lInterface.getContent(w.getWorkflowPath(), getMainDescriptorFile(existingTag).getContent(), extractDescriptorAndSecondaryFiles(existingTag), LanguageHandlerInterface.Type.TOOLS, toolDAO);
                    existingTag.setToolTableJson(toolsJSONTable.get());
                } else {
                    toolsJSONTable = Optional.of(existingTag.getToolTableJson());
                }
                if (toolsJSONTable.isPresent()) {
                    Set<Image> images = lInterface.getImagesFromRegistry(toolsJSONTable.get());
                    existingTag.getImages().addAll(images);
                }
                // Grab checksum for file descriptors if not already available.
                for (SourceFile sourceFile : existingTag.getSourceFiles()) {
                    Optional<String> sha = FileFormatHelper.calcSHA1(sourceFile.getContent());
                    if (sha.isPresent()) {
                        List<Checksum> checksums = new ArrayList<>();
                        checksums.add(new Checksum(SHA_TYPE_FOR_SOURCEFILES, sha.get()));
                        if (sourceFile.getChecksums() == null) {
                            sourceFile.setChecksums(checksums);
                        } else if (sourceFile.getChecksums().isEmpty()) {
                            sourceFile.getChecksums().addAll(checksums);
                        }
                    }
                }
                // store dag
                if (existingTag.getDagJson() == null) {
                    String dagJson = lInterface.getCleanDAG(w.getWorkflowPath(), getMainDescriptorFile(existingTag).getContent(), extractDescriptorAndSecondaryFiles(existingTag), LanguageHandlerInterface.Type.DAG, toolDAO);
                    existingTag.setDagJson(dagJson);
                }
            }
        }
    }
    Workflow result = workflowDAO.findById(workflowId);
    checkEntry(result);
    PublicStateManager.getInstance().handleIndexUpdate(result, StateManagerMode.UPDATE);
    return result.getWorkflowVersions();
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Workflow(io.dockstore.webservice.core.Workflow) BioWorkflow(io.dockstore.webservice.core.BioWorkflow) CustomWebApplicationException(io.dockstore.webservice.CustomWebApplicationException) LanguageHandlerInterface(io.dockstore.webservice.languages.LanguageHandlerInterface) WorkflowVersion(io.dockstore.webservice.core.WorkflowVersion) Image(io.dockstore.webservice.core.Image) Checksum(io.dockstore.webservice.core.Checksum) SourceFile(io.dockstore.webservice.core.SourceFile) Path(javax.ws.rs.Path) UnitOfWork(io.dropwizard.hibernate.UnitOfWork) Timed(com.codahale.metrics.annotation.Timed) ApiOperation(io.swagger.annotations.ApiOperation) Operation(io.swagger.v3.oas.annotations.Operation) ApiOperation(io.swagger.annotations.ApiOperation) PUT(javax.ws.rs.PUT)

Aggregations

Image (io.dockstore.webservice.core.Image)12 Checksum (io.dockstore.webservice.core.Checksum)8 ArrayList (java.util.ArrayList)8 Tag (io.dockstore.webservice.core.Tag)6 DockerHubImage (io.dockstore.webservice.core.dockerhub.DockerHubImage)6 HashMap (java.util.HashMap)5 HashSet (java.util.HashSet)5 DockerHubTag (io.dockstore.webservice.core.dockerhub.DockerHubTag)4 Gson (com.google.gson.Gson)3 SourceFile (io.dockstore.webservice.core.SourceFile)3 Results (io.dockstore.webservice.core.dockerhub.Results)3 GitLabTag (io.dockstore.webservice.core.gitlab.GitLabTag)3 IOException (java.io.IOException)3 URL (java.net.URL)3 Registry (io.dockstore.common.Registry)2 CustomWebApplicationException (io.dockstore.webservice.CustomWebApplicationException)2 GitLabContainerRegistry (io.dockstore.webservice.core.gitlab.GitLabContainerRegistry)2 ImageData (io.openapi.model.ImageData)2 QuayTag (io.swagger.quay.client.model.QuayTag)2 Timed (com.codahale.metrics.annotation.Timed)1