Browse Source

[oozie] Front end for SLA

Remove model during serialization phase and use view model.
Abraham Elmahrek 12 years ago
parent
commit
23d63af

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

@@ -228,7 +228,7 @@ class Job(models.Model):
     if 'sla' not in data_python:
     if 'sla' not in data_python:
       data_python['sla'] = copy.deepcopy(DEFAULT_SLA)
       data_python['sla'] = copy.deepcopy(DEFAULT_SLA)
     if 'global_properties' not in data_python:
     if 'global_properties' not in data_python:
-      data_python['global_properties'] = DEFAULT_GLOBAL_PROPERTIES       
+      data_python['global_properties'] = DEFAULT_GLOBAL_PROPERTIES
     if 'global_config' not in data_python:
     if 'global_config' not in data_python:
       data_python['global_config'] = DEFAULT_GLOBAL_CONFIG     
       data_python['global_config'] = DEFAULT_GLOBAL_CONFIG     
     return data_python 
     return data_python 

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

@@ -310,22 +310,22 @@
 
 
 ## Would be nice include it in slaForm() somehow
 ## Would be nice include it in slaForm() somehow
 <%def name="slaGlobal()">
 <%def name="slaGlobal()">
-  var SLA_TEXT = {
-    'enabled': {'niceName': '${ _("Enabled") }', 'placeHolder': ''},
-    'nominal-time': {'niceName': '${ _("Nominal time") } *', 'placeHolder': '${"$"}{nominal_time}'},
-    'should-start': {'niceName': '${ _("Should start") }', 'placeHolder': '${"$"}{10 * MINUTES}'},
-    'should-end': {'niceName': '${ _("Should end") } *', 'placeHolder': '${"$"}{30 * MINUTES}'},
-    'max-duration': {'niceName': '${ _("Max duration") }', 'placeHolder': '${"$"}{30 * MINUTES}'},
-    'alert-events': {'niceName': '${ _("Alert events") }', 'placeHolder': 'start_miss,end_miss,duration_miss'},
-    'alert-contact': {'niceName': '${ _("Alert contact") }', 'placeHolder': 'joe@example.com,bob@example.com'},
-    'notification-msg': {'niceName': '${ _("Notification message") }', 'placeHolder': '${ _("My Job has encountered an SLA event!") }'},
-    'upstream-apps': {'niceName': '${ _("Upstream apps") }', 'placeHolder': 'dependent-app-1, dependent-app-2'}
-  };
-
   function addSLATextAndPlaceholder(elements, $data) {
   function addSLATextAndPlaceholder(elements, $data) {
-    if (SLA_TEXT[$data.key()]) {
-      $(elements).find('input').attr('placeholder', SLA_TEXT[$data.key()].placeHolder);
-      $(elements).find('span').text(SLA_TEXT[$data.key()].niceName);
+    var SLA_TEXT = {
+      'enabled': {'niceName': '${ _("Enabled") }', 'placeHolder': ''},
+      'nominal-time': {'niceName': '${ _("Nominal time") } *', 'placeHolder': '${"$"}{nominal_time}'},
+      'should-start': {'niceName': '${ _("Should start") }', 'placeHolder': '${"$"}{10 * MINUTES}'},
+      'should-end': {'niceName': '${ _("Should end") } *', 'placeHolder': '${"$"}{30 * MINUTES}'},
+      'max-duration': {'niceName': '${ _("Max duration") }', 'placeHolder': '${"$"}{30 * MINUTES}'},
+      'alert-events': {'niceName': '${ _("Alert events") }', 'placeHolder': 'start_miss,end_miss,duration_miss'},
+      'alert-contact': {'niceName': '${ _("Alert contact") }', 'placeHolder': 'joe@example.com,bob@example.com'},
+      'notification-msg': {'niceName': '${ _("Notification message") }', 'placeHolder': '${ _("My Job has encountered an SLA event!") }'},
+      'upstream-apps': {'niceName': '${ _("Upstream apps") }', 'placeHolder': 'dependent-app-1, dependent-app-2'}
+    };
+    var text = SLA_TEXT[$data.key()];
+    if (text) {
+      $(elements).find('input').attr('placeholder', text.placeHolder);
+      $(elements).find('span').text(text.niceName);
     } else {
     } else {
       $(elements).find('input').attr('placeholder', '');
       $(elements).find('input').attr('placeholder', '');
       $(elements).find('span').text('');
       $(elements).find('span').text('');

+ 8 - 3
apps/oozie/src/oozie/views/api.py

@@ -206,7 +206,10 @@ def _update_workflow_nodes_json(workflow, json_nodes, id_map, user):
 
 
     for key in json_node:
     for key in json_node:
       if key == 'data':
       if key == 'data':
-        node.data = json.dumps(json_node[key])
+        if isinstance(json_node[key], basestring):
+          node.data = json_node[key]
+        else:
+          node.data = json.dumps(json_node[key])
       elif key not in ('node_ptr', 'child_nodes', 'workflow', 'id', 'sub_workflow'):
       elif key not in ('node_ptr', 'child_nodes', 'workflow', 'id', 'sub_workflow'):
         setattr(node, key, format_field_value(key, json_node[key]))
         setattr(node, key, format_field_value(key, json_node[key]))
 
 
@@ -228,10 +231,12 @@ def _update_workflow_nodes_json(workflow, json_nodes, id_map, user):
 
 
 def _update_workflow_json(json_workflow):
 def _update_workflow_json(json_workflow):
   workflow = Workflow.objects.get(id=json_workflow['id'])
   workflow = Workflow.objects.get(id=json_workflow['id'])
-  print json_workflow
   for key in json_workflow:
   for key in json_workflow:
     if key == 'data':
     if key == 'data':
-      workflow.data = json.dumps(json_workflow['data'])
+      if isinstance(json_workflow[key], basestring):
+        workflow.data = json_workflow[key]
+      else:
+        workflow.data = json.dumps(json_workflow[key])
     elif key not in ('nodes', 'start', 'end', 'job_ptr', 'owner'):
     elif key not in ('nodes', 'start', 'end', 'job_ptr', 'owner'):
       setattr(workflow, key, json_workflow[key])
       setattr(workflow, key, json_workflow[key])
 
 

+ 7 - 14
apps/oozie/static/js/workflow.js

@@ -285,10 +285,9 @@ $.extend(DecisionNode.prototype, ForkNode.prototype, {
  */
  */
 var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode, IdGeneratorTable) {
 var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode, IdGeneratorTable) {
 
 
-  function addModelModificationHandlers(workflow, mapping, model, key) {
+  function addHooks(workflow, mapping, model, key) {
     mapping.subscribe(function(value) {
     mapping.subscribe(function(value) {
       workflow.is_dirty(true);
       workflow.is_dirty(true);
-      model[key] = ko.mapping.toJS(value);
     });
     });
   }
   }
 
 
@@ -409,13 +408,13 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
 
 
     $.each(self['__ko_mapping__'].mappedProperties, function(key, value) {
     $.each(self['__ko_mapping__'].mappedProperties, function(key, value) {
       if (ko.isObservable(self[key])) {
       if (ko.isObservable(self[key])) {
-        addModelModificationHandlers(self, self[key], options.model, key);
+        addHooks(self, self[key], options.model, key);
       } else {
       } else {
         // Unstructured data object.
         // Unstructured data object.
         $.each(self[key], function(_key, _value) {
         $.each(self[key], function(_key, _value) {
           // @TODO: Don't assume all children are observable
           // @TODO: Don't assume all children are observable
           if (ko.isObservable(self[key][_key])) {
           if (ko.isObservable(self[key][_key])) {
-            addModelModificationHandlers(self, self[key][_key], options.model[key], _key);
+            addHooks(self, self[key][_key], options.model[key], _key);
           }
           }
         });
         });
       }
       }
@@ -547,7 +546,6 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
                 } catch (error){
                 } catch (error){
                   data = value;
                   data = value;
                 }
                 }
-                alert(JSON.stringify(data));
                 updateData(self[key], data);
                 updateData(self[key], data);
               break;
               break;
 
 
@@ -600,20 +598,15 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
     toJSON: function() {
     toJSON: function() {
       var self = this;
       var self = this;
 
 
-      data = $.extend(true, {}, self.model);
+      data = $.extend(true, {}, ko.mapping.toJS(self));
 
 
-      var nodes = [];
+      data['nodes'] = [];
       $.each(self.registry.nodes, function(key, node) {
       $.each(self.registry.nodes, function(key, node) {
         // Create object with members from the actual model to address JSON.stringify bug
         // Create object with members from the actual model to address JSON.stringify bug
         // JSON.stringify does not pick up members specified in prototype prior to object creation.
         // JSON.stringify does not pick up members specified in prototype prior to object creation.
-        var model = {};
-        for (var key in node.model) {  //if (key =='data') {alert(node.model[key])};
-          model[key] = node.model[key];
-        }
-        nodes.push(model);
+        data['nodes'].push(node.toJS());
       });
       });
-      data['nodes'] = nodes;
-            
+
       return JSON.stringify(data);
       return JSON.stringify(data);
     },
     },
 
 

+ 11 - 22
apps/oozie/static/js/workflow.node.js

@@ -195,6 +195,15 @@ var NodeModule = function($, IdGeneratorTable, NodeFields) {
       return '';
       return '';
     },
     },
 
 
+    toJS: function() {
+      var self = this;
+      var data = ko.mapping.toJS(self);
+      if ('files' in data) {
+        self['files'] = ko.toJS(self._files);
+      }
+      return data;
+    },
+
     /**
     /**
      * Fetches registry
      * Fetches registry
      */
      */
@@ -214,26 +223,6 @@ var NodeModule = function($, IdGeneratorTable, NodeFields) {
       var mapping = ko.mapping.fromJS(model, MAPPING_OPTIONS);
       var mapping = ko.mapping.fromJS(model, MAPPING_OPTIONS);
 
 
       $.extend(self, mapping);
       $.extend(self, mapping);
-      $.each(mapping, function(key, value) {
-        var key = key;
-        if (ko.isObservable(self[key])) {
-          self[key].subscribe(function(value) {
-            model[key] = ko.mapping.toJS(value);
-          });
-        }
-      });
-
-      $.each(self.child_links(), function(index, link) {
-        var $index = index;
-        link.comment.subscribe(function(value) {
-          self.model.child_links[$index].comment = value;
-        });
-
-        link.child.subscribe(function(value) {
-          self.model.child_links[$index].child = value;
-        });
-      });
-
     },
     },
 
 
     validate: function( ) {
     validate: function( ) {
@@ -241,13 +230,13 @@ var NodeModule = function($, IdGeneratorTable, NodeFields) {
 
 
       var options = {};
       var options = {};
 
 
-      data = $.extend(true, {}, self.model);
+      // data = $.extend(true, {}, self.model);
 
 
       var success = false;
       var success = false;
       var request = $.extend({
       var request = $.extend({
         url: '/oozie/workflows/' + self._workflow.id() + '/nodes/' + self.node_type() + '/validate',
         url: '/oozie/workflows/' + self._workflow.id() + '/nodes/' + self.node_type() + '/validate',
         type: 'POST',
         type: 'POST',
-        data: { node: JSON.stringify(data) },
+        data: { node: JSON.stringify(self.toJS()) },
         success: function(data) {
         success: function(data) {
           ko.mapping.fromJS(data.data, self.errors);
           ko.mapping.fromJS(data.data, self.errors);
           success = data.status == 0;
           success = data.status == 0;