Browse Source

HUE-1304 [oozie] More accurate workflow progress reporting

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

+ 4 - 2
apps/oozie/src/oozie/models.py

@@ -463,11 +463,13 @@ class Workflow(Job):
       workflow.save()
       try:
         import_workflow(workflow, oozie_workflow.definition)
-        return workflow.gen_status_graph(oozie_workflow)
+        graph =  workflow.gen_status_graph(oozie_workflow)
+        return graph, workflow.node_list
       except Exception, e:
-        LOG.info('Workflow %s could not be converted to a graph: %s' % (oozie_workflow.id, e))
+        LOG.warn('Workflow %s could not be converted to a graph: %s' % (oozie_workflow.id, e))
     finally:
       workflow.delete()
+    return None, []
 
   def to_xml(self, mapping=None):
     if mapping is None:

+ 1 - 1
apps/oozie/src/oozie/templates/dashboard/list_oozie_workflow.mako

@@ -488,7 +488,7 @@ ${ layout.menubar(section='dashboard') }
           $("#rerun-btn").show();
         }
 
-        $("#progress .bar").text(data.progress+"%").css("width", data.progress+"%").attr("class", "bar "+getStatusClass(data.status, "bar-"));
+        $("#progress .bar").text(data.progress+"%").css("width", data.progress+"%").attr("class", "bar " + getStatusClass(data.status, "bar-"));
         $("#graph").html(data.graph);
 
         var _logsEl = $("#log pre");

+ 0 - 2
apps/oozie/src/oozie/templates/editor/gen/workflow-graph-status.xml.mako

@@ -44,7 +44,6 @@
   %>
 
   % if form.instance.get_full_node().is_visible():
-
       <div class="span12 action ${ box_class }">
         <div class="row-fluid">
           <div class="span12">
@@ -87,7 +86,6 @@
         % endif
 
       </div>
-
   % endif
 
 </%def>

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

@@ -188,7 +188,7 @@
 
 
 <%def name="get_status(status)">
-   % if status in ('SUCCEEDED', 'OK', 'NORMAL'):
+   % if status in ('SUCCEEDED', 'OK', 'NORMAL', 'DONE'):
      label-success
    % elif status in ('RUNNING', 'PREP', 'WAITING', 'SUSPENDED', 'PREPSUSPENDED', 'PREPPAUSED', 'PAUSED'):
       label-warning

+ 3 - 0
apps/oozie/src/oozie/tests.py

@@ -2372,6 +2372,7 @@ class TestOozieSubmissions(OozieBase):
     response = self.c.post(reverse('oozie:submit_workflow', args=[wf.id]), data=post_data, follow=True)
     job = OozieServerProvider.wait_until_completion(response.context['oozie_workflow'].id)
     assert_equal('SUCCEEDED', job.status)
+    assert_equal(100, job.get_progress())
 
     # Rerun with default options
     post_data.update({u'rerun_form_choice': [u'skip_nodes']})
@@ -2379,6 +2380,7 @@ class TestOozieSubmissions(OozieBase):
     response = self.c.post(reverse('oozie:rerun_oozie_job', kwargs={'job_id': job.id, 'app_path': job.appPath}), data=post_data, follow=True)
     job = OozieServerProvider.wait_until_completion(response.context['oozie_workflow'].id)
     assert_equal('SUCCEEDED', job.status)
+    assert_equal(100, job.get_progress())
 
     # Rerun with skip OK actions skipped
     post_data.update({u'rerun_form_choice': [u'skip_nodes'], u'skip_nodes': [u'Sleep']})
@@ -2386,6 +2388,7 @@ class TestOozieSubmissions(OozieBase):
     response = self.c.post(reverse('oozie:rerun_oozie_job', kwargs={'job_id': job.id, 'app_path': job.appPath}), data=post_data, follow=True)
     job = OozieServerProvider.wait_until_completion(response.context['oozie_workflow'].id)
     assert_equal('SUCCEEDED', job.status)
+    assert_equal(100, job.get_progress())
 
     # Rerun with failed nodes too
     post_data.update({u'rerun_form_choice': [u'failed_nodes']})

+ 3 - 2
apps/oozie/src/oozie/views/dashboard.py

@@ -191,14 +191,15 @@ def list_oozie_workflow(request, job_id, coordinator_job_id=None, bundle_job_id=
 
   if hue_workflow:
     workflow_graph = hue_workflow.gen_status_graph(oozie_workflow)
+    full_node_list = hue_workflow.node_list
   else:
-    workflow_graph = Workflow.gen_status_graph_from_xml(request.user, oozie_workflow)
+    workflow_graph, full_node_list = Workflow.gen_status_graph_from_xml(request.user, oozie_workflow)
 
   if request.GET.get('format') == 'json':
     return_obj = {
       'id': oozie_workflow.id,
       'status':  oozie_workflow.status,
-      'progress': oozie_workflow.get_progress(),
+      'progress': oozie_workflow.get_progress(full_node_list),
       'graph': workflow_graph,
       'log': oozie_workflow.log,
       'actions': massaged_workflow_actions_for_json(oozie_workflow.get_working_actions(), oozie_coordinator, oozie_bundle)

+ 1 - 1
apps/oozie/static/js/bundles.utils.js

@@ -29,7 +29,7 @@ function getStatusClass(status, prefix){
     prefix = "label-";
   }
   var klass = "";
-  if (['SUCCEEDED', 'OK'].indexOf(status) > -1){
+  if (['SUCCEEDED', 'OK', 'DONE'].indexOf(status) > -1){
     klass = prefix + "success";
   }
   else if (['RUNNING', 'READY', 'PREP', 'WAITING', 'SUSPENDED', 'PREPSUSPENDED', 'PREPPAUSED', 'PAUSED',

+ 9 - 3
desktop/libs/liboozie/src/liboozie/types.py

@@ -414,9 +414,15 @@ class Workflow(Job):
       kwargs['bundle_job_id'] = self.oozie_bundle.id
     return reverse('oozie:list_oozie_workflow', kwargs=kwargs)
 
-  def get_progress(self):
-    """How many actions are finished on the total of actions."""
-    return int(sum([action.is_finished() for action in self.actions]) / float(max(len(self.actions), 1)) * 100)
+  def get_progress(self, full_node_list=None):
+    if self.status == 'SUCCEEDED':
+      return 100 # Case of decision nodes
+    else:
+      if full_node_list is not None:            # Should remove the un-reached branches if decision node
+        total_actions = len(full_node_list) - 1 # -1 because of Kill node
+      else:
+        total_actions = len(self.actions)
+      return int(sum([action.is_finished() for action in self.actions]) / float(max(total_actions, 1)) * 100)
 
 
 class Coordinator(Job):