Pārlūkot izejas kodu

[oozie] Fix running a single workflow action for fork node

krish 10 gadi atpakaļ
vecāks
revīzija
18d04f9

+ 16 - 4
apps/oozie/src/oozie/models2.py

@@ -305,15 +305,27 @@ class Workflow(Job):
     submit_node['children'] = [{'to': end_node['id']}, {'error': kill_node['id']}]
     _data['workflow']['properties']['deployment_dir'] = None
 
+    # Recursively find the widget node
+    def _get_node(rows, node_id):
+      for row in rows:
+        if not row['widgets']:
+          for col in row['columns']:
+            node = _get_node(col['rows'], node_id)
+            if node:
+              return node
+        elif row['widgets'][0]['id'] == node_id:
+          return row
+
+
     # 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]
+              [row for row in _data['layout'][0]['rows'] if row['widgets'] and row['widgets'][0]['name'] == 'Start'][0],
+              _get_node(_data['layout'][0]['rows'], node_id),
+              [row for row in _data['layout'][0]['rows'] if row['widgets'] and row['widgets'][0]['name'] == 'End'][0],
+              [row for row in _data['layout'][0]['rows'] if row['widgets'] and row['widgets'][0]['name'] == 'Kill'][0]
           ],
           "drops": ["temp"],
           "klass": "card card-home card-column span12"

+ 4 - 3
apps/oozie/src/oozie/views/editor2.py

@@ -346,7 +346,8 @@ def submit_workflow(request, doc_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)
+  parent_wf = Workflow(document=parent_doc)
+  workflow_data = parent_wf.create_single_action_workflow_data(node_id)
   _data = json.loads(workflow_data)
 
   # Create separate wf object for the submit node with new deployment_dir
@@ -354,8 +355,8 @@ def submit_single_action(request, doc_id, node_id):
   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')
+  workflow.import_workspace(request.fs, parent_wf.deployment_dir, request.user)
+  workflow.document = parent_doc
 
   return _submit_workflow_helper(request, workflow, submit_action=reverse('oozie:submit_single_action', kwargs={'doc_id': doc_id, 'node_id': node_id}))