فهرست منبع

HUE-1001 [oozie] Upload resource archive

Upload resource archives to workspace directory of workflow when importing.
Abraham Elmahrek 12 سال پیش
والد
کامیت
87cb7deff5

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

@@ -79,6 +79,7 @@ SCHEMA_VERSION_CHOICES = ['0.4']
 
 class ImportWorkflowForm(WorkflowForm):
   definition_file = forms.FileField(label=_t("Local workflow.xml file"))
+  resource_archive = forms.FileField(label=_t("Workflow resource archive (zip)"), required=False)
 
 
 class ImportJobsubDesignForm(forms.Form):

+ 7 - 3
apps/oozie/src/oozie/import_workflow.py

@@ -485,9 +485,13 @@ def _resolve_subworkflow_from_deployment_dir(fs, workflow, app_path):
   return None
 
 
-def _save_nodes(nodes):
+def _save_nodes(workflow, nodes):
   for node in nodes:
-    node.save()
+    try:
+      # Do not overwrite start or end node
+      Node.objects.get(workflow=workflow, node_type=node.node_type, name=node.name)
+    except Node.DoesNotExist:
+      node.save()
 
 
 def import_workflow(workflow, workflow_definition, fs=None):
@@ -522,7 +526,7 @@ def import_workflow(workflow, workflow_definition, fs=None):
   # 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(nodes)
+  _save_nodes(workflow, nodes)
   _save_links(workflow, workflow_definition_root)
 
   # Update schema_version

+ 4 - 1
apps/oozie/src/oozie/models.py

@@ -227,7 +227,10 @@ class WorkflowManager(models.Manager):
 
   def destroy(self, workflow, fs):
     Submission(workflow.owner, workflow, fs, {}).remove_deployment_dir()
-    workflow.coordinator_set.update(workflow=None) # In Django 1.3 could do ON DELETE set NULL
+    try:
+      workflow.coordinator_set.update(workflow=None) # In Django 1.3 could do ON DELETE set NULL
+    except:
+      pass
     workflow.save()
     workflow.delete()
 

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

@@ -47,6 +47,7 @@ ${ layout.menubar(section='workflows') }
           ${ utils.render_field(workflow_form['name']) }
           ${ utils.render_field(workflow_form['description']) }
           ${ utils.render_field(workflow_form['definition_file']) }
+          ${ utils.render_field(workflow_form['resource_archive']) }
           ${ utils.render_field(workflow_form['is_shared']) }
           ${ utils.render_field(workflow_form['schema_version']) }
 
@@ -70,19 +71,19 @@ ${ layout.menubar(section='workflows') }
              ${ workflow_form['parameters'] | n,unicode }
          </div>
          </fieldset>
+        </div>
 
         <div class="span2"></div>
-        </div>
       </div>
 
       <div class="form-actions center">
-        <input class="btn btn-primary" type="submit" value="${ _('Save') }" />
+        <input class="btn btn-primary" type="submit" value="${ _('Import') }" />
         <a class="btn" onclick="history.back()">${ _('Back') }</a>
       </div>
       </form>
     </div>
 </div>
 
-${ utils.path_chooser_libs(True) }
+${ utils.path_chooser_libs(False) }
 
 ${ commonfooter(messages) | n,unicode }

+ 1 - 1
apps/oozie/src/oozie/templates/utils.inc.mako

@@ -332,7 +332,7 @@
               }
             },
             createFolder:false,
-            uploadFile:false,
+            uploadFile:true,
             initialPath:$.trim(inputElement.val()) != "" ? pathAddition + inputElement.val() : "${ workflow.deployment_dir }",
             errorRedirectPath:"${ workflow.deployment_dir }",
             forceRefresh:true

+ 18 - 3
apps/oozie/src/oozie/views/editor.py

@@ -20,6 +20,7 @@ try:
 except ImportError:
   import simplejson as json
 import logging
+import shutil
 
 from django.core.urlresolvers import reverse
 from django.db.models import Q
@@ -36,6 +37,7 @@ from desktop.lib.rest.http_client import RestException
 from hadoop.fs.exceptions import WebHdfsException
 from liboozie.submittion import Submission
 
+from filebrowser.lib.archives import archive_factory
 from oozie.conf import SHARE_JOBS
 from oozie.decorators import check_job_access_permission, check_job_edition_permission,\
                              check_dataset_access_permission, check_dataset_edition_permission
@@ -45,9 +47,9 @@ from oozie.models import Workflow, History, Coordinator,\
                          Dataset, DataInput, DataOutput,\
                          ACTION_TYPES, Bundle, BundledCoordinator, Job
 from oozie.forms import WorkflowForm, CoordinatorForm, DatasetForm,\
-  DataInputForm, DataOutputForm, LinkForm,\
-  DefaultLinkForm, design_form_by_type, ParameterForm,\
-  ImportWorkflowForm, NodeForm, BundleForm, BundledCoordinatorForm
+                        DataInputForm, DataOutputForm, LinkForm,\
+                        DefaultLinkForm, ParameterForm, ImportWorkflowForm,\
+                        NodeForm, BundleForm, BundledCoordinatorForm, design_form_by_type
 
 
 LOG = logging.getLogger(__name__)
@@ -137,6 +139,19 @@ def import_workflow(request):
     workflow_form = ImportWorkflowForm(request.POST, request.FILES, instance=workflow)
 
     if workflow_form.is_valid():
+      if workflow_form.cleaned_data.get('resource_archive'):
+        # Upload resources to workspace
+        source = workflow_form.cleaned_data.get('resource_archive')
+        if source.name.endswith('.zip'):
+          workflow.save()
+          Workflow.objects.initialize(workflow, request.fs)
+          temp_path = archive_factory(source).extract()
+          request.fs.copyFromLocal(temp_path, workflow.deployment_dir)
+          shutil.rmtree(temp_path)
+        else:
+          raise PopupException(_('Archive should be a Zip.'))
+
+      workflow.managed = True
       workflow.save()
 
       workflow_definition = workflow_form.cleaned_data['definition_file'].read()