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 <[email protected]> Authored: Tue Nov 7 16:22:08 2017 -0800 Committer: David McLaughlin <[email protected]> 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 });
