Browse Source

HUE-3436 [oozie] Retain old dependencies when saving a workflow

krish 9 years ago
parent
commit
a453da9
2 changed files with 69 additions and 4 deletions
  1. 63 0
      apps/oozie/src/oozie/tests2.py
  2. 6 4
      apps/oozie/src/oozie/views/editor2.py

+ 63 - 0
apps/oozie/src/oozie/tests2.py

@@ -19,10 +19,14 @@
 import json
 import json
 import logging
 import logging
 
 
+from django.contrib.auth.models import User
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+from django.db.models import Q
 
 
 from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal
 from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal
 
 
+from desktop.models import Document2
+
 from oozie.conf import ENABLE_V2
 from oozie.conf import ENABLE_V2
 from oozie.importlib.workflows import generate_v2_graph_nodes
 from oozie.importlib.workflows import generate_v2_graph_nodes
 from oozie.models2 import Workflow, find_dollar_variables, find_dollar_braced_variables, Node, _create_graph_adjaceny_list, _get_hierarchy_from_adj_list
 from oozie.models2 import Workflow, find_dollar_variables, find_dollar_braced_variables, Node, _create_graph_adjaceny_list, _get_hierarchy_from_adj_list
@@ -297,6 +301,65 @@ LIMIT $limit"""))
     response = self.c.get(reverse('oozie:list_editor_bundles'))
     response = self.c.get(reverse('oozie:list_editor_bundles'))
     assert_true('bundles_json' in response.context, response.context)
     assert_true('bundles_json' in response.context, response.context)
 
 
+  def test_workflow_dependencies(self):
+    wf_doc1 = save_temp_workflow(MockOozieApi.JSON_WORKFLOW_LIST[5], self.user)
+
+    # Add history dependency
+    wf_doc1.is_history = True
+    wf_doc1.dependencies.add(wf_doc1)
+
+    # Add sub-workflow dependency
+    wf_doc2 = save_temp_workflow(MockOozieApi.JSON_WORKFLOW_LIST[4], self.user)
+    wf_doc1.dependencies.add(wf_doc2)
+
+    # Add coordinator dependency
+    data = {
+          'id': None,
+          'uuid': None,
+          'name': 'My Coordinator',
+          'variables': [], # Aka workflow parameters
+          'properties': {
+              'description': '',
+              'deployment_dir': '',
+              'schema_version': 'uri:oozie:coordinator:0.2',
+              'frequency_number': 1,
+              'frequency_unit': 'days',
+              'cron_frequency': '0 0 * * *',
+              'cron_advanced': False,
+              'timezone': '',
+              'start': '${start_date}',
+              'end': '${end_date}',
+              'workflow': None,
+              'timeout': None,
+              'concurrency': None,
+              'execution': None,
+              'throttle': None,
+              'job_xml': '',
+              'credentials': [],
+              'parameters': [
+                  {'name': 'oozie.use.system.libpath', 'value': True},
+                  {'name': 'start_date', 'value': ''},
+                  {'name': 'end_date', 'value': ''}
+              ],
+              'sla': Workflow.SLA_DEFAULT
+          }
+      }
+    wf_doc3 = Document2.objects.create(name='test', type='oozie-coordinator2', owner=User.objects.get(username='test'), data=data)
+    wf_doc1.dependencies.add(wf_doc3)
+
+    assert_true(len(wf_doc1.dependencies.all()) == 3)
+
+    wf_doc1.save()
+
+    # Validating dependencies after saving the workflow
+    assert_true(len(wf_doc1.dependencies.all()) == 3)
+    assert_true(len(wf_doc1.dependencies.filter(type='oozie-coordinator2')) > 0)
+    assert_true(len(wf_doc1.dependencies.filter(Q(is_history=False) & Q(type='oozie-workflow2'))) > 0)
+    assert_true(len(wf_doc1.dependencies.filter(Q(is_history=True) & Q(type='oozie-workflow2'))) > 0)
+
+    wf_doc1.delete()
+    wf_doc2.delete()
+    wf_doc3.delete()
 
 
 class TestExternalWorkflowGraph():
 class TestExternalWorkflowGraph():
 
 

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

@@ -19,6 +19,7 @@ import json
 import logging
 import logging
 
 
 from django.core.urlresolvers import reverse
 from django.core.urlresolvers import reverse
+from django.db.models import Q
 from django.forms.formsets import formset_factory
 from django.forms.formsets import formset_factory
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.translation import ugettext as _
 from django.utils.translation import ugettext as _
@@ -204,12 +205,13 @@ def save_workflow(request):
     workflow_doc = Document2.objects.create(name=workflow['name'], uuid=workflow['uuid'], type='oozie-workflow2', owner=request.user, description=workflow['properties']['description'])
     workflow_doc = Document2.objects.create(name=workflow['name'], uuid=workflow['uuid'], type='oozie-workflow2', owner=request.user, description=workflow['properties']['description'])
     Document.objects.link(workflow_doc, owner=workflow_doc.owner, name=workflow_doc.name, description=workflow_doc.description, extra='workflow2')
     Document.objects.link(workflow_doc, owner=workflow_doc.owner, name=workflow_doc.name, description=workflow_doc.description, extra='workflow2')
 
 
+  # Excludes all the sub-workflow dependencies. Contains list of history and coordinator dependencies.
+  workflow_doc.dependencies = workflow_doc.dependencies.exclude(Q(is_history=False) & Q(type='oozie-workflow2'))
+
   subworkflows = [node['properties']['workflow'] for node in workflow['nodes'] if node['type'] == 'subworkflow-widget']
   subworkflows = [node['properties']['workflow'] for node in workflow['nodes'] if node['type'] == 'subworkflow-widget']
   if subworkflows:
   if subworkflows:
-    dependencies = Document2.objects.filter(uuid__in=subworkflows)
-    workflow_doc.dependencies = dependencies
-  else:
-    workflow_doc.dependencies = []
+    subworkflow_dependencies = Document2.objects.filter(uuid__in=subworkflows)
+    workflow_doc.dependencies.add(*subworkflow_dependencies)
 
 
   if workflow['properties'].get('imported'): # We save and old format workflow to the latest
   if workflow['properties'].get('imported'): # We save and old format workflow to the latest
     workflow['properties']['imported'] = False
     workflow['properties']['imported'] = False