Uso delle script di automazione dei test ntkd su netkit

Alcune scripts sono state create (e con il tempo sono state e saranno corrette e migliorate) per facilitare le operazioni di test e debug di Netsukuku all'interno di un ambiente Netkit.

Le scripts si trovano nella directory scripts-netkit di netsukuku. Queste scripts vengono testate ed usate con le macchine virtuali di Netkit che montano il filesystem descritto in TestWithNetkit e con una macchina host con sistema Ubuntu.
Presumibilmente, dovrebbero funzionare in modo analogo con una qualsiasi distribuzione GNU/Linux moderna come sistema host.

L'obiettivo di queste script è quello di facilitare le seguenti operazioni:

Funzioni helper

Alcune operazioni sono state implementate come funzioni bash, negli script host_utils.bash e service.bash.

Il primo è utile per programmare le operazioni che deve svolgere il laboratorio nel suo insieme.
Per implementare un laboratorio si crea una script (di norma in una directory vuota) il cui compito è quello di avviare un certo numero di macchine virtuali.
In tale script si può importare (con il comando source o .) lo script host_utils.bash che definisce alcune funzioni utili alla macchina host.

Il secondo è utile per programmare le operazioni che deve svolgere una singola macchina virtuale.
Di solito ogni macchina virtuale si avvia specificando uno script da eseguire al suo interno come "boot". Lo script può risiedere anche all'esterno della macchina virtuale, ad esempio si può accedere tramite la pseudo-directory /hosthome/. Di norma si mette lo script di boot della macchina virtuale nella stessa directory in cui si è messo lo script di avvio del laboratorio a cui appartiene.
In tale script si può importare (con il comando source o .) lo script service.bash che definisce alcune funzioni utili alla macchina virtuale.

Creazione di un lab

Dimostriamo l'uso delle funzioni presenti negli scripts host_utils.bash e service.bash con un esempio.

Creiamo in una directory vuota all'interno della nostra home, il file launchlab.bash contenente:

#!/bin/bash

# Call base script to define functions.
. ~/netsukuku/scripts-netkit/host_utils.bash

# Find the directory where this script resides...
find_dir_script $0
SCRIPT_IS_HERE=$RET

# ... the way it is accessible from guest.
make_hosthome_path $SCRIPT_IS_HERE
DIRPATH=$RET

vstart -e ${DIRPATH}/service1.bash guest01 --eth0=A --eth1=B --mem=64 &>/dev/null
sleep 1
vstart -e ${DIRPATH}/service2.bash guest02 --eth0=B --eth1=C --mem=64 &>/dev/null
sleep 1
vstart -e ${DIRPATH}/service3.bash guest03 --eth0=C --eth1=D --mem=64 &>/dev/null
sleep 1
vstart -e ${DIRPATH}/service4.bash guest04 --eth0=D --eth1=E --mem=64 &>/dev/null
sleep 1

echo 'Lab launched.'

Nella stessa directory creiamo i files service1.bash, service2.bash, service3.bash e service4.bash. Il primo contiene:

#!/bin/bash

# Call base script to define functions.
. /hosthome/netsukuku/scripts-netkit/service.bash

# Find the directory where this script resides.
find_dir_script $0
SCRIPT_IS_HERE=$RET

launch_ntkd $SCRIPT_IS_HERE 0

echo "Virtual Machine 1: services started."
echo "logs to " $NTKD_OUTPUT

Negli altri cambiamo nella penultima riga il numero della VM e nella riga precedente il numero di secondi da attendere prima di avviare il demone.

Per una prima prova di laboratorio possiamo mettere 0 secondi per la prima macchina, 30 per la seconda, 60 per la terza e 90 per la quarta.

Ora avviamo, dalla directory in cui abbiamo salvato, lo script launchlab.bash

luca@luca-laptop:~/test-ntk/lab_1$ ./launchlab.bash
Lab launched.

Appaiono le console delle macchine virtuali. Al loro interno possiamo vedere (ad esempio in guest01)

--- Starting Netkit phase 2 init script ---
Executing /hosthome/test-ntk/lab_1/service1.bash ...
Virtual Machine 1: services started.
logs to  /hosthome/test-ntk/lab_1/guest01/ntkd.log
--- Netkit phase 2 initialization terminated ---

e dopo un po' di tempo compare alla console anche la dicitura:

ntkd daemon launched.

Questa dicitura compare quando viene avviato il demone, quindi la vedremo apparire nella prima console immediatamente, nella seconda dopo 30 secondi, e così via.

Quando saranno passati circa 3 minuti, possiamo dare all'interno delle macchine virtuali il comando 'ip route' per vedere se le rotte sono state impostate, e poi arrestarle con il comando 'halt'.

Vediamo ora nel dettaglio il significato delle script che abbiamo creato.

Avvio del laboratorio

Nella script launchlab.bash abbiamo fatto uso delle funzioni find_dir_script e make_hosthome_path (presenti in host_utils.bash) per recuperare la path delle directory in cui si trova la script, nel modo in cui si può raggiungere dell'interno della macchina virtuale.

Poi abbiamo avviato (con un sleep di 1 secondo tra l'una e l'altra) 4 macchine virtuali, dando ad ognuna come script di boot le script create in questa directory.

Dopo aver avviato le macchine virtuali la script termina.

Avvio del demone

Per ogni macchina virtuale, l'avvio del demone ntkd sarà gestito dal suo script di boot, che importa lo script service.bash.

Per avviare il demone ad un determinato istante è sufficiente richiamare la funzione launch_ntkd (presente in service.bash) specificando la directory su cui salvare i logs e i secondi da attendere.

Per salvare i logs nella stessa directory in cui si trovano gli script del laboratorio si può usare la funzione find_dir_script (presente in service.bash)

La funzione launch_ntkd ritorna subito, anche se ad esempio si richiedesse un delay di 30 secondi. E alla sua uscita sono valorizzate le variabili:

Il PID del demone può essere usato con la funzione kill_generation (presente in service.bash) per terminare il processo.

Siccome la funzione launch_ntkd ritorna subito, la script prosegue e noi vediamo immediatamente la dicitura Virtual Machine 1: services started e solo dopo un po' di tempo la dicitura ntkd daemon launched.
Inoltre questo è necessario per avere immediatamente il prompt dei comandi nella console della macchina virtuale.

Altre possibili operazioni programmate

Nello script abbiamo specificato dopo quanto tempo avviare il demone ntkd. Prima di terminare lo script, possiamo "schedulare" altre operazioni.

Ad esempio questo script:

#!/bin/bash

# Call base script to define functions.
. /hosthome/netsukuku/scripts-netkit/service.bash

delay_then_kill()
{
 DELAY=$1
 NTKD_PID=$2
 sleep $DELAY
 kill_generation $NTKD_PID
 echo "launch_ntkd killed."
}

# Find the directory where this script resides.
find_dir_script $0
SCRIPT_IS_HERE=$RET

launch_ntkd $SCRIPT_IS_HERE 0

delay_then_kill 180 $NTKD_PID &

echo "Virtual Machine 1: services started."
echo "logs to " $NTKD_OUTPUT

avvia immediatamente il demone; di seguito avvia in background una funzione che interromperà il demone dopo 180 secondi.

Visualizzazione log

Nell'output prodotto dal demone si trovano i log.
Ogni riga contiene la data e il tipo di informazione (ULTRADEBUG livello 4, DEBUG livello 3, INFO livello 2, WARNING livello 1, ERROR livello 0).
Questo ci permette di filtrare le informazioni in eccesso e ordinare cronologicamente i log provenienti anche da diverse macchine virtuali.

Per facilitare queste operazioni ci sono le scripts view_logs.bash e view_short_ip_cmds.bash.

view_logs.bash prende come primo parametro il livello di informazioni desiderato e di seguito i files con i log.
Ad esempio

~/netsukuku/scripts-netkit/view_logs.bash 2 guest01/ntkd.log guest02/ntkd.log guest03/ntkd.log guest04/ntkd.log

produce in output i log in ordine cronologico, fino al livello INFO. I log provenienti dalla prima macchina virtuale sono allineati a sinistra. Quelli della seconda sono indentati di 3 spazi, della terza di 6 e così via.

view_short_ip_cmds.bash prende come parametri solo i files con i log.
Ad esempio

~/netsukuku/scripts-netkit/view_short_ip_cmds.bash guest01/ntkd.log guest02/ntkd.log guest03/ntkd.log guest04/ntkd.log

produce solo le informazioni riguardanti la tabella di routing del kernel. Anche in questo caso indentati in base all'ordine dei files specificati.

Raccolta informazioni

Lo script net_info.bash va eseguito all'interno della macchina virtuale.
Produce sullo standard output informazioni su:

Lo script collect_ips.bash va eseguito all'interno della macchina virtuale. Fa uso dello script net_info.bash.
Produce sullo standard output un elenco di indirizzi IP che riesce a raccogliere.

Netsukuku/ita/ScriptsWithNetkit (last edited 2009-10-02 08:43:11 by lukisi)