14
14
# KIND, either express or implied. See the License for the
15
15
# specific language governing permissions and limitations
16
16
# under the License.
17
+
17
18
"""Dag sub-commands."""
18
19
19
20
from __future__ import annotations
28
29
from typing import TYPE_CHECKING
29
30
30
31
import re2
31
- from sqlalchemy import select
32
+ from sqlalchemy import func , select
32
33
33
34
from airflow .api .client import get_current_api_client
34
35
from airflow .api_connexion .schemas .dag_schema import dag_schema
38
39
from airflow .exceptions import AirflowException
39
40
from airflow .jobs .job import Job
40
41
from airflow .models import DagBag , DagModel , DagRun , TaskInstance
42
+ from airflow .models .errors import ParseImportError
41
43
from airflow .models .serialized_dag import SerializedDagModel
42
44
from airflow .sdk .definitions ._internal .dag_parsing_context import _airflow_parsing_context_manager
43
45
from airflow .utils import cli as cli_utils , timezone
@@ -224,6 +226,8 @@ def _get_dagbag_dag_details(dag: DAG) -> dict:
224
226
return {
225
227
"dag_id" : dag .dag_id ,
226
228
"dag_display_name" : dag .dag_display_name ,
229
+ "bundle_name" : dag .get_bundle_name (),
230
+ "bundle_version" : dag .get_bundle_version (),
227
231
"is_paused" : dag .get_is_paused (),
228
232
"is_active" : dag .get_is_active (),
229
233
"last_parsed_time" : None ,
@@ -322,11 +326,12 @@ def print_execution_interval(interval: DataInterval | None):
322
326
@suppress_logs_and_warning
323
327
@providers_configuration_loaded
324
328
@provide_session
325
- def dag_list_dags (args , session = NEW_SESSION ) -> None :
329
+ def dag_list_dags (args , session : Session = NEW_SESSION ) -> None :
326
330
"""Display dags with or without stats at the command line."""
327
331
cols = args .columns if args .columns else []
328
332
invalid_cols = [c for c in cols if c not in dag_schema .fields ]
329
333
valid_cols = [c for c in cols if c in dag_schema .fields ]
334
+
330
335
if invalid_cols :
331
336
from rich import print as rich_print
332
337
@@ -335,8 +340,18 @@ def dag_list_dags(args, session=NEW_SESSION) -> None:
335
340
f"List of valid columns: { list (dag_schema .fields .keys ())} " ,
336
341
file = sys .stderr ,
337
342
)
338
- dagbag = DagBag (process_subdir (args .subdir ))
339
- if dagbag .import_errors :
343
+
344
+ dagbag = DagBag (read_dags_from_db = True )
345
+ dagbag .collect_dags_from_db ()
346
+
347
+ # Get import errors from the DB
348
+ query = select (func .count ()).select_from (ParseImportError )
349
+ if args .bundle_name :
350
+ query = query .where (ParseImportError .bundle_name .in_ (args .bundle_name ))
351
+
352
+ dagbag_import_errors = session .scalar (query )
353
+
354
+ if dagbag_import_errors > 0 :
340
355
from rich import print as rich_print
341
356
342
357
rich_print (
@@ -353,8 +368,19 @@ def get_dag_detail(dag: DAG) -> dict:
353
368
dag_detail = _get_dagbag_dag_details (dag )
354
369
return {col : dag_detail [col ] for col in valid_cols }
355
370
371
+ def filter_dags_by_bundle (dags : list [DAG ], bundle_names : list [str ] | None ) -> list [DAG ]:
372
+ """Filter DAGs based on the specified bundle name, if provided."""
373
+ if not bundle_names :
374
+ return dags
375
+
376
+ validate_dag_bundle_arg (bundle_names )
377
+ return [dag for dag in dags if dag .get_bundle_name () in bundle_names ]
378
+
356
379
AirflowConsole ().print_as (
357
- data = sorted (dagbag .dags .values (), key = operator .attrgetter ("dag_id" )),
380
+ data = sorted (
381
+ filter_dags_by_bundle (list (dagbag .dags .values ()), args .bundle_name ),
382
+ key = operator .attrgetter ("dag_id" ),
383
+ ),
358
384
output = args .output ,
359
385
mapper = get_dag_detail ,
360
386
)
@@ -364,7 +390,7 @@ def get_dag_detail(dag: DAG) -> dict:
364
390
@suppress_logs_and_warning
365
391
@providers_configuration_loaded
366
392
@provide_session
367
- def dag_details (args , session = NEW_SESSION ):
393
+ def dag_details (args , session : Session = NEW_SESSION ):
368
394
"""Get DAG details given a DAG id."""
369
395
dag = DagModel .get_dagmodel (args .dag_id , session = session )
370
396
if not dag :
0 commit comments