blob: bc789bc9ef84f7fb38f7dc5abf966e0e2541de3c [file] [log] [blame]
Xixuan Wu40998892017-08-29 14:32:26 -07001# Copyright 2017 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Module for cron job to trigger events for suite scheduler."""
6
7import logging
8
Xixuan Wu40998892017-08-29 14:32:26 -07009import config_reader
10import constants
11import datastore_client
Xixuan Wu40998892017-08-29 14:32:26 -070012import file_getter
13import rest_client
Brigit Rossbacheb611ac2020-09-24 14:55:24 -060014import StringIO
Xixuan Wu51bb7102019-03-18 14:51:44 -070015import task_config_reader
Xixuan Wu40998892017-08-29 14:32:26 -070016
17
18class TriggerReceiver(object):
19 """The class for receiving event triggers."""
20
Brigit Rossbach50d086f2020-09-17 13:29:49 -060021 def __init__(self, fake=False):
Xixuan Wu40998892017-08-29 14:32:26 -070022 """Initialize a trigger receiver.
23
24 Its job is to fetch triggers from config files and trigger them.
25 """
Xixuan Wuc6819012019-05-23 11:34:59 -070026 self._build_client = rest_client.BuildBucketBigqueryClient(
27 rest_client.BaseRestClient(
28 constants.RestClient.BIGQUERY_CLIENT.scopes,
29 constants.RestClient.BIGQUERY_CLIENT.service_name,
30 constants.RestClient.BIGQUERY_CLIENT.service_version))
Xixuan Wu40998892017-08-29 14:32:26 -070031 self._last_exec_client = datastore_client.LastExecutionRecordStore()
32 self._android_client = rest_client.AndroidBuildRestClient(
33 rest_client.BaseRestClient(
34 constants.RestClient.ANDROID_BUILD_CLIENT.scopes,
35 constants.RestClient.ANDROID_BUILD_CLIENT.service_name,
36 constants.RestClient.ANDROID_BUILD_CLIENT.service_version))
Brigit Rossbach50d086f2020-09-17 13:29:49 -060037 if fake:
38 self._task_config = task_config_reader.TaskConfig(
39 config_reader.ConfigReader(
40 file_getter.TEST_SUITE_SCHEDULER_CONFIG_FILE))
41 fake_lab_config_reader = config_reader.ConfigReader(
42 file_getter.LAB_CONFIG_FILE)
43 self._lab_config = config_reader.LabConfig(fake_lab_config_reader)
44 else:
45 file_getter.clone_config()
Brigit Rossbacheb611ac2020-09-24 14:55:24 -060046 task_buff = StringIO.StringIO(
47 file_getter.NEW_SUITE_SCHEDULER_CONFIG_FILE)
Brigit Rossbach50d086f2020-09-17 13:29:49 -060048 self._task_config = task_config_reader.TaskConfig(
Brigit Rossbacheb611ac2020-09-24 14:55:24 -060049 config_reader.ConfigReader(task_buff))
50 lab_buff = StringIO.StringIO(file_getter.NEW_LAB_CONFIG_FILE)
51 lab_config_reader = config_reader.ConfigReader(lab_buff)
Brigit Rossbach50d086f2020-09-17 13:29:49 -060052 self._lab_config = config_reader.LabConfig(lab_config_reader)
Xixuan Wu40998892017-08-29 14:32:26 -070053
Xixuan Wu40998892017-08-29 14:32:26 -070054 # Initialize events
55 self.events = {}
Xixuan Wu51bb7102019-03-18 14:51:44 -070056 for keyword, klass in task_config_reader.EVENT_CLASSES.iteritems():
Xixuan Wu40998892017-08-29 14:32:26 -070057 logging.info('Initializing %s event', keyword)
58 new_event = klass(
59 self._task_config.get_event_setting(klass.section_name()),
60 self._last_exec_client.get_last_execute_time(klass.KEYWORD))
61
62 if new_event.should_handle:
63 new_event.set_task_list(
Xixuan Wu4ac56dd2017-10-12 11:59:30 -070064 self._task_config.get_tasks_by_keyword(klass.KEYWORD)['tasks'])
Xixuan Wu40998892017-08-29 14:32:26 -070065 logging.info('Got %d tasks for %s event',
66 len(new_event.task_list), klass.KEYWORD)
67
68 self.events[keyword] = new_event
69
70 self.event_results = {}
71
72 def cron(self):
73 """The cron job to scheduler suite jobs by config.
74
75 This cron job executes:
76 1. Filter out the tasks that shoud be run at this round.
77 2. Fetch launch_control_build for Android boards from API.
Xixuan Wu6ec23e32019-05-23 11:56:02 -070078 3. Fetch cros_builds for ChromeOS boards from Buildbucket bigquery.
Xixuan Wu40998892017-08-29 14:32:26 -070079 4. Schedule corresponding jobs with fetched builds.
80 5. Reset event when it's finished.
81 """
82 for keyword, event in self.events.iteritems():
83 logging.info('Handling %s event in cron job', keyword)
84
85 event.filter_tasks()
86 if event.task_list:
87 logging.info('Processing %d tasks.', len(event.task_list))
88 self._schedule_tasks(event)
89 else:
90 logging.info('No task list found')
91 event.finish()
92
93 def _schedule_tasks(self, event):
94 """Schedule tasks based on given event.
95
96 Args:
97 event: a kind of event, which contains its tasks that should be
98 scheduled.
99 """
Craig Bergstrom58263d32018-04-26 14:11:35 -0600100 cros_builds_tuple = event.get_cros_builds(
Xixuan Wuc6819012019-05-23 11:34:59 -0700101 self._lab_config, self._build_client)
Craig Bergstrom58263d32018-04-26 14:11:35 -0600102 logging.debug('Found CrOS builds: %r', cros_builds_tuple)
Xixuan Wu40998892017-08-29 14:32:26 -0700103 launch_control_builds = event.get_launch_control_builds(
104 self._lab_config, self._android_client)
105 logging.debug('Found launch_control_builds: %r', launch_control_builds)
Xinan Lin8b291982019-12-16 10:03:56 -0800106 firmware_builds = None
107 if [x for x in event.task_list if (x.firmware_rw_build_spec or
108 x.firmware_ro_build_spec)]:
109 firmware_builds = event.get_firmware_builds(self._build_client)
Xixuan Wu40998892017-08-29 14:32:26 -0700110
111 self.event_results[event.KEYWORD] = event.process_tasks(
112 launch_control_builds=launch_control_builds,
Craig Bergstrom58263d32018-04-26 14:11:35 -0600113 cros_builds_tuple=cros_builds_tuple,
Xinan Lin028f9582019-12-11 10:55:33 -0800114 firmware_builds=firmware_builds,
Xixuan Wuf4a4c882019-03-15 14:48:26 -0700115 configs=config_reader.Configs(
Xinan Lin576022d2020-01-21 18:12:47 -0800116 lab_config=self._lab_config))
Xixuan Wu40998892017-08-29 14:32:26 -0700117 logging.info('Finished processing all tasks')