= 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|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:
* Creazione di uno scenario (chiamato anche ''lab''), anche complesso, che possa essere avviato con un solo comando.
* Salvataggio e successiva visualizzazione dei logs prodotti dalle istanze di {{{ntkd}}} che girano sulle diverse macchine del lab.
* Avvio in tempi prestabiliti sia del demone {{{ntkd}}}, sia di comandi utili a testare la connettività della rete.
* {{{...}}}
== 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
#!/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
#!/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:
. ''{{{NTKD_OUTPUT}}}'': path del file in cui vengono salvati i log del demone ntkd;
. ''{{{NTKD_PID}}}'': identificativo del processo del demone.
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
#!/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:
* le interfacce di rete presenti nel sistema (una riga che inizia con "{{{nic}}}" per ogni interfaccia)
* l'indirizzo IP proprio del sistema
. una unica riga che inizia con "{{{addr}}}";
. si presume che il sistema usi netsukuku, quindi abbia un solo indirizzo;
. si presume anche che il sistema abbia l'interfaccia eth0.
* i vicini noti al sistema (una riga che inizia con "{{{neighbour}}}" per ogni vicino)
* gli altri nodi e gnodi della rete verso i quali il sistema ha una rotta;
. una riga che inizia con "{{{gnode_1}}}" per ogni nodo appartenente al nostro stesso gnodo di livello 1.
. una riga che inizia con "{{{gnode_2}}}" per ogni gnodo di livello 1 appartenente al nostro stesso gnodo di livello 2.
. una riga che inizia con "{{{gnode_3}}}" per ogni gnodo di livello 2 appartenente al nostro stesso gnodo di livello 3.
. una riga che inizia con "{{{gnode_4}}}" per ogni gnodo di livello 3 appartenente al nostro stesso gnodo di livello 4.
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.
* Il proprio IP
* Quelli dei vicini
* Quelli del primo nodo che incontra su ogni gnodo nella mappa