Explorar o código

HUE-1679 [oozie] Save a workflow with a bad name fails with no information

Added JS for workflow properties.
Improved error handling when creating a workflow as well.
Abraham Elmahrek %!s(int64=12) %!d(string=hai) anos
pai
achega
f11ad68

+ 12 - 5
apps/oozie/src/oozie/templates/editor/edit_workflow.mako

@@ -85,10 +85,10 @@ ${ layout.menubar(section='workflows') }
       <div class="card-body">
         <p>
             <fieldset>
-        ${ utils.render_field(workflow_form['name'], extra_attrs={'data-bind': 'value: %s' % workflow_form['name'].name}) }
-        ${ utils.render_field(workflow_form['description'], extra_attrs={'data-bind': 'value: %s' % workflow_form['description'].name}) }
+        ${ utils.render_field_with_error_js(workflow_form['name'], workflow_form['name'].name, extra_attrs={'data-bind': 'value: %s' % workflow_form['name'].name}) }
+        ${ utils.render_field_with_error_js(workflow_form['description'], workflow_form['description'].name, extra_attrs={'data-bind': 'value: %s' % workflow_form['description'].name}) }
         <div class="hide">
-          ${ utils.render_field(workflow_form['is_shared'], extra_attrs={'data-bind': 'checked: %s' % workflow_form['is_shared'].name}) }
+          ${ utils.render_field_with_error_js(workflow_form['is_shared'], workflow_form['is_shared'].name, extra_attrs={'data-bind': 'checked: %s' % workflow_form['is_shared'].name}) }
         </div>
 
       <%
@@ -117,10 +117,10 @@ ${ layout.menubar(section='workflows') }
 
       <div id="advanced-container" class="hide">
         % if user_can_edit_job:
-          ${ utils.render_field(workflow_form['deployment_dir'], extra_attrs={'data-bind': 'value: %s' % workflow_form['deployment_dir'].name}) }
+          ${ utils.render_field_with_error_js(workflow_form['deployment_dir'], workflow_form['deployment_dir'].name, extra_attrs={'data-bind': 'value: %s' % workflow_form['deployment_dir'].name}) }
         % endif
 
-        ${ utils.render_field(workflow_form['job_xml'], extra_attrs={'data-bind': 'value: %s' % workflow_form['job_xml'].name}) }
+        ${ utils.render_field_with_error_js(workflow_form['job_xml'], workflow_form['job_xml'].name, extra_attrs={'data-bind': 'value: %s' % workflow_form['job_xml'].name}) }
       </div>
 
       </fieldset>
@@ -594,6 +594,13 @@ function workflow_save_success(data) {
 }
 
 function workflow_save_error(data) {
+  try {
+    if (data.status !== 400) {
+      throw Exception();
+    }
+    var response = $.parseJSON(data.responseText);
+    ko.mapping.fromJS(response.data.errors, workflow.errors);
+  } catch(err) {}
   $(document).trigger("error", "${ _('Could not save workflow') }");
   workflow.loading(false);
   $("#btn-save-wf").button('reset');

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

@@ -124,8 +124,6 @@ def create_workflow(request):
       wf.managed = True
       Workflow.objects.initialize(wf, request.fs)
       return redirect(reverse('oozie:edit_workflow', kwargs={'workflow': workflow.id}))
-    else:
-      request.error(_('Errors on the form: %s') % workflow_form.errors)
   else:
     workflow_form = WorkflowForm(instance=workflow)
 

+ 6 - 0
apps/oozie/static/js/workflow.js

@@ -496,6 +496,12 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       if ('read_only' in options) {
         self.read_only(options['read_only']);
       }
+
+      if (self.errors) {
+        ko.mapping.fromJS(format_errors_mapping(self.model), self.errors);
+      } else {
+        self.errors = ko.mapping.fromJS(format_errors_mapping(self.model));
+      }
     },
 
     toString: function() {

+ 18 - 14
apps/oozie/static/js/workflow.node.js

@@ -14,6 +14,23 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+function format_errors_mapping(model) {
+  var errors = {};
+  for(var key in model) {
+    switch(key) {
+      case 'child_links':
+      case 'node_ptr':
+      case 'initialize':
+      case 'toString':
+      break;
+      default:
+        errors[key] = [];
+      break;
+    }
+  }
+  return errors;
+}
+
 /**
  * Node
  * Displays node in a graph and handles graph manipulation.
@@ -74,20 +91,7 @@ var NodeModule = function($, IdGeneratorTable, NodeFields) {
     self.children = ko.observableArray([]);
     self.model = model;
 
-    var errors = {};
-    for(var key in model) {
-      switch(key) {
-        case 'child_links':
-        case 'node_ptr':
-        case 'initialize':
-        case 'toString':
-        break;
-        default:
-          errors[key] = [];
-        break;
-      }
-    }
-    self.errors = ko.mapping.fromJS(errors);
+    self.errors = ko.mapping.fromJS(format_errors_mapping(model));
 
     self.edit_template = model.node_type + 'EditTemplate';
     switch(model.node_type) {