http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/cluster-metric.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/cluster-metric.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/cluster-metric.js new file mode 100644 index 0000000..d39885e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/cluster-metric.js @@ -0,0 +1,29 @@ +import DS from 'ember-data'; + +export default DS.JSONAPISerializer.extend({ + normalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + var fixedPayload = { + id: id, + type: primaryModelClass.modelName, + attributes: payload + }; + + return this._super(store, primaryModelClass, fixedPayload, id, + requestType); + }, + + normalizeArrayResponse(store, primaryModelClass, payload, id, + requestType) { + // return expected is { data: [ {}, {} ] } + var normalizedArrayResponse = {}; + + // payload has apps : { app: [ {},{},{} ] } + // need some error handling for ex apps or app may not be defined. + normalizedArrayResponse.data = [ + this.normalizeSingleResponse(store, primaryModelClass, + payload.clusterMetrics, 1, requestType) + ]; + return normalizedArrayResponse; + } +}); \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app-attempt.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app-attempt.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app-attempt.js new file mode 100644 index 0000000..c5394d0 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app-attempt.js @@ -0,0 +1,49 @@ +import DS from 'ember-data'; +import Converter from 'yarn-ui/utils/converter'; + +export default DS.JSONAPISerializer.extend({ + internalNormalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + + if (payload.appAttempt) { + payload = payload.appAttempt; + } + + var fixedPayload = { + id: payload.appAttemptId, + type: primaryModelClass.modelName, // yarn-app + attributes: { + startTime: Converter.timeStampToDate(payload.startTime), + finishedTime: Converter.timeStampToDate(payload.finishedTime), + containerId: payload.containerId, + nodeHttpAddress: payload.nodeHttpAddress, + nodeId: payload.nodeId, + state: payload.nodeId, + logsLink: payload.logsLink + } + }; + + return fixedPayload; + }, + + normalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + var p = this.internalNormalizeSingleResponse(store, + primaryModelClass, payload, id, requestType); + return { data: p }; + }, + + normalizeArrayResponse(store, primaryModelClass, payload, id, + requestType) { + // return expected is { data: [ {}, {} ] } + var normalizedArrayResponse = {}; + + // payload has apps : { app: [ {},{},{} ] } + // need some error handling for ex apps or app may not be defined. + normalizedArrayResponse.data = payload.appAttempts.appAttempt.map(singleApp => { + return this.internalNormalizeSingleResponse(store, primaryModelClass, + singleApp, singleApp.id, requestType); + }, this); + return normalizedArrayResponse; + } +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app.js new file mode 100644 index 0000000..a038fff --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-app.js @@ -0,0 +1,66 @@ +import DS from 'ember-data'; +import Converter from 'yarn-ui/utils/converter'; + +export default DS.JSONAPISerializer.extend({ + internalNormalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + if (payload.app) { + payload = payload.app; + } + + var fixedPayload = { + id: id, + type: primaryModelClass.modelName, // yarn-app + attributes: { + appName: payload.name, + user: payload.user, + queue: payload.queue, + state: payload.state, + startTime: Converter.timeStampToDate(payload.startedTime), + elapsedTime: Converter.msToElapsedTime(payload.elapsedTime), + finishedTime: Converter.timeStampToDate(payload.finishedTime), + finalStatus: payload.finalStatus, + progress: payload.progress, + diagnostics: payload.diagnostics, + amContainerLogs: payload.amContainerLogs, + amHostHttpAddress: payload.amHostHttpAddress, + logAggregationStatus: payload.logAggregationStatus, + unmanagedApplication: payload.unmanagedApplication, + amNodeLabelExpression: payload.amNodeLabelExpression, + priority: payload.priority, + allocatedMB: payload.allocatedMB, + allocatedVCores: payload.allocatedVCores, + runningContainers: payload.runningContainers, + memorySeconds: payload.memorySeconds, + vcoreSeconds: payload.vcoreSeconds, + preemptedResourceMB: payload.preemptedResourceMB, + preemptedResourceVCores: payload.preemptedResourceVCores, + numNonAMContainerPreempted: payload.numNonAMContainerPreempted, + numAMContainerPreempted: payload.numAMContainerPreempted + } + }; + + return fixedPayload; + }, + + normalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + var p = this.internalNormalizeSingleResponse(store, + primaryModelClass, payload, id, requestType); + return { data: p }; + }, + + normalizeArrayResponse(store, primaryModelClass, payload, id, + requestType) { + // return expected is { data: [ {}, {} ] } + var normalizedArrayResponse = {}; + + // payload has apps : { app: [ {},{},{} ] } + // need some error handling for ex apps or app may not be defined. + normalizedArrayResponse.data = payload.apps.app.map(singleApp => { + return this.internalNormalizeSingleResponse(store, primaryModelClass, + singleApp, singleApp.id, requestType); + }, this); + return normalizedArrayResponse; + } +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-container.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-container.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-container.js new file mode 100644 index 0000000..665b9df --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-container.js @@ -0,0 +1,54 @@ +import DS from 'ember-data'; +import Converter from 'yarn-ui/utils/converter'; + +export default DS.JSONAPISerializer.extend({ + internalNormalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + + var fixedPayload = { + id: payload.containerId, + type: primaryModelClass.modelName, // yarn-app + attributes: { + allocatedMB: payload.allocatedMB, + allocatedVCores: payload.allocatedVCores, + assignedNodeId: payload.assignedNodeId, + priority: payload.priority, + startedTime: Converter.timeStampToDate(payload.startedTime), + finishedTime: Converter.timeStampToDate(payload.finishedTime), + elapsedTime: payload.elapsedTime, + logUrl: payload.logUrl, + containerExitStatus: payload.containerExitStatus, + containerState: payload.containerState, + nodeHttpAddress: payload.nodeHttpAddress + } + }; + + return fixedPayload; + }, + + normalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + var p = this.internalNormalizeSingleResponse(store, + primaryModelClass, payload, id, requestType); + return { data: p }; + }, + + normalizeArrayResponse(store, primaryModelClass, payload, id, + requestType) { + // return expected is { data: [ {}, {} ] } + var normalizedArrayResponse = {}; + + if (payload && payload.container) { + // payload has apps : { app: [ {},{},{} ] } + // need some error handling for ex apps or app may not be defined. + normalizedArrayResponse.data = payload.container.map(singleContainer => { + return this.internalNormalizeSingleResponse(store, primaryModelClass, + singleContainer, singleContainer.id, requestType); + }, this); + return normalizedArrayResponse; + } + + normalizedArrayResponse.data = []; + return normalizedArrayResponse; + } +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-queue.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-queue.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-queue.js new file mode 100644 index 0000000..ce4d775 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/serializers/yarn-queue.js @@ -0,0 +1,127 @@ +import DS from 'ember-data'; + +export default DS.JSONAPISerializer.extend({ + + normalizeSingleResponse(store, primaryModelClass, payload, id, + requestType) { + var children = []; + if (payload.queues) { + payload.queues.queue.forEach(function(queue) { + children.push(queue.queueName); + }); + } + + var includedData = []; + var relationshipUserData = []; + + // update user models + if (payload.users && payload.users.user) { + payload.users.user.forEach(function(u) { + includedData.push({ + type: "YarnUser", + id: u.username + "_" + payload.queueName, + attributes: { + name: u.username, + queueName: payload.queueName, + usedMemoryMB: u.resourcesUsed.memory || 0, + usedVCore: u.resourcesUsed.vCores || 0, + } + }); + + relationshipUserData.push({ + type: "YarnUser", + id: u.username + "_" + payload.queueName, + }) + }); + } + + + var fixedPayload = { + id: id, + type: primaryModelClass.modelName, // yarn-queue + attributes: { + name: payload.queueName, + parent: payload.myParent, + children: children, + capacity: payload.capacity, + usedCapacity: payload.usedCapacity, + maxCapacity: payload.maxCapacity, + absCapacity: payload.absoluteCapacity, + absMaxCapacity: payload.absoluteMaxCapacity, + absUsedCapacity: payload.absoluteUsedCapacity, + state: payload.state, + userLimit: payload.userLimit, + userLimitFactor: payload.userLimitFactor, + preemptionDisabled: payload.preemptionDisabled, + numPendingApplications: payload.numPendingApplications, + numActiveApplications: payload.numActiveApplications, + }, + // Relationships + relationships: { + users: { + data: relationshipUserData + } + } + }; + + return { + queue: this._super(store, primaryModelClass, fixedPayload, id, requestType), + includedData: includedData + } + }, + + handleQueue(store, primaryModelClass, payload, id, requestType) { + var data = []; + var includedData = [] + var result = this.normalizeSingleResponse(store, primaryModelClass, + payload, id, requestType); + + data.push(result.queue); + includedData = includedData.concat(result.includedData); + + if (payload.queues) { + for (var i = 0; i < payload.queues.queue.length; i++) { + var queue = payload.queues.queue[i]; + queue.myParent = payload.queueName; + var childResult = this.handleQueue(store, primaryModelClass, queue, + queue.queueName, + requestType); + + data = data.concat(childResult.data); + includedData = includedData.concat(childResult.includedData); + } + } + + return { + data: data, + includedData, includedData + } + }, + + normalizeArrayResponse(store, primaryModelClass, payload, id, + requestType) { + var normalizedArrayResponse = {}; + var result = this.handleQueue(store, + primaryModelClass, + payload.scheduler.schedulerInfo, "root", requestType); + + normalizedArrayResponse.data = result.data; + normalizedArrayResponse.included = result.includedData; + + console.log(normalizedArrayResponse); + + return normalizedArrayResponse; + + /* + // return expected is { data: [ {}, {} ] } + var normalizedArrayResponse = {}; + + // payload has apps : { app: [ {},{},{} ] } + // need some error handling for ex apps or app may not be defined. + normalizedArrayResponse.data = payload.apps.app.map(singleApp => { + return this.normalizeSingleResponse(store, primaryModelClass, singleApp, singleApp.id, requestType); + }, this); + return normalizedArrayResponse; + */ + } +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/styles/app.css ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/styles/app.css b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/styles/app.css new file mode 100644 index 0000000..e1ff994 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/styles/app.css @@ -0,0 +1,141 @@ +/* + Over all style + */ +text { + font: 12px sans-serif; +} + +text.small { + font: 8px sans-serif; +} + +html, body +{ + margin: 0px; + padding: 0px; + height: 100%; + width: 100%; +} + +/* + queue's style (left banner of queues) + */ + +text.queue { + font-family : sans-serif; + font-size : 15px; + fill : gray; +} + +path.queue { + stroke: gray; + fill: none; +} + +circle.queue { + r: 10; + fill: Steelblue; +} + +/* + background style + */ +line.grid { + stroke: WhiteSmoke; +} + +line.chart { + stroke: Gray; +} + +/* + charts styles + */ +text.chart-title { + font-size: 30px; + font-family: sans-serif; + text-anchor: middle; + fill: Gray; +} + +text.donut-highlight-text { + font-size: 20px; + font-family: sans-serif; + text-anchor: middle; + fill: Gray; + vertical-align: middle; +} + +rect.chart-frame { + fill: none; + stroke: gray; + stroke-dasharray: 10,10; +} + +line.chart-leftbanner { + stroke-width: 2; + stroke: gray; + stroke-dasharray: 10,10; +} + +text.bar-chart-text { + font-size: 8px; + font-family: sans-serif; + vertical-align: middle; + fill: Gray;; +} + +div.tooltip { + position: absolute; + text-align: center; + /*height: 28px;*/ + padding: 2px; + font: 12px sans-serif; + background: lightsteelblue; + border: 0px; + border-radius: 8px; + pointer-events: none; +} + +/* + * Data table + */ + +table.dataTable thead .sorting { + background-image: url("/assets/images/datatables/sort_both.png"); +} +table.dataTable thead .sorting_asc { + background-image: url("/assets/images/datatables/sort_asc.png"); +} +table.dataTable thead .sorting_desc { + background-image: url("/assets/images/datatables/sort_desc.png"); +} +table.dataTable thead .sorting_asc_disabled { + background-image: url("/assets/images/datatables/sort_asc_disabled.png"); +} +table.dataTable thead .sorting_desc_disabled { + background-image: url("/assets/images/datatables/sort_desc_disabled.png"); +} + +/* + * Queue selector + */ +.node { + cursor: pointer; +} + +.node circle { + fill: #fff; + stroke: steelblue; + stroke-width: 3px; +} + +.node text { + font: 12px sans-serif; +} + +.link { + fill: none; + stroke: #ccc; + stroke-width: 2px; +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/application.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/application.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/application.hbs new file mode 100644 index 0000000..252ca74 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/application.hbs @@ -0,0 +1,25 @@ +<nav class="navbar navbar-default"> + <div class="container-fluid"> + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="#">Apache Hadoop YARN</a> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> + <ul class="nav navbar-nav"> + <li class="active"><a href="yarnQueue/root">Queues<span class="sr-only">(current)</span></a></li> + <li class="active"><a href="yarnApps">Applications<span class="sr-only">(current)</span></a></li> + <li class="active"><a href="clusterOverview">Cluster Overview<span class="sr-only">(current)</span></a></li> + </ul> + </div><!-- /.navbar-collapse --> + </div><!-- /.container-fluid --> +</nav> + +{{outlet}} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/cluster-overview.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/cluster-overview.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/cluster-overview.hbs new file mode 100644 index 0000000..81c11e9 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/cluster-overview.hbs @@ -0,0 +1,56 @@ +<div class="row"> + <div class="col-lg-3 container-fluid" id="finishedapps-donut-chart"> + {{donut-chart data=model.firstObject.getFinishedAppsDataForDonutChart + title="Finished Apps" + showLabels=true + parentId="finishedapps-donut-chart" + ratio=0.55 + maxHeight=350}} + </div> + + <div class="col-lg-3 container-fluid" id="runningapps-donut-chart"> + {{donut-chart data=model.firstObject.getRunningAppsDataForDonutChart + title="Running Apps" + showLabels=true + parentId="runningapps-donut-chart" + ratio=0.55 + maxHeight=350}} + </div> +</div> + +<hr> + +<div class="row"> + <div class="col-lg-3 container-fluid" id="nodes-donut-chart"> + {{donut-chart data=model.firstObject.getNodesDataForDonutChart + title="Node Managers" + showLabels=true + parentId="nodes-donut-chart" + ratio=0.55 + maxHeight=350}} + </div> +</div> + +<hr> + +<div class="row"> + <div class="col-lg-3 container-fluid" id="mem-donut-chart"> + {{donut-chart data=model.firstObject.getMemoryDataForDonutChart + title="Resource - Memory" + showLabels=true + parentId="mem-donut-chart" + ratio=0.55 + maxHeight=350}} + </div> + + <div class="col-lg-3 container-fluid" id="vcore-donut-chart"> + {{donut-chart data=model.firstObject.getVCoreDataForDonutChart + title="Resource - VCores" + showLabels=true + parentId="vcore-donut-chart" + ratio=0.6 + maxHeight=350}} + </div> +</div> + +{{outlet}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/.gitkeep ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/.gitkeep b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/.gitkeep new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-attempt-table.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-attempt-table.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-attempt-table.hbs new file mode 100644 index 0000000..633d363 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-attempt-table.hbs @@ -0,0 +1,28 @@ +<table id="app-attempt-table" class="table table-striped table-bordered" cellspacing="0" width="100%" height="100%"> + <tbody> + <tr> + <td>Application Attempt Id</td> + <td>{{attempt.id}}</td> + </tr> + <tr> + <td>Start Time</td> + <td>{{attempt.startTime}}</td> + </tr> + <tr> + <td>AM Container Id</td> + <td>{{attempt.containerId}}</td> + </tr> + <tr> + <td>AM Node Web UI</td> + <td><a href={{attempt.nodeHttpAddress}}>{{attempt.nodeHttpAddress}}</a></td> + </tr> + <tr> + <td>AM Node Id</td> + <td>{{attempt.nodeId}}</td> + </tr> + <tr> + <td>Log</td> + <td><a href={{attempt.logsLink}}>link</a></td> + </tr> + </tbody> +</table> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-table.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-table.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-table.hbs new file mode 100644 index 0000000..92e9d05 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/app-table.hbs @@ -0,0 +1,62 @@ +<table id={{table-id}} class="display table table-striped table-bordered" cellspacing="0" width="100%"> + <thead> + <tr> + <th>Application ID</th> + <th>Name</th> + <th>User</th> + <th>Queue</th> + <th>State</th> + <th>Final Status</th> + <th>Start Time</th> + <th>Elapsed Time</th> <!-- idx = 7 --> + <th>Finished Time</th> + <th>Priority</th> + <th>Progress</th> + </tr> + </thead> + <tbody> + {{#if arr}} + {{#each arr as |app|}} + <tr> + <td><a href="yarnApp/{{app.id}}">{{app.id}}</a></td> + <td>{{app.appName}}</td> + <td>{{app.user}}</td> + <td>{{app.queue}}</td> + <td>{{app.state}}</td> + <td><span class={{app.finalStatusStyle}}>{{app.finalStatus}}</span></td> + <td>{{app.startTime}}</td> + <td>{{app.elapsedTime}}</td> + <td>{{app.finishedTime}}</td> + <td>{{app.priority}}</td> + <td> + <div class="progress" style="margin-bottom: 0;"> + <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style={{app.progressStyle}}> + {{app.progress}}% + </div> + </div> + </td> + </tr> + {{/each}} + {{else}} + <tr> + <td><a href="yarnApp/{{app.id}}">{{app.id}}</a></td> + <td>{{app.appName}}</td> + <td>{{app.user}}</td> + <td>{{app.queue}}</td> + <td>{{app.state}}</td> + <td><span class={{app.finalStatusStyle}}>{{app.finalStatus}}</span></td> + <td>{{app.startTime}}</td> + <td>{{app.elapsedTime}}</td> + <td>{{app.finishedTime}}</td> + <td>{{app.priority}}</td> + <td> + <div class="progress" style="margin-bottom: 0;"> + <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style={{app.progressStyle}}> + {{app.progress}}% + </div> + </div> + </td> + </tr> + {{/if}} + </tbody> +</table> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/container-table.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/container-table.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/container-table.hbs new file mode 100644 index 0000000..70d3fc4 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/container-table.hbs @@ -0,0 +1,36 @@ +<table id="container-table" class="table table-striped table-bordered" cellspacing="0" width="100%" height="100%"> + <tbody> + <tr> + <td>Start Time</td> + <td>{{container.startedTime}}</td> + </tr> + <tr> + <td>Finished Time</td> + <td>{{container.finishedTime}}</td> + </tr> + <tr> + <td>Elapsed Time</td> + <td>{{container.elapsedTime}}</td> + </tr> + <tr> + <td>Priority</td> + <td>{{container.priority}}</td> + </tr> + <tr> + <td>Log</td> + <td><a href={{container.logUrl}}>link</a></td> + </tr> + <tr> + <td>Exit Status</td> + <td>{{container.containerExitStatus}}</td> + </tr> + <tr> + <td>State</td> + <td>{{container.containerState}}</td> + </tr> + <tr> + <td>NodeManager UI</td> + <td>{{container.nodeHttpAddress}}</td> + </tr> + </tbody> +</table> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-configuration-table.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-configuration-table.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-configuration-table.hbs new file mode 100644 index 0000000..fb9f1a0 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-configuration-table.hbs @@ -0,0 +1,40 @@ +<table id="queue-configuration-table" class="table table-striped table-bordered" cellspacing="0" width="100%" height="100%"> + <thead> + <tr> + <td><b>Configurations</b></td> + <td>Value</td> + </tr> + </thead> + <tbody> + <tr> + <td>Queue Name</td> + <td>{{queue.id}}</td> + </tr> + <tr> + <td>Configured Capacity</td> + <td>{{queue.capacity}}</td> + </tr> + <tr> + <td>Configured Max Capacity</td> + <td>{{queue.maxCapacity}}</td> + </tr> + <tr> + <td>State</td> + <td>{{queue.state}}</td> + </tr> + {{#if queue.isLeafQueue}} + <tr> + <td>User Limit Percent</td> + <td>{{queue.userLimit}}</td> + </tr> + <tr> + <td>User Limit Factor</td> + <td>{{queue.userLimitFactor}}</td> + </tr> + <tr> + <td>Preemption Disabled</td> + <td>{{queue.preemptionDisabled}}</td> + </tr> + {{/if}} + </tbody> +</table> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-navigator.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-navigator.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-navigator.hbs new file mode 100644 index 0000000..4ef22902 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/queue-navigator.hbs @@ -0,0 +1,18 @@ +<div class="row"> + <div class="col-lg-4"> + <select class="js-example-basic-single" width="100%" id="queue-name-selector"> + {{item-selector element-id="queue-name-selector" prefix="Queue : " model=model}} + </select> + </div> +</div><!-- /.row --> + +<!-- queue selector --> +<div class="row"> + <div class="col-md-12 container-fluid" id="tree-selector-container"> + {{tree-selector model=model parentId="tree-selector-container" selected=selected}} + </div> +</div> + +<hr> + +{{outlet}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/timeline-view.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/timeline-view.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/timeline-view.hbs new file mode 100644 index 0000000..657f6e8 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/components/timeline-view.hbs @@ -0,0 +1,35 @@ +<div class="col-md-12 container-fluid"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{#if attemptModel}} + Application Attempts + {{else}} + Containers + {{/if}} + </div> + <div class="panel-body"> + <div class="col-md-8 container-fluid" id={{parent-id}}> + </div> + + <!-- diag info --> + <div class="col-md-4 container-fluid"> + <div class="panel panel-default"> + <div class="panel-heading"> + {{#if selected.link}} + <a href={{selected.link}}>{{selected.id}}</a> + {{else}} + {{selected.id}} + {{/if}} + </div> + {{#if attemptModel}} + {{app-attempt-table attempt=selected}} + {{else}} + {{container-table container=selected}} + {{/if}} + </div> + </div> + </div> + </div> +</div> + +{{outlet}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app-attempt.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app-attempt.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app-attempt.hbs new file mode 100644 index 0000000..afcfa4f --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app-attempt.hbs @@ -0,0 +1,12 @@ +<div class="container-fluid"> + <div class="row"> + {{app-attempt-table attempt=model.attempt}} + </div> + + <!-- containers table --> + <div class="row"> + {{timeline-view parent-id="containers-timeline-div" my-id="timeline-view" height="400" rmModel=model.rmContainers tsModel=model.tsContainers label="shortAppAttemptId" attemptModel=false}} + </div> +</div> + +{{outlet}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app.hbs new file mode 100644 index 0000000..0ba6749 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-app.hbs @@ -0,0 +1,145 @@ +<div class="container-fluid"> + <!-- app table --> + <div class="row"> + <div class="col-md-12 container-fluid"> + <div class="panel panel-default"> + <div class="panel-heading"> + Application Basic Information + </div> + {{app-table table-id="app-table" app=model.app}} + </div> + </div> + </div> + + <!-- diag info and other infos --> + <div class="row"> + <!-- diag info --> + <div class="col-md-4 container-fluid"> + {{#if model.app.isFailed}} + <div class="panel panel-danger"> + <div class="panel-heading"> + Diagnostics + </div> + <div class="panel-body">{{model.app.diagnostics}}</div> + </div> + {{else}} + <div class="panel panel-default"> + <div class="panel-body"> + Diagnostics + </div> + <div class="panel-footer">{{model.app.diagnostics}}</div> + </div> + {{/if}} + </div> + + <div class="col-md-5 container-fluid"> + <div class="panel panel-default"> + <div class="panel-heading">Scheduling Info</div> + <table class="table"> + <tbody> + <tr> + <td>Allocated Resource</td> + <td>{{model.app.allocatedResource}}</td> + </tr> + <tr> + <td>Running Containers</td> + <td>{{model.app.runningContainers}}</td> + </tr> + <tr> + <td>Preempted Resource</td> + <td>{{model.app.preemptedResource}}</td> + </tr> + <tr> + <td>Num Non-AM container preempted</td> + <td>{{model.app.numAMContainerPreempted}}</td> + </tr> + <tr> + <td>Num AM container preempted</td> + <td>{{model.app.numAMContainerPreempted}}</td> + </tr> + <tr> + <td>Aggregated Resource Usage</td> + <td>{{model.app.aggregatedResourceUsage}}</td> + </tr> + </tbody> + </table> + </div> + </div> + + <!-- other info --> + <div class="col-md-3 container-fluid"> + <div class="panel panel-default"> + <div class="panel-heading">Other Info</div> + <table class="table"> + <tbody> + <tr> + <td>AM Container Log</td> + <td><a href={{model.app.amContainerLogs}}>Link</a></td> + </tr> + <tr> + <td>AM Host Http Addr</td> + <td><a href={{model.app.amHostHttpAddress}}>Link</a></td> + </tr> + <tr> + <td>Log Aggregation Status</td> + <td>{{model.app.logAggregationStatus}}</td> + </tr> + <tr> + <td>Is Unmanaged AM</td> + <td>{{model.app.unmanagedApplication}}</td> + </tr> + <tr> + <td>AM Node Label Expression</td> + <td>{{model.app.amNodeLabelExpression}}</td> + </tr> + </tbody> + </table> + </div> + </div> + </div> + +<!-- + <div class="row"> + <div class="col-md-12 container-fluid"> + <div class="panel panel-default"> + <div class="panel-heading"> + Application Attempts + </div> + <table id="app-attempt-table" class="table table-striped table-bordered" cellspacing="0" width="100%" height="100%"> + <thead> + <tr> + <th>Start Time</th> + <th>Master ContainerId</th> + <th>Node Http Address</th> + <th>Node Id</th> + <th>Logs Link</th> + </tr> + </thead> + <tbody> + {{#each model.attempts as |attempt|}} + <tr> + <td>{{attempt.startTime}}</td> + <td>{{attempt.containerId}}</td> + <td><a href={{attempt.nodeHttpAddress}}>{{attempt.nodeHttpAddress}}</a></td> + <td>{{attempt.nodeId}}</td> + <td><a href={{attempt.logsLink}}>link</a></td> + </tr> + {{/each}} + </tbody> + </table> + </div> + </div> + </div> +--> + <!-- timeline view of children --> + <div class="row"> + {{timeline-view parent-id="attempt-timeline-div" my-id="timeline-view" height="100%" rmModel=model.attempts label="shortAppAttemptId" attemptModel=true}} + </div> +</div> + +<!-- +{{simple-table table-id="app-attempt-table" paging=false bFilter=false}} +--> + + +{{outlet}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-apps.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-apps.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-apps.hbs new file mode 100644 index 0000000..e58d6bd --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-apps.hbs @@ -0,0 +1,3 @@ +{{app-table table-id="apps-table" arr=model}} +{{simple-table table-id="apps-table" bFilter=true colTypes="elapsed-time" colTargets="7"}} +{{outlet}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-queue.hbs ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-queue.hbs b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-queue.hbs new file mode 100644 index 0000000..11bb6f4 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/templates/yarn-queue.hbs @@ -0,0 +1,48 @@ +<div class="container-fluid"> + {{queue-navigator model=model.queues selected=model.selected}} +</div> + +<div class="row"> + <div class="col-lg-3 container-fluid"> + {{queue-configuration-table queue=model.selectedQueue}} + </div> + + <div class="col-lg-3 container-fluid" id="capacity-bar-chart"> + {{bar-chart data=model.selectedQueue.capacitiesBarChartData + title="Queue Capacities" + parentId="capacity-bar-chart" + textWidth=150 + ratio=0.5 + maxHeight=350}} + </div> + +{{#if model.selectedQueue.hasUserUsages}} + <div class="col-lg-3 container-fluid" id="userusage-donut-chart"> + {{donut-chart data=model.selectedQueue.userUsagesDonutChartData + title="User Usages" + showLabels=true + parentId="userusage-donut-chart" + maxHeight=350}} + </div> +{{/if}} + + <div class="col-lg-3 container-fluid" id="numapplications-donut-chart"> + {{donut-chart data=model.selectedQueue.numOfApplicationsDonutChartData + title="Running Apps" + showLabels=true + parentId="numapplications-donut-chart" + ratio=0.5 + maxHeight=350}} + </div> +</div> + +<hr> + +<div class="row"> + <div class="col-md-12 container-fluid"> + {{app-table table-id="apps-table" arr=model.apps}} + {{simple-table table-id="apps-table" bFilter=true colTypes="elapsed-time" colTargets="7"}} + </div> +</div> + +{{outlet}} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/converter.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/converter.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/converter.js new file mode 100644 index 0000000..41e6c9c --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/converter.js @@ -0,0 +1,74 @@ +export default { + containerIdToAttemptId: function(containerId) { + if (containerId) { + var arr = containerId.split('_'); + var attemptId = ["appattempt", arr[1], + arr[2], this.padding(arr[3], 6)]; + return attemptId.join('_'); + } + }, + attemptIdToAppId: function(attemptId) { + if (attemptId) { + var arr = attemptId.split('_'); + var appId = ["application", arr[1], + arr[2]].join('_'); + return appId; + } + }, + padding: function(str, toLen=2) { + str = str.toString(); + if (str.length >= toLen) { + return str; + } + return '0'.repeat(toLen - str.length) + str; + }, + resourceToString: function(mem, cpu) { + mem = Math.max(0, mem); + cpu = Math.max(0, cpu); + return mem + " MBs, " + cpu + " VCores"; + }, + msToElapsedTime: function(timeInMs) { + var sec_num = timeInMs / 1000; // don't forget the second param + var hours = Math.floor(sec_num / 3600); + var minutes = Math.floor((sec_num - (hours * 3600)) / 60); + var seconds = sec_num - (hours * 3600) - (minutes * 60); + + var timeStrArr = []; + + if (hours > 0) { + timeStrArr.push(hours + ' Hrs'); + } + if (minutes > 0) { + timeStrArr.push(minutes + ' Mins'); + } + if (seconds > 0) { + timeStrArr.push(Math.round(seconds) + " Secs"); + } + return timeStrArr.join(' : '); + }, + elapsedTimeToMs: function(elapsedTime) { + elapsedTime = elapsedTime.toLowerCase(); + var arr = elapsedTime.split(' : '); + var total = 0; + for (var i = 0; i < arr.length; i++) { + if (arr[i].indexOf('hr') > 0) { + total += parseInt(arr[i].substring(0, arr[i].indexOf(' '))) * 3600; + } else if (arr[i].indexOf('min') > 0) { + total += parseInt(arr[i].substring(0, arr[i].indexOf(' '))) * 60; + } else if (arr[i].indexOf('sec') > 0) { + total += parseInt(arr[i].substring(0, arr[i].indexOf(' '))); + } + } + return total * 1000; + }, + timeStampToDate: function(timeStamp) { + var dateTimeString = moment(parseInt(timeStamp)).format("YYYY/MM/DD HH:mm:ss"); + return dateTimeString; + }, + dateToTimeStamp: function(date) { + if (date) { + var ts = moment(date, "YYYY/MM/DD HH:mm:ss").valueOf(); + return ts; + } + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/sorter.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/sorter.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/sorter.js new file mode 100644 index 0000000..981429b --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/app/utils/sorter.js @@ -0,0 +1,15 @@ +import Converter from 'yarn-ui/utils/converter'; + +export default { + _initElapsedTimeSorter: function() { + jQuery.extend(jQuery.fn.dataTableExt.oSort, { + "elapsed-time-pre": function (a) { + return Converter.padding(Converter.elapsedTimeToMs(a), 20); + }, + }); + }, + + initDataTableSorter: function() { + this._initElapsedTimeSorter(); + }, +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/bower.json ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/bower.json b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/bower.json new file mode 100644 index 0000000..ec587bb --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/bower.json @@ -0,0 +1,22 @@ +{ + "name": "yarn-ui", + "dependencies": { + "ember": "2.0.1", + "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.4", + "ember-cli-test-loader": "ember-cli-test-loader#0.1.3", + "ember-data": "2.0.0", + "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.6", + "ember-qunit": "0.4.9", + "ember-qunit-notifications": "0.0.7", + "ember-resolver": "~0.1.18", + "jquery": "^1.11.3", + "loader.js": "ember-cli/loader.js#3.2.1", + "qunit": "~1.18.0", + "bootstrap": "~3.3.2", + "d3": "~3.5.6", + "datatables": "~1.10.8", + "spin.js": "~2.3.2", + "momentjs": "~2.10.6", + "select2": "4.0.0" + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/config/environment.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/config/environment.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/config/environment.js new file mode 100644 index 0000000..b898e0d --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/config/environment.js @@ -0,0 +1,47 @@ +/* jshint node: true */ + +module.exports = function(environment) { + var ENV = { + modulePrefix: 'yarn-ui', + environment: environment, + baseURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + // Here you can enable experimental features on an ember canary build + // e.g. 'with-controller': true + } + }, + + APP: { + // Here you can pass flags/options to your application instance + // when it is created + } + }; + + 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/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/ember-cli-build.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/ember-cli-build.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/ember-cli-build.js new file mode 100644 index 0000000..2fa2032 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/ember-cli-build.js @@ -0,0 +1,29 @@ +/* global require, module */ +var EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +module.exports = function(defaults) { + var app = new EmberApp(defaults, { + // Add options here + }); + + app.import("bower_components/datatables/media/css/jquery.dataTables.min.css"); + app.import("bower_components/datatables/media/js/jquery.dataTables.min.js"); + app.import("bower_components/momentjs/min/moment.min.js"); + app.import("bower_components/select2/dist/css/select2.min.css"); + app.import("bower_components/select2/dist/js/select2.min.js"); + + // Use `app.import` to add additional libraries to the generated + // output files. + // + // If you need to use different assets in different + // environments, specify an object as the first parameter. That + // object's keys should be the environment name and the values + // should be the asset to use in that environment. + // + // If the library that you are including contains AMD or ES6 + // modules that you would like to import into your application + // please specify an object with the list of modules as keys + // along with the exports of each module as its value. + + return app.toTree(); +}; http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/jsconfig.json ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/jsconfig.json b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/jsconfig.json new file mode 100644 index 0000000..875bb90 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/jsconfig.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + "target": "ES6", + "module": "commonjs" + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/package.json ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/package.json b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/package.json new file mode 100644 index 0000000..5500dcf --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/package.json @@ -0,0 +1,44 @@ +{ + "name": "yarn-ui", + "version": "0.0.0", + "description": "Small description for yarn-ui goes here", + "private": true, + "directories": { + "doc": "doc", + "test": "tests" + }, + "scripts": { + "build": "ember build", + "start": "ember server", + "test": "ember test" + }, + "repository": "", + "engines": { + "node": ">= 0.10.0" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "broccoli-asset-rev": "^2.1.2", + "ember-bootstrap": "0.2.0", + "ember-cli": "1.13.8", + "ember-cli-app-version": "0.5.0", + "ember-cli-babel": "^5.1.3", + "ember-cli-content-security-policy": "0.4.0", + "ember-cli-dependency-checker": "^1.0.1", + "ember-cli-htmlbars": "0.7.9", + "ember-cli-htmlbars-inline-precompile": "^0.2.0", + "ember-cli-ic-ajax": "0.2.1", + "ember-cli-inject-live-reload": "^1.3.1", + "ember-cli-qunit": "^1.0.0", + "ember-cli-release": "0.2.3", + "ember-cli-sri": "^1.0.3", + "ember-cli-uglify": "^1.2.0", + "ember-d3": "0.1.0", + "ember-data": "1.13.8", + "ember-disable-proxy-controllers": "^1.0.0", + "ember-export-application-global": "^1.0.3", + "ember-spin-spinner": "0.2.3", + "select2": "4.0.0" + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/Sorting icons.psd ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/Sorting icons.psd b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/Sorting icons.psd new file mode 100644 index 0000000..53b2e06 Binary files /dev/null and b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/Sorting icons.psd differ http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/favicon.ico ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/favicon.ico b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/favicon.ico new file mode 100644 index 0000000..6eeaa2a Binary files /dev/null and b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/favicon.ico differ http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc.png ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc.png b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc.png new file mode 100644 index 0000000..e1ba61a Binary files /dev/null and b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc.png differ http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc_disabled.png ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc_disabled.png b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc_disabled.png new file mode 100644 index 0000000..fb11dfe Binary files /dev/null and b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_asc_disabled.png differ http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_both.png ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_both.png b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_both.png new file mode 100644 index 0000000..af5bc7c Binary files /dev/null and b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_both.png differ http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc.png ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc.png b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc.png new file mode 100644 index 0000000..0e156de Binary files /dev/null and b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc.png differ http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc_disabled.png ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc_disabled.png b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc_disabled.png new file mode 100644 index 0000000..c9fdd8a Binary files /dev/null and b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/assets/images/datatables/sort_desc_disabled.png differ http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/crossdomain.xml ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/crossdomain.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/crossdomain.xml new file mode 100644 index 0000000..0c16a7a --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/crossdomain.xml @@ -0,0 +1,15 @@ +<?xml version="1.0"?> +<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> +<cross-domain-policy> + <!-- Read this: www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html --> + + <!-- Most restrictive policy: --> + <site-control permitted-cross-domain-policies="none"/> + + <!-- Least restrictive policy: --> + <!-- + <site-control permitted-cross-domain-policies="all"/> + <allow-access-from domain="*" to-ports="*" secure="false"/> + <allow-http-request-headers-from domain="*" headers="*" secure="false"/> + --> +</cross-domain-policy> http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/robots.txt ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/robots.txt b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/robots.txt new file mode 100644 index 0000000..f591645 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/public/robots.txt @@ -0,0 +1,3 @@ +# http://www.robotstxt.org +User-agent: * +Disallow: http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/testem.json ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/testem.json b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/testem.json new file mode 100644 index 0000000..0f35392 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/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/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/.jshintrc ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/.jshintrc b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/.jshintrc new file mode 100644 index 0000000..6ec0b7c --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/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/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/resolver.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/resolver.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/resolver.js new file mode 100644 index 0000000..28f4ece --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/resolver.js @@ -0,0 +1,11 @@ +import Resolver from 'ember/resolver'; +import config from '../../config/environment'; + +var resolver = Resolver.create(); + +resolver.namespace = { + modulePrefix: config.modulePrefix, + podModulePrefix: config.podModulePrefix +}; + +export default resolver; http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/start-app.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/start-app.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/start-app.js new file mode 100644 index 0000000..0f7aab1 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/helpers/start-app.js @@ -0,0 +1,18 @@ +import Ember from 'ember'; +import Application from '../../app'; +import config from '../../config/environment'; + +export default function startApp(attrs) { + var application; + + var attributes = Ember.merge({}, config.APP); + attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; + + Ember.run(function() { + application = Application.create(attributes); + application.setupForTesting(); + application.injectTestHelpers(); + }); + + return application; +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/index.html ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/index.html b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/index.html new file mode 100644 index 0000000..33f7045 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/index.html @@ -0,0 +1,33 @@ +<!DOCTYPE html> +<html> + <head> + <meta charset="utf-8"> + <meta http-equiv="X-UA-Compatible" content="IE=edge"> + <title>YarnUi 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/yarn-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/yarn-ui.js"></script> + <script src="testem.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/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/test-helper.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/test-helper.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/test-helper.js new file mode 100644 index 0000000..e6cfb70 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/test-helper.js @@ -0,0 +1,6 @@ +import resolver from './helpers/resolver'; +import { + setResolver +} from 'ember-qunit'; + +setResolver(resolver); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/.gitkeep ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/.gitkeep b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/.gitkeep new file mode 100644 index 0000000..e69de29 http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/adapters/yarn-app-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/adapters/yarn-app-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/adapters/yarn-app-test.js new file mode 100644 index 0000000..5683d5a --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/adapters/yarn-app-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('adapter:yarn-app', 'Unit | Adapter | yarn app', { + // Specify the other units that are required for this test. + // needs: ['serializer:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + var adapter = this.subject(); + assert.ok(adapter); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-apps-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-apps-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-apps-test.js new file mode 100644 index 0000000..d25f72d --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-apps-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:yarn-apps', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + var controller = this.subject(); + assert.ok(controller); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-queues-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-queues-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-queues-test.js new file mode 100644 index 0000000..313dfdd --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/controllers/yarn-queues-test.js @@ -0,0 +1,12 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('controller:yarn-queues', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +// Replace this with your real tests. +test('it exists', function(assert) { + var controller = this.subject(); + assert.ok(controller); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/mixins/charts-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/mixins/charts-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/mixins/charts-test.js new file mode 100644 index 0000000..b4f3503 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/mixins/charts-test.js @@ -0,0 +1,12 @@ +import Ember from 'ember'; +import ChartsMixin from '../../../mixins/charts'; +import { module, test } from 'qunit'; + +module('Unit | Mixin | charts'); + +// Replace this with your real tests. +test('it works', function(assert) { + var ChartsObject = Ember.Object.extend(ChartsMixin); + var subject = ChartsObject.create(); + assert.ok(subject); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/models/yarn-app-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/models/yarn-app-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/models/yarn-app-test.js new file mode 100644 index 0000000..e3261e2 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/models/yarn-app-test.js @@ -0,0 +1,12 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('yarn-app', 'Unit | Model | yarn app', { + // Specify the other units that are required for this test. + needs: [] +}); + +test('it exists', function(assert) { + var model = this.subject(); + // var store = this.store(); + assert.ok(!!model); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/routes/yarn-apps-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/routes/yarn-apps-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/routes/yarn-apps-test.js new file mode 100644 index 0000000..a438b2e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/routes/yarn-apps-test.js @@ -0,0 +1,11 @@ +import { moduleFor, test } from 'ember-qunit'; + +moduleFor('route:yarn-apps', 'Unit | Route | yarn apps', { + // Specify the other units that are required for this test. + // needs: ['controller:foo'] +}); + +test('it exists', function(assert) { + var route = this.subject(); + assert.ok(route); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/serializers/yarn-app-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/serializers/yarn-app-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/serializers/yarn-app-test.js new file mode 100644 index 0000000..a169fd5 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/serializers/yarn-app-test.js @@ -0,0 +1,15 @@ +import { moduleForModel, test } from 'ember-qunit'; + +moduleForModel('yarn-app', 'Unit | Serializer | yarn app', { + // Specify the other units that are required for this test. + needs: ['serializer:yarn-app'] +}); + +// Replace this with your real tests. +test('it serializes records', function(assert) { + var record = this.subject(); + + var serializedRecord = record.serialize(); + + assert.ok(serializedRecord); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/utils/converter-test.js ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/utils/converter-test.js b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/utils/converter-test.js new file mode 100644 index 0000000..55cf71d --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/tests/unit/utils/converter-test.js @@ -0,0 +1,10 @@ +import converter from '../../../utils/converter'; +import { module, test } from 'qunit'; + +module('Unit | Utility | converter'); + +// Replace this with your real tests. +test('it works', function(assert) { + var result = converter(); + assert.ok(result); +}); http://git-wip-us.apache.org/repos/asf/hadoop/blob/09bf289e/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/vendor/.gitkeep ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/vendor/.gitkeep b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-ui/vendor/.gitkeep new file mode 100644 index 0000000..e69de29 --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org