• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#! /usr/bin/env python
2
3# Copyright 2014 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Fake implementation of a Device Server.
8
9This module can be used in testing both in autotests and locally. To use locally
10you can just run this python module directly.
11"""
12
13import argparse
14import logging
15import logging.handlers
16import cherrypy
17
18import common
19from fake_device_server import commands
20from fake_device_server import devices
21from fake_device_server import fail_control
22from fake_device_server import meta_handler
23from fake_device_server import oauth
24from fake_device_server import registration_tickets
25from fake_device_server import resource_delegate
26
27PORT = 9876
28
29
30def stop_server():
31    """Stops the cherrypy server and blocks."""
32    cherrypy.engine.stop()
33
34
35def start_server(generation):
36    """Starts the cherrypy server and blocks.
37
38    @param generation: string unique to this instance of the fake device server.
39
40    """
41    fail_control_handler = fail_control.FailControl()
42    cherrypy.tree.mount(
43        fail_control_handler, '/' + fail_control.FAIL_CONTROL_PATH,
44        {'/':
45            {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
46        }
47    )
48    oauth_handler = oauth.OAuth(fail_control_handler)
49    commands_handler = commands.Commands(oauth_handler, fail_control_handler)
50    cherrypy.tree.mount(
51        commands_handler, '/' + commands.COMMANDS_PATH,
52        {'/':
53            {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
54        }
55    )
56    devices_resource = resource_delegate.ResourceDelegate({})
57    # TODO(wiley): We need to validate device commands.
58    devices_handler = devices.Devices(devices_resource,
59                                      commands_handler,
60                                      oauth_handler,
61                                      fail_control_handler)
62    cherrypy.tree.mount(
63        devices_handler, '/' + devices.DEVICES_PATH,
64        {'/':
65            {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
66        }
67    )
68    tickets = resource_delegate.ResourceDelegate({})
69    registration_tickets_handler = registration_tickets.RegistrationTickets(
70            tickets, devices_handler, fail_control_handler)
71    cherrypy.tree.mount(
72        registration_tickets_handler,
73        '/' + registration_tickets.REGISTRATION_PATH,
74        {'/':
75            {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
76        }
77    )
78    cherrypy.tree.mount(
79        oauth_handler,
80        '/' + oauth.OAUTH_PATH,
81        {'/':
82            {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
83        }
84    )
85    cherrypy.tree.mount(
86        meta_handler.MetaHandler(generation),
87        '/' + meta_handler.META_HANDLER_PATH,
88        {'/':
89            {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}
90        }
91    )
92    # Don't parse POST for params.
93    cherrypy.config.update({'global': {'request.process_request_body': False}})
94    cherrypy.engine.start()
95
96
97def main():
98    """Main method for callers who start this module directly."""
99    parser = argparse.ArgumentParser(
100        description='Acts like a fake instance of GCD')
101    parser.add_argument('generation', metavar='generation', type=str,
102                        help='Unique generation id for confirming health')
103    args = parser.parse_args()
104    cherrypy.config.update({'server.socket_port': PORT})
105    start_server(args.generation)
106    cherrypy.engine.block()
107
108
109if __name__ == '__main__':
110    formatter = logging.Formatter(
111            'fake_gcd_server: [%(levelname)s] %(message)s')
112    handler = logging.handlers.SysLogHandler(address='/dev/log')
113    handler.setFormatter(formatter)
114    logging.basicConfig(level=logging.DEBUG)
115    logging.getLogger().addHandler(handler)
116    main()
117