Browse Source

HUE-6325 [oozie] Adding link to optional saved workflow

Romain Rigaux 8 năm trước cách đây
mục cha
commit
0d2162c

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

@@ -16,10 +16,12 @@
 # limitations under the License.
 
 import logging
+import posixpath
 import re
 
 from django.utils.translation import ugettext as _
 
+from hadoop.fs.hadoopfs import Hdfs
 from desktop.lib.exceptions_renderable import PopupException
 
 
@@ -89,3 +91,18 @@ def _extract_query_params(filters):
       filter_params[name] = value
 
   return filter_params
+
+
+def is_linkable(name, path):
+  return re.search('(dir|path|output|input)', name, re.I) or path.startswith('/') or path.startswith('hdfs://')
+
+
+def hdfs_link_js(url):
+  link = 'javascript:void(0)'
+
+  if url:
+    path = Hdfs.urlsplit(url)[2]
+    if path:
+      link = ('/filebrowser/view=%s' if path.startswith(posixpath.sep) else '/filebrowser/home_relative_view=/%s') % path
+
+  return link

+ 2 - 0
apps/jobbrowser/src/jobbrowser/apis/workflow_api.py

@@ -109,6 +109,8 @@ class WorkflowApi(Api):
     common['properties']['coordinator_id'] = workflow.get_parent_job_id()
     common['properties']['bundle_id'] = workflow.conf_dict.get('oozie.bundle.id')
 
+    common['doc_url'] = common['properties'].get('doc_url')
+
     return common
 
 

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

@@ -807,11 +807,19 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     <div class="span2">
       <div class="sidebar-nav">
         <ul class="nav nav-list">
-          <li class="nav-header">${ _('Id') }</li>
-          <li><span data-bind="text: id"></span></li>
+          <!-- ko if: doc_url -->
+          <li class="nav-header">${ _('Document') }</li>
+          <li>
+            <a data-bind="hueLink: doc_url" href="javascript: void(0);" title="${ _('Open in editor') }">
+              <span data-bind="text: name"></span>
+            </a>
+          </li>
+          <!-- /ko -->
+          <!-- ko ifnot: doc_url -->
           <li class="nav-header">${ _('Name') }</li>
           <li><span data-bind="text: name"></span></li>
-          <li class="nav-header">${ _('Type') }</li>
+          <!-- /ko -->
+          <li class="nav-header">${ _('Workspace') }</li>
           <li><span data-bind="text: type"></span></li>
           <li class="nav-header">${ _('Status') }</li>
           <li><span data-bind="text: status"></span></li>
@@ -824,10 +832,10 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
               <div class="bar" data-bind="style: {'width': progress() + '%'}"></div>
             </div>
           </li>
-          <li class="nav-header">${ _('Duration') }</li>
-          <li><span data-bind="text: duration"></span></li>
-          <li class="nav-header">${ _('Submitted') }</li>
-          <li><span data-bind="text: submitted"></span></li>
+          <li class="nav-header">${ _('Id') }</li>
+          <li><span data-bind="text: id"></span></li>
+          <li class="nav-header">${ _('Variables') }</li>
+          <li><span data-bind="text: type"></span></li>
         </ul>
       </div>
     </div>
@@ -883,6 +891,11 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         </div>
 
         <div class="tab-pane" id="workflow-page-metadata">
+          <li class="nav-header">${ _('Duration') }</li>
+          <li><span data-bind="text: duration"></span></li>
+          <li class="nav-header">${ _('Submitted') }</li>
+          <li><span data-bind="text: submitted"></span></li>
+
           <pre data-bind="text: ko.toJSON(properties['properties'], null, 2)"></pre>
         </div>
 
@@ -1167,6 +1180,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       var self = this;
 
       self.id = ko.observableDefault(job.id);
+      self.doc_url = ko.observableDefault(job.doc_url);
       self.name = ko.observableDefault(job.name);
       self.type = ko.observableDefault(job.type);
 
@@ -1451,8 +1465,8 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
           });
         } else {
           vm.jobs._control([self.id()], action, function(data) {
-              $(document).trigger("info", data.message);
-              self.fetchStatus();
+            $(document).trigger("info", data.message);
+            self.fetchStatus();
           });
         }
       }
@@ -1845,7 +1859,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         var flatAvailableInterfaces = self.availableInterfaces().map(function (i) {
           return i.interface;
         });
-        if (flatAvailableInterfaces.indexOf(name) != -1) {
+        if (flatAvailableInterfaces.indexOf(name) != -1 || name == 'oozie-info') {
           return name;
         } else {
           return flatAvailableInterfaces[0];

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

@@ -390,7 +390,8 @@ def list_oozie_workflow(request, job_id):
       'status':  oozie_workflow.status,
       'progress': oozie_workflow.get_progress(full_node_list),
       'graph': workflow_graph,
-      'actions': massaged_workflow_actions_for_json(oozie_workflow.get_working_actions(), oozie_coordinator, oozie_bundle)
+      'actions': massaged_workflow_actions_for_json(oozie_workflow.get_working_actions(), oozie_coordinator, oozie_bundle),
+      'doc_url': doc.get_absolute_url() if doc else '',
     }
     return JsonResponse(return_obj, encoder=JSONEncoderForHTML)
 

+ 8 - 8
desktop/libs/liboozie/src/liboozie/types.py

@@ -405,6 +405,14 @@ class Job(object):
   def has_sla(self):
     return '<sla:info>' in self.definition
 
+  @property
+  def durationTime(self):
+    return self.endTime and self.startTime and ((time.mktime(self.endTime) - time.mktime(self.startTime)) * 1000) or 0
+
+  @property
+  def submissionTime(self):
+    return hasattr(self, 'createdTime') and self.createdTime and time.mktime(catch_unicode_time(self.createdTime)) or 0
+
 
 class Workflow(Job):
   _ATTRS = [
@@ -476,14 +484,6 @@ class Workflow(Job):
         total_actions = len(self.actions)
       return int(sum([action.is_finished() for action in self.actions]) / float(max(total_actions, 1)) * 100)
 
-  @property
-  def durationTime(self):
-    return self.endTime and self.startTime and ((time.mktime(self.endTime) - time.mktime(self.startTime)) * 1000) or 0
-
-  @property
-  def submissionTime(self):
-    return hasattr(self, 'createdTime') and self.createdTime and time.mktime(catch_unicode_time(self.createdTime)) or 0
-
 
 class Coordinator(Job):
   _ATTRS = [