Repository: oozie
Updated Branches:
  refs/heads/master 9491db0b8 -> 5fe2d4dfc


OOZIE-1401 amend PurgeCommand should purge the workflow jobs w/o end_time 
(andras.piros, asasvari)


Project: http://git-wip-us.apache.org/repos/asf/oozie/repo
Commit: http://git-wip-us.apache.org/repos/asf/oozie/commit/5fe2d4df
Tree: http://git-wip-us.apache.org/repos/asf/oozie/tree/5fe2d4df
Diff: http://git-wip-us.apache.org/repos/asf/oozie/diff/5fe2d4df

Branch: refs/heads/master
Commit: 5fe2d4dfce1f66f4678198b8ae1d6ef2bcf10d4e
Parents: 9491db0
Author: Attila Sasvari <asasv...@cloudera.com>
Authored: Wed Jan 17 09:24:19 2018 +0100
Committer: Attila Sasvari <asasv...@cloudera.com>
Committed: Wed Jan 17 09:24:19 2018 +0100

----------------------------------------------------------------------
 .../java/org/apache/oozie/WorkflowJobBean.java  |   4 +-
 ...bsBasicInfoFromCoordParentIdJPAExecutor.java |  35 +---
 .../jpa/WorkflowJobsBasicInfoFromParentId.java  |  73 +++++++
 ...asicInfoFromWorkflowParentIdJPAExecutor.java |  37 +---
 .../apache/oozie/command/TestPurgeXCommand.java | 208 ++++++++++++++++---
 release-log.txt                                 |   1 +
 6 files changed, 261 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/oozie/blob/5fe2d4df/core/src/main/java/org/apache/oozie/WorkflowJobBean.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/oozie/WorkflowJobBean.java 
b/core/src/main/java/org/apache/oozie/WorkflowJobBean.java
index 028164d..cd9a6df 100644
--- a/core/src/main/java/org/apache/oozie/WorkflowJobBean.java
+++ b/core/src/main/java/org/apache/oozie/WorkflowJobBean.java
@@ -119,9 +119,9 @@ import java.util.List;
 
     @NamedQuery(name = "GET_WORKFLOWS_WITH_COORD_PARENT_ID", query = "select 
w.id from WorkflowJobBean w where w.parentId like :parentId"), // when setting 
parentId parameter, make sure to append a '%' (percent symbol) at the end (e.g. 
0000004-130709155224435-oozie-rkan-C%")
 
-    @NamedQuery(name = "GET_WORKFLOWS_BASIC_INFO_BY_PARENT_ID", query = 
"select w.id, w.statusStr, w.endTimestamp from WorkflowJobBean w where 
w.parentId = :parentId"),
+    @NamedQuery(name = "GET_WORKFLOWS_BASIC_INFO_BY_PARENT_ID", query = 
"select w.id, w.statusStr, w.endTimestamp, w.lastModifiedTimestamp from 
WorkflowJobBean w where w.parentId = :parentId"),
 
-    @NamedQuery(name = "GET_WORKFLOWS_BASIC_INFO_BY_COORD_PARENT_ID", query = 
"select w.id,  w.statusStr, w.endTimestamp from WorkflowJobBean w where 
w.parentId like :parentId"),
+    @NamedQuery(name = "GET_WORKFLOWS_BASIC_INFO_BY_COORD_PARENT_ID", query = 
"select w.id,  w.statusStr, w.endTimestamp, w.lastModifiedTimestamp from 
WorkflowJobBean w where w.parentId like :parentId"),
 
     @NamedQuery(name = "GET_WORKFLOW_FOR_USER", query = "select w.user from 
WorkflowJobBean w where w.id = :id"),
 

http://git-wip-us.apache.org/repos/asf/oozie/blob/5fe2d4df/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor.java
 
b/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor.java
index 2e1ab5f..f2c2c02 100644
--- 
a/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor.java
+++ 
b/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor.java
@@ -20,28 +20,20 @@ package org.apache.oozie.executor.jpa;
 
 import org.apache.oozie.ErrorCode;
 import org.apache.oozie.WorkflowJobBean;
-import org.apache.oozie.client.WorkflowJob;
-import org.apache.oozie.util.DateUtils;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
-import java.sql.Timestamp;
-import java.util.ArrayList;
 import java.util.List;
 
-public class WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor  implements 
JPAExecutor<List<WorkflowJobBean>> {
-    private String parentId;
-    private int limit;
-    private int offset;
-
+public class WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor extends 
WorkflowJobsBasicInfoFromParentId
+        implements JPAExecutor<List<WorkflowJobBean>>
+{
     public WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor(String parentId, 
int limit) {
         this(parentId, 0, limit);
     }
 
     public WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor(String parentId, 
int offset, int limit) {
-        this.parentId = parentId;
-        this.offset = offset;
-        this.limit = limit;
+        super(parentId, offset, limit);
     }
 
     @Override
@@ -63,23 +55,4 @@ public class 
WorkflowJobsBasicInfoFromCoordParentIdJPAExecutor  implements JPAEx
             throw new JPAExecutorException(ErrorCode.E0603, e.getMessage(), e);
         }
     }
-
-    private List<WorkflowJobBean> getBeanFromArray(List resultList) {
-        List<WorkflowJobBean> wfActionBeanList = new 
ArrayList<WorkflowJobBean>();
-        for (Object element : resultList) {
-            WorkflowJobBean wfBean = new WorkflowJobBean();
-            Object[] arr = (Object[])element;
-            if(arr[0] != null) {
-                wfBean.setId((String) arr[0]);
-            }
-            if(arr[1] != null) {
-                wfBean.setStatus(WorkflowJob.Status.valueOf((String) arr[1]));
-            }
-            if(arr[2] != null) {
-                wfBean.setEndTime(DateUtils.toDate((Timestamp) arr[2]));
-            }
-            wfActionBeanList.add(wfBean);
-        }
-        return wfActionBeanList;
-    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/5fe2d4df/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromParentId.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromParentId.java
 
b/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromParentId.java
new file mode 100644
index 0000000..4b8adfb
--- /dev/null
+++ 
b/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromParentId.java
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.oozie.executor.jpa;
+
+import org.apache.oozie.WorkflowJobBean;
+import org.apache.oozie.client.WorkflowJob;
+import org.apache.oozie.util.DateUtils;
+
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class WorkflowJobsBasicInfoFromParentId {
+    protected final String parentId;
+    protected final int limit;
+    protected final int offset;
+
+    WorkflowJobsBasicInfoFromParentId(final String parentId, final int offset, 
final int limit) {
+        this.parentId = parentId;
+        this.offset = offset;
+        this.limit = limit;
+    }
+
+    List<WorkflowJobBean> getBeanFromArray(final List resultList) {
+        final List<WorkflowJobBean> wfActionBeanList = new ArrayList<>();
+
+        for (final Object element : resultList) {
+            final WorkflowJobBean wfBean = new WorkflowJobBean();
+            final Object[] arr = (Object[])element;
+
+            final String id = (String) arr[0];
+            if (id != null) {
+                wfBean.setId(id);
+            }
+
+            final String status = (String) arr[1];
+            if (status != null) {
+                wfBean.setStatus(WorkflowJob.Status.valueOf(status));
+            }
+
+            final Timestamp endTime = (Timestamp) arr[2];
+            if (endTime != null) {
+                wfBean.setEndTime(DateUtils.toDate(endTime));
+            }
+
+            final Timestamp lastModifiedTime = (Timestamp) arr[3];
+            if (lastModifiedTime != null) {
+                final Date d = DateUtils.toDate(lastModifiedTime);
+                wfBean.setLastModifiedTime(d);
+            }
+            wfActionBeanList.add(wfBean);
+        }
+
+        return wfActionBeanList;
+    }
+}

http://git-wip-us.apache.org/repos/asf/oozie/blob/5fe2d4df/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor.java
 
b/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor.java
index 8205334..f582647 100644
--- 
a/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor.java
+++ 
b/core/src/main/java/org/apache/oozie/executor/jpa/WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor.java
@@ -20,29 +20,20 @@ package org.apache.oozie.executor.jpa;
 
 import org.apache.oozie.ErrorCode;
 import org.apache.oozie.WorkflowJobBean;
-import org.apache.oozie.client.WorkflowJob;
-import org.apache.oozie.util.DateUtils;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
-import java.sql.Timestamp;
-import java.util.ArrayList;
 import java.util.List;
 
-public class WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor implements 
JPAExecutor<List<WorkflowJobBean>> {
-
-    private String parentId;
-    private int limit;
-    private int offset;
-
+public class WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor  extends 
WorkflowJobsBasicInfoFromParentId
+        implements JPAExecutor<List<WorkflowJobBean>>
+{
     public WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor(String 
parentId, int limit) {
         this(parentId, 0, limit);
     }
 
     public WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor(String 
parentId, int offset, int limit) {
-        this.parentId = parentId;
-        this.offset = offset;
-        this.limit = limit;
+        super(parentId, offset, limit);
     }
 
     @Override
@@ -64,24 +55,4 @@ public class 
WorkflowJobsBasicInfoFromWorkflowParentIdJPAExecutor implements JPA
             throw new JPAExecutorException(ErrorCode.E0603, e.getMessage(), e);
         }
     }
-
-    private List<WorkflowJobBean> getBeanFromArray(List resultList) {
-        List<WorkflowJobBean> wfActionBeanList = new 
ArrayList<WorkflowJobBean>();
-        for (Object element : resultList) {
-            WorkflowJobBean wfBean = new WorkflowJobBean();
-            Object[] arr = (Object[])element;
-            if(arr[0] != null) {
-                wfBean.setId((String) arr[0]);
-            }
-            if(arr[1] != null) {
-                wfBean.setStatus(WorkflowJob.Status.valueOf((String) arr[1]));
-            }
-            if(arr[2] != null) {
-                wfBean.setEndTime(DateUtils.toDate((Timestamp) arr[2]));
-            }
-            wfActionBeanList.add(wfBean);
-        }
-
-        return wfActionBeanList;
-    }
 }

http://git-wip-us.apache.org/repos/asf/oozie/blob/5fe2d4df/core/src/test/java/org/apache/oozie/command/TestPurgeXCommand.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/oozie/command/TestPurgeXCommand.java 
b/core/src/test/java/org/apache/oozie/command/TestPurgeXCommand.java
index af9591b..d11fcff 100644
--- a/core/src/test/java/org/apache/oozie/command/TestPurgeXCommand.java
+++ b/core/src/test/java/org/apache/oozie/command/TestPurgeXCommand.java
@@ -42,12 +42,13 @@ import 
org.apache.oozie.executor.jpa.CoordActionGetJPAExecutor;
 import org.apache.oozie.executor.jpa.CoordJobGetJPAExecutor;
 import org.apache.oozie.executor.jpa.CoordJobInsertJPAExecutor;
 import org.apache.oozie.executor.jpa.CoordJobQueryExecutor;
-import org.apache.oozie.executor.jpa.WorkflowJobQueryExecutor;
 import org.apache.oozie.executor.jpa.CoordJobQueryExecutor.CoordJobQuery;
 import org.apache.oozie.executor.jpa.JPAExecutorException;
+import org.apache.oozie.executor.jpa.QueryExecutor;
 import org.apache.oozie.executor.jpa.WorkflowActionGetJPAExecutor;
 import org.apache.oozie.executor.jpa.WorkflowJobGetJPAExecutor;
 import org.apache.oozie.executor.jpa.WorkflowJobInsertJPAExecutor;
+import org.apache.oozie.executor.jpa.WorkflowJobQueryExecutor;
 import org.apache.oozie.executor.jpa.WorkflowJobQueryExecutor.WorkflowJobQuery;
 import org.apache.oozie.service.JPAService;
 import org.apache.oozie.service.LiteWorkflowStoreService;
@@ -174,30 +175,6 @@ public class TestPurgeXCommand extends XDataTestCase {
     }
 
     /**
-     * Test : purge failed wf job with null end_time successfully
-     *
-     * @throws Exception
-     */
-    public void testFailedJobNullEndTimePurgeXCommand() throws Exception {
-        final WorkflowJobBean job = 
this.addRecordToWfJobTable(WorkflowJob.Status.FAILED, 
WorkflowInstance.Status.FAILED);
-        final Date endTime = job.getEndTime();
-        job.setLastModifiedTime(endTime);
-        job.setEndTime(null);
-
-        final JPAService jpaService = Services.get().get(JPAService.class);
-        final WorkflowJobGetJPAExecutor wfJobGetCmd = new 
WorkflowJobGetJPAExecutor(job.getId());
-
-        new PurgeXCommand(7, 1, 1, 10).call();
-
-        try {
-            jpaService.execute(wfJobGetCmd);
-            fail("Workflow Job should have been purged");
-        } catch (JPAExecutorException je) {
-            assertEquals(ErrorCode.E0604, je.getErrorCode());
-        }
-    }
-
-    /**
     * Test : purge killed wf job and action successfully
     *
     * @throws Exception
@@ -2882,6 +2859,66 @@ public class TestPurgeXCommand extends XDataTestCase {
     }
 
     /**
+     * Test : The subworkflow should get purged, and the workflow parent 
should get purged --> both will get purged
+     * Subworkflow has terminated, last modified time is known, but end time 
is null
+     *
+     * @throws Exception
+     */
+    public void 
testPurgeWFWithEndedSubWFWithNullEndTimeValidLastModifiedTime() throws 
Exception {
+        final JPAService jpaService = Services.get().get(JPAService.class);
+        assertNotNull(jpaService);
+
+        WorkflowJobBean wfJob = 
addRecordToWfJobTable(WorkflowJob.Status.SUCCEEDED, 
WorkflowInstance.Status.SUCCEEDED);
+        WorkflowActionBean wfAction1 = addRecordToWfActionTable(wfJob.getId(), 
"1", WorkflowAction.Status.OK);
+
+        WorkflowJobBean subwfJob1 = 
addRecordToWfJobTable(WorkflowJob.Status.SUCCEEDED, 
WorkflowInstance.Status.SUCCEEDED,
+                wfJob.getId());
+        subwfJob1.setEndTime(null);
+        WorkflowActionBean subwfAction1 = 
addRecordToWfActionTable(subwfJob1.getId(), "1", WorkflowAction.Status.OK);
+
+        final WorkflowJobGetJPAExecutor wfJobGetCmd = new 
WorkflowJobGetJPAExecutor(wfJob.getId());
+        final WorkflowActionGetJPAExecutor wfAction1GetCmd = new 
WorkflowActionGetJPAExecutor(wfAction1.getId());
+        final WorkflowJobGetJPAExecutor subwfJob1GetCmd = new 
WorkflowJobGetJPAExecutor(subwfJob1.getId());
+        final WorkflowActionGetJPAExecutor subwfAction1GetCmd = new 
WorkflowActionGetJPAExecutor(subwfAction1.getId());
+
+        wfJob = jpaService.execute(wfJobGetCmd);
+        wfAction1 = jpaService.execute(wfAction1GetCmd);
+        subwfJob1 = jpaService.execute(subwfJob1GetCmd);
+        subwfAction1 = jpaService.execute(subwfAction1GetCmd);
+
+        assertEquals(WorkflowJob.Status.SUCCEEDED, wfJob.getStatus());
+        assertEquals(WorkflowAction.Status.OK, wfAction1.getStatus());
+        assertEquals(WorkflowJob.Status.SUCCEEDED, subwfJob1.getStatus());
+        assertEquals(WorkflowAction.Status.OK, subwfAction1.getStatus());
+
+        final QueryExecutor<WorkflowJobBean, 
WorkflowJobQueryExecutor.WorkflowJobQuery> workflowJobQueryExecutor =
+                WorkflowJobQueryExecutor.getInstance();
+        
workflowJobQueryExecutor.executeUpdate(WorkflowJobQuery.UPDATE_WORKFLOW, 
subwfJob1);
+
+        final int wfOlderThanDays = 7;
+        final int coordOlderThanDays = 1;
+        final int bundleOlderThanDays = 1;
+        final int limit = 3;
+        new PurgeXCommand(wfOlderThanDays, coordOlderThanDays, 
bundleOlderThanDays, limit).call();
+
+        try {
+            jpaService.execute(wfJobGetCmd);
+            fail("Workflow Job should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0604, je.getErrorCode());
+        }
+
+        try {
+            jpaService.execute(subwfJob1GetCmd);
+            fail("SubWorkflow Job 1 should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0604, je.getErrorCode());
+        }
+    }
+
+    /**
      * Test : The subworkflow and workflow should get purged, but the 
coordinator parent shouldn't get purged --> none will get
      * purged
      *
@@ -3068,12 +3105,12 @@ public class TestPurgeXCommand extends XDataTestCase {
         CoordinatorActionBean coordAction = 
addRecordToCoordActionTable(coordJob.getId(), 1, 
CoordinatorAction.Status.SUCCEEDED,
                 "coord-action-get.xml", wfJob.getId(), "SUCCEEDED", 0);
 
-        WorkflowJobGetJPAExecutor wfJobGetCmd = new 
WorkflowJobGetJPAExecutor(wfJob.getId());
-        WorkflowActionGetJPAExecutor wfActionGetCmd = new 
WorkflowActionGetJPAExecutor(wfAction.getId());
-        WorkflowJobGetJPAExecutor subwfJobGetCmd = new 
WorkflowJobGetJPAExecutor(subwfJob.getId());
-        WorkflowActionGetJPAExecutor subwfActionGetCmd = new 
WorkflowActionGetJPAExecutor(subwfAction.getId());
-        CoordJobGetJPAExecutor coordJobGetCmd = new 
CoordJobGetJPAExecutor(coordJob.getId());
-        CoordActionGetJPAExecutor coordActionGetCmd = new 
CoordActionGetJPAExecutor(coordAction.getId());
+        final WorkflowJobGetJPAExecutor wfJobGetCmd = new 
WorkflowJobGetJPAExecutor(wfJob.getId());
+        final WorkflowActionGetJPAExecutor wfActionGetCmd = new 
WorkflowActionGetJPAExecutor(wfAction.getId());
+        final WorkflowJobGetJPAExecutor subwfJobGetCmd = new 
WorkflowJobGetJPAExecutor(subwfJob.getId());
+        final WorkflowActionGetJPAExecutor subwfActionGetCmd = new 
WorkflowActionGetJPAExecutor(subwfAction.getId());
+        final CoordJobGetJPAExecutor coordJobGetCmd = new 
CoordJobGetJPAExecutor(coordJob.getId());
+        final CoordActionGetJPAExecutor coordActionGetCmd = new 
CoordActionGetJPAExecutor(coordAction.getId());
 
         wfJob = jpaService.execute(wfJobGetCmd);
         wfAction = jpaService.execute(wfActionGetCmd);
@@ -3139,6 +3176,115 @@ public class TestPurgeXCommand extends XDataTestCase {
         }
     }
 
+
+    /**
+     * Test : The subworkflow and workflow should get purged, and the 
coordinator parent should get purged --> all will get
+     * purged
+     *
+     * Coordinator parent finished Workflow and its subworkflow have 
terminated, last modified time is known, but end time is null
+     * for workflow and subworkflow
+     *
+     * @throws Exception
+     */
+    public void 
testPurgeCoordWithWFChildWithSubWFNullEndTimeValidLastModifiedTime() throws 
Exception {
+        final JPAService jpaService = Services.get().get(JPAService.class);
+        assertNotNull(jpaService);
+
+        CoordinatorJobBean coordJob = 
addRecordToCoordJobTable(CoordinatorJob.Status.SUCCEEDED, false, false);
+
+        final QueryExecutor<WorkflowJobBean, 
WorkflowJobQueryExecutor.WorkflowJobQuery> workflowJobQueryExecutor =
+                WorkflowJobQueryExecutor.getInstance();
+        WorkflowJobBean wfJob = 
addRecordToWfJobTable(WorkflowJob.Status.SUCCEEDED, 
WorkflowInstance.Status.SUCCEEDED);
+        wfJob.setLastModifiedTime(wfJob.getEndTime());
+        wfJob.setEndTime(null);
+        
workflowJobQueryExecutor.executeUpdate(WorkflowJobQuery.UPDATE_WORKFLOW, wfJob);
+
+        WorkflowActionBean wfAction = addRecordToWfActionTable(wfJob.getId(), 
"1", WorkflowAction.Status.OK);
+        WorkflowJobBean subwfJob = 
addRecordToWfJobTable(WorkflowJob.Status.SUCCEEDED, 
WorkflowInstance.Status.SUCCEEDED,
+                wfJob.getId());
+        subwfJob.setLastModifiedTime(subwfJob.getEndTime());
+        subwfJob.setEndTime(null);
+        
workflowJobQueryExecutor.executeUpdate(WorkflowJobQuery.UPDATE_WORKFLOW, 
subwfJob);
+
+        WorkflowActionBean subwfAction = 
addRecordToWfActionTable(subwfJob.getId(), "1", WorkflowAction.Status.OK);
+        CoordinatorActionBean coordAction = 
addRecordToCoordActionTable(coordJob.getId(), 1, 
CoordinatorAction.Status.SUCCEEDED,
+                "coord-action-get.xml", wfJob.getId(), "SUCCEEDED", 0);
+
+        final WorkflowJobGetJPAExecutor wfJobGetCmd = new 
WorkflowJobGetJPAExecutor(wfJob.getId());
+        final WorkflowActionGetJPAExecutor wfActionGetCmd = new 
WorkflowActionGetJPAExecutor(wfAction.getId());
+        final WorkflowJobGetJPAExecutor subwfJobGetCmd = new 
WorkflowJobGetJPAExecutor(subwfJob.getId());
+        final WorkflowActionGetJPAExecutor subwfActionGetCmd = new 
WorkflowActionGetJPAExecutor(subwfAction.getId());
+        final CoordJobGetJPAExecutor coordJobGetCmd = new 
CoordJobGetJPAExecutor(coordJob.getId());
+        final CoordActionGetJPAExecutor coordActionGetCmd = new 
CoordActionGetJPAExecutor(coordAction.getId());
+
+        wfJob = jpaService.execute(wfJobGetCmd);
+        wfAction = jpaService.execute(wfActionGetCmd);
+        subwfJob = jpaService.execute(subwfJobGetCmd);
+        subwfAction = jpaService.execute(subwfActionGetCmd);
+        coordJob = jpaService.execute(coordJobGetCmd);
+        coordAction = jpaService.execute(coordActionGetCmd);
+        assertEquals(WorkflowJob.Status.SUCCEEDED, wfJob.getStatus());
+        assertEquals(WorkflowAction.Status.OK, wfAction.getStatus());
+        assertEquals(WorkflowJob.Status.SUCCEEDED, subwfJob.getStatus());
+        assertEquals(WorkflowAction.Status.OK, subwfAction.getStatus());
+        assertEquals(CoordinatorJob.Status.SUCCEEDED, coordJob.getStatus());
+        assertEquals(CoordinatorAction.Status.SUCCEEDED, 
coordAction.getStatus());
+
+        final int wfOlderThanDays = 7;
+        final int coordOlderThanDays = 7;
+        final int bundleOlderThanDays = 1;
+        final int limit = 10;
+        new PurgeXCommand(wfOlderThanDays, coordOlderThanDays, 
bundleOlderThanDays, limit).call();
+
+        try {
+            jpaService.execute(coordJobGetCmd);
+            fail("Coordinator Job should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0604, je.getErrorCode());
+        }
+
+        try {
+            jpaService.execute(coordActionGetCmd);
+            fail("Coordinator Action should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0605, je.getErrorCode());
+        }
+
+        try {
+            jpaService.execute(wfJobGetCmd);
+            fail("Workflow Job should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0604, je.getErrorCode());
+        }
+
+        try {
+            jpaService.execute(wfActionGetCmd);
+            fail("Workflow Action should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0605, je.getErrorCode());
+        }
+
+        try {
+            jpaService.execute(subwfJobGetCmd);
+            fail("SubWorkflow Job should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0604, je.getErrorCode());
+        }
+
+        try {
+            jpaService.execute(subwfActionGetCmd);
+            fail("SubWorkflow Action should have been purged");
+        }
+        catch (JPAExecutorException je) {
+            assertEquals(ErrorCode.E0605, je.getErrorCode());
+        }
+    }
+
     /**
      * Test : The subworkflow, workflow, and coordinator should get purged, 
but the bundle parent shouldn't get purged --> none will
      * get purged

http://git-wip-us.apache.org/repos/asf/oozie/blob/5fe2d4df/release-log.txt
----------------------------------------------------------------------
diff --git a/release-log.txt b/release-log.txt
index e563aaa..5feb3ce 100644
--- a/release-log.txt
+++ b/release-log.txt
@@ -1,5 +1,6 @@
 -- Oozie 5.0.0 release (trunk - unreleased)
 
+OOZIE-1401 amend PurgeCommand should purge the workflow jobs w/o end_time 
(andras.piros, asasvari)
 OOZIE-3085 Improve logging in ActionExecutors: add log entry for start(), 
end() and kill() (kmarton via andras.piros)
 OOZIE-3083 Make improved version Info backward compatible (gezapeti via 
asasvari)
 OOZIE-2150 Shell launcher should print shell script (jtolar via andras.piros)

Reply via email to