Browse Source

HUE-898 [oozie] Upload a workflow definition file

- Upload a workflow definition to HDFS and select it
- Test validating working order
abec 13 years ago
parent
commit
a5a3aa0494

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

@@ -19,6 +19,7 @@ import logging
 
 from django import forms
 from django.db.models import Q
+from django.utils.translation import ugettext_lazy as _t
 
 from desktop.lib.django_forms import MultiForm, SplitDateTimeWidget
 from oozie.models import Workflow, Node, Java, Mapreduce, Streaming, Coordinator,\
@@ -66,7 +67,7 @@ class WorkflowForm(forms.ModelForm):
 SCHEMA_VERSION_CHOICES = ['0.4']
 
 class ImportWorkflowForm(WorkflowForm):
-  definition = forms.CharField(widget=forms.Textarea())
+  definition_file = forms.FileField(label=_t("Local workflow.xml file"))
   schema_version = forms.ChoiceField(choices=[(version, version) for version in SCHEMA_VERSION_CHOICES])
 
 

+ 3 - 2
apps/oozie/src/oozie/templates/editor/import_workflow.mako

@@ -30,11 +30,11 @@ ${ layout.menubar(section='workflows') }
   <h1>${ _('Import Workflow') }</h1>
 
     <div class="well">
-      <br/>
+      <div class="alert alert-info"><h3>${_('Import an Oozie workflow')}</h3>${_("You can import an external Oozie workflow by providing the workflow definition file.")}</div>
     </div>
 
     <div style="min-height:300px">
-      <form class="form-horizontal" id="workflowForm" action="${ url('oozie:import_workflow') }" method="POST">
+      <form class="form-horizontal" id="workflowForm" action="${ url('oozie:import_workflow') }" method="POST" enctype="multipart/form-data">
 
       <div class="row-fluid">
         <div class="span2">
@@ -44,6 +44,7 @@ ${ layout.menubar(section='workflows') }
           ${ utils.render_field(workflow_form['name']) }
           ${ utils.render_field(workflow_form['description']) }
           ${ utils.render_field(workflow_form['definition']) }
+          ${ utils.render_field(workflow_form['definition_file']) }
           ${ utils.render_field(workflow_form['schema_version']) }
 
           <div class="control-group ">

+ 21 - 0
apps/oozie/src/oozie/tests.py

@@ -21,6 +21,7 @@ except ImportError:
   import simplejson as json
 import logging
 import re
+import os
 
 from nose.plugins.skip import SkipTest
 from nose.tools import assert_true, assert_false, assert_equal, assert_not_equal
@@ -1214,6 +1215,26 @@ class TestEditorWithOozie(OozieBase):
       assert_equal(translation_regex.sub(r'${\1}', getattr(jobsub_design.get_root_action(), field)), getattr(node, field))
 
 
+  def test_import_workflow(self):
+    workflow_count = Workflow.objects.count()
+
+    # Create
+    filename = os.path.abspath(os.path.dirname(__file__) + "/test_data/0.4/test-mapreduce.xml")
+    fh = open(filename)
+    response = self.c.post(reverse('oozie:import_workflow'), {
+      'job_xml': [''],
+      'name': ['test_workflow'],
+      'parameters': ['[{"name":"oozie.use.system.libpath","value":"true"}]'],
+      'deployment_dir': [''],
+      'job_properties': ['[]'],
+      'schema_version': ['0.4'],
+      'definition_file': [fh],
+      'description': ['']
+    }, follow=True)
+    fh.close()
+    assert_equal(workflow_count + 1, Workflow.objects.count(), response)
+
+
 class TestOozieSubmissions(OozieBase):
 
   def test_submit_mapreduce_action(self):

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

@@ -541,12 +541,12 @@ def import_workflow(request):
   workflow = Workflow.objects.new_workflow(request.user)
 
   if request.method == 'POST':
-    workflow_form = ImportWorkflowForm(request.POST, instance=workflow)
+    workflow_form = ImportWorkflowForm(request.POST, request.FILES, instance=workflow)
 
     if workflow_form.is_valid():
       workflow.save()
 
-      workflow_definition = workflow_form.cleaned_data['definition']
+      workflow_definition = workflow_form.cleaned_data['definition_file'].read()
       schema_version = workflow_form.cleaned_data['schema_version']
 
       try: