| #! /usr/bin/env python |
| |
| # Copyright 2014 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. |
| |
| """Fake implementation of a Device Server. |
| |
| This module can be used in testing both in autotests and locally. To use locally |
| you can just run this python module directly. |
| """ |
| |
| import argparse |
| import logging |
| import logging.handlers |
| import cherrypy |
| |
| import common |
| from fake_device_server import commands |
| from fake_device_server import devices |
| from fake_device_server import fail_control |
| from fake_device_server import meta_handler |
| from fake_device_server import oauth |
| from fake_device_server import registration_tickets |
| from fake_device_server import resource_delegate |
| |
| PORT = 9876 |
| |
| |
| def stop_server(): |
| """Stops the cherrypy server and blocks.""" |
| cherrypy.engine.stop() |
| |
| |
| def start_server(generation): |
| """Starts the cherrypy server and blocks. |
| |
| @param generation: string unique to this instance of the fake device server. |
| |
| """ |
| fail_control_handler = fail_control.FailControl() |
| cherrypy.tree.mount( |
| fail_control_handler, '/' + fail_control.FAIL_CONTROL_PATH, |
| {'/': |
| {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} |
| } |
| ) |
| oauth_handler = oauth.OAuth(fail_control_handler) |
| commands_handler = commands.Commands(oauth_handler, fail_control_handler) |
| cherrypy.tree.mount( |
| commands_handler, '/' + commands.COMMANDS_PATH, |
| {'/': |
| {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} |
| } |
| ) |
| devices_resource = resource_delegate.ResourceDelegate({}) |
| # TODO(wiley): We need to validate device commands. |
| devices_handler = devices.Devices(devices_resource, |
| commands_handler, |
| oauth_handler, |
| fail_control_handler) |
| cherrypy.tree.mount( |
| devices_handler, '/' + devices.DEVICES_PATH, |
| {'/': |
| {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} |
| } |
| ) |
| tickets = resource_delegate.ResourceDelegate({}) |
| registration_tickets_handler = registration_tickets.RegistrationTickets( |
| tickets, devices_handler, fail_control_handler) |
| cherrypy.tree.mount( |
| registration_tickets_handler, |
| '/' + registration_tickets.REGISTRATION_PATH, |
| {'/': |
| {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} |
| } |
| ) |
| cherrypy.tree.mount( |
| oauth_handler, |
| '/' + oauth.OAUTH_PATH, |
| {'/': |
| {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} |
| } |
| ) |
| cherrypy.tree.mount( |
| meta_handler.MetaHandler(generation), |
| '/' + meta_handler.META_HANDLER_PATH, |
| {'/': |
| {'request.dispatch': cherrypy.dispatch.MethodDispatcher()} |
| } |
| ) |
| # Don't parse POST for params. |
| cherrypy.config.update({'global': {'request.process_request_body': False}}) |
| cherrypy.engine.start() |
| |
| |
| def main(): |
| """Main method for callers who start this module directly.""" |
| parser = argparse.ArgumentParser( |
| description='Acts like a fake instance of GCD') |
| parser.add_argument('generation', metavar='generation', type=str, |
| help='Unique generation id for confirming health') |
| args = parser.parse_args() |
| cherrypy.config.update({'server.socket_port': PORT}) |
| start_server(args.generation) |
| cherrypy.engine.block() |
| |
| |
| if __name__ == '__main__': |
| formatter = logging.Formatter( |
| 'fake_gcd_server: [%(levelname)s] %(message)s') |
| handler = logging.handlers.SysLogHandler(address='/dev/log') |
| handler.setFormatter(formatter) |
| logging.basicConfig(level=logging.DEBUG) |
| logging.getLogger().addHandler(handler) |
| main() |