All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.gesellix.docker.client.image.ManageImageClient.groovy Maven / Gradle / Ivy

package de.gesellix.docker.client.image

import de.gesellix.docker.client.EngineResponseContent
import de.gesellix.docker.client.authentication.ManageAuthentication
import de.gesellix.docker.client.repository.RepositoryTagParser
import de.gesellix.docker.remote.api.BuildInfo
import de.gesellix.docker.remote.api.CreateImageInfo
import de.gesellix.docker.remote.api.EngineApiClient
import de.gesellix.docker.remote.api.HistoryResponseItem
import de.gesellix.docker.remote.api.Image
import de.gesellix.docker.remote.api.ImageDeleteResponseItem
import de.gesellix.docker.remote.api.ImagePruneResponse
import de.gesellix.docker.remote.api.ImageSearchResponseItem
import de.gesellix.docker.remote.api.ImageSummary
import de.gesellix.docker.remote.api.PushImageInfo
import de.gesellix.docker.remote.api.core.StreamCallback
import de.gesellix.util.QueryUtil
import groovy.util.logging.Slf4j

import java.time.Duration

@Slf4j
class ManageImageClient implements ManageImage {

  private EngineApiClient client
  private RepositoryTagParser repositoryTagParser
  private QueryUtil queryUtil
  private ManageAuthentication manageAuthentication

  ManageImageClient(EngineApiClient client, ManageAuthentication manageAuthentication) {
    this.client = client
    this.manageAuthentication = manageAuthentication
    this.repositoryTagParser = new RepositoryTagParser()
    this.queryUtil = new QueryUtil()
  }

  @Override
  EngineResponseContent> search(String term, Integer limit = 25) {
    log.info("docker search")
    def imageSearch = client.imageApi.imageSearch(term, limit, null)
    return new EngineResponseContent>(imageSearch)
  }

  @Override
  void build(InputStream buildContext) {
    build(null, null,
          buildContext)
  }

  @Override
  void build(StreamCallback callback, Duration timeout,
             InputStream buildContext) {
    build(callback, timeout,
          null, null, null, null, null, null, null, null, null, null, buildContext)
  }

  @Override
  void build(String tag,
             InputStream buildContext) {
    build(null, null,
          buildContext)
  }

  @Override
  void build(StreamCallback callback, Duration timeout,
             String tag,
             InputStream buildContext) {
    build(callback, timeout,
          null, tag, null, null, null, null, null, null, null, null, buildContext)
  }

  @Override
  void build(String dockerfile, String tag, Boolean quiet, Boolean nocache, String pull, Boolean rm,
             String buildargs, String labels, String encodedRegistryConfig, String contentType, InputStream buildContext) {
    build(null, null,
          dockerfile, tag, quiet, nocache, pull, rm, buildargs, labels, encodedRegistryConfig, contentType, buildContext)
  }

  @Override
  void build(StreamCallback callback, Duration timeout,
             String dockerfile, String tag, Boolean quiet, Boolean nocache, String pull, Boolean rm,
             String buildargs, String labels, String encodedRegistryConfig, String contentType, InputStream buildContext) {
    log.info("docker build")

    if (!encodedRegistryConfig) {
      encodedRegistryConfig = manageAuthentication.encodeAuthConfigs(manageAuthentication.getAllAuthConfigs())
    }

    client.imageApi.imageBuild(dockerfile,
                               tag, null, null, quiet, nocache, null, pull,
                               rm == null ? true : rm, null,
                               null, null, null, null, null, null,
                               buildargs,
                               null,
                               null,
                               labels,
                               null,
                               contentType ?: "application/x-tar",
                               encodedRegistryConfig,
                               null, null,
                               null,
                               buildContext,
                               callback, timeout ? timeout.toMillis() : null)
  }

  @Override
  EngineResponseContent> history(String imageId) {
    log.info("docker history")
    def imageHistory = client.imageApi.imageHistory(imageId)
    return new EngineResponseContent>(imageHistory)
  }

  @Override
  EngineResponseContent inspectImage(String imageId) {
    log.info("docker inspect image")
    def imageInspect = client.imageApi.imageInspect(imageId)
    return new EngineResponseContent(imageInspect)
  }

  @Override
  void load(InputStream imagesTarball) {
    log.info("docker load")
    client.imageApi.imageLoad(null, imagesTarball)
  }

  @Override
  EngineResponseContent> images(Map query) {
    def actualQuery = [:]
    if (query) {
      actualQuery.putAll(query)
    }
    def defaults = [all: false]
    queryUtil.applyDefaults(actualQuery, defaults)
    queryUtil.jsonEncodeQueryParameter(actualQuery, "filters")
    return images(actualQuery.all as Boolean, actualQuery.filters as String, actualQuery.digests as Boolean)
  }

  @Override
  EngineResponseContent> images(Boolean all = false, String filters = null, Boolean digests = null) {
    log.info("docker images")
    def imageList = client.imageApi.imageList(all, filters, digests)
    return new EngineResponseContent>(imageList)
  }

  @Override
  EngineResponseContent pruneImages(Map query) {
    def actualQuery = [:]
    if (query) {
      actualQuery.putAll(query)
    }
    queryUtil.jsonEncodeQueryParameter(actualQuery, "filters")
    return pruneImages(actualQuery.filters as String)
  }

  @Override
  EngineResponseContent pruneImages(String filters = null) {
    log.info("docker image prune")
    def imagePrune = client.imageApi.imagePrune(filters)
    return new EngineResponseContent(imagePrune)
  }

  @Override
  void pull(StreamCallback callback, Duration timeout,
            String imageName, String tag = "", String authBase64Encoded = ".") {
    log.info("docker pull '${imageName}:${tag}'")

    client.imageApi.imageCreate(
        imageName,
        null,
        null,
        tag ?: "", // "latest" as default?
        null,
        authBase64Encoded,
        null,
        null,
        null,
        callback,
        timeout ? timeout.toMillis() : null
    )
//    return findImageId(actualImageName, tag)
  }

  @Override
  void importUrl(StreamCallback callback, Duration timeout,
                 String url, String repository = "", String tag = "") {
    log.info("docker import '${url}' into ${repository}:${tag}")

    client.imageApi.imageCreate(
        null,
        url,
        repository ?: "",
        tag ?: "", // "latest" as default?
        null,
        null,
        null,
        null,
        null,
        callback,
        timeout ? timeout.toMillis() : null
    )
  }

  @Override
  void importStream(StreamCallback callback, Duration timeout,
                    InputStream stream, String repository = "", String tag = "") {
    log.info("docker import stream into ${repository}:${tag}")

    client.imageApi.imageCreate(
        null,
        "-",
        repository ?: "",
        tag ?: "", // "latest" as default?
        null,
        null,
        null,
        null,
        stream,
        callback,
        timeout ? timeout.toMillis() : null
    )
  }

  @Override
  void push(String imageName, String authBase64Encoded = ".", String registry = "") {
    push(null, null, imageName, authBase64Encoded, registry)
  }

  @Override
  void push(StreamCallback callback, Duration timeout, String imageName, String authBase64Encoded = ".", String registry = "") {
    log.info("docker push '${imageName}'")

    def actualImageName = imageName
    if (registry) {
      actualImageName = "$registry/$imageName".toString()
      tag(imageName, actualImageName)
    }
    def repoAndTag = repositoryTagParser.parseRepositoryTag(actualImageName)

    client.imageApi.imagePush(repoAndTag.repo as String,
                              authBase64Encoded ?: ".",
                              repoAndTag.tag as String,
                              callback,
                              timeout ? timeout.toMillis() : null)
  }

  @Override
  EngineResponseContent> rmi(String imageId) {
    log.info("docker rmi")
    def imageDelete = client.imageApi.imageDelete(imageId, null, null)
    return new EngineResponseContent>(imageDelete)
  }

  @Override
  EngineResponseContent save(List images) {
    log.info("docker save")
    def savedImages = client.imageApi.imageGetAll(images)
    return new EngineResponseContent(savedImages)
  }

  @Override
  void tag(String imageId, String repository) {
    log.info("docker tag")
    def repoAndTag = repositoryTagParser.parseRepositoryTag(repository)
    client.imageApi.imageTag(imageId, repoAndTag.repo, repoAndTag.tag)
  }

  @Override
  String findImageId(String imageName, String tag = "") {
    def isDigest = imageName.contains '@'
    def images = images((isDigest) ? [digests: '1'] : [:]).content
//        println new JsonBuilder(images).toString()
    def imageIdsByRepoDigest = images.collectEntries { image ->
      image.repoDigests?.collectEntries { String repoDigest ->
        def idByDigest = [:]
        idByDigest[repoDigest] = (String) image.id
        idByDigest
      } ?: [:]
    }
    def imageIdsByName = images.collectEntries { image ->
      image.repoTags?.collectEntries { String repoTag ->
        def idByName = [:]
        idByName[repoTag] = (String) image.id
        idByName
      } ?: [:]
    }

    if (isDigest) {
      if (imageIdsByRepoDigest[imageName.toString()]) {
        return imageIdsByRepoDigest[imageName.toString()]
      }
      log.warn("couldn't find imageId for `${imageName}` via `docker images`")
      return imageName
    }
    else {
      def canonicalImageName = "$imageName:${tag ?: 'latest'}".toString()
      if (imageIdsByName[canonicalImageName]) {
        return imageIdsByName[canonicalImageName]
      }
      log.warn("couldn't find imageId for `${canonicalImageName}` via `docker images`")
      return canonicalImageName
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy