Browse Source

HUE-1176 [jb] Add basic job operation API to workflows

Romain Rigaux 8 years ago
parent
commit
b767dde884

+ 1 - 2
apps/jobbrowser/src/jobbrowser/api2.py

@@ -79,8 +79,7 @@ def action(request):
   operation = json.loads(request.POST.get('operation'))
 
   response['operation'] = operation
-  response['action_status'] = get_api(request.user, interface).action(app_id, operation)
-  response['status'] = 0
+  response.update(get_api(request.user, interface).action(app_id, operation))
 
   return JsonResponse(response)
 

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

@@ -67,8 +67,9 @@ class Api(object):
 
 class MockDjangoRequest():
 
-  def __init__(self, user):
+  def __init__(self, user, get=None, post=None):
     self.user = user
     self.jt = None
-    self.GET = {'format': 'json'}
+    self.GET = get if get is not None else {'format': 'json'}
+    self.POST = post if post is not None else {}
     self.method = "POST"

+ 9 - 7
apps/jobbrowser/src/jobbrowser/apis/workflow_api.py

@@ -31,7 +31,7 @@ try:
   from oozie.conf import OOZIE_JOBS_COUNT
   from oozie.views.dashboard import get_oozie_job_log, list_oozie_workflow, manage_oozie_jobs, bulk_manage_oozie_jobs
 except Exception, e:
-  LOG.exception('Some application are not enabled for Job Browser v2: %s' % e)
+  LOG.exception('Some applications are not enabled for Job Browser v2: %s' % e)
 
 
 class WorkflowApi(Api):
@@ -52,6 +52,7 @@ class WorkflowApi(Api):
         'submitted': 10 * 3600
     } for app in wf_list.jobs]
 
+
   def app(self, appid):
     oozie_api = get_oozie(self.user)
     workflow = oozie_api.get_job(jobid=appid)
@@ -65,14 +66,15 @@ class WorkflowApi(Api):
     return common
 
 
-  def action(self, appid, action):
-    request = MockDjangoRequest(self.user)
-    manage_oozie_jobs(request, action)
-
+  def action(self, appid, action):    
     if action == 'change' or action == 'ignore' or ',' not in appid:
-      return manage_oozie_jobs(request, action)
+      request = MockDjangoRequest(self.user)
+      response = manage_oozie_jobs(request, appid, action['action'])
     else:
-      return bulk_manage_oozie_jobs(request)
+      request = MockDjangoRequest(self.user, post={'job_ids': appid, 'action': action['action']})
+      response = bulk_manage_oozie_jobs(request)
+
+    return json.loads(response.content)
 
 
   def logs(self, appid, app_type):

+ 19 - 13
apps/jobbrowser/src/jobbrowser/templates/apps.mako → apps/jobbrowser/src/jobbrowser/templates/job_browser.mako

@@ -134,9 +134,15 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
 
             <div class="btn-toolbar pull-right" style="display: inline; vertical-align: middle; margin-left: 10px; font-size: 12px">
               <span class="loader hide"><i class="fa fa-2x fa-spinner fa-spin muted"></i></span>
-              <button class="btn bulkToolbarBtn bulk-resume" data-operation="resume" title="${ _('Resume selected') }" disabled="disabled" type="button"><i class="fa fa-play"></i><span class="hide-small"> ${ _('Resume') }</span></button>
-              <button class="btn bulkToolbarBtn bulk-suspend" data-operation="suspend" title="${ _('Suspend selected') }" disabled="disabled" type="button"><i class="fa fa-pause"></i><span class="hide-small"> ${ _('Suspend') }</span></button>
-              <button class="btn bulkToolbarBtn btn-danger bulk-kill disable-feedback" data-operation="kill" title="${ _('Kill selected') }" disabled="disabled" type="button"><i class="fa fa-times"></i><span class="hide-small"> ${ _('Kill') }</span></button>
+              <button class="btn bulkToolbarBtn bulk-resume" data-operation="resume" title="${ _('Resume selected') }" disabled="disabled" type="button">
+                <i class="fa fa-play"></i><span class="hide-small"> ${ _('Resume') }</span>
+              </button>
+              <button class="btn bulkToolbarBtn bulk-suspend" data-operation="suspend" title="${ _('Suspend selected') }" disabled="disabled" type="button">
+                <i class="fa fa-pause"></i><span class="hide-small"> ${ _('Suspend') }</span>
+              </button>
+              <button class="btn bulkToolbarBtn btn-danger bulk-kill disable-feedback" data-operation="kill" title="${ _('Kill selected') }" disabled="disabled" type="button">
+                <i class="fa fa-times"></i><span class="hide-small"> ${ _('Kill') }</span>
+              </button>
             </div>
 
             <div class="card card-small">
@@ -299,7 +305,7 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     <div class="bar" data-bind="style: {'width': progress() + '%'}"></div>
   </div>
 
-  <a href="javascript:void(0)" data-bind="click: function() { changeStatus('kill'); }">Stop</a>
+  <a href="javascript:void(0)" data-bind="click: function() { control('kill'); }">Stop</a>
 
   </br>
 
@@ -589,9 +595,9 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
     <div class="bar" data-bind="style: {'width': progress() + '%'}"></div>
   </div>
 
-  <a href="javascript:void(0)" data-bind="click: function() { changeStatus('kill'); }">Stop</a> |
-  <a href="javascript:void(0)" data-bind="click: function() { changeStatus('resume'); }">Resume</a> |
-  <a href="javascript:void(0)" data-bind="click: function() { changeStatus('rerun'); }">Rerun</a>
+  <a href="javascript:void(0)" data-bind="click: function() { control('kill'); }">Stop</a> |
+  <a href="javascript:void(0)" data-bind="click: function() { control('resume'); }">Resume</a> |
+  <a href="javascript:void(0)" data-bind="click: function() { control('rerun'); }">Rerun</a>
 
   <br/>
 
@@ -759,15 +765,15 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         });
       };
 
-      self.changeStatus = function (name) {
+      self.control = function (action) {
         $.post("/jobbrowser/api/job/action", {
           app_id: ko.mapping.toJSON(self.id),
           interface: ko.mapping.toJSON(vm.interface),
           app_type: ko.mapping.toJSON(self.type),
-          operation: ko.mapping.toJSON({action: name})
+          operation: ko.mapping.toJSON({action: action})
         }, function (data) {
           if (data.status == 0) {
-
+             $(document).trigger("info", data.message);
           } else {
             $(document).trigger("error", data.message);
           }
@@ -807,14 +813,14 @@ ${ commonheader("Job Browser", "jobbrowser", user, request) | n,unicode }
         });
       };
 
-      self.changeStatuses = function (name) {
+      self.control = function (action) {
         $.post("/jobbrowser/api/job/action", {
           app_id: ko.mapping.toJSON(self.id), // CSV list
           interface: ko.mapping.toJSON(vm.interface),
-          operation: ko.mapping.toJSON({action: name})
+          operation: ko.mapping.toJSON({action: action})
         }, function (data) {
           if (data.status == 0) {
-
+            $(document).trigger("info", data.message);
           } else {
             $(document).trigger("error", data.message);
           }

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

@@ -103,7 +103,7 @@ def get_job(request, job_id):
 
 
 def apps(request):
-  return render('apps.mako', request, {
+  return render('job_browser.mako', request, {
     'is_embeddable': request.GET.get('is_embeddable', False),
     'hiveserver2_impersonation_enabled': hiveserver2_impersonation_enabled()
   })