Browse Source

HUE-1176 [jb] Add initial Oozie pagination

Romain Rigaux 8 năm trước cách đây
mục cha
commit
eb4b9e9

+ 4 - 1
apps/jobbrowser/src/jobbrowser/api2.py

@@ -52,7 +52,10 @@ def jobs(request):
   interface = json.loads(request.POST.get('interface'))
   filters = dict([(key, value) for _filter in json.loads(request.POST.get('filters', '[]')) for key, value in _filter.items() if value])
 
-  response['apps'] = get_api(request.user, interface).apps(filters)
+  jobs = get_api(request.user, interface).apps(filters)
+
+  response['apps'] = jobs['apps']
+  response['total'] = jobs.get('total')
   response['status'] = 0
 
   return JsonResponse(response)

+ 6 - 3
apps/jobbrowser/src/jobbrowser/apis/bundle_api.py

@@ -41,9 +41,10 @@ class BundleApi(Api):
   def apps(self, filters):
     oozie_api = get_oozie(self.user)
     kwargs = {'cnt': OOZIE_JOBS_COUNT.get(), 'filters': []}
-    wf_list = oozie_api.get_bundles(**kwargs)
+    jobs = oozie_api.get_bundles(**kwargs)
 
-    return [{
+    return {
+      'apps': [{
         'id': app.id,
         'name': app.appName,
         'status': app.status,
@@ -52,7 +53,9 @@ class BundleApi(Api):
         'progress': 100,
         'duration': 10 * 3600,
         'submitted': 10 * 3600
-    } for app in wf_list.jobs]
+      } for app in jobs.jobs],
+      'total': jobs.total
+    }
 
   def app(self, appid):
     oozie_api = get_oozie(self.user)

+ 13 - 4
apps/jobbrowser/src/jobbrowser/apis/job_api.py

@@ -94,7 +94,8 @@ class YarnApi(Api):
 
     jobs = NativeYarnApi(self.user).get_jobs(**filter_params)
 
-    return [{
+    return {
+      'apps': [{
         'id': app.jobId,
         'name': app.name,
         'type': app.applicationType,
@@ -104,7 +105,9 @@ class YarnApi(Api):
         'progress': app.progress,
         'duration': 10 * 3600,
         'submitted': 10 * 3600
-    } for app in jobs]
+      } for app in jobs],
+      'total': None
+    }
 
   def app(self, appid):
     app = NativeYarnApi(self.user).get_job(jobid=appid)
@@ -188,7 +191,10 @@ class YarnMapReduceTaskApi(Api):
 
 
   def apps(self):
-    return [self._massage_task(task) for task in NativeYarnApi(self.user).get_tasks(jobid=self.app_id, pagenum=1)]
+    return {
+      'apps': [self._massage_task(task) for task in NativeYarnApi(self.user).get_tasks(jobid=self.app_id, pagenum=1)],
+      'total': None
+    }
 
 
   def app(self, appid):
@@ -246,7 +252,10 @@ class YarnMapReduceTaskAttemptApi(Api):
 
 
   def apps(self):
-    return [self._massage_task(task) for task in NativeYarnApi(self.user).get_task(jobid=self.app_id, task_id=self.task_id).attempts]
+    return {
+      'apps': [self._massage_task(task) for task in NativeYarnApi(self.user).get_task(jobid=self.app_id, task_id=self.task_id).attempts],
+      'total': None
+    }
 
 
   def app(self, appid):

+ 6 - 3
apps/jobbrowser/src/jobbrowser/apis/schedule_api.py

@@ -42,9 +42,10 @@ class ScheduleApi(Api):
   def apps(self, filters):
     oozie_api = get_oozie(self.user)
     kwargs = {'cnt': OOZIE_JOBS_COUNT.get(), 'filters': []}
-    wf_list = oozie_api.get_coordinators(**kwargs)
+    jobs = oozie_api.get_coordinators(**kwargs)
 
-    return [{
+    return {
+      'apps':[{
         'id': app.id,
         'name': app.appName,
         'status': app.status,
@@ -54,7 +55,9 @@ class ScheduleApi(Api):
         'progress': app.get_progress(),
         'duration': 10 * 3600,
         'submitted': 10 * 3600
-    } for app in wf_list.jobs]
+      } for app in jobs.jobs],
+      'total': jobs.total
+    }
 
 
   def app(self, appid):

+ 5 - 2
apps/jobbrowser/src/jobbrowser/apis/slas_api.py

@@ -68,7 +68,8 @@ class SlaApi(Api):
 #   configuration = oozie_api.get_configuration()
 #   show_slas_hint = 'org.apache.oozie.sla.service.SLAService' not in configuration.get('oozie.services.ext', '')
 
-    return [{
+    return {
+      'apps': [{
         'id': app.id,
         'name': app.appName,
         'status': app.status,
@@ -77,7 +78,9 @@ class SlaApi(Api):
         'progress': 100,
         'duration': 10 * 3600,
         'submitted': 10 * 3600
-    } for app in wf_list.jobs]
+      } for app in wf_list.jobs],
+      'total': None
+    }
 
   def app(self, appid):
     oozie_api = get_oozie(self.user)

+ 9 - 2
apps/jobbrowser/src/jobbrowser/apis/workflow_api.py

@@ -52,6 +52,10 @@ class WorkflowApi(Api):
     if ENABLE_OOZIE_BACKEND_FILTERING.get() and text_filters.get('text'):
       kwargs['filters'].extend([('text', text_filters.get('text'))])
 
+    if filters['pagination']:
+      kwargs['offset'] = filters['pagination']['offset']
+      kwargs['cnt'] = min(filters['pagination']['limit'], OOZIE_JOBS_COUNT.get())
+
     if filters.get('states'):
       states_filters = {'running': ['RUNNING', 'PREP', 'SUSPENDED'], 'completed': ['SUCCEEDED'], 'failed': ['FAILED', 'KILLED'],}
       for _state in filters.get('states'):
@@ -62,7 +66,8 @@ class WorkflowApi(Api):
 
     wf_list = oozie_api.get_workflows(**kwargs)
 
-    return [{
+    return {
+      'apps':[{
         'id': app.id,
         'name': app.appName,
         'status': app.status,
@@ -72,7 +77,9 @@ class WorkflowApi(Api):
         'progress': app.get_progress(),
         'duration': 10 * 3600,
         'submitted': 10 * 3600
-    } for app in wf_list.jobs]
+      } for app in wf_list.jobs],
+      'total': wf_list.total
+    }
 
 
   def app(self, appid):

+ 33 - 23
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -305,7 +305,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
   <!-- ko ifnot: hasPagination -->
   <div class="inline">
     <span data-bind="text: paginationResultCounts()"></span>
-    ${ _('jobs') }.
+    ${ _('jobs') }
   </div>
   <!-- /ko -->
 
@@ -318,7 +318,6 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       <span data-bind="text: Math.min(paginationPage() * paginationResultPage(), paginationResultCounts())"></span>
       ${ _('of') }
       <span data-bind="text: paginationResultCounts"></span>
-      .
 
       ##${ _('Show')}
       ##<span data-bind="text: paginationResultPage"></span>
@@ -326,10 +325,10 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     </div>
 
     <ul class="inline">
-      <li class="previous-page">
+      <li class="previous-page" data-bind="visible: showPreviousPage">
         <a href="javascript:void(0);" data-bind="click: previousPage" title="${_('Previous page')}"><i class="fa fa-backward"></i></a>
       </li>
-      <li class="next-page">
+      <li class="next-page" data-bind="visible: showNextPage">
         <a href="javascript:void(0);" data-bind="click: nextPage" title="${_('Next page')}"><i class="fa fa-forward"></i></a>
       </li>
     </ul>
@@ -1196,6 +1195,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       var self = this;
 
       self.apps = ko.observableArray();
+      self.totalApps = ko.observable(null);
       self.runningApps = ko.computed(function(job) {
         return $.grep(self.apps(), function(job) { return job.apiStatus() == 'RUNNING'; });
       });
@@ -1219,39 +1219,48 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         {'value': 'minutes', 'name': '${_("minutes")}'},
       ]);
 
-      self.filters = ko.computed(function() {
-        return [
-          {'text': self.textFilter()},
-          {'time': {'time_value': self.timeValueFilter(), 'time_unit': self.timeUnitFilter()}},
-          {'states': self.statesFilter()},
-        ];
-      });
-      self.filters.subscribe(function(value) {
-        self.fetchJobs();
-      });
-
       self.hasPagination = ko.computed(function() {
-        return vm.interface() != 'jobs';
+        return ['workflows', 'schedules', 'bundles'].indexOf(vm.interface()) != -1;
       });
       self.paginationPage = ko.observable(1);
-      self.paginationOffset = ko.observable(0);
+      self.paginationOffset = ko.observable(1);
       self.paginationResultPage = ko.observable(100);
       self.paginationResultCounts = ko.computed(function() {
         return self.apps().length;
       });
       self.pagination = ko.computed(function() {
-        var pagination = [];
-        pagination.push({'paginationPage': self.paginationPage()});
-        pagination.push({'paginationOffset': self.paginationOffset()});
-        pagination.push({'paginationResultPage': self.paginationResultPage()});
-        return pagination;
+        return {
+            'page': self.paginationPage(),
+            'offset': self.paginationOffset(),
+            'limit': self.paginationResultPage()
+        };
       });
 
+      self.showPreviousPage = ko.computed(function() {
+        return self.paginationOffset() > 1;
+      });
+      self.showNextPage = ko.computed(function() {
+        return self.totalApps() != null && (self.paginationOffset() + self.paginationResultPage()) < self.totalApps();
+      });
       self.previousPage = function() {
+        self.paginationOffset(self.paginationOffset() - self.paginationResultPage());
       };
       self.nextPage = function() {
+        self.paginationOffset(self.paginationOffset() + self.paginationResultPage());
       };
 
+      self.filters = ko.computed(function() {
+        return [
+          {'text': self.textFilter()},
+          {'time': {'time_value': self.timeValueFilter(), 'time_unit': self.timeUnitFilter()}},
+          {'states': self.statesFilter()},
+          {'pagination': self.pagination()},
+        ];
+      });
+      self.filters.subscribe(function(value) {
+        self.fetchJobs();
+      });
+
 
       self.fetchJobs = function () {
         self.loadingJobs(true);
@@ -1269,6 +1278,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
               });
             }
             self.apps(apps);
+            self.totalApps(data.total);
           } else {
             $(document).trigger("error", data.message);
           }
@@ -1353,7 +1363,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         switch (h) {
           case '':
            break;
-          case 'apps':
+          case 'jobs':
           case 'workflows':
           case 'schedules':
           case 'bundles':

+ 1 - 0
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -1232,6 +1232,7 @@ var EditorViewModel = (function() {
 
       logGA('compatibility');
       self.compatibilityCheckRunning(targetPlatform != self.type());
+      self.hasSuggestion(null);
 
       lastCompatibilityRequest = $.post("/notebook/api/optimizer/statement/compatibility", {
         notebook: ko.mapping.toJSON(notebook.getContext()),

+ 1 - 1
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -1078,7 +1078,7 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, ENABLE_
       <!-- /ko -->
       <!-- /ko -->
     <!-- /ko -->
-    <!-- ko if: hasComplexity() -->
+    <!-- ko if: ! hasSuggestion() && hasComplexity() -->
       <!-- ko if: complexity()[0].risk.length === 0 || complexity()[0].risk === 'low' -->
         <div class="round-icon success" data-bind="click: function(){ showOptimizer(! showOptimizer()) }, attr: { 'title': showOptimizer() ? '${ _ko('Close Validator') }' : '${ _ko('Open Validator') }'}">
           <i class="fa fa-check"></i>