@@ -1044,6 +1044,32 @@ def run(self):
1044
1044
"it should start any moment now." .format (ti ))
1045
1045
return redirect (origin )
1046
1046
1047
+ @expose ('/delete' )
1048
+ @login_required
1049
+ @wwwutils .action_logging
1050
+ @wwwutils .notify_owner
1051
+ def delete (self ):
1052
+ from airflow .api .common .experimental import delete_dag
1053
+ from airflow .exceptions import DagNotFound , DagFileExists
1054
+
1055
+ dag_id = request .args .get ('dag_id' )
1056
+ origin = request .args .get ('origin' ) or "/admin/"
1057
+
1058
+ try :
1059
+ delete_dag .delete_dag (dag_id )
1060
+ except DagNotFound :
1061
+ flash ("DAG with id {} not found. Cannot delete" .format (dag_id ))
1062
+ return redirect (request .referrer )
1063
+ except DagFileExists :
1064
+ flash ("Dag id {} is still in DagBag. "
1065
+ "Remove the DAG file first." .format (dag_id ))
1066
+ return redirect (request .referrer )
1067
+
1068
+ flash ("Deleting DAG with id {}. May take a couple minutes to fully"
1069
+ " disappear." .format (dag_id ))
1070
+ # Upon successful delete return to origin
1071
+ return redirect (origin )
1072
+
1047
1073
@expose ('/trigger' )
1048
1074
@login_required
1049
1075
@wwwutils .action_logging
@@ -1283,6 +1309,10 @@ def tree(self, session=None):
1283
1309
dag_id = request .args .get ('dag_id' )
1284
1310
blur = conf .getboolean ('webserver' , 'demo_mode' )
1285
1311
dag = dagbag .get_dag (dag_id )
1312
+ if dag_id not in dagbag .dags :
1313
+ flash ('DAG "{0}" seems to be missing.' .format (dag_id ), "error" )
1314
+ return redirect ('/admin/' )
1315
+
1286
1316
root = request .args .get ('root' )
1287
1317
if root :
1288
1318
dag = dag .sub_dag (
0 commit comments