Bläddra i källkod

HUE-1176 [jb] Filter yarn jobs on text

Romain Rigaux 8 år sedan
förälder
incheckning
704f6f6

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

@@ -50,10 +50,7 @@ def jobs(request):
   response = {'status': -1}
 
   interface = json.loads(request.POST.get('interface'))
-
-  filters = []
-  for _filter in json.loads(request.POST.get('filters', [])):
-    filters.extend([(key, value) for key, value in _filter.items() if value])
+  filters = [(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)
   response['status'] = 0

+ 17 - 1
apps/jobbrowser/src/jobbrowser/apis/base_api.py

@@ -16,6 +16,7 @@
 # limitations under the License.
 
 import logging
+import re
 
 from django.utils.translation import ugettext as _
 
@@ -29,6 +30,7 @@ def get_api(user, interface):
   from jobbrowser.apis.bundle_api import BundleApi
   from jobbrowser.apis.job_api import JobApi
   from jobbrowser.apis.schedule_api import ScheduleApi
+  from jobbrowser.apis.slas_api import SlaApi
   from jobbrowser.apis.workflow_api import WorkflowApi
 
   if interface == 'jobs':
@@ -40,7 +42,7 @@ def get_api(user, interface):
   elif interface == 'bundles':
     return BundleApi(user)
   elif interface == 'slas':
-    return BundleApi(user)  
+    return SlaApi(user)
   else:
     raise PopupException(_('Interface %s is unknown') % interface)
 
@@ -73,3 +75,17 @@ class MockDjangoRequest():
     self.GET = get if get is not None else {'format': 'json'}
     self.POST = post if post is not None else {}
     self.method = "POST"
+
+
+def _extract_query_params(filters):
+  filter_params = {}
+
+  for name, value in filters:
+    if name == 'text':
+      filter_params['text'] = value
+      user_filter = re.search('((user):([^ ]+))', value)
+      if user_filter:
+        filter_params['username'] = user_filter.group(3)
+        filter_params['text'] = filter_params['text'].replace(user_filter.group(1), '')
+
+  return filter_params

+ 11 - 5
apps/jobbrowser/src/jobbrowser/apis/job_api.py

@@ -20,7 +20,7 @@ import logging
 
 from django.utils.translation import ugettext as _
 
-from jobbrowser.apis.base_api import Api, MockDjangoRequest
+from jobbrowser.apis.base_api import Api, MockDjangoRequest, _extract_query_params
 from jobbrowser.views import job_attempt_logs_json, kill_job
 
 
@@ -42,7 +42,7 @@ class JobApi(Api):
     self.request = None
 
   def apps(self, filters):
-    jobs = self.yarn_api.apps()
+    jobs = self.yarn_api.apps(filters)
     # += Impala
     # += Sqoop2
     return jobs
@@ -74,8 +74,15 @@ class JobApi(Api):
 class YarnApi(Api):
   """YARN, MR, Spark"""
 
-  def apps(self):
-    jobs = NativeYarnApi(self.user).get_jobs(self.user, username=self.user.username, state='all', text='')
+  def apps(self, filters):
+    filter_params = {
+      'username': '',
+      'text': ''
+    }
+
+    filter_params.update(_extract_query_params(filters))
+
+    jobs = NativeYarnApi(self.user).get_jobs(self.user, username=filter_params['username'], state='all', text=filter_params['text'])
     return [{
         'id': app.jobId,
         'name': app.name,
@@ -88,7 +95,6 @@ class YarnApi(Api):
         'submitted': 10 * 3600
     } for app in jobs]
 
-
   def app(self, appid):
     app = NativeYarnApi(self.user).get_job(jobid=appid)
 

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

@@ -42,13 +42,13 @@ class SlaApi(Api):
     params = {}
 
     job_name = filters.POST.get('job_name')
- 
+
     if re.match('.*-oozie-oozi-[WCB]', job_name):
       params['id'] = job_name
       params['parent_id'] = job_name
     else:
       params['app_name'] = job_name
- 
+
 #     if 'useDates' in request.POST:
 #       if request.POST.get('start'):
 #         params['nominal_start'] = request.POST.get('start')

+ 10 - 11
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -209,7 +209,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
             <!-- ko if: mainType() == 'bundles' -->
               <div data-bind="template: { name: 'bundle-page' }"></div>
             <!-- /ko -->
-            
+
             <!-- ko if: mainType() == 'sla' -->
               <div data-bind="template: { name: 'sla-page' }"></div>
             <!-- /ko -->
@@ -244,6 +244,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 <!-- /ko -->
 </script>
 
+
 <script type="text/html" id="breadcrumbs">
   <h3>
     <ul class="inline hueBreadcrumbBar" data-bind="foreach: breadcrumbs">
@@ -1114,27 +1115,25 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
       self.apps = ko.observableArray();
       self.loadingJobs = ko.observable(false);
-      self.username = ko.observable('${ user.username }');
-      self.textFilter = ko.observable('${ user.username }').extend({ rateLimit: { method: "notifyWhenChangesStop", timeout: 500 } });
-
-      self.filters = [{'text': self.textFilter}];
-
+      self.textFilter = ko.observable('user:${ user.username } ').extend({ rateLimit: { method: "notifyWhenChangesStop", timeout: 500 } });
       self.textFilter.subscribe(function(value) {
         self.fetchJobs();
         // TBD: refreshPagination()
       });
 
+      self.filters = ko.computed(function() {
+        return [{'text': self.textFilter()}];
+      });
+
+
       self.fetchJobs = function () {
         self.loadingJobs(true);
         vm.job(null);
 
-        url_data = {
-          username: ko.mapping.toJSON(self.username),
+        $.post("/jobbrowser/api/jobs", {
           interface: ko.mapping.toJSON(vm.interface),
           filters: ko.mapping.toJSON(self.filters),
-        }
-
-        $.post("/jobbrowser/api/jobs", url_data, function (data) {
+        }, function (data) {
           if (data.status == 0) {
             var apps = [];
             if (data && data.apps) {