Merge branch 'fed4fire' into onelab
authorJavier García <javier.garcial.external@atos.net>
Mon, 1 Dec 2014 12:03:09 +0000 (13:03 +0100)
committerJavier García <javier.garcial.external@atos.net>
Mon, 1 Dec 2014 12:03:09 +0000 (13:03 +0100)
Conflicts:
plugins/queryupdater/static/js/queryupdater.js
portal/templates/base.html

1  2 
plugins/queryupdater/static/js/queryupdater.js

      // Record state through the query cycle
  
  
 -    var QueryUpdater = Plugin.extend({
 +    var QueryUpdaterPlugin = Plugin.extend({
 +
 +        /**************************************************************************
 +         *                          CONSTRUCTOR
 +         **************************************************************************/
  
          init: function(options, element) {
                this.classname="queryupdater";
              this.selected_resources = Array();
  
              this.table = this.elmt('table').dataTable({
 -// the original querytable layout was
 -//                sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t<'row'<'col-xs-5'i><'col-xs-7'p>>",
 -// however the bottom line with 'showing blabla...' and the navigation widget are not really helpful
                  sDom: "<'row'<'col-xs-5'l><'col-xs-1'r><'col-xs-6'f>>t>",
 -// so this does not matter anymore now that the pagination area is turned off
 -//                sPaginationType: 'bootstrap',
 -                    bAutoWidth: true,
 -//                bJQueryUI      : true,
 -//                bRetrieve      : true,
 -//                sScrollX       : '100%',                 // Horizontal scrolling 
 -//                bSortClasses   : false,              // Disable style for the sorted column
 -//                aaSorting      : [[ 0, 'asc' ]],        // Default sorting on URN
 -//                fnDrawCallback: function() {      // Reassociate close click every time the table is redrawn
 -//                    /* Prevent to loop on click while redrawing table  */
 -//                    $('.ResourceSelectedClose').unbind('click');
 -//                    /* Handle clicks on close span */
 -//                    /* Reassociate close click every time the table is redrawn */
 -//                    $('.ResourceSelectedClose').bind('click', self, self._close_click);
 -//                }
 -             });
 +                      bAutoWidth: true,
 +            });
              
 -            // XXX This should not be done at init...
 -            this.elmt('update').click(this, this.do_checksla);
 -            this.elmt('refresh').click(this, this.do_refresh);
 -            this.elmt('reset').click(this, this.do_reset);
 -            this.elmt('clear_annotations').click(this, this.do_clear_annotations);
 +            this.elmt('update').click(this, this.do_ok);
 +            this.elmt('refresh').click(this, this.do_cancel);
  
              this.listen_query(options.query_uuid);
          },
  
          /***************************** GUI EVENTS *****************************/
  
-         /************************** GUI MANIPULATION **************************/
+         do_checksla: function(e) {
+             var username = e.data.options.username;
+             var urn = data.value;
+             var arraySelectedResources = data.selected_resources;
+             var accepted_sla = [];
+             var count = 0;
+             var self = e.data;
+             // var testbedsWithSLA = ["iminds", "fuseco", "netmode"];
+             var testbedsWithSLA;
+             
+             var sliverPattern = /IDN\+(.+)\+(node|channel)\+/;
+             var list = [];
+             var promt = $('#sla-table-body');
+             
+             $.get("/sla/testbeds/", function(data) {
+                 testbedsWithSLA = data;
+                 console.log("Testbeds with SLA: " + testbedsWithSLA);
+                 $(arraySelectedResources).each(function () {
+                     var sliverMatch = sliverPattern.exec(this);
+                     var sliverId = sliverMatch[1];
+                     for (var i = 0; i < testbedsWithSLA.length; i++) {
+                         if(this.indexOf(testbedsWithSLA[i].toLowerCase()) >= 0){ // If it has SLA
+                             if (list.indexOf(sliverId) == -1) { // If it is not in the list
+                                 list.push(sliverId);
+                             }
+                         }
+                     }
+                 });
+                 if (list.length > 0) {
+                     for (var i = 0; i < list.length; i++) {
+                         var element = $('<tr>');
+                         element.append(
+                             $('<td>').append(list[i]),
+                             $('<td>').append('99% of Uptime for 99% of resources'),
+                             $('<td align="center">').append('<input type="checkbox" name="slaaccept" value="' + list[i] + '"/> <br />')
+                         );
+                         promt.append(element);
+                     }
+                     $('#sla_dialog').show();
+                     $('#slamodal').modal('show');
+                 } else {
+                     //manifold.raise_event(self.options.query_uuid, RUN_UPDATE);
+                 }
+             
+             });
+                     
+             $("#submit_sla").unbind().click(function(){
+                 console.log("With username: " + username);
+                 var notChecked = $("input[name='slaaccept']:not(:checked)");
+                 
+                 if (notChecked.length > 0) {
+                     for (var i = 0; i < notChecked.length; i++) {
+                          console.log("SLA not accepted: " + notChecked[i].value);
+                     }    
+                     alert("All SLAs have to be accepted to continue with the reservation");
+                 } else {
+                     // $(list).each(function () {
+                     //     var date = new Date();
+                     //     date.setYear(date.getFullYear() + 1);
+                     //     $.post("/sla/agreements/simplecreate", 
+                     //         { "template_id": this.toString(),
+                     //           "user": username,
+                     //           "expiration_time": date.toISOString()
+                     //         });
+                         
+                     // });
+                     $.ajax({
+                         url: "/sla/agreements/simplecreate", 
+                         data: { testbeds: list,
+                           user: username,
+                           resources: arraySelectedResources,
+                           slice: main_query.filters.slice()[0][2]
+                         },
+                         type: "post",
+                         traditional: true
+                     });
+                     console.log(main_query.filters.slice()[0][2]);
+                       
+                     $('#slamodal').modal('hide');
+                     $('#sla-table-body').empty();
+                     //manifold.raise_event(self.options.query_uuid, RUN_UPDATE);
+                 }
 -            }); 
 -        
 -            $("#cancel_sla").unbind().click(function(){
++            });
++
++              $("#cancel_sla").unbind().click(function(){
+                 $('#slamodal').modal('hide');
+                 $('#sla-table-body').empty();
+             }); 
+         },
++              /************************** GUI MANIPULATION **************************/
  
 -     
 -        do_update: function(e) {
 -            var self = e.data;
 -
 -            var username = e.data.options.username;
 -            var urn = data.value;
 -            // XXX check that the query is not disabled
 -
 -            self.spin();
 -            console.log("do_update");
 -            // XXX check that the query is not disabled
 -            //manifold.raise_event(self.options.query_uuid, RUN_UPDATE);
 -
 -            // how to stop the spinning after the event? 
 -            // this should be triggered by some on_updatequery_done ?
 -
 -        },
 -
 -      // related buttons are also disabled in the html template
 -        do_refresh: function(e)
 -        {
 -            throw 'resource_selected.do_refresh Not implemented';
 -        },
 -
 -        do_reset: function(e)
 +        populate_table: function()
          {
 -            throw 'queryupdater.do_reset Not implemented';
 -        },
 +            var state;
  
 -        do_clear_annotations: function(e)
 -        {
 -            throw 'queryupdater.do_clear_annotations Not implemented';
 +            // Loop over records and display pending ones
 +            manifold.query_store.iter_records(this.options.query_uuid, function (record_key, record) {
 +                state = manifold.query_store.get_record_state(this.options.query_uuid, null, STATE_SET);
 +            
 +            });
          },
          
 -        /************************** GUI MANIPULATION **************************/
 -
 -        
          set_button_state: function(name, state)
          {
              this.elmt(name).attr('disabled', state ? false : 'disabled');
              return cols[0];
          },
  
 -        set_state: function(data)
 -        {
 -            console.log("function set_state");
 -            var action;
 -            var msg;
 -            var button = '';
 -
 -            var row;
 -          
 -          // make sure the change is visible : toggle on the whole plugin
 -          // this might have to be made an 'auto-toggle' option of this plugin..
 -          // also it might be needed to be a little finer-grained here
 -
 -        // XXX we don't want to show automaticaly the pending when a checkbox is checked
 -          //this.toggle_on();
 -          
 -            switch(data.request) {
 -                case FIELD_REQUEST_ADD_RESET:
 -                case FIELD_REQUEST_REMOVE_RESET:
 -                    // find line and delete it
 -                    row = this.find_row(data.value);
 -                    if (row)
 -                        this.table.fnDeleteRow(row.nTr);
 -                        $("#badge-pending").data('number', $("#badge-pending").data('number') - 1 );
 -                        $("#badge-pending").text($("#badge-pending").data('number'));
 -                    return;
 -                case FIELD_REQUEST_CHANGE:
 -                    action = 'UPDATE';
 -                    break;
 -                case FIELD_REQUEST_ADD:
 -                    action = 'ADD';
 -                    break;
 -                case FIELD_REQUEST_REMOVE:
 -                    action = 'REMOVE';
 -                    break;
 -            }
 -
 -            switch(data.status) {
 -                case FIELD_REQUEST_PENDING:
 -                    msg   = 'PENDING';
 -                    button = "<span class='glyphicon glyphicon-remove ResourceSelectedClose' id='" + data.key + "'/>";
 -                    break;
 -                case FIELD_REQUEST_SUCCESS:
 -                    msg   = 'SUCCESS';
 -                    break;
 -                case FIELD_REQUEST_FAILURE:
 -                    msg   = 'FAILURE';
 -                    break;
 -            }
 +        do_update: function(e) {
 +            var self = e.data;
  
 -            var status = msg + status;
 +            var username = e.data.options.username;
 +            var urn = data.value;
 +            // XXX check that the query is not disabled
  
 -            
 +            self.spin();
 +            console.log("do_update");
 +            // XXX check that the query is not disabled
 +            //manifold.raise_event(self.options.query_uuid, RUN_UPDATE);
  
 -            // find line
 -            // if no, create it, else replace it
 -            // XXX it's not just about adding lines, but sometimes removing some
 -            // XXX how do we handle status reset ?
 -            data.value = JSON.stringify(data.value);
 -            data.selected_resources = this.selected_resources;
 -            row = this.find_row(data.value);
 -            newline = [
 -                action,
 -                data.key,
 -                data.value,
 -                msg,
 -                button
 -            ];
 -            if (!row) {
 -                // XXX second parameter refresh = false can improve performance. todo in querytable also
 -                this.table.fnAddData(newline);
 -                row = this.find_row(data.value);
 -                $("#badge-pending").data('number', $("#badge-pending").data('number') + 1 );
 -                $("#badge-pending").text($("#badge-pending").data('number'));
 -            } else {
 -                // Update row text...
 -                this.table.fnUpdate(newline, row.nTr);
 -            }
 +            // how to stop the spinning after the event? 
 +            // this should be triggered by some on_updatequery_done ?
  
 -            // Change cell color according to status
 -            if (row) {
 -                $(row.nTr).removeClass('add remove')
 -                var cls = action.toLowerCase();
 -                if (cls)
 -                    $(row.nTr).addClass(cls);
 -            }
          },
  
 -        /*************************** QUERY HANDLER ****************************/
 -
 -        // NONE
 +        do_ok: function(e)
 +        {
 +            throw 'queryupdater.do_reset Not implemented';
 +        },
  
 -        /*************************** RECORD HANDLER ***************************/
 +        do_cancel: function(e)
 +        {
 +            throw 'queryupdater.do_clear_annotations Not implemented';
 +        },
 +        
 +       /**************************************************************************
 +        *                           QUERY HANDLERS
 +        **************************************************************************/ 
  
          on_new_record: function(record)
          {
 -            console.log("query_updater on_new_record");
 -            console.log(record);
  
              // if (not and update) {
  
  
          on_query_in_progress: function()
          {
 -              messages.debug("queryupdater.on_query_in_progress");
              this.spin();
          },
  
 +        on_query_done: function()
 +        {
 +            this.populate_table();
 +            this.unspin();
 +        },
 +
          // D : Data present
          // - on_clear_records (Get)
          // - on_new_record (shared with AD) XXX
  
          on_query_done: function()
          {
 -            console.log("on_query_done");
              this.unspin();
          },
  
          // NOTE: record_key could be sufficient 
          on_added_record: function(record)
          {
 -            console.log("on_added_record = ",record);
              this.set_record_state(record, RECORD_STATE_ADDED);
              // update pending number
          },
  
          on_removed_record: function(record_key)
          {
 -            console.log("on_removed_record = ",record_key);
              this.set_record_state(RECORD_STATE_REMOVED);
          },
  
          // - Key and confirmation could be sufficient, or key and record state
          // XXX move record state to the manifold plugin API
  
 -        on_field_state_changed: function(result)
 +        on_field_state_changed: function(data)
          {
 -            console.log("on_field_state_changed");
 -            console.log(result);
 +            /*
              if(result.request == FIELD_REQUEST_ADD){
                  this.selected_resources.push(result.value);
              } else if(result.request == FIELD_REQUEST_REMOVE_RESET){
                      this.selected_resources.splice(i,1);
                  }
              }
 -            console.log("Resources: " + self.selected_resources);
 -            messages.debug(result)
 -            /* this.set_state(result.request, result.key, result.value, result.status); */
              this.set_state(result);
 +            */
 +
 +            var action, msg, row, status, button = '';
 +
 +            switch(data.state) {
 +                case STATE_VALUE:
 +                    switch(data.op) {
 +                        // XXX other events missing !!
 +                        case STATE_VALUE_CHANGE_PENDING:
 +                            action = 'UPDATE';
 +                            break;
 +                    }
 +                    break;
 +
 +                case STATE_SET:
 +                    switch(data.op) {
 +                        case STATE_SET_IN_PENDING:
 +                            action = 'ADD';
 +                            msg   = 'PENDING';
 +                            button = "<span class='glyphicon glyphicon-remove ResourceSelectedClose' id='" + data.key + "'/>";
 +                            break;  
 +
 +                        case STATE_SET_OUT_PENDING:
 +                            action = 'REMOVE';
 +                            msg   = 'PENDING';
 +                            button = "<span class='glyphicon glyphicon-remove ResourceSelectedClose' id='" + data.key + "'/>";
 +                            break;
 +
 +                        case STATE_SET_IN:
 +                        case STATE_SET_OUT:
 +                            // find line and delete it
 +                            row = this.find_row(data.value);
 +                            if (row)
 +                                this.table.fnDeleteRow(row.nTr);
 +                            return;
 +
 +                        case STATE_SET_IN_SUCCESS:
 +                        case STATE_SET_OUT_SUCCESS:
 +                            msg   = 'SUCCESS';
 +                            break;
 +
 +                        case STATE_SET_IN_FAILURE:
 +                        case STATE_SET_OUT_FAILURE:
 +                            msg   = 'FAILURE';
 +                            break;
 +
 +                    }
 +                    break;
 +
 +                default:
 +                    return;
 +            }
 +
 +            status = msg + status;
 +
 +            // find line
 +            // if no, create it, else replace it
 +            // XXX it's not just about adding lines, but sometimes removing some
 +            // XXX how do we handle status reset ?
 +
 +            // Jordan : I don't understand this. I added this test otherwise we have string = ""..."" double quoted twice.
 +            if (typeof(data.value) !== "string")
 +                data.value = JSON.stringify(data.value);
 +            data.selected_resources = this.selected_resources;
 +            row = this.find_row(data.value);
 +            newline = [action, data.key, data.value, msg, button];
 +            if (!row) {
 +                // XXX second parameter refresh = false can improve performance. todo in querytable also
 +                this.table.fnAddData(newline);
 +                row = this.find_row(data.value);
 +            } else {
 +                // Update row text...
 +                this.table.fnUpdate(newline, row.nTr);
 +            }
 +
 +            // Change cell color according to status
 +            if (row) {
 +                $(row.nTr).removeClass('add remove')
 +                var cls = action.toLowerCase();
 +                if (cls)
 +                    $(row.nTr).addClass(cls);
 +            }
          },
  
          // XXX we will have the requests for change
  
      });
  
 -    $.plugin('QueryUpdater', QueryUpdater);
 +    $.plugin('QueryUpdaterPlugin', QueryUpdaterPlugin);
  
  })(jQuery);