/** * Provides functionality to test for set*Data calls not being made by the Action Handler. * * @param avoidParam set*Data function call to avoid. * @param expActionErrorCode the expected action error code. * @throws Exception */ private void _testDataNotSet(String avoidParam, String expActionErrorCode) throws Exception { String workflowPath = getTestCaseFileUri("workflow.xml"); Reader reader = IOUtils.getResourceAsReader("wf-ext-schema-valid.xml", -1); Writer writer = new FileWriter(new File(getTestCaseDir(), "workflow.xml")); IOUtils.copyCharStream(reader, writer); final DagEngine engine = new DagEngine("u"); Configuration conf = new XConfiguration(); conf.set(OozieClient.APP_PATH, workflowPath); conf.set(OozieClient.USER_NAME, getTestUser()); conf.set(OozieClient.LOG_TOKEN, "t"); conf.set("external-status", "ok"); conf.set("signal-value", "based_on_action_status"); conf.set(avoidParam, "true"); final String jobId = engine.submitJob(conf, true); final WorkflowStore store = Services.get().get(WorkflowStoreService.class).create(); store.beginTrx(); Thread.sleep(2000); waitFor( 5000, new Predicate() { public boolean evaluate() throws Exception { WorkflowJobBean bean = store.getWorkflow(jobId, false); return (bean.getWorkflowInstance().getStatus() == WorkflowInstance.Status.FAILED); } }); store.commitTrx(); store.closeTrx(); final WorkflowStore store2 = Services.get().get(WorkflowStoreService.class).create(); store2.beginTrx(); assertEquals( WorkflowInstance.Status.FAILED, store2.getWorkflow(jobId, false).getWorkflowInstance().getStatus()); assertEquals(WorkflowJob.Status.FAILED, engine.getJob(jobId).getStatus()); List<WorkflowActionBean> actions = store2.getActionsForWorkflow(jobId, false); WorkflowActionBean action = null; for (WorkflowActionBean bean : actions) { if (bean.getType().equals("test")) { action = bean; break; } } assertNotNull(action); assertEquals(expActionErrorCode, action.getErrorCode()); store2.commitTrx(); store2.closeTrx(); }
/** * Provides functionality to test kill node message * * @throws Exception */ public void testKillNodeErrorMessage() throws Exception { String workflowPath = getTestCaseFileUri("workflow.xml"); Reader reader = IOUtils.getResourceAsReader("wf-test-kill-node-message.xml", -1); Writer writer = new FileWriter(new File(getTestCaseDir(), "workflow.xml")); IOUtils.copyCharStream(reader, writer); final DagEngine engine = new DagEngine("u"); Configuration conf = new XConfiguration(); conf.set(OozieClient.APP_PATH, workflowPath); conf.set(OozieClient.USER_NAME, getTestUser()); conf.set(OozieClient.LOG_TOKEN, "t"); conf.set("error", "end.error"); conf.set("external-status", "FAILED/KILLED"); conf.set("signal-value", "fail"); final String jobId = engine.submitJob(conf, true); final JPAService jpaService = Services.get().get(JPAService.class); final WorkflowJobGetJPAExecutor wfJobGetCmd = new WorkflowJobGetJPAExecutor(jobId); waitFor( 50000, new Predicate() { public boolean evaluate() throws Exception { WorkflowJobBean job = jpaService.execute(wfJobGetCmd); return (job.getWorkflowInstance().getStatus() == WorkflowInstance.Status.KILLED); } }); WorkflowJobBean job = jpaService.execute(wfJobGetCmd); assertEquals(WorkflowJob.Status.KILLED, job.getStatus()); WorkflowActionsGetForJobJPAExecutor wfActionsGetCmd = new WorkflowActionsGetForJobJPAExecutor(jobId); List<WorkflowActionBean> actions = jpaService.execute(wfActionsGetCmd); int n = actions.size(); WorkflowActionBean action = null; for (WorkflowActionBean bean : actions) { if (bean.getType().equals("test")) { action = bean; break; } } assertNotNull(action); assertEquals("TEST_ERROR", action.getErrorCode()); assertEquals("end", action.getErrorMessage()); assertEquals(WorkflowAction.Status.ERROR, action.getStatus()); }
public void testGetUpdateQuery() throws Exception { EntityManager em = jpaService.getEntityManager(); WorkflowJobBean job = this.addRecordToWfJobTable(WorkflowJob.Status.RUNNING, WorkflowInstance.Status.RUNNING); WorkflowActionBean bean = addRecordToWfActionTable(job.getId(), "1", WorkflowAction.Status.PREP); // UPDATE_ACTION Query query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION, bean, em); assertEquals(query.getParameterValue("conf"), bean.getConfBlob()); assertEquals(query.getParameterValue("consoleUrl"), bean.getConsoleUrl()); assertEquals(query.getParameterValue("data"), bean.getDataBlob()); assertEquals(query.getParameterValue("stats"), bean.getStatsBlob()); assertEquals(query.getParameterValue("externalChildIDs"), bean.getExternalChildIDsBlob()); assertEquals(query.getParameterValue("errorCode"), bean.getErrorCode()); assertEquals(query.getParameterValue("errorMessage"), bean.getErrorMessage()); assertEquals(query.getParameterValue("externalId"), bean.getExternalId()); assertEquals(query.getParameterValue("externalStatus"), bean.getExternalStatus()); assertEquals(query.getParameterValue("name"), bean.getName()); assertEquals(query.getParameterValue("cred"), bean.getCred()); assertEquals(query.getParameterValue("retries"), bean.getRetries()); assertEquals(query.getParameterValue("trackerUri"), bean.getTrackerUri()); assertEquals(query.getParameterValue("transition"), bean.getTransition()); assertEquals(query.getParameterValue("type"), bean.getType()); assertEquals(query.getParameterValue("endTime"), bean.getEndTimestamp()); assertEquals(query.getParameterValue("executionPath"), bean.getExecutionPath()); assertEquals(query.getParameterValue("lastCheckTime"), bean.getLastCheckTimestamp()); assertEquals(query.getParameterValue("logToken"), bean.getLogToken()); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAge()); assertEquals(query.getParameterValue("signalValue"), bean.getSignalValue()); assertEquals(query.getParameterValue("slaXml"), bean.getSlaXmlBlob()); assertEquals(query.getParameterValue("startTime"), bean.getStartTimestamp()); assertEquals(query.getParameterValue("status"), bean.getStatus().toString()); assertEquals(query.getParameterValue("wfId"), bean.getWfId()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_FOR_LAST_CHECKED_TIME query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION, bean, em); assertEquals(query.getParameterValue("lastCheckTime"), bean.getLastCheckTimestamp()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_PENDING query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION_PENDING, bean, em); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAgeTimestamp()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_STATUS_PENDING query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION_STATUS_PENDING, bean, em); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAgeTimestamp()); assertEquals(query.getParameterValue("status"), bean.getStatus().toString()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_PENDING_TRANS query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION_PENDING_TRANS, bean, em); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAgeTimestamp()); assertEquals(query.getParameterValue("transition"), bean.getTransition()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_PENDING_TRANS_ERROR query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION_PENDING_TRANS_ERROR, bean, em); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAgeTimestamp()); assertEquals(query.getParameterValue("transition"), bean.getTransition()); assertEquals(query.getParameterValue("errorCode"), bean.getErrorCode()); assertEquals(query.getParameterValue("errorMessage"), bean.getErrorMessage()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_START query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION_START, bean, em); assertEquals(query.getParameterValue("startTime"), bean.getStartTimestamp()); assertEquals(query.getParameterValue("externalChildIDs"), bean.getExternalChildIDsBlob()); assertEquals(query.getParameterValue("conf"), bean.getConfBlob()); assertEquals(query.getParameterValue("errorCode"), bean.getErrorCode()); assertEquals(query.getParameterValue("errorMessage"), bean.getErrorMessage()); assertEquals(query.getParameterValue("externalId"), bean.getExternalId()); assertEquals(query.getParameterValue("trackerUri"), bean.getTrackerUri()); assertEquals(query.getParameterValue("consoleUrl"), bean.getConsoleUrl()); assertEquals(query.getParameterValue("lastCheckTime"), bean.getLastCheckTimestamp()); assertEquals(query.getParameterValue("status"), bean.getStatus().toString()); assertEquals(query.getParameterValue("externalStatus"), bean.getExternalStatus()); assertEquals(query.getParameterValue("data"), bean.getDataBlob()); assertEquals(query.getParameterValue("retries"), bean.getRetries()); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAgeTimestamp()); assertEquals(query.getParameterValue("userRetryCount"), bean.getUserRetryCount()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_CHECK query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION_CHECK, bean, em); assertEquals(query.getParameterValue("externalChildIDs"), bean.getExternalChildIDsBlob()); assertEquals(query.getParameterValue("externalStatus"), bean.getExternalStatus()); assertEquals(query.getParameterValue("status"), bean.getStatus().toString()); assertEquals(query.getParameterValue("data"), bean.getDataBlob()); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("errorCode"), bean.getErrorCode()); assertEquals(query.getParameterValue("errorMessage"), bean.getErrorMessage()); assertEquals(query.getParameterValue("lastCheckTime"), bean.getLastCheckTimestamp()); assertEquals(query.getParameterValue("retries"), bean.getRetries()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAgeTimestamp()); assertEquals(query.getParameterValue("startTime"), bean.getStartTimestamp()); assertEquals(query.getParameterValue("stats"), bean.getStatsBlob()); assertEquals(query.getParameterValue("userRetryCount"), bean.getUserRetryCount()); assertEquals(query.getParameterValue("id"), bean.getId()); // UPDATE_ACTION_END query = WorkflowActionQueryExecutor.getInstance() .getUpdateQuery(WorkflowActionQuery.UPDATE_ACTION_END, bean, em); assertEquals(query.getParameterValue("errorCode"), bean.getErrorCode()); assertEquals(query.getParameterValue("errorMessage"), bean.getErrorMessage()); assertEquals(query.getParameterValue("retries"), bean.getRetries()); assertEquals(query.getParameterValue("endTime"), bean.getEndTimestamp()); assertEquals(query.getParameterValue("status"), bean.getStatus().toString()); assertEquals(query.getParameterValue("retries"), bean.getRetries()); assertEquals(query.getParameterValue("pending"), bean.getPending()); assertEquals(query.getParameterValue("pendingAge"), bean.getPendingAgeTimestamp()); assertEquals(query.getParameterValue("signalValue"), bean.getSignalValue()); assertEquals(query.getParameterValue("userRetryCount"), bean.getUserRetryCount()); assertEquals(query.getParameterValue("externalStatus"), bean.getExternalStatus()); assertEquals(query.getParameterValue("stats"), bean.getStatsBlob()); assertEquals(query.getParameterValue("id"), bean.getId()); em.close(); }
public void testGet() throws Exception { WorkflowActionBean bean = addRecordToWfActionTable("workflowId", "testAction", WorkflowAction.Status.PREP, "", true); WorkflowActionBean retBean; // GET_ACTION_ID_TYPE_LASTCHECK retBean = WorkflowActionQueryExecutor.getInstance() .get(WorkflowActionQuery.GET_ACTION_ID_TYPE_LASTCHECK, bean.getId()); assertEquals(bean.getId(), retBean.getId()); assertEquals(bean.getType(), retBean.getType()); assertEquals(bean.getLastCheckTime(), retBean.getLastCheckTime()); // GET_ACTION_FAIL retBean = WorkflowActionQueryExecutor.getInstance() .get(WorkflowActionQuery.GET_ACTION_FAIL, bean.getId()); assertEquals(bean.getId(), retBean.getId()); assertEquals(bean.getJobId(), retBean.getJobId()); assertEquals(bean.getName(), retBean.getName()); assertEquals(bean.getStatusStr(), retBean.getStatusStr()); assertEquals(bean.getPending(), retBean.getPending()); assertEquals(bean.getType(), retBean.getType()); assertEquals(bean.getLogToken(), retBean.getLogToken()); assertEquals(bean.getTransition(), retBean.getTransition()); assertEquals(bean.getErrorCode(), retBean.getErrorCode()); assertEquals(bean.getErrorMessage(), retBean.getErrorMessage()); assertNull(retBean.getConf()); assertNull(retBean.getSlaXml()); assertNull(retBean.getData()); assertNull(retBean.getStats()); assertNull(retBean.getExternalChildIDs()); // GET_ACTION_SIGNAL retBean = WorkflowActionQueryExecutor.getInstance() .get(WorkflowActionQuery.GET_ACTION_SIGNAL, bean.getId()); assertEquals(bean.getId(), retBean.getId()); assertEquals(bean.getJobId(), retBean.getJobId()); assertEquals(bean.getName(), retBean.getName()); assertEquals(bean.getStatusStr(), retBean.getStatusStr()); assertEquals(bean.getPending(), retBean.getPending()); assertEquals(bean.getPendingAge().getTime(), retBean.getPendingAge().getTime()); assertEquals(bean.getType(), retBean.getType()); assertEquals(bean.getLogToken(), retBean.getLogToken()); assertEquals(bean.getTransition(), retBean.getTransition()); assertEquals(bean.getErrorCode(), retBean.getErrorCode()); assertEquals(bean.getErrorMessage(), retBean.getErrorMessage()); assertEquals(bean.getExecutionPath(), retBean.getExecutionPath()); assertEquals(bean.getSignalValue(), retBean.getSignalValue()); assertEquals(bean.getSlaXml(), retBean.getSlaXml()); assertNull(retBean.getConf()); assertNull(retBean.getData()); assertNull(retBean.getStats()); assertNull(retBean.getExternalChildIDs()); // GET_ACTION_CHECK retBean = WorkflowActionQueryExecutor.getInstance() .get(WorkflowActionQuery.GET_ACTION_CHECK, bean.getId()); assertEquals(bean.getId(), retBean.getId()); assertEquals(bean.getJobId(), retBean.getJobId()); assertEquals(bean.getName(), retBean.getName()); assertEquals(bean.getStatusStr(), retBean.getStatusStr()); assertEquals(bean.getPending(), retBean.getPending()); assertEquals(bean.getPendingAge().getTime(), retBean.getPendingAge().getTime()); assertEquals(bean.getType(), retBean.getType()); assertEquals(bean.getLogToken(), retBean.getLogToken()); assertEquals(bean.getTransition(), retBean.getTransition()); assertEquals(bean.getRetries(), retBean.getRetries()); assertEquals(bean.getUserRetryCount(), retBean.getUserRetryCount()); assertEquals(bean.getUserRetryMax(), retBean.getUserRetryMax()); assertEquals(bean.getUserRetryInterval(), retBean.getUserRetryInterval()); assertEquals(bean.getTrackerUri(), retBean.getTrackerUri()); assertEquals(bean.getStartTime().getTime(), retBean.getStartTime().getTime()); assertEquals(bean.getEndTime().getTime(), retBean.getEndTime().getTime()); assertEquals(bean.getLastCheckTime().getTime(), retBean.getLastCheckTime().getTime()); assertEquals(bean.getErrorCode(), retBean.getErrorCode()); assertEquals(bean.getErrorMessage(), retBean.getErrorMessage()); assertEquals(bean.getExternalId(), retBean.getExternalId()); assertEquals(bean.getExternalStatus(), retBean.getExternalStatus()); assertEquals(bean.getExternalChildIDs(), retBean.getExternalChildIDs()); assertEquals(bean.getConf(), retBean.getConf()); assertNull(retBean.getData()); assertNull(retBean.getStats()); assertNull(retBean.getSlaXml()); // GET_ACTION_END retBean = WorkflowActionQueryExecutor.getInstance() .get(WorkflowActionQuery.GET_ACTION_END, bean.getId()); assertEquals(bean.getId(), retBean.getId()); assertEquals(bean.getJobId(), retBean.getJobId()); assertEquals(bean.getName(), retBean.getName()); assertEquals(bean.getStatusStr(), retBean.getStatusStr()); assertEquals(bean.getPending(), retBean.getPending()); assertEquals(bean.getPendingAge().getTime(), retBean.getPendingAge().getTime()); assertEquals(bean.getType(), retBean.getType()); assertEquals(bean.getLogToken(), retBean.getLogToken()); assertEquals(bean.getTransition(), retBean.getTransition()); assertEquals(bean.getRetries(), retBean.getRetries()); assertEquals(bean.getTrackerUri(), retBean.getTrackerUri()); assertEquals(bean.getUserRetryCount(), retBean.getUserRetryCount()); assertEquals(bean.getUserRetryMax(), retBean.getUserRetryMax()); assertEquals(bean.getUserRetryInterval(), retBean.getUserRetryInterval()); assertEquals(bean.getExternalId(), retBean.getExternalId()); assertEquals(bean.getExternalStatus(), retBean.getExternalStatus()); assertEquals(bean.getExternalChildIDs(), retBean.getExternalChildIDs()); assertEquals(bean.getStartTime().getTime(), retBean.getStartTime().getTime()); assertEquals(bean.getEndTime().getTime(), retBean.getEndTime().getTime()); assertEquals(bean.getErrorCode(), retBean.getErrorCode()); assertEquals(bean.getErrorMessage(), retBean.getErrorMessage()); assertEquals(bean.getConf(), retBean.getConf()); assertEquals(bean.getData(), retBean.getData()); assertEquals(bean.getStats(), retBean.getStats()); assertNull(retBean.getSlaXml()); // GET_ACTION_COMPLETED retBean = WorkflowActionQueryExecutor.getInstance() .get(WorkflowActionQuery.GET_ACTION_COMPLETED, bean.getId()); assertEquals(bean.getId(), retBean.getId()); assertEquals(bean.getJobId(), retBean.getJobId()); assertEquals(bean.getStatusStr(), retBean.getStatusStr()); assertEquals(bean.getType(), retBean.getType()); assertEquals(bean.getLogToken(), retBean.getLogToken()); assertNull(retBean.getSlaXml()); assertNull(retBean.getConf()); assertNull(retBean.getData()); assertNull(retBean.getStats()); assertNull(retBean.getExternalChildIDs()); // GET_ACTION (entire obj) retBean = WorkflowActionQueryExecutor.getInstance().get(WorkflowActionQuery.GET_ACTION, bean.getId()); assertEquals(bean.getId(), retBean.getId()); assertEquals(bean.getJobId(), retBean.getJobId()); assertEquals(bean.getName(), retBean.getName()); assertEquals(bean.getStatusStr(), retBean.getStatusStr()); assertEquals(bean.getPending(), retBean.getPending()); assertEquals(bean.getPendingAge().getTime(), retBean.getPendingAge().getTime()); assertEquals(bean.getType(), retBean.getType()); assertEquals(bean.getLogToken(), retBean.getLogToken()); assertEquals(bean.getTransition(), retBean.getTransition()); assertEquals(bean.getRetries(), retBean.getRetries()); assertEquals(bean.getUserRetryCount(), retBean.getUserRetryCount()); assertEquals(bean.getUserRetryMax(), retBean.getUserRetryMax()); assertEquals(bean.getUserRetryInterval(), retBean.getUserRetryInterval()); assertEquals(bean.getStartTime().getTime(), retBean.getStartTime().getTime()); assertEquals(bean.getEndTime().getTime(), retBean.getEndTime().getTime()); assertEquals(bean.getCreatedTime().getTime(), retBean.getCreatedTime().getTime()); assertEquals(bean.getLastCheckTime().getTime(), retBean.getLastCheckTime().getTime()); assertEquals(bean.getErrorCode(), retBean.getErrorCode()); assertEquals(bean.getErrorMessage(), retBean.getErrorMessage()); assertEquals(bean.getExecutionPath(), retBean.getExecutionPath()); assertEquals(bean.getSignalValue(), retBean.getSignalValue()); assertEquals(bean.getCred(), retBean.getCred()); assertEquals(bean.getConf(), retBean.getConf()); assertEquals(bean.getSlaXml(), retBean.getSlaXml()); assertEquals(bean.getData(), retBean.getData()); assertEquals(bean.getStats(), retBean.getStats()); assertEquals(bean.getExternalChildIDs(), retBean.getExternalChildIDs()); }
/** * Provides functionality to test transient failures. * * @param errorType the error type. (start.transient, end.transient) * @param expStatus1 expected status after the first step (START_RETRY, END_RETRY) * @param expStatus2 expected status after the second step (START_MANUAL, END_MANUAL) * @param expErrorMsg the expected error message. * @throws Exception */ private void _testTransient( String errorType, WorkflowActionBean.Status expStatus1, final WorkflowActionBean.Status expStatus2, String expErrorMsg) throws Exception { String workflowPath = getTestCaseFileUri("workflow.xml"); Reader reader = IOUtils.getResourceAsReader("wf-ext-schema-valid.xml", -1); Writer writer = new FileWriter(new File(getTestCaseDir(), "workflow.xml")); IOUtils.copyCharStream(reader, writer); final int maxRetries = 2; final int retryInterval = 10; final DagEngine engine = new DagEngine("u"); Configuration conf = new XConfiguration(); conf.set(OozieClient.APP_PATH, workflowPath); conf.set(OozieClient.USER_NAME, getTestUser()); conf.set(OozieClient.LOG_TOKEN, "t"); conf.set("signal-value", "OK"); conf.set("external-status", "ok"); conf.set("error", errorType); conf.setInt(OozieClient.ACTION_MAX_RETRIES, maxRetries); conf.setInt(OozieClient.ACTION_RETRY_INTERVAL, retryInterval); final String jobId = engine.submitJob(conf, true); int retryCount = 1; WorkflowActionBean.Status expectedStatus = expStatus1; int expectedRetryCount = 2; Thread.sleep(20000); String aId = null; final WorkflowStore store = Services.get().get(WorkflowStoreService.class).create(); store.beginTrx(); while (retryCount <= maxRetries) { List<WorkflowActionBean> actions = store.getActionsForWorkflow(jobId, false); WorkflowActionBean action = null; for (WorkflowActionBean bean : actions) { if (bean.getType().equals("test")) { action = bean; break; } } assertNotNull(action); aId = action.getId(); assertEquals(expectedStatus, action.getStatus()); assertEquals(expectedRetryCount, action.getRetries()); assertEquals("TEST_ERROR", action.getErrorCode()); assertEquals(expErrorMsg, action.getErrorMessage()); if (action.getRetries() == maxRetries) { expectedRetryCount = 0; expectedStatus = expStatus2; break; } else { expectedRetryCount++; } Thread.sleep(retryInterval * 1000); retryCount++; } store.commitTrx(); store.closeTrx(); Thread.sleep(5000); final String actionId = aId; waitFor( 5000, new Predicate() { public boolean evaluate() throws Exception { return (engine.getWorkflowAction(actionId).getStatus() == expStatus2); } }); final WorkflowStore store2 = Services.get().get(WorkflowStoreService.class).create(); store2.beginTrx(); WorkflowActionBean action = engine.getWorkflowAction(actionId); assertEquals("TEST_ERROR", action.getErrorCode()); assertEquals(expErrorMsg, action.getErrorMessage()); assertEquals(expStatus2, action.getStatus()); assertTrue(action.isPending() == false); assertEquals(WorkflowJob.Status.SUSPENDED, engine.getJob(jobId).getStatus()); store2.commitTrx(); store2.closeTrx(); }
/** * Provides functionality to test non transient failures and coordinator action update * * @param errorType the error type. (start.non-transient, end.non-transient) * @param expStatus1 expected status. (START_MANUAL, END_MANUAL) * @param expErrorMsg expected error message. * @throws Exception */ private void _testNonTransientWithCoordActionUpdate( String errorType, WorkflowActionBean.Status expStatus1, String expErrorMsg) throws Exception { String workflowPath = getTestCaseFileUri("workflow.xml"); Reader reader = IOUtils.getResourceAsReader("wf-ext-schema-valid.xml", -1); Writer writer = new FileWriter(new File(getTestCaseDir(), "workflow.xml")); IOUtils.copyCharStream(reader, writer); final DagEngine engine = new DagEngine("u"); Configuration conf = new XConfiguration(); conf.set(OozieClient.APP_PATH, workflowPath); conf.set(OozieClient.USER_NAME, getTestUser()); conf.set(OozieClient.LOG_TOKEN, "t"); conf.set("signal-value", "OK"); conf.set("external-status", "ok"); conf.set("error", errorType); final String jobId = engine.submitJob(conf, false); final JPAService jpaService = Services.get().get(JPAService.class); final CoordinatorJobBean coordJob = addRecordToCoordJobTable(CoordinatorJob.Status.RUNNING, false, false); CoordinatorActionBean coordAction = addRecordToCoordActionTable( coordJob.getId(), 1, CoordinatorAction.Status.RUNNING, "coord-action-get.xml", jobId, "RUNNING", 0); engine.start(jobId); waitFor( 5000, new Predicate() { public boolean evaluate() throws Exception { return (engine.getJob(jobId).getStatus() == WorkflowJob.Status.SUSPENDED); } }); assertNotNull(jpaService); WorkflowJobGetJPAExecutor wfGetCmd = new WorkflowJobGetJPAExecutor(jobId); WorkflowJobBean job = jpaService.execute(wfGetCmd); WorkflowActionsGetForJobJPAExecutor actionsGetExe = new WorkflowActionsGetForJobJPAExecutor(jobId); List<WorkflowActionBean> actionsList = jpaService.execute(actionsGetExe); int n = actionsList.size(); WorkflowActionBean action = actionsList.get(n - 1); assertEquals("TEST_ERROR", action.getErrorCode()); assertEquals(expErrorMsg, action.getErrorMessage()); assertEquals(expStatus1, action.getStatus()); assertFalse(action.isPending()); assertEquals(WorkflowJob.Status.SUSPENDED, job.getStatus()); waitFor( 5000, new Predicate() { public boolean evaluate() throws Exception { CoordinatorActionBean coordAction2 = jpaService.execute(new CoordActionGetForExternalIdJPAExecutor(jobId)); return coordAction2.getStatus().equals(CoordinatorAction.Status.SUSPENDED); } }); coordAction = jpaService.execute(new CoordActionGetForExternalIdJPAExecutor(jobId)); assertEquals(CoordinatorAction.Status.SUSPENDED, coordAction.getStatus()); }
/** * Provides functionality to test non transient failures. * * @param errorType the error type. (start.non-transient, end.non-transient) * @param expStatus1 expected status. (START_MANUAL, END_MANUAL) * @param expErrorMsg expected error message. * @throws Exception */ private void _testNonTransient( String errorType, WorkflowActionBean.Status expStatus1, String expErrorMsg) throws Exception { String workflowPath = getTestCaseFileUri("workflow.xml"); Reader reader = IOUtils.getResourceAsReader("wf-ext-schema-valid.xml", -1); Writer writer = new FileWriter(new File(getTestCaseDir(), "workflow.xml")); IOUtils.copyCharStream(reader, writer); final DagEngine engine = new DagEngine("u"); Configuration conf = new XConfiguration(); conf.set(OozieClient.APP_PATH, workflowPath); conf.set(OozieClient.USER_NAME, getTestUser()); conf.set(OozieClient.LOG_TOKEN, "t"); conf.set("signal-value", "OK"); conf.set("external-status", "ok"); conf.set("error", errorType); final String jobId = engine.submitJob(conf, true); waitFor( 5000, new Predicate() { public boolean evaluate() throws Exception { return (engine.getJob(jobId).getStatus() == WorkflowJob.Status.SUSPENDED); } }); final WorkflowStore store = Services.get().get(WorkflowStoreService.class).create(); store.beginTrx(); List<WorkflowActionBean> actions = store.getActionsForWorkflow(jobId, true); int n = actions.size(); WorkflowActionBean action = actions.get(n - 1); assertEquals("TEST_ERROR", action.getErrorCode()); assertEquals(expErrorMsg, action.getErrorMessage()); assertEquals(expStatus1, action.getStatus()); assertTrue(action.isPending() == false); assertTrue(engine.getJob(jobId).getStatus() == WorkflowJob.Status.SUSPENDED); String actionConf = action.getConf(); String fixedActionConf = actionConf.replaceAll(errorType, "none"); action.setConf(fixedActionConf); store.updateAction(action); store.commitTrx(); store.closeTrx(); engine.resume(jobId); waitFor( 5000, new Predicate() { public boolean evaluate() throws Exception { return (engine.getJob(jobId).getStatus() == WorkflowJob.Status.SUCCEEDED); } }); assertEquals(WorkflowJob.Status.SUCCEEDED, engine.getJob(jobId).getStatus()); final WorkflowStore store2 = Services.get().get(WorkflowStoreService.class).create(); store2.beginTrx(); actions = store2.getActionsForWorkflow(jobId, false); action = actions.get(0); assertEquals(null, action.getErrorCode()); assertEquals(null, action.getErrorMessage()); assertEquals(WorkflowActionBean.Status.OK, action.getStatus()); store2.commitTrx(); store2.closeTrx(); }