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/10/20 17:48:54 UTC
aurora git commit: Expose list of neighbors in the instance page
Repository: aurora
Updated Branches:
refs/heads/master 2edd34ba2 -> 7229711eb
Expose list of neighbors in the instance page
Reviewed at https://reviews.apache.org/r/63062/
Project: http://git-wip-us.apache.org/repos/asf/aurora/repo
Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/7229711e
Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/7229711e
Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/7229711e
Branch: refs/heads/master
Commit: 7229711eb6e4ccbd5a7753a985b8936e46db2eab
Parents: 2edd34b
Author: Reza Motamedi <re...@gmail.com>
Authored: Fri Oct 20 10:44:50 2017 -0700
Committer: David McLaughlin <da...@dmclaughlin.com>
Committed: Fri Oct 20 10:44:50 2017 -0700
----------------------------------------------------------------------
ui/src/main/js/components/TaskNeighbors.js | 27 ++++++++++++++++++++
ui/src/main/js/components/TaskStatus.js | 6 ++++-
.../components/__tests__/TaskNeighbors-test.js | 22 ++++++++++++++++
ui/src/main/js/pages/Instance.js | 24 +++++++++++++++--
ui/src/main/js/utils/Common.js | 4 +++
ui/src/main/sass/components/_instance-page.scss | 14 ++++++++++
6 files changed, 94 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/aurora/blob/7229711e/ui/src/main/js/components/TaskNeighbors.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/components/TaskNeighbors.js b/ui/src/main/js/components/TaskNeighbors.js
new file mode 100644
index 0000000..72d49bb
--- /dev/null
+++ b/ui/src/main/js/components/TaskNeighbors.js
@@ -0,0 +1,27 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+
+import { isNullyOrEmpty } from 'utils/Common';
+
+export function NeighborTaskItem({ assignedTask }) {
+ const { role, environment, name } = assignedTask.task.job;
+ const taskKey = `${role}/${environment}/${name}/${assignedTask.instanceId}`;
+ return (
+ <div>
+ <span className='task-neighbors-task-key'>
+ <Link to={`/beta/scheduler/${taskKey}`}>
+ {taskKey}
+ </Link>
+ </span>
+ </div>
+ );
+}
+
+export default function TaskNeighbors({ tasks }) {
+ return (isNullyOrEmpty(tasks) ? <div />
+ : (<div className='active-task-neighbors'>
+ <h5>host neighbors</h5>
+ {tasks.map((t) =>
+ <NeighborTaskItem assignedTask={t.assignedTask} key={t.assignedTask.taskId} />)}
+ </div>));
+}
http://git-wip-us.apache.org/repos/asf/aurora/blob/7229711e/ui/src/main/js/components/TaskStatus.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/components/TaskStatus.js b/ui/src/main/js/components/TaskStatus.js
index b514918..2e5a2b4 100644
--- a/ui/src/main/js/components/TaskStatus.js
+++ b/ui/src/main/js/components/TaskStatus.js
@@ -3,11 +3,12 @@ import React from 'react';
import PanelGroup, { Container, StandardPanelTitle } from 'components/Layout';
import StateMachine from 'components/StateMachine';
import TaskDetails from 'components/TaskDetails';
+import TaskNeighbors from 'components/TaskNeighbors';
import { isNully } from 'utils/Common';
import { getClassForScheduleStatus, taskToStateMachine } from 'utils/Task';
-export default function TaskStatus({ task }) {
+export default function TaskStatus({ task, neighbors }) {
if (isNully(task)) {
return (<Container>
<PanelGroup title={<StandardPanelTitle title='Active Task' />}>
@@ -27,6 +28,9 @@ export default function TaskStatus({ task }) {
className={getClassForScheduleStatus(task.status)}
states={taskToStateMachine(task)} />
</div>
+ <div className='col-md-12'>
+ <TaskNeighbors tasks={neighbors} />
+ </div>
</div>
</PanelGroup>
</Container>);
http://git-wip-us.apache.org/repos/asf/aurora/blob/7229711e/ui/src/main/js/components/__tests__/TaskNeighbors-test.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/components/__tests__/TaskNeighbors-test.js b/ui/src/main/js/components/__tests__/TaskNeighbors-test.js
new file mode 100644
index 0000000..dfe8ac6
--- /dev/null
+++ b/ui/src/main/js/components/__tests__/TaskNeighbors-test.js
@@ -0,0 +1,22 @@
+import React from 'react';
+import { shallow } from 'enzyme';
+
+import TaskNeighbors, { NeighborTaskItem } from '../TaskNeighbors';
+
+describe('TaskNeighbors', () => {
+ it('Should contain empty div if empty', () => {
+ const tasks = [];
+ const el = shallow(<TaskNeighbors tasks={tasks} />);
+ expect(el.find(NeighborTaskItem).length).toBe(0);
+ expect(el.contains(<div />)).toBe(true);
+ });
+
+ it('Should be visible if not empty', () => {
+ const tasks = [
+ {assignedTask: {taskId: 0}, job: {role: 'test-role', env: 'test-env', name: 'test-name'}},
+ {assignedTask: {taskId: 1}, job: {role: 'test-role', env: 'test-env', name: 'test-name'}}
+ ];
+ const el = shallow(<TaskNeighbors tasks={tasks} />);
+ expect(el.find(NeighborTaskItem).length).toBe(2);
+ });
+});
http://git-wip-us.apache.org/repos/asf/aurora/blob/7229711e/ui/src/main/js/pages/Instance.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/pages/Instance.js b/ui/src/main/js/pages/Instance.js
index c4d625c..4b85545 100644
--- a/ui/src/main/js/pages/Instance.js
+++ b/ui/src/main/js/pages/Instance.js
@@ -10,7 +10,7 @@ import { isActive } from 'utils/Task';
export default class Instance extends React.Component {
constructor(props) {
super(props);
- this.state = {cluster: '', tasks: [], loading: true};
+ this.state = {cluster: '', tasks: [], loading: true, loadingNeighbors: true};
}
componentWillMount(props) {
@@ -31,6 +31,26 @@ export default class Instance extends React.Component {
});
}
+ componentWillUpdate(nextProps, nextState) {
+ if (this.state.loading && !nextState.loading) {
+ const activeTask = nextState.tasks.find(isActive);
+
+ const query = new TaskQuery();
+ query.statuses = [ScheduleStatus.RUNNING];
+ query.slaveHosts = [activeTask.assignedTask.slaveHost];
+
+ const that = this;
+ this.props.api.getTasksWithoutConfigs(query, (rsp) => {
+ const tasksOnAgent = rsp.result.scheduleStatusResult.tasks;
+ that.setState({
+ neighborTasks: tasksOnAgent.filter(function (el) {
+ return el.assignedTask.taskId !== activeTask.assignedTask.taskId;
+ })
+ });
+ });
+ }
+ }
+
render() {
const { role, environment, name, instance } = this.props.match.params;
if (this.state.loading) {
@@ -46,7 +66,7 @@ export default class Instance extends React.Component {
instance={instance}
name={name}
role={role} />
- <TaskStatus task={activeTask} />
+ <TaskStatus neighbors={this.state.neighborTasks} task={activeTask} />
<InstanceHistory tasks={terminalTasks} />
</div>);
}
http://git-wip-us.apache.org/repos/asf/aurora/blob/7229711e/ui/src/main/js/utils/Common.js
----------------------------------------------------------------------
diff --git a/ui/src/main/js/utils/Common.js b/ui/src/main/js/utils/Common.js
index 8f2da7c..603a11b 100644
--- a/ui/src/main/js/utils/Common.js
+++ b/ui/src/main/js/utils/Common.js
@@ -2,6 +2,10 @@ export function isNully(value) {
return typeof value === 'undefined' || value === null;
}
+export function isNullyOrEmpty(value) {
+ return isNully(value) || value.length === 0;
+}
+
export function invert(obj) {
const inverted = {};
Object.keys(obj).forEach((key) => {
http://git-wip-us.apache.org/repos/asf/aurora/blob/7229711e/ui/src/main/sass/components/_instance-page.scss
----------------------------------------------------------------------
diff --git a/ui/src/main/sass/components/_instance-page.scss b/ui/src/main/sass/components/_instance-page.scss
index 4d8618c..1da87dc 100644
--- a/ui/src/main/sass/components/_instance-page.scss
+++ b/ui/src/main/sass/components/_instance-page.scss
@@ -20,6 +20,20 @@
}
}
+ .active-task-neighbors {
+ h5 {
+ text-transform: uppercase;
+ margin: 0;
+ margin-bottom: 3px;
+ font-weight: 700;
+ }
+
+ .task-neighbors-task-key {
+ margin: 10;
+ margin-bottom: 3px;
+ }
+ }
+
.instance-history {
.state-machine, .state-machine ul, .state-machine li {
margin: 0 !important;