def test_entrypoint_plugin_errors_dont_raise_exceptions(self, caplog): """ Test that Airflow does not raise an error if there is any Exception because of a plugin. """ from airflow.plugins_manager import import_errors, load_entrypoint_plugins mock_dist = mock.Mock() mock_entrypoint = mock.Mock() mock_entrypoint.name = 'test-entrypoint' mock_entrypoint.group = 'airflow.plugins' mock_entrypoint.module = 'test.plugins.test_plugins_manager' mock_entrypoint.load.side_effect = ImportError( 'my_fake_module not found') mock_dist.entry_points = [mock_entrypoint] with mock.patch(f'{importlib_metadata}.distributions', return_value=[mock_dist]), caplog.at_level( logging.ERROR, logger='airflow.plugins_manager'): load_entrypoint_plugins() received_logs = caplog.text # Assert Traceback is shown too assert "Traceback (most recent call last):" in received_logs assert "my_fake_module not found" in received_logs assert "Failed to import plugin test-entrypoint" in received_logs assert ("test.plugins.test_plugins_manager", "my_fake_module not found") in import_errors.items()
def test_entrypoint_plugin_errors_dont_raise_exceptions( self, mock_ep_plugins): """ Test that Airflow does not raise an Error if there is any Exception because of the Plugin. """ from airflow.plugins_manager import import_errors, load_entrypoint_plugins mock_entrypoint = mock.Mock() mock_entrypoint.name = 'test-entrypoint' mock_entrypoint.module_name = 'test.plugins.test_plugins_manager' mock_entrypoint.load.side_effect = Exception('Version Conflict') mock_ep_plugins.return_value = [mock_entrypoint] with self.assertLogs("airflow.plugins_manager", level="ERROR") as log_output: load_entrypoint_plugins() received_logs = log_output.output[0] # Assert Traceback is shown too assert "Traceback (most recent call last):" in received_logs assert "Version Conflict" in received_logs assert "Failed to import plugin test-entrypoint" in received_logs assert ("test.plugins.test_plugins_manager", "Version Conflict") in import_errors.items()
def index(self, session=None): DM = models.DagModel # restrict the dags shown if filter_by_owner and current user is not superuser do_filter = FILTER_BY_OWNER owner_mode = conf.get('webserver', 'OWNER_MODE').strip().lower() hide_paused_dags_by_default = conf.getboolean( 'webserver', 'hide_paused_dags_by_default') show_paused_arg = request.args.get('showPaused', 'None') def get_int_arg(value, default=0): try: return int(value) except ValueError: return default arg_current_page = request.args.get('page', '0') arg_search_query = request.args.get('search', None) dags_per_page = PAGE_SIZE current_page = get_int_arg(arg_current_page, default=0) if show_paused_arg.strip().lower() == 'false': hide_paused = True elif show_paused_arg.strip().lower() == 'true': hide_paused = False else: hide_paused = hide_paused_dags_by_default # read orm_dags from the db query = session.query(DM) query = query.filter(~DM.is_subdag, DM.is_active) # optionally filter out "paused" dags if hide_paused: query = query.filter(~DM.is_paused) if arg_search_query: query = query.filter( DM.dag_id.ilike('%' + arg_search_query + '%') | DM.owners.ilike('%' + arg_search_query + '%')) query = query.order_by(DM.dag_id) start = current_page * dags_per_page end = start + dags_per_page dags = query.offset(start).limit(dags_per_page).all() import_errors = session.query(errors.ImportError).all() for ie in import_errors: flash("Broken DAG: [{ie.filename}] {ie.stacktrace}".format(ie=ie), "error") from airflow.plugins_manager import import_errors as plugin_import_errors for filename, stacktrace in plugin_import_errors.items(): flash( "Broken plugin: [{filename}] {stacktrace}".format( stacktrace=stacktrace, filename=filename), "error") num_of_all_dags = query.count() num_of_pages = int(math.ceil(num_of_all_dags / float(dags_per_page))) auto_complete_data = set() for row in query.with_entities(DM.dag_id, DM.owners): auto_complete_data.add(row.dag_id) auto_complete_data.add(row.owners) return self.render( 'airflow/dags.html', dags=dags, hide_paused=hide_paused, current_page=current_page, search_query=arg_search_query if arg_search_query else '', page_size=dags_per_page, num_of_pages=num_of_pages, num_dag_from=min(start + 1, num_of_all_dags), num_dag_to=min(end, num_of_all_dags), num_of_all_dags=num_of_all_dags, paging=wwwutils.generate_pages(current_page, num_of_pages, search=arg_search_query, showPaused=not hide_paused), auto_complete_data=auto_complete_data)