azkaban-aplcache

Remove all associated schedules when deleting the project

1/2/2018 10:10:23 PM

Details

diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
index 2a2e261..457b43e 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/servlet/ProjectManagerServlet.java
@@ -586,6 +586,19 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
     this.writeJSON(resp, ret);
   }
 
+  private void removeAssociatedSchedules(final Project project) throws ServletException {
+    try {
+      for (final Schedule schedule : this.scheduleManager.getSchedules()) {
+        if (schedule.getProjectId() == project.getId()) {
+          logger.info("removing schedule " + schedule.getScheduleId());
+          this.scheduleManager.removeSchedule(schedule);
+        }
+      }
+    } catch (final ScheduleManagerException e) {
+      throw new ServletException(e);
+    }
+  }
+
   private void handleRemoveProject(final HttpServletRequest req,
       final HttpServletResponse resp, final Session session) throws ServletException,
       IOException {
@@ -607,42 +620,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
       return;
     }
 
-    // Check if scheduled
-    Schedule sflow = null;
-    try {
-      for (final Schedule flow : this.scheduleManager.getSchedules()) {
-
-        if (flow.getProjectId() == project.getId()) {
-          sflow = flow;
-          break;
-        }
-      }
-    } catch (final ScheduleManagerException e) {
-      throw new ServletException(e);
-    }
-
-    if (sflow != null) {
-      this.setErrorMessageInCookie(resp, "Cannot delete. Please unschedule "
-          + sflow.getScheduleName() + ".");
-
-      resp.sendRedirect(req.getRequestURI() + "?project=" + projectName);
-      return;
-    }
-
-    // Check if executing
-    ExecutableFlow exflow = null;
-    for (final ExecutableFlow flow : this.executorManager.getRunningFlows()) {
-      if (flow.getProjectId() == project.getId()) {
-        exflow = flow;
-        break;
-      }
-    }
-    if (exflow != null) {
-      this.setErrorMessageInCookie(resp, "Cannot delete. Executable flow "
-          + exflow.getExecutionId() + " is still running.");
-      resp.sendRedirect(req.getRequestURI() + "?project=" + projectName);
-      return;
-    }
+    removeAssociatedSchedules(project);
 
     try {
       this.projectManager.removeProject(project, user);
@@ -653,7 +631,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
     }
 
     this.setSuccessMessageInCookie(resp, "Project '" + projectName
-        + "' was successfully deleted.");
+        + "' was successfully deleted and associated schedules are removed.");
     resp.sendRedirect(req.getContextPath());
   }
 
@@ -787,7 +765,7 @@ public class ProjectManagerServlet extends LoginAbstractAzkabanServlet {
     final Flow flow = project.getFlow(flowId);
     if (flow == null) {
       ret.put("error",
-              "Flow " + flowId + " not found in project " + project.getName());
+          "Flow " + flowId + " not found in project " + project.getName());
       return;
     }
 
diff --git a/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/projectmodals.vm b/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/projectmodals.vm
index 637408a..3350ace 100644
--- a/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/projectmodals.vm
+++ b/azkaban-web-server/src/main/resources/azkaban/webapp/servlet/velocity/projectmodals.vm
@@ -77,7 +77,9 @@
         <h4 class="modal-title">Delete Project</h4>
       </div>
       <div class="modal-body">
-        <p><strong>Warning:</strong> This project will be deleted and may not be recoverable.</p>
+        <p><strong>Warning:</strong> This project will be deleted and may not be recoverable.
+          All associated schedules will be removed but executing flows will remain running fine.
+        </p>
       </div>
       <div class="modal-footer">
         <form id="delete-form">