You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sr...@apache.org on 2014/08/13 23:10:27 UTC
[1/2] AMBARI-6840. Jobs View: Update Top Nav rendering for jobs
(srimanth)
Repository: ambari
Updated Branches:
refs/heads/trunk 952c364ab -> 71d91a7c5
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/views/main/jobs/hive_job_details_tez_dag_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/jobs/hive_job_details_tez_dag_view.js b/ambari-web/app/views/main/jobs/hive_job_details_tez_dag_view.js
deleted file mode 100644
index 3ce60b5..0000000
--- a/ambari-web/app/views/main/jobs/hive_job_details_tez_dag_view.js
+++ /dev/null
@@ -1,946 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-var date = require('utils/date');
-var numberUtils = require('utils/number_utils');
-var stringUtils = require('utils/string_utils');
-
-App.MainHiveJobDetailsTezDagView = Em.View.extend({
- templateName : require('templates/main/jobs/hive_job_details_tez_dag'),
- selectedVertex : null,
- summaryMetricType: null,
- svgVerticesLayer : null, // The contents of the <svg> element.
- svgTezRoot: null,
- svgWidth : -1,
- svgHeight : -1,
-
- // zoomScaleFom: -1, // Bound from parent view
- // zoomScaleTo: -1, // Bound from parent view
- // zoomScale: -1, // Bound from parent view
- zoomTranslate: [0, 0],
- zoomBehavior: null,
- svgCreated: false,
-
- content : null,
-
- /**
- * Populated by #drawTezDag()
- *
- * {
- * "nodes": [
- * {
- * "id": "Map2",
- * "name": "Map 2",
- * "type": App.TezDagVertexType.MAP,
- * "operations": [
- * "TableScan",
- * "File Output"
- * ],
- * "depth": 1,
- * "parents": [],
- * "children": [],
- * "x": 0,
- * "y": 0,
- * "metricDisplay": "100MB",
- * "metricPercent": 64,
- * "metricType": "Input",
- * "selected": true,
- * "fixed": true,
- * "metrics": {
- * "input": 40022,
- * "output": 224344,
- * "recordsRead": 200,
- * "recordsWrite": 122,
- * "tezTasks": 2
- * }
- * }
- * ],
- * "links": [
- * {
- * "source": {},
- * "target": {},
- * "edgeType": "BROADCAST"
- * }
- * ]
- * }
- */
- dagVisualModel : {
- nodes : [],
- links : [],
- maxMetrics : {},
- minMetrics: {}
- },
-
- didInsertElement : function() {
- this._super();
- this.createSvg();
- },
-
- willDestroyElement : function() {
- $('.svg-tooltip').tooltip('destroy');
- },
-
- createSvg : function() {
- var self = this;
- var dagVisualModel = this.get('dagVisualModel');
- dagVisualModel.nodes.clear();
- dagVisualModel.links.clear();
- dagVisualModel.maxMetrics = {};
- dagVisualModel.minMetrics = {};
-
- this.set('content', this.get('controller.content'));
- var svg = d3.select("#tez-dag-svg");
- d3.selectAll(".tez-dag-canvas").remove();
- var tezRoot = svg.append("svg:g").attr("class", "tez-root");
- this.set('svgTezRoot', tezRoot);
- var tezRootRect = tezRoot.append("rect").attr("class", "tez-root-rect");
- this.set('svgVerticesLayer', tezRoot.append("svg:g").attr("class", "tez-dag-canvas"));
- this.adjustGraphHeight();
- var canvasSize = this.drawTezDag();
- var minScale = Math.min(this.get('svgHeight') / canvasSize.height, this.get('svgWidth') / canvasSize.width);
- if (minScale > 1) {
- minScale = 1;
- }
- tezRootRect.attr("width", canvasSize.width).attr("height", canvasSize.height);
- var zoom = d3.behavior.zoom().scaleExtent([ minScale, 2 ]).on("zoom", function() {
- tezRoot.attr("transform", "translate(" + (d3.event.translate) + ")scale(" + d3.event.scale + ")");
- self.set('zoomScale', d3.event.scale);
- self.set('zoomTranslate', d3.event.translate);
- });
- svg.call(zoom);
- this.set('zoomBehavior', zoom);
- this.set('zoomTranslate', [0, 0]);
- this.set('zoomScaleFrom', minScale);
- this.set('zoomScaleTo', 2);
- this.set('zoomScale', minScale);
- this.set('svgCreated', true);
- },
-
- zoomScaleObserver : function() {
- var tezRoot = this.get("svgTezRoot");
- var newScale = this.get('zoomScale');
- var newScaleFrom = this.get('zoomScaleFrom');
- var newScaleTo = this.get('zoomScaleTo');
- var zoomTranslate = this.get('zoomTranslate');
- var zoomBehavior = this.get('zoomBehavior');
- if (d3.event == null && this.get('svgCreated')) {
- // Values were set from actions instead of UI events
- // We need to center in on selected vertex if available.
- var selectedNode = null;
- var dagVisualModel = this.get('dagVisualModel');
- if (dagVisualModel && dagVisualModel.nodes && dagVisualModel.nodes.length > 0) {
- dagVisualModel.nodes.every(function(node) {
- if (node.selected) {
- selectedNode = node;
- return false;
- }
- return true;
- })
- }
- if (selectedNode != null) {
- var cX = selectedNode.x + selectedNode.width / 2;
- var cY = selectedNode.y + selectedNode.height / 2;
- var mX = (cX * zoomBehavior.scale()) + zoomTranslate[0];
- var mY = (cY * zoomBehavior.scale()) + zoomTranslate[1];
- var pX = (cX * newScale) + zoomTranslate[0];
- var pY = (cY * newScale) + zoomTranslate[1];
- var nX = (mX - pX);
- var nY = (mY - pY);
- zoomTranslate[0] += nX;
- zoomTranslate[1] += nY;
- this.set('zoomTranslate', zoomTranslate);
- }
- }
- console.debug("zoomScaleObserver(): New scale = " + newScale + ", Range = [" + newScaleFrom + ", " + newScaleTo + "]. Translate = ", zoomTranslate.join(','));
- zoomBehavior.scale(newScale);
- zoomBehavior.translate(zoomTranslate);
- tezRoot.attr("transform", "translate(" + zoomTranslate + ")scale(" + newScale + ")");
- }.observes('zoomScale', 'zoomScaleFrom', 'zoomScaleTo', 'zoomTranslate'),
-
- /**
- * We have to make the height of the DAG section match the height of the
- * Summary section.
- */
- adjustGraphHeight : function() {
- var rhsDiv = document.getElementById('tez-vertices-rhs');
- var lhsDiv = document.getElementById('tez-dag-section');
- if (lhsDiv && rhsDiv) {
- var rhsHeight = rhsDiv.clientHeight - 26; // box boundary
- var currentWidth = lhsDiv.clientWidth;
- var currentHeight = lhsDiv.clientHeight;
- $(lhsDiv).attr('style', "height:" + rhsHeight + "px;");
- var svgHeight = rhsHeight - 20;
- d3.select("#tez-dag-svg").attr('height', svgHeight).attr('width', '100%');
- this.set('svgWidth', currentWidth);
- this.set('svgHeight', svgHeight);
- console.log("SVG Width=", currentWidth, ", Height=", svgHeight);
- }
- },
-
- vertexSelectionUpdated : function() {
- var vertexId = this.get('selectedVertex.id');
- var zoomTranslate = [];
- var zoomBehavior = this.get('zoomBehavior');
- var selectedNode = this.get('dagVisualModel').nodes.findProperty('id', vertexId);
- var dagVisualModel = this.get('dagVisualModel');
- if (dagVisualModel && dagVisualModel.nodes && dagVisualModel.nodes.length > 0) {
- dagVisualModel.nodes.forEach(function(node) {
- node.selected = node.id == vertexId;
- console.log("vertexSelectionUpdated(): Updated ",node.id," to ",node.selected);
- })
- }
- if(!this.get('selectedVertex.notTableClick')){
- var cX = selectedNode.x + (selectedNode.width) / 2;
- var cY = selectedNode.y + (selectedNode.height) / 2;
- zoomTranslate[0] = (225 / zoomBehavior.scale() -cX) ;
- zoomTranslate[1] = (250 / zoomBehavior.scale() -cY) ;
- this.set('zoomTranslate', [0,0]);
- this.get('svgVerticesLayer').attr("transform", "translate(0,0)");
- this.get('svgVerticesLayer').attr("transform", "translate("+zoomTranslate[0]+","+zoomTranslate[1]+")");
- }
- this.refreshGraphUI();
- }.observes('selectedVertex'),
-
- summaryMetricTypeUpdated : function() {
- var summaryMetricType = this.get('summaryMetricType');
- var dagVisualModel = this.get('dagVisualModel');
- var min = dagVisualModel.minMetrics[summaryMetricType];
- var max = dagVisualModel.maxMetrics[summaryMetricType];
- dagVisualModel.nodes.forEach(function(node) {
- var value = node.metrics[summaryMetricType];
- var percent = -1;
- if (numberUtils.validateInteger(value)==null && value >= 0) {
- if (numberUtils.validateInteger(min) == null && numberUtils.validateInteger(max) == null) {
- if (max > min && value >= 0) {
- percent = Math.round((value - min) * 100 / (max - min));
- }
- }
- } else {
- value = '';
- }
- switch (summaryMetricType) {
- case "input":
- case "output":
- value = numberUtils.bytesToSize(value);
- break;
- default:
- break;
- }
- node.metricType = Em.I18n.t('jobs.hive.tez.metric.' + summaryMetricType);
- node.metricDisplay = value;
- node.metricPercent = percent;
- });
- this.refreshGraphUI();
- }.observes('summaryMetricType'),
-
- /**
- * Observes metrics of all vertices.
- */
- vertexMetricsUpdated : function() {
- var dagVisualModel = this.get('dagVisualModel');
- dagVisualModel.minMetrics = {
- input : Number.MAX_VALUE,
- output : Number.MAX_VALUE,
- recordsRead : Number.MAX_VALUE,
- recordsWrite : Number.MAX_VALUE,
- tezTasks : Number.MAX_VALUE,
- spilledRecords : Number.MAX_VALUE
- };
- dagVisualModel.maxMetrics = {
- input : 0,
- output : 0,
- recordsRead : 0,
- recordsWrite : 0,
- tezTasks : 0,
- spilledRecords : 0
- };
- if (dagVisualModel.nodes) {
- dagVisualModel.nodes.forEach(function(node) {
- var vertex = App.TezDagVertex.find(node.id);
- if (vertex) {
- node.metrics['input'] = vertex.get('fileReadBytes') + vertex.get('hdfsReadBytes');
- node.metrics['output'] = vertex.get('fileWriteBytes') + vertex.get('hdfsWriteBytes');
- node.metrics['recordsRead'] = vertex.get('recordReadCount');
- node.metrics['recordsWrite'] = vertex.get('recordWriteCount');
- node.metrics['tezTasks'] = vertex.get('tasksCount');
- node.metrics['spilledRecords'] = vertex.get('spilledRecords');
- node.state = vertex.get('state');
- // Min metrics
- dagVisualModel.minMetrics.input = Math.min(dagVisualModel.minMetrics.input, node.metrics.input);
- dagVisualModel.minMetrics.output = Math.min(dagVisualModel.minMetrics.output, node.metrics.output);
- dagVisualModel.minMetrics.recordsRead = Math.min(dagVisualModel.minMetrics.recordsRead, node.metrics.recordsRead);
- dagVisualModel.minMetrics.recordsWrite = Math.min(dagVisualModel.minMetrics.recordsWrite, node.metrics.recordsWrite);
- dagVisualModel.minMetrics.tezTasks = Math.min(dagVisualModel.minMetrics.tezTasks, node.metrics.tezTasks);
- dagVisualModel.minMetrics.spilledRecords = Math.min(dagVisualModel.minMetrics.spilledRecords, node.metrics.spilledRecords);
- // Max metrics
- dagVisualModel.maxMetrics.input = Math.max(dagVisualModel.maxMetrics.input, node.metrics.input);
- dagVisualModel.maxMetrics.output = Math.max(dagVisualModel.maxMetrics.output, node.metrics.output);
- dagVisualModel.maxMetrics.recordsRead = Math.max(dagVisualModel.maxMetrics.recordsRead, node.metrics.recordsRead);
- dagVisualModel.maxMetrics.recordsWrite = Math.max(dagVisualModel.maxMetrics.recordsWrite, node.metrics.recordsWrite);
- dagVisualModel.maxMetrics.tezTasks = Math.max(dagVisualModel.maxMetrics.tezTasks, node.metrics.tezTasks);
- dagVisualModel.maxMetrics.spilledRecords = Math.max(dagVisualModel.maxMetrics.spilledRecords, node.metrics.spilledRecords);
- }
- });
- }
- Ember.run.once(this, 'summaryMetricTypeUpdated');
- }.observes('content.tezDag.vertices.@each.fileReadBytes', 'content.tezDag.vertices.@each.fileWriteBytes',
- 'content.tezDag.vertices.@each.hdfsReadBytes', 'content.tezDag.vertices.@each.hdfsWriteBytes',
- 'content.tezDag.vertices.@each.recordReadCount', 'content.tezDag.vertices.@each.recordWriteCount',
- 'content.tezDag.vertices.@each.state', 'content.tezDag.vertices.@each.spilledRecords'),
-
- createOperationPlanObj: function (vertexName, op, opIndex) {
- var operatorPlanObj = [];
- var text = this.get('content.tezDag.vertices').findProperty('name', vertexName).get('operationPlan');
- text = text.replace(/:"/g,'"').replace(/([:,])(?=\S)/g,'$1 ');
- var jsonText = $.parseJSON(text);
- if (!opIndex) {
- opIndex = 0;
- } else {
- opIndex = parseInt(opIndex) - 1;
- }
- var jsonText = op.findIn(jsonText, opIndex);
- if (jsonText!=null) {
- for (var key in jsonText) {
- if (jsonText.hasOwnProperty(key) && typeof(jsonText[key]) == "string") {
- operatorPlanObj.push(
- {
- name: key,
- value: jsonText[key]
- }
- );
- }
- }
- }
- return operatorPlanObj;
- },
-
- /**
- * Determines layout and creates Tez graph. In the process it populates the
- * visual model into 'dagVisualModel' field.
- *
- * Terminology: 'vertices' and 'edges' are Tez terms. 'nodes' and 'links' are
- * visual (d3) terms.
- */
- drawTezDag : function() {
- var self = this;
- var width = this.get('svgWidth');
- var svgLayer = this.get('svgVerticesLayer');
- var vertices = this.get('content.tezDag.vertices');
- var edges = this.get('content.tezDag.edges');
- var constants = this.get('constants');
- var vertexIdToNode = {};
- var depthToNodes = []; // Array of id arrays
- var dagVisualModel = this.get('dagVisualModel');
- var selectedVertex = this.get('selectedVertex');
- var minVertexDuration = Number.MAX_VALUE;
- var maxVertexDuration = Number.MIN_VALUE;
-
- //
- // CALCULATE DEPTH - BFS to get correct graph depth
- //
- var visitEdges = [];
- var maxRowLength = 0;
- var maxRowDepth = 0;
- vertices.forEach(function(v) {
- if (v.get('incomingEdges.length') < 1) {
- visitEdges.push({
- depth : 0,
- parent : null,
- toVertex : v
- });
- }
- });
- function getNodeFromEdge(edgeObj) {
- var vertex = edgeObj.toVertex;
- var pName = edgeObj.parent ? edgeObj.parent.name : null;
- var cName = edgeObj.toVertex ? edgeObj.toVertex.get('name') : null;
- console.debug("Processing vertex ", edgeObj, " (",pName, " > ", cName,")");
- if(edgeObj.parent && edgeObj.depth < edgeObj.parent.depth + 1){
- console.debug("Updating child edge to " + (edgeObj.parent.depth + 1));
- edgeObj.depth = edgeObj.parent.depth + 1;
- }
- var node = vertexIdToNode[vertex.get('id')];
- for ( var k = depthToNodes.length; k <= edgeObj.depth; k++) {
- depthToNodes.push([]);
- }
- if (!node) {
- // New node
- node = {
- id : vertex.get('id'),
- name : vertex.get('name'),
- state : vertex.get('state'),
- type : vertex.get('type'),
- operations : vertex.get('operations'),
- depth : edgeObj.depth,
- parents : [],
- children : [],
- x : 0,
- y : 0,
- metricType : null,
- metricDisplay : null,
- metricPercent : -1,
- selected : selectedVertex != null ? selectedVertex.get('id') == vertex.get('id') : false,
- fixed : true,
- metrics : {
- input : -1,
- output : -1,
- recordsRead : -1,
- recordsWrite : -1,
- tezTasks : -1
- },
- duration: vertex.get('duration')
- }
- if (node.duration < minVertexDuration && node.duration > 0) {
- minVertexDuration = node.duration;
- }
- if (node.duration > maxVertexDuration && node.duration > 0) {
- maxVertexDuration = node.duration;
- }
- vertexIdToNode[vertex.get('id')] = node;
- depthToNodes[node.depth].push(node);
- } else {
- // Existing node
- if (edgeObj.depth > node.depth) {
- function moveNodeToDepth(node, newDepth) {
- console.debug("Moving " + node.name + " from depth " + node.depth + " to " + newDepth);
- var oldIndex = depthToNodes[node.depth].indexOf(node);
- depthToNodes[node.depth].splice(oldIndex, 1);
- node.depth = newDepth;
- if (!depthToNodes[node.depth]) {
- depthToNodes[node.depth] = [];
- }
- depthToNodes[node.depth].push(node);
- if (node.children) {
- // Move children down depth
- node.children.forEach(function(c) {
- moveNodeToDepth(c, node.depth + 1);
- })
- }
- }
- moveNodeToDepth(node, edgeObj.depth);
- }
- }
- if (depthToNodes[node.depth].length > maxRowLength) {
- maxRowLength = depthToNodes[node.depth].length;
- maxRowDepth = node.depth;
- }
- if (edgeObj.parent != null) {
- node.parents.push(edgeObj.parent);
- edgeObj.parent.children.push(node);
- }
- return node;
- }
- var edgeObj;
- var visitedVertexMap = {};
- while (edgeObj = visitEdges.shift()) {
- var node = getNodeFromEdge(edgeObj);
- if (!visitedVertexMap[edgeObj.toVertex.get('id')]) {
- visitedVertexMap[edgeObj.toVertex.get('id')] = true;
- var outEdges = edgeObj.toVertex.get('outgoingEdges');
- outEdges.forEach(function(oe) {
- var childVertex = oe.get('toVertex');
- visitEdges.push({
- depth : node.depth + 1,
- parent : node,
- toVertex : childVertex
- });
- });
- }
- }
- edges.forEach(function(e) {
- dagVisualModel.links.push({
- source : vertexIdToNode[e.get('fromVertex.id')],
- target : vertexIdToNode[e.get('toVertex.id')],
- edgeType : e.get('edgeType')
- });
- });
- // Sort nodes so that parents stay together
- for ( var depth = 0; depth < depthToNodes.length; depth++) {
- var nodes = depthToNodes[depth];
- nodes.sort(function(n1, n2) {
- var ck1 = '';
- var ck2 = '';
- if (n1.children) {
- n1.children.forEach(function(c) {
- ck1 += c.name;
- });
- }
- if (n2.children) {
- n2.children.forEach(function(c) {
- ck2 += c.name;
- });
- }
- if (ck1 < ck2) {
- return -1
- }
- if (ck1 > ck2) {
- return 1
- }
- return 0
- });
- depthToNodes[depth] = nodes;
- }
-
- //
- // LAYOUT - Now with correct depth, we calculate layouts
- //
- // When a node's effective width changes, all its parent nodes are updated.
- var updateNodeEffectiveWidth = function(node, newEffectiveWidth) {
- console.debug("Updating effective width of (" + node.id + ") to " + newEffectiveWidth);
- if (numberUtils.validateInteger(node.effectiveWidth) != null) {
- node.effectiveWidth = newEffectiveWidth;
- }
- var diff = newEffectiveWidth - node.effectiveWidth;
- if (diff > 0) {
- var oldEffectiveWidth = node.effectiveWidth;
- node.effectiveWidth = newEffectiveWidth;
- if (node.parents != null) {
- node.parents.forEach(function(parent) {
- updateNodeEffectiveWidth(parent, parent.effectiveWidth + diff);
- })
- }
- }
- }
- var xGap = 20;
- var yGap = 70;
- var currentY = 40;
- // First pass - calculate layout widths, and Y coordinates
- for ( var depth = 0; depth < depthToNodes.length; depth++) {
- var nodes = depthToNodes[depth];
- var maxNodeHeight = 0;
- for ( var nodeIndex = 0; nodeIndex < nodes.length; nodeIndex++) {
- var node = nodes[nodeIndex];
- var nodeDim = this.getNodeCalculatedDimensions(node, minVertexDuration, maxVertexDuration);
- node.drawWidth = nodeDim.drawWidth;
- node.drawHeight = nodeDim.drawHeight;
- node.scale = nodeDim.scale;
- node.width = nodeDim.width;
- node.height = nodeDim.height;
- if (maxNodeHeight < node.height) {
- maxNodeHeight = node.height;
- }
- if (depth == 0) {
- // Top nodes - position uniformly
- updateNodeEffectiveWidth(node, xGap + node.width);
- }
- if (node.children && node.children.length > 0) {
- // There can be dedicated or shared children.
- // Dedicated children increase effective width of parent by their
- // width.
- // Shared children increase effective width of parent only by the
- // fraction of parentage
- var childrenWidth = 0;
- node.children.forEach(function(child) {
- var childDim = self.getNodeCalculatedDimensions(child, minVertexDuration, maxVertexDuration);
- childrenWidth += ((childDim.width + xGap) / child.parents.length);
- });
- updateNodeEffectiveWidth(node, Math.max(childrenWidth, (node.width+xGap)));
- } else {
- updateNodeEffectiveWidth(node, xGap + node.width);
- }
- node.y = currentY;
- node.incomingY = node.y;
- node.outgoingY = node.incomingY + node.height;
- }
- currentY += maxNodeHeight;
- currentY += yGap;
- }
- // Second pass - determine actual X coordinates
- var maxX = 0;
- for ( var depth = 0; depth < depthToNodes.length; depth++) {
- var nodes = depthToNodes[depth];
- var currentX = -1;
- var parentCurrentXMap = {};
- for ( var nodeIndex = 0; nodeIndex < nodes.length; nodeIndex++) {
- var node = nodes[nodeIndex];
- var parentsKey = null;
- if (node.parents != null && node.parents.length > 0) {
- var parentMidX = 0;
- var parentsKey = '';
- var childrenEffectiveWidth = -1;
- node.parents.forEach(function(parent) {
- parentMidX += (parent.x + (parent.width / 2));
- parentsKey += (parent.id + '//');
- if (childrenEffectiveWidth < 0) {
- parent.children.forEach(function(c){
- childrenEffectiveWidth += (c.effectiveWidth);
- });
- }
- });
- parentMidX = parentMidX / node.parents.length;
- var parentCurrentX = parentCurrentXMap[parentsKey];
- if (parentCurrentX == null || parentCurrentX == undefined) {
- parentCurrentX = parentMidX - (childrenEffectiveWidth/2);
- parentCurrentXMap[parentsKey] = parentCurrentX;
- }
- currentX = parentCurrentX;
- } else {
- if (currentX < 0) {
- currentX = 0;
- }
- }
- node.x = (currentX + (node.effectiveWidth - node.width) / 2);
- node.outgoingX = (node.x + node.width / 2);
- node.incomingX = node.outgoingX;
- console.log("drawTezDag(). Layout Node: ", node);
- dagVisualModel.nodes.push(node);
- if (parentsKey != null) {
- parentCurrentXMap[parentsKey] = currentX + node.effectiveWidth;
- } else {
- currentX += node.effectiveWidth;
- }
- if ((node.x + node.width) > maxX) {
- maxX = node.x + node.width;
- }
- }
- }
- var canvasHeight = currentY;
- var canvasWidth = maxX + (xGap << 1);
-
- //
- // Draw SVG
- //
- var force = d3.layout.force().nodes(dagVisualModel.nodes).links(dagVisualModel.links).start();
- var nodeDragData = {
- nodeRelativeX : 0,
- nodeRelativeY : 0
- };
- var nodeDrag = d3.behavior.drag().on('dragstart', function(node){
- d3.event.sourceEvent.stopPropagation();
- var rc = d3.mouse(this);
- nodeDragData.nodeRelativeX = (rc[0] * node.scale);
- nodeDragData.nodeRelativeY = (rc[1] * node.scale);
- }).on('drag', function(node){
- var nx = d3.event.x - nodeDragData.nodeRelativeX;
- var ny = d3.event.y - nodeDragData.nodeRelativeY;
- self.dragVertex(d3.select(this), node, [nx, ny], diagonal);
- }).on('dragend', function(){
- nodeDragData.nodeRelativeX = 0;
- nodeDragData.nodeRelativeY = 0;
- });
- // Create Links
- var diagonal = d3.svg.diagonal().source(function(d) {
- return {
- x : d.source.outgoingX,
- y : d.source.outgoingY
- };
- }).target(function(d) {
- return {
- x : d.target.incomingX,
- y : d.target.incomingY - 12
- }
- });
- var link = svgLayer.selectAll(".link-g").data(dagVisualModel.links).enter().append("g").attr("class", "link-g").attr("marker-end", "url(#arrow)");
- link.append("path").attr("class", function(l) {
- var classes = "link svg-tooltip ";
- if (l.edgeType) {
- classes += ("type-" + l.edgeType.toLowerCase() + " ");
- } else {
- classes += "type-unknown ";
- }
- return classes;
- }).attr("d", diagonal).attr("title", function(l) {
- var lower = l.edgeType ? l.edgeType.toLowerCase() : '';
- return Em.I18n.t("jobs.hive.tez.edge." + lower);
- });
- // Create Nodes
- var node = svgLayer.selectAll(".node").data(dagVisualModel.nodes).enter().append("g").attr("class", "node").call(nodeDrag);
- node.append("rect").attr("class", "background").attr("width", function(n) {
- return n.drawWidth;
- }).attr("height", function(n) {
- return n.drawHeight;
- }).attr("rx", "10").attr("filter", "url(#shadow)").on('mousedown', function(n) {
- var vertex = App.TezDagVertex.find(n.id);
- if (vertex != null) {
- self.get('parentView').doSelectVertex({
- context : vertex
- }, true);
- }
- });
- node.each(function(n, nodeIndex) {
- var ops = n.operations;
- var opCount = {};
- if (ops != null && ops.length > 0) {
- var opGroups = d3.select(this).selectAll(".operation").data(ops).enter().append("g").attr("class", "operation").attr("transform", function(op, opIndex) {
- var row = Math.floor(opIndex / 3);
- var column = opIndex % 3;
- return "translate(" + (10 + column * 55) + "," + (37 + row * 20) + ")";
- }).attr("clip-path", "url(#operatorClipPath)").attr("opIndex", function(op){
- if(!opCount[op]) {
- opCount[op] = 1;
- } else {
- opCount[op] = opCount[op]+1;
- }
- return opCount[op];
- }).on('mouseover', function(op) {
- var viewContent = {
- operationName: op,
- operatorPlanObj: []
- };
- var opIndex = this.getAttribute('opIndex');
- var operatorPlanObj = self.createOperationPlanObj(n.name, op, opIndex);
- viewContent.operatorPlanObj = operatorPlanObj;
- var template = App.HoverOpTable.create({content: viewContent}) ;
- $(this).find('.svg-tooltip').attr('title', template.renderToBuffer().string()).tooltip('fixTitle').tooltip('show');
- })
-
- opGroups.append("rect").attr("class", "operation svg-tooltip ").attr("width", "50").attr("height", "16");
- opGroups.append("text").attr("x", "2").attr("dy", "1em").text(function(op) {
- return op != null ? op.split(' ')[0] : '';
- });
- }
- });
- var metricNodes = node.append("g").attr("class", "metric").attr("transform", "translate(112,7)");
- metricNodes.append("rect").attr("width", function(n) {
- if (n.type == App.TezDagVertexType.UNION) {
- return 0;
- }
- return 60;
- }).attr("height", function(n) {
- if (n.type == App.TezDagVertexType.UNION) {
- return 0;
- }
- return 18;
- }).attr("rx", "3").attr("class", "metric-title svg-tooltip");
- metricNodes.append("text").attr("class", "metric-text").attr("x", "2").attr("dy", "1em");
- node.append("text").attr("x", "1.9em").attr("dy", "1.5em").text(function(d) {
- return d.name;
- });
- var iconContainer = node.append('g').attr('class', 'vertex-icon-container').attr('transform', 'translate(10,10)');
- iconContainer.append('rect').attr('width', '1em').attr('height', '1em').attr('class', 'vertex-icon-rect svg-tooltip ');
- iconContainer.append('text').attr('dy', '10px').attr("font-family", "FontAwesome").attr('class', 'vertex-icon-text');
- node.attr("transform", function(d) {
- return "translate(" + d.x + "," + d.y + ") scale("+d.scale+") ";
- });
- this.vertexMetricsUpdated();
- $('.svg-tooltip').each(function() {
- var item = $(this);
- if (item.prop('tagName') == 'path') {
- item.hover(function(e) {
- var offset = $(this).offset();
- item.prop('offsetWidth', function() {
- return 2 * (e.pageX - offset.left);
- });
- item.prop('offsetHeight', function() {
- return 2 * (e.pageY - offset.top);
- });
- });
- };
- if (item.prop('offsetWidth') == undefined) {
- item.prop('offsetWidth', function() {
- return item.width();
- });
- };
- if (item.prop('offsetHeight') == undefined) {
- item.prop('offsetHeight', function() {
- return item.height();
- });
- };
- });
- App.tooltip($('.svg-tooltip'), {
- placement : 'left',
- template: '<div class="tooltip jobs-tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
- });
-
- if (App.supports.debugJobsDag) {
- // Draws node bounding box - for debug purposes
- node.append("rect").attr("width", function(n) {
- return n.effectiveWidth;
- }).attr("height", function(n) {
- return n.height;
- }).attr("x", function(n) {
- return -1 * ((n.effectiveWidth - n.width) / 2);
- }).attr("y", function(n) {
- return 0;
- }).attr("style", "opacity: 0.2;fill:yellow;");
- }
-
- // Position in center
- var translateX = Math.round((width - canvasWidth) / 2);
- if (translateX > 0) {
- svgLayer.attr("transform", "translate("+translateX+",0)");
- }
- return {
- width : canvasWidth,
- height : canvasHeight
- }
- },
-
- dragVertex: function(d3Vertex, node, newPosition, diagonal){
- console.debug("Dragging vertex [", node.name, "] to (", newPosition[0], ",", newPosition[1], ")");
- // Move vertex
- node.x = newPosition[0];
- node.y = newPosition[1];
- node.incomingX = newPosition[0] + (node.width/2);
- node.incomingY = newPosition[1];
- node.outgoingX = newPosition[0] + (node.width/2);
- node.outgoingY = newPosition[1] + node.height;
- d3Vertex.attr('transform', 'translate(' + newPosition[0] + ',' + newPosition[1] + ') scale('+node.scale+') ');
- // Move links
- d3.selectAll('.link').filter(function(l) {
- if (l && (l.source === node || l.target === node)) {
- return this
- }
- return null;
- }).attr('d', diagonal);
- },
-
- /**
- * Refreshes UI of the Tez graph with latest values
- */
- refreshGraphUI: function () {
- var svgLayer = this.get('svgVerticesLayer');
- if (svgLayer!=null) {
- var self = this;
- var metricNodes = svgLayer.selectAll(".metric");
- var metricNodeTexts = svgLayer.selectAll(".metric-text");
- var metricNodeTitles = svgLayer.selectAll(".metric-title");
- var nodeBackgrounds =svgLayer.selectAll(".background");
- var vertexIconTexts = svgLayer.selectAll(".vertex-icon-text");
- var vertexIconRects = svgLayer.selectAll(".vertex-icon-rect");
- metricNodes.attr("class", function(node) {
- var classes = "metric ";
- var percent = node.metricPercent;
- if (numberUtils.validateInteger(percent) == null && percent >= 0) {
- if (percent <= 20) {
- classes += "heat-0-20 ";
- } else if (percent <= 40) {
- classes += "heat-20-40 ";
- } else if (percent <= 60) {
- classes += "heat-40-60 ";
- } else if (percent <= 80) {
- classes += "heat-60-80 ";
- } else if (percent <= 100) {
- classes += "heat-80-100 ";
- } else {
- classes += "heat-none";
- }
- } else {
- classes += "heat-none";
- }
- return classes;
- });
- metricNodeTexts.text(function(node){
- if (node.type == App.TezDagVertexType.UNION) {
- return '';
- }
- return node.metricDisplay;
- });
- metricNodeTitles.attr("title", function(node){
- return node.metricType;
- }).attr("data-original-title", function(node){
- return node.metricType;
- });
- nodeBackgrounds.attr("class", function(n) {
- var classes = "background ";
- if (n.type) {
- classes += (n.type.toLowerCase() + " ");
- } else {
- classes += "unknown-vertex-type ";
- }
- if (n.selected) {
- classes += "selected ";
- }
- return classes;
- });
- vertexIconRects.attr('title', function(node) {
- return stringUtils.getCamelCase(node.state);
- }).attr('data-original-title', function(node) {
- return stringUtils.getCamelCase(node.state);
- });
- vertexIconTexts.text(function(n) {
- return self.getVertexIcon(n)
- }).attr('class', function(n) {
- var classes = 'vertex-icon-text ';
- if (n.state != null) {
- if (n.state == App.TezDagVertexState.JOBFAILED) {
- classes += App.TezDagVertexState.FAILED.toLowerCase();
- } else {
- classes += n.state.toLowerCase();
- };
- };
- return classes;
- });
- }
- },
-
- getVertexIcon : function(node){
- var icon = "";
- switch (node.state) {
- case App.TezDagVertexState.NEW:
- icon = '\uF10C'; //icon-circle-blank
- case App.TezDagVertexState.RUNNING:
- case App.TezDagVertexState.FAILED:
- icon = '\uF111'; //icon-circle
- break;
- case App.TezDagVertexState.SUCCEEDED:
- icon = '\uF00C'; //icon-ok
- break;
- case App.TezDagVertexState.KILLED:
- case App.TezDagVertexState.ERROR:
- icon = '\uF057'; //icon-remove-sign
- break;
- case App.TezDagVertexState.INITED:
- case App.TezDagVertexState.INITIALIZING:
- case App.TezDagVertexState.TERMINATING:
- icon = '\uF141'; //icon-ellipsis-horizontal
- break;
- case App.TezDagVertexState.JOBFAILED:
- icon = '\uF05C'; //icon-remove-circle
- break;
- }
- return icon;
- },
-
- /**
- * Determines the size of a node by taking into account its duration and
- * number of operations performed.
- *
- * @return {Object} Provides various metrics necessary in drawing a node.
- * <code>
- * {
- * width: 360, // Scaled width of the node
- * height: 80, // Scaled height of the node
- * scale: 2, // Scale used on vertex dimensions. Quickest vertex is scaled to 1 and slowest vertex is scaled to 10.
- * drawWidth: 180, // Width of actual drawing (that will be scaled)
- * drawHeight: 40 // Height of actual drawing (that will be scaled)
- * }
- * </code>
- */
- getNodeCalculatedDimensions : function(node, minVertexDuration, maxVertexDuration) {
- var size = {
- width : 180,
- height : 40,
- drawWidth : 180,
- drawHeight : 40,
- scale : 1
- }
- if (node.operations && node.operations.length > 0) {
- var opsHeight = Math.ceil(node.operations.length / 3);
- size.drawHeight += (opsHeight * 20);
- }
- size.width = size.drawWidth * size.scale;
- size.height = size.drawHeight * size.scale;
- return size;
- }
-
-});
-
-App.HoverOpTable = Ember.View.extend({
- templateName : require('templates/main/jobs/hover_op_table')
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/views/main/jobs/hive_job_details_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/jobs/hive_job_details_view.js b/ambari-web/app/views/main/jobs/hive_job_details_view.js
deleted file mode 100644
index d22ed20..0000000
--- a/ambari-web/app/views/main/jobs/hive_job_details_view.js
+++ /dev/null
@@ -1,351 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-var date = require('utils/date');
-var numberUtils = require('utils/number_utils');
-var dateUtils = require('utils/date');
-var stringUtils = require('utils/string_utils');
-var sort = require('views/common/sort_view');
-
-App.MainHiveJobDetailsView = Em.View.extend({
- templateName : require('templates/main/jobs/hive_job_details'),
-
- selectedVertex : null,
- content : null,
- zoomScaleFrom : 1,
- zoomScaleTo: 2,
- zoomScale : 1,
- showQuery : false,
-
- zoomStep : function() {
- var zoomStep = 0.01;
- var zoomFrom = this.get('zoomScaleFrom');
- var zoomTo = this.get('zoomScaleTo');
- if (zoomFrom < zoomTo) {
- zoomStep = (zoomTo - zoomFrom) / 5;
- }
- return zoomStep;
- }.property('zoomScaleFrom', 'zoomScaleTo'),
- isGraphMaximized: false,
-
- toggleShowQuery : function () {
- this.toggleProperty('showQuery');
- var queryBlock = $('.query-info');
- if (this.get('showQuery')) {
- queryBlock.slideDown();
- } else {
- queryBlock.slideUp();
- };
- },
-
- toggleShowQueryText : function () {
- return this.get('showQuery') ? Em.I18n.t('jobs.hive.less') : Em.I18n.t('jobs.hive.more');
- }.property('showQuery'),
-
- summaryMetricType: 'input',
- summaryMetricTypesDisplay : [
- Em.I18n.t('jobs.hive.tez.metric.input'),
- Em.I18n.t('jobs.hive.tez.metric.output'),
- /* Em.I18n.t('jobs.hive.tez.metric.recordsRead'),
- Em.I18n.t('jobs.hive.tez.metric.recordsWrite'), */
- Em.I18n.t('jobs.hive.tez.metric.tezTasks'),
- Em.I18n.t('jobs.hive.tez.metric.spilledRecords')
- ],
- summaryMetricTypeDisplay: function(){
- return Em.I18n.t('jobs.hive.tez.metric.'+this.get('summaryMetricType'));
- }.property('summaryMetricType'),
-
- sortedVertices : function() {
- var sortColumn = this.get('controller.sortingColumn');
- if(sortColumn && sortColumn.get('status')){
- var sortColumnStatus = sortColumn.get('status');
- var sorted = sortColumn.get('parentView').sort(sortColumn, sortColumnStatus === "sorting_desc", true);
- sortColumn.set('status', sortColumnStatus);
- return sorted;
- }
- var vertices = this.get('controller.content.tezDag.vertices');
- if (vertices != null) {
- vertices = vertices.toArray();
- return vertices;
- }
- return vertices;
- }.property('content.tezDag.vertices','controller.sortingColumn'),
-
- initialDataLoaded : function() {
- var loaded = this.get('controller.loaded');
- if (loaded) {
- this.set('content', this.get('controller.content'));
- }
- }.observes('controller.loaded'),
-
- yarnApplicationIdLink : function() {
- var yarnService = App.YARNService.find().objectAt(0);
- var appId = this.get('content.tezDag.yarnApplicationId');
- if (yarnService != null) {
- var quickLinksView = App.QuickViewLinks.create();
- try {
- quickLinksView.set('content', yarnService);
- quickLinksView.setQuickLinks();
- var links = quickLinksView.get('quickLinks');
- if (links && links.length > 0) {
- var rmUILink = links.findProperty('label', 'ResourceManager UI');
- if (rmUILink != null) {
- return rmUILink.get('url') + '/cluster/app/' + appId;
- }
- }
- } finally {
- quickLinksView.destroy();
- quickLinksView = null;
- }
- }
- return null;
- }.property('content.tezDag.yarnApplicationId', 'App.YARNService.resourceManager.hostName'),
-
- jobObserver : function() {
- var content = this.get('content');
- var selectedVertex = this.get('selectedVertex');
- if (selectedVertex == null && content != null) {
- var vertices = content.get('tezDag.vertices');
- if (vertices) {
- vertices.setEach('isSelected', false);
- this.doSelectVertex({
- context : vertices.objectAt(0)
- }, false);
- }
- }
- }.observes('selectedVertex', 'content.tezDag.vertices.@each.id'),
-
- doSelectVertex : function(event,notTableClick) {
- notTableClick = notTableClick ? true : false;
- var newVertex = event.context;
- var currentVertex = this.get('selectedVertex');
- if (currentVertex != null) {
- currentVertex.set('isSelected', false);
- }
- newVertex.set('notTableClick', notTableClick);
- newVertex.set('isSelected', true);
- this.set('selectedVertex', newVertex);
- },
-
- doSelectSummaryMetricType: function(event) {
- var summaryType = event.context;
- switch (summaryType) {
- case Em.I18n.t('jobs.hive.tez.metric.input'):
- summaryType = 'input';
- break;
- case Em.I18n.t('jobs.hive.tez.metric.output'):
- summaryType = 'output';
- break;
- case Em.I18n.t('jobs.hive.tez.metric.recordsRead'):
- summaryType = 'recordsRead';
- break;
- case Em.I18n.t('jobs.hive.tez.metric.recordsWrite'):
- summaryType = 'recordsWrite';
- break;
- case Em.I18n.t('jobs.hive.tez.metric.tezTasks'):
- summaryType = 'tezTasks';
- break;
- case Em.I18n.t('jobs.hive.tez.metric.spilledRecords'):
- summaryType = 'spilledRecords';
- break;
- default:
- break;
- }
- this.set('summaryMetricType', summaryType);
- },
-
- /**
- * Provides display information for vertex I/O.
- *
- * {
- * 'file': {
- * 'read': {
- * 'ops': '100 reads',
- * 'bytes': '10 MB'
- * }
- * 'write: {
- * 'ops': '200 writes',
- * 'bytes': '20 MB'
- * }
- * },
- * 'hdfs': {
- * 'read': {
- * 'ops': '100 reads',
- * 'bytes': '10 MB'
- * }
- * 'write: {
- * 'ops': '200 writes',
- * 'bytes': '20 MB'
- * }
- * },
- * 'records': {
- * 'read': '100 records',
- * 'write': '123 records'
- * },
- * 'started': 'Feb 12, 2014 10:30am',
- * 'ended': 'Feb 12, 2014 10:35am',
- * 'status': 'Running'
- * }
- */
- selectedVertexIODisplay : function() {
- var v = this.get('selectedVertex');
- var status = v.get('state');
- if (status) {
- status = stringUtils.getCamelCase(status);
- }
- var fileReadOps = v.get('fileReadOps');
- var fileWriteOps = v.get('fileWriteOps');
- var hdfsReadOps = v.get('hdfsReadOps');
- var hdfsWriteOps = v.get('hdfsWriteOps');
- var naString = Em.I18n.t('common.na');
- if (fileReadOps === null) {
- fileReadOps = naString;
- }
- if (fileWriteOps === null) {
- fileWriteOps = naString;
- }
- if (hdfsReadOps === null) {
- hdfsReadOps = naString;
- }
- if (hdfsWriteOps === null) {
- hdfsWriteOps = naString;
- }
- return {
- file : {
- read : {
- ops : Em.I18n.t('jobs.hive.tez.reads').format(fileReadOps),
- bytes : numberUtils.bytesToSize(v.get('fileReadBytes'))
- },
- write : {
- ops : Em.I18n.t('jobs.hive.tez.writes').format(fileWriteOps),
- bytes : numberUtils.bytesToSize(v.get('fileWriteBytes'))
- }
- },
- hdfs : {
- read : {
- ops : Em.I18n.t('jobs.hive.tez.reads').format(hdfsReadOps),
- bytes : numberUtils.bytesToSize(v.get('hdfsReadBytes'))
- },
- write : {
- ops : Em.I18n.t('jobs.hive.tez.writes').format(hdfsWriteOps),
- bytes : numberUtils.bytesToSize(v.get('hdfsWriteBytes'))
- }
- },
- records : {
- read : v.get('recordReadCount') == null ? null : Em.I18n.t('jobs.hive.tez.records.count').format(v.get('recordReadCount')),
- write : v.get('recordWriteCount') == null ? null : Em.I18n.t('jobs.hive.tez.records.count').format(v.get('recordWriteCount'))
- },
- started: v.get('startTime') ? dateUtils.dateFormat(v.get('startTime'), 'ddd, MMM DD, YYYY HH:mm:ss:SSS') : '',
- ended: v.get('endTime') ? dateUtils.dateFormat(v.get('endTime'), 'ddd, MMM DD, YYYY HH:mm:ss:SSS') : '',
- status: status
- };
- }.property('selectedVertex.fileReadOps', 'selectedVertex.fileWriteOps', 'selectedVertex.hdfsReadOps', 'selectedVertex.hdfdWriteOps',
- 'selectedVertex.fileReadBytes', 'selectedVertex.fileWriteBytes', 'selectedVertex.hdfsReadBytes', 'selectedVertex.hdfdWriteBytes',
- 'selectedVertex.recordReadCount', 'selectedVertex.recordWriteCount', 'selectedVertex.status'),
-
- canGraphZoomIn : function() {
- var zoomTo = this.get('zoomScaleTo');
- var zoomScale = this.get('zoomScale');
- console.debug("canGraphZoomIn? : ", (zoomScale < zoomTo), " (scaleTo=", zoomTo,", scale=",zoomScale,")");
- return zoomScale < zoomTo;
- }.property('zoomScale', 'zoomScaleTo'),
-
- canGraphZoomOut : function() {
- var zoomFrom = this.get('zoomScaleFrom');
- var zoomScale = this.get('zoomScale');
- console.debug("canGraphZoomOut? : ", (zoomScale > zoomFrom), " (scaleFrom=", zoomFrom,", scale=",zoomScale,")");
- return zoomScale > zoomFrom;
- }.property('zoomScale', 'zoomScaleFrom'),
-
- doGraphZoomIn: function() {
- var zoomTo = this.get('zoomScaleTo');
- var zoomScale = this.get('zoomScale');
- var zoomStep = this.get('zoomStep');
- if (zoomScale < zoomTo) {
- var step = Math.min(zoomStep, (zoomTo - zoomScale));
- zoomScale += step;
- console.debug("doGraphZoomIn(): New scale = ", zoomScale);
- this.set('zoomScale', zoomScale);
- }
- },
-
- doGraphZoomOut: function() {
- var zoomFrom = this.get('zoomScaleFrom');
- var zoomScale = this.get('zoomScale');
- var zoomStep = this.get('zoomStep');
- if (zoomScale > zoomFrom) {
- var step = Math.min(zoomStep, (zoomScale - zoomFrom));
- zoomScale -= step;
- console.debug("doGraphZoomOut(): New scale = ", zoomScale);
- this.set('zoomScale', zoomScale);
- }
- },
-
- doGraphMaximize: function() {
- this.set('isGraphMaximized', true);
- },
-
- doGraphMinimize: function() {
- this.set('isGraphMaximized', false);
- }
-});
-
-App.MainHiveJobDetailsVerticesTableView = App.TableView.extend({
- sortView: sort.wrapperView,
-
- didInsertElement: function () {
- if(!this.get('controller.sortingColumn')){
- var columns = this.get('childViews')[0].get('childViews');
- if(columns && columns.findProperty('name', 'name')){
- columns.findProperty('name','name').set('status', 'sorting_asc');
- this.get('controller').set('sortingColumn', columns.findProperty('name','name'))
- }
- }
- },
-
- nameSort: sort.fieldView.extend({
- column: 0,
- name: 'name',
- displayName: Em.I18n.t('common.name'),
- type: 'string'
- }),
- tasksSort: sort.fieldView.extend({
- column: 1,
- name: 'tasksNumber',
- displayName: Em.I18n.t('common.tasks'),
- type: 'number'
- }),
- inputSort: sort.fieldView.extend({
- column: 2,
- name: 'totalReadBytes',
- displayName: Em.I18n.t('apps.item.dag.input'),
- type: 'number'
- }),
- outputSort: sort.fieldView.extend({
- column: 3,
- name: 'totalWriteBytes',
- displayName: Em.I18n.t('apps.item.dag.output'),
- type: 'number'
- }),
- durationSort: sort.fieldView.extend({
- column: 4,
- name: 'duration',
- displayName: Em.I18n.t('apps.item.dag.duration'),
- type: 'number'
- })
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/views/main/jobs/select_custom_date_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/jobs/select_custom_date_view.js b/ambari-web/app/views/main/jobs/select_custom_date_view.js
deleted file mode 100644
index d0c03ef..0000000
--- a/ambari-web/app/views/main/jobs/select_custom_date_view.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-var date = require('utils/date');
-
-App.JobsCustomDatesSelectView = Em.View.extend({
- name: 'jobsCustomDatesSelectView',
- templateName: require('templates/main/jobs/custom_dates_popup'),
-
- middayPeriodOptions: [Em.I18n.t('jobs.table.custom.date.am'), Em.I18n.t('jobs.table.custom.date.pm')],
-
- hourOptions: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
-
- minuteOptions: ['00', '05', '10', '15', '20', '25', '30', '35', '40', '45', '50', '55'],
-
- didInsertElement: function () {
- $('.datepicker').datepicker({
- format: 'mm/dd/yyyy'
- });
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/views/main/jobs_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/jobs_view.js b/ambari-web/app/views/main/jobs_view.js
deleted file mode 100644
index ea6cec9..0000000
--- a/ambari-web/app/views/main/jobs_view.js
+++ /dev/null
@@ -1,336 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-var filters = require('views/common/filter_view');
-var sort = require('views/common/sort_view');
-
-App.MainJobsView = App.TableView.extend({
- templateName: require('templates/main/jobs'),
-
- content: [],
-
-
- /**
- * If no jobs table rows to show.
- */
- noDataToShow:true,
-
- filterCondition:[],
-
- /*
- If no jobs to display set noDataToShow to true, else set emptyData to false.
- */
- noDataToShowObserver: function () {
- if(this.get("controller.content.length") > 0){
- this.set("noDataToShow",false);
- }else{
- this.set("noDataToShow",true);
- }
- }.observes("controller.content.length"),
-
- willInsertElement: function () {
- this._super();
- var self = this;
- var name = this.get('controller.name');
- var colPropAssoc = this.get('colPropAssoc');
- var filterConditions = App.db.getFilterConditions(name);
- if (filterConditions) {
- this.set('filterConditions', filterConditions);
- var childViews = this.get('childViews');
-
- filterConditions.forEach(function(condition) {
- var view = !Em.isNone(condition.iColumn) && childViews.findProperty('column', condition.iColumn);
- if (view) {
- //self.get('controller.filterObject').set(colPropAssoc[condition.iColumn], condition.value);
- view.set('value', condition.value);
- if(view.get('setPropertyOnApply')){
- view.setValueOnApply();
- }
- Em.run.next(function() {
- view.showClearFilter();
- });
- }
- });
- } else {
- this.clearFilters();
- }
- this.onApplyIdFilter();
- this.set('tableFilteringComplete', true);
- },
-
- didInsertElement: function () {
- if(!this.get('controller.sortingColumn')){
- var columns = this.get('childViews')[0].get('childViews')
- if(columns && columns.findProperty('name', 'startTime')){
- columns.findProperty('name','startTime').set('status', 'sorting_desc');
- this.get('controller').set('sortingColumn', columns.findProperty('name','startTime'))
- }
- }
- },
-
- onApplyIdFilter: function() {
- var isIdFilterApplied = this.get('controller.filterObject.isIdFilterApplied');
- this.get('childViews').forEach(function(childView) {
- if (childView['clearFilter'] && childView.get('column') != 1) {
- if(isIdFilterApplied){
- childView.clearFilter();
- }
- var childOfChild = childView.get('childViews')[0];
- if(childOfChild){
- Em.run.next(function() {
- childOfChild.set('disabled', isIdFilterApplied);
- })
- }
- }
- });
- }.observes('controller.filterObject.isIdFilterApplied'),
-
- saveFilter: function () {
- if(this.get('tableFilteringComplete')){
- this.updateFilter(1, this.get('controller.filterObject.id'), 'string');
- this.updateFilter(2, this.get('controller.filterObject.user'), 'string');
- this.updateFilter(4, this.get('controller.filterObject.windowEnd'), 'date');
- }
- }.observes(
- 'controller.filterObject.id',
- 'controller.filterObject.user',
- 'controller.filterObject.windowEnd'
- ),
-
- sortView: sort.wrapperView,
- idSort: sort.fieldView.extend({
- column: 1,
- name: 'id',
- displayName: Em.I18n.t('jobs.column.id'),
- type: 'string'
- }),
- userSort: sort.fieldView.extend({
- column: 2,
- name: 'user',
- displayName: Em.I18n.t('jobs.column.user'),
- type: 'string'
- }),
- startTimeSort: sort.fieldView.extend({
- column: 3,
- name: 'startTime',
- displayName: Em.I18n.t('jobs.column.start.time'),
- type: 'number'
- }),
- endTimeSort: sort.fieldView.extend({
- column: 4,
- name: 'endTime',
- displayName: Em.I18n.t('jobs.column.end.time'),
- type: 'number'
- }),
- durationSort: sort.fieldView.extend({
- column: 5,
- name: 'duration',
- displayName: Em.I18n.t('jobs.column.duration'),
- type: 'number'
- }),
-
- /**
- * Select View with list of "rows-per-page" options
- * @type {Ember.View}
- */
- rowsPerPageSelectView: Em.Select.extend({
- content: ['10', '25', '50', '100', "250", "500"],
- valueBinding: "controller.filterObject.jobsLimit",
- attributeBindings: ['disabled'],
- disabled: false,
- disabledObserver: function () {
- if (this.get("parentView.hasBackLinks")) {
- this.set('disabled', true);
- }else{
- this.set('disabled', false);
- }
- }.observes('parentView.hasBackLinks'),
- change: function () {
- this.get('controller').set('navIDs.nextID', '');
- this.get('parentView').saveDisplayLength();
- }
- }),
-
- /**
- * return filtered number of all content number information displayed on the page footer bar
- * @returns {String}
- */
- filteredJobs: function () {
- return Em.I18n.t('jobs.filtered.jobs').format(this.get('controller.content.length'));
- }.property('controller.content.length', 'controller.totalOfJobs'),
-
- pageContentObserver: function () {
- if (!this.get('controller.loading')) {
- if ($('.tooltip').length) {
- Ember.run.later(this, function() {
- if ($('.tooltip').length > 1) {
- $('.tooltip').first().remove();
- };
- }, 500);
- };
- };
- }.observes('controller.loading'),
-
- init: function() {
- this._super();
- App.tooltip($('body'), {
- selector: '[rel="tooltip"]',
- template: '<div class="tooltip jobs-tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
- placement: 'bottom'
- });
- },
-
- willDestroyElement : function() {
- $('.tooltip').remove();
- },
-
- /**
- * Filter-field for Jobs ID.
- * Based on <code>filters</code> library
- */
- jobsIdFilterView: filters.createTextView({
- column: 1,
- showApply: true,
- setPropertyOnApply: 'controller.filterObject.id'
- }),
-
- /**
- * Filter-list for User.
- * Based on <code>filters</code> library
- */
- userFilterView: filters.createTextView({
- column: 2,
- fieldType: 'input-small',
- showApply: true,
- setPropertyOnApply: 'controller.filterObject.user'
- }),
-
- /**
- * Filter-field for Start Time.
- * Based on <code>filters</code> library
- */
- startTimeFilterView: filters.createSelectView({
- fieldType: 'input-120',
- column: 3,
- content: ['Any', 'Past 1 hour', 'Past 1 Day', 'Past 2 Days', 'Past 7 Days', 'Past 14 Days', 'Past 30 Days', 'Custom'],
- valueBinding: "controller.filterObject.startTime",
- onChangeValue: function () {
- this.get('parentView').updateFilter(this.get('column'), this.get('value'), 'date');
- }
- }),
-
- jobNameView: Em.View.extend({
- classNames: ['job-link'],
- tagName: 'a',
- classNameBindings: ['isLink'],
- attributeBindings: ['rel', 'job.queryText:data-original-title', 'href'],
- rel: 'tooltip',
- href: '#',
- isLink: 'is-not-link',
- isLinkObserver: function () {
- this.refreshLinks();
- }.observes('controller.sortingDone'),
- refreshLinks: function () {
- if (this.get('job.hasTezDag')) {
- this.set('isLink', "");
- }else{
- this.set('isLink', "is-not-link");
- }
- },
- template: Ember.Handlebars.compile('{{job.name}}'),
- click: function(event) {
- if (this.get('job.hasTezDag')) {
- App.router.transitionTo('main.jobs.jobDetails', this.get('job'));
- };
- return false;
- },
- didInsertElement: function () {
- this.refreshLinks();
- }
- }),
-
- /**
- * associations between content (jobs list) property and column index
- */
- colPropAssoc: function () {
- var associations = [];
- associations[1] = 'id';
- associations[2] = 'user';
- associations[3] = 'startTime';
- associations[4] = 'endTime';
- return associations;
- }.property(),
-
- clearFilters: function() {
- this.get('childViews').forEach(function(childView) {
- if (childView['clearFilter']) {
- childView.clearFilter();
- }
- });
- },
-
- jobFailMessage: function() {
- return Em.I18n.t('jobs.table.job.fail');
- }.property(),
-
- jobsPaginationLeft: Ember.View.extend({
- tagName: 'a',
- template: Ember.Handlebars.compile('<i class="icon-arrow-left"></i>'),
- classNameBindings: ['class'],
- class: function () {
- if (this.get("parentView.hasBackLinks") && !this.get('controller.filterObject.isAnyFilterApplied')) {
- return "paginate_previous";
- }
- return "paginate_disabled_previous";
- }.property('parentView.hasBackLinks', 'controller.filterObject.isAnyFilterApplied'),
-
- click: function () {
- if (this.get("parentView.hasBackLinks") && !this.get('controller.filterObject.isAnyFilterApplied')) {
- this.get('controller').navigateBack();
- }
- }
- }),
-
- jobsPaginationRight: Ember.View.extend({
- tagName: 'a',
- template: Ember.Handlebars.compile('<i class="icon-arrow-right"></i>'),
- classNameBindings: ['class'],
- class: function () {
- if (this.get("parentView.hasNextJobs") && !this.get('controller.filterObject.isAnyFilterApplied')) {
- return "paginate_next";
- }
- return "paginate_disabled_next";
- }.property("parentView.hasNextJobs", 'controller.filterObject.isAnyFilterApplied'),
-
- click: function () {
- if (this.get("parentView.hasNextJobs") && !this.get('controller.filterObject.isAnyFilterApplied')) {
- this.get('controller').navigateNext();
- }
- }
- }),
-
- hasNextJobs: function() {
- return (this.get("controller.navIDs.nextID.length") > 0);
- }.property('controller.navIDs.nextID'),
-
- hasBackLinks: function() {
- return (this.get("controller.navIDs.backIDs").length > 1);
- }.property('controller.navIDs.backIDs.[].length')
-
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/views/main/menu.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/menu.js b/ambari-web/app/views/main/menu.js
index 9ac0f40..b81c90c 100644
--- a/ambari-web/app/views/main/menu.js
+++ b/ambari-web/app/views/main/menu.js
@@ -48,9 +48,6 @@ App.MainMenuView = Em.CollectionView.extend({
if (!App.get('isHadoop2Stack')) {
result.push({ label:Em.I18n.t('menu.item.jobs'), routing:'apps'});
- } else if( App.router.get('mainAdminController.isAccessAvailable') && App.supports.jobs
- && (App.router.get('mainAdminAccessController.showJobs') || App.get('isAdmin'))) {
- result.push({ label:Em.I18n.t('menu.item.jobs'), routing:'jobs'});
}
if (App.get('isAdmin')) {
@@ -65,7 +62,7 @@ App.MainMenuView = Em.CollectionView.extend({
}
return result;
- }.property('App.router.loggedIn', 'App.router.clusterController.isLoaded', 'App.supports.views', 'App.supports.mirroring', 'App.supports.secureCluster', 'App.supports.highAvailability', 'App.supports.jobs'),
+ }.property('App.router.loggedIn', 'App.router.clusterController.isLoaded', 'App.supports.views', 'App.supports.mirroring', 'App.supports.secureCluster', 'App.supports.highAvailability'),
/**
* Adds observer on lastSetURL and calls navigation sync procedure
[2/2] git commit: AMBARI-6840. Jobs View: Update Top Nav rendering
for jobs (srimanth)
Posted by sr...@apache.org.
AMBARI-6840. Jobs View: Update Top Nav rendering for jobs (srimanth)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/71d91a7c
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/71d91a7c
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/71d91a7c
Branch: refs/heads/trunk
Commit: 71d91a7c50c2df8880b0ac3bcae32c579c31d361
Parents: 952c364
Author: Srimanth Gunturi <sg...@hortonworks.com>
Authored: Tue Aug 12 18:14:41 2014 -0700
Committer: Srimanth Gunturi <sg...@hortonworks.com>
Committed: Wed Aug 13 14:03:32 2014 -0700
----------------------------------------------------------------------
ambari-web/app/config.js | 1 -
ambari-web/app/controllers.js | 2 -
.../controllers/main/admin/access_controller.js | 6 +-
.../main/jobs/hive_job_details_controller.js | 87 --
.../app/controllers/main/jobs_controller.js | 497 ----------
ambari-web/app/initialize.js | 1 -
ambari-web/app/mappers.js | 2 -
ambari-web/app/mappers/jobs/hive_job_mapper.js | 216 -----
ambari-web/app/mappers/jobs/hive_jobs_mapper.js | 100 --
ambari-web/app/models.js | 3 -
ambari-web/app/models/jobs/hive_job.js | 29 -
ambari-web/app/models/jobs/job.js | 80 --
ambari-web/app/models/jobs/tez_dag.js | 189 ----
ambari-web/app/routes/main.js | 41 -
ambari-web/app/templates/main/admin/access.hbs | 4 -
ambari-web/app/templates/main/jobs.hbs | 101 --
.../templates/main/jobs/custom_dates_popup.hbs | 39 -
.../templates/main/jobs/hive_job_details.hbs | 215 -----
.../main/jobs/hive_job_details_tez_dag.hbs | 44 -
.../app/templates/main/jobs/hover_op_table.hbs | 39 -
.../app/templates/main/jobs/user_filter.hbs | 34 -
ambari-web/app/utils/jobs.js | 263 ------
ambari-web/app/views.js | 4 -
.../main/jobs/hive_job_details_tez_dag_view.js | 946 -------------------
.../views/main/jobs/hive_job_details_view.js | 351 -------
.../views/main/jobs/select_custom_date_view.js | 37 -
ambari-web/app/views/main/jobs_view.js | 336 -------
ambari-web/app/views/main/menu.js | 5 +-
28 files changed, 4 insertions(+), 3668 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/config.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/config.js b/ambari-web/app/config.js
index a4c71d4..f4e882a 100644
--- a/ambari-web/app/config.js
+++ b/ambari-web/app/config.js
@@ -75,7 +75,6 @@ App.supports = {
deleteHost: true,
autoRollbackHA: false,
appTimelineServer: true,
- jobs: true,
ubuntu: true,
views: true,
flume: true,
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/controllers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers.js b/ambari-web/app/controllers.js
index 9e915a6..3601cd2 100644
--- a/ambari-web/app/controllers.js
+++ b/ambari-web/app/controllers.js
@@ -117,8 +117,6 @@ require('controllers/main/charts/heatmap_metrics/heatmap_metric_hbase_regions');
require('controllers/main/charts/heatmap_metrics/heatmap_metric_hbase_memstoresize');
require('controllers/main/charts/heatmap');
require('controllers/main/apps_controller');
-require('controllers/main/jobs_controller');
-require('controllers/main/jobs/hive_job_details_controller');
require('controllers/main/apps/item_controller');
require('controllers/main/mirroring_controller');
require('controllers/main/mirroring/edit_dataset_controller');
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/controllers/main/admin/access_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/admin/access_controller.js b/ambari-web/app/controllers/main/admin/access_controller.js
index aaab364..82bc9f3 100644
--- a/ambari-web/app/controllers/main/admin/access_controller.js
+++ b/ambari-web/app/controllers/main/admin/access_controller.js
@@ -25,7 +25,7 @@ App.MainAdminAccessController = Em.Controller.extend(App.UserPref, {
* Show jobs by default
* @type {bool}
*/
- showJobs: true,
+ showJobs: false,
/**
* User pref key
@@ -57,9 +57,9 @@ App.MainAdminAccessController = Em.Controller.extend(App.UserPref, {
getUserPrefErrorCallback: function () {
if (App.get('isAdmin')) {
- this.postUserPref(this.get('persistKey'), true);
+ this.postUserPref(this.get('persistKey'), false);
}
- this.set('showJobs', true);
+ this.set('showJobs', false);
return true;
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/controllers/main/jobs/hive_job_details_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/jobs/hive_job_details_controller.js b/ambari-web/app/controllers/main/jobs/hive_job_details_controller.js
deleted file mode 100644
index 1e2df7e..0000000
--- a/ambari-web/app/controllers/main/jobs/hive_job_details_controller.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-var jobsUtils = require('utils/jobs');
-
-App.MainHiveJobDetailsController = Em.Controller.extend({
- name : 'mainHiveJobDetailsController',
-
- content : null,
- loaded : false,
- loadTimeout: null,
- job: null,
- sortingColumn: null,
-
- loadJobDetails : function() {
- var self = this;
- var timeout = this.get('loadTimeout');
- var yarnService = App.YARNService.find().objectAt(0);
- if (yarnService != null) {
- var content = this.get('content');
- if (content != null) {
- jobsUtils.refreshJobDetails(content, function() {
- self.set('content', self.get('job'));
- self.set('loaded', true);
- }, function(errorId) {
- switch (errorId) {
- case 'job.dag.noId':
- App.showAlertPopup(Em.I18n.t('jobs.hive.tez.dag.error.noDagId.title'), Em.I18n.t('jobs.hive.tez.dag.error.noDagId.message'));
- break;
- case 'job.dag.noname':
- App.showAlertPopup(Em.I18n.t('jobs.hive.tez.dag.error.noDag.title'), Em.I18n.t('jobs.hive.tez.dag.error.noDag.message'));
- break;
- case 'job.dag.id.noDag':
- App.showAlertPopup(Em.I18n.t('jobs.hive.tez.dag.error.noDagForId.title'), Em.I18n.t('jobs.hive.tez.dag.error.noDagForId.message'));
- break;
- case 'job.dag.id.loaderror':
- case 'job.dag.name.loaderror':
- break;
- default:
- break;
- }
- self.routeToJobs();
- });
- }
- } else {
- clearTimeout(timeout);
- timeout = setTimeout(function() {
- self.loadJobDetails();
- }, 300);
- }
- },
-
- /**
- * path to page visited before
- */
- referer : '',
- /**
- * open dashboard page
- */
- routeHome : function() {
- App.router.transitionTo('main.dashboard.index');
- },
-
- /**
- * open jobs page
- *
- * @param event
- */
- routeToJobs : function() {
- App.router.transitionTo('main.jobs.index');
- }
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/controllers/main/jobs_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/jobs_controller.js b/ambari-web/app/controllers/main/jobs_controller.js
deleted file mode 100644
index caeac05..0000000
--- a/ambari-web/app/controllers/main/jobs_controller.js
+++ /dev/null
@@ -1,497 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-
-App.MainJobsController = Em.Controller.extend({
-/*
- * https://github.com/emberjs/ember.js/issues/1221 prevents this controller
- * from being an Ember.ArrayController. Doing so will keep the UI flashing
- * whenever any of the 'sortProperties' or 'sortAscending' properties are set.
- *
- * To bypass this issue this controller will be a regular controller. Also,
- * for memory-leak issues and sorting purposes, we are decoupling the backend
- * model and the UI model. There will be simple Ember POJOs for the UI which
- * will be periodically updated from backend Jobs model.
- */
-
- name:'mainJobsController',
-
- /**
- * Unsorted ArrayProxy
- */
- content: App.HiveJob.find(),
-
- /**
- * Sorted ArrayProxy
- */
- sortedContent: [],
-
- contentAndSortObserver : function() {
- Ember.run.once(this, 'contentAndSortUpdater');
- if(App.HiveJob.find().findProperty('id', this.get('lastJobID'))) {
- this.set('hasNewJobs', false);
- }
- }.observes('content.length', 'content.@each.id', 'content.@each.startTime', 'content.@each.endTime', 'sortProperties', 'sortAscending'),
-
- contentAndSortUpdater: function() {
- this.set('sortingDone', false);
- var content = this.get('content');
- var sortedContent = content.toArray();
- var sortProperty = this.get('sortProperty');
- var sortAscending = this.get('sortAscending');
- sortedContent.sort(function(r1, r2) {
- var r1id = r1.get(sortProperty);
- var r2id = r2.get(sortProperty);
- if (r1id < r2id)
- return sortAscending ? -1 : 1;
- if (r1id > r2id)
- return sortAscending ? 1 : -1;
- return 0;
- });
- var sortedArray = this.get('sortedContent');
- var count = 0;
- sortedContent.forEach(function(sortedJob){
- if(sortedArray.length <= count) {
- sortedArray.pushObject(Ember.Object.create());
- }
- sortedArray[count].set('failed', sortedJob.get('failed'));
- sortedArray[count].set('hasTezDag', sortedJob.get('hasTezDag'));
- sortedArray[count].set('queryText', sortedJob.get('queryText'));
- sortedArray[count].set('name', sortedJob.get('name'));
- sortedArray[count].set('user', sortedJob.get('user'));
- sortedArray[count].set('id', sortedJob.get('id'));
- sortedArray[count].set('startTimeDisplay', sortedJob.get('startTimeDisplay'));
- sortedArray[count].set('endTimeDisplay', sortedJob.get('endTimeDisplay'));
- sortedArray[count].set('durationDisplay', sortedJob.get('durationDisplay'));
- count ++;
- });
- if(sortedArray.length > count) {
- for(var c = sortedArray.length-1; c >= count; c--){
- sortedArray.removeObject(sortedArray[c]);
- }
- }
- sortedContent.length = 0;
- this.set('sortingDone', true);
- },
-
- navIDs: {
- backIDs: [],
- nextID: ''
- },
- lastJobID: '',
- hasNewJobs: false,
- loaded : false,
- loading : false,
- resetPagination: false,
- loadJobsTimeout: null,
- loadTimeout: null,
- jobsUpdateInterval: 6000,
- jobsUpdate: null,
- sortingColumn: null,
- sortProperty: 'id',
- sortAscending: true,
- sortingDone: true,
- jobsMessage: Em.I18n.t('jobs.loadingTasks'),
-
- sortingColumnObserver: function () {
- if(this.get('sortingColumn')){
- this.set('sortProperty', this.get('sortingColumn').get('name'));
- this.set('sortAscending', this.get('sortingColumn').get('status') == "sorting_desc" ? false : true );
- }
- }.observes('sortingColumn.name','sortingColumn.status'),
-
- updateJobsByClick: function () {
- this.set('navIDs.backIDs', []);
- this.set('navIDs.nextID', '');
- this.get('filterObject').set('nextFromId', '');
- this.get('filterObject').set('backFromId', '');
- this.get('filterObject').set('fromTs', '');
- this.set('hasNewJobs', false);
- this.set('resetPagination', true);
- this.loadJobs();
- },
-
- updateJobs: function (controllerName, funcName) {
- clearInterval(this.get('jobsUpdate'));
- var self = this;
- var interval = setInterval(function () {
- App.router.get(controllerName)[funcName]();
- }, this.jobsUpdateInterval);
- this.set('jobsUpdate', interval);
- },
-
- totalOfJobs: 0,
- setTotalOfJobs: function () {
- if(this.get('totalOfJobs') < this.get('content.length')){
- this.set('totalOfJobs', this.get('content.length'));
- }
- }.observes('content.length'),
-
- filterObject: Ember.Object.create({
- id: "",
- isIdFilterApplied: false,
- jobsLimit: 10,
- user: "",
- windowStart: "",
- windowEnd: "",
- nextFromId: "",
- backFromId: "",
- fromTs: "",
- isAnyFilterApplied: false,
-
- onApplyIdFilter: function () {
- if(this.get('id') == ""){
- this.set('isIdFilterApplied', false);
- }else{
- this.set('isIdFilterApplied', true);
- }
- }.observes('id'),
-
- /**
- * Direct binding to startTime filter field
- */
- startTime: "",
- onStartTimeChange:function(){
- var time = "";
- var curTime = new Date().getTime();
- switch (this.get('startTime')) {
- case 'Past 1 hour':
- time = curTime - 3600000;
- break;
- case 'Past 1 Day':
- time = curTime - 86400000;
- break;
- case 'Past 2 Days':
- time = curTime - 172800000;
- break;
- case 'Past 7 Days':
- time = curTime - 604800000;
- break;
- case 'Past 14 Days':
- time = curTime - 1209600000;
- break;
- case 'Past 30 Days':
- time = curTime - 2592000000;
- break;
- case 'Custom':
- this.showCustomDatePopup();
- break;
- case 'Any':
- time = "";
- break;
- }
- if(this.get('startTime') != "Custom"){
- this.set("windowStart", time);
- this.set("windowEnd", "");
- }
- }.observes("startTime"),
-
- // Fields values from Select Custom Dates form
- customDateFormFields: Ember.Object.create({
- startDate: null,
- hoursForStart: null,
- minutesForStart: null,
- middayPeriodForStart: null,
- endDate: null,
- hoursForEnd: null,
- minutesForEnd: null,
- middayPeriodForEnd: null
- }),
-
- errors: Ember.Object.create({
- isStartDateError: false,
- isEndDateError: false
- }),
-
- errorMessages: Ember.Object.create({
- startDate: '',
- endDate: ''
- }),
-
- showCustomDatePopup: function () {
- var self = this;
- var windowEnd = "";
- var windowStart = "";
- App.ModalPopup.show({
- header: Em.I18n.t('jobs.table.custom.date.header'),
- onPrimary: function () {
- self.validate();
- if(self.get('errors.isStartDateError') || self.get('errors.isEndDateError')){
- return false;
- }
-
- var windowStart = self.createCustomStartDate();
- var windowEnd = self.createCustomEndDate();
-
- self.set("windowStart", windowStart.getTime());
- self.set("windowEnd", windowEnd.getTime());
- this.hide();
- },
- onSecondary: function () {
- self.set('startTime','Any');
- this.hide();
- },
- bodyClass: App.JobsCustomDatesSelectView.extend({
- controller: self
- })
- });
- },
-
- createCustomStartDate : function () {
- var startDate = this.get('customDateFormFields.startDate');
- var hoursForStart = this.get('customDateFormFields.hoursForStart');
- var minutesForStart = this.get('customDateFormFields.minutesForStart');
- var middayPeriodForStart = this.get('customDateFormFields.middayPeriodForStart');
- if (startDate && hoursForStart && minutesForStart && middayPeriodForStart) {
- return new Date(startDate + ' ' + hoursForStart + ':' + minutesForStart + ' ' + middayPeriodForStart);
- }
- return null;
- },
-
- createCustomEndDate : function () {
- var endDate = this.get('customDateFormFields.endDate');
- var hoursForEnd = this.get('customDateFormFields.hoursForEnd');
- var minutesForEnd = this.get('customDateFormFields.minutesForEnd');
- var middayPeriodForEnd = this.get('customDateFormFields.middayPeriodForEnd');
- if (endDate && hoursForEnd && minutesForEnd && middayPeriodForEnd) {
- return new Date(endDate + ' ' + hoursForEnd + ':' + minutesForEnd + ' ' + middayPeriodForEnd);
- }
- return null;
- },
-
- clearErrors: function () {
- var errorMessages = this.get('errorMessages');
- Em.keys(errorMessages).forEach(function (key) {
- errorMessages.set(key, '');
- }, this);
- var errors = this.get('errors');
- Em.keys(errors).forEach(function (key) {
- errors.set(key, false);
- }, this);
- },
-
- // Validation for every field in customDateFormFields
- validate: function () {
- var formFields = this.get('customDateFormFields');
- var errors = this.get('errors');
- var errorMessages = this.get('errorMessages');
- this.clearErrors();
- // Check if feild is empty
- Em.keys(errorMessages).forEach(function (key) {
- if (!formFields.get(key)) {
- errors.set('is' + key.capitalize() + 'Error', true);
- errorMessages.set(key, Em.I18n.t('jobs.customDateFilter.error.required'));
- }
- }, this);
- // Check that endDate is after startDate
- var startDate = this.createCustomStartDate();
- var endDate = this.createCustomEndDate();
- if (startDate && endDate && (startDate > endDate)) {
- errors.set('isEndDateError', true);
- errorMessages.set('endDate', Em.I18n.t('jobs.customDateFilter.error.date.order'));
- }
- },
-
- /**
- * Create link for server request
- * @return {String}
- */
- createJobsFiltersLink: function() {
- var link = "?fields=events,primaryfilters,otherinfo&secondaryFilter=tez:true";
- var numberOfAppliedFilters = 0;
-
- if(this.get("id") !== "") {
- link = "/" + this.get("id") + link;
- numberOfAppliedFilters++;
- }
-
- link += "&limit=" + (parseInt(this.get("jobsLimit")) + 1);
-
- if(this.get("user") !== ""){
- link += "&primaryFilter=user:" + this.get("user");
- numberOfAppliedFilters++;
- }
- if(this.get("backFromId") != ""){
- link += "&fromId=" + this.get("backFromId");
- }
- if(this.get("nextFromId") != ""){
- link += "&fromId=" + this.get("nextFromId");
- }
- if(this.get("fromTs") != ""){
- link += "&fromTs=" + this.get("fromTs");
- }
- if(this.get("startTime") !== "" && this.get("startTime") !== "Any"){
- link += this.get("windowStart") !== "" ? ("&windowStart=" + this.get("windowStart")) : "";
- link += this.get("windowEnd") !== "" ? ("&windowEnd=" + this.get("windowEnd")) : "";
- numberOfAppliedFilters++;
- }
-
- if(numberOfAppliedFilters > 0){
- this.set('isAnyFilterApplied', true);
- }else{
- this.set('isAnyFilterApplied', false);
- }
-
- return link;
- }
- }),
-
- columnsName: Ember.ArrayController.create({
- content: [
- { name: Em.I18n.t('jobs.column.id'), index: 0 },
- { name: Em.I18n.t('jobs.column.user'), index: 1 },
- { name: Em.I18n.t('jobs.column.start.time'), index: 2 },
- { name: Em.I18n.t('jobs.column.end.time'), index: 3 },
- { name: Em.I18n.t('jobs.column.duration'), index: 4 }
- ],
- columnsCount: function () {
- return this.get('content.length') + 1;
- }.property('content.length')
- }),
-
- lastIDSuccessCallback: function(data, jqXHR, textStatus) {
- if(!data.entities[0]){
- return;
- }
- var lastReceivedID = data.entities[0].entity;
- if(this.get('lastJobID') == '') {
- this.set('lastJobID', lastReceivedID);
- if (this.get('loaded') && App.HiveJob.find().get('length') < 1) {
- this.set('hasNewJobs', true);
- }
- } else if (this.get('lastJobID') !== lastReceivedID) {
- this.set('lastJobID', lastReceivedID);
- if(!App.HiveJob.find().findProperty('id', lastReceivedID)) {
- this.set('hasNewJobs', true);
- }
- }
- },
-
- lastIDErrorCallback: function(data, jqXHR, textStatus) {
- console.debug(jqXHR);
- },
-
- checkDataLoadingError: function (jqXHR){
- var atsComponent = App.HostComponent.find().findProperty('componentName','APP_TIMELINE_SERVER');
- if(atsComponent && atsComponent.get('workStatus') != "STARTED") {
- this.set('jobsMessage', Em.I18n.t('jobs.error.ats.down'));
- }else if (jqXHR && jqXHR.status == 400) {
- this.set('jobsMessage', Em.I18n.t('jobs.error.400'));
- }else if ((!jqXHR && this.get('loaded') && !this.get('loading')) || (jqXHR && jqXHR.status == 500)) {
- this.set('jobsMessage', Em.I18n.t('jobs.nothingToShow'));
- }else{
- this.set('jobsMessage', Em.I18n.t('jobs.loadingTasks'));
- }
- },
-
- loadJobs : function() {
- var self = this,
- timeout = this.get('loadTimeout'),
- yarnService = App.YARNService.find().objectAt(0),
- atsComponent = App.HostComponent.find().findProperty('componentName','APP_TIMELINE_SERVER'),
- atsInValidState = !!atsComponent && atsComponent.get('workStatus') === "STARTED",
- retryLoad = this.checkDataLoadingError();
- if (yarnService != null && atsInValidState) {
- this.set('loading', true);
- var historyServerHostName = yarnService.get('appTimelineServer.hostName'),
- filtersLink = this.get('filterObject').createJobsFiltersLink(),
- hiveQueriesUrl = App.get('testMode') ? "/data/jobs/hive-queries.json" : "/proxy?url=http://" + historyServerHostName
- + ":" + yarnService.get('ahsWebPort') + "/ws/v1/timeline/HIVE_QUERY_ID" + filtersLink;
- App.ajax.send({
- name: 'jobs.lastID',
- sender: self,
- data: {
- historyServerHostName: historyServerHostName,
- ahsWebPort: yarnService.get('ahsWebPort')
- },
- success: 'lastIDSuccessCallback',
- error : 'lastIDErrorCallback'
- });
- App.HttpClient.get(hiveQueriesUrl, App.hiveJobsMapper, {
- complete : function(data, jqXHR, textStatus) {
- self.set('loading', false);
- if(self.get('loaded') == false || self.get('resetPagination') == true){
- self.initializePagination();
- self.set('resetPagination', false);
- }
- self.set('loaded', true);
- }
- }, function (jqXHR, textStatus) {
- App.hiveJobsMapper.map({entities : []});
- self.checkDataLoadingError(jqXHR);
- });
- }else{
- this.checkDataLoadingError();
- clearTimeout(timeout);
- timeout = setTimeout(function(){
- self.loadJobs();
- }, 300);
- }
- },
-
- initializePagination: function() {
- var back_link_IDs = this.get('navIDs.backIDs.[]');
- if(!back_link_IDs.contains(this.get('lastJobID'))) {
- back_link_IDs.push(this.get('lastJobID'));
- }
- this.set('filterObject.backFromId', this.get('lastJobID'));
- this.get('filterObject').set('fromTs', App.dateTime());
- },
-
- navigateNext: function() {
- this.set("filterObject.backFromId", '');
- var back_link_IDs = this.get('navIDs.backIDs.[]');
- var lastBackID = this.get('navIDs.nextID');
- if(!back_link_IDs.contains(lastBackID)) {
- back_link_IDs.push(lastBackID);
- }
- this.set('navIDs.backIDs.[]', back_link_IDs);
- this.set("filterObject.nextFromId", this.get('navIDs.nextID'));
- this.set('navIDs.nextID', '');
- this.loadJobs();
- },
-
- navigateBack: function() {
- this.set("filterObject.nextFromId", '');
- var back_link_IDs = this.get('navIDs.backIDs.[]');
- back_link_IDs.pop();
- var lastBackID = back_link_IDs[back_link_IDs.length - 1]
- this.set('navIDs.backIDs.[]', back_link_IDs);
- this.set("filterObject.backFromId", lastBackID);
- this.loadJobs();
- },
-
- refreshLoadedJobs : function() {
- var timeout = this.get('loadJobsTimeout');
- var self = this;
-
- clearTimeout(timeout);
- timeout = setTimeout(function(){
- self.loadJobs();
- }, 300);
-
- this.set('loadJobsTimeout', timeout);
- }.observes(
- 'filterObject.id',
- 'filterObject.jobsLimit',
- 'filterObject.user',
- 'filterObject.windowStart',
- 'filterObject.windowEnd'
- )
-})
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/initialize.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/initialize.js b/ambari-web/app/initialize.js
index 14473eb..a53e6af 100644
--- a/ambari-web/app/initialize.js
+++ b/ambari-web/app/initialize.js
@@ -40,7 +40,6 @@ require('utils/action_sequence');
require('mappers');
-require('mappers/jobs/hive_job_mapper');
require('utils/http_client');
require('utils/host_progress_popup');
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/mappers.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers.js b/ambari-web/app/mappers.js
index 3435ac1..80c7255 100644
--- a/ambari-web/app/mappers.js
+++ b/ambari-web/app/mappers.js
@@ -21,7 +21,6 @@ require('mappers/server_data_mapper');
require('mappers/stack_service_mapper');
require('mappers/hosts_mapper');
require('mappers/cluster_mapper');
-require('mappers/jobs_mapper');
require('mappers/runs_mapper');
require('mappers/racks_mapper');
require('mappers/users_mapper');
@@ -31,5 +30,4 @@ require('mappers/target_cluster_mapper');
require('mappers/dataset_mapper');
require('mappers/component_config_mapper');
require('mappers/components_state_mapper');
-require('mappers/jobs/hive_jobs_mapper');
require('mappers/service_config_version_mapper');
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/mappers/jobs/hive_job_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/jobs/hive_job_mapper.js b/ambari-web/app/mappers/jobs/hive_job_mapper.js
deleted file mode 100644
index 58d3e90..0000000
--- a/ambari-web/app/mappers/jobs/hive_job_mapper.js
+++ /dev/null
@@ -1,216 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-
-/**
- * Maps a Hive job response from server into an existing Hive Job.
- *
- * This will only update an existing Hive Job and not create a new one. It will
- * populate all fields (stages, Tez DAG, etc.) except runtime information like
- * <ul>
- * <li>tezDag.id
- * <li>tezDag.vertices.state
- * <li>tezDag.vertices.startTime
- * <li>tezDag.vertices.endTime
- * <li>tezDag.vertices.tasksCount
- * <li>tezDag.vertices.file*
- * <li>tezDag.vertices.hdfs*
- * <li>tezDag.vertices.recordReadCount
- * <li>tezDag.vertices.recordWriteCount
- * </ul>
- */
-App.hiveJobMapper = App.QuickDataMapper.create({
- model : App.HiveJob,
- map : function(json) {
- var model = this.get('model');
- if (!model) {
- return;
- }
- var hiveJob = {};
- if (json && json.entity) {
- var hiveJob = {};
- hiveJob.id = json.entity;
- hiveJob.name = hiveJob.id;
- hiveJob.startTime = json.starttime;
- if (typeof(json.endtime) == "undefined") {
- var i = 0;
- while (typeof(hiveJob.endTime) == "undefined" && json.events && json.events[i]) {
- if (json.events[i].eventtype == 'QUERY_COMPLETED') {
- hiveJob.endTime = json.events[i].timestamp;
- };
- i++;
- };
- } else {
- hiveJob.endTime = json.endtime;
- };
- json.otherinfo.query = $.parseJSON(json.otherinfo.query);
- if (json.otherinfo.query && json.otherinfo.query.queryText) {
- hiveJob.query_text = json.otherinfo.query.queryText;
- }
- hiveJob.stages = [];
- var stagePlans = json.otherinfo.query.queryPlan["STAGE PLANS"];
- for ( var stage in stagePlans) {
- var stageValue = stagePlans[stage];
- var stageItem = {};
- stageItem.id = stage;
- stageItem.description = '. ';
- for (var item in stageValue) {
- stageItem.description += item;
- };
- hiveJob.stages.push(stageItem);
- if (stageValue.Tez != null && hiveJob.tezDag == null) {
- var dagName = stageValue.Tez['DagName:'];
- // Vertices
- var vertices = [];
- var vertexIds = [];
- var vertexIdMap = {};
- for ( var vertexName in stageValue.Tez["Vertices:"]) {
- var vertex = stageValue.Tez["Vertices:"][vertexName];
- var vertexObj = {
- id : dagName + "/" + vertexName,
- name : vertexName,
- incoming_edges : [],
- outgoing_edges : []
- };
- vertexIds.push(vertexObj.id);
- var operatorExtractor = function(obj) {
- var ops = [];
- if ($.isArray(obj)) {
- obj.forEach(function(o) {
- ops = ops.concat(operatorExtractor(o));
- });
- } else {
- for ( var key in obj) {
- ops.push(key);
- if (obj[key].children != null) {
- ops = ops.concat(operatorExtractor(obj[key].children));
- }
- }
- }
- return ops;
- }
- if (vertex["Map Operator Tree:"] != null) {
- vertexObj.type = App.TezDagVertexType.MAP;
- vertexObj.operations = operatorExtractor(vertex["Map Operator Tree:"]);
- vertexObj.operation_plan = JSON.stringify(vertex["Map Operator Tree:"], undefined, " ");
- } else if (vertex["Reduce Operator Tree:"] != null) {
- vertexObj.type = App.TezDagVertexType.REDUCE;
- vertexObj.operations = operatorExtractor(vertex["Reduce Operator Tree:"]);
- vertexObj.operation_plan = JSON.stringify(vertex["Reduce Operator Tree:"], undefined, " ");
- } else if (vertex["Vertex:"] != null && vertexName==vertex['Vertex:']) {
- vertexObj.type = App.TezDagVertexType.UNION;
- }
- vertexIdMap[vertexObj.id] = vertexObj;
- vertices.push(vertexObj);
- }
- // Edges
- var edges = [];
- var edgeIds = [];
- for ( var childVertex in stageValue.Tez["Edges:"]) {
- var childVertices = stageValue.Tez["Edges:"][childVertex];
- if (!$.isArray(childVertices)) {
- // Single edge given as object instead of array
- childVertices = [ childVertices ];
- }
- childVertices.forEach(function(e) {
- var parentVertex = e.parent;
- if (e.type == 'CONTAINS') {
- var parentVertexNode = vertexIdMap[dagName + "/" + parentVertex];
- if (parentVertexNode != null && parentVertexNode.type == App.TezDagVertexType.UNION) {
- // We flip the edges for Union vertices
- var tmp = childVertex;
- childVertex = parentVertex;
- parentVertex = tmp;
- }
- }
- var edgeObj = {
- id : dagName + "/" + parentVertex + "-" + childVertex,
- from_vertex_id : dagName + "/" + parentVertex,
- to_vertex_id : dagName + "/" + childVertex
- };
- vertexIdMap[edgeObj.from_vertex_id].outgoing_edges.push(edgeObj.id);
- vertexIdMap[edgeObj.to_vertex_id].incoming_edges.push(edgeObj.id);
- edgeIds.push(edgeObj.id);
- switch (e.type) {
- case "BROADCAST_EDGE":
- edgeObj.edge_type = App.TezDagEdgeType.BROADCAST;
- break;
- case "SIMPLE_EDGE":
- edgeObj.edge_type = App.TezDagEdgeType.SCATTER_GATHER;
- break;
- case "CONTAINS":
- edgeObj.edge_type = App.TezDagEdgeType.CONTAINS;
- break;
- default:
- break;
- }
- edges.push(edgeObj);
- });
- }
- // Create records
- var tezDag = {
- id : dagName,
- name : dagName,
- stage : stage,
- vertices : vertexIds,
- edges : edgeIds
- }
- // Once the DAG is loaded, we do not need to
- // reload as the structure does not change. Reloading
- // here causes missing data (got from other calls)
- // to propagate into UI - causing flashing.
- var newVertices = [];
- var newEdges = [];
- vertices.forEach(function(v) {
- var vertexRecord = App.TezDagVertex.find(v.id);
- if (!vertexRecord.get('isLoaded')) {
- newVertices.push(v);
- }
- });
- edges.forEach(function(e) {
- var edgeRecord = App.TezDagEdge.find(e.id);
- if (!edgeRecord.get('isLoaded')) {
- newEdges.push(e);
- }
- });
- App.store.loadMany(App.TezDagVertex, newVertices);
- App.store.loadMany(App.TezDagEdge, newEdges);
- var dagRecord = App.TezDag.find(tezDag.id);
- if (!dagRecord.get('isLoaded')) {
- App.store.load(App.TezDag, tezDag);
- }
- hiveJob.tezDag = tezDag.id;
- }
- }
- if(App.HiveJob.find().get('content').length == 0){
- App.store.load(model, hiveJob);
- }
- var hiveJobRecord = App.HiveJob.find(hiveJob.id);
- if (hiveJobRecord != null) {
- hiveJobRecord.set('stages', hiveJob.stages.sortProperty('id'));
- hiveJobRecord.set('startTime', hiveJob.startTime);
- hiveJobRecord.set('endTime', hiveJob.endTime);
- if (hiveJob.tezDag != null) {
- // Some hive queries dont use Tez
- hiveJobRecord.set('tezDag', App.TezDag.find(hiveJob.tezDag));
- }
- }
- }
- },
- config : {}
-});
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/mappers/jobs/hive_jobs_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/jobs/hive_jobs_mapper.js b/ambari-web/app/mappers/jobs/hive_jobs_mapper.js
deleted file mode 100644
index 7377b8d..0000000
--- a/ambari-web/app/mappers/jobs/hive_jobs_mapper.js
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-
-App.hiveJobsMapper = App.QuickDataMapper.create({
- model : App.HiveJob,
- map : function(json) {
- var model = this.get('model');
- if (!model) {
- return;
- }
- var hiveJobs = []
- if (json) {
- if(!json.entities) {
- json.entities = [];
- if(json.entity){
- json.entities = [json];
- }
- }
- var currentEntityMap = {};
- json.entities.forEach(function(entity) {
- currentEntityMap[entity.entity] = entity.entity;
- var hiveJob = {
- id : entity.entity,
- name : entity.entity,
- user : entity.primaryfilters.user
- }
- hiveJob.has_tez_dag = false;
- hiveJob.query_text = '';
- if (entity.otherinfo && entity.otherinfo.query) {
- // Explicit false match needed for when failure hook not set
- hiveJob.failed = entity.otherinfo.status===false;
- hiveJob.has_tez_dag = entity.otherinfo.query.match("\"Tez\".*\"DagName:\"");
- var queryJson = $.parseJSON(entity.otherinfo.query);
- if (queryJson && queryJson.queryText) {
- hiveJob.query_text = queryJson.queryText;
- }
- }
- if (entity.events != null) {
- entity.events.forEach(function(event) {
- switch (event.eventtype) {
- case "QUERY_SUBMITTED":
- hiveJob.start_time = event.timestamp;
- break;
- case "QUERY_COMPLETED":
- hiveJob.end_time = event.timestamp;
- break;
- default:
- break;
- }
- });
- }
- if (!hiveJob.start_time && entity.starttime > 0) {
- hiveJob.start_time = entity.starttime;
- }
- if (!hiveJob.end_time && entity.endtime > 0) {
- hiveJob.end_time = entity.endtime;
- }
- hiveJobs.push(hiveJob);
- hiveJob = null;
- entity = null;
- });
-
- if(hiveJobs.length > App.router.get('mainJobsController.filterObject.jobsLimit')) {
- var lastJob = hiveJobs.pop();
- if(App.router.get('mainJobsController.navIDs.nextID') != lastJob.id) {
- App.router.set('mainJobsController.navIDs.nextID', lastJob.id);
- }
- currentEntityMap[lastJob.id] = null;
- }
-
- // Delete IDs not seen from server
- var hiveJobsModel = model.find().toArray();
- hiveJobsModel.forEach(function(job) {
- if (job && !currentEntityMap[job.get('id')]) {
- this.deleteRecord(job);
- }
- }, this);
- }
- App.store.loadMany(model, hiveJobs);
- json = null;
- hiveJobs = null;
- },
- config : {}
-});
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/models.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models.js b/ambari-web/app/models.js
index 461cdfd..49b0498 100644
--- a/ambari-web/app/models.js
+++ b/ambari-web/app/models.js
@@ -54,7 +54,4 @@ require('models/slave_component');
require('classes/run_class');
require('classes/job_class');
require('models/config_group');
-require('models/jobs/tez_dag');
-require('models/jobs/job');
-require('models/jobs/hive_job');
require('models/service_config_version');
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/models/jobs/hive_job.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/jobs/hive_job.js b/ambari-web/app/models/jobs/hive_job.js
deleted file mode 100644
index 419dd41..0000000
--- a/ambari-web/app/models/jobs/hive_job.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-
-App.HiveJob = App.AbstractJob.extend({
- jobType : App.JobType.HIVE,
- queryText : DS.attr('string'),
- stages : DS.attr('array'),
- hasTezDag: DS.attr('boolean'),
- tezDag : DS.belongsTo('App.TezDag'),
- failed: DS.attr('boolean')
-});
-
-App.HiveJob.FIXTURES = [];
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/models/jobs/job.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/jobs/job.js b/ambari-web/app/models/jobs/job.js
deleted file mode 100644
index 44142fc..0000000
--- a/ambari-web/app/models/jobs/job.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-var dateUtils = require('utils/date');
-
-/**
- * Base class of all Jobs.
- *
- * This class is meant to be extended and not instantiated directly.
- */
-App.AbstractJob = DS.Model.extend({
- id : DS.attr('string'),
- name : DS.attr('string'),
- user : DS.attr('string'),
- startTime : DS.attr('number'),
- endTime : DS.attr('number'),
-
- startTimeDisplay : function() {
- var startTime = this.get('startTime');
- if (startTime > 0) {
- return dateUtils.dateFormat(startTime);
- } else {
- return "";
- }
- }.property('startTime'),
-
- endTimeDisplay : function() {
- var endTime = this.get('endTime');
- if (endTime > 0) {
- return dateUtils.dateFormat(endTime);
- } else {
- return "";
- }
- }.property('endTime'),
-
- /**
- * Provides the duration of this job. If the job has not started, duration
- * will be given as 0. If the job has not ended, duration will be till now.
- *
- * @return {Number} Duration in milliseconds.
- */
- duration : function() {
- var startTime = this.get('startTime');
- var endTime = this.get('endTime');
- if(endTime < startTime || endTime == undefined) {
- endTime = App.dateTime();
- }
- return dateUtils.duration(startTime, endTime);
- }.property('startTime', 'endTime'),
-
- durationDisplay : function() {
- return dateUtils.timingFormat(this.get('duration'), true);
- }.property('duration'),
-
- /**
- * Type of this job. Should be one of constants defined in App.JobType
- */
- jobType : DS.attr('string')
-});
-
-App.JobType = {
- HIVE : "hive"
-};
-
-App.AbstractJob.FIXTURES = [];
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/models/jobs/tez_dag.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/jobs/tez_dag.js b/ambari-web/app/models/jobs/tez_dag.js
deleted file mode 100644
index 461c227..0000000
--- a/ambari-web/app/models/jobs/tez_dag.js
+++ /dev/null
@@ -1,189 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-var dateUtils = require('utils/date');
-var numberUtils = require('utils/number_utils');
-
-App.TezDag = DS.Model.extend({
- id : DS.attr('string'),
- /**
- * When DAG is actually running on server, a unique ID is assigned.
- */
- instanceId : DS.attr('string'),
- name : DS.attr('string'),
- yarnApplicationId: DS.attr('string'),
- stage : DS.attr('string'),
- vertices : DS.hasMany('App.TezDagVertex'),
- edges : DS.hasMany('App.TezDagEdge')
-});
-
-App.TezDagEdge = DS.Model.extend({
- id : DS.attr('string'),
- instanceId : DS.attr('string'),
- fromVertex : DS.belongsTo('App.TezDagVertex'),
- toVertex : DS.belongsTo('App.TezDagVertex'),
- /**
- * Type of this edge connecting vertices. Should be one of constants defined
- * in 'App.TezDagEdgeType'.
- */
- edgeType : DS.attr('string')
-});
-
-App.TezDagVertex = DS.Model.extend({
- id : DS.attr('string'),
- /**
- * When DAG vertex is actually running on server, a unique ID is assigned.
- */
- instanceId : DS.attr('string'),
- name : DS.attr('string'),
-
- /**
- * State of this vertex. Should be one of constants defined in
- * App.TezDagVertexState.
- */
- state : DS.attr('string'),
-
- /**
- * Vertex type has to be one of the types defined in 'App.TezDagVertexType'
- * @return {string}
- */
- type : DS.attr('string'),
-
- /**
- * A vertex can have multiple incoming edges.
- */
- incomingEdges : DS.hasMany('App.TezDagEdge'),
-
- /**
- * This vertex can have multiple outgoing edges.
- */
- outgoingEdges : DS.hasMany('App.TezDagEdge'),
-
- startTime : DS.attr('number'),
- endTime : DS.attr('number'),
-
- /**
- * Provides the duration of this job. If the job has not started, duration
- * will be given as 0. If the job has not ended, duration will be till now.
- *
- * @return {Number} Duration in milliseconds.
- */
- duration : function() {
- return dateUtils.duration(this.get('startTime'), this.get('endTime'))
- }.property('startTime', 'endTime'),
-
- /**
- * Each Tez vertex can perform arbitrary application specific computations
- * inside. The application can provide a list of operations it has provided in
- * this vertex.
- *
- * Array of strings. [{string}]
- */
- operations : DS.attr('array'),
-
- /**
- * Provides additional information about the 'operations' performed in this
- * vertex. This is shown directly to the user.
- */
- operationPlan : DS.attr('string'),
-
- /**
- * Number of actual Map/Reduce tasks in this vertex
- */
- tasksCount : DS.attr('number'),
-
- tasksNumber: function () {
- return this.get('tasksCount') ? this.get('tasksCount') : 0;
- }.property('tasksCount'),
-
- /**
- * Local filesystem usage metrics for this vertex
- */
- fileReadBytes : DS.attr('number'),
- fileWriteBytes : DS.attr('number'),
- fileReadOps : DS.attr('number'),
- fileWriteOps : DS.attr('number'),
-
- /**
- * Spilled records
- */
- spilledRecords : DS.attr('number'),
-
- /**
- * HDFS usage metrics for this vertex
- */
- hdfsReadBytes : DS.attr('number'),
- hdfsWriteBytes : DS.attr('number'),
- hdfsReadOps : DS.attr('number'),
- hdfsWriteOps : DS.attr('number'),
-
- /**
- * Record metrics for this vertex
- */
- recordReadCount : DS.attr('number'),
- recordWriteCount : DS.attr('number'),
-
- totalReadBytes : function() {
- return this.get('fileReadBytes') + this.get('hdfsReadBytes');
- }.property('fileReadBytes', 'hdfsReadBytes'),
-
- totalWriteBytes : function() {
- return this.get('fileWriteBytes') + this.get('hdfsWriteBytes');
- }.property('fileWriteBytes', 'hdfsWriteBytes'),
-
- totalReadBytesDisplay : function() {
- return numberUtils.bytesToSize(this.get('totalReadBytes'));
- }.property('totalReadBytes'),
-
- totalWriteBytesDisplay : function() {
- return numberUtils.bytesToSize(this.get('totalWriteBytes'));
- }.property('totalWriteBytes'),
-
- durationDisplay : function() {
- return dateUtils.timingFormat(this.get('duration'), true);
- }.property('duration')
-});
-
-App.TezDagVertexState = {
- NEW : "NEW",
- INITIALIZING : "INITIALIZING",
- INITED : "INITED",
- RUNNING : "RUNNING",
- SUCCEEDED : "SUCCEEDED",
- FAILED : "FAILED",
- KILLED : "KILLED",
- ERROR : "ERROR",
- TERMINATING : "TERMINATING",
- JOBFAILED: "JOB FAILED"
-};
-
-App.TezDagVertexType = {
- MAP: 'MAP',
- REDUCE: 'REDUCE',
- UNION: 'UNION'
-};
-
-App.TezDagEdgeType = {
- SCATTER_GATHER : "SCATTER_GATHER",
- BROADCAST : "BROADCAST",
- CONTAINS: "CONTAINS"
-};
-
-App.TezDag.FIXTURES = [];
-App.TezDagEdge.FIXTURES = [];
-App.TezDagVertex.FIXTURES = [];
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/routes/main.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/routes/main.js b/ambari-web/app/routes/main.js
index 42dd211..ab4b0b3 100644
--- a/ambari-web/app/routes/main.js
+++ b/ambari-web/app/routes/main.js
@@ -186,47 +186,6 @@ module.exports = Em.Route.extend({
}
}),
- jobs: Em.Route.extend({
- route: '/jobs',
- enter: function (router) {
- if (!App.router.get('mainAdminAccessController.showJobs') && !App.get('isAdmin')) {
- Em.run.next(function () {
- router.transitionTo('main.dashboard.index');
- });
- }
- },
- exit: function (router) {
- clearInterval(router.get('mainJobsController').jobsUpdate);
- },
- index: Ember.Route.extend({
- route: '/',
- connectOutlets: function (router) {
- if (!App.get('isHadoop2Stack')) {
- Em.run.next(function () {
- router.transitionTo('main.dashboard.index');
- });
- } else {
- router.get('mainJobsController').updateJobs('mainJobsController', 'refreshLoadedJobs');
- router.get('mainController').connectOutlet('mainJobs');
- }
- }
- }),
- jobDetails: Em.Route.extend({
- route: '/:job_id',
- connectOutlets: function (router, job) {
- if (job) {
- router.get('mainHiveJobDetailsController').set('loaded', false);
- router.get('mainController').connectOutlet('mainHiveJobDetails', job);
- router.get('mainHiveJobDetailsController').loadJobDetails();
- router.get('mainJobsController').updateJobs('mainHiveJobDetailsController', 'loadJobDetails');
- }
- },
- exit: function (router) {
- router.get('mainHiveJobDetailsController').set('loaded', false);
- }
- })
- }),
-
mirroring: Em.Route.extend({
route: '/mirroring',
index: Ember.Route.extend({
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/templates/main/admin/access.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/admin/access.hbs b/ambari-web/app/templates/main/admin/access.hbs
index a4a870a..9e85a06 100644
--- a/ambari-web/app/templates/main/admin/access.hbs
+++ b/ambari-web/app/templates/main/admin/access.hbs
@@ -20,10 +20,6 @@
<strong>{{t common.access}}</strong>
</div>
<div class="acces-values">
- <label>
- {{view Ember.Checkbox checkedBinding="controller.showJobs" class="checkbox"}}
- {{t admin.access.showJobs}}
- </label>
</div>
<div class="control-group">
<div class="controls">
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/templates/main/jobs.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/jobs.hbs b/ambari-web/app/templates/main/jobs.hbs
deleted file mode 100644
index 304f8fa..0000000
--- a/ambari-web/app/templates/main/jobs.hbs
+++ /dev/null
@@ -1,101 +0,0 @@
-{{!
-* 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.
-}}
-
-
- <div id="jobs">
- <div class="jobs_head">
- <div>{{t menu.item.jobs}}</div>
- {{#if controller.hasNewJobs}}
- <div class="new-jobs-link">
- <a href="javascript:void(null);" {{action updateJobsByClick target="controller"}}>{{t jobs.new_jobs.info}}</a>
- </div>
- {{/if}}
- <div class="jobs-type">
- {{t jobs.type}} : <span class="label label-info">{{t jobs.type.hive}}</span>
- </div>
- </div>
- <table id="jobs-table" class="table advanced-header-table table-bordered table-striped">
- <thead>
- {{#view view.sortView classNames="label-row" contentBinding="view.content"}}
- <th></th>
- {{view view.parentView.idSort}}
- {{view view.parentView.userSort}}
- {{view view.parentView.startTimeSort}}
- {{view view.parentView.endTimeSort}}
- {{view view.parentView.durationSort}}
- {{/view}}
-
- <tr id="filter-row" class="first">
- <th></th>
- <th>{{view view.jobsIdFilterView}}</th>
- <th>{{view view.userFilterView}}</th>
- <th class="start-time">{{view view.startTimeFilterView}}</th>
- <th></th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- {{#if view.noDataToShow}}
- <tr>
- <td class="no-data" {{bindAttr colspan="controller.columnsName.columnsCount"}}>
- {{controller.jobsMessage}}
- </td>
- </tr>
- {{else}}
- {{#each job in controller.sortedContent}}
- <tr>
- <td>
- {{#if job.failed}}
- <i class="icon-remove-sign job-link" {{bindAttr title="view.jobFailMessage"}}></i>
- {{/if}}
- </td>
- <td>
- {{view view.jobNameView jobBinding="job"}}
- </td>
- <td>
- {{job.user}}
- </td>
- <td>
- {{job.startTimeDisplay}}
- </td>
- <td>
- {{job.endTimeDisplay}}
- </td>
- <td>
- {{job.durationDisplay}}
- </td>
- </tr>
- {{/each}}
- {{/if}}
- </tbody>
- </table>
-
- <div class="page-bar">
- <div id="filtered-jobs">
- {{view.filteredJobs}} - <a href="javascript:void(null);" {{action clearFilters target="view"}}>{{t jobs.filtered.clear}}</a>
- </div>
- <div class="items-on-page">
- <label>{{t jobs.show.up.to}}: {{view view.rowsPerPageSelectView selectionBinding="view.displayLength"}}</label>
- </div>
- <div class="paging_two_button">
- {{view view.jobsPaginationLeft}}
- {{view view.jobsPaginationRight}}
- </div>
- </div>
- </div>
-
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/templates/main/jobs/custom_dates_popup.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/jobs/custom_dates_popup.hbs b/ambari-web/app/templates/main/jobs/custom_dates_popup.hbs
deleted file mode 100644
index 1b1d920..0000000
--- a/ambari-web/app/templates/main/jobs/custom_dates_popup.hbs
+++ /dev/null
@@ -1,39 +0,0 @@
-{{!
-* 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.
-}}
-
-<div class="jobs-custom-dates">
- <div>
- <label>{{t jobs.customDateFilter.startTime}}</label>
- {{view Ember.TextField valueBinding="customDateFormFields.startDate" class="input-small datepicker"}}
- {{view Ember.Select contentBinding="view.hourOptions" selectionBinding="customDateFormFields.hoursForStart" class="input-mini"}}
- {{view Ember.Select contentBinding="view.minuteOptions" selectionBinding="customDateFormFields.minutesForStart" class="input-mini"}}
- {{view Ember.Select contentBinding="view.middayPeriodOptions" selectionBinding="customDateFormFields.middayPeriodForStart" class="input-mini"}}
- <span class="help-inline">{{errorMessages.startDate}}</span>
- </div>
- <div>
-
- </div>
- <div>
- <label>{{t jobs.customDateFilter.endTime}}</label>
- {{view Ember.TextField valueBinding="customDateFormFields.endDate" class="input-small datepicker"}}
- {{view Ember.Select contentBinding="view.hourOptions" selectionBinding="customDateFormFields.hoursForEnd" class="input-mini"}}
- {{view Ember.Select contentBinding="view.minuteOptions" selectionBinding="customDateFormFields.minutesForEnd" class="input-mini"}}
- {{view Ember.Select contentBinding="view.middayPeriodOptions" selectionBinding="customDateFormFields.middayPeriodForEnd" class="input-mini"}}
- <span class="help-inline">{{errorMessages.endDate}}</span>
- </div>
-</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/templates/main/jobs/hive_job_details.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/jobs/hive_job_details.hbs b/ambari-web/app/templates/main/jobs/hive_job_details.hbs
deleted file mode 100644
index 7a4eb3b..0000000
--- a/ambari-web/app/templates/main/jobs/hive_job_details.hbs
+++ /dev/null
@@ -1,215 +0,0 @@
-{{!
-* 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.
-}}
-
-<div id="hive-job-details">
-
- {{#if controller.loaded}}
- <!-- Top Bar -->
- <div class="top-bar">
- <a {{action "routeToJobs" target="controller"}} href="#">{{t menu.item.jobs}}</a> > {{view.content.name}}
- <a {{action "toggleShowQuery" target="view"}} href="#" id="toggle-query">{{view.toggleShowQueryText}}</a>
- <div class="pull-right">Job Type: <span class="label label-info">{{view.content.jobType}}</span></div>
- <div class="alert alert-info query-info">
- <table id="job-more-details-table">
- <tr>
- <td>
- {{t jobs.hive.query}}
- </td>
- <td>
- {{view.content.queryText}}
- </td>
- </tr>
- <tr>
- <td>
- {{t jobs.hive.yarnApplication}}
- </td>
- <td>
- {{#if view.yarnApplicationIdLink}}
- <a {{bindAttr href="view.yarnApplicationIdLink"}} target="_blank">
- {{view.content.tezDag.yarnApplicationId}}
- </a>
- {{else}}
- {{view.content.tezDag.yarnApplicationId}}
- {{/if}}
- </td>
- </tr>
- <tr>
- <td>
- {{t jobs.hive.stages}}
- </td>
- <td>
- <ol>
- {{#each stage in view.content.stages}}
- <li>{{stage.id}}{{stage.description}}.</li>
- {{/each}}
- </ol>
- </td>
- </tr>
- </table>
- </div>
- </div>
-
- <!-- Sections -->
- <div class="row-fluid">
- <div class="span12 sections">
- <!-- Section LHS -->
- <div id="tez-dag-lhs" {{bindAttr class="view.isGraphMaximized:span12:span6 :sections-lhs"}}>
- <div id="tez-dag-section" class="box">
- <div id="tez-dag-section-top-bar">
- {{t jobs.hive.tez.dag.summary.metric}}
- <div class="btn-group display-inline-block">
- <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
- {{view.summaryMetricTypeDisplay}}
- <span class="caret"></span>
- </a>
- <ul class="dropdown-menu">
- <!-- dropdown menu links -->
- {{#each type in view.summaryMetricTypesDisplay}}
- <li>
- <a title="{{type}}" href="#" {{action "doSelectSummaryMetricType" type target="view"}}>{{type}}</a>
- </li>
- {{/each}}
- </ul>
- </div>
- <div id="tez-dag-section-top-bar-actions" class="pull-right">
- <div class="btn-group">
- <a id="tez-dag-zoom-in-button" {{bindAttr class="view.canGraphZoomIn::disabled :btn"}} {{action "doGraphZoomIn" target="view"}}>
- <i class="icon-zoom-in"></i>
- </a>
- <a id="tez-dag-zoom-out-button" {{bindAttr class="view.canGraphZoomOut::disabled :btn"}} {{action "doGraphZoomOut" target="view"}}>
- <i class="icon-zoom-out"></i>
- </a>
- {{#if view.isGraphMaximized}}
- <a id="tez-dag-resize-small-button" class="btn" {{action "doGraphMinimize" target="view"}}>
- <i class="icon-resize-small"></i>
- </a>
- {{else}}
- <a id="tez-dag-resize-full-button" class="btn" {{action "doGraphMaximize" target="view"}}>
- <i class="icon-resize-full"></i>
- </a>
- {{/if}}
- </div>
- </div>
- </div>
- <div id="tez-dag-section-body">
- {{view App.MainHiveJobDetailsTezDagView controllerBinding="controller" selectedVertexBinding="view.selectedVertex"
- summaryMetricTypeBinding="view.summaryMetricType" zoomScaleBinding="view.zoomScale"
- zoomScaleFromBinding="view.zoomScaleFrom" zoomScaleToBinding="view.zoomScaleTo"}}
- </div>
- </div>
- </div>
-
- <!-- Section RHS -->
- <div id="tez-vertices-rhs" {{bindAttr class="view.isGraphMaximized:hidden:span6 :sections-rhs"}}>
-
- <!-- Section RHS Vertices -->
- <div id="tez-vertices-table-section">
- <div id="tez-vertices-table-container" class="section">
- <table class="table table-hover table-bordered table-striped">
- {{#view App.MainHiveJobDetailsVerticesTableView contentBinding="view.sortedVertices" doSelectVertexBinding="view.doSelectVertex" selectedVertexBinding="view.selectedVertex"}}
- <thead>
- {{#view view.sortView contentBinding="view.content"}}
- {{view view.parentView.nameSort}}
- {{view view.parentView.tasksSort}}
- {{view view.parentView.inputSort}}
- {{view view.parentView.outputSort}}
- {{view view.parentView.durationSort}}
- {{/view}}
- </thead>
- <tbody>
- {{#each vertex in view.content}}
- <tr {{bindAttr class="vertex.isSelected:info"}}>
- <td>
- <a title="{{vertex.name}}" href="#" {{action "doSelectVertex" vertex target="view"}}>{{vertex.name}}</a>
- </td>
- <td>{{vertex.tasksNumber}}</td>
- <td>{{vertex.totalReadBytesDisplay}}</td>
- <td>{{vertex.totalWriteBytesDisplay}}</td>
- <td>{{vertex.durationDisplay}}</td>
- </tr>
- {{/each}}
- </tbody>
- {{/view}}
- </table>
- </div>
- </div>
-
- <!-- Section RHS Vertex -->
- {{#if view.selectedVertex}}
- <div id="section tez-vertex-details-section">
- <div class="box">
- <div class="box-header">
- <h4>{{view.selectedVertex.name}}</h4>
- </div>
- <div id="tez-vertex-details-section-body">
- <table class="table no-borders table-condensed">
- <tr>
- <td>{{t common.status}}</td>
- <td>{{view.selectedVertexIODisplay.status}}</td>
- <td></td>
- </tr>
- <tr>
- <td>{{t common.time.start}}</td>
- <td>{{view.selectedVertexIODisplay.started}}</td>
- <td></td>
- </tr>
- <tr>
- <td>{{t common.time.end}}</td>
- <td>{{view.selectedVertexIODisplay.ended}}</td>
- <td></td>
- </tr>
- <tr>
- <td>{{t jobs.hive.tez.tasks}}</td>
- <td>{{view.selectedVertex.tasksCount}}</td>
- <td></td>
- </tr>
- <tr>
- <td>{{t jobs.hive.tez.hdfs}}</td>
- <td>{{view.selectedVertexIODisplay.hdfs.read.ops}} / {{view.selectedVertexIODisplay.hdfs.read.bytes}}</td>
- <td>{{view.selectedVertexIODisplay.hdfs.write.ops}} / {{view.selectedVertexIODisplay.hdfs.write.bytes}}</td>
- </tr>
- <tr>
- <td>{{t jobs.hive.tez.localFiles}}</td>
- <td>{{view.selectedVertexIODisplay.file.read.ops}} / {{view.selectedVertexIODisplay.file.read.bytes}}</td>
- <td>{{view.selectedVertexIODisplay.file.write.ops}} / {{view.selectedVertexIODisplay.file.write.bytes}}</td>
- </tr>
- <tr>
- <td>{{t jobs.hive.tez.spilledRecords}}</td>
- <td>{{view.selectedVertex.spilledRecords}}</td>
- </tr>
- {{#if view.selectedVertexIODisplay.records.read}}
- <tr>
- <td>{{t jobs.hive.tez.records}}</td>
- <td>{{view.selectedVertexIODisplay.records.read}}</td>
- <td>{{view.selectedVertexIODisplay.records.write}}</td>
- </tr>
- {{/if}}
- </table>
- </div>
- </div>
- </div>
- {{/if}}
- </div>
- </div>
- </div>
- {{else}}
- <div class="alert alert-info">
- <h4>{{t app.loadingPlaceholder}}</h4>
- </div>
- {{/if}}
-</div>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/templates/main/jobs/hive_job_details_tez_dag.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/jobs/hive_job_details_tez_dag.hbs b/ambari-web/app/templates/main/jobs/hive_job_details_tez_dag.hbs
deleted file mode 100644
index 4d8d9e7..0000000
--- a/ambari-web/app/templates/main/jobs/hive_job_details_tez_dag.hbs
+++ /dev/null
@@ -1,44 +0,0 @@
-{{!
-* 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.
-}}
-
-<div id="tez-dag-section-body-dag">
- <svg id="tez-dag-svg" stroke="black" strokeWidth="2">
- <defs>
- <marker id="arrow" viewBox="0 -5 10 10" refX="4" markerWidth="3" markerHeight="3" orient="auto">
- <path d="M0,-5L10,0L0,5"></path>
- </marker>
- <filter id="shadow" width="200%" height="200%">
- <feGaussianBlur in="SourceAlpha" stdDeviation="3"/>
- <feOffset dx="2" dy="2" result="offsetblur"/>
- <feMerge>
- <feMergeNode/>
- <feMergeNode in="SourceGraphic"/>
- </feMerge>
- </filter>
- <clipPath id="operatorClipPath">
- <rect x="0" y="0" width="50" height="16">
- </rect>
- </clipPath>
- <font-face xmlns="http://www.w3.org/2000/svg" font-family="FontAwesome" unicode-range="U+0-7F">
- <font-face-src>
- <font-face-uri xlink:href="font/fontawesome-webfont.svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
- </font-face-src>
- </font-face>
- </defs>
- </svg>
-</div>
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/templates/main/jobs/hover_op_table.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/jobs/hover_op_table.hbs b/ambari-web/app/templates/main/jobs/hover_op_table.hbs
deleted file mode 100644
index 22fa336..0000000
--- a/ambari-web/app/templates/main/jobs/hover_op_table.hbs
+++ /dev/null
@@ -1,39 +0,0 @@
-{{!
-* 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.
-}}
-
-<p>{{content.operationName}}</p>
-<table id="hover-op-table" class="table table-bordered">
- <thead>
- <tr>
- <th>{{t common.name}}</th>
- <th>{{t common.value}}</th>
- </tr>
- </thead>
- <tbody>
- {{#each keys in content.operatorPlanObj}}
- <tr>
- <td>
- {{keys.name}}
- </td>
- <td>
- {{keys.value}}
- </td>
- </tr>
- {{/each}}
- </tbody>
-</table>
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/templates/main/jobs/user_filter.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/jobs/user_filter.hbs b/ambari-web/app/templates/main/jobs/user_filter.hbs
deleted file mode 100644
index 4b93eb2..0000000
--- a/ambari-web/app/templates/main/jobs/user_filter.hbs
+++ /dev/null
@@ -1,34 +0,0 @@
-{{!
-* 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.
-}}
-<button class="btn single-btn-group filter-btn" {{action "clickFilterButton" target="view"}}>
- {{t common.user}} <i class="icon-filter"></i>
-</button>
-<ul class="dropdown-menu filter-components">
- <li id="title-bar">{{t apps.filters.filterComponents}}
- <a class="close" {{action "closeFilter" target="view"}}>X</a>
- </li>
- {{#each user in view.users}}
- <li>
- <label class="checkbox">{{view Ember.Checkbox checkedBinding="user.checked"}} {{user.name}}</label>
- </li>
- {{/each}}
-
- <li id="button-bar">
- <button class="btn btn-inverse" {{action "applyFilter" target="view"}}>{{t common.apply}}</button>
- </li>
-</ul>
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/utils/jobs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/jobs.js b/ambari-web/app/utils/jobs.js
deleted file mode 100644
index 8d8ee3f..0000000
--- a/ambari-web/app/utils/jobs.js
+++ /dev/null
@@ -1,263 +0,0 @@
-/**
- * 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.
- */
-
-var App = require('app');
-module.exports = {
-
- /**
- * Refreshes the latest information for a given job
- *
- * @param {App.AbstractJob}
- * job
- * @param {Function}
- * successCallback
- * @param {Funtion}
- * errorCallback(errorId) Called in error cases where there is no
- * data from server. 'errorId' can be one of
- * <ul>
- * <li>job.dag.noId</li>
- * <li>job.dag.noname</li>
- * <li>job.dag.id.noDag</li>
- * <li>job.dag.id.loaderror</li>
- * <li>job.dag.name.loaderror</li>
- * </ul>
- */
- refreshJobDetails : function(job, successCallback, errorCallback) {
- this.refreshHiveJobDetails(job, successCallback, errorCallback);
- },
-
- /**
- * Refreshes latest information of a Hive Job.
- *
- * @param {App.HiveJob}
- * hiveJob
- * @param {Function}
- * successCallback
- * @param {Function}
- * errorCallback @see #refreshJobDetails()
- */
- refreshHiveJobDetails : function(hiveJob, successCallback, errorCallback) {
- var self = this;
- // TODO - to be changed to history server when implemented in stack.
- var yarnService = App.YARNService.find().objectAt(0);
- var historyServerHostName = yarnService.get('appTimelineServer.hostName');
- var ahsWebPort = yarnService.get('ahsWebPort');
- var hiveJobId = hiveJob.get('id');
- // First refresh query
- var hiveQueriesUrl = App.get('testMode') ? "/data/jobs/hive-query-2.json" : "/proxy?url=http://" + historyServerHostName
- + ":" + ahsWebPort + "/ws/v1/timeline/HIVE_QUERY_ID/" + hiveJob.get('id') + "?fields=events,otherinfo";
- App.HttpClient.get(hiveQueriesUrl, App.hiveJobMapper, {
- complete : function(jqXHR, textStatus) {
- // Now get the Tez DAG ID from the DAG name
- var hiveRecord = App.HiveJob.find(hiveJobId);
- App.router.get('mainHiveJobDetailsController').set('job', hiveRecord);
- var tezDagName = hiveRecord.get('tezDag.name');
- if (tezDagName != null) {
- var sender = {
- dagNameToIdSuccess : function(data) {
- if (data && data.entities && data.entities.length > 0) {
- var dagId = data.entities[0].entity;
- App.TezDag.find(tezDagName).set('instanceId', dagId);
- self.refreshTezDagDetails(tezDagName, successCallback, errorCallback);
- }else{
- console.log('No Tez DAG was found for DAG name of ' + tezDagName);
- errorCallback('job.dag.noId');
- }
- },
- dagNameToIdError : function(jqXHR, url, method, showStatus) {
- App.ajax.defaultErrorHandler(jqXHR, url, method, showStatus);
- errorCallback('job.dag.name.loaderror');
- }
- }
- App.ajax.send({
- name : 'jobs.tezDag.NametoID',
- sender : sender,
- data : {
- historyServerHostName : historyServerHostName,
- tezDagName : tezDagName,
- ahsWebPort: ahsWebPort
- },
- success : 'dagNameToIdSuccess',
- error : 'dagNameToIdError'
- });
- } else {
- console.log('No Tez DAG name to ask ID for. Job ID: ' + hiveJobId);
- errorCallback('job.dag.noname');
- }
- }
- }, function () {
- App.router.transitionTo('main.jobs.index');
- });
- },
-
- /**
- * Refreshes runtime information of a Tez DAG based on events generated. The
- * instance ID of the Tez DAG should be set.
- *
- * @param {string}
- * tezDagId ID of the Tez DAG. Example: 'HIVE-Q2:1'
- * @param {Function}
- * successCallback
- * @param {Function}
- * errorCallback @see #refreshJobDetails()
- */
- refreshTezDagDetails : function(tezDagId, successCallback, errorCallback) {
- var self = this;
- var yarnService = App.YARNService.find().objectAt(0);
- var ahsWebPort = yarnService.get('ahsWebPort');
- var historyServerHostName = yarnService.get('appTimelineServer.hostName');
- var tezDag = App.TezDag.find(tezDagId);
- if (tezDag) {
- var tezDagInstanceId = tezDag.get('instanceId');
- var sender = {
- loadTezDagSuccess : function(data) {
- if (data) {
- if (data.otherinfo && data.otherinfo.applicationId) {
- tezDag.set('yarnApplicationId', data.otherinfo.applicationId);
- }
- if (data.relatedentities && data.relatedentities.TEZ_VERTEX_ID != null) {
- var count = data.relatedentities.TEZ_VERTEX_ID.length;
- data.relatedentities.TEZ_VERTEX_ID.forEach(function(v) {
- self.refreshTezDagVertex(tezDagId, v, function() {
- if (--count <= 0) {
- // all vertices succeeded
- successCallback();
- }
- });
- });
- }
- }
- },
- loadTezDagError : function(jqXHR, url, method, showStatus) {
- App.ajax.defaultErrorHandler(jqXHR, url, method, showStatus);
- errorCallback('job.dag.id.loaderror');
- }
- }
- App.ajax.send({
- name : 'jobs.tezDag.tezDagId',
- sender : sender,
- data : {
- historyServerHostName : historyServerHostName,
- tezDagId : tezDagInstanceId,
- ahsWebPort: ahsWebPort
- },
- success : 'loadTezDagSuccess',
- error : 'loadTezDagError'
- });
- } else {
- console.log('Unable to find DAG for ID: ' + tezDagId);
- errorCallback('job.dag.id.noDag');
- }
- },
-
- /**
- * Refreshes runtime information of the given vertex.
- *
- * @param {string}
- * tezDagId ID of the Tez DAG. Exmaple: 'HIVE-Q2:1'
- * @param {string}
- * tezVertexInstanceID Instance ID of the vertex to refresh. Example
- * 'vertex_1390516007863_0001_1_00'
- * @param {Function}
- * successCallback
- */
- refreshTezDagVertex : function(tezDagId, tezVertexInstanceId, successCallback) {
- var yarnService = App.YARNService.find().objectAt(0);
- var ahsWebPort = yarnService.get('ahsWebPort');
- var historyServerHostName = yarnService.get('appTimelineServer.hostName');
- var tezDag = App.TezDag.find(tezDagId);
- var hiveJob = App.HiveJob.find().findProperty('tezDag', tezDag);
- var hiveJobFailed = hiveJob.get('failed');
- var hiveJobEndTime = hiveJob.get('endTime');
- var sender = {
- loadTezDagVertexSuccess : function(data) {
- if (data && data.otherinfo) {
- var vertexRecord = App.TezDagVertex.find(tezDagId + "/" + data.otherinfo.vertexName);
- if (vertexRecord != null) {
- vertexRecord.set('startTime', data.otherinfo.startTime);
- if (data.otherinfo.endTime == undefined && hiveJobFailed) {
- vertexRecord.set('endTime', hiveJobEndTime);
- } else {
- vertexRecord.set('endTime', data.otherinfo.endTime);
- };
- vertexRecord.set('tasksCount', data.otherinfo.numTasks);
- if (data.otherinfo.status == null && hiveJobFailed) {
- vertexRecord.set('state', Em.I18n.t('jobs.hive.failed'));
- } else {
- vertexRecord.set('state', data.otherinfo.status);
- };
- if (data.otherinfo.counters && data.otherinfo.counters.counterGroups) {
- data.otherinfo.counters.counterGroups.forEach(function(cGroup) {
- var cNameToPropetyMap = {};
- switch (cGroup.counterGroupName) {
- case 'org.apache.tez.common.counters.FileSystemCounter':
- cNameToPropetyMap = {
- 'FILE_BYTES_READ' : 'fileReadBytes',
- 'FILE_BYTES_WRITTEN' : 'fileWriteBytes',
- 'FILE_READ_OPS' : 'fileReadOps',
- 'FILE_WRITE_OPS' : 'fileWriteOps',
- 'HDFS_BYTES_READ' : 'hdfsReadBytes',
- 'HDFS_BYTES_WRITTEN' : 'hdfsWriteBytes',
- 'HDFS_READ_OPS' : 'hdfsReadOps',
- 'HDFS_WRITE_OPS' : 'hdfsWriteOps'
- };
- break;
- case 'org.apache.tez.common.counters.TaskCounter':
- cNameToPropetyMap = {
- 'SPILLED_RECORDS' : 'spilledRecords'
- };
- break;
- case 'HIVE':
- cNameToPropetyMap = {
- 'RECORDS_READ' : 'recordReadCount',
- 'RECORDS_WRITE' : 'recordWriteCount'
- };
- break;
- default:
- break;
- }
- if (cGroup.counters) {
- cGroup.counters.forEach(function(counter) {
- var prop = cNameToPropetyMap[counter.counterName];
- if (prop != null) {
- vertexRecord.set(prop, counter.counterValue);
- }
- });
- }
- });
- }
- successCallback();
- }
- }
- },
- loadTezDagVertexError : function(jqXHR, url, method, showStatus) {
- App.ajax.defaultErrorHandler(jqXHR, url, method, showStatus);
- }
- }
- App.ajax.send({
- name : 'jobs.tezDag.tezDagVertexId',
- sender : sender,
- data : {
- historyServerHostName : historyServerHostName,
- tezDagVertexId : tezVertexInstanceId,
- ahsWebPort: ahsWebPort
- },
- success : 'loadTezDagVertexSuccess',
- error : 'loadTezDagVertexError'
- });
- }
-};
http://git-wip-us.apache.org/repos/asf/ambari/blob/71d91a7c/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 8790fed..21eeb16 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -243,10 +243,6 @@ require('views/main/charts/heatmap/heatmap_rack');
require('views/main/charts/heatmap/heatmap_host');
require('views/main/charts/heatmap/heatmap_host_detail');
require('views/main/apps_view');
-require('views/main/jobs_view');
-require('views/main/jobs/select_custom_date_view');
-require('views/main/jobs/hive_job_details_view');
-require('views/main/jobs/hive_job_details_tez_dag_view');
require('views/main/apps/item_view');
require('views/main/apps/item/bar_view');
require('views/main/apps/item/dag_view');