| # Copyright 2015 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 |
| |
| from autotest_lib.client.common_lib.cros import dbus_send |
| from autotest_lib.client.common_lib.cros import process_watcher |
| from autotest_lib.client.common_lib.cros.tendo import peerd_config |
| |
| |
| N_FACED_PEERD_PATH = \ |
| '/usr/local/autotest/cros/tendo/n_faced_peerd/n_faced_peerd_main.py' |
| # In test images, we add a supplementary set of rules that expand the DBus |
| # access policy to tolerate us claiming this name and sending messages to |
| # these services. |
| TEST_SERVICE_NAME_PREFIX = 'org.chromium.peerd.test' |
| |
| |
| def get_nth_service_name(n): |
| """Get the DBus service name for the Nth face of peerd. |
| |
| @param n: int starting from 0 inclusive. |
| @return DBus service name for Nth instance as a string. |
| |
| """ |
| return '%s.TestInstance%d' % (TEST_SERVICE_NAME_PREFIX, n) |
| |
| |
| class NFacedPeerdHelper(object): |
| """Helper object that knows how to start and stop NFacedPeerd.""" |
| |
| def __init__(self, num_instances, localhost_addr='127.0.0.1', host=None): |
| """Construct an NFacedPeerd instance (possibly on a remote host). |
| |
| @param num_instances: int number of faces to include in our fake peerd. |
| @param localhost_addr: string ip address (e.g. '127.0.0.1'). Each face |
| of peerd will be "discovered" by the other faces at this IP |
| address. This should be an IP address that makes sense for |
| daemons consuming it. |
| @param host: host object if we should start NFacedPeerd on a remote |
| host. |
| |
| """ |
| self._process_watcher = process_watcher.ProcessWatcher( |
| N_FACED_PEERD_PATH, |
| args=['%d' % num_instances, |
| '127.0.0.1'], |
| host=host) |
| self._num_instances = num_instances |
| self._host = host |
| |
| |
| def get_face_identifier(self, instance_number): |
| """Get the UUID for a given face of NFacedPeerd. |
| |
| This will fail if we have not previously started an instance of |
| NFacedPeerd. |
| |
| @param instance_number: int starting from 0 inclusive. |
| @return string UUID value. |
| |
| """ |
| return dbus_send.get_property( |
| get_nth_service_name(instance_number), |
| peerd_config.DBUS_INTERFACE_PEER, |
| peerd_config.DBUS_PATH_SELF, |
| 'UUID', |
| host=self._host).response |
| |
| |
| def start(self): |
| """Start an instance of NFacedPeerd on the host.""" |
| logging.debug('Starting NFacedPeerd') |
| self._process_watcher.start() |
| for i in range(self._num_instances): |
| service_name = get_nth_service_name(i) |
| peerd_config.confirm_peerd_up(service_name=service_name, |
| host=self._host) |
| |
| |
| def close(self): |
| """Close all resources held by the helper.""" |
| logging.debug('Stopping NFacedPeerd') |
| self._process_watcher.close() |
| logging.debug('Finished stopping NFacedPeerd') |