Преглед изворни кода

HUE-1176 [jb] Integrated time filtering to YARN jobs

Romain Rigaux пре 8 година
родитељ
комит
04251cf11c

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

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

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

@@ -80,12 +80,12 @@ class MockDjangoRequest():
 def _extract_query_params(filters):
   filter_params = {}
 
-  for name, value in filters:
+  for name, value in filters.iteritems():
     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), '')
+        filter_params['text'] = filter_params['text'].replace(user_filter.group(1), '').strip()
 
   return filter_params

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

@@ -76,13 +76,20 @@ class YarnApi(Api):
 
   def apps(self, filters):
     filter_params = {
+      'user': self.user,
       'username': '',
-      'text': ''
+      'text': '',
+      'state': 'all'
     }
 
     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'])
+    if 'time' in filters:
+      filter_params['time_value'] = int(filters['time']['time_value'])
+      filter_params['time_unit'] = filters['time']['time_unit']
+
+    jobs = NativeYarnApi(self.user).get_jobs(**filter_params)
+
     return [{
         'id': app.jobId,
         'name': app.name,

+ 17 - 8
apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -135,8 +135,8 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
               <a class="btn btn-status btn-danger disable-feedback" data-value="failed">${ _('Failed') }</a>
             </div>
 
-            ${_('in the last')} <input id="timeValue" class="input-mini no-margin" type="number" value="7" min="1" max="3650">
-            <select id="timeUnit" class="input-small no-margin">
+            ${_('in the last')} <input class="input-mini no-margin" type="number" min="1" max="3650" data-bind="value: jobs.timeValueFilter">
+            <select class="input-small no-margin" data-bind="value: jobs.timeUnitFilter, options: jobs.timeUnitFilterUnits, optionsText: 'name', optionsValue: 'value'">
               <option value="days">${_('days')}</option>
               <option value="hours">${_('hours')}</option>
               <option value="minutes">${_('minutes')}</option>
@@ -1150,16 +1150,25 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         return $.grep(self.apps(), function(job) { return job.apiStatus() == 'FINISHED'; });
       });
       self.loadingJobs = ko.observable(false);
+
       self.textFilter = ko.observable('user:${ user.username } ').extend({ rateLimit: { method: "notifyWhenChangesStop", timeout: 500 } });
-      self.textFilter.subscribe(function(value) {
-        self.fetchJobs();
-        // TBD: refreshPagination()
-      });
+      self.timeValueFilter = ko.observable(7).extend({ throttle: 500 });
+      self.timeUnitFilter = ko.observable('days').extend({ throttle: 500 });
+      self.timeUnitFilterUnits = ko.observable([
+        {'value': 'days', 'name': '${_("days")}'},
+        {'value': 'hours', 'name': '${_("hours")}'},
+        {'value': 'minutes', 'name': '${_("minutes")}'},
+      ]);
 
       self.filters = ko.computed(function() {
-        return [{'text': self.textFilter()}];
+        return [
+          {'text': self.textFilter()},
+          {'time': {'time_value': self.timeValueFilter(), 'time_unit': self.timeUnitFilter()}}
+        ];
+      });
+      self.filters.subscribe(function(value) {
+        self.fetchJobs();
       });
-
 
       self.fetchJobs = function () {
         self.loadingJobs(true);