From f7eeee13553959a0eb1a848b66c77a80c9a05140 Mon Sep 17 00:00:00 2001 From: numa Date: Thu, 3 Sep 2009 13:43:38 +0200 Subject: [PATCH] dodatni debugging posvuda; uhvaceno jos FreeBSD-specific nexeca; implementiran osnovni Linux/OpenVZ create/start i stop/destroy --- exec.tcl | 284 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 172 insertions(+), 112 deletions(-) diff --git a/exec.tcl b/exec.tcl index b6a77e0..4d7442f 100755 --- a/exec.tcl +++ b/exec.tcl @@ -64,6 +64,7 @@ proc nexec { args } { if { $remote_exec } { rexec $execSock $args } else { + puts "-- running: $args" eval exec $args } } @@ -262,9 +263,29 @@ proc l3node.instantiate { eid node } { puts "l3node.instantiate $eid $node" set node_id "$eid\.$node" +# OpenVZ VE ID moze biti samo numericki, dok nas node_id sadrzi +# delimiter tocku i slovo n, pa te znakove moramo izbaciti + set openvz_node_id $eid[string range $node 1 end] + +# ovdje bismo mogli napraviti OpenVZ conf file za ovaj node +# ali pustamo vzctl create da ga sam automatski izgenerira iz +# vps-basic sample datoteke u /etc/vz/conf/ + puts " nexec vimage -c $node_id " + nexec vzctl create $openvz_node_id --ostemplate imunes-openvz + +# Dodjela naseg kratkog node ida njegovom numerickom VE ID-u opcijom --name +# TODO: ako bude potreban support za vise paralelenih eksperimenata, +# trebat ce VE name podesiti s prefiksom $eid (i analogno u vimageCleanup) + nexec vzctl set $openvz_node_id --name $node --save + puts " nexec vimage $node_id hostname [getNodeName $node] " - puts " nexec vimage $node_id sysctl vfs.morphing_symlinks=1 " + nexec vzctl set $node --hostname [getNodeName $node] --save + +# feature FreeBSD-a only (expandanje @ u symlinkovima kao node id) +# puts " nexec vimage $node_id sysctl vfs.morphing_symlinks=1 " + + nexec vzctl start $node foreach ifc [ifcList $node] { switch -exact [string range $ifc 0 2] { @@ -314,12 +335,13 @@ proc l3node.instantiate { eid node } { puts { nexec vimage -m $node_id cpuweight $cpuweight } } - puts " - nexec vimage $node_id sysctl net.inet.icmp.bmcastecho=1 - nexec vimage $node_id sysctl net.inet.icmp.icmplim=0 - nexec vimage $node_id ifconfig lo0 inet localhost - nexec vimage $node_id route add 224.0.0.0/4 localhost - " +# FreeBSD-only +# puts " +# nexec vimage $node_id sysctl net.inet.icmp.bmcastecho=1 +# nexec vimage $node_id sysctl net.inet.icmp.icmplim=0 +# nexec vimage $node_id ifconfig lo0 inet localhost +# nexec vimage $node_id route add 224.0.0.0/4 localhost +# " } @@ -372,12 +394,15 @@ proc l3node.start { eid node } { puts "l3node.start $eid $node" set node_id "$eid\.$node" - set node_dir "/tmp/$eid/$node" - puts " recreating $node_dir" - nexec rm -fr $node_dir - nexec mkdir $node_dir - nexec chmod 1777 $node_dir +# na FreeBSD-u vimagei imaju shared filesystem +# na Linuxu VEovi to nemaju +# set node_dir "/tmp/$eid/$node" + + puts " would recreate node_dir (/tmp/$eid/$node)" +# nexec rm -fr $node_dir +# nexec mkdir $node_dir +# nexec chmod 1777 $node_dir foreach ifc [ifcList $node] { set mtu [getIfcMTU $node $ifc] puts " nexec vimage $node_id ifconfig $ifc mtu $mtu " @@ -410,15 +435,16 @@ proc l3node.start { eid node } { set ipsecCfg "" if { [getIpsecEnabled $node] == true } { - set setkeycfg [ipsecCfggen $node] - set setkeyFileId [open $node_dir/setkey.conf w+] - foreach line $setkeycfg { - puts $setkeyFileId $line - } - close $setkeyFileId + puts " would do the ipsecenabled stuff" +# +# set setkeycfg [ipsecCfggen $node] +# set setkeyFileId [open $node_dir/setkey.conf w+] +# foreach line $setkeycfg { +# puts $setkeyFileId $line +# } +# close $setkeyFileId - set errorstr "" - puts " doing the set error setkeyError" +# set errorstr "" # set error [catch "nexec vimage $node_id setkey -f \ # $node_dir/setkey.conf" errorstr] # if { $error == "1" } { @@ -432,11 +458,12 @@ proc l3node.start { eid node } { } puts " imamo typemodel=[typemodel $node] bootcfg=$bootcfg i bootcmd=$bootcmd" if { ! $remote_exec } { - set fileId [open $node_dir/boot.conf w] - foreach line $bootcfg { - puts $fileId $line - } - close $fileId + puts " would write node_dir/boot.conf" +# set fileId [open $node_dir/boot.conf w] +# foreach line $bootcfg { +# puts $fileId $line +# } +# close $fileId } else { nexec create_conf_file $node_dir/boot.conf foreach line $bootcfg { @@ -445,7 +472,8 @@ proc l3node.start { eid node } { nexec close_conf_file } - puts " catch nexec vimage $node_id $bootcmd $node_dir/boot.conf >& $node_dir/out.log &" + puts " would execute bootcmd boot.conf in $node_id" +# catch nexec vimage $node_id $bootcmd $node_dir/boot.conf >& $node_dir/out.log &" } #****f* exec.tcl/l3node.shutdown @@ -491,16 +519,21 @@ proc l3node.shutdown { eid node } { proc l3node.destroy { eid node } { set node_id $node foreach ifc [ifcList $node] { - puts { nexec vimage $eid ngctl msg $ifc@$node_id: shutdown } + puts " nexec vimage $eid ngctl msg $ifc@$node_id: shutdown " + set ifnum [string range $ifc 3 end] set ifname [string range $ifc 0 2] if { $ifname == "ser" } { - puts { nexec vimage $eid ngctl msg hdlc$ifnum@$node_id: shutdown } + puts " nexec vimage $eid ngctl msg hdlc$ifnum@$node_id: shutdown " } } - puts {nexec vimage -d $node_id} - set node_dir "/tmp/$eid/$node" - nexec rm -fr $node_dir + puts "nexec vimage -d $node_id" + nexec vzctl stop $node + nexec vzctl destroy $node + +# FreeBSD only node_dir: +# set node_dir "/tmp/$eid/$node" +# nexec rm -fr $node_dir } @@ -538,9 +571,9 @@ proc deployCfg {} { # network peeringe izmedju nodeova # na Linuxu to necemo napraviti jer ne mozemo dirati network linkove # jednog VEa iz drugog, pa ce to sve biti na parent hostu - puts " nexec vimage -c $eid " - puts " nexec rm -fr /tmp/$eid " - puts " nexec mkdir /tmp/$eid " +# puts " nexec vimage -c $eid " +# puts " nexec rm -fr /tmp/$eid " +# puts " nexec mkdir /tmp/$eid " # puts { nexec kldload ng_ether } # puts { nexec kldload ng_iface } @@ -552,6 +585,7 @@ proc deployCfg {} { # puts { nexec kldload ng_socket } foreach node $node_list { + # OpenVZ VE name format su brojke (bez tocaka) set node_id "$eid\.$node" set type [nodeType $node] set name [getNodeName $node] @@ -672,90 +706,116 @@ proc vimageCleanup { eid } { puts "vimageCleanup $eid" set t_start [clock seconds] - if { [catch {nexec vimage $eid vimage -lr | fgrep -v " " | cut -d: -f 1} res] != 0 } { - return - } - set vimages [join $res] - set defindex [lsearch $vimages .] - set vimages [lreplace $vimages $defindex $defindex] - # Wait for TIME_WAIT timeout in all vimages - set vrti 1 - set sec 60 +## FreeBSD-only bug workaround: +# puts " would check vimage $eid vimage -lr \| fgrep -v \" \" \| cut -d: -f 1" +# if { [ catch {nexec vimage $eid vimage -lr | fgrep -v " " | cut -d: -f 1} res] != 0 } { +# return +# } +# set vimages [join $res] +# set defindex [lsearch $vimages .] +# set vimages [lreplace $vimages $defindex $defindex] + +# # Wait for TIME_WAIT timeout in all vimages +# set vrti 1 +# set sec 60 + +# if { $execMode == "batch" } { +# puts "\nDue to the known bug we must wait for TIME_WAIT expiration on virtual nodes (up to 60 sec). " +# puts "Please don't try killing the process." +# } else { +# # wm title $wi "Please wait ..." +# set w .timewait +# puts {destroy $w} +# toplevel $w -takefocus 1 +# wm geometry $w +150+150 +# wm title $w "Please wait ..." +# message $w.msg -justify left -aspect 1200 \ +# -text "\nDue to the known bug we must wait for TIME_WAIT expiration on virtual nodes (up to 60 sec). +#Please don't try killing the process. +#(countdown on status line)\n" +# pack $w.msg +# update +# grab $w +# } +# while { $vrti == 1 } { +# set vrti 0 +# foreach vimage $vimages { +# puts "vimage $vimage...\n" +# puts "checking netstat -an -f inet | fgrep WAIT..." +# while { [catch {nexec vimage $eid.$vimage netstat -an -f inet | fgrep "WAIT"} odg] == 0} { +# set vrti 1 +# # puts "vimage $vimage: \n$odg\n" +# after 2000 +# set sec [expr $sec - 2] +# if { $execMode == "batch" } { +# puts -nonewline "." +# flush stdout +# } else { +# statline "~ $sec sec ..." +# pack $w.msg +# update +# } +# } +# } +# } +# if { $execMode == "batch" } { +# puts "" +# } else { +# destroy .timewait +# } + +# FreeBSD vimage only +# # Kill all processes in all vimages +# foreach vimage $vimages { +# set stattxt "Terminating processes in vimage $vimage" +# statline $stattxt +# puts "nexec vimage $eid.$vimage kill -9 -1 2> /dev/null" +# } + +# FreeBSD netgraph only +# # Detach / destroy / reassign interfaces pipe, eiface, iface, bridge +# puts "running vimage $eid 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" +# puts "nexec vimage $eid ngctl msg $node: shutdown" +# } - if { $execMode == "batch" } { - puts "\nDue to the known bug we must wait for TIME_WAIT expiration on virtual nodes (up to 60 sec). " - puts "Please don't try killing the process." - } else { - # wm title $wi "Please wait ..." - set w .timewait - puts {destroy $w} - toplevel $w -takefocus 1 - wm geometry $w +150+150 - wm title $w "Please wait ..." - message $w.msg -justify left -aspect 1200 \ - -text "\nDue to the known bug we must wait for TIME_WAIT expiration on virtual nodes (up to 60 sec). -Please don't try killing the process. -(countdown on status line)\n" - pack $w.msg - update - grab $w - } - while { $vrti == 1 } { - set vrti 0 - foreach vimage $vimages { - # puts "vimage $vimage...\n" - while { [catch {nexec vimage $eid.$vimage netstat -an -f inet | fgrep "WAIT"} odg] == 0} { - set vrti 1 - # puts "vimage $vimage: \n$odg\n" - after 2000 - set sec [expr $sec - 2] - if { $execMode == "batch" } { - puts -nonewline "." - flush stdout - } else { - statline "~ $sec sec ..." - pack $w.msg - update - } - } - } - } - if { $execMode == "batch" } { - puts "" - } else { - destroy .timewait - } - # Kill all processes in all vimages - foreach vimage $vimages { - set stattxt "Terminating processes in vimage $vimage" + # Shut down all vimages + + # OpenVZ - samo nam treba popis nodeova za pogasiti + upvar 0 ::cf::[set ::curcfg]::node_list node_list + foreach node $node_list { + set stattxt "Stopping VE $node" statline $stattxt - puts {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null} + nexec vzctl stop $node + set stattxt "Destroying VE $node" + statline $stattxt + nexec vzctl destroy $node } - # Detach / destroy / reassign interfaces pipe, eiface, iface, bridge - 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" - puts "nexec vimage $eid ngctl msg $node: shutdown" - } + puts "*** missing bridge cleanup in main host" + +# FreeBSD metoda: +# foreach vimage $vimages { +# set stattxt "Shutting down vimage $vimage" +# statline $stattxt +# puts "nexec vimage $eid.$vimage kill -9 -1 2> /dev/null" +# while { [catch {nexec vimage -d $eid.$vimage}] } { +# set stattxt $stattxt. +# statline $stattxt +# puts "nexec vimage $eid.$vimage kill -9 -1 2> /dev/null" +# } +# } +# puts " nexec vimage -d $eid " - # Shut down all vimages - foreach vimage $vimages { - set stattxt "Shutting down vimage $vimage" - statline $stattxt - puts {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null} - while { [catch {nexec vimage -d $eid.$vimage}] } { - set stattxt $stattxt. - statline $stattxt - puts {nexec vimage $eid.$vimage kill -9 -1 2> /dev/null} - } - } - puts { nexec vimage -d $eid } - puts { nexec rm -f /usr/local/etc/quagga/Quagga.conf } - nexec rm -fr "/tmp/$eid" +# puts " nexec rm -f /usr/local/etc/quagga/Quagga.conf " + +# FreeBSD-only ciscenje eid tmp dira +# nexec rm -fr "/tmp/$eid" statline "Cleanup completed in [expr [clock seconds] - $t_start] seconds." } -- 2.39.5