def start_deleter(): """Launch the deleter process as a daemon this ensure that the deleter process will end on parent process termination""" pm = ProcessManager.get_instance() thread = Process(target=deleter, daemon=True) pm.add_process('deleter', thread) pm.start_process('deleter')
def solve_hdd(): pm = ProcessManager.get_instance() if not sessions.check_session(): return {"text": "No ambiguities data available execute a full analysis first"}, 400 if not session['ambiguities']: queue = pm.get_queue(session['id']) if not queue: return {"text": "No ambiguities data available execute a full analysis first"}, 400 else: session['ambiguities'] = queue.get() payload = {} file_path = session['model'] if os.path.isfile(file_path): dis = Disambiguator.from_file(file_path) dis.remove_transitions(session['ambiguities']['dead']) dis.solve_hidden_deadlocks(session['ambiguities']['hidden']) pm.delete_queue(session['id']) graph = graphviz.Graph(dis.get_graph()) payload['mts'] = graph.get_mts() payload['text'] = "Removed hidden deadlocks and dead transitions" payload['graph'] = graph.get_graph() payload['edges'], payload['nodes'] = graph.get_graph_number() graph.draw_graph(session['graph']) return payload, 200 return {"text": 'File not found'}, 400
def stop_process(): pm = ProcessManager.get_instance() session.pop('position', None) if 'id' in session and session['id']: pm.end_process(session['id']) sessions.delete_output_file() session.pop('id', None) session.pop('ambiguities', None) return {"text":'Stopped process'}, 200
def update_session_timeout(): """Updates timeout for valid sessions and updates last modification time for existing files related to the session""" pm = ProcessManager.get_instance() if 'id' in session: lock = pm.get_lock(session['id']) if lock: with lock: return update() return update()
def get_output(): pm = ProcessManager.get_instance() if not sessions.check_session(): sessions.delete_output_file() return {"text": '\nSession timed-out'}, 404 elif not 'id' in session or not pm.process_exists(session['id']): sessions.delete_output_file() return {"text": ''}, 404 else: if pm.is_alive(session['id']): with open(session['output']) as out: out.seek(session['position']) result = out.read(4096) session['position'] = out.tell() return {"text": result}, 206 else: with open(session['output']) as out: out.seek(session['position']) result = out.read() os.remove(session['output']) queue = pm.get_queue(session['id']) payload = {} payload['text'] = result graph = graphviz.Graph.from_file(session['model']) payload['edges'], payload['nodes'] = graph.get_graph_number() payload['mts'] = graph.get_mts() if (queue): tmp = queue.get()['ambiguities'] session['ambiguities'] = tmp payload['ambiguities'] = tmp ProcessManager.get_instance().delete_queue(session['id']) try: dis = Disambiguator.from_file(session['model']) dis.highlight_ambiguities(tmp['dead'], tmp['false'], tmp['hidden']) payload['graph'] = dis.get_graph() graphviz.Graph(dis.get_graph()).draw_graph( session['graph']) return payload, 200 except: return payload, 200 return payload, 200
def check_session(): """Check if the current session is still valid by verifying if the timeout value is still bigger than the current time.""" pm = ProcessManager.get_instance() if 'id' in session: lock = pm.get_lock(session['id']) if lock: with lock: return ('timeout' in session and session['timeout'] is not None and session['timeout'] > time.time()) else: return ('timeout' in session and session['timeout'] is not None and session['timeout'] > time.time())
def close_session(): """Closes a session by deleting all of its related files and by freeing the related session dictionary.""" pm = ProcessManager.get_instance() session.pop('timeout', None) session.pop('position', None) if 'id' in session and session['id']: pm.end_process(session['id']) pm.delete_lock(session['id']) delete_output_file(True) session.pop('id', None) session.pop('output', None) session.pop('ambiguities', None) session.pop('graph', None) session.pop('counter_graph', None) session.pop('model', None)
def hdead_analyser(): pm = ProcessManager.get_instance() queue = Queue() lock = Lock() sessions.update_session_timeout() file_path = session['model'] if os.path.isfile(file_path): thread = Process(target=hdead_analysis_worker, args=[file_path, session['output'], queue]) session['id'] = str(thread.name) pm.add_process(key=session['id'], process=thread) pm.add_queue(session['id'], queue) pm.start_process(session['id']) pm.add_lock(session['id'], lock) session['position'] = 0 return "Processing data..." return {"text": 'File not found'}, 400
def run_vmc(): pm = ProcessManager.get_instance() if not session['ambiguities']: queue = pm.get_queue(session['id']) if not queue: raise VmcException( "No ambiguities data available execute a full analysis first") else: session['ambiguities'] = queue.get() if (len(session['ambiguities']['hidden']) != 0): raise VmcException( "Hidden deadlocks detected. It is necessary to remove them before checking the property" ) folder = session['output'].split('-output')[0] model = os.path.join(folder, 'model.txt') properties = os.path.join(folder, 'properties.txt') try: if sys.platform.startswith('linux'): vmc = VmcController(app.config['VMC_LINUX']) elif sys.platform.startswith('win'): vmc = VmcController(app.config['VMC_WINDOWS']) elif sys.platform.startswith('cygwin'): vmc = VmcController(app.config['VMC_WINDOWS']) elif sys.platform.startswith('darwin'): vmc = VmcController(app.config['VMC_MAC']) else: raise VmcException( "VMC is not compatible with your operating system") vmc.run_vmc(model, properties) except ValueError as ve: err = str(ve).strip() if os.path.isdir(folder): shutil.rmtree(folder) if err == 'Invalid vmc_path': raise VmcException("Unable to locate VMC executable") if err == 'Invalid model file': raise VmcException('Invalid model file') if err == 'Invalid properties file': raise VmcException('Invalid properties file') except: shutil.rmtree(folder) raise VmcException('An error occured') shutil.rmtree(folder) return vmc
def translate_model(): pm = ProcessManager.get_instance() if not session['ambiguities']: queue = pm.get_queue(session['id']) if not queue: raise VmcException( "No ambiguities data available execute a full analysis first") else: session['ambiguities'] = queue.get() if (len(session['ambiguities']['hidden']) != 0): raise VmcException( "Hidden deadlocks detected. It is necessary to remove them before checking the property" ) fpath = session['model'] actl_property = request.form['property'] if (len(actl_property) == 0): raise VmcException('Missing property to be verified') if os.path.isfile(fpath): translator = Translator() translator.load_model(fpath) translator.translate() folder = session['output'].split('-output')[0] try: os.mkdir(folder) except FileExistsError: #if the directory is already present continue pass model = os.path.join(folder, 'model.txt') properties = os.path.join(folder, 'properties.txt') with open(model, "w") as mts: mts.write(translator.get_output()) mts.flush() with open(properties, "w") as prop_file: prop_file.write(actl_property) prop_file.flush() else: raise VmcException('Unable to translate, FTS model not found.')
def test_add_not_a_queue(self): pm = ProcessManager.get_instance() with pytest.raises(Exception, match=r'queue must be instance of'): pm.add_queue('add_queue', "NOT A QUEUE")
def test_delete_queue(self): pm = ProcessManager.get_instance() pm.delete_queue('add_queue') assert pm.get_queue('add_queue') == None
def test_start_non_existing_process(self): pm = ProcessManager.get_instance() with pytest.raises(KeyError, match=r'nothing'): pm.start_process('nothing')
def test_add_queue(self, queue): pm = ProcessManager.get_instance() pm.add_queue('add_queue', queue) assert len(pm.queue) == 1
def test_get_instance_error(self): pm1 = ProcessManager.get_instance() with pytest.raises(Exception, match=r"A ProcessManager instance already exists"): pm2 = ProcessManager()
def test_add_non_existing_process(self): pm = ProcessManager.get_instance() assert not pm.process_exists('nothing')
def test_kill_process(self, masked_proc): pm = ProcessManager.get_instance() pm.add_process('kill', masked_proc) pm.start_process('kill') pm.end_process('kill') assert not (pm.is_alive('kill') or pm.process_exists('kill'))
def get_vmc(): pm = ProcessManager.get_instance() if not session['ambiguities']: queue = pm.get_queue(session['id']) if not queue: raise VmcException("No ambiguities data available execute a full analysis first") else: session['ambiguities'] = queue.get() if (len(session['ambiguities']['hidden']) != 0): raise VmcException("Hidden deadlocks detected. It is necessary to remove them before checking the property") fpath = session['model'] actl_property = request.form['property'] if (len(actl_property) == 0): raise VmcException('Missing property to be verified') if os.path.isfile(fpath): translator = Translator() translator.load_model(fpath) translator.translate() session_tmp_folder = session['output'].split('-output')[0] try: os.mkdir(session_tmp_folder) except FileExistsError: #if the directory is already present continue pass session_tmp_model = os.path.join(session_tmp_folder, 'model.txt') session_tmp_properties = os.path.join(session_tmp_folder, 'properties.txt') with open(session_tmp_model,"w") as vmc_file: vmc_file.write(translator.get_output()) with open(session_tmp_properties,"w") as prop_file: prop_file.write(actl_property) try: if sys.platform.startswith('linux'): vmc = VmcController(VMC_LINUX) elif sys.platform.startswith('win'): vmc = VmcController(VMC_WINDOWS) elif sys.platform.startswith('cygwin'): vmc = VmcController(VMC_WINDOWS) elif sys.platform.startswith('darwin'): vmc = VmcController(VMC_MAC) else: raise VmcException("VMC is not compatible with your operating system") vmc.run_vmc(session_tmp_model,session_tmp_properties) except ValueError as ve: if str(ve) == 'Invalid vmc_path': shutil.rmtree(session_tmp_folder) raise VmcException("Unable to locate VMC executable") if str(ve) == 'Invalid model file': shutil.rmtree(session_tmp_folder) raise VmcException('Invalid model file') if str(ve) == 'Invalid properties file': shutil.rmtree(session_tmp_folder) raise VmcException('Invalid properties file') except: shutil.rmtree(session_tmp_folder) raise VmcException('An error occured') shutil.rmtree(session_tmp_folder) return vmc, translator raise VmcException('File not found')
def test_is_alive(self): pm = ProcessManager.get_instance() pm.start_process('add_process') assert pm.is_alive('add_process')
def test_end_process(self): pm = ProcessManager.get_instance() pm.end_process('add_process') assert not (pm.is_alive('add_process') or pm.process_exists('add_process'))
def test_delete_non_existing_queue(self): pm = ProcessManager.get_instance() nqueue = len(pm.queue) pm.delete_queue('nothing') assert nqueue == len(pm.queue)
def test_add_not_a_process(self): pm = ProcessManager.get_instance() with pytest.raises(Exception, match=r"process must be instance of"): pm.add_process('add_process', "NOT A PROCESS")
def test_add_process(self, process): pm = ProcessManager.get_instance() pm.add_process('add_process', process) assert pm.process_exists('add_process')
def test_get_non_existing_queue(self): pm = ProcessManager.get_instance() assert pm.get_queue('nothing') == None
def test_process_dont_exists(self): pm = ProcessManager.get_instance() assert not pm.process_exists('nothing')
def test_get_queue(self): pm = ProcessManager.get_instance() assert pm.get_queue('add_queue')
def test_end_non_existing_process(self): pm = ProcessManager.get_instance() nproc = len(pm.proc) pm.end_process('nothing') assert len(pm.proc) == nproc
def test_is_not_alive(self): pm = ProcessManager.get_instance() assert not pm.is_alive('add_process')
def test_get_instance(self): pm1 = ProcessManager.get_instance() pm2 = ProcessManager.get_instance() assert pm1 == pm2