Browse Source

HUE-5602 [jb] Add start time filter in jobs page

krish 9 years ago
parent
commit
e3a926718a

+ 14 - 0
apps/jobbrowser/src/jobbrowser/api.py

@@ -17,6 +17,7 @@
 
 
 import logging
 import logging
 
 
+from datetime import datetime, timedelta
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
 
 
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.exceptions_renderable import PopupException
@@ -193,6 +194,8 @@ class YarnApi(JobBrowserApi):
       filters['finalStatus'] = state_filters[kwargs['state']]
       filters['finalStatus'] = state_filters[kwargs['state']]
     if kwargs.get('limit'):
     if kwargs.get('limit'):
       filters['limit'] = kwargs['limit']
       filters['limit'] = kwargs['limit']
+    if kwargs.get('time_value'):
+      filters['startedTimeBegin'] = self._get_started_time_begin(kwargs.get('time_value'), kwargs.get('time_unit'))
 
 
     json = self.resource_manager_api.apps(**filters)
     json = self.resource_manager_api.apps(**filters)
     if type(json) == str and 'This is standby RM' in json:
     if type(json) == str and 'This is standby RM' in json:
@@ -213,6 +216,17 @@ class YarnApi(JobBrowserApi):
 
 
     return self.filter_jobs(user, jobs)
     return self.filter_jobs(user, jobs)
 
 
+  def _get_started_time_begin(self, time_value, time_unit):
+    if time_unit == 'hours':
+      start_date = datetime.utcnow() - timedelta(hours=time_value)
+    elif time_unit == 'minutes':
+      start_date = datetime.utcnow() - timedelta(minutes=time_value)
+    else:
+      start_date = datetime.utcnow() - timedelta(days=time_value)
+
+    epoch = datetime.utcfromtimestamp(0)
+    return int((start_date - epoch).total_seconds()) * 1000
+
   def filter_jobs(self, user, jobs, **kwargs):
   def filter_jobs(self, user, jobs, **kwargs):
     check_permission = not SHARE_JOBS.get() and not user.is_superuser
     check_permission = not SHARE_JOBS.get() and not user.is_superuser
 
 

+ 27 - 1
apps/jobbrowser/src/jobbrowser/templates/jobs.mako

@@ -54,9 +54,16 @@ ${ components.menubar(hiveserver2_impersonation_enabled) }
         <a class="btn btn-status btn-danger disable-feedback" data-value="failed">${ _('Failed') }</a>
         <a class="btn btn-status btn-danger disable-feedback" data-value="failed">${ _('Failed') }</a>
         <a class="btn btn-status btn-inverse disable-feedback" data-value="killed">${ _('Killed') }</a>
         <a class="btn btn-status btn-inverse disable-feedback" data-value="killed">${ _('Killed') }</a>
       </span>
       </span>
+      &nbsp;&nbsp;${_('in last')} <input id="timeValue" type="number" class="input-small" placeholder="7">
+      <select id="timeUnit" class="input-small">
+        <option value="days">${_('days')}</option>
+        <option value="hours">${_('hours')}</option>
+        <option value="minutes">${_('minutes')}</option>
+      </select>
     </%def>
     </%def>
   </%actionbar:render>
   </%actionbar:render>
 
 
+  <div id ="JobCountBanner" class="pull-center alert alert-warning hide">${ _("Showing oldest 1000 jobs. Use days filter to get the recent ones.") }</div>
   <div id="noJobs" class="alert"><i class="fa fa-exclamation-triangle"></i>&nbsp; ${_('There are no jobs that match your search criteria.')}</div>
   <div id="noJobs" class="alert"><i class="fa fa-exclamation-triangle"></i>&nbsp; ${_('There are no jobs that match your search criteria.')}</div>
 
 
   <table id="jobsTable" class="datatables table table-condensed">
   <table id="jobsTable" class="datatables table table-condensed">
@@ -149,11 +156,16 @@ ${ components.menubar(hiveserver2_impersonation_enabled) }
         $("#loading").addClass("hide");
         $("#loading").addClass("hide");
         $("#noJobs").hide();
         $("#noJobs").hide();
         $(".datatables").show();
         $(".datatables").show();
-        if (data.length == 0) {
+        if (data.jobs.length == 0) {
           $("#noJobs").show();
           $("#noJobs").show();
           $(".datatables").hide();
           $(".datatables").hide();
         }
         }
         else {
         else {
+          if (data.jobs.length == 1000) {
+            $("#JobCountBanner").removeClass('hide');
+          } else {
+            $("#JobCountBanner").addClass('hide');
+          }
           var rows = [];
           var rows = [];
           $(data.jobs).each(function (cnt, job) {
           $(data.jobs).each(function (cnt, job) {
             rows.push(getJobRow(job));
             rows.push(getJobRow(job));
@@ -313,6 +325,11 @@ ${ components.menubar(hiveserver2_impersonation_enabled) }
         _url_params["text"] = $('#textFilter').val().trim();
         _url_params["text"] = $('#textFilter').val().trim();
       }
       }
 
 
+      if ($("#timeValue").val().trim() != "") {
+        _url_params["time_value"] = $('#timeValue').val().trim();
+        _url_params["time_unit"] = $('#timeUnit :selected').text();
+      }
+
       if ($("#showRetired").is(":checked")) {
       if ($("#showRetired").is(":checked")) {
         _url_params["retired"] = "on";
         _url_params["retired"] = "on";
       }
       }
@@ -325,11 +342,20 @@ ${ components.menubar(hiveserver2_impersonation_enabled) }
       callJsonData(populateTable);
       callJsonData(populateTable);
     });
     });
 
 
+    $("#timeValue").jHueDelayedInput(function(){
+      $("#loading").removeClass("hide");
+      callJsonData(populateTable);
+    });
+
     $("#showRetired").change(function () {
     $("#showRetired").change(function () {
       $("#loading").removeClass("hide");
       $("#loading").removeClass("hide");
       callJsonData(populateTable);
       callJsonData(populateTable);
     });
     });
 
 
+    $('#timeUnit').change(function(){
+      callJsonData(populateTable);
+    });
+
     $(".btn-status").on("click", function () {
     $(".btn-status").on("click", function () {
       $(".btn-status").not($(this)).removeClass("active");
       $(".btn-status").not($(this)).removeClass("active");
       $(this).toggleClass("active");
       $(this).toggleClass("active");

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

@@ -131,11 +131,14 @@ def jobs(request):
   state = request.POST.get('state')
   state = request.POST.get('state')
   text = request.POST.get('text')
   text = request.POST.get('text')
   retired = request.POST.get('retired')
   retired = request.POST.get('retired')
+  time_value = request.POST.get('time_value', 7)
+  time_unit = request.POST.get('time_unit', 'days')
 
 
   if request.POST.get('format') == 'json':
   if request.POST.get('format') == 'json':
     try:
     try:
       # Limit number of jobs to be 1000
       # Limit number of jobs to be 1000
-      jobs = get_api(request.user, request.jt).get_jobs(user=request.user, username=user, state=state, text=text, retired=retired, limit=1000)
+      jobs = get_api(request.user, request.jt).get_jobs(user=request.user, username=user, state=state, text=text,
+                                                        retired=retired, limit=1000, time_value=int(time_value), time_unit=time_unit)
     except Exception, ex:
     except Exception, ex:
       ex_message = str(ex)
       ex_message = str(ex)
       if 'Connection refused' in ex_message or 'standby RM' in ex_message:
       if 'Connection refused' in ex_message or 'standby RM' in ex_message: