# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Module containing release engineering related builders."""

from chromite.cbuildbot.builders import simple_builders
from chromite.cbuildbot.stages import build_stages
from chromite.cbuildbot.stages import release_stages
from chromite.lib import parallel


class GeneratePayloadsBuilder(simple_builders.SimpleBuilder):
    """Run the PaygenStage once for each board."""

    def RunStages(self):
        """Runs through build process."""

        def _RunStageWrapper(board):
            self._RunStage(build_stages.UprevStage)
            self._RunStage(build_stages.InitSDKStage)
            self._RunStage(
                release_stages.PaygenStage,
                board=board,
                channels=self._run.options.channels,
            )

        with parallel.BackgroundTaskRunner(_RunStageWrapper) as queue:
            for board in self._run.config.boards:
                queue.put([board])
