"""
Release script invoked from git trigger upon submission of changes to release-versions.yaml config file to the cos/tools GoB repo

Parses contents of release-versions.yaml file and copies release candidates to gcr.io/cos-tools
"""

import sys
import yaml
import subprocess
import os

def validate_config(release_config):
  for release_container in release_config:
    for key in ["container_name", "build_commit", "release_tags"]:
      assert key in release_container, "missing {} in entry {}".format(key, release_container)

def validate_gcr_path(path):
  return len(path) > len("gcr.io/") and path[:len("gcr.io/")] == "gcr.io/"

def copy_container_image(src_bucket, dst_bucket, container_name, build_tag, release_tags):
  assert validate_gcr_path(src_bucket), "cannot use address {}, only gcr.io/ addresses are supported".format(src_bucket)
  assert validate_gcr_path(dst_bucket), "cannot use address {}, only gcr.io/ addresses are supported".format(dst_bucket)

  src_path = os.path.join(src_bucket, container_name)
  dst_path = os.path.join(dst_bucket, container_name)

  for release_tag in release_tags:
    subprocess.run(["gcloud", "container", "images", "add-tag", src_path + ":" + build_tag, dst_path + ":" + release_tag, "-q"])

def verify_and_release(src_bucket, dst_bucket, release):
  with open('release/release-versions.yaml', 'r') as file:
    try:
      release_config = yaml.safe_load(file)
      validate_config(release_config)

      if release:
        for release_container in release_config:
          container_name = release_container["container_name"]
          build_tag = release_container["build_commit"]
          release_tags = release_container["release_tags"]
          copy_container_image(src_bucket, dst_bucket, container_name, build_tag, release_tags)

    except yaml.YAMLError as ex:
      raise Exception("Invalid YAML config: %s" % str(ex))

def main():
  if len(sys.argv) == 2 and sys.argv[1] == "--verify":
    verify_and_release("", "", False)
  elif len(sys.argv) == 3:
    src_bucket = sys.argv[1]
    dst_bucket = sys.argv[2]

    verify_and_release(src_bucket, dst_bucket, True)
  else:
    sys.exit("sample use: ./release_script <source_gcr_path> <destination_gcr_path>")

if __name__ == '__main__':
  main()
