def test_server_fire_simulation(self, mocker, connectivity_factory): input_folder = self.files_helper.get_project_folder(self.test_project) sim_dir = os.path.join(input_folder, 'test_sim') if not os.path.isdir(sim_dir): os.makedirs(sim_dir) simulator = Simulator() simulator.connectivity = connectivity_factory() sim_serializer = SimulatorSerializer() sim_serializer.serialize_simulator(simulator, simulator.gid.hex, None, sim_dir) zip_filename = shutil.make_archive(sim_dir, 'zip', input_folder) # Mock flask.request.files to return a dictionary request_mock = mocker.patch.object(flask, 'request') fp = open(zip_filename, 'rb') request_mock.files = { 'file': FileStorage(fp, os.path.basename(zip_filename)) } def launch_sim(self, user_id, project, algorithm, zip_folder_path, simulator_file): return Operation('', '', '', {}) # Mock simulation launch mocker.patch.object(SimulatorService, 'prepare_simulation_on_server', launch_sim) operation_gid, status = self.simulation_resource.post( self.test_project.gid) fp.close() assert type(operation_gid) is str assert status == 201
def fire_simulation(self, project_gid, session_stored_simulator, temp_folder): simulator_index = SimulatorIndex() temp_name = tempfile.mkdtemp(dir=TvbProfile.current.TVB_TEMP_FOLDER) destination_folder = os.path.join(TvbProfile.current.TVB_TEMP_FOLDER, temp_name) simulation_state_gid = None SimulatorSerializer().serialize_simulator(session_stored_simulator, simulator_index.gid, simulation_state_gid, destination_folder) zip_folder_path = os.path.join( temp_folder, RequestFileKey.SIMULATION_FILE_NAME.value) FilesHelper().zip_folder(zip_folder_path, destination_folder) file_obj = open(zip_folder_path, 'rb') return self.secured_request().post( self.build_request_url( RestLink.FIRE_SIMULATION.compute_url( True, {LinkPlaceholder.PROJECT_GID.value: project_gid})), files={ RequestFileKey.SIMULATION_FILE_KEY.value: (RequestFileKey.SIMULATION_FILE_NAME.value, file_obj) })
def async_launch_and_prepare_simulation(self, burst_config, user, project, simulator_algo, session_stored_simulator, simulation_state_gid): try: metadata = {} metadata.update({DataTypeMetaData.KEY_BURST: burst_config.id}) simulator_id = simulator_algo.id algo_category = simulator_algo.algorithm_category operation = self._prepare_operation(project.id, user.id, simulator_id, session_stored_simulator.gid, algo_category, None, metadata) storage_path = self.files_helper.get_project_folder(project, str(operation.id)) SimulatorSerializer().serialize_simulator(session_stored_simulator, simulation_state_gid, storage_path) BurstService.update_simulation_fields(burst_config.id, operation.id, session_stored_simulator.gid) wf_errs = 0 try: OperationService().launch_operation(operation.id, True) return operation except Exception as excep: self.logger.error(excep) wf_errs += 1 if burst_config: BurstService().mark_burst_finished(burst_config, error_message=str(excep)) self.logger.debug("Finished launching workflow. The operation was launched successfully, " + str(wf_errs) + " had error on pre-launch steps") except Exception as excep: self.logger.error(excep) if burst_config: BurstService().mark_burst_finished(burst_config, error_message=str(excep))
def test_load_burst_only(self): zip_path = path.join(path.dirname(tvb_data.__file__), 'connectivity', 'connectivity_66.zip') connectivity = TestFactory.import_zip_connectivity(self.test_user, self.test_project, zip_path, "John") op = TestFactory.create_operation(test_user=self.test_user, test_project=self.test_project) burst_config = BurstConfiguration(self.test_project.id) burst_config.fk_simulation = op.id burst_config.simulator_gid = self.session_stored_simulator.gid.hex burst_config.name = 'Test_Burst' burst_config = dao.store_entity(burst_config) self.sess_mock['burst_id'] = str(burst_config.id) self.sess_mock['connectivity'] = connectivity.gid self.sess_mock['conduction_speed'] = "3.0" self.sess_mock['coupling'] = "Sigmoidal" with patch('cherrypy.session', self.sess_mock, create=True): common.add2session(common.KEY_SIMULATOR_CONFIG, self.session_stored_simulator) self.simulator_controller.set_connectivity(**self.sess_mock._data) self.simulator_controller.set_stimulus(**self.sess_mock._data) storage_path = FilesHelper().get_project_folder(self.test_project, str(op.id)) SimulatorSerializer().serialize_simulator(self.session_stored_simulator, None, storage_path) with patch('cherrypy.session', self.sess_mock, create=True): self.simulator_controller.load_burst_read_only(str(burst_config.id)) is_simulator_load = common.get_from_session(KEY_IS_SIMULATOR_LOAD) is_simulator_copy = common.get_from_session(KEY_IS_SIMULATOR_COPY) last_loaded_form_url = common.get_from_session(KEY_LAST_LOADED_FORM_URL) assert is_simulator_load, "Simulator Load Flag should be True!" assert not is_simulator_copy, "Simulator Copy Flag should be False!" assert last_loaded_form_url == '/burst/setup_pse', "Incorrect last form URL!"
def async_launch_and_prepare_pse(self, burst_config, user, project, simulator_algo, range_param1, range_param2, session_stored_simulator): try: simulator_id = simulator_algo.id algo_category = simulator_algo.algorithm_category operation_group = burst_config.operation_group metric_operation_group = burst_config.metric_operation_group operations = [] range_param2_values = [] if range_param2: range_param2_values = range_param2.get_range_values() first_simulator = None for param1_value in range_param1.get_range_values(): for param2_value in range_param2_values: # Copy, but generate a new GUID for every Simulator in PSE simulator = copy.deepcopy(session_stored_simulator) simulator.gid = uuid.uuid4() self._set_simulator_range_parameter(simulator, range_param1.name, param1_value) self._set_simulator_range_parameter(simulator, range_param2.name, param2_value) ranges = json.dumps({range_param1.name: param1_value[0], range_param2.name: param2_value[0]}) operation = self._prepare_operation(project.id, user.id, simulator_id, simulator.gid, algo_category, operation_group, {DataTypeMetaData.KEY_BURST: burst_config.id}, ranges) storage_path = self.files_helper.get_project_folder(project, str(operation.id)) SimulatorSerializer().serialize_simulator(simulator, None, storage_path) operations.append(operation) if first_simulator is None: first_simulator = simulator first_operation = operations[0] BurstService.update_simulation_fields(burst_config.id, first_operation.id, first_simulator.gid) datatype_group = DataTypeGroup(operation_group, operation_id=first_operation.id, fk_parent_burst=burst_config.id, state=json.loads(first_operation.meta_data)[DataTypeMetaData.KEY_STATE]) dao.store_entity(datatype_group) metrics_datatype_group = DataTypeGroup(metric_operation_group, fk_parent_burst=burst_config.id) dao.store_entity(metrics_datatype_group) wf_errs = 0 for operation in operations: try: OperationService().launch_operation(operation.id, True) except Exception as excep: self.logger.error(excep) wf_errs += 1 BurstService().mark_burst_finished(burst_config, error_message=str(excep)) self.logger.debug("Finished launching workflows. " + str(len(operations) - wf_errs) + " were launched successfully, " + str(wf_errs) + " had error on pre-launch steps") except Exception as excep: self.logger.error(excep) BurstService().mark_burst_finished(burst_config, error_message=str(excep))
def test_load_burst_only(self): zip_path = path.join(path.dirname(tvb_data.__file__), 'connectivity', 'connectivity_66.zip') TestFactory.import_zip_connectivity(self.test_user, self.test_project, zip_path, "John") connectivity = TestFactory.get_entity(self.test_project, ConnectivityIndex) simulator_index = SimulatorIndex() simulator_index.fill_from_has_traits(self.session_stored_simulator) burst_config = BurstConfiguration(self.test_project.id, simulator_index.id) burst_config = dao.store_entity(burst_config) simulator_index.fk_from_operation = burst_config.id simulator_index = dao.store_entity(simulator_index) simulator_index.fk_parent_burst = burst_config.id simulator_index = dao.store_entity(simulator_index) burst = dao.get_bursts_for_project(self.test_project.id) self.sess_mock['burst_id'] = str(burst[0].id) self.sess_mock['_connectivity'] = connectivity.gid self.sess_mock['_conduction_speed'] = "3.0" self.sess_mock['_coupling'] = "Sigmoidal" with patch('cherrypy.session', self.sess_mock, create=True): common.add2session(common.KEY_SIMULATOR_CONFIG, self.session_stored_simulator) self.simulator_controller.set_connectivity(**self.sess_mock._data) self.simulator_controller.set_stimulus(**self.sess_mock._data) storage_path = FilesHelper().get_project_folder( self.test_project, str(simulator_index.fk_from_operation)) simulator_service = SimulatorService() SimulatorSerializer().serialize_simulator( self.session_stored_simulator, simulator_index.gid, None, storage_path) with patch('cherrypy.session', self.sess_mock, create=True): self.simulator_controller.load_burst_read_only(str(burst[0].id)) is_simulator_load = common.get_from_session(KEY_IS_SIMULATOR_LOAD) is_simulator_copy = common.get_from_session(KEY_IS_SIMULATOR_COPY) last_loaded_form_url = common.get_from_session( KEY_LAST_LOADED_FORM_URL) database_simulator = dao.get_generic_entity(SimulatorIndex, burst_config.id, 'fk_parent_burst')[0] assert simulator_index.gid == database_simulator.gid, "Simulator was not added correctly!" assert is_simulator_load, "Simulator Load Flag should be True!" assert not is_simulator_copy, "Simulator Copy Flag should be False!" assert last_loaded_form_url == '/burst/setup_pse', "Incorrect last form URL!"
def test_server_fire_simulation(self, mocker, connectivity_factory): self._mock_user(mocker) input_folder = self.files_helper.get_project_folder(self.test_project) sim_dir = os.path.join(input_folder, 'test_sim') if not os.path.isdir(sim_dir): os.makedirs(sim_dir) simulator = Simulator() simulator.connectivity = connectivity_factory() sim_serializer = SimulatorSerializer() sim_serializer.serialize_simulator(simulator, None, sim_dir) zip_filename = os.path.join(input_folder, RequestFileKey.SIMULATION_FILE_NAME.value) FilesHelper().zip_folder(zip_filename, sim_dir) # Mock flask.request.files to return a dictionary request_mock = mocker.patch.object(flask, 'request') fp = open(zip_filename, 'rb') request_mock.files = { RequestFileKey.SIMULATION_FILE_KEY.value: FileStorage(fp, os.path.basename(zip_filename)) } def launch_sim(self, user_id, project, algorithm, zip_folder_path, simulator_file): return Operation('', '', '', {}) # Mock simulation launch and current user mocker.patch.object(SimulatorService, 'prepare_simulation_on_server', launch_sim) operation_gid, status = self.simulation_resource.post( project_gid=self.test_project.gid) fp.close() assert type(operation_gid) is str assert status == 201
def load_view_model(self, adapter_instance, operation): storage_path = self.file_helper.get_project_folder( operation.project, str(operation.id)) input_gid = json.loads(operation.parameters)['gid'] # TODO: review location, storage_path, op params deserialization if isinstance(adapter_instance, SimulatorAdapter): view_model = SimulatorSerializer().deserialize_simulator( input_gid, storage_path) else: view_model_class = adapter_instance.get_view_model_class() view_model = view_model_class() h5_path = h5.path_for(storage_path, ViewModelH5, input_gid) h5_file = ViewModelH5(h5_path, view_model) h5_file.load_into(view_model) return view_model
def load_from_zip(self, zip_file, project): import_service = ImportService() simulator_folder = import_service.import_simulator_configuration_zip( zip_file) simulator_h5_filename = DirLoader( simulator_folder, None).find_file_for_has_traits_type(Simulator) with SimulatorH5(os.path.join(simulator_folder, simulator_h5_filename)) as sim_h5: simulator_gid = sim_h5.gid.load() simulator = SimulatorSerializer.deserialize_simulator( simulator_gid, simulator_folder) burst_config = self.burst_service.load_burst_configuration_from_folder( simulator_folder, project) return simulator, burst_config
def fire_simulation(self, project_gid, session_stored_simulator, temp_folder): temporary_folder = FilesHelper.create_temp_folder() simulation_state_gid = None SimulatorSerializer().serialize_simulator(session_stored_simulator, simulation_state_gid, temporary_folder) zip_folder_path = os.path.join( temp_folder, RequestFileKey.SIMULATION_FILE_NAME.value) FilesHelper().zip_folder(zip_folder_path, temporary_folder) shutil.rmtree(temporary_folder) file_obj = open(zip_folder_path, 'rb') return self.secured_request().post( self.build_request_url( RestLink.FIRE_SIMULATION.compute_url( True, {LinkPlaceholder.PROJECT_GID.value: project_gid})), files={ RequestFileKey.SIMULATION_FILE_KEY.value: (RequestFileKey.SIMULATION_FILE_NAME.value, file_obj) })