Bladeren bron

HUE-1096 [core] Workflow examples conflicts with existing workflows

Move things around and create bundles and coordinators import lib
Abraham Elmahrek 12 jaren geleden
bovenliggende
commit
c1ca50e
100 gewijzigde bestanden met toevoegingen van 760 en 51 verwijderingen
  1. 1 1
      apps/jobsub/src/jobsub/migrations/0005_unify_with_oozie.py
  2. BIN
      apps/oozie/examples/bundles/aggregate/bundle.zip
  3. BIN
      apps/oozie/examples/coordinators/dailyanalytics/coordinator.zip
  4. BIN
      apps/oozie/examples/coordinators/dailysleep/coordinator.zip
  5. 0 0
      apps/oozie/examples/managed/distcp/empty
  6. BIN
      apps/oozie/examples/managed/distcp/workflow.zip
  7. 0 0
      apps/oozie/examples/managed/email/empty
  8. BIN
      apps/oozie/examples/managed/email/workflow.zip
  9. 0 0
      apps/oozie/examples/managed/fs/empty
  10. BIN
      apps/oozie/examples/managed/fs/workflow.zip
  11. 0 0
      apps/oozie/examples/managed/generic/empty
  12. BIN
      apps/oozie/examples/managed/generic/workflow.zip
  13. BIN
      apps/oozie/examples/managed/hive/workflow.zip
  14. BIN
      apps/oozie/examples/managed/pig/workflow.zip
  15. BIN
      apps/oozie/examples/managed/shell/workflow.zip
  16. 0 0
      apps/oozie/examples/managed/sleep/empty
  17. BIN
      apps/oozie/examples/managed/sleep/workflow.zip
  18. 0 0
      apps/oozie/examples/managed/sleepfork/empty
  19. BIN
      apps/oozie/examples/managed/sleepfork/workflow.zip
  20. BIN
      apps/oozie/examples/managed/sqoop/workflow.zip
  21. 0 0
      apps/oozie/examples/managed/ssh/empty
  22. BIN
      apps/oozie/examples/managed/ssh/workflow.zip
  23. 0 0
      apps/oozie/examples/managed/terasort/empty
  24. BIN
      apps/oozie/examples/managed/terasort/workflow.zip
  25. 0 0
      apps/oozie/examples/unmanaged/distcp/empty
  26. BIN
      apps/oozie/examples/unmanaged/distcp/workflow.zip
  27. 0 0
      apps/oozie/examples/unmanaged/email/empty
  28. BIN
      apps/oozie/examples/unmanaged/email/workflow.zip
  29. 0 0
      apps/oozie/examples/unmanaged/fs/empty
  30. BIN
      apps/oozie/examples/unmanaged/fs/workflow.zip
  31. BIN
      apps/oozie/examples/unmanaged/hive/workflow.zip
  32. BIN
      apps/oozie/examples/unmanaged/pig/workflow.zip
  33. BIN
      apps/oozie/examples/unmanaged/shell/workflow.zip
  34. 0 0
      apps/oozie/examples/unmanaged/sleep/empty
  35. BIN
      apps/oozie/examples/unmanaged/sleep/workflow.zip
  36. BIN
      apps/oozie/examples/unmanaged/sqoop/workflow.zip
  37. 0 0
      apps/oozie/examples/unmanaged/ssh/empty
  38. BIN
      apps/oozie/examples/unmanaged/ssh/workflow.zip
  39. 1 1
      apps/oozie/src/oozie/conf.py
  40. 0 0
      apps/oozie/src/oozie/importlib/__init__.py
  41. 127 0
      apps/oozie/src/oozie/importlib/bundles.py
  42. 194 0
      apps/oozie/src/oozie/importlib/coordinators.py
  43. 0 0
      apps/oozie/src/oozie/importlib/jobdesigner.py
  44. 0 0
      apps/oozie/src/oozie/importlib/utils.py
  45. 80 49
      apps/oozie/src/oozie/importlib/workflows.py
  46. 22 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/coordinator.xslt
  47. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/datainput.xslt
  48. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/dataoutput.xslt
  49. 27 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/dataset.xslt
  50. 22 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/coordinator.xslt
  51. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/datainput.xslt
  52. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/dataoutput.xslt
  53. 27 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/dataset.xslt
  54. 22 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/coordinator.xslt
  55. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/datainput.xslt
  56. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/dataoutput.xslt
  57. 27 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/dataset.xslt
  58. 22 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/coordinator.xslt
  59. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/datainput.xslt
  60. 18 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/dataoutput.xslt
  61. 27 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/dataset.xslt
  62. 17 0
      apps/oozie/src/oozie/importlib/xslt/coordinators/coordinator.xslt
  63. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/action.xslt
  64. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/control.xslt
  65. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/distcp.0.1.xslt
  66. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/email.0.1.xslt
  67. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/hive.0.1.xslt
  68. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/hive.0.2.xslt
  69. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/shell.0.1.xslt
  70. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/sqoop.0.1.xslt
  71. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/sqoop.0.2.xslt
  72. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/decision.xslt
  73. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/end.xslt
  74. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/archives.xslt
  75. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/arg_params.xslt
  76. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/args.xslt
  77. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/arguments.xslt
  78. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/capture_output.xslt
  79. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/chmods.xslt
  80. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/command.xslt
  81. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/deletes.xslt
  82. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/files.xslt
  83. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/host.xslt
  84. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/jar_path.xslt
  85. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/java_opts.xslt
  86. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/job_properties.xslt
  87. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/job_xml.xslt
  88. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/main_class.xslt
  89. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/mapper.xslt
  90. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/mkdirs.xslt
  91. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/moves.xslt
  92. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/params.xslt
  93. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/prepares.xslt
  94. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/propagate_configuration.xslt
  95. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/reducer.xslt
  96. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/script_path.xslt
  97. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/touchzs.xslt
  98. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/user.xslt
  99. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/xml.xslt
  100. 0 0
      apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fork.xslt

+ 1 - 1
apps/jobsub/src/jobsub/migrations/0005_unify_with_oozie.py

@@ -5,7 +5,7 @@ from django.utils.translation import ugettext as _
 from south.db import db
 from south.v2 import DataMigration
 from django.db import models
-from oozie.import_jobsub import convert_jobsub_design
+from oozie.importlib.jobdesigner import convert_jobsub_design
 from oozie.models import Workflow, Kill, Start, End
 
 

BIN
apps/oozie/examples/bundles/aggregate/bundle.zip


BIN
apps/oozie/examples/coordinators/dailyanalytics/coordinator.zip


BIN
apps/oozie/examples/coordinators/dailysleep/coordinator.zip


+ 0 - 0
apps/oozie/examples/managed/distcp/empty


BIN
apps/oozie/examples/managed/distcp/workflow.zip


+ 0 - 0
apps/oozie/examples/managed/email/empty


BIN
apps/oozie/examples/managed/email/workflow.zip


+ 0 - 0
apps/oozie/examples/managed/fs/empty


BIN
apps/oozie/examples/managed/fs/workflow.zip


+ 0 - 0
apps/oozie/examples/managed/generic/empty


BIN
apps/oozie/examples/managed/generic/workflow.zip


BIN
apps/oozie/examples/managed/hive/workflow.zip


BIN
apps/oozie/examples/managed/pig/workflow.zip


BIN
apps/oozie/examples/managed/shell/workflow.zip


+ 0 - 0
apps/oozie/examples/managed/sleep/empty


BIN
apps/oozie/examples/managed/sleep/workflow.zip


+ 0 - 0
apps/oozie/examples/managed/sleepfork/empty


BIN
apps/oozie/examples/managed/sleepfork/workflow.zip


BIN
apps/oozie/examples/managed/sqoop/workflow.zip


+ 0 - 0
apps/oozie/examples/managed/ssh/empty


BIN
apps/oozie/examples/managed/ssh/workflow.zip


+ 0 - 0
apps/oozie/examples/managed/terasort/empty


BIN
apps/oozie/examples/managed/terasort/workflow.zip


+ 0 - 0
apps/oozie/examples/unmanaged/distcp/empty


BIN
apps/oozie/examples/unmanaged/distcp/workflow.zip


+ 0 - 0
apps/oozie/examples/unmanaged/email/empty


BIN
apps/oozie/examples/unmanaged/email/workflow.zip


+ 0 - 0
apps/oozie/examples/unmanaged/fs/empty


BIN
apps/oozie/examples/unmanaged/fs/workflow.zip


BIN
apps/oozie/examples/unmanaged/hive/workflow.zip


BIN
apps/oozie/examples/unmanaged/pig/workflow.zip


BIN
apps/oozie/examples/unmanaged/shell/workflow.zip


+ 0 - 0
apps/oozie/examples/unmanaged/sleep/empty


BIN
apps/oozie/examples/unmanaged/sleep/workflow.zip


BIN
apps/oozie/examples/unmanaged/sqoop/workflow.zip


+ 0 - 0
apps/oozie/examples/unmanaged/ssh/empty


BIN
apps/oozie/examples/unmanaged/ssh/workflow.zip


+ 1 - 1
apps/oozie/src/oozie/conf.py

@@ -28,7 +28,7 @@ from oozie.settings import NICE_NAME
 
 DEFINITION_XSLT_DIR = Config(
   key="definition_xslt_dir",
-  default=os.path.join(os.path.dirname(__file__), "xslt"),
+  default=os.path.join(os.path.dirname(__file__), "importlib", "xslt"),
   help=_t("Location on local FS where the xslt files are stored for workflow import."),
   private=True)
 

+ 0 - 0
apps/oozie/examples/bundles/aggregate/empty → apps/oozie/src/oozie/importlib/__init__.py


+ 127 - 0
apps/oozie/src/oozie/importlib/bundles.py

@@ -0,0 +1,127 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import logging
+from lxml import etree
+
+from django.utils.translation import ugettext as _
+
+from oozie.models import Coordinator, BundledCoordinator
+from oozie.utils import oozie_to_django_datetime
+
+
+LOG = logging.getLogger(__name__)
+
+OOZIE_NAMESPACES = ['uri:oozie:bundle:0.1', 'uri:oozie:bundle:0.2']
+
+
+def _set_bundle_properties(bundle, root, namespace):
+  """
+  Get bundle properties from bundle XML
+
+  Set properties on ``bundle`` with attributes from XML etree ``root``.
+  """
+  bundle.name = root.get('name')
+
+
+def _set_controls(bundle, root, namespace):
+  """
+  Get controls from bundle XML
+
+  Set properties on ``bundle`` with controls from XML etree ``root``.
+  """
+  namespaces = {
+    'n': namespace
+  }
+  controls = root.xpath('n:controls', namespaces=namespaces)[0]
+  kick_off_time = controls.xpath('n:kick-off-time', namespaces=namespaces)
+  if kick_off_time:
+    bundle.kick_off_time = oozie_to_django_datetime(kick_off_time[0].text)
+
+
+def _reconcile_coordinators(bundle, root, namespace):
+  namespaces = {
+    'n': namespace
+  }
+  bundle.save()
+
+  for coordinator_el in root.xpath('n:coordinator', namespaces=namespaces):
+    try:
+      coordinator = Coordinator.objects.get(name=coordinator_el.get('name'), owner=bundle.owner)
+      bundled_coordinator = BundledCoordinator.objects.create(bundle=bundle, coordinator=coordinator, parameters='[]')
+      _set_parameters(bundled_coordinator, root, namespace)
+      bundled_coordinator.save()
+    except Coordinator.DoesNotExist:
+      raise
+
+
+def _set_parameters(bundled_coordinator, coordinator_el, namespace):
+  namespaces = {
+    'n': namespace
+  }
+  properties = []
+  props = coordinator_el.xpath('n:configuration/property', namespaces=namespaces)
+  for prop in props:
+    name = prop.xpath('n:name', namespaces=namespaces)[0]
+    value = prop.xpath('n:value', namespaces=namespaces)[0]
+    properties.append({'name': name, 'value': value})
+  bundled_coordinator.parameters = json.dumps(properties)
+
+
+def _process_metadata(bundle, metadata):
+  # Job attributes
+  attributes = metadata.setdefault('attributes', {})
+  bundle.description = attributes.setdefault('description', bundle.description)
+  bundle.deployment_dir = attributes.setdefault('deployment_dir', bundle.deployment_dir)
+
+
+def import_bundle_root(bundle, bundle_definition_root, metadata=None):
+  try:
+    tag = etree.QName(bundle_definition_root.tag)
+    schema_version = tag.namespace
+
+    # Ensure namespace exists
+    if schema_version not in OOZIE_NAMESPACES:
+      raise RuntimeError(_("Tag with namespace %(namespace)s is not valid. Please use one of the following namespaces: %(namespaces)s") % {
+        'namespace': bundle_definition_root.tag,
+        'namespaces': ', '.join(OOZIE_NAMESPACES)
+      })
+
+    # Resolve bundle dependencies and node types and link dependencies
+    _set_bundle_properties(bundle, bundle_definition_root, schema_version)
+    _set_controls(bundle, bundle_definition_root, schema_version)
+    _reconcile_coordinators(bundle, bundle_definition_root, schema_version)
+    if metadata:
+      _process_metadata(bundle, metadata)
+
+    # Update schema_version
+    bundle.schema_version = schema_version
+    bundle.save()
+  except:
+    # There was an error importing the bundle so delete every thing associated with it.
+    bundle.delete()
+    raise
+
+
+def import_bundle(bundle, bundle_definition, metadata=None):
+  # Parse Bundle Definition
+  bundle_definition_root = etree.fromstring(bundle_definition)
+  if bundle_definition_root is None:
+    raise RuntimeError(_("Could not find any nodes in Bundle definition. Maybe it's malformed?"))
+
+  return import_bundle_root(bundle, bundle_definition_root, metadata)

+ 194 - 0
apps/oozie/src/oozie/importlib/coordinators.py

@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import json
+import logging
+import os
+from lxml import etree
+
+from django.core import serializers
+from django.utils.translation import ugettext as _
+
+from oozie import conf
+from oozie.models import Workflow, Dataset, DataInput, DataOutput
+from oozie.utils import oozie_to_django_datetime, oozie_to_hue_frequency
+
+
+LOG = logging.getLogger(__name__)
+
+OOZIE_NAMESPACES = ['uri:oozie:coordinator:0.1', 'uri:oozie:coordinator:0.2', 'uri:oozie:coordinator:0.3', 'uri:oozie:coordinator:0.4']
+
+
+def _set_coordinator_properties(coordinator, root, namespace):
+  """
+  Get coordinator properties from coordinator XML
+
+  Set properties on ``coordinator`` with attributes from XML etree ``root``.
+  """
+  coordinator.name = root.get('name')
+  coordinator.timezone = root.get('timezone')
+  coordinator.start = oozie_to_django_datetime(root.get('start'))
+  coordinator.end = oozie_to_django_datetime(root.get('end'))
+  coordinator.frequency_unit, coordinator.frequency_number = oozie_to_hue_frequency(root.get('frequency'))
+
+
+def _set_controls(coordinator, root, namespace):
+  """
+  Get controls from coordinator XML
+
+  Set properties on ``coordinator`` with controls from XML etree ``root``.
+  """
+  namespaces = {
+    'n': namespace
+  }
+  controls_list = root.xpath('n:controls', namespaces=namespaces)
+  if controls_list:
+    controls = controls_list[0]
+    concurrency = controls.xpath('n:concurrency', namespaces=namespaces)
+    timeout = controls.xpath('n:timeout', namespaces=namespaces)
+    execution = controls.xpath('n:execution', namespaces=namespaces)
+    throttle = controls.xpath('n:throttle', namespaces=namespaces)
+    if concurrency:
+      coordinator.concurrency = concurrency[0].text
+    if timeout:
+      coordinator.timeout = timeout[0].text
+    if execution:
+      coordinator.execution = execution[0].text
+    if throttle:
+      coordinator.throttle = throttle[0].text
+
+
+def _reconcile_datasets(coordinator, objects, root, namespace):
+  """
+  Reconcile datasets, datainputs, and dataoutputs.
+  datasets and tied to datainputs and dataoutputs.
+  Other dataset properties are set from XML tree.
+
+  ``coordinator`` is used for look ups and creating relevant objects.
+  ``objects`` should be transformed from XSLTs and loaded via django deserializers.
+  ``root`` is the element root of the coordinator (lxml).
+  ``namespace`` defines the XML coordinator namespace and schema version.
+  """
+  namespaces = {
+    'n': namespace
+  }
+  datasets = {}
+  datainputs = []
+  dataoutputs = []
+  coordinator.save()
+  for obj in objects:
+    obj.object.coordinator = coordinator
+    if isinstance(obj.object, Dataset):
+      dataset_elements = root.xpath('//n:dataset[@name="%s"]' % obj.object.name, namespaces=namespaces)
+      for dataset_element in dataset_elements:
+        obj.object.start = oozie_to_django_datetime(dataset_element.get('initial-instance'))
+      obj.object.save()
+      datasets[obj.object.name] = obj.object
+    elif isinstance(obj.object, DataInput):
+      datainputs.append(obj.object)
+    elif isinstance(obj.object, DataOutput):
+      dataoutputs.append(obj.object)
+  for datainput in datainputs:
+    datainput_elements = root.xpath('//n:data-in[@name="%s"]' % datainput.name, namespaces=namespaces)
+    for datainput_element in datainput_elements:
+      datainput.dataset = datasets[datainput_element.get('dataset')]
+    datainput.save()
+  for dataoutput in dataoutputs:
+    dataoutput_elements = root.xpath('//n:data-out[@name="%s"]' % dataoutput.name, namespaces=namespaces)
+    for dataoutput_element in dataoutput_elements:
+      dataoutput.dataset = datasets[dataoutput_element.get('dataset')]
+    dataoutput.save()
+  # @TODO(abe): reconcile instance times
+
+def _set_properties(coordinator, root, namespace):
+  namespaces = {
+    'n': namespace
+  }
+  properties = []
+  props = root.xpath('n:action/n:workflow/n:configuration/n:property', namespaces=namespaces)
+  seen = {}
+  for prop in props:
+    name = prop.xpath('n:name', namespaces=namespaces)[0].text
+    value = prop.xpath('n:value', namespaces=namespaces)[0].text
+    if name not in seen:
+      properties.append({'name': name, 'value': value})
+      seen[name] = True
+  coordinator.job_properties = json.dumps(properties)
+
+
+def _process_metadata(coordinator, metadata):
+  # Job attributes
+  attributes = metadata.setdefault('attributes', {})
+  coordinator.description = attributes.setdefault('description', coordinator.description)
+  coordinator.deployment_dir = attributes.setdefault('deployment_dir', coordinator.deployment_dir)
+
+  try:
+    # @TODO(abe): Handle managed and unmanaged cases.
+    coordinator.workflow = Workflow.objects.get(name=metadata['workflow'], owner=coordinator.owner, managed=True)
+  except Workflow.DoesNotExist:
+    raise
+
+
+def import_coordinator_root(coordinator, coordinator_definition_root, metadata=None):
+  try:
+    xslt_definition_fh = open("%(xslt_dir)s/coordinator.xslt" % {
+      'xslt_dir': os.path.join(conf.DEFINITION_XSLT_DIR.get(), 'coordinators')
+    })
+
+    tag = etree.QName(coordinator_definition_root.tag)
+    schema_version = tag.namespace
+
+    # Ensure namespace exists
+    if schema_version not in OOZIE_NAMESPACES:
+      raise RuntimeError(_("Tag with namespace %(namespace)s is not valid. Please use one of the following namespaces: %(namespaces)s") % {
+        'namespace': coordinator_definition_root.tag,
+        'namespaces': ', '.join(OOZIE_NAMESPACES)
+      })
+
+    # Get XSLT and Transform XML
+    xslt = etree.parse(xslt_definition_fh)
+    xslt_definition_fh.close()
+    transform = etree.XSLT(xslt)
+    transformed_root = transform(coordinator_definition_root)
+
+    # Deserialize XML
+    objects = serializers.deserialize('xml', etree.tostring(transformed_root))
+
+    # Resolve coordinator dependencies and node types and link dependencies
+    _set_coordinator_properties(coordinator, coordinator_definition_root, schema_version)
+    _set_controls(coordinator, coordinator_definition_root, schema_version)
+    _reconcile_datasets(coordinator, objects, coordinator_definition_root, schema_version)
+    _set_properties(coordinator, coordinator_definition_root, schema_version)
+    if metadata:
+      _process_metadata(coordinator, metadata)
+
+    # Update schema_version
+    coordinator.schema_version = schema_version
+    coordinator.save()
+  except:
+    # There was an error importing the coordinator so delete every thing associated with it.
+    coordinator.delete()
+    raise
+
+
+def import_coordinator(coordinator, coordinator_definition, metadata=None):
+  # Parse Coordinator Definition
+  coordinator_definition_root = etree.fromstring(coordinator_definition)
+  if coordinator_definition_root is None:
+    raise RuntimeError(_("Could not find any nodes in Coordinator definition. Maybe it's malformed?"))
+
+  return import_coordinator_root(coordinator, coordinator_definition_root, metadata)

+ 0 - 0
apps/oozie/src/oozie/import_jobsub.py → apps/oozie/src/oozie/importlib/jobdesigner.py


+ 0 - 0
apps/oozie/examples/coordinators/range/empty → apps/oozie/src/oozie/importlib/utils.py


+ 80 - 49
apps/oozie/src/oozie/import_workflow.py → apps/oozie/src/oozie/importlib/workflows.py

@@ -14,7 +14,6 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-from desktop.models import Document
 """
 Import an external workflow by providing an XML definition.
 The workflow definition is imported via the method 'import_workflow'.
@@ -32,23 +31,20 @@ Action extensions are also versioned.
 Every action extension will have its own version via /xslt/<workflow version>/extensions/<name of extensions>.<version>.xslt
 """
 
-try:
-  import json
-except ImportError:
-  import simplejson as json
-
 import logging
 from lxml import etree
+import os
 
 from django.core import serializers
 from django.utils.encoding import smart_str
 from django.utils.translation import ugettext as _
 
-from conf import DEFINITION_XSLT_DIR
-from models import Workflow, Node, Link, Start, End,\
-                   Decision, DecisionEnd, Fork, Join,\
-                   Kill
-from utils import xml_tag
+from desktop.models import Document
+
+from oozie.conf import DEFINITION_XSLT_DIR
+from oozie.models import Workflow, Node, Link, Start, End,\
+                         Decision, DecisionEnd, Fork, Join,\
+                         Kill
 
 LOG = logging.getLogger(__name__)
 
@@ -97,7 +93,7 @@ def _save_links(workflow, root):
     if child_el.tag.endswith('global'):
       continue
 
-    tag = xml_tag(child_el)
+    tag = etree.QName(child_el).localname
     name = child_el.attrib.get('name', tag)
     LOG.debug("Getting node with data - XML TAG: %(tag)s\tLINK NAME: %(node_name)s\tWORKFLOW NAME: %(workflow_name)s" % {
       'tag': smart_str(tag),
@@ -202,7 +198,7 @@ def _decision_relationships(workflow, parent, child_el):
       except Node.DoesNotExist, e:
         raise RuntimeError(_("Node %s has not been defined.") % to)
 
-      if xml_tag(case) == 'default':
+      if etree.QName(case).localname == 'default':
         name = 'default'
         obj = Link.objects.create(name=name, parent=parent, child=child)
 
@@ -226,7 +222,7 @@ def _node_relationships(workflow, parent, child_el):
       continue
 
     # Links
-    name = xml_tag(el)
+    name = etree.QName(el).localname
     if name in LINKS:
       if name == 'path':
         if 'start' not in el.attrib:
@@ -483,9 +479,9 @@ def _preprocess_nodes(workflow, transformed_root, workflow_definition_root, node
       for action_el in workflow_definition_root:
         if 'name' in action_el.attrib and action_el.attrib['name'] == full_node.name:
           for subworkflow_el in action_el:
-            if xml_tag(subworkflow_el) == 'sub-workflow':
+            if etree.QName(subworkflow_el).localname == 'sub-workflow':
               for property_el in subworkflow_el:
-                if xml_tag(property_el) == 'app-path':
+                if etree.QName(property_el).localname == 'app-path':
                   app_path = property_el.text
 
       if app_path is None:
@@ -516,7 +512,7 @@ def _resolve_subworkflow_from_deployment_dir(fs, workflow, app_path):
     f = fs.open('%s/workflow.xml' % app_path)
     root = etree.parse(f)
     f.close()
-    return Workflow.objects.get(name=root.attrib['name'])
+    return Workflow.objects.get(name=root.attrib['name'], owner=workflow.owner, managed=True)
   except IOError:
     pass
   except (KeyError, AttributeError), e:
@@ -548,41 +544,76 @@ def _save_nodes(workflow, nodes):
       node.save()
 
 
-def import_workflow(workflow, workflow_definition, fs=None):
-  xslt_definition_fh = open("%(xslt_dir)s/workflow.xslt" % {
-    'xslt_dir': DEFINITION_XSLT_DIR.get()
-  })
-
-  # Parse Workflow Definition
-  workflow_definition_root = etree.fromstring(workflow_definition)
+def _process_metadata(workflow, metadata):
+  # Job attributes
+  attributes = metadata.setdefault('attributes', {})
+  workflow.description = attributes.setdefault('description', workflow.description)
+  workflow.deployment_dir = attributes.setdefault('deployment_dir', workflow.deployment_dir)
 
-  if workflow_definition_root is None:
-    raise RuntimeError(_("Could not find any nodes in Workflow definition. Maybe it's malformed?"))
+  # Workflow node attributes
+  nodes = metadata.setdefault('nodes', {})
+  for node_name in nodes:
+    try:
+      node = Node.objects.get(name=node_name, workflow=workflow).get_full_node()
+      node_attributes = nodes[node_name].setdefault('attributes', {})
+      for node_attribute in node_attributes:
+        setattr(node, node_attribute, node_attributes[node_attribute])
+      node.save()
+    except Node.DoesNotExist:
+      # @TODO(abe): Log or throw error?
+      raise
+    except AttributeError:
+      # @TODO(abe): Log or throw error?
+      # Here there was an attribute reference in the metadata
+      # for this node that isn't a member of the node.
+      raise
 
-  ns = workflow_definition_root.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 RuntimeError(_("Tag with namespace %(namespace)s is not valid. Please use one of the following namespaces: %(namespaces)s") % {
-      'namespace': workflow_definition_root.tag,
-      'namespaces': ', '.join(OOZIE_NAMESPACES)
+def import_workflow_root(workflow, workflow_definition_root, metadata=None, fs=None):
+  try:
+    xslt_definition_fh = open("%(xslt_dir)s/workflow.xslt" % {
+      'xslt_dir': os.path.join(DEFINITION_XSLT_DIR.get(), 'workflows')
     })
 
-  # Get XSLT
-  xslt = etree.parse(xslt_definition_fh)
-  xslt_definition_fh.close()
-  transform = etree.XSLT(xslt)
-
-  # Transform XML using XSLT
-  transformed_root = transform(workflow_definition_root)
-
-  # Resolve workflow dependencies and node types and link dependencies
-  nodes = _prepare_nodes(workflow, transformed_root)
-  _preprocess_nodes(workflow, transformed_root, workflow_definition_root, nodes, fs)
-  _save_nodes(workflow, nodes)
-  _save_links(workflow, workflow_definition_root)
+    tag = etree.QName(workflow_definition_root.tag)
+    schema_version = tag.namespace
+
+    # Ensure namespace exists
+    if schema_version not in OOZIE_NAMESPACES:
+      raise RuntimeError(_("Tag with namespace %(namespace)s is not valid. Please use one of the following namespaces: %(namespaces)s") % {
+        'namespace': workflow_definition_root.tag,
+        'namespaces': ', '.join(OOZIE_NAMESPACES)
+      })
+
+    # Get XSLT
+    xslt = etree.parse(xslt_definition_fh)
+    xslt_definition_fh.close()
+    transform = etree.XSLT(xslt)
+
+    # Transform XML using XSLT
+    transformed_root = transform(workflow_definition_root)
+
+    # Resolve workflow dependencies and node types and link dependencies
+    nodes = _prepare_nodes(workflow, transformed_root)
+    _preprocess_nodes(workflow, transformed_root, workflow_definition_root, nodes, fs)
+    _save_nodes(workflow, nodes)
+    _save_links(workflow, workflow_definition_root)
+    if metadata:
+      _process_metadata(workflow, metadata)
+
+    # Update workflow attributes
+    workflow.schema_version = schema_version
+    workflow.name = workflow_definition_root.get('name')
+    workflow.save()
+  except:
+    workflow.delete()
+    raise
+
+
+def import_workflow(workflow, workflow_definition, metadata=None, fs=None):
+  # Parse Workflow Definition
+  workflow_definition_root = etree.fromstring(workflow_definition)
+  if workflow_definition_root is None:
+    raise RuntimeError(_("Could not find any nodes in Workflow definition. Maybe it's malformed?"))
 
-  # Update schema_version
-  workflow.schema_version = schema_version
-  workflow.save()
+  return import_workflow_root(workflow, workflow_definition_root, metadata, fs)

+ 22 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/coordinator.xslt

@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.1" exclude-result-prefixes="coordinator">
+
+<xsl:include href="dataset.xslt"/>
+<xsl:include href="datainput.xslt"/>
+<xsl:include href="dataoutput.xslt"/>
+
+<xsl:template match="/coordinator:coordinator-app">
+
+  <django-objects version="1.0">
+
+    <xsl:apply-templates select="coordinator:datasets/coordinator:dataset"/>
+    <xsl:apply-templates select="coordinator:input-events/coordinator:data-in"/>
+    <xsl:apply-templates select="coordinator:output-events/coordinator:data-out"/>
+
+  </django-objects>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/datainput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.1" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-in" xmlns:coordinator="uri:oozie:coordinator:0.1">
+
+  <object model="oozie.datainput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/dataoutput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.1" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-out" xmlns:coordinator="uri:oozie:coordinator:0.1">
+
+  <object model="oozie.dataoutput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 27 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.1/dataset.xslt

@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.1" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:dataset" xmlns:coordinator="uri:oozie:coordinator:0.1">
+
+  <object model="oozie.dataset" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="timezone" type="CharField">
+      <xsl:value-of select="@timezone"/>
+    </field>
+    <field name="uri" type="CharField">
+      <xsl:value-of select="coordinator:uri-template"/>
+    </field>
+    <field name="done_flag" type="CharField">
+      <xsl:value-of select="coordinator:done-flag"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 22 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/coordinator.xslt

@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.2" exclude-result-prefixes="coordinator">
+
+<xsl:include href="dataset.xslt"/>
+<xsl:include href="datainput.xslt"/>
+<xsl:include href="dataoutput.xslt"/>
+
+<xsl:template match="/coordinator:coordinator-app">
+
+  <django-objects version="1.0">
+
+    <xsl:apply-templates select="coordinator:datasets/coordinator:dataset"/>
+    <xsl:apply-templates select="coordinator:input-events/coordinator:data-in"/>
+    <xsl:apply-templates select="coordinator:output-events/coordinator:data-out"/>
+
+  </django-objects>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/datainput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.2" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-in" xmlns:coordinator="uri:oozie:coordinator:0.2">
+
+  <object model="oozie.datainput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/dataoutput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.2" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-out" xmlns:coordinator="uri:oozie:coordinator:0.2">
+
+  <object model="oozie.dataoutput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 27 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.2/dataset.xslt

@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.2" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:dataset" xmlns:coordinator="uri:oozie:coordinator:0.2">
+
+  <object model="oozie.dataset" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="timezone" type="CharField">
+      <xsl:value-of select="@timezone"/>
+    </field>
+    <field name="uri" type="CharField">
+      <xsl:value-of select="coordinator:uri-template"/>
+    </field>
+    <field name="done_flag" type="CharField">
+      <xsl:value-of select="coordinator:done-flag"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 22 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/coordinator.xslt

@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.3" exclude-result-prefixes="coordinator">
+
+<xsl:include href="dataset.xslt"/>
+<xsl:include href="datainput.xslt"/>
+<xsl:include href="dataoutput.xslt"/>
+
+<xsl:template match="/coordinator:coordinator-app">
+
+  <django-objects version="1.0">
+
+    <xsl:apply-templates select="coordinator:datasets/coordinator:dataset"/>
+    <xsl:apply-templates select="coordinator:input-events/coordinator:data-in"/>
+    <xsl:apply-templates select="coordinator:output-events/coordinator:data-out"/>
+
+  </django-objects>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/datainput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.3" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-in" xmlns:coordinator="uri:oozie:coordinator:0.3">
+
+  <object model="oozie.datainput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/dataoutput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.3" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-out" xmlns:coordinator="uri:oozie:coordinator:0.3">
+
+  <object model="oozie.dataoutput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 27 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.3/dataset.xslt

@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.3" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:dataset" xmlns:coordinator="uri:oozie:coordinator:0.3">
+
+  <object model="oozie.dataset" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="timezone" type="CharField">
+      <xsl:value-of select="@timezone"/>
+    </field>
+    <field name="uri" type="CharField">
+      <xsl:value-of select="coordinator:uri-template"/>
+    </field>
+    <field name="done_flag" type="CharField">
+      <xsl:value-of select="coordinator:done-flag"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 22 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/coordinator.xslt

@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.4" exclude-result-prefixes="coordinator">
+
+<xsl:include href="dataset.xslt"/>
+<xsl:include href="datainput.xslt"/>
+<xsl:include href="dataoutput.xslt"/>
+
+<xsl:template match="/coordinator:coordinator-app">
+
+  <django-objects version="1.0">
+
+    <xsl:apply-templates select="coordinator:datasets/coordinator:dataset"/>
+    <xsl:apply-templates select="coordinator:input-events/coordinator:data-in"/>
+    <xsl:apply-templates select="coordinator:output-events/coordinator:data-out"/>
+
+  </django-objects>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/datainput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.4" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-in" xmlns:coordinator="uri:oozie:coordinator:0.4">
+
+  <object model="oozie.datainput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 18 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/dataoutput.xslt

@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.4" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:data-out" xmlns:coordinator="uri:oozie:coordinator:0.4">
+
+  <object model="oozie.dataoutput" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 27 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/0.4/dataset.xslt

@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:coordinator="uri:oozie:coordinator:0.4" exclude-result-prefixes="coordinator">
+
+<xsl:template match="coordinator:dataset" xmlns:coordinator="uri:oozie:coordinator:0.4">
+
+  <object model="oozie.dataset" pk="0">
+
+    <field name="name" type="CharField">
+      <xsl:value-of select="@name"/>
+    </field>
+    <field name="timezone" type="CharField">
+      <xsl:value-of select="@timezone"/>
+    </field>
+    <field name="uri" type="CharField">
+      <xsl:value-of select="coordinator:uri-template"/>
+    </field>
+    <field name="done_flag" type="CharField">
+      <xsl:value-of select="coordinator:done-flag"/>
+    </field>
+
+  </object>
+
+</xsl:template>
+
+<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+</xsl:stylesheet>

+ 17 - 0
apps/oozie/src/oozie/importlib/xslt/coordinators/coordinator.xslt

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

+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/action.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/action.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/control.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/control.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/distcp.0.1.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/distcp.0.1.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/email.0.1.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/email.0.1.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/hive.0.1.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/hive.0.1.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/hive.0.2.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/hive.0.2.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/shell.0.1.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/shell.0.1.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/sqoop.0.1.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/sqoop.0.1.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/extensions/sqoop.0.2.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/extensions/sqoop.0.2.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/decision.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/decision.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/end.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/end.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/archives.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/archives.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/arg_params.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/arg_params.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/args.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/args.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/arguments.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/arguments.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/capture_output.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/capture_output.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/chmods.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/chmods.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/command.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/command.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/deletes.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/deletes.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/files.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/files.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/host.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/host.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/jar_path.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/jar_path.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/java_opts.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/java_opts.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/job_properties.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/job_properties.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/job_xml.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/job_xml.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/main_class.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/main_class.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/mapper.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/mapper.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/mkdirs.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/mkdirs.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/moves.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/moves.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/params.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/params.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/prepares.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/prepares.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/propagate_configuration.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/propagate_configuration.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/reducer.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/reducer.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/script_path.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/script_path.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/touchzs.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/touchzs.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/user.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/user.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fields/xml.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fields/xml.xslt


+ 0 - 0
apps/oozie/src/oozie/xslt/0.1/nodes/fork.xslt → apps/oozie/src/oozie/importlib/xslt/workflows/0.1/nodes/fork.xslt


Some files were not shown because too many files changed in this diff