Sfoglia il codice sorgente

HUE-1176 [jb] Offer to Fetch non generic application information

Romain Rigaux 9 anni fa
parent
commit
db60a5f

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

@@ -80,8 +80,9 @@ def logs(request):
 
   interface = json.loads(request.POST.get('interface'))
   appid = json.loads(request.POST.get('appid'))
+  app_type = json.loads(request.POST.get('type'))
 
-  response['logs'] = get_api(request.user, interface).logs(appid)
+  response['logs'] = get_api(request.user, interface).logs(appid, app_type)
   response['status'] = 0
 
   return JsonResponse(response)
@@ -92,5 +93,4 @@ def tasks(request): return []
 
 
 @api_error_handler
-def profile(request): return {}
-
+def profile(self, appid, app_type, property): return {}

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

@@ -53,12 +53,13 @@ class Api():
 
   def status(self, appid): return {'status': 'RUNNING'}
 
-  def logs(self, appid): return {'progress': 0, 'logs': {'default': ''}}
+  def logs(self, appid, app_type): return {'progress': 0, 'logs': {'default': ''}}
 
-  def profile(self, appid): return {} # Tasks, XML, counters...
+  def profile(self, appid, app_type, property): return {} # Tasks, XML, counters...
 
 
 class MockDjangoRequest():
+
   def __init__(self, user):
     self.user = user
     self.jt = None

+ 21 - 8
apps/jobbrowser/src/jobbrowser/apis/job_api.py

@@ -21,7 +21,7 @@ import logging
 from django.utils.translation import ugettext as _
 
 from jobbrowser.apis.base_api import Api, MockDjangoRequest
-from jobbrowser.views import job_attempt_logs_json
+from jobbrowser.views import job_attempt_logs_json, tasks
 
 
 LOG = logging.getLogger(__name__)
@@ -52,6 +52,9 @@ class JobApi(Api):
   def logs(self, appid):
     return self._get_api(appid).logs(appid)
 
+  def profile(self, appid, app_type, property):
+    return self._get_api(appid).logs(appid, app_type, property)
+
   def _get_api(self, appid):
     return self.impala_api if not appid.startswith('application_') else self.yarn_api
 
@@ -86,7 +89,7 @@ class YarnApi(Api):
         'duration': 10 * 3600,
         'submitted': 10 * 3600
     }
-    
+
     if app.applicationType == 'MR2':
       common['type'] = 'MAPREDUCE'
       common['duration'] = app.duration
@@ -102,12 +105,22 @@ class YarnApi(Api):
       }
     return common
 
-  def logs(self, appid):
-    # name = 'stdout'
-    # attempt_index
-    # offset=log_offset
-    response = job_attempt_logs_json(MockDjangoRequest(self.user), job=appid)
-    return {'progress': 0, 'logs': {'default': json.loads(response.content)['log']}}
+  def logs(self, appid, app_type):
+    if app_type == 'MAPREDUCE':
+      response = job_attempt_logs_json(MockDjangoRequest(self.user), job=appid)
+      logs = json.loads(response.content)['log']
+    else:
+      logs = None
+    return {'progress': 0, 'logs': {'default': logs}}
+
+
+  def profile(self, appid, app_type, property):
+    if app_type == 'MAPREDUCE':
+      if property == 'tasks':
+        response = tasks(MockDjangoRequest(self.user), job=appid)
+        print response.context['task_list']
+
+    return {}
 
 
 class YarnAtsApi(Api):

+ 1 - 1
apps/jobbrowser/src/jobbrowser/apis/workflow_api.py

@@ -64,7 +64,7 @@ class WorkflowApi(Api):
 
     return common
 
-  def logs(self, appid):
+  def logs(self, appid, app_type):
     request = MockDjangoRequest(self.user)
     data = get_oozie_job_log(request, job_id=appid)
 

+ 64 - 49
apps/jobbrowser/src/jobbrowser/templates/apps.mako

@@ -192,12 +192,12 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
 
 <script type="text/html" id="breadcrumbs">
-  
+
   <h2 data-bind="foreach: breadcrumbs">
     <!-- ko if: $index() > 0 -->
       &gt;
     <!-- /ko -->
-    
+
     ## TODO: no link on last item
 
     <!-- ko if: id.length == 0 -->
@@ -208,7 +208,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
       :
       <span data-bind="text: id, click: function() { $parent.breadcrumbs.splice($index()); $root.job().fetchJob(id); }"></span>
     <!-- /ko -->
-  </h2> 
+  </h2>
 </script>
 
 
@@ -219,7 +219,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
   <span data-bind="text: paginationOffset() * paginationResultPage()"></span>
   of
   <span data-bind="text: paginationResultCounts"></span>
-  
+
   Show
   <span data-bind="text: paginationOffset"></span>
   results by page.
@@ -270,11 +270,11 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
   ${ _('Submitted') } <span data-bind="text: submitted"></span>
 
   </br></br>
-  
+
   <!-- ko with: properties -->
   Map <span data-bind="text: maps_percent_complete"></span> <span data-bind="text: finishedMaps"></span> /<span data-bind="text: desiredMaps"></span>
   Reduce <span data-bind="text: reduces_percent_complete"></span> <span data-bind="text: finishedReduces"></span> / <span data-bind="text: desiredReduces"></span><br/>
-  Duration <span data-bind="text: $parent.duration"></span><br/>  
+  Duration <span data-bind="text: $parent.duration"></span><br/>
   <!-- /ko -->
   </br></br>
 
@@ -288,39 +288,35 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
   <ul class="nav nav-tabs">
     <li class="active"><a href="#job-mapreduce-page-logs" data-toggle="tab">${ _('Logs') }</a></li>
-    <li><a href="#job-mapreduce-page-attempts" data-toggle="tab">${ _('Attempts') }</a></li>
     <li><a href="#job-mapreduce-page-tasks" data-toggle="tab">${ _('Tasks') }</a></li>
     <li><a href="#job-mapreduce-page-metadata" data-toggle="tab">${ _('Metadata') }</a></li>
     <li><a href="#job-mapreduce-page-counters" data-toggle="tab">${ _('Counters') }</a></li>
   </ul>
 
-  <div class="tab-content active" id="job-mapreduce-page-logs">
-    % for name in ['stdout', 'stderr', 'syslog']:
-      <a href="javascript:void(0)" data-bind="click: fetchLogs, text: '${ name }'"></a>
-    % endfor
-    </br>
+  <div class="tab-content">
+    <div class="tab-pane active" id="job-mapreduce-page-logs">
+      % for name in ['stdout', 'stderr', 'syslog']:
+        <a href="javascript:void(0)" data-bind="click: fetchLogs, text: '${ name }'"></a>
+      % endfor
+      </br>
 
-    <pre data-bind="html: logs['default']"></pre>
-  </div>
+      <pre data-bind="html: logs['default']"></pre>
+    </div>
 
-  <div class="tab-content" id="job-mapreduce-page-attempts">
-    <table class="table table-condensed">
-    </table>
-  </div>
+    <div class="tab-pane" id="job-mapreduce-page-tasks">
+      <table class="table table-condensed">
+      </table>
+    </div>
 
-  <div class="tab-content" id="job-mapreduce-page-tasks">
-    <table class="table table-condensed">
-    </table>
-  </div>
-  
-  <div class="tab-content" id="job-mapreduce-page-metadata">
-    <table class="table table-condensed">
-    </table>
-  </div>
-  
-  <div class="tab-content" id="job-mapreduce-page-counters">
-    <table class="table table-condensed">
-    </table>
+    <div class="tab-pane" id="job-mapreduce-page-metadata">
+      <table class="table table-condensed">
+      </table>
+    </div>
+
+    <div class="tab-pane" id="job-mapreduce-page-counters">
+      <table class="table table-condensed">
+      </table>
+    </div>
   </div>
 
 </script>
@@ -328,14 +324,14 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 <script type="text/html" id="job-mapreduce-task-page">
   <h2>MapReduce Task</h2>
   <br/>
-  
+
   Task Attemps | Metadata | Counters
 </script>
 
 <script type="text/html" id="job-mapreduce-task-attempt-page">
   <h2>MapReduce Task attempt</h2>
   <br/>
-  
+
   Container | Metadata | Counters
 </script>
 
@@ -375,12 +371,12 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
   ${ _('Progress') } <span data-bind="text: progress"></span>
   ${ _('Duration') } <span data-bind="text: duration"></span>
   ${ _('Submitted') } <span data-bind="text: submitted"></span>
-  
+
   </br></br>
   Variables</br>
   Duration 8s</br>
   </br></br>
-  
+
   <div class="progress-job progress active pull-left" style="background-color: #FFF; width: 100%" data-bind="css: {'progress-warning': progress() < 100, 'progress-success': progress() === 100}">
     <div class="bar" data-bind="style: {'width': progress() + '%'}"></div>
   </div>
@@ -396,22 +392,24 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     <li><a href="#workflow-page-metadata" data-toggle="tab">${ _('Metadata') }</a></li>
   </ul>
 
-  <div class="tab-content active" id="workflow-page-graph">
-    <span data-bind="html: properties().graph"></span>
-  </div>
+  <div class="tab-content">
+    <div class="tab-pane active" id="workflow-page-graph">
+      <span data-bind="html: properties().graph"></span>
+    </div>
 
-  <div class="tab-content" id="workflow-page-logs">
-    <pre data-bind="html: logs['default']"></pre>
-  </div>
+    <div class="tab-pane" id="workflow-page-logs">
+      <pre data-bind="html: logs['default']"></pre>
+    </div>
 
-  <div class="tab-content" id="workflow-page-tasks">
-    <table class="table table-condensed">
-    </table>
-  </div>
-  
-  <div class="tab-content" id="workflow-page-metadata">
-    <table class="table table-condensed">
-    </table>
+    <div class="tab-pane" id="workflow-page-tasks">
+      <table class="table table-condensed">
+      </table>
+    </div>
+
+    <div class="tab-pane" id="workflow-page-metadata">
+      <table class="table table-condensed">
+      </table>
+    </div>
   </div>
 
 </script>
@@ -511,6 +509,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         $.post("/jobbrowser/api/job/logs", {
           appid: ko.mapping.toJSON(self.id),
           interface: ko.mapping.toJSON(vm.interface),
+          type: ko.mapping.toJSON(self.type),
           name: name ? name : 'default'
         }, function (data) {
           if (data.status == 0) {
@@ -521,6 +520,22 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         }).always(function () {
         });
       };
+
+      self.fetchProfile = function (name) {
+        $.post("/jobbrowser/api/job/profile", {
+          appid: ko.mapping.toJSON(self.id),
+          interface: ko.mapping.toJSON(vm.interface),
+          type: ko.mapping.toJSON(self.type),
+          name: name
+        }, function (data) {
+          if (data.status == 0) {
+            self.properties['default'](data.logs.logs['default']);
+          } else {
+            $(document).trigger("error", data.message);
+          }
+        }).always(function () {
+        });
+      };
     };
 
     var Jobs = function (vm, options) {

+ 1 - 0
apps/jobbrowser/src/jobbrowser/urls.py

@@ -57,5 +57,6 @@ urlpatterns += patterns('jobbrowser.views',
 urlpatterns += patterns('jobbrowser.api2',
   url(r'api/jobs', 'jobs', name='jobs'),
   url(r'api/job/logs', 'logs', name='logs'),
+  url(r'api/job/profile', 'profile', name='profile'),
   url(r'api/job', 'job', name='job'),
 )

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

@@ -381,7 +381,7 @@ def list_oozie_workflow(request, job_id):
 
 
   if request.GET.get('format') == 'json':
-    if not workflow_graph and request.GET.get('is_jb2'):      
+    if not workflow_graph and request.GET.get('is_jb2'):
       workflow_graph = django_mako.render_to_string('dashboard/list_oozie_workflow_graph.mako', {})
     return_obj = {
       'id': oozie_workflow.id,