+/* Thierry Parmentelat -- INRIA */
+
/* need to put some place else in CSS ? */
// space for the nodenames
var y_sep = 10;
// 1-grain leases attributes
-// w_grain is configurable from $_GET
-//var w_grain = 20;
+// leases_w is configurable from html
+//var leases_w = 20;
var y_node = 15;
var radius= 6;
////////////////////////////////////////////////////////////
// the scheduler object
-function Scheduler (sliceid, slicename, w_grain) {
+function Scheduler () {
// xxx-hacky dunno how to retrieve this object from an ajax callback
Scheduler.scheduler=this;
// the data contains slice names, and lease_id, we need this to find our own leases (mine)
- this.sliceid=sliceid;
- this.slicename=slicename;
this.paper=null;
- this.w_grain = parseInt(w_grain);
- // the path for the triangle-shaped buttons
- this.timebutton_path="M1,0L"+(this.w_grain-1)+",0L"+(this.w_grain/2)+","+y_header+"L1,0";
-
- // how many time slots
- this.nb_grains = function () { return this.axisx.length;}
-
////////////////////
// store the result of an ajax request in the leases_data table
this.set_html = function (html_data) {
// the names of the hidden fields that hold the input to this class
// are hard-wired for now
this.parse_html = function () {
- this.sliceid=getInnerText($$("span#leases_sliceid")[0]).strip();
- this.slicename=getInnerText($$("span#leases_slicename")[0]).strip();
- this.leases_grain=getInnerText($$("span#leases_grain")[0]).strip();
- this.leases_offset=getInnerText($$("span#leases_offset")[0]).strip();
- this.leases_slots=getInnerText($$("span#leases_slots")[0]).strip();
- this.leases_w=getInnerText($$("span#leases_w")[0]).strip();
var table = $$("table#leases_data")[0];
// no reservable nodes - no data
if ( ! table) return false;
- // check for the body too xxx
+
// the nodelabels
var data = [], axisx = [], axisy = [];
table.getElementsBySelector("tbody>tr>th").each(function (cell) {
axisy.push(getInnerText(cell));
});
+ // test for at least one entry; other wise this means we haven't retrieved
+ // the html dta yet
+ if (axisy.length <1) return false;
// the timeslot labels
table.getElementsBySelector("thead>tr>th").each(function (cell) {
return true;
}
+ // how many time slots
+ this.nb_grains = function () { return this.axisx.length;}
+
////////////////////
// draw
this.draw_area = function (canvas_id) {
- this.total_width = x_nodelabel + this.nb_grains()*this.w_grain;
+ this.total_width = x_nodelabel + this.nb_grains()*this.leases_w;
this.total_height = 2*y_header /* the timelabels */
+ 2*y_sep /* extra space */
+ y_node /* all-nodes & timebuttons row */
}
this.paper=paper;
+ // the path for the triangle-shaped buttons
+ this.timebutton_path="M1,0L"+(this.leases_w-1)+",0L"+(this.leases_w/2)+","+y_header+"L1,0";
+
var axisx=this.axisx;
+
var axisy=this.axisy;
// maintain the list of nodelabels for the 'all nodes' button
this.nodelabels=[];
} else if ( (timestamp%(12*3600))==0) {
paper.path(half_daymarker_path).attr({'translation':left+','+top}).attr(attr_daymarker);
}
- left+=(this.w_grain);
+ left+=(this.leases_w);
}
////////// the row with the timeslot buttons (the one labeled 'All nodes')
timebutton.from_time=axisx[i][0];
timebutton.scheduler=this;
timebutton.click(timebutton_methods.click);
- left+=(this.w_grain);
+ left+=(this.leases_w);
}
//////// the body of the scheduler : loop on nodes
lease_id=this.data[data_index][0];
slicename=this.data[data_index][1];
duration=this.data[data_index][2];
- var lease=paper.rect (left,top,this.w_grain*duration,y_node,radius);
+ var lease=paper.rect (left,top,this.leases_w*duration,y_node,radius);
+ // record scheduler in lease - early as we need this in init_other
+ lease.scheduler=this;
lease.lease_id=lease_id;
lease.nodename=nodename;
lease.nodelabel=nodelabel;
lease.initial="mine";
lease_methods.init_mine(lease);
} else {
- lease_initial="other";
+ lease.initial="other";
lease_methods.init_other(lease,slicename);
}
lease.from_time = axisx[grain%this.nb_grains()][0];
grain += duration;
lease.until_time = axisx[grain%this.nb_grains()][0];
- // record scheduler in lease
- lease.scheduler=this;
// and vice versa
this.leases.push(lease);
// move on with the loop
- left += this.w_grain*duration;
+ left += this.leases_w*duration;
data_index +=1;
}
top += y_node + y_sep;
if (lease.current=='mine') {
var j=i+1;
while (j<len && lease_methods.compare (lease, until_time, this.leases[j])) {
-// window.console.log('merging index='+i+' initial='+this.leases[i].initial+' current='+this.leases[i].current);
+// window.console.log('merging index='+i+' initial='+lease.initial+' current='+lease.current);
// window.console.log('merged index='+j+' initial='+this.leases[j].initial+' current='+this.leases[j].current);
until_time=this.leases[j].until_time;
++j; ++i;
}
}
}
- sliceid=this.sliceid;
+ slice_id=this.slice_id;
// Ajax.Request comes with prototype
var ajax=new Ajax.Request('/planetlab/common/actions.php',
{method:'post',
parameters:{'action':'manage-leases',
- 'actions':actions.toJSON()},
+ 'actions':Object.toJSON(actions)},
onSuccess: function(transport) {
var response = transport.responseText || "no response text";
document.body.style.cursor = "default";
}
}
+ // re-read settings from the html, ajax-aquire the html text for the leases_data table
+ // store it in the html tree, parse it, and refresh graphic
this.refresh = function () {
+ this.slice_id=getInnerText($$("span#leases_slice_id")[0]).strip();
+ this.slicename=getInnerText($$("span#leases_slicename")[0]).strip();
+ this.leases_granularity=getInnerText($$("span#leases_granularity")[0]).strip();
+ this.leases_offset=$("leases_offset_input").value.strip();
+ this.leases_slots=$("leases_slots_input").value.strip();
+ this.leases_w=parseInt($("leases_w_input").value.strip());
+
document.body.style.cursor = "wait";
var ajax=new Ajax.Request('/planetlab/slices/leases-data.php',
{method:'post',
- parameters:{'sliceid':this.sliceid,
+ parameters:{'slice_id':this.slice_id,
'slicename':this.slicename,
- 'leases_grain':this.leases_grain,
+ 'leases_granularity':this.leases_granularity,
'leases_offset':this.leases_offset,
'leases_slots':this.leases_slots,
'leases_w':this.leases_w},
if ( ! scheduler.set_html (response))
alert ("Something wrong .. Could not store ajax result..");
else if ( ! scheduler.parse_html())
- alert ("Something wrong .. Could not parse ajax result..");
+ alert ("Error: could not parse ajax result..\nIf your session has expired, you need to log back in");
else
scheduler.draw_area("leases_area");
document.body.style.cursor = "default";
init_other: function (lease, slicename) {
lease.animate (attr_lease_other,anim_delay);
/* a text obj to display the name of the slice that owns that lease */
- var otherslicelabel = paper.text (lease.attr("x")+lease.attr("width")/2,
- // xxx
- lease.attr("y")+lease.attr("height")/2,slicename).attr(txt_otherslice);
+ var otherslicelabel = lease.scheduler.paper.text (lease.attr("x")+lease.attr("width")/2,
+ // xxx
+ lease.attr("y")+lease.attr("height")/2,slicename).attr(txt_otherslice);
/* hide it right away */
otherslicelabel.hide();
/* record it */
function init_scheduler () {
// Grab the data
- var data = [], axisx = [], axisy = [];
- var sliceid = getInnerText($$("span#leases_sliceid")[0]).strip();
- var slicename = getInnerText($$("span#leases_slicename")[0]).strip();
- var w_grain = getInnerText($$("span#leases_w")[0]).strip();
- var scheduler = new Scheduler (sliceid,slicename,w_grain);
+ var scheduler = new Scheduler ();
// parse the table with data, and if not empty, draw the scheduler
- if (scheduler.parse_html ()) {
- scheduler.draw_area("leases_area");
- }
+ scheduler.refresh();
// attach behaviour to buttons
- var refresh=$$("button#leases_refresh")[0];
- if (refresh) refresh.onclick = function () { scheduler.refresh();}
- var submit=$$("button#leases_submit")[0];
- submit.onclick = function () { scheduler.submit(); }
-
- scheduler.refresh();
+ $("leases_submit").onclick = function () { scheduler.submit(); }
+ $("leases_refresh").onclick = function () { scheduler.refresh();}
}