blob: 810579cd6af754fdc131201cdc4ee551b2a97f52 [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
9import cloud_sql_client
10import config_reader
11import constants
12import datastore_client
13import dropper
14import file_getter
15import rest_client
16
17
18class TriggerReceiver(object):
19 """The class for receiving event triggers."""
20
21 def __init__(self):
22 """Initialize a trigger receiver.
23
24 Its job is to fetch triggers from config files and trigger them.
25 """
26 self._cidb_client = cloud_sql_client.CIDBClient('CIDB', 'cidb')
27 self._last_exec_client = datastore_client.LastExecutionRecordStore()
28 self._android_client = rest_client.AndroidBuildRestClient(
29 rest_client.BaseRestClient(
30 constants.RestClient.ANDROID_BUILD_CLIENT.scopes,
31 constants.RestClient.ANDROID_BUILD_CLIENT.service_name,
32 constants.RestClient.ANDROID_BUILD_CLIENT.service_version))
33
34 task_config_reader = config_reader.ConfigReader(
35 file_getter.SUITE_SCHEDULER_CONFIG_FILE)
36 self._task_config = config_reader.TaskConfig(task_config_reader)
37 lab_config_reader = config_reader.ConfigReader(
38 file_getter.LAB_CONFIG_FILE)
39 self._lab_config = config_reader.LabConfig(lab_config_reader)
40
41 # Drop events if needed.
42 suite_dropper = dropper.SuiteDropper(config_reader.EVENT_CLASSES)
43 suite_dropper.drop_suite_if_needed()
44
45 # Initialize events
46 self.events = {}
47 for keyword, klass in config_reader.EVENT_CLASSES.iteritems():
48 logging.info('Initializing %s event', keyword)
49 new_event = klass(
50 self._task_config.get_event_setting(klass.section_name()),
51 self._last_exec_client.get_last_execute_time(klass.KEYWORD))
52
53 if new_event.should_handle:
54 new_event.set_task_list(
55 self._task_config.get_tasks_by_keyword(klass.KEYWORD))
56 logging.info('Got %d tasks for %s event',
57 len(new_event.task_list), klass.KEYWORD)
58
59 self.events[keyword] = new_event
60
61 self.event_results = {}
62
63 def cron(self):
64 """The cron job to scheduler suite jobs by config.
65
66 This cron job executes:
67 1. Filter out the tasks that shoud be run at this round.
68 2. Fetch launch_control_build for Android boards from API.
69 3. Fetch cros_builds for ChromeOS boards from CIDB.
70 4. Schedule corresponding jobs with fetched builds.
71 5. Reset event when it's finished.
72 """
73 for keyword, event in self.events.iteritems():
74 logging.info('Handling %s event in cron job', keyword)
75
76 event.filter_tasks()
77 if event.task_list:
78 logging.info('Processing %d tasks.', len(event.task_list))
79 self._schedule_tasks(event)
80 else:
81 logging.info('No task list found')
82 event.finish()
83
84 def _schedule_tasks(self, event):
85 """Schedule tasks based on given event.
86
87 Args:
88 event: a kind of event, which contains its tasks that should be
89 scheduled.
90 """
91 cros_builds = event.get_cros_builds(self._cidb_client)
92 logging.debug('Found CrOS builds: %r', cros_builds)
93 launch_control_builds = event.get_launch_control_builds(
94 self._lab_config, self._android_client)
95 logging.debug('Found launch_control_builds: %r', launch_control_builds)
96
97 self.event_results[event.KEYWORD] = event.process_tasks(
98 launch_control_builds=launch_control_builds,
99 cros_builds=cros_builds,
100 lab_config=self._lab_config,
101 db_client=self._cidb_client)
102 logging.info('Finished processing all tasks')