#!/usr/bin/env python3

# Copyright 2020 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""Manages IREE Docker image definitions.

Includes information on their dependency graph and GCR URL.

See the README for more information on how to add and update images.

Example usage:

Rebuild the cmake image and all images that transitively on depend on it,
tagging them with `latest` and updating all references to their sha digests:
  python3 build_tools/docker/manage_images.py --image cmake

Print out output for rebuilding the cmake image and all images that
transitively depend on it, but don't take side-effecting actions:
  python3 build_tools/docker/manage_images.py --image cmake --dry-run

Rebuild and push all images and update references to them in the repository:
  python3 build_tools/docker/manage_images.py --images all
"""

import argparse
import fileinput
import os
import posixpath
import re
import subprocess
import sys
from typing import Dict, List, Sequence, Union

import utils

IREE_GCR_URL = "gcr.io/iree-oss/"
DIGEST_REGEX = r"sha256:[a-zA-Z0-9]+"
DOCKER_DIR = "build_tools/docker/".replace("/", os.sep)

# Map from image names to images that they depend on.
IMAGES_TO_DEPENDENCIES = {
    "base": [],
    "manylinux2014_x86_64-release": [],
    "android": ["base"],
    "emscripten": ["base"],
    "nvidia": ["base"],
    "riscv": ["base"],
    "gradle-android": ["base"],
    "frontends": ["android"],
    "perf": [],
    "mmperf": ["perf"],
    "convperf": ["perf"],
    "shark": [],
    "swiftshader": ["base"],
    "samples": ["swiftshader"],
    "frontends-swiftshader": ["frontends", "swiftshader"],
    "frontends-nvidia": ["frontends"],
    # Containers with all the newest versions of dependencies that we support
    # instead of the oldest.
    "base-bleeding-edge": [],
    "swiftshader-bleeding-edge": ["base-bleeding-edge"],
}

IMAGES_TO_DEPENDENT_IMAGES = {k: [] for k in IMAGES_TO_DEPENDENCIES}
for image, dependencies in IMAGES_TO_DEPENDENCIES.items():
  for dependency in dependencies:
    IMAGES_TO_DEPENDENT_IMAGES[dependency].append(image)

IMAGES_HELP = [f"`{name}`" for name in IMAGES_TO_DEPENDENCIES]
IMAGES_HELP = f"{', '.join(IMAGES_HELP)} or `all`"


def parse_arguments():
  """Parses command-line options."""
  parser = argparse.ArgumentParser(
      description="Build IREE's Docker images and optionally push them to GCR.")
  parser.add_argument("--images",
                      "--image",
                      type=str,
                      required=True,
                      action="append",
                      help=f"Name of the image to build: {IMAGES_HELP}.")
  parser.add_argument(
      "--dry_run",
      "--dry-run",
      "-n",
      action="store_true",
      help="Print output without building or pushing any images.")
  parser.add_argument(
      "--only_references",
      "--only-references",
      action="store_true",
      help=
      "Just update references to images using the digests in prod_digests.txt")

  args = parser.parse_args()
  for image in args.images:
    if image == "all":
      # Sort for a determinstic order
      args.images = sorted(IMAGES_TO_DEPENDENCIES.keys())
    elif image not in IMAGES_TO_DEPENDENCIES:
      raise parser.error("Expected --image to be one of:\n"
                         f"  {IMAGES_HELP}\n"
                         f"but got `{image}`.")
  return args


def _dag_dfs(input_nodes: Sequence[str],
             node_to_child_nodes: Dict[str, Sequence[str]]) -> List[str]:
  # Python doesn't have a builtin OrderedSet, but we don't have many images, so
  # we just use a list.
  ordered_nodes = []

  def add_children(parent_node: str):
    if parent_node not in ordered_nodes:
      for child_node in node_to_child_nodes[parent_node]:
        add_children(child_node)
      ordered_nodes.append(parent_node)

  for node in input_nodes:
    add_children(node)
  return ordered_nodes


def get_ordered_images_to_process(images: Sequence[str]) -> List[str]:
  dependents = _dag_dfs(images, IMAGES_TO_DEPENDENT_IMAGES)
  dependents.reverse()
  return dependents


def get_dependencies(images: Sequence[str]) -> List[str]:
  return _dag_dfs(images, IMAGES_TO_DEPENDENCIES)


def get_repo_digest(tagged_image_url: str, dry_run: bool = False) -> str:
  inspect_command = [
      "docker",
      "image",
      "inspect",
      tagged_image_url,
      "-f",
      "{{index .RepoDigests 0}}",
  ]
  try:
    completed_process = utils.run_command(
        inspect_command,
        dry_run=False,  # Run even if --dry_run is True.
        capture_output=True,
        timeout=10)
  except subprocess.CalledProcessError as error:
    if dry_run:
      return ""
    else:
      raise RuntimeError(
          f"Computing the repository digest for {tagged_image_url} failed. Has "
          "it been pushed to GCR?") from error
  _, repo_digest = completed_process.stdout.strip().split("@")
  return repo_digest


def update_references(image_url: str, digest: str, dry_run: bool = False):
  """Updates all references to "image_url" with a sha256 digest."""
  print(f"Updating references to {image_url}")

  grep_command = ["git", "grep", "-l", f"{image_url}@sha256"]
  try:
    completed_process = utils.run_command(grep_command,
                                          capture_output=True,
                                          timeout=5)
  except subprocess.CalledProcessError as error:
    if error.returncode == 1:
      print(f"Found no references to {image_url}")
      return
    raise error

  # Update references in all grepped files.
  files = completed_process.stdout.split()
  print(f"Updating references in {len(files)} files: {files}")
  if not dry_run:
    for line in fileinput.input(files=files, inplace=True):
      print(re.sub(f"{image_url}@{DIGEST_REGEX}", f"{image_url}@{digest}",
                   line),
            end="")


def parse_prod_digests() -> Dict[str, str]:
  image_urls_to_prod_digests = {}
  with open(utils.PROD_DIGESTS_PATH, "r") as f:
    for line in f:
      image_url, digest = line.strip().split("@")
      image_urls_to_prod_digests[image_url] = digest
  return image_urls_to_prod_digests


if __name__ == "__main__":
  args = parse_arguments()
  image_urls_to_prod_digests = parse_prod_digests()
  images_to_process = get_ordered_images_to_process(args.images)
  print(f"Also processing dependent images. Will process: {images_to_process}")

  if not args.only_references:
    # Ensure the user has the correct authorization to push to GCR.
    utils.check_gcloud_auth(dry_run=args.dry_run)

    dependencies = get_dependencies(images_to_process)
    print(f"Pulling image dependencies: {dependencies}")
    for dependency in dependencies:
      dependency_url = posixpath.join(IREE_GCR_URL, dependency)
      # If `dependency` is a new image then it may not have a prod digest yet.
      if dependency_url in image_urls_to_prod_digests:
        digest = image_urls_to_prod_digests[dependency_url]
        dependency_with_digest = f"{dependency_url}@{digest}"
        utils.run_command(["docker", "pull", dependency_with_digest],
                          dry_run=args.dry_run)

  for image in images_to_process:
    print("\n" * 5 + f"Processing image {image}")
    image_url = posixpath.join(IREE_GCR_URL, image)
    tagged_image_url = f"{image_url}"
    image_path = os.path.join(DOCKER_DIR, "dockerfiles", f"{image}.Dockerfile")

    if args.only_references:
      digest = image_urls_to_prod_digests[image_url]
    else:
      # We deliberately give the whole repository as context so we can reuse
      # scripts and such. It would be nice if Docker gave us a way to make this
      # more explicit, like symlinking files in the context, but they refuse to
      # with the justification that it makes builds non-hermetic, a hilarious
      # concern for something that allows and encourages arbitrary network
      # access in builds.
      # We're assuming this is being run from the root of the repository.
      # FIXME: make this more robust to where it is run from.
      utils.run_command([
          "docker", "build", "--file", image_path, "--tag", tagged_image_url,
          "."
      ],
                        dry_run=args.dry_run)

      utils.run_command(["docker", "push", tagged_image_url],
                        dry_run=args.dry_run)

      digest = get_repo_digest(tagged_image_url, args.dry_run)

      # Check that the image is in "prod_digests.txt" and append it to the list
      # in the file if it isn't.
      if image_url not in image_urls_to_prod_digests:
        image_with_digest = f"{image_url}@{digest}"
        print(
            f"Adding new image {image_with_digest} to {utils.PROD_DIGESTS_PATH}"
        )
        if not args.dry_run:
          with open(utils.PROD_DIGESTS_PATH, "a") as f:
            f.write(f"{image_with_digest}\n")

    update_references(image_url, digest, dry_run=args.dry_run)
