You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tez.apache.org by sr...@apache.org on 2016/04/26 12:18:48 UTC
[17/31] tez git commit: TEZ-3227. Tez UI: Replace UI1 with UI2 (sree)
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/utils/processor.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/utils/processor.js b/tez-ui/src/main/webapp/app/utils/processor.js
new file mode 100644
index 0000000..6658579
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/utils/processor.js
@@ -0,0 +1,50 @@
+/**
+ * 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.
+ */
+
+import Ember from 'ember';
+
+function getVibrantHSL(colorNum, totalColors) {
+ if (totalColors < 1){
+ totalColors = 1;
+ }
+ return {
+ h: colorNum * (360 / totalColors) % 360,
+ s: 100 - (colorNum % 2) * 30,
+ l: 40
+ };
+}
+
+export default Ember.Object.extend({
+
+ processCount: 0,
+
+ startTime: 0,
+ endTime: 0,
+
+ timeWindow: Ember.computed("startTime", "endTime", function () {
+ return Math.max(0, this.get("endTime") - this.get("startTime"));
+ }),
+
+ createProcessColor: function (index, totalProcessCount) {
+ return getVibrantHSL(index, totalProcessCount || this.get("processCount"));
+ },
+
+ timeToPositionPercent: function (time) {
+ return ((time - this.get("startTime")) / this.get("timeWindow")) * 100;
+ }
+
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/app/utils/vertex-process.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/app/utils/vertex-process.js b/tez-ui/src/main/webapp/app/utils/vertex-process.js
new file mode 100644
index 0000000..626cd22
--- /dev/null
+++ b/tez-ui/src/main/webapp/app/utils/vertex-process.js
@@ -0,0 +1,273 @@
+/*global more*/
+/**
+ * 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.
+ */
+
+import Ember from 'ember';
+
+import Process from './process';
+
+var MoreObject = more.Object;
+
+export default Process.extend({
+ vertex: null,
+
+ name: Ember.computed.oneWay("vertex.name"),
+ completeTime: Ember.computed.oneWay("vertex.endTime"),
+
+ blockingEventName: "VERTEX_FINISHED",
+
+ getVisibleProps: null,
+
+ edgeHash: null,
+
+ eventBars: [{
+ fromEvent: "FIRST_TASK_STARTED",
+ toEvent: "LAST_TASK_FINISHED",
+ }, {
+ fromEvent: "DEPENDENT_VERTICES_COMPLETE",
+ toEvent: "LAST_TASK_FINISHED",
+ }],
+
+ init: function () {
+ this._super();
+ this.set("edgeHash", Ember.Object.create());
+ },
+
+ eventsHash: Ember.computed("vertex.events.@each.timestamp", function () {
+ var events = {},
+ eventsArr = this.get("vertex.events");
+
+ if(eventsArr) {
+ eventsArr.forEach(function (event) {
+ if(event.timestamp > 0) {
+ events[event.eventtype] = {
+ name: event.eventtype,
+ time: event.timestamp,
+ info: event.eventinfo
+ };
+ }
+ });
+ }
+
+ return events;
+ }),
+
+ events: Ember.computed("eventsHash",
+ "vertex.initTime", "vertex.startTime", "vertex.endTime",
+ "vertex.firstTaskStartTime", "vertex.lastTaskFinishTime", "unblockDetails",
+ function () {
+ var events = [],
+ eventsHash = this.get("eventsHash"),
+
+ initTime = this.get("vertex.initTime"),
+ startTime = this.get("vertex.startTime"),
+ endTime = this.get("vertex.endTime"),
+
+ firstTaskStartTime = this.get("vertex.firstTaskStartTime"),
+ lastTaskFinishTime = this.get("vertex.lastTaskFinishTime"),
+ unblockDetails = this.get("unblockDetails");
+
+ if(initTime > 0) {
+ eventsHash["VERTEX_INITIALIZED"] = {
+ name: "VERTEX_INITIALIZED",
+ time: initTime
+ };
+ }
+
+ if(startTime > 0) {
+ eventsHash["VERTEX_STARTED"] = {
+ name: "VERTEX_STARTED",
+ time: startTime
+ };
+ }
+
+ if(firstTaskStartTime > 0) {
+ eventsHash["FIRST_TASK_STARTED"] = {
+ name: "FIRST_TASK_STARTED",
+ time: firstTaskStartTime
+ };
+ }
+
+ if(unblockDetails && unblockDetails.time >= firstTaskStartTime) {
+ eventsHash["DEPENDENT_VERTICES_COMPLETE"] = {
+ name: "DEPENDENT_VERTICES_COMPLETE",
+ time: unblockDetails.time,
+ edge: unblockDetails.edge
+ };
+ }
+
+ if(lastTaskFinishTime > 0) {
+ eventsHash["LAST_TASK_FINISHED"] = {
+ name: "LAST_TASK_FINISHED",
+ time: lastTaskFinishTime
+ };
+ }
+
+ if(endTime > 0) {
+ eventsHash["VERTEX_FINISHED"] = {
+ name: "VERTEX_FINISHED",
+ time: endTime
+ };
+ }
+
+ MoreObject.forEach(eventsHash, function (key, value) {
+ events.push(value);
+ });
+
+ return events;
+ }
+ ),
+
+ unblockDetails: Ember.computed("blockers.@each.completeTime", function () {
+ var blockers = this.get("blockers"),
+ data = {
+ time: 0
+ };
+
+ if(blockers) {
+ blockers.every(function (currentBlocker) {
+ var blockerComplete = currentBlocker.get("completeTime");
+
+ if(!blockerComplete) {
+ this.blocker = undefined;
+ return false;
+ }
+ else if(blockerComplete > this.time) {
+ this.blocker = currentBlocker;
+ this.time = blockerComplete;
+ }
+
+ return true;
+ }, data);
+ }
+
+ if(data.blocker) {
+ return {
+ time: data.blocker.get("completeTime"),
+ edge: this.get("edgeHash").get(data.blocker.get("name"))
+ };
+ }
+ }),
+
+ getTipProperties: function (propHash, propArray) {
+ propArray = propArray || [];
+
+ MoreObject.forEach(propHash, function (key, value) {
+ if(MoreObject.isString(value)) {
+ propArray.push({
+ name: key,
+ value: value,
+ });
+ }
+ else if (MoreObject.isNumber(value)) {
+ propArray.push({
+ name: key,
+ value: value,
+ type: "number"
+ });
+ }
+ });
+
+ return propArray;
+ },
+
+ getTooltipContents: function (type, options) {
+ var contents,
+ that = this,
+ vertexDescription;
+
+ switch(type) {
+ case "consolidated-process":
+ vertexDescription = `Contribution ${options.contribution}%`;
+ /* falls through */
+ case "event-bar":
+ case "process-line":
+ case "process-name":
+ let properties = this.getVisibleProps().map(function (definition) {
+ return {
+ name: definition.get("headerTitle"),
+ value: that.get("vertex").get(definition.get("contentPath")),
+ type: Ember.get(definition, "cellDefinition.type"),
+ format: Ember.get(definition, "cellDefinition.format")
+ };
+ });
+
+ contents = [{
+ title: this.get("name"),
+ properties: properties,
+ description: vertexDescription
+ }];
+ break;
+ case "event":
+ var edge;
+ contents = options.events.map(function (event) {
+ var properties = [{
+ name: "Time",
+ value: event.time,
+ type: "date"
+ }];
+
+ if(event.edge) {
+ edge = event.edge;
+ }
+ if(event.info) {
+ properties = this.getTipProperties(event.info, properties);
+ }
+
+ return {
+ title: event.name,
+ properties: properties
+ };
+ }, this);
+
+ if(edge) {
+ let sourceClass = edge.edgeSourceClass || "",
+ destClass = edge.edgeDestinationClass || "";
+
+ contents.push({
+ title: "Edge From Final Dependent Vertex",
+ properties: this.getTipProperties({
+ "Input Vertex": edge.inputVertexName,
+ "Output Vertex": edge.outputVertexName,
+ "Data Movement": edge.dataMovementType,
+ "Data Source": edge.dataSourceType,
+ "Scheduling": edge.schedulingType,
+ "Source Class": sourceClass.substr(sourceClass.lastIndexOf(".") + 1),
+ "Destination Class": destClass.substr(destClass.lastIndexOf(".") + 1),
+ })
+ });
+ }
+ break;
+ }
+
+ return contents;
+ },
+
+ consolidateStartTime: Ember.computed("vertex.firstTaskStartTime",
+ "unblockDetails.time", function () {
+ return Math.max(
+ this.get("vertex.firstTaskStartTime") || 0,
+ this.get("unblockDetails.time") || 0
+ );
+ }),
+ consolidateEndTime: Ember.computed.oneWay("vertex.endTime"),
+
+ getConsolidateColor: function () {
+ return this.getBarColor(this.get("unblockDetails") ? 1 : 0);
+ },
+
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/blueprints/.jshintrc
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/blueprints/.jshintrc b/tez-ui/src/main/webapp/blueprints/.jshintrc
new file mode 100644
index 0000000..33f4f6f
--- /dev/null
+++ b/tez-ui/src/main/webapp/blueprints/.jshintrc
@@ -0,0 +1,6 @@
+{
+ "predef": [
+ "console"
+ ],
+ "strict": false
+}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/blueprints/entity-test/files/tests/unit/entities/__name__-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/blueprints/entity-test/files/tests/unit/entities/__name__-test.js b/tez-ui/src/main/webapp/blueprints/entity-test/files/tests/unit/entities/__name__-test.js
new file mode 100644
index 0000000..179c5e5
--- /dev/null
+++ b/tez-ui/src/main/webapp/blueprints/entity-test/files/tests/unit/entities/__name__-test.js
@@ -0,0 +1,30 @@
+/**
+ * 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.
+ */
+
+import { moduleFor, test } from 'ember-qunit';
+
+moduleFor('entitie:<%= dasherizedModuleName %>', '<%= friendlyTestDescription %>', {
+ // Specify the other units that are required for this test.
+ // needs: ['entitie:foo']
+});
+
+// Replace this with your real tests.
+test('it exists', function(assert) {
+ let adapter = this.subject();
+ assert.ok(adapter);
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/blueprints/entity-test/index.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/blueprints/entity-test/index.js b/tez-ui/src/main/webapp/blueprints/entity-test/index.js
new file mode 100644
index 0000000..d89d9cd
--- /dev/null
+++ b/tez-ui/src/main/webapp/blueprints/entity-test/index.js
@@ -0,0 +1,35 @@
+/*jshint node:true*/
+
+/**
+ * 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 testInfo = require('ember-cli-test-info');
+
+module.exports = {
+ description: 'Generate an entity unit test.',
+
+ locals: function(options) {
+ return {
+ friendlyTestDescription: testInfo.description(options.entity.name, "Unit", "Entity")
+ };
+ },
+
+ // afterInstall: function(options) {
+ // // Perform extra work here.
+ // }
+};
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/blueprints/entity/files/app/entities/__name__.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/blueprints/entity/files/app/entities/__name__.js b/tez-ui/src/main/webapp/blueprints/entity/files/app/entities/__name__.js
new file mode 100644
index 0000000..334868e
--- /dev/null
+++ b/tez-ui/src/main/webapp/blueprints/entity/files/app/entities/__name__.js
@@ -0,0 +1,22 @@
+/**
+ * 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.
+ */
+
+import Entity from './entity';
+
+export default Entity.extend({
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/blueprints/entity/index.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/blueprints/entity/index.js b/tez-ui/src/main/webapp/blueprints/entity/index.js
new file mode 100644
index 0000000..24e25ef
--- /dev/null
+++ b/tez-ui/src/main/webapp/blueprints/entity/index.js
@@ -0,0 +1,31 @@
+/*jshint node:true*/
+
+/**
+ * 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.
+ */
+
+module.exports = {
+ description: 'Generate and entity',
+
+ locals: function(options) {
+ return {};
+ }
+
+ // afterInstall: function(options) {
+ // // Perform extra work here.
+ // }
+};
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/bower.json
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/bower.json b/tez-ui/src/main/webapp/bower.json
index cc6577b..4b0d01b 100644
--- a/tez-ui/src/main/webapp/bower.json
+++ b/tez-ui/src/main/webapp/bower.json
@@ -1,32 +1,27 @@
{
"name": "tez-ui",
- "version": "0.0.1",
- "license": "Apache2",
"dependencies": {
- "ember": "1.7.0",
- "moment": "2.10.6",
- "moment-timezone": "0.4.0",
- "ember-data": "1.0.0-beta.11",
- "ember-i18n": "2.9.0",
- "bootstrap": "3.3.1",
- "ember-json-mapper": "1.0.0",
- "jquery-ui": "1.11",
- "d3": "3.4.11",
- "ember-addons.bs_for_ember": "~0.7.0",
- "ember-table": "~0.2.4",
- "font-awesome": "4.2.0",
- "FileSaver.js": "https://github.com/eligrey/FileSaver.js.git#24b303f49213b905ec9062b708f7cd43d56a5dde",
- "zip.js": "https://github.com/gildas-lormeau/zip.js.git#bfd76c66293305faaf9fcbb65b5ff7fe2dbe621a",
- "codemirror": "~5.2.0"
- },
- "resolutions": {
- "jquery": "1.10.2",
- "jquery-ui": "1.11",
- "ember": "1.7.0",
- "bootstrap": "3.3.1",
- "handlebars": "~1.3.0",
- "jquery-mousewheel": "~3.1.12",
- "antiscroll": "1.0.0",
- "font-awesome": "4.2.0"
+ "ember": "2.2.0",
+ "ember-cli-shims": "0.0.6",
+ "ember-cli-test-loader": "0.2.1",
+ "ember-data": "2.1.0",
+ "ember-load-initializers": "0.1.7",
+ "ember-qunit": "0.4.16",
+ "ember-qunit-notifications": "0.1.0",
+ "loader.js": "3.3.0",
+ "qunit": "1.19.0",
+ "more-js": "0.8.2",
+ "bootstrap": "3.3.6",
+ "font-awesome": "4.5.0",
+ "jquery": "2.1.4",
+ "jquery-ui": "1.11.4",
+ "moment": "2.12.0",
+ "moment-timezone": "0.5.0",
+ "numeral": "1.5.3",
+ "snippet-ss": "1.11.0",
+ "jquery-mousewheel": "3.1.13",
+ "FileSaver": "https://github.com/eligrey/FileSaver.js.git#24b303f49213b905ec9062b708f7cd43d56a5dde",
+ "zip": "https://github.com/gildas-lormeau/zip.js.git#bfd76c66293305faaf9fcbb65b5ff7fe2dbe621a",
+ "codemirror": "5.11.0"
}
}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/config/build-info.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/config/build-info.js b/tez-ui/src/main/webapp/config/build-info.js
new file mode 100644
index 0000000..ae2b33d
--- /dev/null
+++ b/tez-ui/src/main/webapp/config/build-info.js
@@ -0,0 +1,32 @@
+/**
+ * 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.
+ */
+
+const POM_FILE = "../../../pom.xml";
+var fs = require('fs');
+
+function fetchVersion() {
+ try {
+ var fileData = fs.readFileSync(POM_FILE, 'ascii');
+ // Feel this is better than parsing the whole xml
+ return fileData.substring(fileData.indexOf("<version>") + 9, fileData.indexOf("</version>"));
+ }catch(e){}
+}
+
+module.exports = {
+ version: fetchVersion()
+};
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/config/configs.env
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/config/configs.env b/tez-ui/src/main/webapp/config/configs.env
new file mode 100644
index 0000000..d1dc9f5
--- /dev/null
+++ b/tez-ui/src/main/webapp/config/configs.env
@@ -0,0 +1,57 @@
+/**
+ * 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.
+ */
+
+ENV = {
+ hosts: {
+ /*
+ * Timeline Server Address:
+ * By default TEZ UI looks for timeline server at http://localhost:8188, uncomment and change
+ * the following value for pointing to a different address.
+ */
+ //timeline: "http://localhost:8188",
+
+ /*
+ * Resource Manager Address:
+ * By default RM REST APIs are expected to be at http://localhost:8088, uncomment and change
+ * the following value to point to a different address.
+ */
+ //rm: "http://localhost:8088",
+
+ /*
+ * Resource Manager Web Proxy Address:
+ * Optional - By default, value configured as RM host will be taken as proxy address
+ * Use this configuration when RM web proxy is configured at a different address than RM.
+ */
+ //rmProxy: "http://localhost:8088",
+ },
+
+ /*
+ * Time Zone in which dates are displayed in the UI:
+ * If not set, local time zone will be used.
+ * Refer http://momentjs.com/timezone/docs/ for valid entries.
+ */
+ //timeZone: "UTC",
+
+ /*
+ * yarnProtocol:
+ * If specified, this protocol would be used to construct node manager log links.
+ * Possible values: http, https
+ * Default value: If not specified, protocol of hosts.rm will be used
+ */
+ //yarnProtocol: "<value>",
+};
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/config/default-app-conf.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/config/default-app-conf.js b/tez-ui/src/main/webapp/config/default-app-conf.js
new file mode 100644
index 0000000..c53e4d7
--- /dev/null
+++ b/tez-ui/src/main/webapp/config/default-app-conf.js
@@ -0,0 +1,333 @@
+/**
+ * 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 buildInfo = require('./build-info');
+
+module.exports = { // Tez App configurations
+ buildVersion: buildInfo.version || "",
+ isStandalone: true, // Must be set false while running in wrapped mode
+ rowLoadLimit: 9007199254740991,
+ pollingInterval: 3000,
+
+ hosts: {
+ timeline: 'localhost:8188',
+ rm: 'localhost:8088',
+ },
+ namespaces: {
+ webService: {
+ timeline: 'ws/v1/timeline',
+ appHistory: 'ws/v1/applicationhistory',
+ rm: 'ws/v1/cluster',
+ am: 'proxy/{app_id}/ws/v2/tez',
+ },
+ web: {
+ rm: 'cluster'
+ },
+ },
+ paths: {
+ timeline: {
+ dag: 'TEZ_DAG_ID',
+ vertex: 'TEZ_VERTEX_ID',
+ task: 'TEZ_TASK_ID',
+ attempt: 'TEZ_TASK_ATTEMPT_ID',
+
+ hiveQuery: 'HIVE_QUERY_ID',
+
+ app: 'TEZ_APPLICATION'
+ },
+ am: {
+ "dag-am": 'dagInfo',
+ "vertex-am": 'verticesInfo',
+ "task-am": 'tasksInfo',
+ "attempt-am": 'attemptsInfo',
+ },
+ rm: {
+ "app-rm": "apps"
+ }
+ },
+ hrefs: {
+ help: "https://tez.apache.org/tez_ui_user_data.html",
+ license: "http://www.apache.org/licenses/LICENSE-2.0"
+ },
+
+ tables: {
+ defaultColumns: {
+ counters: [
+ // File System Counters
+ {
+ counterName: 'FILE_BYTES_READ',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'FILE_BYTES_WRITTEN',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'FILE_READ_OPS',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'FILE_LARGE_READ_OPS',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'FILE_WRITE_OPS',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'HDFS_BYTES_READ',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'HDFS_BYTES_WRITTEN',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'HDFS_READ_OPS',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'HDFS_LARGE_READ_OPS',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+ {
+ counterName: 'HDFS_WRITE_OPS',
+ counterGroupName: 'org.apache.tez.common.counters.FileSystemCounter',
+ },
+
+ // Task Counters
+ {
+ counterName: "NUM_SPECULATIONS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "REDUCE_INPUT_GROUPS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "REDUCE_INPUT_RECORDS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SPLIT_RAW_BYTES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "COMBINE_INPUT_RECORDS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SPILLED_RECORDS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "NUM_SHUFFLED_INPUTS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "NUM_SKIPPED_INPUTS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "NUM_FAILED_SHUFFLE_INPUTS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "MERGED_MAP_OUTPUTS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "GC_TIME_MILLIS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "CPU_MILLISECONDS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "PHYSICAL_MEMORY_BYTES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "VIRTUAL_MEMORY_BYTES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "COMMITTED_HEAP_BYTES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "INPUT_RECORDS_PROCESSED",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "OUTPUT_RECORDS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "OUTPUT_LARGE_RECORDS",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "OUTPUT_BYTES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "OUTPUT_BYTES_WITH_OVERHEAD",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "OUTPUT_BYTES_PHYSICAL",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "ADDITIONAL_SPILLS_BYTES_WRITTEN",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "ADDITIONAL_SPILLS_BYTES_READ",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "ADDITIONAL_SPILL_COUNT",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SHUFFLE_BYTES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SHUFFLE_BYTES_DECOMPRESSED",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SHUFFLE_BYTES_TO_MEM",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SHUFFLE_BYTES_TO_DISK",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SHUFFLE_BYTES_DISK_DIRECT",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "NUM_MEM_TO_DISK_MERGES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "NUM_DISK_TO_DISK_MERGES",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "SHUFFLE_PHASE_TIME",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "MERGE_PHASE_TIME",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "FIRST_EVENT_RECEIVED",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ {
+ counterName: "LAST_EVENT_RECEIVED",
+ counterGroupName: "org.apache.tez.common.counters.TaskCounter",
+ },
+ ],
+
+ dagCounters: [
+ {
+ counterName :"NUM_FAILED_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"NUM_KILLED_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"NUM_SUCCEEDED_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"TOTAL_LAUNCHED_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"OTHER_LOCAL_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"DATA_LOCAL_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"RACK_LOCAL_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"SLOTS_MILLIS_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"FALLOW_SLOTS_MILLIS_TASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"TOTAL_LAUNCHED_UBERTASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"NUM_UBER_SUBTASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+ {
+ counterName :"NUM_FAILED_UBERTASKS",
+ counterGroupName :"org.apache.tez.common.counters.DAGCounter",
+ },
+
+ {
+ counterName: "REDUCE_OUTPUT_RECORDS",
+ counterGroupName: "REDUCE_OUTPUT_RECORDS",
+ },
+ {
+ counterName: "REDUCE_SKIPPED_GROUPS",
+ counterGroupName: "REDUCE_SKIPPED_GROUPS",
+ },
+ {
+ counterName: "REDUCE_SKIPPED_RECORDS",
+ counterGroupName: "REDUCE_SKIPPED_RECORDS",
+ },
+ {
+ counterName: "COMBINE_OUTPUT_RECORDS",
+ counterGroupName: "COMBINE_OUTPUT_RECORDS",
+ },
+ {
+ counterName: "SKIPPED_RECORDS",
+ counterGroupName: "SKIPPED_RECORDS",
+ },
+ {
+ counterName: "INPUT_GROUPS",
+ counterGroupName: "INPUT_GROUPS",
+ }
+ ]
+ }
+ }
+};
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/config/environment.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/config/environment.js b/tez-ui/src/main/webapp/config/environment.js
new file mode 100644
index 0000000..0c755ac
--- /dev/null
+++ b/tez-ui/src/main/webapp/config/environment.js
@@ -0,0 +1,70 @@
+/* jshint node: true */
+
+/**
+ * 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.
+ */
+
+const DEFAULT_APP_CONF = require('./default-app-conf');
+
+module.exports = function(environment) {
+ var ENV = {
+ modulePrefix: 'tez-ui',
+ environment: environment,
+ locationType: 'hash',
+ EmberENV: {
+ FEATURES: {
+ // Here you can enable experimental features on an ember canary build
+ // e.g. 'with-controller': true
+ }
+ },
+
+ APP: DEFAULT_APP_CONF,
+
+ contentSecurityPolicy: {
+ 'connect-src': "* 'self'",
+ 'child-src': "'self' 'unsafe-inline'",
+ 'style-src': "'self' 'unsafe-inline'",
+ 'script-src': "'self' 'unsafe-inline'"
+ }
+ };
+
+ if (environment === 'development') {
+ // ENV.APP.LOG_RESOLVER = true;
+ // ENV.APP.LOG_ACTIVE_GENERATION = true;
+ // ENV.APP.LOG_TRANSITIONS = true;
+ // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
+ // ENV.APP.LOG_VIEW_LOOKUPS = true;
+ }
+
+ if (environment === 'test') {
+ // Testem prefers this...
+ ENV.baseURL = '/';
+ ENV.locationType = 'none';
+
+ // keep test console output quieter
+ ENV.APP.LOG_ACTIVE_GENERATION = false;
+ ENV.APP.LOG_VIEW_LOOKUPS = false;
+
+ ENV.APP.rootElement = '#ember-testing';
+ }
+
+ if (environment === 'production') {
+
+ }
+
+ return ENV;
+};
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/ember-cli-build.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/ember-cli-build.js b/tez-ui/src/main/webapp/ember-cli-build.js
new file mode 100644
index 0000000..d380982
--- /dev/null
+++ b/tez-ui/src/main/webapp/ember-cli-build.js
@@ -0,0 +1,76 @@
+/*jshint node:true*/
+/* global require, module */
+
+/**
+ * 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 Funnel = require("broccoli-funnel");
+var EmberApp = require('ember-cli/lib/broccoli/ember-app');
+var MergeTrees = require('broccoli-merge-trees');
+
+module.exports = function(defaults) {
+ var isProd = EmberApp.env() === 'production';
+ var app = new EmberApp(defaults, {
+ storeConfigInMeta: false,
+ minifyCSS: {
+ enabled: isProd
+ },
+ minifyJS: {
+ // Will be minified by wro4j-maven-plugin for performance
+ enabled: false,
+ },
+ fingerprint: {
+ enabled: false
+ },
+ sourcemaps: {
+ enabled: !isProd
+ }
+ });
+
+ var configEnv = new Funnel('config', {
+ srcDir: '/',
+ include: ['*.env'],
+ destDir: '/config'
+ });
+ var zipWorker = new Funnel('bower_components/zip', {
+ srcDir: '/WebContent',
+ include: ['z-worker.js', 'deflate.js', 'inflate.js'],
+ destDir: '/assets/zip'
+ });
+ var copyFonts = new Funnel('bower_components/font-awesome/', {
+ srcDir: '/fonts',
+ include: ['*.*'],
+ destDir: '/fonts'
+ });
+
+ app.import('bower_components/bootstrap/dist/js/bootstrap.js');
+ app.import('bower_components/jquery-ui/jquery-ui.js');
+ app.import('bower_components/jquery-ui/ui/tooltip.js');
+
+ app.import('bower_components/more-js/dist/more.js');
+
+ app.import('bower_components/FileSaver/FileSaver.js');
+ app.import('bower_components/zip/WebContent/zip.js');
+
+ app.import('bower_components/codemirror/lib/codemirror.js');
+ app.import('bower_components/codemirror/mode/sql/sql.js');
+ app.import('bower_components/codemirror/mode/pig/pig.js');
+ app.import('bower_components/codemirror/lib/codemirror.css');
+
+ return app.toTree(new MergeTrees([configEnv, zipWorker, copyFonts]));
+};
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/package.json
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/package.json b/tez-ui/src/main/webapp/package.json
index 33e7265..018c088 100644
--- a/tez-ui/src/main/webapp/package.json
+++ b/tez-ui/src/main/webapp/package.json
@@ -1,41 +1,63 @@
{
"name": "tez-ui",
- "version": "0.0.1",
+ "version": "0.2.0",
+ "license": "Apache-2.0",
"description": "Apache Tez UI",
- "repository" : {
- "type" : "git",
- "url" : "https://git-wip-us.apache.org/repos/asf/tez.git"
+ "private": true,
+ "directories": {
+ "doc": "doc",
+ "test": "tests"
},
- "dependencies": {},
- "devDependencies": {
- "bower": "1.3.12",
- "grunt": "~0.4.1",
- "grunt-cli": "~0.1.13",
- "grunt-contrib-copy": "~0.4.1",
- "grunt-contrib-concat": "~0.3.0",
- "grunt-contrib-uglify": "~0.2.0",
- "grunt-contrib-jshint": "~0.6.3",
- "grunt-contrib-cssmin": "~0.6.0",
- "grunt-contrib-connect": "~0.3.0",
- "grunt-contrib-clean": "~0.5.0",
- "grunt-contrib-htmlmin": "~0.1.3",
- "grunt-contrib-watch": "~0.5.2",
- "grunt-rev": "~0.1.0",
- "grunt-usemin": "~0.1.12",
- "grunt-mocha": "~0.4.1",
- "grunt-open": "~0.2.0",
- "grunt-svgmin": "~0.2.0",
- "grunt-concurrent": "~0.3.0",
- "load-grunt-tasks": "~0.1.0",
- "connect-livereload": "~0.2.0",
- "grunt-ember-templates": "0.4.14",
- "time-grunt": "~0.1.1",
- "grunt-replace": "~0.4.4",
- "jshint-stylish": "~0.1.3",
- "grunt-neuter": "~0.6.0",
- "grunt-contrib-less": "~0.11"
+ "scripts": {
+ "build": "TMPDIR=tmp node ./node_modules/ember-cli/bin/ember build",
+ "start": "TMPDIR=tmp node ./node_modules/ember-cli/bin/ember server",
+ "test": "TMPDIR=tmp node ./node_modules/ember-cli/bin/ember test",
+
+ "build:mvn": "TMPDIR=tmp node/node ./node_modules/ember-cli/bin/ember build -prod",
+ "test:mvn": "TMPDIR=tmp node/node ./node_modules/ember-cli/bin/ember test"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://git-wip-us.apache.org/repos/asf/tez.git"
},
"engines": {
- "node": ">=0.8.0"
+ "node": ">= 0.10.0"
+ },
+ "devDependencies": {
+ "bower": "1.7.7",
+ "broccoli-asset-rev": "2.4.2",
+ "broccoli-funnel": "1.0.1",
+ "broccoli-merge-trees": "1.1.1",
+ "ember-bootstrap": "0.5.1",
+ "ember-cli": "1.13.13",
+ "ember-cli-app-version": "1.0.0",
+ "ember-cli-auto-register": "1.1.0",
+ "ember-cli-babel": "5.1.6",
+ "ember-cli-content-security-policy": "0.4.0",
+ "ember-cli-d3": "1.1.2",
+ "ember-cli-dependency-checker": "1.2.0",
+ "ember-cli-htmlbars": "1.0.2",
+ "ember-cli-htmlbars-inline-precompile": "0.3.1",
+ "ember-cli-inject-live-reload": "1.4.0",
+ "ember-cli-jquery-ui": "0.0.20",
+ "ember-cli-less": "1.5.3",
+ "ember-cli-moment-shim": "0.7.3",
+ "ember-cli-mousewheel": "0.1.5",
+ "ember-cli-numeral": "0.1.2",
+ "ember-cli-qunit": "1.2.1",
+ "ember-cli-release": "0.2.8",
+ "ember-cli-sri": "1.2.1",
+ "ember-cli-test-info": "1.0.0",
+ "ember-cli-uglify": "1.2.0",
+ "ember-data": "2.1.0",
+ "ember-disable-proxy-controllers": "1.0.1",
+ "ember-export-application-global": "1.0.5",
+ "ember-resolver": "2.0.3",
+ "phantomjs": "1.9.19"
+ },
+ "dependencies": {
+ "em-helpers": "0.5.8",
+ "em-table": "0.3.12",
+ "em-tgraph": "0.0.4"
}
}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/public/assets/images/favicon.png
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/public/assets/images/favicon.png b/tez-ui/src/main/webapp/public/assets/images/favicon.png
new file mode 100644
index 0000000..4762bdf
Binary files /dev/null and b/tez-ui/src/main/webapp/public/assets/images/favicon.png differ
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/public/assets/images/logo.png
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/public/assets/images/logo.png b/tez-ui/src/main/webapp/public/assets/images/logo.png
new file mode 100644
index 0000000..f29455a
Binary files /dev/null and b/tez-ui/src/main/webapp/public/assets/images/logo.png differ
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/testem.json
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/testem.json b/tez-ui/src/main/webapp/testem.json
new file mode 100644
index 0000000..0f35392
--- /dev/null
+++ b/tez-ui/src/main/webapp/testem.json
@@ -0,0 +1,12 @@
+{
+ "framework": "qunit",
+ "test_page": "tests/index.html?hidepassed",
+ "disable_watching": true,
+ "launch_in_ci": [
+ "PhantomJS"
+ ],
+ "launch_in_dev": [
+ "PhantomJS",
+ "Chrome"
+ ]
+}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/.jshintrc
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/.jshintrc b/tez-ui/src/main/webapp/tests/.jshintrc
new file mode 100644
index 0000000..6ec0b7c
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/.jshintrc
@@ -0,0 +1,52 @@
+{
+ "predef": [
+ "document",
+ "window",
+ "location",
+ "setTimeout",
+ "$",
+ "-Promise",
+ "define",
+ "console",
+ "visit",
+ "exists",
+ "fillIn",
+ "click",
+ "keyEvent",
+ "triggerEvent",
+ "find",
+ "findWithAssert",
+ "wait",
+ "DS",
+ "andThen",
+ "currentURL",
+ "currentPath",
+ "currentRouteName"
+ ],
+ "node": false,
+ "browser": false,
+ "boss": true,
+ "curly": true,
+ "debug": false,
+ "devel": false,
+ "eqeqeq": true,
+ "evil": true,
+ "forin": false,
+ "immed": false,
+ "laxbreak": false,
+ "newcap": true,
+ "noarg": true,
+ "noempty": false,
+ "nonew": false,
+ "nomen": false,
+ "onevar": false,
+ "plusplus": false,
+ "regexp": false,
+ "undef": true,
+ "sub": true,
+ "strict": false,
+ "white": false,
+ "eqnull": true,
+ "esnext": true,
+ "unused": true
+}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/helpers/destroy-app.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/helpers/destroy-app.js b/tez-ui/src/main/webapp/tests/helpers/destroy-app.js
new file mode 100644
index 0000000..dfabf85
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/helpers/destroy-app.js
@@ -0,0 +1,23 @@
+/**
+ * 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.
+ */
+
+import Ember from 'ember';
+
+export default function destroyApp(application) {
+ Ember.run(application, 'destroy');
+}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/helpers/module-for-acceptance.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/helpers/module-for-acceptance.js b/tez-ui/src/main/webapp/tests/helpers/module-for-acceptance.js
new file mode 100644
index 0000000..05aa014
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/helpers/module-for-acceptance.js
@@ -0,0 +1,41 @@
+/**
+ * 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.
+ */
+
+import { module } from 'qunit';
+import startApp from '../helpers/start-app';
+import destroyApp from '../helpers/destroy-app';
+
+export default function(name, options = {}) {
+ module(name, {
+ beforeEach() {
+ this.application = startApp();
+
+ if (options.beforeEach) {
+ options.beforeEach.apply(this, arguments);
+ }
+ },
+
+ afterEach() {
+ destroyApp(this.application);
+
+ if (options.afterEach) {
+ options.afterEach.apply(this, arguments);
+ }
+ }
+ });
+}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/helpers/resolver.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/helpers/resolver.js b/tez-ui/src/main/webapp/tests/helpers/resolver.js
new file mode 100644
index 0000000..9c3d98c
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/helpers/resolver.js
@@ -0,0 +1,29 @@
+/**
+ * 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.
+ */
+
+import Resolver from 'ember/resolver';
+import config from '../../config/environment';
+
+const resolver = Resolver.create();
+
+resolver.namespace = {
+ modulePrefix: config.modulePrefix,
+ podModulePrefix: config.podModulePrefix
+};
+
+export default resolver;
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/helpers/start-app.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/helpers/start-app.js b/tez-ui/src/main/webapp/tests/helpers/start-app.js
new file mode 100644
index 0000000..7b25773
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/helpers/start-app.js
@@ -0,0 +1,36 @@
+/**
+ * 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.
+ */
+
+import Ember from 'ember';
+import Application from '../../app';
+import config from '../../config/environment';
+
+export default function startApp(attrs) {
+ let application;
+
+ let attributes = Ember.merge({}, config.APP);
+ attributes = Ember.merge(attributes, attrs); // use defaults, but you can override;
+
+ Ember.run(() => {
+ application = Application.create(attributes);
+ application.setupForTesting();
+ application.injectTestHelpers();
+ });
+
+ return application;
+}
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/index.html
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/index.html b/tez-ui/src/main/webapp/tests/index.html
new file mode 100644
index 0000000..6b43939
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/index.html
@@ -0,0 +1,52 @@
+<!--
+* 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.
+-->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <title>TezUi Tests</title>
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ {{content-for 'head'}}
+ {{content-for 'test-head'}}
+
+ <link rel="stylesheet" href="assets/vendor.css">
+ <link rel="stylesheet" href="assets/tez-ui.css">
+ <link rel="stylesheet" href="assets/test-support.css">
+
+ {{content-for 'head-footer'}}
+ {{content-for 'test-head-footer'}}
+ </head>
+ <body>
+ {{content-for 'body'}}
+ {{content-for 'test-body'}}
+
+ <script src="assets/vendor.js"></script>
+ <script src="assets/test-support.js"></script>
+ <script src="assets/tez-ui.js"></script>
+ <script src="testem.js" integrity=""></script>
+ <script src="assets/tests.js"></script>
+ <script src="assets/test-loader.js"></script>
+
+ {{content-for 'body-footer'}}
+ {{content-for 'test-body-footer'}}
+ </body>
+</html>
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/caller-info-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/caller-info-test.js b/tez-ui/src/main/webapp/tests/integration/components/caller-info-test.js
new file mode 100644
index 0000000..20f787c
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/caller-info-test.js
@@ -0,0 +1,42 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('caller-info', 'Integration | Component | caller info', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ var testType = "Typ",
+ heading = "Additional Info from " + testType;
+
+ this.set("type", testType);
+
+ this.render(hbs`{{caller-info type=type}}`);
+ assert.equal(this.$(".panel-heading").text().trim(), heading);
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#caller-info type=type}}
+ template block text
+ {{/caller-info}}
+ `);
+ assert.equal(this.$(".panel-heading").text().trim(), heading);
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/column-selector-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/column-selector-test.js b/tez-ui/src/main/webapp/tests/integration/components/column-selector-test.js
new file mode 100644
index 0000000..0034059
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/column-selector-test.js
@@ -0,0 +1,87 @@
+/**
+ * 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.
+ */
+
+import Ember from 'ember';
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('column-selector', 'Integration | Component | column selector', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+
+ this.set("content", {
+ columns: [Ember.Object.create({
+ headerTitle: "Test Column"
+ })]
+ });
+ this.render(hbs`{{column-selector content=content}}`);
+
+ assert.equal(this.$(".select-option ").text().trim(), 'Test Column');
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#column-selector content=content}}
+ template block text
+ {{/column-selector}}
+ `);
+
+ assert.equal(this.$(".select-option ").text().trim(), 'Test Column');
+});
+
+test('visibleColumnIDs test', function(assert) {
+
+ this.setProperties({
+ content: {
+ visibleColumnIDs: {
+ testID: true,
+ },
+ columns: [Ember.Object.create({
+ id: "testID",
+ headerTitle: "Test Column"
+ })]
+ }
+ });
+
+ this.render(hbs`{{column-selector content=content}}`);
+
+ assert.equal(this.$(".select-option").text().trim(), 'Test Column');
+ assert.equal(this.$(".select-option input")[0].checked, true);
+});
+
+test('searchText test', function(assert) {
+
+ this.setProperties({
+ searchText: "nothing",
+ content: {
+ visibleColumnIDs: {
+ testID: true,
+ },
+ columns: [Ember.Object.create({
+ id: "testID",
+ headerTitle: "Test Column"
+ })]
+ }
+ });
+
+ this.render(hbs`{{column-selector content=content searchText=searchText}}`);
+
+ assert.equal(this.$(".select-option").text().trim(), '');
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/dags-page-search-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/dags-page-search-test.js b/tez-ui/src/main/webapp/tests/integration/components/dags-page-search-test.js
new file mode 100644
index 0000000..def7413
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/dags-page-search-test.js
@@ -0,0 +1,45 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('dags-page-search', 'Integration | Component | dags page search', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+
+ // Set any properties with this.set('myProperty', 'value');
+ // Handle any actions with this.on('myAction', function(val) { ... });" + EOL + EOL +
+
+ this.render(hbs`{{dags-page-search}}`);
+
+ assert.equal(this.$("input").length, 5);
+ assert.equal(this.$("select").length, 1);
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#dags-page-search}}
+ template block text
+ {{/dags-page-search}}
+ `);
+
+ assert.equal(this.$("input").length, 5);
+ assert.equal(this.$("select").length, 1);
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js b/tez-ui/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js
new file mode 100644
index 0000000..e38a7be
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/dags-pagination-ui-test.js
@@ -0,0 +1,130 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+import wait from 'ember-test-helpers/wait';
+
+moduleForComponent('dags-pagination-ui', 'Integration | Component | dags pagination ui', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ this.set("rowCountOptions", {
+ rowCountOptions: [1, 2]
+ });
+
+ this.render(hbs`{{dags-pagination-ui rowCountOptions=rowCountOptions}}`);
+
+ assert.equal(this.$('select').length, 1);
+
+ assert.equal(this.$('.page-list').length, 1);
+ assert.equal(this.$('li').length, 1);
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#dags-pagination-ui rowCountOptions=rowCountOptions}}
+ template block text
+ {{/dags-pagination-ui}}
+ `);
+
+ assert.equal(this.$('select').length, 1);
+});
+
+test('Page list test', function(assert) {
+ this.set("tableDefinition", {
+ pageNum: 5,
+ rowCount: 5,
+
+ loadingMore: false,
+ moreAvailable: true,
+
+ rowCountOptions: []
+ });
+ this.set("processor", {
+ totalPages: 10,
+ processedRows: {
+ length: 10
+ }
+ });
+
+ this.render(hbs`{{dags-pagination-ui tableDefinition=tableDefinition dataProcessor=processor}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$('li').length, 4);
+ assert.equal(this.$('li').eq(0).text().trim(), "First");
+ assert.equal(this.$('li').eq(1).text().trim(), "4");
+ assert.equal(this.$('li').eq(2).text().trim(), "5");
+ assert.equal(this.$('li').eq(3).text().trim(), "6");
+ });
+});
+
+test('Page list - moreAvailable false test', function(assert) {
+ this.set("tableDefinition", {
+ pageNum: 5,
+ rowCount: 5,
+
+ loadingMore: false,
+ moreAvailable: false,
+
+ rowCountOptions: []
+ });
+ this.set("processor", {
+ totalPages: 5,
+ processedRows: {
+ length: 10
+ }
+ });
+
+ this.render(hbs`{{dags-pagination-ui tableDefinition=tableDefinition dataProcessor=processor}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$('li').length, 4);
+ assert.equal(this.$('li').eq(1).text().trim(), "3");
+ assert.equal(this.$('li').eq(2).text().trim(), "4");
+ assert.equal(this.$('li').eq(3).text().trim(), "5");
+ });
+});
+
+test('Page list - moreAvailable true test', function(assert) {
+ this.set("tableDefinition", {
+ pageNum: 5,
+ rowCount: 5,
+
+ loadingMore: false,
+ moreAvailable: true,
+
+ rowCountOptions: []
+ });
+ this.set("processor", {
+ totalPages: 5,
+ processedRows: {
+ length: 10
+ }
+ });
+
+ this.render(hbs`{{dags-pagination-ui tableDefinition=tableDefinition dataProcessor=processor}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$('li').length, 4);
+ assert.equal(this.$('li').eq(1).text().trim(), "4");
+ assert.equal(this.$('li').eq(2).text().trim(), "5");
+ assert.equal(this.$('li').eq(3).text().trim(), "6");
+ });
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/date-formatter-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/date-formatter-test.js b/tez-ui/src/main/webapp/tests/integration/components/date-formatter-test.js
new file mode 100644
index 0000000..dad41f9
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/date-formatter-test.js
@@ -0,0 +1,40 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('date-formatter', 'Integration | Component | em table date-formatter cell', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+
+ this.render(hbs`{{date-formatter}}`);
+
+ assert.equal(this.$().text().trim(), 'Not Available!');
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#date-formatter}}
+ template block text
+ {{/date-formatter}}
+ `);
+
+ assert.equal(this.$().text().trim(), 'Not Available!');
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-blocking-event-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-blocking-event-test.js b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-blocking-event-test.js
new file mode 100644
index 0000000..1659ddc
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-blocking-event-test.js
@@ -0,0 +1,117 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import wait from 'ember-test-helpers/wait';
+
+import Process from 'tez-ui/utils/process';
+import Processor from 'tez-ui/utils/processor';
+
+moduleForComponent('em-swimlane-blocking-event', 'Integration | Component | em swimlane blocking event', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ this.set("process", Process.create());
+ this.set("processor", Processor.create());
+
+ this.render(hbs`{{em-swimlane-blocking-event processor=processor process=process}}`);
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#em-swimlane-blocking-event processor=processor process=process}}
+ template block text
+ {{/em-swimlane-blocking-event}}
+ `);
+
+ assert.equal(this.$().text().trim(), '');
+});
+
+test('Blocking test', function(assert) {
+ var blockingEventName = "blockingEvent",
+ processIndex = 5,
+ blockingIndex = 7,
+ processColor = "#123456";
+
+ this.set("process", Process.create({
+ blockingEventName: blockingEventName,
+ index: processIndex,
+ getColor: function () {
+ return processColor;
+ },
+ events: [{
+ name: blockingEventName,
+ time: 2
+ }]
+ }));
+ this.set("blocking", Process.create({
+ index: blockingIndex,
+ endEvent: {
+ time: 5
+ }
+ }));
+ this.set("processor", Processor.create({
+ startTime: 0,
+ endTime: 10
+ }));
+
+ this.render(hbs`{{em-swimlane-blocking-event processor=processor process=process blocking=blocking}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$(".em-swimlane-blocking-event").attr("style").trim(), 'left: 20%;');
+ assert.equal(this.$(".event-line").css("height"), ((blockingIndex - processIndex) * 30) + "px");
+ });
+});
+
+test('Blocking test with blocking.endEvent.time < blockTime', function(assert) {
+ var blockingEventName = "blockingEvent",
+ processIndex = 5,
+ blockingIndex = 7,
+ processColor = "#123456";
+
+ this.set("process", Process.create({
+ blockingEventName: blockingEventName,
+ index: processIndex,
+ getColor: function () {
+ return processColor;
+ },
+ events: [{
+ name: blockingEventName,
+ time: 5
+ }]
+ }));
+ this.set("blocking", Process.create({
+ index: blockingIndex,
+ endEvent: {
+ time: 2
+ }
+ }));
+ this.set("processor", Processor.create({
+ startTime: 0,
+ endTime: 10
+ }));
+
+ this.render(hbs`{{em-swimlane-blocking-event processor=processor process=process blocking=blocking}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$(".em-swimlane-blocking-event").attr("style"), undefined);
+ });
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-consolidated-process-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-consolidated-process-test.js b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-consolidated-process-test.js
new file mode 100644
index 0000000..5fe79a5
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-consolidated-process-test.js
@@ -0,0 +1,61 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+import wait from 'ember-test-helpers/wait';
+
+import Process from 'tez-ui/utils/process';
+import Processor from 'tez-ui/utils/processor';
+
+moduleForComponent('em-swimlane-consolidated-process', 'Integration | Component | em swimlane consolidated process', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ this.render(hbs`{{em-swimlane-consolidated-process}}`);
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#em-swimlane-consolidated-process}}
+ template block text
+ {{/em-swimlane-consolidated-process}}
+ `);
+
+ assert.equal(this.$().text().trim(), '');
+});
+
+test('Basic creation test', function(assert) {
+ this.set("process", Process.create({
+ consolidateStartTime: 3,
+ consolidateEndTime: 6
+ }));
+ this.set("processor", Processor.create({
+ startTime: 0,
+ endTime: 10
+ }));
+
+ this.render(hbs`{{em-swimlane-consolidated-process process=process processor=processor}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$(".em-swimlane-consolidated-process").attr("style").trim(),
+ "left: 30%; right: 40%; z-index: 30;");
+ });
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-bar-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-bar-test.js b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-bar-test.js
new file mode 100644
index 0000000..0e0eb1c
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-bar-test.js
@@ -0,0 +1,45 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+import Process from 'tez-ui/utils/process';
+import Processor from 'tez-ui/utils/processor';
+
+moduleForComponent('em-swimlane-event-bar', 'Integration | Component | em swimlane event bar', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ this.set("process", Process.create());
+ this.set("processor", Processor.create());
+
+ this.render(hbs`{{em-swimlane-event-bar processor=processor process=process}}`);
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#em-swimlane-event-bar process=process processor=processor}}
+ template block text
+ {{/em-swimlane-event-bar}}
+ `);
+
+ assert.equal(this.$().text().trim(), '');
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-test.js b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-test.js
new file mode 100644
index 0000000..cee0b3d
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-event-test.js
@@ -0,0 +1,66 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+import Process from 'tez-ui/utils/process';
+import Processor from 'tez-ui/utils/processor';
+
+import wait from 'ember-test-helpers/wait';
+
+moduleForComponent('em-swimlane-event', 'Integration | Component | em swimlane event', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ this.set("process", Process.create({}));
+ this.set("processor", Processor.create());
+
+ this.render(hbs`{{em-swimlane-event processor=processor process=process}}`);
+
+ assert.ok(this.$(".event-bar"));
+ assert.ok(this.$(".event-window"));
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#em-swimlane-event process=process processor=processor}}
+ template block text
+ {{/em-swimlane-event}}
+ `);
+
+ assert.ok(this.$(".event-bar"));
+ assert.ok(this.$(".event-window"));
+});
+
+test('Event position test', function(assert) {
+ this.set("process", Process.create());
+ this.set("event", {
+ time: 6
+ });
+ this.set("processor", Processor.create({
+ startTime: 0,
+ endTime: 10
+ }));
+
+ this.render(hbs`{{em-swimlane-event processor=processor process=process event=event}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$(".em-swimlane-event").attr("style").trim(), "left: 60%;", "em-swimlane-event");
+ });
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-line-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-line-test.js b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-line-test.js
new file mode 100644
index 0000000..5e933db
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-line-test.js
@@ -0,0 +1,68 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+import wait from 'ember-test-helpers/wait';
+
+import Process from 'tez-ui/utils/process';
+import Processor from 'tez-ui/utils/processor';
+
+moduleForComponent('em-swimlane-process-line', 'Integration | Component | em swimlane process line', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ this.set("process", Process.create());
+ this.set("processor", Processor.create());
+
+ this.render(hbs`{{em-swimlane-process-line process=process processor=processor}}`);
+
+ assert.equal(this.$().text().trim(), '');
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#em-swimlane-process-line process=process processor=processor}}
+ template block text
+ {{/em-swimlane-process-line}}
+ `);
+
+ assert.equal(this.$().text().trim(), '');
+});
+
+test('start-end event test', function(assert) {
+ this.set("process", Process.create({
+ startEvent: {
+ time: 5
+ },
+ endEvent: {
+ time: 7
+ }
+ }));
+ this.set("processor", Processor.create({
+ startTime: 0,
+ endTime: 10
+ }));
+
+ this.render(hbs`{{em-swimlane-process-line processor=processor process=process}}`);
+
+ return wait().then(() => {
+ assert.equal(this.$(".process-line").eq(0).attr("style").trim(), "left: 50%; right: 30%;", "process-line");
+ });
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-name-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-name-test.js b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-name-test.js
new file mode 100644
index 0000000..8117529
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-name-test.js
@@ -0,0 +1,45 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+moduleForComponent('em-swimlane-process-name', 'Integration | Component | em swimlane process name', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ var testName = "TestName";
+
+ this.set("process", {
+ name: testName
+ });
+
+ this.render(hbs`{{em-swimlane-process-name process=process}}`);
+
+ assert.equal(this.$().text().trim(), testName);
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#em-swimlane-process-name process=process}}
+ template block text
+ {{/em-swimlane-process-name}}
+ `);
+
+ assert.equal(this.$().text().trim(), testName);
+});
http://git-wip-us.apache.org/repos/asf/tez/blob/13132ec7/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-visual-test.js
----------------------------------------------------------------------
diff --git a/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-visual-test.js b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-visual-test.js
new file mode 100644
index 0000000..20bdba9
--- /dev/null
+++ b/tez-ui/src/main/webapp/tests/integration/components/em-swimlane-process-visual-test.js
@@ -0,0 +1,77 @@
+/**
+ * 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.
+ */
+
+import { moduleForComponent, test } from 'ember-qunit';
+import hbs from 'htmlbars-inline-precompile';
+
+import wait from 'ember-test-helpers/wait';
+
+import Process from 'tez-ui/utils/process';
+import Processor from 'tez-ui/utils/processor';
+
+moduleForComponent('em-swimlane-process-visual', 'Integration | Component | em swimlane process visual', {
+ integration: true
+});
+
+test('Basic creation test', function(assert) {
+ this.set("process", Process.create());
+ this.set("processor", Processor.create());
+
+ this.render(hbs`{{em-swimlane-process-visual process=process processor=processor}}`);
+
+ assert.ok(this.$(".base-line"));
+ assert.ok(this.$(".event-window"));
+
+ // Template block usage:" + EOL +
+ this.render(hbs`
+ {{#em-swimlane-process-visual processor=processor process=process}}
+ template block text
+ {{/em-swimlane-process-visual}}
+ `);
+
+ assert.ok(this.$(".base-line"));
+ assert.ok(this.$(".event-window"));
+});
+
+test('Events test', function(assert) {
+ this.set("process", Process.create({
+ events: [{
+ name: "event1",
+ time: 5
+ }, {
+ name: "event2",
+ time: 7
+ }]
+ }));
+ this.set("processor", Processor.create({
+ startTime: 0,
+ endTime: 10
+ }));
+
+ this.render(hbs`{{em-swimlane-process-visual processor=processor process=process startTime=0 timeWindow=10}}`);
+
+ return wait().then(() => {
+ var events = this.$(".em-swimlane-event");
+
+ assert.equal(events.length, 2);
+ assert.equal(events.eq(0).attr("style").trim(), "left: 50%;", "em-swimlane-event 1 left");
+ assert.equal(events.eq(1).attr("style").trim(), "left: 70%;", "em-swimlane-event 2 left");
+
+ assert.equal(this.$(".process-line").eq(0).attr("style").trim(), "left: 50%; right: 30%;", "process-line");
+ });
+});