Эх сурвалжийг харах

HUE-2974 [oozie] Submit single action from Workflow editor

krish 10 жил өмнө
parent
commit
abb81053a0

+ 35 - 0
apps/oozie/src/oozie/models2.py

@@ -292,6 +292,41 @@ class Workflow(Job):
       LOG.error(msg)
       raise PopupException(msg)
 
+  def create_single_action_workflow_data(self, node_id):
+    _data = json.loads(self.data)
+
+    start_node = [node for node in _data['workflow']['nodes'] if node['name'] == 'Start'][0]
+    submit_node = [node for node in _data['workflow']['nodes'] if node['id'] == node_id][0]
+    end_node = [node for node in _data['workflow']['nodes'] if node['name'] == 'End'][0]
+    kill_node = [node for node in _data['workflow']['nodes'] if node['name'] == 'Kill'][0]
+
+    # Modify children to point Start -> Submit_node -> End/Kill
+    start_node['children'] = [{'to': submit_node['id']}]
+    submit_node['children'] = [{'to': end_node['id']}, {'error': kill_node['id']}]
+    _data['workflow']['properties']['deployment_dir'] = None
+
+    # Create wf data with above nodes
+    return json.dumps({
+      'layout': [{
+          "size": 12,
+          "rows": [
+              [row for row in _data['layout'][0]['rows'] if row['widgets'][0]['name'] == 'Start'][0],
+              [row for row in _data['layout'][0]['rows'] if row['widgets'][0]['id'] == node_id][0],
+              [row for row in _data['layout'][0]['rows'] if row['widgets'][0]['name'] == 'End'][0],
+              [row for row in _data['layout'][0]['rows'] if row['widgets'][0]['name'] == 'Kill'][0]
+          ],
+          "drops": ["temp"],
+          "klass": "card card-home card-column span12"
+      }],
+      'workflow': {
+          "id": None,
+          "uuid": None,
+          "name": _data['workflow']['name'],
+          "properties": _data['workflow']['properties'],
+          "nodes": [start_node, submit_node, end_node, kill_node]
+      }
+    })
+
   def get_absolute_url(self):
     return reverse('oozie:edit_workflow') + '?workflow=%s' % self.id
 

+ 10 - 0
apps/oozie/src/oozie/static/oozie/js/workflow-editor.ko.js

@@ -1188,6 +1188,16 @@ var WorkflowEditorViewModel = function (layout_json, workflow_json, credentials_
     });
   };
 
+  self.showSubmitActionPopup = function (w) {
+    $(".jHueNotify").hide();
+    $.get("/oozie/editor/workflow/submit_single_action/" + self.workflow.id() + "/" + self.workflow.getNodeById(w.id()).id(), {
+    }, function (data) {
+      $(document).trigger("showSubmitPopup", data);
+    }).fail(function (xhr, textStatus, errorThrown) {
+      $(document).trigger("error", xhr.responseText);
+    });
+  };
+
   self.schedule = function () {
     window.location.replace('/oozie/editor/coordinator/new/?workflow=' + self.workflow.uuid());
   };

+ 4 - 0
apps/oozie/src/oozie/templates/editor2/common_workflow.mako

@@ -216,6 +216,10 @@
       <span data-bind="visible: typeof $root.isViewer == 'undefined' || ! $root.isViewer(), editable: name, editableOptions: {enabled: $root.isEditing(), placement: 'right'}, attr: {'title': id().slice(0, 4)}"></span>
       <a class="pointer" data-bind="visible: typeof $root.isViewer != 'undefined' && $root.isViewer(), click: function(){ location.href = actionURL(); }, text: name" title="${ _('View workflow action') }"></a>
 
+      <div class="inline pull-right" data-bind="visible: (typeof $root.isViewer == 'undefined' || ! $root.isViewer()) && !$root.isEditing()" style="margin-right: 4px">
+        <a href="javascript:void(0)" data-bind="click: function(w) { viewModel.showSubmitActionPopup(w); }"><i class="fa fa-play-circle-o"></i></a>
+      </div>
+
       <!-- ko if: widgetType() == 'decision-widget' -->
         <div class="inline pull-right" data-bind="visible: $root.isEditing() && $root.workflow.getNodeById(id()) && $root.workflow.getNodeById(id()).children().length <= 1 && ! oozieExpanded() && ! ooziePropertiesExpanded()">
           <a href="javascript:void(0)" data-bind="click: function(w){addActionDemiModalFieldCancel();$root.removeWidget(w);}"><i class="fa fa-times"></i></a>

+ 18 - 1
apps/oozie/src/oozie/tests.py

@@ -239,6 +239,7 @@ class MockFs():
 
     self.fs_defaultfs = 'hdfs://curacao:8020'
     self.logical_name = logical_name if logical_name else ''
+    self.DEFAULT_USER = 'test'
 
   def setuser(self, user):
     pass
@@ -255,6 +256,18 @@ class MockFs():
   def exists(self, path):
     return True
 
+  def mkdir(self):
+    pass
+
+  def chmod(self):
+    pass
+
+  def stats(self, path):
+    class MockWebHdfsStat(object):
+      def __init__(self):
+        self.isDir = True
+    return MockWebHdfsStat()
+
 class OozieMockBase(object):
 
   def setUp(self):
@@ -3970,6 +3983,7 @@ def save_temp_workflow(wf, user):
           'layout': [{
               "size":12, "rows":[
                   {"widgets":[{"size":12, "name":"Start", "id":"3f107997-04cc-8733-60a9-a4bb62cebffc", "widgetType":"start-widget", "properties":{}, "offset":0, "isLoading":False, "klass":"card card-widget span12"}]},
+                  {"widgets":[{"size":12, "name":"Shell", "id":"3f107997-04cc-8733-60a9-a4bb62cebabc", "widgetType":"shell-widget", "properties":{}, "offset":0, "isLoading":False, "klass":"card card-widget span12"}]},
                   {"widgets":[{"size":12, "name":"End", "id":"33430f0f-ebfa-c3ec-f237-3e77efa03d0a", "widgetType":"end-widget", "properties":{}, "offset":0, "isLoading":False, "klass":"card card-widget span12"}]},
                   {"widgets":[{"size":12, "name":"Kill", "id":"17c9c895-5a16-7443-bb81-f34b30b21548", "widgetType":"kill-widget", "properties":{}, "offset":0, "isLoading":False, "klass":"card card-widget span12"}]}
               ],
@@ -4003,12 +4017,15 @@ def save_temp_workflow(wf, user):
                   "wf1_id": None
               },
               "nodes":[
-                  {"id":"3f107997-04cc-8733-60a9-a4bb62cebffc","name":"Start","type":"start-widget","properties":{},"children":[{'to': '33430f0f-ebfa-c3ec-f237-3e77efa03d0a'}]},
+                  {"id":"3f107997-04cc-8733-60a9-a4bb62cebffc","name":"Start","type":"start-widget","properties":{},"children":[{'to': '3f107997-04cc-8733-60a9-a4bb62cebabc'}]},
+                  {"id":"3f107997-04cc-8733-60a9-a4bb62cebabc","name":"shell-fc94","type":"shell-widget","properties":{'archives': [], 'arguments': [], 'capture_output': True, 'credentials': [], 'env_var': [], 'files': [], 'job_properties': [], 'job_xml': u'', 'prepares': [], 'retry_interval': [], 'retry_max': [], 'shell_command': 'ls', 'sla': []},"children":[{'to': '33430f0f-ebfa-c3ec-f237-3e77efa03d0a'}]},
                   {"id":"33430f0f-ebfa-c3ec-f237-3e77efa03d0a","name":"End","type":"end-widget","properties":{},"children":[]},
                   {"id":"17c9c895-5a16-7443-bb81-f34b30b21548","name":"Kill","type":"kill-widget","properties":{'message': 'Action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]'},"children":[]}
               ]
           }
       })
     workflow_doc = Document2.objects.create(name='test', type='oozie-workflow2', owner=user, data=data)
+    Document.objects.link(workflow_doc, owner=workflow_doc.owner, name=workflow_doc.name, description=workflow_doc.description, extra='workflow2')
+
     wf[u'conf'] = u'<configuration><property><name>hue-id-w</name><value>' + str(workflow_doc.id) + u'</value></property></configuration>'
     return workflow_doc

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 8 - 1
apps/oozie/src/oozie/tests2.py


+ 2 - 1
apps/oozie/src/oozie/urls.py

@@ -71,11 +71,12 @@ urlpatterns += patterns(
 
   url(r'^editor/workflow/list/$', 'list_editor_workflows', name='list_editor_workflows'),
   url(r'^editor/workflow/edit/$', 'edit_workflow', name='edit_workflow'),
-  url(r'^editor/workflow/new/$', 'new_workflow', name='new_workflow'),  
+  url(r'^editor/workflow/new/$', 'new_workflow', name='new_workflow'),
   url(r'^editor/workflow/delete/$', 'delete_job', name='delete_editor_workflow'),
   url(r'^editor/workflow/copy/$', 'copy_workflow', name='copy_workflow'),
   url(r'^editor/workflow/save/$', 'save_workflow', name='save_workflow'),
   url(r'^editor/workflow/submit/(?P<doc_id>\d+)$', 'submit_workflow', name='editor_submit_workflow'),
+  url(r'^editor/workflow/submit_single_action/(?P<doc_id>\d+)/(?P<node_id>.+)$', 'submit_single_action', name='submit_single_action'),
   url(r'^editor/workflow/new_node/$', 'new_node', name='new_node'),
   url(r'^editor/workflow/add_node/$', 'add_node', name='add_node'),
   url(r'^editor/workflow/parameters/$', 'workflow_parameters', name='workflow_parameters'),

+ 22 - 2
apps/oozie/src/oozie/views/editor2.py

@@ -333,6 +333,26 @@ def gen_xml_workflow(request):
 @check_document_access_permission()
 def submit_workflow(request, doc_id):
   workflow = Workflow(document=Document2.objects.get(id=doc_id))
+
+  return _submit_workflow_helper(request, workflow, submit_action=reverse('oozie:editor_submit_workflow', kwargs={'doc_id': workflow.id}))
+
+@check_document_access_permission()
+def submit_single_action(request, doc_id, node_id):
+  parent_doc = Document2.objects.get(id=doc_id)
+  workflow_data = Workflow(document=parent_doc).create_single_action_workflow_data(node_id)
+  _data = json.loads(workflow_data)
+
+  # Create separate wf object for the submit node with new deployment_dir
+  workflow = Workflow(data=workflow_data)
+  workflow.set_workspace(request.user)
+
+  workflow.check_workspace(request.fs, request.user)
+  workflow.document = wf_doc = Document2.objects.create(name=_data['workflow']['name'], type='oozie-workflow2', owner=parent_doc.owner, data=workflow_data)
+  Document.objects.link(wf_doc, owner=wf_doc.owner, name=wf_doc.name, description=wf_doc.description, extra='workflow2')
+
+  return _submit_workflow_helper(request, workflow, submit_action=reverse('oozie:submit_single_action', kwargs={'doc_id': doc_id, 'node_id': node_id}))
+
+def _submit_workflow_helper(request, workflow, submit_action):
   ParametersFormSet = formset_factory(ParameterForm, extra=0)
 
   if request.method == 'POST':
@@ -351,14 +371,14 @@ def submit_workflow(request, doc_id):
     else:
       request.error(_('Invalid submission form: %s' % params_form.errors))
   else:
-    parameters = workflow.find_all_parameters()
+    parameters = workflow and workflow.find_all_parameters() or []
     initial_params = ParameterForm.get_initial_params(dict([(param['name'], param['value']) for param in parameters]))
     params_form = ParametersFormSet(initial=initial_params)
 
     popup = render('editor2/submit_job_popup.mako', request, {
                      'params_form': params_form,
                      'name': workflow.name,
-                     'action': reverse('oozie:editor_submit_workflow', kwargs={'doc_id': workflow.id}),
+                     'action': submit_action,
                      'show_dryrun': True
                    }, force_template=True).content
     return JsonResponse(popup, safe=False)

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно