def iterate_finish(self): information = self.finished_store.get(timeout=self.timeout) if information is not None: reservation_id, obj, initial_time, end_time = information if not self.commands_store.empty( ) or not self.completed_store.empty(): # They have higher priority self.finished_store.put(reservation_id, obj, initial_time, end_time) return initial_timestamp = time.mktime( initial_time.timetuple()) + initial_time.microsecond / 1e6 end_timestamp = time.mktime( end_time.timetuple()) + end_time.microsecond / 1e6 command = CommandSent(Command.Command("@@@finish@@@"), initial_timestamp, Command.Command(str(obj)), end_timestamp) if not self.db_manager.finish_experiment_usage( reservation_id, initial_timestamp, command): # If it could not be added because the experiment id # did not exist, put it again in the queue self.finished_store.put(reservation_id, obj, initial_time, end_time) time.sleep(0.01)
def iterate_initial(self): initial_information = self.initial_store.get(timeout=self.timeout) if initial_information is not None: initial_timestamp = time.mktime( initial_information.initial_time.timetuple( )) + initial_information.initial_time.microsecond / 1e6 end_timestamp = time.mktime(initial_information.end_time.timetuple( )) + initial_information.end_time.microsecond / 1e6 request_info = initial_information.request_info from_ip = request_info.pop('from_ip', '<address not found>') try: username = request_info.pop('username') except: log.log( TemporalInformationRetriever, log.level.Critical, "Provided information did not contain some required fields (such as username or role). This usually means that the reservation has previously been expired. Provided request_info: %r; provided data: %r" % (request_info, initial_information), max_size=10000) log.log_exc(TemporalInformationRetriever, log.level.Critical) return usage = ExperimentUsage() usage.start_date = initial_timestamp usage.from_ip = from_ip usage.experiment_id = initial_information.experiment_id usage.reservation_id = initial_information.reservation_id usage.coord_address = initial_information.exp_coordaddr usage.request_info = initial_information.request_info command_request = CommandSent( Command.Command("@@@initial::request@@@"), initial_timestamp, Command.Command(str(initial_information.client_initial_data)), end_timestamp) command_response = CommandSent( Command.Command("@@@initial::response@@@"), initial_timestamp, Command.Command(str( initial_information.initial_configuration)), end_timestamp) usage.append_command(command_request) usage.append_command(command_response) self.db_manager.store_experiment_usage(username, usage)
def create_usage(gateway, reservation_id = 'my_reservation_id'): session = gateway.Session() student1 = gateway._get_user(session, 'student1') initial_usage = ExperimentUsage() initial_usage.start_date = time.time() initial_usage.end_date = time.time() initial_usage.from_ip = "130.206.138.16" initial_usage.experiment_id = ExperimentId("ud-dummy","Dummy experiments") initial_usage.coord_address = CoordAddress.CoordAddress("machine1","instance1","server1") #.translate_address("server1:instance1@machine1") initial_usage.reservation_id = reservation_id file1 = FileSent( 'path/to/file1', '{sha}12345', time.time() ) file2 = FileSent( 'path/to/file2', '{sha}123456', time.time(), Command.Command('response'), time.time(), file_info = 'program' ) command1 = CommandSent( Command.Command("your command1"), time.time() ) command2 = CommandSent( Command.Command("your command2"), time.time(), Command.Command("your response2"), time.time() ) initial_usage.append_command(command1) initial_usage.append_command(command2) initial_usage.append_file(file1) initial_usage.append_file(file2) initial_usage.request_info = {'facebook' : False} gateway.store_experiment_usage(student1.login, initial_usage) return student1, initial_usage, command1, command2, file1, file2
def test_update_command(self): student1 = self.gateway._get_user(self.session, 'student1') RESERVATION_ID1 = 'my_reservation_id1' usage1 = ExperimentUsage() usage1.start_date = time.time() usage1.end_date = time.time() usage1.from_ip = "130.206.138.16" usage1.experiment_id = ExperimentId("ud-dummy", "Dummy experiments") usage1.coord_address = CoordAddress("machine1", "instance1", "server1") usage1.reservation_id = RESERVATION_ID1 usage1.request_info = { 'facebook': False, 'permission_scope': 'user', 'permission_id': student1.id } self.gateway.store_experiment_usage(student1.login, usage1) usages = self.gateway.list_usages_per_user(student1.login) self.assertEquals(1, len(usages)) full_usage = self.gateway.retrieve_usage(usages[0].experiment_use_id) self.assertEquals(0, len(full_usage.commands)) command1 = CommandSent(Command.Command("your command"), time.time()) command_id = self.gateway.append_command(RESERVATION_ID1, command1) full_usage = self.gateway.retrieve_usage(usages[0].experiment_use_id) self.assertEquals("your command", full_usage.commands[0].command.commandstring) self.assertEquals(Command.NullCommand(), full_usage.commands[0].response) self.gateway.update_command(command_id, Command.Command("the response"), time.time()) full_usage = self.gateway.retrieve_usage(usages[0].experiment_use_id) self.assertEquals("your command", full_usage.commands[0].command.commandstring) self.assertEquals("the response", full_usage.commands[0].response.commandstring)
def test_get_experiment_uses_by_id(self): port = 15131 self.configurationManager._set_value(self.rfs.FACADE_JSON_PORT, port) self.rfs.start() try: client = WebLabDeustoClient("http://localhost:%s/weblab/" % port) expected_sess_id = SessionId.SessionId("whatever") expected_usage = ExperimentUsage(10, time.time(), time.time(), '127.0.0.1', ExperimentId("exp","cat"), 'reser1', CoordAddress('machine','instance','server')) command_sent = CommandSent(Command.Command("request"), time.time(), Command.Command("response"), time.time()) expected_usage.append_command(command_sent) loaded_file_sent = LoadedFileSent('content-of-the-file', time.time(), Command.Command("response"), time.time(), 'program') expected_usage.append_file(loaded_file_sent) expected_finished_result = FinishedReservationResult(expected_usage) expected_alive_result = RunningReservationResult() expected_cancelled_result = CancelledReservationResult() self.mock_server.return_values['get_experiment_uses_by_id'] = (expected_finished_result, expected_alive_result, expected_cancelled_result) expected_reservations = (SessionId.SessionId('reservation'), SessionId.SessionId('reservation2'), SessionId.SessionId('reservation3') ) results = client.get_experiment_uses_by_id(expected_sess_id, expected_reservations) self.assertEquals( expected_sess_id.id, self.mock_server.arguments['get_experiment_uses_by_id'][0]) self.assertEquals( expected_reservations, tuple(self.mock_server.arguments['get_experiment_uses_by_id'][1])) self.assertEquals(3, len(results)) self.assertEquals(expected_finished_result.status, results[0].status) self.assertEquals(expected_alive_result.status, results[1].status) self.assertEquals(expected_cancelled_result.status, results[2].status) self.assertEquals(expected_usage, results[0].experiment_use) finally: self.rfs.stop()
def test_return_get_experiment_uses_by_id(self): expected_sess_id = SessionId.SessionId("whatever") expected_usage = ExperimentUsage(10, time.time(), time.time(), '127.0.0.1', ExperimentId("exp", "cat")) command_sent = CommandSent(Command.Command("request"), time.time(), Command.Command("response"), time.time()) expected_usage.append_command(command_sent) loaded_file_sent = LoadedFileSent('content-of-the-file', time.time(), Command.Command("response"), time.time(), 'program') expected_usage.append_file(loaded_file_sent) expected_finished_result = FinishedReservationResult(expected_usage) expected_alive_result = WaitingReservationResult() expected_cancelled_result = CancelledReservationResult() self.mock_ups.return_values['get_experiment_uses_by_id'] = ( expected_finished_result, expected_alive_result, expected_cancelled_result) results = self.rfm.get_experiment_uses_by_id( expected_sess_id, (SessionId.SessionId('reservation'), SessionId.SessionId('reservation2'), SessionId.SessionId('reservation3'))) self.assertEquals(3, len(results)) self.assertEquals(expected_finished_result.status, results[0].status) self.assertEquals(expected_alive_result.status, results[1].status) self.assertEquals(expected_cancelled_result.status, results[2].status) self.assertEquals(expected_usage, expected_finished_result.experiment_use)
def _append_command(self, command, timestamp_before, response, timestamp_after): command_sent = CommandSent(command, timestamp_before, response, timestamp_after) self._session['commands'].append(command_sent)
def test_add_file(self): student1 = self.gateway._get_user(self.session, 'student1') RESERVATION_ID1 = 'my_reservation_id1' RESERVATION_ID2 = 'my_reservation_id2' usage1 = ExperimentUsage() usage1.start_date = time.time() usage1.end_date = time.time() usage1.from_ip = "130.206.138.16" usage1.experiment_id = ExperimentId("ud-dummy", "Dummy experiments") usage1.coord_address = CoordAddress("machine1", "instance1", "server1") usage1.reservation_id = RESERVATION_ID1 command1 = CommandSent(Command.Command("your command1"), time.time(), Command.Command("your response1"), time.time()) usage1.append_command(command1) usage1.request_info = { 'facebook': False, 'permission_scope': 'user', 'permission_id': student1.id } usage2 = ExperimentUsage() usage2.start_date = time.time() usage2.end_date = time.time() usage2.from_ip = "130.206.138.17" usage2.experiment_id = ExperimentId("ud-dummy", "Dummy experiments") usage2.coord_address = CoordAddress("machine1", "instance1", "server1") usage2.reservation_id = RESERVATION_ID2 command2 = CommandSent(Command.Command("your command2"), time.time(), Command.Command("your response2"), time.time()) usage2.append_command(command2) usage2.request_info = { 'facebook': False, 'permission_scope': 'user', 'permission_id': student1.id } self.gateway.store_experiment_usage(student1.login, usage1) self.gateway.store_experiment_usage(student1.login, usage2) file_sent1 = FileSent('path/to/file2', '{sha}123456', time.time(), Command.Command('response'), time.time(), file_info='program') usages = self.gateway.list_usages_per_user(student1.login) self.assertEquals(2, len(usages)) full_usage1 = self.gateway.retrieve_usage(usages[0].experiment_use_id) full_usage2 = self.gateway.retrieve_usage(usages[1].experiment_use_id) self.assertEquals(1, len(full_usage1.commands)) self.assertEquals(1, len(full_usage2.commands)) self.assertEquals(0, len(full_usage1.sent_files)) self.assertEquals(0, len(full_usage2.sent_files)) self.gateway.append_file(RESERVATION_ID1, file_sent1) full_usage1 = self.gateway.retrieve_usage(usages[0].experiment_use_id) full_usage2 = self.gateway.retrieve_usage(usages[1].experiment_use_id) self.assertEquals(1, len(full_usage1.commands)) self.assertEquals(1, len(full_usage2.commands)) self.assertEquals(1, len(full_usage1.sent_files)) self.assertEquals(0, len(full_usage2.sent_files)) self.assertEquals("response", full_usage1.sent_files[0].response.commandstring)
def test_finish_experiment_usage(self): student1 = self.gateway._get_user(self.session, 'student1') RESERVATION_ID1 = 'my_reservation_id1' RESERVATION_ID2 = 'my_reservation_id2' usage1 = ExperimentUsage() usage1.start_date = time.time() usage1.from_ip = "130.206.138.16" usage1.experiment_id = ExperimentId("ud-dummy", "Dummy experiments") usage1.coord_address = CoordAddress("machine1", "instance1", "server1") usage1.reservation_id = RESERVATION_ID1 command1 = CommandSent(Command.Command("your command1"), time.time(), Command.Command("your response1"), time.time()) usage1.append_command(command1) usage1.request_info = { 'facebook': False, 'permission_scope': 'user', 'permission_id': student1.id } usage2 = ExperimentUsage() usage2.start_date = time.time() usage2.from_ip = "130.206.138.17" usage2.experiment_id = ExperimentId("ud-dummy", "Dummy experiments") usage2.coord_address = CoordAddress("machine1", "instance1", "server1") usage2.reservation_id = RESERVATION_ID2 command2 = CommandSent(Command.Command("your command2"), time.time(), Command.Command("your response2"), time.time()) usage2.append_command(command2) usage2.request_info = { 'facebook': False, 'permission_scope': 'user', 'permission_id': student1.id } self.gateway.store_experiment_usage(student1.login, usage1) self.gateway.store_experiment_usage(student1.login, usage2) finishing_command = CommandSent(Command.Command("@@@finish@@@"), time.time(), Command.Command("finish"), time.time()) usages = self.gateway.list_usages_per_user(student1.login) self.assertEquals(2, len(usages)) full_usage1 = self.gateway.retrieve_usage(usages[0].experiment_use_id) full_usage2 = self.gateway.retrieve_usage(usages[1].experiment_use_id) self.assertEquals(None, full_usage1.end_date) self.assertEquals(None, full_usage2.end_date) self.assertEquals(1, len(full_usage1.commands)) self.assertEquals(1, len(full_usage2.commands)) result = self.gateway.finish_experiment_usage(RESERVATION_ID1, time.time(), finishing_command) self.assertTrue(result) full_usage1 = self.gateway.retrieve_usage(usages[0].experiment_use_id) full_usage2 = self.gateway.retrieve_usage(usages[1].experiment_use_id) self.assertNotEqual(None, full_usage1.end_date) self.assertEquals(None, full_usage2.end_date) self.assertEquals(2, len(full_usage1.commands)) self.assertEquals(1, len(full_usage2.commands)) self.assertEquals("@@@finish@@@", full_usage1.commands[1].command.commandstring) self.assertEquals("finish", full_usage1.commands[1].response.commandstring)
def test_add_command(self): session = self.gateway.Session() student1 = self.gateway._get_user(session, 'student1') RESERVATION_ID1 = 'my_reservation_id1' RESERVATION_ID2 = 'my_reservation_id2' usage1 = ExperimentUsage() usage1.start_date = time.time() usage1.end_date = time.time() usage1.from_ip = "130.206.138.16" usage1.experiment_id = ExperimentId("ud-dummy","Dummy experiments") usage1.coord_address = CoordAddress.CoordAddress("machine1","instance1","server1") #.translate_address("server1:instance1@machine1") usage1.reservation_id = RESERVATION_ID1 command1 = CommandSent( Command.Command("your command1"), time.time(), Command.Command("your response1"), time.time() ) usage1.append_command(command1) usage1.request_info = {'facebook' : False} usage2 = ExperimentUsage() usage2.start_date = time.time() usage2.end_date = time.time() usage2.from_ip = "130.206.138.17" usage2.experiment_id = ExperimentId("ud-dummy","Dummy experiments") usage2.coord_address = CoordAddress.CoordAddress("machine1","instance1","server1") #.translate_address("server1:instance1@machine1") usage2.reservation_id = RESERVATION_ID2 command2 = CommandSent( Command.Command("your command2"), time.time(), Command.Command("your response2"), time.time() ) usage2.append_command(command2) usage2.request_info = {'facebook' : False} self.gateway.store_experiment_usage(student1.login, usage1) self.gateway.store_experiment_usage(student1.login, usage2) batch_command = CommandSent( Command.Command("@@@batch@@@"), time.time(), Command.Command("batch"), time.time() ) finishing_command = CommandSent( Command.Command("@@@finish@@@"), time.time(), Command.Command("finish"), time.time() ) usages = self.gateway.list_usages_per_user(student1.login) self.assertEquals(2, len(usages)) full_usage1 = self.gateway.retrieve_usage(usages[0].experiment_use_id) full_usage2 = self.gateway.retrieve_usage(usages[1].experiment_use_id) self.assertEquals(1, len(full_usage1.commands)) self.assertEquals(1, len(full_usage2.commands)) self.gateway.append_command(RESERVATION_ID1, batch_command) self.gateway.append_command(RESERVATION_ID2, finishing_command) full_usage1 = self.gateway.retrieve_usage(usages[0].experiment_use_id) full_usage2 = self.gateway.retrieve_usage(usages[1].experiment_use_id) self.assertEquals(2, len(full_usage1.commands)) self.assertEquals(2, len(full_usage2.commands)) self.assertEquals("@@@batch@@@", full_usage1.commands[1].command.commandstring) self.assertEquals("batch", full_usage1.commands[1].response.commandstring) self.assertEquals("@@@finish@@@", full_usage2.commands[1].command.commandstring) self.assertEquals("finish", full_usage2.commands[1].response.commandstring)
def iterate_command(self): information = self.commands_store.get(timeout=self.timeout) if information is not None: all_information = [ information ] # Retrieve all the remaining information to ensure that it it finally empty, # with a maximum of 1000 registries per request max_registries = 1000 counter = 0 while not self.commands_store.empty() and counter < max_registries: counter += 1 information = self.commands_store.get(timeout=0) if information is not None: all_information.append(information) command_pairs = [] command_responses = [] command_requests = {} file_pairs = [] file_responses = [] file_requests = {} backup_information = {} backup_information_responses = {} # Process for information in all_information: if information.is_command: if information.is_before: backup_information[information.entry_id] = information command_requests[information.entry_id] = (information.reservation_id, CommandSent( information.payload, information.timestamp)) else: backup_information_responses[information.entry_id] = information command_request = command_requests.pop(information.entry_id, None) if command_request is not None: reservation_id, command_sent = command_request complete_command = CommandSent( command_sent.command, command_sent.timestamp_before, information.payload, information.timestamp) command_pairs.append((reservation_id, information.entry_id, complete_command)) else: with self.entry_id2command_id_lock: command_id = self.entry_id2command_id.pop(information.entry_id, None) if command_id is None: self.commands_store.put(information) else: command_responses.append((information.entry_id, command_id, information.payload, information.timestamp)) else: if information.is_before: backup_information[information.entry_id] = information file_requests[information.entry_id] = (information.reservation_id, information.payload) else: backup_information_responses[information.entry_id] = information file_request = file_requests.pop(information.entry_id, None) if file_request is not None: reservation_id, file_sent = file_request if file_sent.is_loaded(): storer = file_storer.FileStorer(self.cfg_manager, reservation_id) stored = storer.store_file(self, file_sent.file_content, file_sent.file_info) file_path = stored.file_path file_hash = stored.file_hash else: file_path = file_sent.file_path file_hash = file_sent.file_hash complete_file = FileSent(file_path, file_hash, file_sent.timestamp_before, information.payload, information.timestamp) file_pairs.append((reservation_id, information.entry_id, complete_file)) else: with self.entry_id2command_id_lock: command_id = self.entry_id2command_id.pop(information.entry_id, None) if command_id is None: self.commands_store.put(information) else: file_responses.append((information.entry_id, command_id, information.payload, information.timestamp)) # At this point, we have all the information processed and # ready to be passed to the database in a single commit mappings = self.db_manager.store_commands(command_pairs, command_requests, command_responses, file_pairs, file_requests, file_responses) elements_to_backup = [] with self.entry_id2command_id_lock: for entry_id in mappings: command_id = mappings[entry_id] if command_id is not None and command_id is not False: self.entry_id2command_id[entry_id] = mappings[entry_id] else: elements_to_backup.append(entry_id) for entry_id in elements_to_backup: if entry_id in backup_information: self.commands_store.put(backup_information[entry_id]) if entry_id in backup_information_responses: self.commands_store.put(backup_information_responses[entry_id])
def _parse_experiment_result(self, experiment_result): if experiment_result['status'] == ReservationResult.ALIVE: if experiment_result['running']: return RunningReservationResult() else: return WaitingReservationResult() elif experiment_result['status'] == ReservationResult.CANCELLED: return CancelledReservationResult() elif experiment_result['status'] == ReservationResult.FORBIDDEN: return ForbiddenReservationResult() experiment_use = experiment_result['experiment_use'] experiment_id = ExperimentId( experiment_use['experiment_id']['exp_name'], experiment_use['experiment_id']['cat_name']) addr = experiment_use['coord_address'] if 'machine_id' in addr: coord_address = CoordAddress(addr['machine_id'], addr['instance_id'], addr['server_id']) else: coord_address = CoordAddress(addr['host'], addr['process'], addr['component']) use = ExperimentUsage(experiment_use['experiment_use_id'], experiment_use['start_date'], experiment_use['end_date'], experiment_use['from_ip'], experiment_id, experiment_use['reservation_id'], coord_address, experiment_use['request_info']) for sent_file in experiment_use['sent_files']: response = Command( sent_file['response']['commandstring'] ) if 'commandstring' in sent_file['response'] and sent_file[ 'response'] is not None else NullCommand if sent_file['file_info'] == {}: file_info = None else: file_info = sent_file['file_info'] unserialized_sent_file = LoadedFileSent( sent_file['file_content'], sent_file['timestamp_before'], response, sent_file['timestamp_after'], file_info) use.append_file(unserialized_sent_file) for command in experiment_use['commands']: request = Command( command['command']['commandstring'] ) if 'commandstring' in command['command'] and command[ 'command'] is not None else NullCommand response_command = command['response'][ 'commandstring'] if 'commandstring' in command[ 'response'] and command['response'] is not None else None if response_command is None or response_command == {}: response = NullCommand() else: response = Command(response_command) if command['timestamp_after'] is None or command[ 'timestamp_after'] == {}: timestamp_after = None else: timestamp_after = command['timestamp_after'] unserialized_command = CommandSent(request, command['timestamp_before'], response, timestamp_after) use.append_command(unserialized_command) return FinishedReservationResult(use)
def _store_two_reservations(self): # # Two users: student2, that started before "any" but finished after "any", and "any" then. Both use # the same experiment. # reservation_id1 = SessionId.SessionId(u'5') initial_usage1 = ExperimentUsage() initial_usage1.start_date = time.time() initial_usage1.end_date = time.time() initial_usage1.from_ip = u"130.206.138.16" initial_usage1.experiment_id = ExperimentId(u"ud-dummy",u"Dummy experiments") initial_usage1.coord_address = CoordAddress.CoordAddress(u"machine1",u"instance1",u"server1") #.translate_address("server1:instance1@machine1") initial_usage1.reservation_id = reservation_id1.id valid_file_path = os.path.relpath(os.sep.join(('test','__init__.py'))) file1 = FileSent( valid_file_path, u'{sha}12345', time.time()) file2 = FileSent( valid_file_path, u'{sha}123456', time.time(), Command(u'response'), time.time(), file_info = u'program') command1 = CommandSent( Command(u"your command1"), time.time()) command2 = CommandSent( Command(u"your command2"), time.time(), Command(u"your response2"), time.time()) initial_usage1.append_command(command1) initial_usage1.append_command(command2) initial_usage1.append_file(file1) initial_usage1.append_file(file2) reservation_id2 = SessionId.SessionId(u'6') initial_usage2 = ExperimentUsage() initial_usage2.start_date = time.time() initial_usage2.end_date = time.time() initial_usage2.from_ip = u"130.206.138.16" initial_usage2.experiment_id = ExperimentId(u"ud-dummy",u"Dummy experiments") initial_usage2.coord_address = CoordAddress.CoordAddress(u"machine1",u"instance1",u"server1") #.translate_address("server1:instance1@machine1") initial_usage2.reservation_id = reservation_id2.id file1 = FileSent( valid_file_path, u'{sha}12345', time.time()) file2 = FileSent( valid_file_path, u'{sha}123456', time.time(), Command(u'response'), time.time(), file_info = u'program') command1 = CommandSent( Command(u"your command1"), time.time()) command2 = CommandSent( Command(u"your command2"), time.time(), Command(u"your response2"), time.time()) initial_usage2.append_command(command1) initial_usage2.append_command(command2) initial_usage2.append_file(file1) initial_usage2.append_file(file2) self.ups._db_manager._gateway.store_experiment_usage('student1', initial_usage1) self.ups._db_manager._gateway.store_experiment_usage('student2', initial_usage2) return (reservation_id1, reservation_id2), (initial_usage1, initial_usage2)