From 2f6667949b9d4dc3f6d65410e0d943c15d8e3093 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Fri, 23 Jul 2010 18:48:06 +0200 Subject: [PATCH] has global logic, but still does not submit to the API though --- planetlab/css/my_slice.css | 2 +- planetlab/slices/leases.js | 289 ++++++++++++++++++++++--------------- planetlab/slices/slice.php | 9 +- 3 files changed, 185 insertions(+), 115 deletions(-) diff --git a/planetlab/css/my_slice.css b/planetlab/css/my_slice.css index 92d379e..787299a 100644 --- a/planetlab/css/my_slice.css +++ b/planetlab/css/my_slice.css @@ -20,7 +20,7 @@ div#toggle-container-my-slice-nodes-add { /* the container for the scheduler area */ div#toggle-container-my-slice-nodes-reserve { - background: #d0e0f0; + background: #def; } div#leases_area { diff --git a/planetlab/slices/leases.js b/planetlab/slices/leases.js index bd2e1d7..4ecbe10 100644 --- a/planetlab/slices/leases.js +++ b/planetlab/slices/leases.js @@ -1,5 +1,6 @@ /* need to put some place else in CSS ? */ + /* decorations / headers */ var txt_nodename = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-serif', stroke: "none", fill: "#008"}; @@ -14,154 +15,216 @@ var y_sep = 20 var x_grain = 24; var y_node = 15; var radius= 6; -var color_otherslice="#f08080"; -var color_thisslice="#a5e0af"; -var color_free="#f0fcd4"; +/* lease was originally free and is still free */ +var color_lease_free_free="#def"; +/* lease was originally free and is now set for our usage */ +var color_lease_free_mine="#0f0"; +var color_lease_mine_mine="#beb"; +var color_lease_mine_free="#fff"; +var color_lease_other="#f88"; /* other slices name */ var txt_slice = {"font": '"Trebuchet MS", Verdana, Arial, Helvetica, sans-serif', stroke: "none", fill: "#444", "font-size": 15 }; -var leases_namespace = { - - init_scheduler: function () { - // Grab the data - var data = [], - axisx = [], - axisy = [], - table = $$("table#leases_data")[0]; - // no reservable nodes - no data - if ( ! table) return; - // the nodenames - table.getElementsBySelector("tbody>tr>th").each(function (cell) { - axisy.push(getInnerText(cell)); - }); - // the timeslot labels - table.getElementsBySelector("thead>tr>th").each(function (cell) { - /* [0]: timestamp -- [1]: displayable*/ - axisx.push(getInnerText(cell).split("&")); - }); - // leases - expect colspan to describe length in grains - table.getElementsBySelector("tbody>tr>td").each(function (cell) { - data.push(new Array (getInnerText(cell),cell.colSpan)); - }); - // slicename : the upper-left cell - var this_slicename = getInnerText(table.getElementsBySelector("thead>tr>td")[0]); - table.hide(); - var nb_nodes = axisy.length, nb_grains = axisx.length; - var total_width = x_nodename + nb_grains*x_grain; - var total_height = 2*y_header + nb_nodes*(y_node+y_sep); - // no radius supported - paper = Raphael("leases_area", total_width, total_height); -// color = table.css("color"); +//////////////////////////////////////////////////////////// +// the scheduler object +function Scheduler (slicename, axisx, axisy, data) { + + this.slicename=slicename; + this.axisx=axisx; + this.axisy=axisy; + this.data=data; + + // utilities to keep track of all the leases + this.leases=[]; + this.append_lease = function (lease) { + this.leases.push(lease); + } + // how many time slots + this.nb_grains = function () { return axisx.length;} + + this.init = function (id) { + this.total_width = x_nodename + this.nb_grains()*x_grain; + this.total_height = 2*y_header + this.axisy.length*(y_node+y_sep); + paper = Raphael (id, this.total_width, this.total_height); + + // create the time slots legend var top=0; - var left=x_nodename; + var left=x_nodename; - // the time slots legend var col=0; - axisx.each (function (timeslot_spec) { - timeslot=timeslot_spec[1]; + for (var i=0, len=axisx.length; i < len; ++i) { + // pick the printable part + timeslot=axisx[i][1]; var y = top+y_header; if (col%2 == 0) y += y_header; col +=1; var timelabel=paper.text(left,y,timeslot).attr(txt_timeslot) - .attr({"font-size":y_header, "text-anchor":"middle"}); - var path_spec="M"+left+" "+(y+y_header/2)+"L"+left+" "+total_height; + .attr({"font-size":y_header, "text-anchor":"middle"}); + var path_spec="M"+left+" "+(y+y_header/2)+"L"+left+" "+this.total_height; var rule=paper.path(path_spec).attr({'stroke':1,"fill":color_rules}); left+=x_grain; - }); + } - top += 2*y_header+y_sep; - + // move to the lines below: + top += 2*y_header+y_sep; + var data_index=0; - axisy.each(function (node) { + for (var i=0, len=axisy.length; i=this.until_time) { + if (scan.current == "free") lease_methods.init_mine(scan,lease_methods.click_free); + // the other ones just remain as they are + } + } + }, + + init_mine: function (lease, unclick) { + lease.current="mine"; + lease.attr("fill", (lease.initial=="mine") ? color_lease_mine_mine : color_lease_free_mine); + lease.click (lease_methods.click_mine); + if (unclick) lease.unclick(unclick); + }, + + click_mine: function (event) { + // this lease was originally free but is now marked for booking + // we free just this lease + if (this.initial=="free") + lease_methods.init_free(this, lease_methods.click_mine); + // this lease if ours, same for now + else + lease_methods.init_free(this, lease_methods.click_mine); + }, + + + init_other: function (lease, slicename) { + lease.attr ("fill", color_lease_other); + /* a text obj to display the name of the slice that owns that lease */ + var slicelabel = paper.text (lease.attr("x")+lease.attr("width")/2, + lease.attr("y")+lease.attr("height")/2,slicename).attr(txt_slice); + /* hide it right away */ + slicelabel.hide(); + /* record it */ + lease.label=slicelabel; + lease.hover ( function (e) { this.label.toFront(); this.label.show(); }, + function (e) { this.label.hide(); } ); + }, +} + +function init_scheduler () { + // Grab the data + var data = [], axisx = [], axisy = []; + var table = $$("table#leases_data")[0]; + // no reservable nodes - no data + if ( ! table) return; + // the nodenames + table.getElementsBySelector("tbody>tr>th").each(function (cell) { + axisy.push(getInnerText(cell)); + }); + // the timeslot labels + table.getElementsBySelector("thead>tr>th").each(function (cell) { + /* [0]: timestamp -- [1]: displayable*/ + axisx.push(getInnerText(cell).split("&")); + }); + // leases - expect colspan to describe length in grains + table.getElementsBySelector("tbody>tr>td").each(function (cell) { + data.push(new Array (getInnerText(cell),cell.colSpan)); + }); + // slicename : the upper-left cell + var scheduler = new Scheduler (getInnerText(table.getElementsBySelector("thead>tr>td")[0]), axisx, axisy, data); + table.hide(); + // leases_area is a
created by slice.php as a placeholder + scheduler.init ("leases_area"); + + var submit=$$("button#leases_submit")[0]; + submit.onclick = function () { scheduler.submit(); } + var clear=$$("button#leases_clear")[0]; + clear.onclick = function () { scheduler.clear(); } + +} -Event.observe(window, 'load', leases_namespace.init_scheduler); +Event.observe(window, 'load', init_scheduler); diff --git a/planetlab/slices/slice.php b/planetlab/slices/slice.php index 64a5d05..f1dbef8 100644 --- a/planetlab/slices/slice.php +++ b/planetlab/slices/slice.php @@ -559,6 +559,8 @@ if ($count && $privileges) { echo "" . ($start+$i*$grain) . "&" . strftime("%H:%M",$start+$i*$grain). ""; echo ""; // todo - sort on hostnames + function sort_hostname ($a,$b) { return ($a['hostname']<$b['hostname'])?-1:1;} + usort($reservable_nodes,sort_hostname); foreach ($reservable_nodes as $node) { echo "". $node['hostname'] . ""; $hostname=$node['hostname']; @@ -583,8 +585,13 @@ if ($count && $privileges) { echo ""; } - echo ""; + echo "\n"; echo "
"; + echo "
"; + echo ""; + echo ""; + echo "
"; + $toggle_nodes->end(); } $toggle->end(); -- 2.47.0