Exemple #1
0
def AddDockerTag(args):
    """Adds a Docker tag."""
    src_image, version_or_tag = _ParseDockerImage(args.DOCKER_IMAGE,
                                                  _INVALID_DOCKER_IMAGE_ERROR)
    if version_or_tag is None:
        raise ar_exceptions.InvalidInputValueError(_INVALID_DOCKER_IMAGE_ERROR)

    dest_image, tag = _ParseDockerTag(args.DOCKER_TAG)

    if src_image.GetPackageName() != dest_image.GetPackageName():
        raise ar_exceptions.InvalidInputValueError(
            "Image {}\ndoes not match image {}".format(
                src_image.GetDockerString(), dest_image.GetDockerString()))

    client = ar_requests.GetClient()
    messages = ar_requests.GetMessages()
    docker_version = version_or_tag
    if isinstance(version_or_tag, DockerTag):
        docker_version = DockerVersion(
            version_or_tag.image,
            ar_requests.GetVersionFromTag(client, messages,
                                          version_or_tag.GetTagName()))

    try:
        ar_requests.GetTag(client, messages, tag.GetTagName())
    except api_exceptions.HttpNotFoundError:
        ar_requests.CreateDockerTag(client, messages, tag, docker_version)
    else:
        ar_requests.DeleteTag(client, messages, tag.GetTagName())
        ar_requests.CreateDockerTag(client, messages, tag, docker_version)

    log.status.Print("Added tag [{}] to image [{}].".format(
        tag.GetDockerString(), args.DOCKER_IMAGE))
def DeleteDockerImage(args):
    """Deletes a Docker digest or image.

  If input is an image, delete the image along with its resources.

  If input is an image identified by digest, delete the digest.
  If input is an image identified by tag, delete the digest and the tag.
  If --delete-tags is specified, delete all tags associated with the image
  digest.

  Args:
    args: user input arguments.

  Returns:
    The long-running operation from DeletePackage API call.
  """
    image, version_or_tag = _ParseDockerImage(args.IMAGE, _INVALID_IMAGE_ERROR)
    _ValidateDockerRepo(image.docker_repo.GetRepositoryName())
    client = ar_requests.GetClient()
    messages = ar_requests.GetMessages()
    if not version_or_tag:
        console_io.PromptContinue(
            message="\nThis operation will delete all tags and images for " +
            image.GetDockerString() + ".",
            cancel_on_no=True)
        return ar_requests.DeletePackage(client, messages,
                                         image.GetPackageName())

    else:
        tags_to_delete = []
        docker_version = version_or_tag
        if isinstance(version_or_tag, DockerTag):
            docker_version = DockerVersion(
                version_or_tag.image,
                ar_requests.GetVersionFromTag(client, messages,
                                              version_or_tag.GetTagName()))
            tags_to_delete.append(version_or_tag)
        existing_tags = _GetDockerVersionTags(client, messages, docker_version)
        if args.delete_tags:
            tags_to_delete.extend(existing_tags)

        if len(existing_tags) != len(tags_to_delete):
            raise ar_exceptions.ArtifactRegistryError(
                "Cannot delete image {} because it is tagged. "
                "Existing tags are:\n- {}".format(
                    args.IMAGE, "\n- ".join(tag.GetDockerString()
                                            for tag in existing_tags)))

        _LogResourcesToDelete(docker_version, tags_to_delete)
        console_io.PromptContinue(
            message="\nThis operation will delete the above resources.",
            cancel_on_no=True)

        for tag in tags_to_delete:
            ar_requests.DeleteTag(client, messages, tag.GetTagName())
        return ar_requests.DeleteVersion(client, messages,
                                         docker_version.GetVersionName())
Exemple #3
0
def DeletePackageTags(pkg_ref, pkg_args, request):
  """Deletes tags associate with the specified package."""
  if not pkg_args.delete_tags:
    return request
  client = _GetClientForResource(pkg_ref)
  messages = _GetMessagesForResource(pkg_ref)
  tag_list = ar_requests.ListTags(client, messages, pkg_ref.RelativeName())
  for tag in tag_list:
    ar_requests.DeleteTag(client, messages, tag.name)
  return request
Exemple #4
0
def DeleteDockerTag(args):
    """Deletes a Docker tag."""
    _, tag = _ParseDockerTag(args.DOCKER_TAG)

    console_io.PromptContinue(
        message="You are about to delete tag [{}]".format(
            tag.GetDockerString()),
        cancel_on_no=True)
    ar_requests.DeleteTag(ar_requests.GetClient(), ar_requests.GetMessages(),
                          tag.GetTagName())
    log.status.Print("Deleted tag [{}].".format(tag.GetDockerString()))
Exemple #5
0
def DeleteVersionTags(ver_ref, ver_args, request):
    """Deletes tags associate with the specified version."""
    if not ver_args.delete_tags:
        return request
    client = _GetClientForResource(ver_ref)
    messages = _GetMessagesForResource(ver_ref)
    tag_list = ar_requests.ListTags(client, messages,
                                    ver_ref.Parent().RelativeName())
    for tag in tag_list:
        if tag.version != ver_ref.RelativeName():
            continue
        ar_requests.DeleteTag(client, messages, tag.name)
    return request
Exemple #6
0
def DeleteDockerTag(args):
  """Deletes a Docker tag."""
  img, tag = _ParseDockerTag(args.DOCKER_TAG)

  ar_util.ValidateLocation(img.docker_repo.location, img.docker_repo.project)
  _ValidateDockerRepo(img.docker_repo.GetRepositoryName())

  console_io.PromptContinue(
      message="You are about to delete tag [{}]".format(tag.GetDockerString()),
      cancel_on_no=True)
  ar_requests.DeleteTag(ar_requests.GetClient(), ar_requests.GetMessages(),
                        tag.GetTagName())
  log.status.Print("Deleted tag [{}].".format(tag.GetDockerString()))
Exemple #7
0
def DeleteDockerImage(args):
    """Deletes a Docker digest or image.

  If input is an image, delete the image along with its resources.

  If input is an image identified by digest, delete the digest.
  If input is an image identified by tag, delete the digest and the tag.
  If --delete-tags is specified, delete all tags associated with the image
  digest.

  Args:
    args: user input arguments.

  Returns:
    The long-running operation from DeletePackage API call.
  """
    image, version_or_tag = _ParseDockerImage(args.IMAGE, _INVALID_IMAGE_ERROR)
    client = ar_requests.GetClient()
    messages = ar_requests.GetMessages()
    if not version_or_tag:
        console_io.PromptContinue(
            message="\nThis operation will delete all tags and images for " +
            image.GetDockerString() + ".",
            cancel_on_no=True)
        return ar_requests.DeletePackage(client, messages,
                                         image.GetPackageName())

    else:
        tags_to_delete = []
        docker_version = version_or_tag
        if isinstance(version_or_tag, DockerTag):
            docker_version = DockerVersion(
                version_or_tag.image,
                ar_requests.GetVersionFromTag(client, messages,
                                              version_or_tag.GetTagName()))
            tags_to_delete.append(version_or_tag)
        if args.delete_tags:
            tags_to_delete.extend(
                _GetDockerVersionTags(client, messages, docker_version))

        _LogResourcesToDelete(docker_version, tags_to_delete)
        console_io.PromptContinue(
            message="\nThis operation will delete the above resources.",
            cancel_on_no=True)
        for tag in tags_to_delete:
            ar_requests.DeleteTag(client, messages, tag.GetTagName())
        return ar_requests.DeleteVersion(client, messages,
                                         docker_version.GetVersionName())