Explorar o código

HUE-969 [oozie] Automatically infer schema version when importing workflow

Added proper namespacing to XSLTs in order to import by version.
Version is inferred by namespace.
abec %!s(int64=13) %!d(string=hai) anos
pai
achega
04be852
Modificáronse 47 ficheiros con 140 adicións e 90 borrados
  1. 0 1
      apps/oozie/src/oozie/forms.py
  2. 26 13
      apps/oozie/src/oozie/import_workflow.py
  3. 1 1
      apps/oozie/src/oozie/templates/editor/import_workflow.mako
  4. 4 0
      apps/oozie/src/oozie/test_data/0.4/test-basic-namespace-missing.xml
  5. 3 3
      apps/oozie/src/oozie/test_data/0.4/test-basic.xml
  6. 26 10
      apps/oozie/src/oozie/tests.py
  7. 5 0
      apps/oozie/src/oozie/utils.py
  8. 1 2
      apps/oozie/src/oozie/views/editor.py
  9. 2 2
      apps/oozie/src/oozie/xslt/0.4/action.xslt
  10. 2 2
      apps/oozie/src/oozie/xslt/0.4/control.xslt
  11. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/distcp.0.1.xslt
  12. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.1.xslt
  13. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.2.xslt
  14. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/shell.0.1.xslt
  15. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.1.xslt
  16. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.2.xslt
  17. 2 2
      apps/oozie/src/oozie/xslt/0.4/extensions/ssh.0.1.xslt
  18. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/decision.xslt
  19. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/end.xslt
  20. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/archives.xslt
  21. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/args.xslt
  22. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/arguments.xslt
  23. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/capture_output.xslt
  24. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/command.xslt
  25. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/files.xslt
  26. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/host.xslt
  27. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/jar_path.xslt
  28. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/java_opts.xslt
  29. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_properties.xslt
  30. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_xml.xslt
  31. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/main_class.xslt
  32. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/mapper.xslt
  33. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/params.xslt
  34. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/prepares.xslt
  35. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/reducer.xslt
  36. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/script_path.xslt
  37. 1 1
      apps/oozie/src/oozie/xslt/0.4/nodes/fields/user.xslt
  38. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/fork.xslt
  39. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/java.xslt
  40. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/join.xslt
  41. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/kill.xslt
  42. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/mapreduce.xslt
  43. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/pig.xslt
  44. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/start.xslt
  45. 2 2
      apps/oozie/src/oozie/xslt/0.4/nodes/streaming.xslt
  46. 4 4
      apps/oozie/src/oozie/xslt/0.4/workflow.xslt
  47. 14 0
      apps/oozie/src/oozie/xslt/workflow.xslt

+ 0 - 1
apps/oozie/src/oozie/forms.py

@@ -76,7 +76,6 @@ SCHEMA_VERSION_CHOICES = ['0.4']
 
 class ImportWorkflowForm(WorkflowForm):
   definition_file = forms.FileField(label=_t("Local workflow.xml file"))
-  schema_version = forms.ChoiceField(choices=[(version, version) for version in SCHEMA_VERSION_CHOICES])
 
 
 class ImportJobsubDesignForm(forms.Form):

+ 26 - 13
apps/oozie/src/oozie/import_workflow.py

@@ -48,10 +48,14 @@ from desktop.lib.exceptions_renderable import PopupException
 
 from conf import DEFINITION_XSLT_DIR
 from models import Node, Link, Start, End, Decision, DecisionEnd, Fork, Join
+from utils import xml_tag
 
 LOG = logging.getLogger(__name__)
 
+OOZIE_NAMESPACES = ['uri:oozie:workflow:0.1', 'uri:oozie:workflow:0.2', 'uri:oozie:workflow:0.3', 'uri:oozie:workflow:0.4']
+
 LINKS = ('ok', 'error', 'path')
+
 def _save_links(workflow, root):
   """
   Iterates over all links in the passed XML doc and creates links.
@@ -82,7 +86,7 @@ def _save_links(workflow, root):
     # Iterate over node members
     # Join nodes have attributes which point to the next node
     # Start node has attribute which points to first node
-    parent = Node.objects.get(workflow=workflow, name=node.attrib.get('name', node.tag)).get_full_node()
+    parent = Node.objects.get(workflow=workflow, name=node.attrib.get('name', xml_tag(node))).get_full_node()
 
     if isinstance(parent, Start):
       workflow.start = parent
@@ -103,7 +107,7 @@ def _save_links(workflow, root):
           to = case.attrib['to']
           child = Node.objects.get(workflow=workflow, name=to)
 
-          if case.tag == 'default':
+          if xml_tag(case) == 'default':
             name = 'default'
             obj = Link.objects.create(name=name, parent=parent, child=child)
 
@@ -117,9 +121,9 @@ def _save_links(workflow, root):
     else:
       for el in node:
         # Links
-        if el.tag in LINKS:
-          name = el.tag
-          if el.tag == 'path':
+        name = xml_tag(el)
+        if name in LINKS:
+          if name == 'path':
             to = el.attrib['start']
             name = 'start'
           else:
@@ -344,18 +348,27 @@ def _save_nodes(workflow, root):
       full_node.save()
 
 
-def import_workflow(workflow, workflow_definition, schema_version=0.4):
-  xslt_definition_fh = open("%(xslt_dir)s/%(schema_version)s/workflow.xslt" % {
-    'xslt_dir': DEFINITION_XSLT_DIR.get(),
-    'schema_version': schema_version
+def import_workflow(workflow, workflow_definition):
+  xslt_definition_fh = open("%(xslt_dir)s/workflow.xslt" % {
+    'xslt_dir': DEFINITION_XSLT_DIR.get()
   })
 
-  # Remove namespace from definition
-  workflow_definition = re.sub(r'\s*xmlns=".*?"', '', workflow_definition, count=1)
-
   # Parse Workflow Definition
   xml = etree.fromstring(workflow_definition)
 
+  if xml is None:
+    raise PopupException(_("Could not find any nodes in Workflow definition. Maybe it's malformed?"))
+
+  ns = xml.tag[:-12] # Remove workflow-app from tag in order to get proper namespace prefix
+  schema_version = ns and ns[1:-1] or None
+
+  # Ensure namespace exists
+  if schema_version not in OOZIE_NAMESPACES:
+    raise PopupException(_("Tag with namespace %(namespace)s is not a valid. Please use one of the following namespaces: %(namespaces)s") % {
+      'namespace': xml.tag,
+      'namespaces': ', '.join(OOZIE_NAMESPACES)
+    })
+
   # Get XSLT
   xslt = etree.parse(xslt_definition_fh)
   xslt_definition_fh.close()
@@ -369,5 +382,5 @@ def import_workflow(workflow, workflow_definition, schema_version=0.4):
   _save_links(workflow, xml)
 
   # Update schema_version
-  workflow.schema_version = "uri:oozie:workflow:%s" % schema_version
+  workflow.schema_version = schema_version
   workflow.save()

+ 1 - 1
apps/oozie/src/oozie/templates/editor/import_workflow.mako

@@ -30,7 +30,7 @@ ${ layout.menubar(section='workflows') }
   <h1>${ _('Import Workflow') }</h1>
 
     <div class="well">
-      <div class="alert alert-info"><h3>${_('Import an Oozie workflow')}</h3>${_("You can import an external Oozie workflow by providing the workflow definition file.")}</div>
+      <p>${_("You can import an external Oozie workflow by providing the workflow definition file.")}</p>
     </div>
 
     <div style="min-height:300px">

+ 4 - 0
apps/oozie/src/oozie/test_data/0.4/test-basic-namespace-missing.xml

@@ -0,0 +1,4 @@
+<workflow-app name="test-workflow">
+    <start to="done"/>
+    <end name="done"/>
+</workflow-app>

+ 3 - 3
apps/oozie/src/oozie/test_data/0.4/test-basic.xml

@@ -1,4 +1,4 @@
-<workflow-app name="test-workflow">
-<start to="done"/>
-<end name="done"/>
+<workflow-app name="test-workflow" xmlns="uri:oozie:workflow:0.4">
+    <start to="done"/>
+    <end name="done"/>
 </workflow-app>

+ 26 - 10
apps/oozie/src/oozie/tests.py

@@ -24,11 +24,12 @@ import re
 import os
 
 from nose.plugins.skip import SkipTest
-from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal
+from nose.tools import raises, assert_true, assert_false, assert_equal, assert_not_equal
 from django.contrib.auth.models import User
 from django.core.urlresolvers import reverse
 
 from desktop.lib.django_test_util import make_logged_in_client
+from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.test_utils import grant_access, add_permission
 from jobsub.management.commands import jobsub_setup
 from jobsub.models import OozieDesign
@@ -1086,6 +1087,21 @@ class TestEditor(OozieMockBase):
     assert_true('checked: capture_output' in response.content, response.content)
 
 
+  @raises(PopupException)
+  def test_import_workflow_namespace_error(self):
+    """
+    Validates import for most basic workflow: start and end.
+    """
+    workflow = Workflow.objects.new_workflow(self.user)
+    workflow.save()
+    f = open('apps/oozie/src/oozie/test_data/0.4/test-basic-namespace-missing.xml')
+    contents = f.read()
+    f.close()
+
+    # Should throw PopupException
+    import_workflow(workflow, contents)
+
+
   def test_import_workflow_basic(self):
     """
     Validates import for most basic workflow: start and end.
@@ -1093,7 +1109,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-basic.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(2, len(Node.objects.filter(workflow=workflow)))
@@ -1109,7 +1125,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-decision.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(12, len(Node.objects.filter(workflow=workflow)))
@@ -1125,7 +1141,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-decision-complex.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(14, len(Node.objects.filter(workflow=workflow)))
@@ -1144,7 +1160,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-distcp.0.1.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(4, len(Node.objects.filter(workflow=workflow)))
@@ -1157,7 +1173,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-forks.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(12, len(Node.objects.filter(workflow=workflow)))
@@ -1175,7 +1191,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-mapreduce.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(4, len(Node.objects.filter(workflow=workflow)))
@@ -1191,7 +1207,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-pig.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     node = Node.objects.get(workflow=workflow, node_type='pig').get_full_node()
@@ -1209,7 +1225,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-sqoop.0.2.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(4, len(Node.objects.filter(workflow=workflow)))
@@ -1227,7 +1243,7 @@ class TestEditor(OozieMockBase):
     workflow = Workflow.objects.new_workflow(self.user)
     workflow.save()
     f = open('apps/oozie/src/oozie/test_data/0.4/test-java.xml')
-    import_workflow(workflow, f.read(), schema_version=0.4)
+    import_workflow(workflow, f.read())
     f.close()
     workflow.save()
     assert_equal(5, len(Node.objects.filter(workflow=workflow)))

+ 5 - 0
apps/oozie/src/oozie/utils.py

@@ -16,6 +16,7 @@
 # limitations under the License.
 
 import logging
+import re
 
 from django.utils.translation import ugettext as _
 
@@ -63,3 +64,7 @@ def smart_path(path):
     path = '%(nameNode)s%(path)s' % {'nameNode': '${nameNode}', 'path': path}
 
   return path
+
+
+def xml_tag(element):
+  return re.sub(r'^\{.+\}', '', element.tag)

+ 1 - 2
apps/oozie/src/oozie/views/editor.py

@@ -124,10 +124,9 @@ def import_workflow(request):
       workflow.save()
 
       workflow_definition = workflow_form.cleaned_data['definition_file'].read()
-      schema_version = workflow_form.cleaned_data['schema_version']
 
       try:
-        _import_workflow(workflow=workflow, workflow_definition=workflow_definition, schema_version=schema_version)
+        _import_workflow(workflow=workflow, workflow_definition=workflow_definition)
         request.info(_('Workflow imported'))
         return redirect(reverse('oozie:edit_workflow', kwargs={'workflow': workflow.id}))
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/action.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="extensions/distcp.0.1.xslt"/>
 <xsl:import href="extensions/hive.0.1.xslt"/>
@@ -14,7 +14,7 @@
 <xsl:import href="nodes/pig.xslt"/>
 <xsl:import href="nodes/streaming.xslt"/>
 
-<xsl:template match="action">
+<xsl:template match="workflow:action" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.node" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/control.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="nodes/decision.xslt"/>
 <xsl:import href="nodes/end.xslt"/>
@@ -9,7 +9,7 @@
 <xsl:import href="nodes/kill.xslt"/>
 <xsl:import href="nodes/start.xslt"/>
 
-<xsl:template match="start | end | decision | fork | join | kill">
+<xsl:template match="workflow:start | workflow:end | workflow:decision | workflow:fork | workflow:join | workflow:kill">
 
   <object model="oozie.node" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/distcp.0.1.xslt

@@ -1,13 +1,13 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" xmlns:distcp="uri:oozie:distcp-action:0.1" exclude-result-prefixes="workflow distcp">
 
 <xsl:import href="../nodes/fields/job_properties.xslt"/>
 <xsl:import href="../nodes/fields/job_xml.xslt"/>
 <xsl:import href="../nodes/fields/params.xslt"/>
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 
-<xsl:template match="distcp:distcp" xmlns:distcp="uri:oozie:distcp-action:0.1">
+<xsl:template match="distcp:distcp">
 
   <object model="oozie.distcp" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" xmlns:hive="uri:oozie:hive-action:0.1" exclude-result-prefixes="workflow hive">
 
 <xsl:import href="../nodes/fields/archives.xslt"/>
 <xsl:import href="../nodes/fields/files.xslt"/>
@@ -10,7 +10,7 @@
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 <xsl:import href="../nodes/fields/script_path.xslt"/>
 
-<xsl:template match="hive:hive" xmlns:hive="uri:oozie:hive-action:0.1">
+<xsl:template match="hive:hive">
 
   <object model="oozie.hive" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/hive.0.2.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" xmlns:hive="uri:oozie:hive-action:0.2" exclude-result-prefixes="workflow hive">
 
 <xsl:import href="../nodes/fields/archives.xslt"/>
 <xsl:import href="../nodes/fields/files.xslt"/>
@@ -10,7 +10,7 @@
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 <xsl:import href="../nodes/fields/script_path.xslt"/>
 
-<xsl:template match="hive:hive" xmlns:hive="uri:oozie:hive-action:0.2">
+<xsl:template match="hive:hive">
 
   <object model="oozie.hive" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/shell.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" xmlns:shell="uri:oozie:shell-action:0.1" exclude-result-prefixes="workflow shell">
 
 <xsl:import href="../nodes/fields/archives.xslt"/>
 <xsl:import href="../nodes/fields/capture_output.xslt"/>
@@ -11,7 +11,7 @@
 <xsl:import href="../nodes/fields/params.xslt"/>
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 
-<xsl:template match="shell:shell" xmlns:shell="uri:oozie:shell-action:0.1">
+<xsl:template match="shell:shell">
 
   <object model="oozie.shell" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" xmlns:sqoop="uri:oozie:sqoop-action:0.1" exclude-result-prefixes="workflow sqoop">
 
 <xsl:import href="../nodes/fields/archives.xslt"/>
 <xsl:import href="../nodes/fields/files.xslt"/>
@@ -10,7 +10,7 @@
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 <xsl:import href="../nodes/fields/script_path.xslt"/>
 
-<xsl:template match="sqoop:sqoop" xmlns:sqoop="uri:oozie:sqoop-action:0.1">
+<xsl:template match="sqoop:sqoop">
 
   <object model="oozie.sqoop" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/sqoop.0.2.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" xmlns:sqoop="uri:oozie:sqoop-action:0.2" exclude-result-prefixes="workflow sqoop">
 
 <xsl:import href="../nodes/fields/archives.xslt"/>
 <xsl:import href="../nodes/fields/files.xslt"/>
@@ -9,7 +9,7 @@
 <xsl:import href="../nodes/fields/params.xslt"/>
 <xsl:import href="../nodes/fields/prepares.xslt"/>
 
-<xsl:template match="sqoop:sqoop" xmlns:sqoop="uri:oozie:sqoop-action:0.2">
+<xsl:template match="sqoop:sqoop">
 
   <object model="oozie.sqoop" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/extensions/ssh.0.1.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" xmlns:ssh="uri:oozie:ssh-action:0.1" exclude-result-prefixes="workflow ssh">
 
 <xsl:import href="../nodes/fields/capture_output.xslt"/>
 <xsl:import href="../nodes/fields/command.xslt"/>
@@ -8,7 +8,7 @@
 <xsl:import href="../nodes/fields/params.xslt"/>
 <xsl:import href="../nodes/fields/user.xslt"/>
 
-<xsl:template match="ssh:ssh" xmlns:ssh="uri:oozie:ssh-action:0.1">
+<xsl:template match="ssh:ssh">
 
   <object model="oozie.ssh" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/decision.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
-<xsl:template match="decision">
+<xsl:template match="workflow:decision" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.decision" pk="0">
   </object>

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/end.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
-<xsl:template match="end">
+<xsl:template match="workflow:end" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.end" pk="0">
   </object>

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/archives.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="archives">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/args.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="args">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/arguments.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="arguments">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/capture_output.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="capture_output">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/command.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="command">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/files.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="files">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/host.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="host">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/jar_path.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="jar_path">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/java_opts.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="java_opts">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_properties.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="job_properties">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/job_xml.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="job_xml">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/main_class.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="main_class">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/mapper.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="mapper">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/params.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="params">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/prepares.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="prepares">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/reducer.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="reducer">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/script_path.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="script_path">
 

+ 1 - 1
apps/oozie/src/oozie/xslt/0.4/nodes/fields/user.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:template name="user">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/fork.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
-<xsl:template match="fork">
+<xsl:template match="workflow:fork" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.fork" pk="0">
   </object>

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/java.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/args.xslt"/>
@@ -12,7 +12,7 @@
 <xsl:import href="fields/main_class.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
 
-<xsl:template match="java">
+<xsl:template match="workflow:java" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.java" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/join.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
-<xsl:template match="join">
+<xsl:template match="workflow:join" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.join" pk="0">
   </object>

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/kill.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
-<xsl:template match="kill">
+<xsl:template match="workflow:kill" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.kill" pk="0">
   </object>

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/mapreduce.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/files.xslt"/>
@@ -9,7 +9,7 @@
 <xsl:import href="fields/job_xml.xslt"/>
 <xsl:import href="fields/prepares.xslt"/>
 
-<xsl:template match="map-reduce">
+<xsl:template match="workflow:map-reduce" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.mapreduce" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/pig.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/arguments.xslt"/>
@@ -10,7 +10,7 @@
 <xsl:import href="fields/prepares.xslt"/>
 <xsl:import href="fields/script_path.xslt"/>
 
-<xsl:template match="pig">
+<xsl:template match="workflow:pig" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.pig" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/start.xslt

@@ -1,8 +1,8 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
-<xsl:template match="start">
+<xsl:template match="workflow:start">
 
   <object model="oozie.start" pk="0">
 

+ 2 - 2
apps/oozie/src/oozie/xslt/0.4/nodes/streaming.xslt

@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:import href="fields/archives.xslt"/>
 <xsl:import href="fields/files.xslt"/>
@@ -8,7 +8,7 @@
 <xsl:import href="fields/mapper.xslt"/>
 <xsl:import href="fields/reducer.xslt"/>
 
-<xsl:template match="streaming">
+<xsl:template match="workflow:streaming" xmlns:workflow="uri:oozie:workflow:0.4">
 
   <object model="oozie.streaming" pk="0">
 

+ 4 - 4
apps/oozie/src/oozie/xslt/0.4/workflow.xslt

@@ -1,16 +1,16 @@
 <?xml version="1.0"?>
 
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
 
 <xsl:include href="action.xslt"/>
 <xsl:include href="control.xslt"/>
 
-<xsl:template match="/workflow-app">
+<xsl:template match="/workflow:workflow-app">
 
   <django-objects version="1.0">
 
-    <xsl:apply-templates select="action"/>
-    <xsl:apply-templates select="start | end | decision | fork | join | kill"/>
+    <xsl:apply-templates select="workflow:action"/>
+    <xsl:apply-templates select="workflow:start | workflow:end | workflow:decision | workflow:fork | workflow:join | workflow:kill"/>
 
   </django-objects>
 

+ 14 - 0
apps/oozie/src/oozie/xslt/workflow.xslt

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:workflow="uri:oozie:workflow:0.4" exclude-result-prefixes="workflow">
+
+<xsl:include href="0.4/workflow.xslt"/>
+
+<xsl:template match="/">
+
+    <xsl:apply-templates select="*"/>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>