You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ak...@apache.org on 2014/02/24 17:26:38 UTC
git commit: AMBARI-4805. Mirroring: actions dropdown should be shown
for each instance. (akovalenko)
Repository: ambari
Updated Branches:
refs/heads/trunk 8b1cae43f -> 297fff3cf
AMBARI-4805. Mirroring: actions dropdown should be shown for each instance. (akovalenko)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/297fff3c
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/297fff3c
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/297fff3c
Branch: refs/heads/trunk
Commit: 297fff3cf78ed720951cc71dc7bf4dda642a5837
Parents: 8b1cae4
Author: Aleksandr Kovalenko <ak...@hortonworks.com>
Authored: Mon Feb 24 18:25:25 2014 +0200
Committer: Aleksandr Kovalenko <ak...@hortonworks.com>
Committed: Mon Feb 24 18:25:25 2014 +0200
----------------------------------------------------------------------
ambari-web/app/assets/data/mirroring/feeds.xml | 40 ++++-----
.../main/mirroring/jobs_controller.js | 42 +++++++++
.../controllers/main/mirroring_controller.js | 3 +-
ambari-web/app/mappers/dataset_mapper.js | 2 +-
ambari-web/app/messages.js | 1 +
ambari-web/app/models/dataset_job.js | 12 +++
.../app/templates/main/mirroring/jobs.hbs | 92 +++++++++++---------
ambari-web/app/utils/ajax.js | 42 +++++++++
.../app/views/main/mirroring/jobs_view.js | 27 +++++-
9 files changed, 197 insertions(+), 64 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/assets/data/mirroring/feeds.xml
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/data/mirroring/feeds.xml b/ambari-web/app/assets/data/mirroring/feeds.xml
index d200427..8f8784d 100644
--- a/ambari-web/app/assets/data/mirroring/feeds.xml
+++ b/ambari-web/app/assets/data/mirroring/feeds.xml
@@ -1,22 +1,18 @@
-<?xml version="1.0"?>
-<feed description="" name="dataset1" xmlns="uri:falcon:feed:0.1">
- <frequency>minutes(10)</frequency>
- <clusters>
- <cluster name="mycluster" type="source">
- <validity start="2014-02-17T06:00Z" end="2014-02-19T01:00Z"/>
- <retention limit="days(7)" action="delete"/>
- </cluster>
- <cluster name="cluster1" type="target">
- <validity start="2014-02-17T06:00Z" end="2014-02-17T06:00Z"/>
- <retention limit="months(1)" action="delete"/>
- <locations>
- <location type="data" path="/backup/app-logs"/>
- </locations>
- </cluster>
- </clusters>
- <locations>
- <location type="data" path="/app-logs"/>
- </locations>
- <ACL owner="hue" group="users" permission="0755"/>
- <schema location="/none" provider="none"/>
-</feed>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<entities>
+ <entity>
+ <type>feed</type>
+ <name>dataset1</name>
+ <status>RUNNING</status>
+ </entity>
+ <entity>
+ <type>feed</type>
+ <name>dataset2</name>
+ <status>RUNNING</status>
+ </entity>
+ <entity>
+ <type>feed</type>
+ <name>dataset3</name>
+ <status>RUNNING</status>
+ </entity>
+</entities>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/controllers/main/mirroring/jobs_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/mirroring/jobs_controller.js b/ambari-web/app/controllers/main/mirroring/jobs_controller.js
index 592a03f..410228f 100644
--- a/ambari-web/app/controllers/main/mirroring/jobs_controller.js
+++ b/ambari-web/app/controllers/main/mirroring/jobs_controller.js
@@ -105,6 +105,48 @@ App.MainDatasetJobsController = Em.Controller.extend({
App.store.commit();
},
+ suspendInstance: function (event) {
+ App.ajax.send({
+ name: 'mirroring.suspend_instance',
+ sender: this,
+ data: {
+ feed: this.get('content.name'),
+ name: event.context.get('name'),
+ job: event.context,
+ falconServer: App.get('falconServerURL')
+ },
+ error: 'onError'
+ });
+ },
+
+ resumeInstance: function (event) {
+ App.ajax.send({
+ name: 'mirroring.resume_instance',
+ sender: this,
+ data: {
+ feed: this.get('content.name'),
+ name: event.context.get('name'),
+ job: event.context,
+ falconServer: App.get('falconServerURL')
+ },
+ error: 'onError'
+ });
+ },
+
+ killInstance: function (event) {
+ App.ajax.send({
+ name: 'mirroring.kill_instance',
+ sender: this,
+ data: {
+ feed: this.get('content.name'),
+ name: event.context.get('name'),
+ job: event.context,
+ falconServer: App.get('falconServerURL')
+ },
+ error: 'onError'
+ });
+ },
+
onError: function () {
App.showAlertPopup(Em.I18n.t('common.error'), arguments[2]);
},
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/controllers/main/mirroring_controller.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/mirroring_controller.js b/ambari-web/app/controllers/main/mirroring_controller.js
index 02ef2c2..b1370d6 100644
--- a/ambari-web/app/controllers/main/mirroring_controller.js
+++ b/ambari-web/app/controllers/main/mirroring_controller.js
@@ -151,7 +151,8 @@ App.MainMirroringController = Em.ArrayController.extend({
data.instances.forEach(function (instance) {
datasetJobs.push({
dataset: opts.dataset,
- id: instance.instance,
+ id: instance.instance + '_' + opts.dataset,
+ name: instance.instance,
status: instance.status,
endTime: new Date(instance.endTime).getTime(),
startTime: new Date(instance.startTime).getTime()
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/mappers/dataset_mapper.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mappers/dataset_mapper.js b/ambari-web/app/mappers/dataset_mapper.js
index 47c6a8d..0e4e9c8 100644
--- a/ambari-web/app/mappers/dataset_mapper.js
+++ b/ambari-web/app/mappers/dataset_mapper.js
@@ -41,7 +41,7 @@ App.dataSetMapper = App.QuickDataMapper.create({
},
jobs_config: {
id: 'id',
- name: 'id',
+ name: 'name',
status : 'status',
start_date: 'startTime',
end_date: 'endTime',
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index b71a45f..d4850ac 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -1825,6 +1825,7 @@ Em.I18n.translations = {
'mirroring.table.jobId':'Instance ID',
'mirroring.table.start':'Start',
'mirroring.table.end':'End',
+ 'mirroring.table.status':'Status',
'mirroring.required.error': 'This field is required',
'mirroring.dateOrder.error': 'End Date must be after Start Date',
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/models/dataset_job.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/models/dataset_job.js b/ambari-web/app/models/dataset_job.js
index a761d7b..486ff78 100644
--- a/ambari-web/app/models/dataset_job.js
+++ b/ambari-web/app/models/dataset_job.js
@@ -27,6 +27,18 @@ App.DataSetJob = DS.Model.extend({
startDate: DS.attr('number'),
endDate: DS.attr('number'),
+ statusFormatted: function () {
+ return this.get('status').toLowerCase().capitalize();
+ }.property('status'),
+
+ isCompleted: function () {
+ return ['KILLED', 'FAILED', 'SUCCEEDED', 'ERROR'].contains(this.get('status'));
+ }.property('status'),
+
+ isSuspended: function () {
+ return this.get('status') === 'SUSPENDED';
+ }.property('status'),
+
startFormatted: function () {
if (this.get('startDate')) {
return $.timeago(this.get('startDate'));
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/templates/main/mirroring/jobs.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/main/mirroring/jobs.hbs b/ambari-web/app/templates/main/mirroring/jobs.hbs
index fb01548..f69d7fa 100644
--- a/ambari-web/app/templates/main/mirroring/jobs.hbs
+++ b/ambari-web/app/templates/main/mirroring/jobs.hbs
@@ -42,42 +42,29 @@
<span class="caret"></span>
</button>
<ul class="dropdown-menu pull-right">
- {{#if view.dataset.isRunning}}
+ {{#if view.dataset.isSuspended}}
<li>
- <a href="javascript:void(null);" {{action suspend target="controller"}}>
- {{t mirroring.dataset.suspendInstance}}
- </a>
- </li>
- <li>
- <a href="javascript:void(null);">
- {{t mirroring.dataset.killInstance}}
+ <a href="javascript:void(null);" {{action schedule target="controller"}}>
+ {{t mirroring.dataset.schedule}}
</a>
</li>
{{else}}
- {{#if view.dataset.isSuspended}}
- <li>
- <a href="javascript:void(null);" {{action schedule target="controller"}}>
- {{t mirroring.dataset.schedule}}
- </a>
- </li>
- {{else}}
- <li>
- <a href="javascript:void(null);" {{action suspend target="controller"}}>
- {{t mirroring.dataset.suspend}}
- </a>
- </li>
- {{/if}}
<li>
- <a {{action editDataset}} href="javascript:void(null);">
- {{t common.edit}}
- </a>
- </li>
- <li>
- <a href="javascript:void(null);" {{action delete target="controller"}}>
- {{t common.delete}}
+ <a href="javascript:void(null);" {{action suspend target="controller"}}>
+ {{t mirroring.dataset.suspend}}
</a>
</li>
{{/if}}
+ <li>
+ <a {{action editDataset}} href="javascript:void(null);">
+ {{t common.edit}}
+ </a>
+ </li>
+ <li>
+ <a href="javascript:void(null);" {{action delete target="controller"}}>
+ {{t common.delete}}
+ </a>
+ </li>
</ul>
</div>
<span {{bindAttr class=":label view.dataset.isRunning:label-info view.dataset.isSuspended:label-warning view.dataset.isScheduled:label-success :pull-right :dataset-status"}}>
@@ -96,6 +83,7 @@
{{view view.parentView.idSort}}
{{view view.parentView.startSort}}
{{view view.parentView.endSort}}
+ {{view view.parentView.statusSort}}
{{/view}}
</tr>
<tr class="filter-row">
@@ -103,34 +91,60 @@
<th>{{view view.idFilterView}}</th>
<th>{{view view.startFilterView}}</th>
<th>{{view view.endFilterView}}</th>
+ <th>{{view view.statusFilterView}}</th>
</tr>
</thead>
<tbody>
{{#if controller.isLoaded}}
{{#if view.pageContent}}
{{#each job in view.pageContent}}
- {{#view view.JobView contentBinding="job"}}
-
- <td class="first">
- <span {{ bindAttr class="job.healthClass"}}></span>
- </td>
+ {{#view view.JobView contentBinding="job"}}
+ <td class="first">
+ <span {{ bindAttr class="job.healthClass"}}></span>
+ </td>
- <td>{{unbound job.id}}</td>
- <td>{{unbound job.startFormatted}}</td>
- <td>{{unbound job.endFormatted}}</td>
- {{/view}}
+ <td>{{unbound job.name}}</td>
+ <td>{{unbound job.startFormatted}}</td>
+ <td>{{unbound job.endFormatted}}</td>
+ <td>
+ {{#if job.isCompleted}}
+ {{job.statusFormatted}}
+ {{else}}
+ <div class="btn-group display-inline-block">
+ <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+ {{job.statusFormatted}}
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu">
+ {{#if job.isSuspended}}
+ <li>
+ <a href="javascript:void(null)" {{action resumeInstance job target="controller"}}>{{t mirroring.dataset.resumeInstance}}</a>
+ </li>
+ {{else}}
+ <li>
+ <a href="javascript:void(null)" {{action suspendInstance job target="controller"}}>{{t mirroring.dataset.suspendInstance}}</a>
+ </li>
+ {{/if}}
+ <li>
+ <a href="javascript:void(null)" {{action killInstance job target="controller"}}>{{t mirroring.dataset.killInstance}}</a>
+ </li>
+ </ul>
+ </div>
+ {{/if}}
+ </td>
+ {{/view}}
{{/each}}
{{else}}
<tr>
<td class="first"></td>
- <td colspan="3">
+ <td colspan="4">
{{t mirroring.table.noJobs}}
</td>
</tr>
{{/if}}
{{else}}
<tr>
- <td colspan="4">
+ <td colspan="5">
<div class="spinner"></div>
</td>
</tr>
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/utils/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax.js b/ambari-web/app/utils/ajax.js
index f58e82b..4b7e733 100644
--- a/ambari-web/app/utils/ajax.js
+++ b/ambari-web/app/utils/ajax.js
@@ -1582,6 +1582,48 @@ var urls = {
}
},
+ 'mirroring.suspend_instance': {
+ 'real': '/proxy?url=http://{falconServer}:15000/api/instance/suspend/feed/{feed}?start={name}',
+ 'mock': '/data/mirroring/succeeded.json',
+ 'apiPrefix': '',
+ 'type': 'POST',
+ 'format': function (data) {
+ return {
+ headers: {
+ 'AmbariProxy-Remote-user': 'ambari-qa'
+ }
+ }
+ }
+ },
+
+ 'mirroring.resume_instance': {
+ 'real': '/proxy?url=http://{falconServer}:15000/api/instance/resume/feed/{feed}?start={name}',
+ 'mock': '/data/mirroring/succeeded.json',
+ 'apiPrefix': '',
+ 'type': 'POST',
+ 'format': function (data) {
+ return {
+ headers: {
+ 'AmbariProxy-Remote-user': 'ambari-qa'
+ }
+ }
+ }
+ },
+
+ 'mirroring.kill_instance': {
+ 'real': '/proxy?url=http://{falconServer}:15000/api/instance/kill/feed/{feed}?start={name}',
+ 'mock': '/data/mirroring/succeeded.json',
+ 'apiPrefix': '',
+ 'type': 'POST',
+ 'format': function (data) {
+ return {
+ headers: {
+ 'AmbariProxy-Remote-user': 'ambari-qa'
+ }
+ }
+ }
+ },
+
'bulk_request.host_components': {
'real': '/clusters/{clusterName}/host_components',
'mock': '',
http://git-wip-us.apache.org/repos/asf/ambari/blob/297fff3c/ambari-web/app/views/main/mirroring/jobs_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/main/mirroring/jobs_view.js b/ambari-web/app/views/main/mirroring/jobs_view.js
index 332a250..9919f52 100644
--- a/ambari-web/app/views/main/mirroring/jobs_view.js
+++ b/ambari-web/app/views/main/mirroring/jobs_view.js
@@ -49,6 +49,12 @@ App.MainDatasetJobsView = App.TableView.extend({
displayName: Em.I18n.t('mirroring.table.end'),
type: 'number'
}),
+ statusSort: sort.fieldView.extend({
+ column: 4,
+ name: 'statusFormatted',
+ displayName: Em.I18n.t('mirroring.table.status'),
+ type: 'string'
+ }),
/**
* Filter view for name column
@@ -72,7 +78,7 @@ App.MainDatasetJobsView = App.TableView.extend({
}),
endFilterView: filters.createSelectView({
- fieldType: 'input-medium',
+ fieldType: 'input-small',
column: 3,
content: ['Any', 'Past 1 Day', 'Past 2 Days', 'Past 7 Days', 'Past 14 Days', 'Past 30 Days'],
onChangeValue: function () {
@@ -80,6 +86,24 @@ App.MainDatasetJobsView = App.TableView.extend({
}
}),
+ statusFilterView: filters.createSelectView({
+ fieldType: 'input-small',
+ column: 4,
+ content: ['Any', 'Waiting', 'Running', 'Suspended', 'Killed', 'Failed', 'Succeeded', 'Error'],
+ onClearValue: function () {
+ if (this.get('value') === '') {
+ this.set('value', 'Any');
+ }
+ }.observes('value'),
+ onChangeValue: function () {
+ var value = this.get('value');
+ if (value === 'Any') {
+ value = '';
+ }
+ this.get('parentView').updateFilter(this.get('column'), value, 'string');
+ }
+ }),
+
JobView: Em.View.extend({
content: null,
tagName: 'tr',
@@ -165,6 +189,7 @@ App.MainDatasetJobsView = App.TableView.extend({
associations[1] = 'name';
associations[2] = 'startDate';
associations[3] = 'endDate';
+ associations[4] = 'statusFormatted';
return associations;
}.property()