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()