From: marko Date: Thu, 1 Nov 2007 10:42:27 +0000 (+0000) Subject: Allow for multiple independent experiments to run in parallel. X-Git-Url: https://git.entuzijast.net/?a=commitdiff_plain;h=e0970c4b2aeece2dd7bf735fb6065dcbce39b76c;p=imunes.git Allow for multiple independent experiments to run in parallel. Each experiment is dynamically assigned an experiment id (eid) which it then uses throughout its lifetime. By default the eid is constructed by appending the process id of the tcl interpreter to the prefix "imunes_". All vimages and netgraph nodes corresponding to virtual nodes in an experiment are created as child nodes of a "controlling" vimage which has the same name as eid. All virtual node specific temporary directories / files are created as subdirectories in /tmp/$eid directory. vimageCleanup function is modified to destroy / cleanup only those vimages / netgraph nodes bellow and including the controlling vimage for the given experiment. Temporary files in /tmp/$eid are no longer automatically deleted. Bug found by: Submitted by: Reviewed by: Approved by: Obtained from: --- diff --git a/exec.tcl b/exec.tcl index 43f6183..ef536a2 100755 --- a/exec.tcl +++ b/exec.tcl @@ -1,4 +1,4 @@ -# $Id: exec.tcl,v 1.60 2007/10/29 16:25:23 marko Exp $ +# $Id: exec.tcl,v 1.61 2007/11/01 10:42:27 marko Exp $ # Copyright 2004, 2005 University of Zagreb, Croatia. All rights reserved. # @@ -97,7 +97,7 @@ proc nexec { args } { # * mode -- the new operating mode. Can be edit or exec. #**** proc setOperMode { mode } { - global oper_mode activetool node_list + global oper_mode eid activetool node_list global editor_only remote_exec execSock global undolevel redolevel @@ -159,7 +159,7 @@ proc setOperMode { mode } { } } else { if {$oper_mode != "edit"} { - vimageCleanup + vimageCleanup $eid .menubar.tools entryconfigure "Auto rearrange all" -state normal .menubar.tools entryconfigure "Auto rearrange selected" -state normal } @@ -360,10 +360,11 @@ proc l3node.start { eid node } { global viewcustomid set node_id "$eid\.$node" + set node_dir "/tmp/$eid/$node" - nexec rm -fr /tmp/$node_id - nexec mkdir /tmp/$node_id - nexec chmod 1777 /tmp/$node_id + nexec rm -fr $node_dir + nexec mkdir $node_dir + nexec chmod 1777 $node_dir foreach ifc [ifcList $node] { set mtu [getIfcMTU $node $ifc] nexec vimage $node_id ifconfig $ifc mtu $mtu @@ -397,7 +398,7 @@ proc l3node.start { eid node } { set ipsecCfg "" if { [getIpsecEnabled $node] == true } { set setkeycfg [ipsecCfggen $node] - set setkeyFileId [open /tmp/$node_id/setkey.conf w+] + set setkeyFileId [open $node_dir/setkey.conf w+] foreach line $setkeycfg { puts $setkeyFileId $line } @@ -405,7 +406,7 @@ proc l3node.start { eid node } { set errorstr "" set error [catch "nexec vimage $node_id setkey -f \ - /tmp/$node_id/setkey.conf" errorstr] + $node_dir/setkey.conf" errorstr] if { $error == "1" } { setkeyError $node_id $errorstr } @@ -416,20 +417,20 @@ proc l3node.start { eid node } { set bootcmd [[typemodel $node].bootcmd $node] } if { ! $remote_exec } { - set fileId [open /tmp/$node_id/boot.conf w] + set fileId [open $node_dir/boot.conf w] foreach line $bootcfg { puts $fileId $line } close $fileId } else { - nexec create_conf_file /tmp/$node_id/boot.conf + nexec create_conf_file $node_dir/boot.conf foreach line $bootcfg { puts $execSock $line } nexec close_conf_file } - catch "nexec vimage $node_id $bootcmd /tmp/$node_id/boot.conf &" + catch "nexec vimage $node_id $bootcmd $node_dir/boot.conf &" } #****f* exec.tcl/l3node.shutdown @@ -483,7 +484,7 @@ proc l3node.destroy { eid node } { } } catch {nexec vimage -d $node_id} - nexec rm -fr /tmp/$node_id + nexec rm -fr $node_dir } @@ -510,11 +511,12 @@ proc deployCfg {} { set t_start [clock seconds] - vimageCleanup + vimageCleanup $eid catch { nexec vimage -c $eid } + catch { nexec rm -fr /tmp/$eid } + catch { nexec mkdir /tmp/$eid } - catch { nexec mv /etc/resolv.conf /etc/resolv.conf.bak } catch { nexec kldload ng_ether } catch { nexec kldload ng_iface } catch { nexec kldload ng_eiface } @@ -602,10 +604,12 @@ proc deployCfg {} { } } + # XXX move those to some quagga specific script + # XXX race if starting two imunes instances simultaneously nexec rm -fr /var/run/quagga nexec rm -f /usr/local/etc/quagga/Quagga.conf - catch { nexec ln -s /tmp/@ /var/run/quagga } - catch { nexec ln -s /tmp/@/boot.conf /usr/local/etc/quagga/Quagga.conf } + catch { nexec ln -s /tmp/$eid/@ /var/run/quagga } + catch { nexec ln -s /tmp/$eid/@/boot.conf /usr/local/etc/quagga/Quagga.conf } foreach file { bgpd ospfd ospf6d ripd ripngd vtysh zebra } { catch { nexec cp /dev/null /usr/local/etc/quagga/$file.conf } } @@ -633,11 +637,14 @@ proc deployCfg {} { # Called in special circumstances only. If cleans all # the imunes objects from the kernel (vimages and netgraph nodes). #**** -proc vimageCleanup {} { +proc vimageCleanup { eid } { global .c set t_start [clock seconds] - set vimages [join [nexec vimage -l | fgrep -v " " | cut -d: -f 1]] + if { [catch {nexec vimage $eid vimage -l | fgrep -v " " | cut -d: -f 1} res] != 0 } { + return + } + set vimages [join $res] set defindex [lsearch $vimages .] set vimages [lreplace $vimages $defindex $defindex] @@ -645,32 +652,31 @@ proc vimageCleanup {} { foreach vimage $vimages { set stattxt "Terminating processes in vimage $vimage" statline $stattxt - catch {nexec vimage $vimage kill -9 -1 2> /dev/null} + catch {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null} } # Detach / destroy / reassign interfaces pipe, eiface, iface, bridge - set ngnodes [split [nexec ngctl l | tail -n +3] " + set ngnodes [split [nexec vimage $eid ngctl l | tail -n +3] " "] foreach ngline $ngnodes { set node [lindex [eval list $ngline] 1] statline "Shutting down netgraph node $node" - catch "nexec ngctl msg $node: shutdown" + catch "nexec vimage $eid ngctl msg $node: shutdown" } # Shut down all vimages foreach vimage $vimages { set stattxt "Shutting down vimage $vimage" statline $stattxt - catch {nexec vimage $vimage kill -9 -1 2> /dev/null} - while { [catch {nexec vimage -d $vimage}] } { + catch {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null} + while { [catch {nexec vimage -d $eid.$vimage}] } { set stattxt $stattxt. statline $stattxt - catch {nexec vimage $vimage kill -9 -1 2> /dev/null} + catch {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null} } - nexec rm -fr /tmp/$vimage } + catch { nexec vimage -d $eid } catch { nexec rm -f /usr/local/etc/quagga/Quagga.conf } - catch { nexec mv /etc/resolv.conf.bak /etc/resolv.conf } statline "Cleanup completed in [expr [clock seconds] - $t_start] seconds." } @@ -894,7 +900,6 @@ proc cleanupCfg { } { #all the rest... catch { nexec rm -f /usr/local/etc/quagga/Quagga.conf } - catch { nexec mv /etc/resolv.conf.bak /etc/resolv.conf } statline "Cleanup completed in [expr [clock seconds] - $t_start] seconds." } diff --git a/filemgmt.tcl b/filemgmt.tcl index 3400f3a..0d0600c 100755 --- a/filemgmt.tcl +++ b/filemgmt.tcl @@ -1,4 +1,4 @@ -# $Id: filemgmt.tcl,v 1.12 2007/07/19 08:08:58 marko Exp $ +# $Id: filemgmt.tcl,v 1.13 2007/11/01 10:42:27 marko Exp $ # # Copyright 2004, 2005 University of Zagreb, Croatia. All rights reserved. # @@ -96,11 +96,11 @@ set fileTypes { # Loads an empty configuration, i.e. creates an empty project. #**** proc newFile {} { - global currentFile oper_mode + global currentFile oper_mode eid global canvas_list curcanvas undolevel redolevel if { $oper_mode == "exec" } { - vimageCleanup + vimageCleanup $eid } loadCfg "" set undolevel 0 diff --git a/imunes.tcl b/imunes.tcl index 6ff706d..752f9ce 100755 --- a/imunes.tcl +++ b/imunes.tcl @@ -1,4 +1,4 @@ -# $Id: imunes.tcl,v 1.26 2007/08/13 07:12:06 marko Exp $ +# $Id: imunes.tcl,v 1.27 2007/11/01 10:42:27 marko Exp $ # # Copyright 2004, 2005 University of Zagreb, Croatia. All rights reserved. # @@ -166,7 +166,7 @@ set node_list {} set link_list {} set annotation_list {} set canvas_list {} -set eid e0 +set eid imunes_[pid] #****v* imunes.tcl/exec_hosts # NAME @@ -275,7 +275,7 @@ if {$execMode == "interactive"} { loadCfg $cfg deployCfg } else { - vimageCleanup + vimageCleanup $eid } }