Pārlūkot izejas kodu

HUE-3105 [oozie] Fix workflow graph for jobs submitted from pig editor and support case sensitive tags in definition

krish 9 gadi atpakaļ
vecāks
revīzija
98ea1b451b

+ 2 - 1
apps/oozie/src/oozie/importlib/workflows.py

@@ -714,7 +714,8 @@ def generate_v2_graph_nodes(workflow_definition):
   node_list = str(transformed_root).replace('\n', '').replace(' ', '')
   node_list = json.loads(node_list)
 
-  return node_list
+  return [node for node in node_list if node]
+
 
 
 class MalformedWfDefException(Exception):

+ 14 - 2
apps/oozie/src/oozie/models2.py

@@ -361,6 +361,7 @@ class Workflow(Job):
       'namespaces': e.namespaces
     })
 
+    _to_lowercase(node_list)
     adj_list = _create_graph_adjaceny_list(node_list)
 
     node_hierarchy = ['start']
@@ -434,6 +435,17 @@ class Workflow(Job):
 
     return data
 
+
+# Updates node_list to lowercase names
+# To avoid case-sensitive failures
+def _to_lowercase(node_list):
+  for node in node_list:
+    node['node_type'] = node['node_type'].lower()
+    node['name'] = node['name'].lower()
+    node['ok_to'] = node['ok_to'].lower()
+    if 'error_to' in node.keys():
+      node['error_to'] = node['error_to'].lower()
+
 def _update_adj_list(adj_list):
   uuids = {}
   id = 1
@@ -575,8 +587,8 @@ def _get_hierarchy_from_adj_list(adj_list, curr_node, node_hierarchy):
     return curr_node
 
   elif adj_list[curr_node]['node_type'] == 'end':
-    node_hierarchy.append(['Kill'])
-    node_hierarchy.append(['End'])
+    node_hierarchy.append(['kill'])
+    node_hierarchy.append(['end'])
     return node_hierarchy
 
   elif adj_list[curr_node]['node_type'] == 'fork':

+ 3 - 3
apps/oozie/src/oozie/tests2.py

@@ -303,11 +303,11 @@ class TestExternalWorkflowGraph():
   def test_graph_generation_from_xml(self):
     f = open('apps/oozie/src/oozie/test_data/xslt2/test-workflow.xml')
     self.wf.definition = f.read()
-    self.node_list = [{u'node_type': u'start', u'ok_to': u'fork-68d4', u'name': u''}, {u'node_type': u'kill', u'ok_to': u'', u'name': u'Kill'}, {u'path2': u'shell-0f44', u'node_type': u'fork', u'ok_to': u'', u'name': u'fork-68d4', u'path1': u'subworkflow-a13f'}, {u'node_type': u'join', u'ok_to': u'End', u'name': u'join-775e'}, {u'node_type': u'end', u'ok_to': u'', u'name': u'End'}, {u'subworkflow': {u'app-path': u'${nameNode}/user/hue/oozie/deployments/_admin_-oozie-50001-1427488969.48'}, u'node_type': u'sub-workflow', u'ok_to': u'join-775e', u'name': u'subworkflow-a13f', u'error_to': u'Kill'}, {u'shell': {u'command': u'ls'}, u'node_type': u'shell', u'ok_to': u'join-775e', u'name': u'shell-0f44', u'error_to': u'Kill'}, {}]
+    self.node_list = [{u'node_type': u'start', u'ok_to': u'fork-68d4', u'name': u''}, {u'node_type': u'kill', u'ok_to': u'', u'name': u'Kill'}, {u'path2': u'shell-0f44', u'node_type': u'fork', u'ok_to': u'', u'name': u'fork-68d4', u'path1': u'subworkflow-a13f'}, {u'node_type': u'join', u'ok_to': u'End', u'name': u'join-775e'}, {u'node_type': u'end', u'ok_to': u'', u'name': u'End'}, {u'subworkflow': {u'app-path': u'${nameNode}/user/hue/oozie/deployments/_admin_-oozie-50001-1427488969.48'}, u'node_type': u'sub-workflow', u'ok_to': u'join-775e', u'name': u'subworkflow-a13f', u'error_to': u'Kill'}, {u'shell': {u'command': u'ls'}, u'node_type': u'shell', u'ok_to': u'join-775e', u'name': u'shell-0f44', u'error_to': u'Kill'}]
     assert_equal(self.node_list, generate_v2_graph_nodes(self.wf.definition))
 
   def test_get_graph_adjacency_list(self):
-    self.node_list = [{u'node_type': u'start', u'ok_to': u'fork-68d4', u'name': u''}, {u'node_type': u'kill', u'ok_to': u'', u'name': u'Kill'}, {u'path2': u'shell-0f44', u'node_type': u'fork', u'ok_to': u'', u'name': u'fork-68d4', u'path1': u'subworkflow-a13f'}, {u'node_type': u'join', u'ok_to': u'End', u'name': u'join-775e'}, {u'node_type': u'end', u'ok_to': u'', u'name': u'End'}, {u'node_type': u'sub-workflow', u'ok_to': u'join-775e', u'sub-workflow': {u'app-path': u'${nameNode}/user/hue/oozie/deployments/_admin_-oozie-50001-1427488969.48'}, u'name': u'subworkflow-a13f', u'error_to': u'Kill'}, {u'shell': {u'command': u'ls'}, u'node_type': u'shell', u'ok_to': u'join-775e', u'name': u'shell-0f44', u'error_to': u'Kill'}, {}]
+    self.node_list = [{u'node_type': u'start', u'ok_to': u'fork-68d4', u'name': u''}, {u'node_type': u'kill', u'ok_to': u'', u'name': u'kill'}, {u'path2': u'shell-0f44', u'node_type': u'fork', u'ok_to': u'', u'name': u'fork-68d4', u'path1': u'subworkflow-a13f'}, {u'node_type': u'join', u'ok_to': u'end', u'name': u'join-775e'}, {u'node_type': u'end', u'ok_to': u'', u'name': u'end'}, {u'node_type': u'sub-workflow', u'ok_to': u'join-775e', u'sub-workflow': {u'app-path': u'${nameNode}/user/hue/oozie/deployments/_admin_-oozie-50001-1427488969.48'}, u'name': u'subworkflow-a13f', u'error_to': u'kill'}, {u'shell': {u'command': u'ls'}, u'node_type': u'shell', u'ok_to': u'join-775e', u'name': u'shell-0f44', u'error_to': u'kill'}]
     adj_list = _create_graph_adjaceny_list(self.node_list)
 
     assert_true(len(adj_list) == 7)
@@ -377,7 +377,7 @@ class TestExternalWorkflowGraph():
     node_hierarchy = ['start']
     _get_hierarchy_from_adj_list(adj_list, adj_list['start']['ok_to'], node_hierarchy)
 
-    assert_equal(node_hierarchy, ['start', [u'fork-fe93', [[u'shell-bd90'], [u'shell-d64c'], [u'shell-5429'], [u'shell-d8cc']], u'join-7f80'], ['Kill'], ['End']])
+    assert_equal(node_hierarchy, ['start', [u'fork-fe93', [[u'shell-bd90'], [u'shell-d64c'], [u'shell-5429'], [u'shell-d8cc']], u'join-7f80'], ['kill'], ['end']])
 
   def test_gen_workflow_data_from_xml(self):
     self.wf.definition = """<workflow-app name="fork-fork-test" xmlns="uri:oozie:workflow:0.5">

+ 2 - 1
apps/pig/src/pig/api.py

@@ -69,6 +69,7 @@ class OozieApi(object):
 
   def _create_workflow(self, pig_script, params):
     workflow = Workflow.objects.new_workflow(self.user)
+    workflow.schema_version = 'uri:oozie:workflow:0.5'
     workflow.name = OozieApi.WORKFLOW_NAME
     workflow.is_history = True
     if pig_script.use_hcatalog:
@@ -112,7 +113,7 @@ class OozieApi(object):
           archives.append({"dummy": "", "name": resource['value']})
 
     action = Pig.objects.create(
-        name='pig',
+        name='pig-5760',
         script_path=script_path,
         workflow=workflow,
         node_type='pig',