瀏覽代碼

HUE-1263 [oozie] Workflow with subworkflow action can't be saved

- Need to save all nodes
Abraham Elmahrek 12 年之前
父節點
當前提交
da053b3
共有 2 個文件被更改,包括 99 次插入46 次删除
  1. 98 45
      apps/oozie/src/oozie/tests.py
  2. 1 1
      apps/oozie/src/oozie/views/api.py

+ 98 - 45
apps/oozie/src/oozie/tests.py

@@ -412,54 +412,107 @@ class TestAPI(OozieMockBase):
     response = self.c.post(reverse('oozie:workflow_save', kwargs={'workflow': self.wf.pk}), data={'workflow': workflow_json}, HTTP_X_REQUESTED_WITH='XMLHttpRequest')
     assert_equal(200, response.status_code)
 
-  def test_workflow_save_subworkflow(self):
-    subworkflow_name = "subworkflow-1"
-    subworkflow_id = "subworkflow:1"
-    subworkflow_json = """{
-      "description": "",
-      "workflow": %(workflow)d,
-      "child_links": [
-        {
-          "comment": "",
-          "name": "ok",
-          "parent": "%(id)s",
-          "child": %(end)d
-        },
-        {
-          "comment": "",
-          "name": "error",
-          "parent": "%(id)s",
-          "child": %(kill)d
-        }
-      ],
-      "node_type": "subworkflow",
-      "sub_workflow": %(subworkflow)d,
-      "job_properties": "[]",
-      "name": "%(name)s",
-      "id": "%(id)s",
-      "propagate_configuration": true
-    }"""
-
+  def test_workflow_add_subworkflow_node(self):
     wf = self.create_noop_workflow()
-    subworkflow_json = subworkflow_json % {
-      'workflow': wf.id,
-      'subworkflow': self.wf.id,
-      'end': wf.end.id,
-      'kill': Kill.objects.get(workflow=wf).id,
-      'name': subworkflow_name,
-      'id': subworkflow_id
-    }
-    workflow_dict = workflow_to_dict(wf)
-    workflow_dict['nodes'].append(json.loads(subworkflow_json))
-    workflow_dict['nodes'][0]['child_links'][1]['child'] = subworkflow_id
-    del workflow_dict['nodes'][0]['child_links'][1]['id']
-    workflow_json = json.dumps(workflow_dict)
+    try:
+      subworkflow_name = "subworkflow-1"
+      subworkflow_id = "subworkflow:1"
+      subworkflow_json = """{
+        "description": "",
+        "workflow": %(workflow)d,
+        "child_links": [
+          {
+            "comment": "",
+            "name": "ok",
+            "parent": "%(id)s",
+            "child": %(end)d
+          },
+          {
+            "comment": "",
+            "name": "error",
+            "parent": "%(id)s",
+            "child": %(kill)d
+          }
+        ],
+        "node_type": "subworkflow",
+        "sub_workflow": %(subworkflow)d,
+        "job_properties": "[]",
+        "name": "%(name)s",
+        "id": "%(id)s",
+        "propagate_configuration": true
+      }"""
+      subworkflow_json = subworkflow_json % {
+        'workflow': wf.id,
+        'subworkflow': self.wf.id,
+        'end': wf.end.id,
+        'kill': Kill.objects.get(workflow=wf).id,
+        'name': subworkflow_name,
+        'id': subworkflow_id
+      }
+      workflow_dict = workflow_to_dict(wf)
+      workflow_dict['nodes'].append(json.loads(subworkflow_json))
+      workflow_dict['nodes'][0]['child_links'][1]['child'] = subworkflow_id
+      del workflow_dict['nodes'][0]['child_links'][1]['id']
+      workflow_json = json.dumps(workflow_dict)
+
+      response = self.c.post(reverse('oozie:workflow_save', kwargs={'workflow': wf.pk}), data={'workflow': workflow_json})
+      test_response_json = response.content
+      test_response_json_object = json.loads(test_response_json)
+      assert_equal(0, test_response_json_object['status'], workflow_json)
+    finally:
+      wf.delete()
 
-    response = self.c.post(reverse('oozie:workflow_save', kwargs={'workflow': wf.pk}), data={'workflow': workflow_json})
-    test_response_json = response.content
-    test_response_json_object = json.loads(test_response_json)
-    assert_equal(0, test_response_json_object['status'], workflow_json)
 
+  def test_workflow_add_mapreduce_node(self):
+    wf = self.create_noop_workflow()
+    try:
+      node_name = "mr-1"
+      node_id = "mapreduce:1"
+      node_json = """{
+        "description": "",
+        "workflow": %(workflow)d,
+        "child_links": [
+          {
+            "comment": "",
+            "name": "ok",
+            "parent": "%(id)s",
+            "child": %(end)d
+          },
+          {
+            "comment": "",
+            "name": "error",
+            "parent": "%(id)s",
+            "child": %(kill)d
+          }
+        ],
+        "node_type": "mapreduce",
+        "jar_path": "test",
+        "job_properties": "[]",
+        "files": "[]",
+        "archives": "[]",
+        "prepares": "[]",
+        "name": "%(name)s",
+        "id": "%(id)s"
+      }"""
+      node_json = node_json % {
+        'workflow': wf.id,
+        'end': wf.end.id,
+        'kill': Kill.objects.get(workflow=wf).id,
+        'name': node_name,
+        'id': node_id
+      }
+      workflow_dict = workflow_to_dict(wf)
+      workflow_dict['nodes'].append(json.loads(node_json))
+      workflow_dict['nodes'][0]['child_links'][1]['child'] = node_id
+      del workflow_dict['nodes'][0]['child_links'][1]['id']
+      workflow_json = json.dumps(workflow_dict)
+
+      response = self.c.post(reverse('oozie:workflow_save', kwargs={'workflow': wf.pk}), data={'workflow': workflow_json})
+      test_response_json = response.content
+      test_response_json_object = json.loads(test_response_json)
+      assert_equal(0, test_response_json_object['status'], workflow_json)
+    finally:
+      wf.delete()
 
   def test_workflow(self):
     response = self.c.get(reverse('oozie:workflow', kwargs={'workflow': self.wf.pk}))

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

@@ -199,12 +199,12 @@ def _update_workflow_nodes_json(workflow, json_nodes, id_map, user):
     if node.node_type == 'subworkflow':
       try:
         node.sub_workflow = Workflow.objects.get(id=int(json_node['sub_workflow']))
-        node.save()
       except Workflow.DoesNotExist:
         raise StructuredException(code="INVALID_REQUEST_ERROR", message=_('Error saving workflow'), data={'errors': 'Chosen subworkflow does not exist.'}, error_code=400)
     elif node.node_type == 'fork' and json_node['node_type'] == 'decision':
       node.save() # Need to save in case database throws error when performing delete.
       node = node.convert_to_decision()
+    node.save()
 
     id_map[str(json_node['id'])] = node.id