def __init__(self, version): self.udpQueue = Queue() self.udpServer = UDPServer(self.udpQueue) self.tmpDir = tempfile.mkdtemp("tmpTAS") os.environ["TAS_TMP"] = self.tmpDir os.environ["TAS_VERSION"] = version self.logger = LogManager().getLogger("Main") self.peers = {} self.root = os.getcwd() os.chdir(self.tmpDir) self.httpServer = subprocess.Popen( ["python", "-m", "SimpleHTTPServer", "0"], stdout=open("/dev/null", "w"), stderr=open("/dev/null", "w"), preexec_fn=os.setsid, ) time.sleep(1) pid = str(self.httpServer.pid) httpPort = subprocess.Popen( "netstat -tulpn | awk ' /" + pid + '\/python/ { gsub(/^[^:]+:/, "", $4); print $4 } \'', shell=True, stdout=subprocess.PIPE, stderr=open("/dev/null", "w"), ) self.httpPort = int(httpPort.stdout.readline().strip()) os.chdir(self.root) signal.signal(signal.SIGINT, self._shutdown) signal.signal(signal.SIGTERM, self._shutdown) self.shutdownLock = threading.Lock() self.closed = False
class ExecutionOrganiser(object): def __init__(self, version): self.udpQueue = Queue() self.udpServer = UDPServer(self.udpQueue) self.tmpDir = tempfile.mkdtemp("tmpTAS") os.environ["TAS_TMP"] = self.tmpDir os.environ["TAS_VERSION"] = version self.logger = LogManager().getLogger("Main") self.peers = {} self.root = os.getcwd() os.chdir(self.tmpDir) self.httpServer = subprocess.Popen( ["python", "-m", "SimpleHTTPServer", "0"], stdout=open("/dev/null", "w"), stderr=open("/dev/null", "w"), preexec_fn=os.setsid, ) time.sleep(1) pid = str(self.httpServer.pid) httpPort = subprocess.Popen( "netstat -tulpn | awk ' /" + pid + '\/python/ { gsub(/^[^:]+:/, "", $4); print $4 } \'', shell=True, stdout=subprocess.PIPE, stderr=open("/dev/null", "w"), ) self.httpPort = int(httpPort.stdout.readline().strip()) os.chdir(self.root) signal.signal(signal.SIGINT, self._shutdown) signal.signal(signal.SIGTERM, self._shutdown) self.shutdownLock = threading.Lock() self.closed = False def _process(self): """ Monitor the overall progress and exchange data """ heartBeats = self.udpServer.getHeartBeats(self.udpQueue.qsize()) self.__processHeartBeats(heartBeats) if len(self.peers.keys()) == 0: return False if all(self.__processPeers(heartBeats)): toContinue = self.testDistributor.continueIterations() if not toContinue: return True self.peers = {} return False return False def __processPeers(self, heartbeats): """ Process all peer states """ states = [] for macAddr, peer in self.peers.items(): hasHeartBeat = any(m == macAddr for h, m, r in heartbeats) peer.checkState(hasHeartBeat) states.append(peer.isDone()) return states def __processHeartBeats(self, heartbeats): """ Process all new peer discoveries """ for ipAddr, macAddr, randomBits in heartbeats: if macAddr in self.peers.keys(): self.peers[macAddr].checkIP(ipAddr, randomBits) else: peer = Peer.createPeer( ipAddr, self.httpPort, macAddr, randomBits, self.testDistributor, self.resultWorker ) if peer: self.peers[macAddr] = peer def _go(self): self.testGather = TestGatherManager(self.tmpDir) source, description = self.testGather.gatherTests() self.testDistributor = TestDistributor(self.peers, source) self.resultWorker = ResultWorker(self.testGather.getPackDetails(), source) def _shutdown(self, *args): """ Teardown all components and a graceful shutdown """ with self.shutdownLock: if self.closed: return self.closed = True self.logger.info("Shutdown called") processes = [] peers = self.peers.values() if hasattr(self, "peers") else [] for peer in peers: processes += peer.shutdown() while any(process.is_alive() for process in processes if process): time.sleep(1) if hasattr(self, "httpServer"): os.killpg(self.httpServer.pid, signal.SIGTERM) for component in ["udpServer", "resultWorker"]: if not hasattr(self, component): continue getattr(self, component).shutdown() ConfigurationManager.destroySingleton() if os.path.exists(self.tmpDir): shutil.rmtree(self.tmpDir) os._exit(0)