# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Recipe for pushing goma docker images and deploying them to k8s."""

from recipe_engine.recipe_api import Property

DEPS = [
    "fuchsia/docker",
    "fuchsia/gcloud",
    "fuchsia/status_check",
    "recipe_engine/buildbucket",
    "recipe_engine/properties",
    "recipe_engine/time",
    "recipe_engine/url",
]

PROPERTIES = {
    "domain": Property(
        kind=str, help="domain name of container registry", default="gcr.io"
    ),
    "project": Property(
        kind=str, help="name of goma cloud project", default="goma-fuchsia"
    ),
    "upstream_tag": Property(
        kind=str,
        help="container tag used to pull images from upstream",
        default="latest",
    ),
}

SERVER_IMAGES = [
    "auth-server",
    "cache-server",
    "cmd-server",
    "exec-server",
    "execlog-server",
    "file-server",
    "frontend",
    "gomatools",
]

UPSTREAM_PROJECT_ID = "cxx-compiler-service"


def RunSteps(api, domain, project, upstream_tag):
    timestamp = generate_time_stamp(api)
    api.gcloud("config", "set", "project", project)

    # Pull prebuilts from goma-teams' container registry and push them to
    # project's container registry.
    for item in SERVER_IMAGES:
        upstream_container_tag = api.url.join(domain, UPSTREAM_PROJECT_ID, item)
        container_tag = api.url.join(domain, project, item)
        api.docker(
            "pull", upstream_container_tag, step_name="pull %s from upstream" % item
        )
        api.docker(
            "tag", upstream_container_tag, container_tag, step_name="tag %s" % item
        )
        api.docker(
            "tag",
            upstream_container_tag + ":" + upstream_tag,
            container_tag + ":" + timestamp,
            step_name="tag %s with timestamp" % item,
        )
        api.docker("push", container_tag, step_name="push %s" % item)
        api.docker(
            "push",
            container_tag + ":" + timestamp,
            step_name="push %s with timestamp" % item,
        )


def generate_time_stamp(api):
    return "{:%Y%m%d_%H%M%S}".format(api.time.utcnow())


def GenTests(api):
    default_properties = api.properties(
        domain="gcr.io",
        project="goma-fuchsia",
        upstream_tag="latest",
    )

    yield api.status_check.test(
        "default"
    ) + default_properties + api.buildbucket.try_build(
        git_repo="https://fuchsia.googlesource.com/integration"
    )
