# Copyright 2020 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.
""" sdk_orchestrator.py -- Orchestrates and publishes Fuchsia SDKs.

# Execution overview

## Schedule SDK archive subbuilds

This recipe schedules sdk.py subbuilds, which in turn are responsible for
generating, merging, and testing SDK archives. Each sdk.py subbuild should be
a unique SDK flavor. The primary motivation for orchestrating the subbuilds
is to 1) unify the SDK IDs and 2) unify the publishing logic across SDK
flavors.

## Schedule companion image subbuilds

TODO: Move companion image logic here from sdk.py.

This recipe will optionally schedule companion image subbuilds, which in turn
are responsible for generating Fuchsia images. Each fuchsia/build.py subbuild
should be a unique product.board configuration which is compatible with the
SDK flavors from the above step.

## Publish

TODO: Move publish logic here from sdk.py.

If publishing is enabled, this recipe will relocate the various artifacts
generated in the above steps to Fuchsia SDK namespaces in GCS and CIPD.
"""

from recipe_engine.config import List
from recipe_engine.recipe_api import Property

DEPS = [
    "fuchsia/build_input_resolver",
    "fuchsia/buildbucket_util",
    "fuchsia/display_util",
    "fuchsia/status_check",
    "recipe_engine/buildbucket",
    "recipe_engine/properties",
    "recipe_engine/swarming",
]

PROPERTIES = {
    "subbuilders": Property(
        kind=List(basestring),
        help="sdk.py subbuilder names to generate merged SDK archives.",
    ),
    "companion_images": Property(
        kind=List(dict),
        help="The Fuchsia images built with this version of the SDK."
        " Each object should have 3 properties:"
        "   name (str): name of the image referred to in the SDK."
        "   builder (str): name of the fuchsia/build.py builder."
        "   bucket (str): GCS bucket where the image should be installed.",
        default=[],
    ),
    "sdk_id": Property(kind=str, help="The SDK version ID.", default=""),
}


def RunSteps(api, subbuilders, companion_images, sdk_id):
    api.build_input_resolver.resolve(
        default_project_url="https://fuchsia.googlesource.com/fuchsia"
    )
    # By default the SDK ID is set to this build's buildbucket ID. This will
    # change when we have a real SDK versioning scheme.
    sdk_id = sdk_id if sdk_id else api.buildbucket_util.id
    # The same SDK ID should be shared by all sdk.py subbuilds.
    properties = {"sdk_id": sdk_id}

    # Schedule archive subbuilds.
    archive_schedule_reqs = []
    for subbuilder in subbuilders:
        req = api.buildbucket.schedule_request(
            builder=subbuilder,
            properties=properties,
            swarming_parent_run_id=api.swarming.task_id,
            priority=None,
        )  # Avoid overriding priority from configs.
        archive_schedule_reqs.append(req)
    archive_subbuilds = api.buildbucket.schedule(
        archive_schedule_reqs, step_name="schedule archive subbuilds"
    )

    # Collect and display archive subbuilds status.
    archive_subbuilds = api.buildbucket.collect_builds(
        build_ids=[subbuild.id for subbuild in archive_subbuilds],
        step_name="collect archive subbuilds",
    )
    api.display_util.display_builds(
        step_name="display archive subbuilds",
        builds=archive_subbuilds.values(),
        raise_on_failure=True,
    )


def GenTests(api):
    subbuilders = ["sdk-core-linux", "sdk-core-mac"]

    yield (
        api.status_check.test("ci")
        + api.buildbucket.ci_build()
        + api.properties(subbuilders=subbuilders)
    )
    yield (
        api.status_check.test("cq")
        + api.buildbucket.try_build()
        + api.properties(subbuilders=subbuilders)
    )
