Browse Source

HUE-1657 [oozie] Dynamic SLA search page

Starting workflow SLA page
Romain Rigaux 12 years ago
parent
commit
b238f59

+ 6 - 6
apps/oozie/src/oozie/models.py

@@ -67,7 +67,7 @@ DEFAULT_SLA = [
     {'key': 'should-end', 'value': ''},
     {'key': 'max-duration', 'value': ''},
     {'key': 'alert-events', 'value': ''},
-    {'key': 'alert-contact', 'value': ''},        
+    {'key': 'alert-contact', 'value': ''},
 ]
 
 class JobManager(models.Manager):
@@ -215,14 +215,14 @@ class Job(models.Model):
   @property
   def sla(self):
     return json.loads(self.data).get('sla', copy.deepcopy(DEFAULT_SLA))
-  
+
   @property
   def sla_jsescaped(self):
     return json.dumps(self.sla, cls=JSONEncoderForHTML)
-  
+
   def set_sla(self, sla):
     data_json = json.loads(self.data)
-    data_json['sla'] = sla  
+    data_json['sla'] = sla
     self.data = json.dumps(data_json)
 
   @property
@@ -743,10 +743,10 @@ class Node(models.Model):
   @property
   def sla(self):
     return json.loads(self.data).get('sla', copy.deepcopy(DEFAULT_SLA))
-  
+
   def set_sla(self, sla):
     data_json = json.loads(self.data)
-    data_json['sla'] = sla  
+    data_json['sla'] = sla
     self.data = json.dumps(data_json)
 
   @property

+ 21 - 33
apps/oozie/src/oozie/templates/dashboard/list_oozie_sla.mako

@@ -59,26 +59,8 @@ ${ layout.menubar(section='sla', dashboard=True) }
 
         <div class="tab-content">
 
-            <table id="intrumentationTable" class="table table-striped table-condensed">
+            <table id="slaTable" class="table table-striped table-condensed">
               <thead>
-                <%
-                columns = [
-                  'slaStatus',
-                  'id',
-                  'appType',
-                  'appName',
-                  'user',
-                  'nominalTime',
-                  'expectedStart',
-                  'actualStart',
-                  'expectedEnd',
-                  'actualEnd',                  
-                  'jobStatus',
-                  #'expectedDuration',
-                  #'actualDuration',
-                  'lastModified'
-                ]
-                %>
                 % for col in columns:
                   <th>${ col }</th>
                 % endfor
@@ -115,22 +97,28 @@ ${ layout.menubar(section='sla', dashboard=True) }
 
     $("*[rel=tooltip]").tooltip();
 
-        var slaList = $("#intrumentationTable").dataTable({
-            "bPaginate": false,
-            "bLengthChange": false,
-            "bInfo": false,
-            "bAutoWidth": false,
+    var slaTable = $("#slaTable").dataTable({
+        "bPaginate": false,
+        "bLengthChange": false,
+        "bInfo": false,
+        "bAutoWidth": false,
+        "oLanguage": {
+            "sEmptyTable": "${_('No data available')}",
+            "sZeroRecords": "${_('No matching records')}"
+        }
+    });
 
-            "oLanguage": {
-                "sEmptyTable": "${_('No data available')}",
-                "sZeroRecords": "${_('No matching records')}"
-            }
+    var _filterTimeout = -1;
+    $(".searchFilter").keyup(function() {
+      window.clearTimeout(_filterTimeout);
+      _filterTimeout = window.setTimeout(function () {
+        $.post("${ url('oozie:list_oozie_sla') }?format=json", $("#searchForm").serialize(), function(data) {
+          slaTable.fnClearTable();
+          if (data['oozie_slas']) {
+            slaTable.fnAddData(data['oozie_slas']);
+          } 
         });
-
-    $(".searchFilter").keyup(function(){
-      $.post("${ url('oozie:list_oozie_sla') }", $("#searchForm").serialize(), function(data) {
-        $( ".result" ).html( data );
-      });
+      }, 300);
     });
 
     $(".dataTables_wrapper").css("min-height","0");

+ 11 - 2
apps/oozie/src/oozie/templates/dashboard/list_oozie_workflow.mako

@@ -155,6 +155,9 @@ ${ layout.menubar(section='workflows', dashboard=True) }
         <li><a href="#configuration" data-toggle="tab">${ _('Configuration') }</a></li>
         <li><a href="#log" data-toggle="tab">${ _('Log') }</a></li>
         <li><a href="#definition" data-toggle="tab">${ _('Definition') }</a></li>
+        % if oozie_workflow.has_sla:
+        <li><a href="#sla" data-toggle="tab">${ _('SLA') }</a></li>
+        % endif
       </ul>
 
       <div id="workflow-tab-content" class="tab-content" style="min-height:200px">
@@ -279,9 +282,14 @@ ${ layout.menubar(section='workflows', dashboard=True) }
           <pre>${ oozie_workflow.log.decode('utf-8', 'replace') }</pre>
         </div>
 
-        <div class="tab-pane" id="definition" style="min-height:400px">
+        <div class="tab-pane" id="definition">
           <textarea id="definitionEditor">${ oozie_workflow.definition.decode('utf-8', 'replace') }</textarea>
         </div>
+        
+        % if oozie_workflow.has_sla:
+        <div class="tab-pane" id="sla">          
+        </div>
+        % endif
       </div>
 
       <div style="margin-bottom: 16px">
@@ -318,7 +326,7 @@ ${ layout.menubar(section='workflows', dashboard=True) }
 
 <style type="text/css">
 .CodeMirror.cm-s-default {
-   height:500px;
+   height:700px;
 }
 </style>
 
@@ -548,6 +556,7 @@ ${ layout.menubar(section='workflows', dashboard=True) }
 
     function resizeLogs() {
       $("#log pre").css("overflow", "auto").height($(window).height() - $("#log pre").position().top - 80);
+      $("#log pre").css("overflow", "auto").height($(window).height() - $("#log pre").position().top - 80);
     }
 
   });

+ 2 - 2
apps/oozie/src/oozie/templates/utils.inc.mako

@@ -261,7 +261,7 @@
 
 <%def name="slaForm()">
   <div data-bind="foreach: sla">
-    <div class="controls">          
+    <div class="controls">
       <div class="span3">
         <span data-bind="text: getSLAText(key)['niceName']"></span>
       </div>
@@ -274,7 +274,7 @@
         <!-- /ko -->
       </div>
     </div>
-  </div>           
+  </div>
 </%def>
 
 <%def name="render_constant(label, value)">

File diff suppressed because it is too large
+ 0 - 0
apps/oozie/src/oozie/tests.py


+ 23 - 1
apps/oozie/src/oozie/views/dashboard.py

@@ -355,11 +355,33 @@ def list_oozie_sla(request):
   else:
     oozie_slas = [] # or get latest?
   
+  columns = [
+    'slaStatus',
+    'id',
+    'appType',
+    'appName',
+    'user',
+    'nominalTime',
+    'expectedStart',
+    'actualStart',
+    'expectedEnd',
+    'actualEnd',                  
+    'jobStatus',
+    #'expectedDuration',
+    #'actualDuration',
+    'lastModified'
+  ]  
+  
   if request.REQUEST.get('format') == 'json':
-    return HttpResponse(json.dumps({'oozie_slas': oozie_slas}), content_type="text/plain")
+    massaged_slas = []
+    for sla in oozie_slas:
+      massaged_slas.append([sla[key] for key in columns])
+
+    return HttpResponse(json.dumps({'oozie_slas': massaged_slas}), content_type="text/json")
 
   return render('dashboard/list_oozie_sla.mako', request, {
     'oozie_slas': oozie_slas,
+    'columns': columns,
   })
 
 

+ 2 - 4
apps/oozie/static/js/workflow.node.js

@@ -169,13 +169,11 @@ var NodeModule = function($, IdGeneratorTable, NodeFields) {
         self.files.remove(val);
       };
     }
-    
+
+    // Manage custom 'data' here
     if ('sla' in self.model) {
       var data = self.model['sla'];
-      //alert(data);
       self.sla = ko.observableArray(self.model['sla']);
-      ///self.sla = ko.observable('aaa');
-      //delete self.model['data'];
     }
 
     self.initialize.apply(self, arguments);

+ 4 - 4
desktop/libs/liboozie/src/liboozie/oozie_api.py

@@ -32,7 +32,7 @@ from liboozie.utils import config_gen
 
 LOG = logging.getLogger(__name__)
 DEFAULT_USER = 'hue'
-API_VERSION = 'v1'
+API_VERSION = 'v1' # Overridden to v2 for SLA
 
 _XML_CONTENT_TYPE = 'application/xml;charset=UTF-8'
 
@@ -40,9 +40,9 @@ _api_cache = None
 _api_cache_lock = threading.Lock()
 
 
-def get_oozie(user, api_version=API_VERSION): # cf. cache version pb
+def get_oozie(user, api_version=API_VERSION):
   global _api_cache
-  if _api_cache is None:
+  if _api_cache is None or _api_cache.api_version != api_version:
     _api_cache_lock.acquire()
     try:
       if _api_cache is None:
@@ -64,6 +64,7 @@ class OozieApi(object):
     self._security_enabled = security_enabled
     # To store username info
     self._thread_local = threading.local()
+    self.api_version = api_version
 
   def __str__(self):
     return "OozieApi at %s" % (self._url,)
@@ -299,5 +300,4 @@ class OozieApi(object):
     params = self._get_params()
     params['filter'] = ';'.join(['%s=%s' % (key, val) for key, val in kwargs.iteritems()])    
     resp = self._root.get('sla', params)
-    # resp = {u'slaSummaryList': [{u'actualDuration': 68406, u'appType': u'WORKFLOW_JOB', u'appName': u'Forks', u'actualStart': u'Fri, 06 Dec 2013 14:01:53 PST', u'jobStatus': u'SUCCEEDED', u'id': u'0000002-131206135002457-oozie-oozi-W', u'expectedDuration': 1800000, u'nominalTime': u'Mon, 17 Jun 2013 17:01:00 PDT', u'slaStatus': u'MISS', u'lastModified': u'Fri, 06 Dec 2013 14:03:05 PST', u'actualEnd': u'Fri, 06 Dec 2013 14:03:01 PST', u'expectedEnd': u'Mon, 17 Jun 2013 17:31:00 PDT', u'expectedStart': u'Mon, 17 Jun 2013 17:11:00 PDT', u'user': u'romain'}]}
     return resp['slaSummaryList'] 

+ 4 - 0
desktop/libs/liboozie/src/liboozie/types.py

@@ -369,6 +369,10 @@ class Job(object):
   def __str__(self):
     return '%s - %s' % (self.id, self.status)
 
+  @property
+  def has_sla(self):
+    return '<sla:info>' in self.definition
+
 
 class Workflow(Job):
   _ATTRS = [

Some files were not shown because too many files changed in this diff