suite-scheduler: Add skylab_model limit.

Add skylab_model entry support in lab_config.ini. This limits the models
which could run the given suites in skylab.

BUG=chromium:914467
TEST=Ran unittest.

Change-Id: Ia40d67adde1cee72673f8ee4de84e22753a16a6e
Reviewed-on: https://chromium-review.googlesource.com/1398402
Commit-Ready: Xixuan Wu <xixuan@chromium.org>
Tested-by: Xixuan Wu <xixuan@chromium.org>
Reviewed-by: Xixuan Wu <xixuan@chromium.org>
diff --git a/task.py b/task.py
index 520520a..eb538ce 100644
--- a/task.py
+++ b/task.py
@@ -488,6 +488,28 @@
 
     return [passed_model]
 
+  def _check_is_in_skylab(self, skylab_boards, skylab_models, skylab_suites,
+                          board, model):
+    """Check whether this task should be run in skylab.
+
+    Args:
+      skylab_boards: A list of boards that should be run in skylab.
+      skylab_models: A map of models that should be run in skylab.
+      skylab_suites: A list of suites that should be run in skylab.
+      board: A string board name.
+      model: A string model name.
+
+    Returns:
+      A boolean variable to indicate whether this task should be run in skylab.
+    """
+    if self.suite not in skylab_suites:
+      return False
+
+    if model is None:
+      return board in skylab_boards
+    else:
+      return model in skylab_models.get(board, [])
+
   def _schedule_cros_builds(self, build_dict, lab_config, db_client):
     """Schedule tasks with branch builds.
 
@@ -500,8 +522,10 @@
     models_by_board = lab_config.get_cros_model_map() if lab_config else {}
     skylab_boards = lab_config.get_skylab_board_list() if lab_config else []
     skylab_suites = lab_config.get_skylab_suite_list() if lab_config else []
+    skylab_models = lab_config.get_skylab_model_map() if lab_config else {}
     logging.info('Skylab_boards: %r', skylab_boards)
     logging.info('Skylab suites: %r', skylab_suites)
+    logging.info('Skylab models: %r', skylab_models)
     for (board, passed_model, build_type,
          milestone), manifest in build_dict.iteritems():
       cros_build = str(build_lib.CrOSBuild(board, build_type, milestone,
@@ -544,7 +568,11 @@
         # that option and scheduler settings should always set it to False.
         test_source_build = cros_build
 
-      is_skylab = (board in skylab_boards) and (self.suite in skylab_suites)
+      is_skylab = self._check_is_in_skylab(skylab_boards,
+                                           skylab_models,
+                                           skylab_suites,
+                                           board,
+                                           passed_model)
 
       for model in self._check_model(models_by_board, board, passed_model):
         self._push_suite(