Happy Usage

Utilizza il flag -h con qualsiasi comando happy-* per visualizzare la guida e l'elenco di opzioni per quel comando.

File di stato

Happy memorizza e gestisce attentamente il proprio stato di topologia in un file JSON con un singolo record. Utilizzando questo file di stato, Happy può eseguire i comandi appropriati per creare o rimuovere una topologia.

Il file dello stato predefinito si trova in ~/.happy_state.json. Il nome predefinito dello stato è happy, come mostrato nell'output di happy-state:

happy-state

State Name:  happy

Stati paralleli

Happy supporta più stati paralleli coesistenti. Lo stato attuale è dettato dalla variabile di ambiente HAPPY_STATE_ID. Se HAPPY_STATE_ID non esiste nell'ambiente, viene utilizzato il valore predefinito dello stato happy.

HAPPY_STATE_ID non viene creato durante l'installazione di Happy. Creane uno con un valore diverso da state per passare immediatamente a un altro stato Happy.

export HAPPY_STATE_ID="sunny"

Ora il controllo di happy-state restituisce uno stato diverso:

happy-state

State Name:  sunny

Ogni stato viene gestito nel proprio file ~/.${HAPPY_STATE_ID}_state.json. Per cambiare stato, esegui di nuovo il comando export HAPPY_STATE_ID="<state-name>".

Disinstalla con stati paralleli

Se utilizzi gli stati Happy paralleli e vuoi disinstallare Happy, assicurati di eseguire happy-state-delete con ogni stato attivo. Ciò garantisce che tutti gli spazi dei nomi di rete creati da Happy vengano rimossi dal sistema senza influire sulla configurazione della rete host Linux.

Ad esempio, con due stati happy e sunny:

export HAPPY_STATE_ID="sunny"
happy-state-delete
export HAPPY_STATE_ID="happy"
happy-state-delete

Rimuovi manualmente ogni file di stato parallelo in base alle tue esigenze:

rm -f ~/.sunny_state.json
rm -f ~/.sunny_state.json.lock
rm -f ~/.happy_state.json
rm -f ~/.happy_state.json.lock

Log

Happy invia i log a syslog per impostazione predefinita. Un secondo backup dei log viene inviato a /tmp/${HAPPY_STATE_ID}_debug_log.txt.

Per visualizzare i log di Happy, esegui happy-state -l in una finestra separata del terminale. Quando inserisci comandi Happy, i log mostrano i comandi della shell sui problemi relativi a Happy in background. Questo è un buon modo per capire come funziona Happy, se ti interessano gli spazi dei nomi di rete Linux.

Ad esempio, happy-node-add node00 crea un nodo Felice. L'output del log per questo comando è:

DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 does not exist
DEBUG [Driver:writeState():365] Happy: writing Happy state to file
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns add happy000
DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 exists
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ifconfig lo up

Tutte le righe Driver:CallCmd() sono i comandi shell chiamati da Happy. Esamina ogni riga del log:

# Check to see if the target namespace (happy000) exists
DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 does not exist

# Write the link between node00 and happy000 in ~/.happy_state.json
DEBUG [Driver:writeState():365] Happy: writing Happy state to file

# Create the network namespace for the node
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns add happy000

# Check to see if the target namespace (happy000) exists
DEBUG [HappyHost:_namespaceExists():56] Happy: namespace happy000 exists

# Bring up the loopback interface within the happy000 namespace
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ifconfig lo up

Topologie di esempio

Le topologie di esempio sono incluse nei repository Happy e OpenWeave per il test. Inoltre, utilizzali per imparare i comandi per costruire topologie complesse.

Le topologie sono in formato JSON e script shell.

JSON

I file di topologia JSON vengono caricati utilizzando i comandi happy-state-load o weave-state-load. Se la topologia include Weave, devi utilizzare weave-state-load per caricare la topologia, altrimenti i comandi specifici di Weave vengono ignorati.

Ad esempio, una topologia senza Weave:

happy-state-load thread_wifi_ap_internet.json

Una topologia con Weave:

weave-state-load three_nodes_on_thread_weave.json

Per salvare la topologia corrente come file JSON separato per utilizzarla in un secondo momento (ad esempio uno script di test case), utilizza happy-shell -s:

happy-shell -s my_topology.json

Il file dello stato della topologia viene salvato nella directory $HOME.

Script shell

I file di topologia di script shell contengono l'insieme di comandi Happy e Weave per creare le topologie nei file JSON corrispondenti. Per impostazione predefinita, questi script non dispongono di autorizzazioni eseguibili. Possono essere eseguiti in due modi:

Utilizzando il comando bash:

bash thread_wifi_ap_internet.sh

Se applichi le autorizzazioni eseguibili:

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

Configurazione

Happy ha tre file di configurazione:

File di configurazioneDescrizione
~/.happy_conf.jsonVariabili di configurazione per uso personale o plug-in. Imposta questi valori utilizzando il comando happy-configuration.
<path-to-happy>/happy/conf/main_config.jsonVariabili di configurazione principali di Happy.
<path-to-happy>/happy/conf/log_config.jsonConfigurazione dei log.

Aggiungi variabili di configurazione

Ti consigliamo di utilizzare il comando happy-configuration per impostare eventuali variabili personali o dei plug-in oltre a quelle predefinite necessarie per il tuo deployment specifico di Happy.

Ad esempio, per far sapere ad Happy dove trovare la directory test-apps di Weave per gli script di test, imposta la variabile weave_path:

happy-configuration weave_path <path-to-openweave-core>/build/x86_64-unknown-linux-gnu/src/test-apps

Le variabili di configurazione di Happy Stores in ~/.happy_conf.json.

Processi nei nodi

Happy fornisce i comandi per avviare e arrestare i processi all'interno dei nodi simulati.

Per avviare una procedura:

happy-process-start <node-name> <custom-process-name> <command>

Ad esempio, per eseguire continuamente un ping in un nodo denominato ThreadNode:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

Nell'esempio riportato sopra, ContinuousPing è il nome definito dall'utente per il processo utilizzato da Happy per gestirlo. Utilizza happy-process-wait per sospendere l'esecuzione del processo e happy-process-stop per interromperlo.

L'output del processo è in /tmp. Ad esempio, dopo aver avviato il processo ContinuousPing, controlla la directory /tmp:

ls /tmp/happy*
/tmp/happy_018691_1524087014.192197_ContinuousPing.out

Questo file .out contiene l'output del processo ContinuousPing.

Utilizzo di sudo

Happy modifica la configurazione di rete controllata dal kernel Linux. Poiché solo root può modificare la configurazione del kernel, Happy ti chiede di inserire la password di sudo durante il funzionamento.

Happy utilizza la variabile di ambiente di sistema $SUDO per chiamare sudo. Se $SUDO non è definito, Happy effettua una normale chiamata a sudo.

Scripting Python

Dopo l'installazione, i pacchetti Happy Python possono essere importati in un ambiente Python utilizzando la seguente istruzione import:

import happy

I singoli moduli di comando trovati in /happy vengono importati come segue:

import happy.HappyNodeAdd

Per recuperare le opzioni del modulo, chiama la funzione option(). Ad esempio, per recuperare le opzioni del modulo HappyNodeAdd:

module options
import happy.HappyNodeAdd
options = happy.HappyNodeAdd.option()