You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aurora.apache.org by dm...@apache.org on 2017/11/08 00:25:40 UTC

aurora git commit: Display pending task reasons in TaskList

Repository: aurora
Updated Branches:
  refs/heads/master 53fda6092 -> b4825a37c


Display pending task reasons in TaskList

Reviewed at https://reviews.apache.org/r/63650/


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

Branch: refs/heads/master
Commit: b4825a37c1391a4566b91fe00ff88431b6e715f2
Parents: 53fda60
Author: David McLaughlin <da...@dmclaughlin.com>
Authored: Tue Nov 7 16:22:08 2017 -0800
Committer: David McLaughlin <da...@dmclaughlin.com>
Committed: Tue Nov 7 16:22:08 2017 -0800

----------------------------------------------------------------------
 ui/src/main/js/components/JobHistory.js         |  6 ++-
 ui/src/main/js/components/JobStatus.js          | 12 ++++-
 ui/src/main/js/components/TaskList.js           |  9 +++-
 .../js/components/__tests__/TaskList-test.js    | 46 +++++++++++++++++++-
 ui/src/main/js/pages/Job.js                     | 15 +++++--
 ui/src/main/js/test-utils/TaskBuilders.js       |  1 +
 6 files changed, 78 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aurora/blob/b4825a37/ui/src/main/js/components/JobHistory.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/components/JobHistory.js b/ui/src/main/js/components/JobHistory.js
index 7eff462..dabcbf9 100644
--- a/ui/src/main/js/components/JobHistory.js
+++ b/ui/src/main/js/components/JobHistory.js
@@ -7,9 +7,11 @@ import TaskList from 'components/TaskList';
 import { sort } from 'utils/Common';
 import { getLastEventTime, isActive } from 'utils/Task';
 
-export default function ({ tasks }) {
+export default function ({ pendingReasons, tasks }) {
   const terminalTasks = sort(tasks.filter((t) => !isActive(t)), (t) => getLastEventTime(t), true);
   return (<Tab id='history' name={`Completed Tasks (${terminalTasks.length})`}>
-    <PanelGroup><TaskList sortBy='latest' tasks={terminalTasks} /></PanelGroup>
+    <PanelGroup>
+      <TaskList pendingReasons={pendingReasons} sortBy='latest' tasks={terminalTasks} />
+    </PanelGroup>
   </Tab>);
 }

http://git-wip-us.apache.org/repos/asf/aurora/blob/b4825a37/ui/src/main/js/components/JobStatus.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/components/JobStatus.js b/ui/src/main/js/components/JobStatus.js
index 8f7023b..14f3538 100644
--- a/ui/src/main/js/components/JobStatus.js
+++ b/ui/src/main/js/components/JobStatus.js
@@ -8,7 +8,13 @@ import TaskList from 'components/TaskList';
 import { isNully, sort } from 'utils/Common';
 import { isActive } from 'utils/Task';
 
-export default function ({ configGroups, cronJob, onTaskViewChange, queryParams, tasks }) {
+export default function ({
+  configGroups,
+  cronJob,
+  onTaskViewChange,
+  pendingReasons,
+  queryParams,
+  tasks }) {
   const activeTasks = sort(tasks.filter(isActive), (t) => t.assignedTask.instanceId);
   const numberConfigs = isNully(cronJob) ? (isNully(configGroups) ? '' : configGroups.length) : 1;
   return (<Tab id='status' name={`Active Tasks (${activeTasks.length})`}>
@@ -17,7 +23,9 @@ export default function ({ configGroups, cronJob, onTaskViewChange, queryParams,
         activeTab={queryParams.taskView}
         className='task-status-tabs'
         onChange={onTaskViewChange}>
-        <Tab icon='th-list' id='tasks' name='Tasks'><TaskList tasks={activeTasks} /></Tab>
+        <Tab icon='th-list' id='tasks' name='Tasks'>
+          <TaskList pendingReasons={pendingReasons} tasks={activeTasks} />
+        </Tab>
         <Tab icon='info-sign' id='config' name={`Configuration (${numberConfigs})`}>
           <JobConfig cronJob={cronJob} groups={configGroups} />
         </Tab>

http://git-wip-us.apache.org/repos/asf/aurora/blob/b4825a37/ui/src/main/js/components/TaskList.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/components/TaskList.js b/ui/src/main/js/components/TaskList.js
index c0815cf..4513715 100644
--- a/ui/src/main/js/components/TaskList.js
+++ b/ui/src/main/js/components/TaskList.js
@@ -4,7 +4,7 @@ import Icon from 'components/Icon';
 import Pagination from 'components/Pagination';
 import TaskListItem from 'components/TaskListItem';
 
-import { pluralize } from 'utils/Common';
+import { isNully, pluralize } from 'utils/Common';
 import { getClassForScheduleStatus, getLastEventTime } from 'utils/Task';
 import { SCHEDULE_STATUS } from 'utils/Thrift';
 
@@ -104,6 +104,13 @@ export default class TaskList extends React.Component {
       ? (t) => getLastEventTime(t) * -1
       : (t) => t.assignedTask.instanceId;
 
+    const reasons = isNully(this.props.pendingReasons) ? {} : this.props.pendingReasons;
+    this.props.tasks.forEach((t) => {
+      if (t.status === ScheduleStatus.PENDING && reasons[t.assignedTask.taskId]) {
+        t.taskEvents[t.taskEvents.length - 1].message = reasons[t.assignedTask.taskId];
+      }
+    });
+
     return (<div>
       <TaskListFilter
         numberPerPage={tasksPerPage}

http://git-wip-us.apache.org/repos/asf/aurora/blob/b4825a37/ui/src/main/js/components/__tests__/TaskList-test.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/components/__tests__/TaskList-test.js b/ui/src/main/js/components/__tests__/TaskList-test.js
index 948e86b..946428b 100644
--- a/ui/src/main/js/components/__tests__/TaskList-test.js
+++ b/ui/src/main/js/components/__tests__/TaskList-test.js
@@ -1,14 +1,56 @@
 import React from 'react';
 import { shallow } from 'enzyme';
 
-import {
+import TaskList, {
   TaskListControls,
   TaskListStatusFilter,
   TaskListStatus,
   searchTask
 } from '../TaskList';
 
-import { AssignedTaskBuilder, ScheduledTaskBuilder } from 'test-utils/TaskBuilders';
+import {
+  AssignedTaskBuilder,
+  ScheduledTaskBuilder,
+  TaskEventBuilder
+} from 'test-utils/TaskBuilders';
+
+describe('TaskList', () => {
+  it('Should set pending reasons on PENDING tasks', () => {
+    const tasks = [
+      ScheduledTaskBuilder.status(ScheduleStatus.PENDING)
+        .taskEvents([TaskEventBuilder.build()])
+        .assignedTask(AssignedTaskBuilder.taskId('one').build())
+        .build(),
+      ScheduledTaskBuilder.status(ScheduleStatus.RUNNING)
+        .taskEvents([TaskEventBuilder.message('running').build()])
+        .assignedTask(AssignedTaskBuilder.taskId('two').build())
+        .build()
+    ];
+    const reasons = {
+      [tasks[0].assignedTask.taskId]: 'Test Reason',
+      [tasks[1].assignedTask.taskId]: 'I should never be used'
+    };
+    shallow(<TaskList pendingReasons={reasons} tasks={tasks} />);
+    expect(tasks[0].taskEvents[0].message).toBe('Test Reason');
+    expect(tasks[1].taskEvents[0].message).toBe('running');
+  });
+
+  it('Should handle null pendingReasons', () => {
+    const tasks = [
+      ScheduledTaskBuilder.status(ScheduleStatus.PENDING)
+        .taskEvents([TaskEventBuilder.build()])
+        .assignedTask(AssignedTaskBuilder.taskId('one').build())
+        .build(),
+      ScheduledTaskBuilder.status(ScheduleStatus.RUNNING)
+        .taskEvents([TaskEventBuilder.message('running').build()])
+        .assignedTask(AssignedTaskBuilder.taskId('two').build())
+        .build()
+    ];
+    const el = shallow(<TaskList pendingReasons={null} tasks={tasks} />);
+    // basic check for successful rendering
+    expect(el.find(TaskListControls).length).toBe(1);
+  });
+});
 
 describe('TaskListControls', () => {
   it('Should attach active to default list element', () => {

http://git-wip-us.apache.org/repos/asf/aurora/blob/b4825a37/ui/src/main/js/pages/Job.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/pages/Job.js b/ui/src/main/js/pages/Job.js
index 2f96e23..4af4f31 100644
--- a/ui/src/main/js/pages/Job.js
+++ b/ui/src/main/js/pages/Job.js
@@ -39,10 +39,16 @@ export default class Job extends React.Component {
       });
     });
     api.getPendingReason(taskQuery, (response) => {
-      that.setState({
-        cluster: response.serverInfo.clusterName,
-        pendingReasons: response.result.getPendingReasonResult.reasons
-      });
+      if (response.result.getPendingReasonResult.reasons) {
+        const reasons = response.result.getPendingReasonResult.reasons.reduce((res, reason) => {
+          res[reason.taskId] = reason.reason;
+          return res;
+        }, {});
+        that.setState({
+          cluster: response.serverInfo.clusterName,
+          pendingReasons: reasons
+        });
+      }
     });
     api.getConfigSummary(key, (response) => {
       that.setState({
@@ -131,6 +137,7 @@ export default class Job extends React.Component {
           cronJob={this.state.cronJob}
           onTaskViewChange={(t) => that.setTaskView(t.id)}
           onViewChange={(t) => that.setJobView(t.id)}
+          pendingReasons={this.state.pendingReasons}
           queryParams={queryString.parse(this.props.location.search)}
           tasks={this.state.tasks} />
       </Container>

http://git-wip-us.apache.org/repos/asf/aurora/blob/b4825a37/ui/src/main/js/test-utils/TaskBuilders.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/test-utils/TaskBuilders.js b/ui/src/main/js/test-utils/TaskBuilders.js
index f2b0645..5a34735 100644
--- a/ui/src/main/js/test-utils/TaskBuilders.js
+++ b/ui/src/main/js/test-utils/TaskBuilders.js
@@ -45,6 +45,7 @@ export const AssignedTaskBuilder = createBuilder({
 });
 
 export const TaskEventBuilder = createBuilder({
+  message: '',
   timestamp: 0,
   status: ScheduleStatus.PENDING
 });