예제 #1
0
    def run(self):
        self._wrapper = ClientWrapper()
        self._collector = ModelCollector(self._wrapper, self._pid_store)
        while True:
            self._cv.acquire()
            if self._terminate:
                logging.info('quitting test thread')
                self._cv.release()
                return

            if self._request is not None:
                request = self._request
                self._request = None
                self._cv.release()
                request()
                continue
            # Nothing to do, go into the wait
            self._cv.wait()
            self._cv.release()
예제 #2
0
def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'dhp:u:', [
            'debug', 'help', 'skip-queued-messages', 'pid-location=',
            'universe='
        ])
    except getopt.GetoptError as e:
        print(str(e))
        Usage()
        sys.exit(2)

    universe = None
    pid_location = None
    level = logging.INFO
    skip_queued_messages = False
    for o, a in opts:
        if o in ('-d', '--debug'):
            level = logging.DEBUG
        elif o in ('-h', '--help'):
            Usage()
            sys.exit()
        elif o in ('--skip-queued-messages'):
            skip_queued_messages = True
        elif o in (
                '-p',
                '--pid-location',
        ):
            pid_location = a
        elif o in ('-u', '--universe'):
            universe = int(a)

    if universe is None:
        Usage()
        sys.exit()

    logging.basicConfig(level=level, format='%(message)s')

    client_wrapper = ClientWrapper()
    pid_store = PidStore.GetStore(pid_location)
    controller = ModelCollector(client_wrapper, pid_store)
    data = controller.Run(universe, skip_queued_messages)
    pprint.pprint(data)
예제 #3
0
  skip_queued_messages = False
  for o, a in opts:
    if o in ('-d', '--debug'):
      level = logging.DEBUG
    elif o in ('-h', '--help'):
      Usage()
      sys.exit()
    elif o in ('--skip_queued_messages'):
      skip_queued_messages = True
    elif o in ('--pid_file',):
      pid_file = a
    elif o in ('-u', '--universe'):
      universe = int(a)

  if universe is None:
    Usage()
    sys.exit()

  logging.basicConfig(
      level=level,
      format='%(message)s')

  client_wrapper = ClientWrapper()
  pid_store = PidStore.GetStore(pid_file)
  controller = ModelCollector(client_wrapper, pid_store)
  data = controller.Run(universe, skip_queued_messages)
  pprint.pprint(data)

if __name__ == '__main__':
  main()
예제 #4
0
class RDMTestThread(Thread):
    """The RDMResponder tests are closely coupled to the Wrapper (yuck!). So we
     need to run this all in a separate thread. This is all a bit of a hack and
     you'll get into trouble if multiple things are running at once...
  """
    RUNNING, COMPLETED, ERROR = range(3)
    TESTS, COLLECTOR = range(2)

    def __init__(self, pid_store, logs_directory):
        super(RDMTestThread, self).__init__()
        self._pid_store = pid_store
        self._logs_directory = logs_directory
        self._terminate = False
        self._request = None
        # Guards _terminate and _request
        self._cv = Condition()
        self._wrapper = None
        self._test_state_lock = Lock()  # Guards _test_state
        self._test_state = {}

    def Stop(self):
        self._cv.acquire()
        self._terminate = True
        self._cv.notify()
        self._cv.release()

    def ScheduleTests(self, universe, uid, test_filter, broadcast_write_delay,
                      inter_test_delay, dmx_frame_rate, slot_count):
        """Schedule the tests to be run. Callable from any thread. Callbable by any
       thread.

    Returns:
      An error message, or None if the tests were scheduled.
    """
        if not self._CheckIfConnected():
            return 'Lost connection to OLAD'

        self._cv.acquire()
        if self._request is not None:
            self._cv.release()
            return 'Existing request pending'

        self._request = lambda: self._RunTests(
            universe, uid, test_filter, broadcast_write_delay,
            inter_test_delay, dmx_frame_rate, slot_count)
        self._cv.notify()
        self._cv.release()
        return None

    def ScheduleCollector(self, universe, skip_queued_messages):
        """Schedule the collector to run on a universe. Callable by any thread.

    Returns:
      An error message, or None if the collection was scheduled.
    """
        if not self._CheckIfConnected():
            return 'Lost connection to OLAD'

        self._cv.acquire()
        if self._request is not None:
            self._cv.release()
            return 'Existing request pending'

        self._request = lambda: self._RunCollector(universe,
                                                   skip_queued_messages)
        self._cv.notify()
        self._cv.release()
        return None

    def Stat(self):
        """Check the state of the tests. Callable by any thread.

    Returns:
      The status of the tests.
    """
        self._test_state_lock.acquire()
        state = dict(self._test_state)
        self._test_state_lock.release()
        return state

    def run(self):
        self._wrapper = ClientWrapper()
        self._collector = ModelCollector(self._wrapper, self._pid_store)
        while True:
            self._cv.acquire()
            if self._terminate:
                logging.info('quitting test thread')
                self._cv.release()
                return

            if self._request is not None:
                request = self._request
                self._request = None
                self._cv.release()
                request()
                continue
            # Nothing to do, go into the wait
            self._cv.wait()
            self._cv.release()

    def _UpdateStats(self, tests_completed, total_tests):
        self._test_state_lock.acquire()
        self._test_state['tests_completed'] = tests_completed
        self._test_state['total_tests'] = total_tests
        self._test_state_lock.release()

    def _RunTests(self, universe, uid, test_filter, broadcast_write_delay,
                  inter_test_delay, dmx_frame_rate, slot_count):
        self._test_state_lock.acquire()
        self._test_state = {
            'action': self.TESTS,
            'tests_completed': 0,
            'total_tests': None,
            'state': self.RUNNING,
            'duration': 0,
        }
        start_time = datetime.now()
        self._test_state_lock.release()

        runner = TestRunner.TestRunner(universe, uid, broadcast_write_delay,
                                       inter_test_delay, self._pid_store,
                                       self._wrapper)

        for test in TestRunner.GetTestClasses(TestDefinitions):
            runner.RegisterTest(test)

        dmx_sender = None
        if dmx_frame_rate > 0 and slot_count > 0:
            logging.info(
                'Starting DMXSender with slot count %d and FPS of %d' %
                (slot_count, dmx_frame_rate))
            dmx_sender = DMXSender(self._wrapper, universe, dmx_frame_rate,
                                   slot_count)

        try:
            tests, device = runner.RunTests(test_filter, False,
                                            self._UpdateStats)
        except Exception as e:
            self._test_state_lock.acquire()
            self._test_state['state'] = self.ERROR
            self._test_state['exception'] = str(e)
            self._test_state['traceback'] = traceback.format_exc()
            self._test_state_lock.release()
            return
        finally:
            if dmx_sender is not None:
                dmx_sender.Stop()

        timestamp = int(time())
        end_time = datetime.now()
        test_parameters = {
            'broadcast_write_delay': broadcast_write_delay,
            'inter_test_delay': inter_test_delay,
            'dmx_frame_rate': dmx_frame_rate,
            'dmx_slot_count': slot_count,
        }
        log_saver = TestLogger.TestLogger(self._logs_directory)
        logs_saved = True
        try:
            log_saver.SaveLog(uid, timestamp, end_time, tests, device,
                              test_parameters)
        except TestLogger.TestLoggerException:
            logs_saved = False

        self._test_state_lock.acquire()
        # We can't use total_seconds() since it requires Python 2.7
        time_delta = end_time - start_time
        self._test_state['duration'] = (time_delta.seconds +
                                        time_delta.days * 24 * 3600)
        self._test_state['state'] = self.COMPLETED
        self._test_state['tests'] = tests
        self._test_state['logs_saved'] = logs_saved
        self._test_state['timestamp'] = timestamp
        self._test_state['uid'] = uid
        self._test_state_lock.release()

    def _RunCollector(self, universe, skip_queued_messages):
        """Run the device model collector for a universe."""
        logging.info('Collecting for %d' % universe)
        self._test_state_lock.acquire()
        self._test_state = {
            'action': self.COLLECTOR,
            'state': self.RUNNING,
        }
        self._test_state_lock.release()

        try:
            output = self._collector.Run(universe, skip_queued_messages)
        except Exception as e:
            self._test_state_lock.acquire()
            self._test_state['state'] = self.ERROR
            self._test_state['exception'] = str(e)
            self._test_state['traceback'] = traceback.format_exc()
            self._test_state_lock.release()
            return

        self._test_state_lock.acquire()
        self._test_state['state'] = self.COMPLETED
        self._test_state['output'] = output
        self._test_state_lock.release()

    def _CheckIfConnected(self):
        """Check if the client is connected to olad.

    Returns:
      True if connected, False otherwise.
    """
        # TODO(simon): add this check, remember it needs locking.
        return True