瀏覽代碼

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

Move things around and create bundles and coordinators import lib
Abraham Elmahrek 12 年之前
父節點
當前提交
c1ca50ea37
共有 100 個文件被更改,包括 760 次插入51 次删除
  1. 1 1
      apps/jobsub/src/jobsub/migrations/0005_unify_with_oozie.py
  2. 二進制
      apps/oozie/examples/bundles/aggregate/bundle.zip
  3. 二進制
      apps/oozie/examples/coordinators/dailyanalytics/coordinator.zip
  4. 二進制
      apps/oozie/examples/coordinators/dailysleep/coordinator.zip
  5. 0 0
      apps/oozie/examples/managed/distcp/empty
  6. 二進制
      apps/oozie/examples/managed/distcp/workflow.zip
  7. 0 0
      apps/oozie/examples/managed/email/empty
  8. 二進制
      apps/oozie/examples/managed/email/workflow.zip
  9. 0 0
      apps/oozie/examples/managed/fs/empty
  10. 二進制
      apps/oozie/examples/managed/fs/workflow.zip
  11. 0 0
      apps/oozie/examples/managed/generic/empty
  12. 二進制
      apps/oozie/examples/managed/generic/workflow.zip
  13. 二進制
      apps/oozie/examples/managed/hive/workflow.zip
  14. 二進制
      apps/oozie/examples/managed/pig/workflow.zip
  15. 二進制
      apps/oozie/examples/managed/shell/workflow.zip
  16. 0 0
      apps/oozie/examples/managed/sleep/empty
  17. 二進制
      apps/oozie/examples/managed/sleep/workflow.zip
  18. 0 0
      apps/oozie/examples/managed/sleepfork/empty
  19. 二進制
      apps/oozie/examples/managed/sleepfork/workflow.zip
  20. 二進制
      apps/oozie/examples/managed/sqoop/workflow.zip
  21. 0 0
      apps/oozie/examples/managed/ssh/empty
  22. 二進制
      apps/oozie/examples/managed/ssh/workflow.zip
  23. 0 0
      apps/oozie/examples/managed/terasort/empty
  24. 二進制
      apps/oozie/examples/managed/terasort/workflow.zip
  25. 0 0
      apps/oozie/examples/unmanaged/distcp/empty
  26. 二進制
      apps/oozie/examples/unmanaged/distcp/workflow.zip
  27. 0 0
      apps/oozie/examples/unmanaged/email/empty
  28. 二進制
      apps/oozie/examples/unmanaged/email/workflow.zip
  29. 0 0
      apps/oozie/examples/unmanaged/fs/empty
  30. 二進制
      apps/oozie/examples/unmanaged/fs/workflow.zip
  31. 二進制
      apps/oozie/examples/unmanaged/hive/workflow.zip
  32. 二進制
      apps/oozie/examples/unmanaged/pig/workflow.zip
  33. 二進制
      apps/oozie/examples/unmanaged/shell/workflow.zip
  34. 0 0
      apps/oozie/examples/unmanaged/sleep/empty
  35. 二進制
      apps/oozie/examples/unmanaged/sleep/workflow.zip
  36. 二進制
      apps/oozie/examples/unmanaged/sqoop/workflow.zip
  37. 0 0
      apps/oozie/examples/unmanaged/ssh/empty
  38. 二進制
      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
 
 

二進制
apps/oozie/examples/bundles/aggregate/bundle.zip


二進制
apps/oozie/examples/coordinators/dailyanalytics/coordinator.zip


二進制
apps/oozie/examples/coordinators/dailysleep/coordinator.zip


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


二進制
apps/oozie/examples/managed/distcp/workflow.zip


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


二進制
apps/oozie/examples/managed/email/workflow.zip


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


二進制
apps/oozie/examples/managed/fs/workflow.zip


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


二進制
apps/oozie/examples/managed/generic/workflow.zip


二進制
apps/oozie/examples/managed/hive/workflow.zip


二進制
apps/oozie/examples/managed/pig/workflow.zip


二進制
apps/oozie/examples/managed/shell/workflow.zip


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


二進制
apps/oozie/examples/managed/sleep/workflow.zip


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


二進制
apps/oozie/examples/managed/sleepfork/workflow.zip


二進制
apps/oozie/examples/managed/sqoop/workflow.zip


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


二進制
apps/oozie/examples/managed/ssh/workflow.zip


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


二進制
apps/oozie/examples/managed/terasort/workflow.zip


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


二進制
apps/oozie/examples/unmanaged/distcp/workflow.zip


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


二進制
apps/oozie/examples/unmanaged/email/workflow.zip


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


二進制
apps/oozie/examples/unmanaged/fs/workflow.zip


二進制
apps/oozie/examples/unmanaged/hive/workflow.zip


二進制
apps/oozie/examples/unmanaged/pig/workflow.zip


二進制
apps/oozie/examples/unmanaged/shell/workflow.zip


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


二進制
apps/oozie/examples/unmanaged/sleep/workflow.zip


二進制
apps/oozie/examples/unmanaged/sqoop/workflow.zip


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


二進制
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