Filter status: All, Available, Unavailable, Unconfigured, Pending, Reserved
[myslice.git] / manifoldapi / static / js / manifold.js
index fe493cd..f8d299a 100644 (file)
@@ -141,10 +141,10 @@ var QUERY_STATE_DONE        = 2;
  * RECORD STATES (for query_store)
  ******************************************************************************/
 
-var STATE_SET       = 0;
-var STATE_VALUE     = 1;
-var STATE_WARNINGS  = 2;
-var STATE_VISIBLE   = 3;
+var STATE_SET       = 20;
+var STATE_VALUE     = 21;
+var STATE_WARNINGS  = 22;
+var STATE_VISIBLE   = 23;
 
 // ACTIONS
 var STATE_SET_CHANGE = 0;
@@ -177,6 +177,10 @@ var CONSTRAINT_RESERVABLE_LEASE     = 0;
 
 var CONSTRAINT_RESERVABLE_LEASE_MSG = "Configuration required: this resource needs to be scheduled";
 
+var CONSTRAINT_SLA                  = 1;
+
+var CONSTRAINT_SLA_MSG              = "SLA acceptance required: testbed offers SLA for its resources"
+
 // A structure for storing queries
 
 function QueryExt(query, parent_query_ext, main_query_ext, update_query_ext, disabled, domain_query_ext) {
@@ -512,7 +516,7 @@ function QueryStore() {
     this.recount = function(query_uuid)
     {
         var query_ext;
-        var is_reserved, is_pending, in_set,  is_unconfigured;
+        var is_reserved, is_pending, in_set, is_unconfigured, is_unavailable, is_available;
 
         query_ext = manifold.query_store.find_analyzed_query_ext(query_uuid);
         query_ext.num_pending = 0;
@@ -521,6 +525,8 @@ function QueryStore() {
         this.iter_records(query_uuid, function(record_key, record) {
             var record_state = manifold.query_store.get_record_state(query_uuid, record_key, STATE_SET);
             var record_warnings = manifold.query_store.get_record_state(query_uuid, record_key, STATE_WARNINGS);
+            is_unavailable = (record.available == 'false'); 
+            is_available = (record.available == 'true'); 
 
             is_reserved = (record_state == STATE_SET_IN) 
                        || (record_state == STATE_SET_OUT_PENDING)
@@ -560,7 +566,7 @@ function QueryStore() {
         // Adapted from querytable._querytable_filter()
 
         this.iter_records(query_uuid, function(record_key, record) {
-            var is_reserved, is_pending, in_set,  is_unconfigured;
+            var is_reserved, is_pending, in_set, is_unconfigured, is_unavailable, is_available;
 
             /* By default, a record is visible unless a filter says the opposite */
             var visible = true;
@@ -568,6 +574,9 @@ function QueryStore() {
             var record_state = manifold.query_store.get_record_state(query_uuid, record_key, STATE_SET);
             var record_warnings = manifold.query_store.get_record_state(query_uuid, record_key, STATE_WARNINGS);
 
+            is_unavailable = (record.available == 'false'); 
+            is_available = (record.available == 'true'); 
+
             is_reserved = (record_state == STATE_SET_IN) 
                        || (record_state == STATE_SET_OUT_PENDING)
                        || (record_state == STATE_SET_IN_SUCCESS)
@@ -606,6 +615,12 @@ function QueryStore() {
                             // false => ~ break
                             visible = is_reserved;
                             return visible;
+                        case 'available':
+                            visible = is_available;
+                            return visible;
+                        case 'unavailable':
+                            visible = is_unavailable;
+                            return visible;
                         case 'unconfigured':
                             visible = is_unconfigured;
                             return visible;
@@ -737,6 +752,12 @@ var manifold = {
                 } else {
                     console.log('Unknown field');
                 }
+            // FIX if the record contains a string instead of a key:value 
+            // example: select resource, slice_hrn from slice where slice_hrn=='xxx'
+            // Result will be {slice_hrn:'xxx', resource:'urn+zzz'}
+            // We don't have this resource:{urn:'urn+zzz'}
+            } else if(typeof(record) === 'string'){
+                return record;
             } else {
                 return record[fields];
             }
@@ -974,18 +995,44 @@ var manifold = {
         var query_ext = manifold.query_store.find_query_ext(query.query_uuid);
         query_ext.query_state = QUERY_STATE_INPROGRESS;
 
-        var query_json = JSON.stringify(query);
+        /*
+            If the Query object concerns SFA AM objects, iterate on each AM platform
+            Loop per platform, allows a progressive loading per AM platform
+            Update is run on all platforms at the same time to get a final answer, we don't manage partial answers yet...
+        */
+        // Removed slice from the per platform query - it's quick enough...
+        if((query.object == 'resource' || query.object == 'lease') && query.action != "update"){
+            var obj = query.object;
+            $.post("/rest/platform/", function( data ) {
+                $.each(data, function(index, p) {
+                    query.object = p.platform+":"+obj;
+                    var query_json = JSON.stringify(query);
+
+                    // Inform plugins about the progress
+                    query.iter_subqueries(function (sq) {
+                        var sq_query_ext = manifold.query_store.find_analyzed_query_ext(sq.query_uuid);
+                        sq_query_ext.query_state = QUERY_STATE_INPROGRESS;
+                        manifold.raise_record_event(sq.query_uuid, IN_PROGRESS);
+                    });
 
-        // Inform plugins about the progress
-        query.iter_subqueries(function (sq) {
-            var sq_query_ext = manifold.query_store.find_analyzed_query_ext(sq.query_uuid);
-            sq_query_ext.query_state = QUERY_STATE_INPROGRESS;
+                    $.post(manifold.proxy_url, {'json': query_json} , manifold.success_closure(query, null, callback));
 
-            manifold.raise_record_event(sq.query_uuid, IN_PROGRESS);
-        });
+                });
+            });
+
+        }else{
+            var query_json = JSON.stringify(query);
+
+            // Inform plugins about the progress
+            query.iter_subqueries(function (sq) {
+                var sq_query_ext = manifold.query_store.find_analyzed_query_ext(sq.query_uuid);
+                sq_query_ext.query_state = QUERY_STATE_INPROGRESS;
+                manifold.raise_record_event(sq.query_uuid, IN_PROGRESS);
+            });
 
+            $.post(manifold.proxy_url, {'json': query_json} , manifold.success_closure(query, null, callback));
 
-        $.post(manifold.proxy_url, {'json': query_json} , manifold.success_closure(query, null, callback));
+        }
     },
 
     // XXX DEPRECATED
@@ -1049,7 +1096,7 @@ var manifold = {
      * \param array results results corresponding to query
      */
     publish_result: function(query, result) {
-        if (typeof result === 'undefined')
+        if (result == null || typeof result === 'undefined')
             result = [];
 
         // NEW PLUGIN API
@@ -1080,25 +1127,31 @@ var manifold = {
     },
 
     store_records: function(query, records) {
-        // Store records
-        var query_ext = manifold.query_store.find_analyzed_query_ext(query.query_uuid);
-        if (query_ext.set_query_ext) {
-            // We have a domain query
-            // The results are stored in the corresponding set_query
-            manifold.query_store.set_records(query_ext.set_query_ext.query.query_uuid, records);
-            
-        } else if (query_ext.domain_query_ext) {
-            // We have a set query, it is only used to determine which objects are in the set, we should only retrieve the key
-            // Has it a domain query, and has it completed ?
-            $.each(records, function(i, record) {
-                var key = manifold.metadata.get_key(query.object);
-                var record_key = manifold.record_get_value(record, key);
-                manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_SET, STATE_SET_IN);
-            });
+        if(records != null && records.length != 0){
+            // Store records
+            var query_ext = manifold.query_store.find_analyzed_query_ext(query.query_uuid);
+            if (query_ext.set_query_ext) {
+                // We have a domain query
+                // The results are stored in the corresponding set_query
+                manifold.query_store.set_records(query_ext.set_query_ext.query.query_uuid, records);
+                
+            } else if (query_ext.domain_query_ext) {
+                // We have a set query, it is only used to determine which objects are in the set, we should only retrieve the key
+                // Has it a domain query, and has it completed ?
+                $.each(records, function(i, record) {
+                    var key = manifold.metadata.get_key(query.object);
+                    if ( typeof record === "string" ){
+                        var record_key = record;
+                    }else{
+                        var record_key = manifold.record_get_value(record, key);
+                    }
+                    manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_SET, STATE_SET_IN);
+                });
 
-        } else {
-            // We have a normal query
-            manifold.query_store.set_records(query.query_uuid, records, STATE_SET_IN);
+            } else {
+                // We have a normal query
+                manifold.query_store.set_records(query.query_uuid, records, STATE_SET_IN);
+            }
         }
     },
 
@@ -1653,13 +1706,15 @@ case TYPE_LIST_OF_VALUES:
         switch(query.object) {
 
             case 'resource':
+
+                var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
                 // CONSTRAINT_RESERVABLE_LEASE
                 // 
                 // +) If a reservable node is added to the slice, then it should have a corresponding lease
                 // XXX Not always a resource
                 var is_reservable = (record.exclusive == true);
                 if (is_reservable) {
-                    var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
+                    // var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
 
                     if (event_type == STATE_SET_ADD) {
                         // We should have a lease_query associated
@@ -1672,6 +1727,17 @@ case TYPE_LIST_OF_VALUES:
                             // XXX Need for a better function to manage warnings
                             var warn = CONSTRAINT_RESERVABLE_LEASE_MSG;
                             warnings[CONSTRAINT_RESERVABLE_LEASE] = warn;
+
+                            /*manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_WARNINGS, warnings);
+                            // Signal the change to plugins (even if the constraint does not apply, so that the plugin can display a checkmark)
+                            data = {
+                                state:  STATE_WARNINGS,
+                                key   : record_key,
+                                op    : null,
+                                value : warnings
+                            }
+                            manifold.raise_record_event(query.query_uuid, FIELD_STATE_CHANGED, data);*/
+
                         } else {
                             // Lease are defined, delete the warning in case it was set previously
                             delete warnings[CONSTRAINT_RESERVABLE_LEASE];
@@ -1680,13 +1746,24 @@ case TYPE_LIST_OF_VALUES:
                         // Remove warnings attached to this resource
                         delete warnings[CONSTRAINT_RESERVABLE_LEASE];
                     }
-
-                    manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_WARNINGS, warnings);
                 }
 
-                /* This was redundant */
-                // manifold.query_store.recount(query.query_uuid); 
+                /*var urn_regexp = /\+(.*?)\+/;
+                var testbed_urn = urn_regexp.exec(record.urn)[1];
+                var has_sla = $.inArray(testbed_urn, localStorage.getItem("sla_testbeds").split(",")) != -1;
+
+                if (has_sla) {
+                    // var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
+
+                    if (event_type == STATE_SET_ADD) {
+                        var warn = CONSTRAINT_SLA_MSG;
+                        warnings[CONSTRAINT_SLA] = warn;
+                    } else {
+                        delete warnings[CONSTRAINT_SLA];
+                    }
+                }*/
 
+                manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_WARNINGS, warnings);
                 // Signal the change to plugins (even if the constraint does not apply, so that the plugin can display a checkmark)
                 data = {
                     state:  STATE_WARNINGS,
@@ -1695,6 +1772,46 @@ case TYPE_LIST_OF_VALUES:
                     value : warnings
                 }
                 manifold.raise_record_event(query.query_uuid, FIELD_STATE_CHANGED, data);
+
+                // JGLL: SLA code
+                /*get_testbeds_with_sla()
+                    .done( function(testbeds) {
+                        var urn_regexp = /\+(.*?)\+/;
+                        var testbed_urn = urn_regexp.exec(record.urn)[1];
+
+                        var warnings = manifold.query_store.get_record_state(query.query_uuid, record_key, STATE_WARNINGS);
+
+                        if ($.inArray(testbed_urn, testbeds) != -1) {
+                            // JGLL: Set a warning on resources covered by testbeds offering SLAs
+                            // CONSTRAINT_SLA
+
+                            if (event_type == STATE_SET_ADD) {
+                                var warn = CONSTRAINT_SLA_MSG;
+                                warnings[CONSTRAINT_SLA] = warn;
+                            } else {
+                                delete warnings[CONSTRAINT_SLA]
+                            }
+                        }
+
+                        manifold.query_store.set_record_state(query.query_uuid, record_key, STATE_WARNINGS, warnings);
+
+                        // Signal the change to plugins (even if the constraint does not apply, so that the plugin can display a checkmark)
+                        data = {
+                            state:  STATE_WARNINGS,
+                            key   : record_key,
+                            op    : null,
+                            value : warnings
+                        }
+
+                        manifold.raise_record_event(query.query_uuid, FIELD_STATE_CHANGED, data);
+                    })
+                    .fail( function(err) {
+                       console.log("SLA - Error retrieving testbeds that support SLAs");
+                    });*/
+
+                /* This was redundant */
+                // manifold.query_store.recount(query.query_uuid);
+
                 break;
 
             case 'lease':
@@ -1702,7 +1819,7 @@ case TYPE_LIST_OF_VALUES:
                 var resource_query = query_ext.parent_query_ext.query.subqueries['resource'];
                 var warnings = manifold.query_store.get_record_state(resource_query.query_uuid, resource_key, STATE_WARNINGS);
 
-                if (event_type == STATE_SET_ADD) {
+                if (event_type == STATE_SET_ADD || event_type == STATE_SET_IN_PENDING) {
                      // A lease is added, it removes the constraint
                     delete warnings[CONSTRAINT_RESERVABLE_LEASE];
                 } else {
@@ -1713,23 +1830,22 @@ case TYPE_LIST_OF_VALUES:
                         // XXX Need for a better function to manage warnings
                         var warn = CONSTRAINT_RESERVABLE_LEASE_MSG;
                         warnings[CONSTRAINT_RESERVABLE_LEASE] = warn;
+
+                        // Signal the change to plugins (even if the constraint does not apply, so that the plugin can display a checkmark)
+                        data = {
+                            state:  STATE_WARNINGS,
+                            key   : resource_key,
+                            op    : null,
+                            value : warnings
+                        }
+                        manifold.raise_record_event(resource_query.query_uuid, FIELD_STATE_CHANGED, data);
                     } else {
                         // Lease are defined, delete the warning in case it was set previously
                         delete warnings[CONSTRAINT_RESERVABLE_LEASE];
                     }
-                    
                 }
-
+                /* Adding a lease can remove a warning and reduce the unconfigured resources  */
                 manifold.query_store.recount(resource_query.query_uuid); 
-
-                // Signal the change to plugins (even if the constraint does not apply, so that the plugin can display a checkmark)
-                data = {
-                    state:  STATE_WARNINGS,
-                    key   : resource_key,
-                    op    : null,
-                    value : warnings
-                }
-                manifold.raise_record_event(resource_query.query_uuid, FIELD_STATE_CHANGED, data);
                 break;
         }
 
@@ -1770,6 +1886,10 @@ case TYPE_LIST_OF_VALUES:
         query = query_ext.query;
 
         switch(event_type) {
+            case STATUS_REMOVE_WARNING:
+                record = manifold.query_store.get_record(query_uuid, data.value);
+                this._enforce_constraints(query_ext, record, data.value, STATE_SET_REMOVE);
+                break;
 
             // XXX At some point, should be renamed to RECORD_STATE_CHANGED
             case FIELD_STATE_CHANGED: