+ if all(results):
+ logger.console('All nodes are ready')
+ else:
+ raise RuntimeError('Failed to setup framework')
+
+
+class CleanupFramework(object):
+ """Clean up suite run on topology nodes."""
+
+ @staticmethod
+ def cleanup_framework(nodes):
+ """Perform cleanup on each node.
+
+ :param nodes: Topology nodes.
+ :type nodes: dict
+ :raises RuntimeError: If cleanup framework failed.
+ """
+
+ results = []
+ threads = []
+
+ for node in nodes.values():
+ thread = threading.Thread(target=cleanup_node,
+ args=(node, results))
+ thread.start()
+ threads.append(thread)
+
+ logger.info(
+ 'Executing node cleanups in parallel, waiting for threads to end')
+
+ for thread in threads:
+ thread.join()
+
+ logger.info('Results: {0}'.format(results))