#!/usr/bin/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.

import logging
import logging.handlers

import common
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import xmlrpc_server
from autotest_lib.client.cros import constants
from autotest_lib.client.cros.networking import apmanager_proxy


class ApmanagerXmlRpcDelegate(xmlrpc_server.XmlRpcDelegate):
    """Exposes methods called remotely during APManager autotests.

    All instance methods of this object without a preceding '_' are exposed via
    an XMLRPC server.  This is not a stateless handler object, which means that
    if you store state inside the delegate, that state will remain around for
    future calls.

    """


    def __init__(self):
        self._apmanager_proxy = apmanager_proxy.ApmanagerProxy()


    def __enter__(self):
        super(ApmanagerXmlRpcDelegate, self).__enter__()


    def __exit__(self, exception, value, traceback):
        super(ApmanagerXmlRpcDelegate, self).__exit__(exception, value, traceback)


    @xmlrpc_server.dbus_safe(None)
    def start_service(self, config_params):
        """Create/start an AP service.

        @param config_params dictionary of configuration parameters.
        @return string object path for the AP service.

        """
        return self._apmanager_proxy.start_service(config_params)


    def terminate_service(self, service):
        """Remove/terminate an AP service.

        @param service string object path of the AP service.

        """
        self._apmanager_proxy.terminate_service(service)


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    handler = logging.handlers.SysLogHandler(address='/dev/log')
    formatter = logging.Formatter(
            'apmanager_xmlrpc_server: [%(levelname)s] %(message)s')
    handler.setFormatter(formatter)
    logging.getLogger().addHandler(handler)
    logging.debug('apmanager_xmlrpc_server main...')
    server = xmlrpc_server.XmlRpcServer('localhost',
                                         constants.APMANAGER_XMLRPC_SERVER_PORT)
    if server is None:
        raise error.TestFail('Failed to setup xmlrpc server for apmanager')
    else:
        logging.debug('Server setup')
    server.register_delegate(ApmanagerXmlRpcDelegate())
    server.run()
