# -*- coding: utf-8 -*-
# Copyright 2015 The Chromium OS Authors. All rights reserved.
# 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 __future__ import print_function

from chromite.lib import parallel

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


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])
