blob: 74e6e232af008df8a52e0466ab48149ae10e8ff8 [file] [log] [blame]
# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""WSGI application dispatchers."""
import re
from tradefed_cluster import api
from tradefed_cluster import command_attempt_monitor
from tradefed_cluster import command_event_handler
from tradefed_cluster import command_monitor
from tradefed_cluster import commander
from tradefed_cluster import config_syncer_gcs_to_ndb
from tradefed_cluster import device_history_cleaner
from tradefed_cluster import device_info_cleaner
from tradefed_cluster import device_info_reporter
from tradefed_cluster import device_monitor
from tradefed_cluster import harness_image_metadata_syncer
from tradefed_cluster import harness_update_scheduler
from tradefed_cluster import lab_resource_monitor
from tradefed_cluster import notification_handler
from tradefed_cluster import notifier
from tradefed_cluster import request_sync_monitor
from tradefed_cluster.services import task_scheduler
from tradefed_cluster.util import ndb_shim as ndb
class RegexDispatcher(object):
"""Dispatches to WSGI applications using regular expressions."""
def __init__(self, apps):
"""Initializes the dispatcher.
Args:
apps: list of regex and WSGI app tuples
"""
self.apps = apps
def __call__(self, environ, start_response):
"""Dispatches to the first WSGI app that matches the request path."""
path = environ.get('PATH_INFO', '/')
for regex, app in self.apps:
if not re.match(regex + r'\Z', path):
continue
# This ndb context only work for handlers but not api.
# Apis are using api_common.method.
app_with_ndb_context = ndb.with_ndb_context(app)
return app_with_ndb_context(environ, start_response)
# No matching app found
start_response('404 Not Found', [])
return []
APP = RegexDispatcher([
(r'/_ah/api/.*', api.APP),
(r'/_ah/queue/default', task_scheduler.APP),
])
TFC = RegexDispatcher([
# Task handlers
(
r'/_ah/queue/(default|host-event-queue-ndb|notification-work-queue)',
task_scheduler.APP,
),
(r'/_ah/queue/command-attempt-sync-queue', command_attempt_monitor.APP),
(r'/_ah/queue/command-event-queue', command_event_handler.APP),
(r'/_ah/queue/command-sync-queue', command_monitor.APP),
(r'/_ah/queue/host-sync-queue', device_monitor.APP),
(r'/_ah/queue/request-state-notification-queue', notifier.APP),
(r'/_ah/queue/request-sync-queue', request_sync_monitor.APP),
(r'/_ah/queue/test-request-queue', commander.APP),
# Cron handlers
(r'/cron/monitor/devices/ndb', device_monitor.APP),
(r'/cron/monitor/lab_resource', lab_resource_monitor.APP),
(r'/cron/report/devices', device_info_reporter.APP),
(r'/cron/cleanup/device_history', device_history_cleaner.APP),
(r'/cron/cleanup/device_info', device_info_cleaner.APP),
(r'/cron/notifier_update_request_status', notification_handler.APP),
(r'/cron/syncer/sync_gcs_ndb', config_syncer_gcs_to_ndb.APP),
(
r'/cron/syncer/sync_harness_image_metadata',
harness_image_metadata_syncer.APP,
),
(r'/cron/scheduler/harness_update', harness_update_scheduler.APP),
])