Bonne utilisation

Utilisez l'option -h avec n'importe quelle commande happy-* pour afficher l'aide et la liste des options de cette commande.

Fichiers d'état

Happy stocke et gère soigneusement son état de topologie dans un fichier JSON avec un seul enregistrement. À l'aide de ce fichier d'état, Happy peut exécuter les commandes appropriées pour créer ou supprimer une topologie.

Le fichier d'état par défaut se trouve à l'emplacement ~/.happy_state.json. Le nom d'état par défaut est happy, comme indiqué dans la sortie happy-state:

happy-state

State Name:  happy

États parallèles

Happy accepte plusieurs états parallèles coexistants. L'état actuel est dicté par la variable d'environnement HAPPY_STATE_ID. Si HAPPY_STATE_ID n'existe pas dans l'environnement, la valeur d'état par défaut de happy est utilisée.

HAPPY_STATE_ID n'est pas créé lors de l'installation de Happy. Créez-en une avec une valeur autre que state pour passer immédiatement à un autre état "Happy".

export HAPPY_STATE_ID="sunny"

Si vous vérifiez happy-state, vous obtenez un état différent:

happy-state

State Name:  sunny

Chaque état est conservé dans son propre fichier ~/.${HAPPY_STATE_ID}_state.json. Pour basculer entre les états, exécutez à nouveau la commande export HAPPY_STATE_ID="<state-name>".

Désinstallation avec états parallèles

Si vous utilisez des états "Happy" parallèles et que vous souhaitez désinstaller "Happy", veillez à exécuter happy-state-delete avec chaque état actif. Cela garantit que tous les espaces de noms réseau créés par Happy sont supprimés de votre système sans affecter la configuration réseau de l'hôte Linux.

Par exemple, avec deux états de happy et sunny:

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

Supprimez manuellement chaque fichier d'état parallèle si nécessaire:

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

Journaux

Happy envoie des journaux à syslog par défaut. Une deuxième sauvegarde de journal est envoyée à /tmp/${HAPPY_STATE_ID}_debug_log.txt.

Pour afficher les journaux Happy, exécutez happy-state -l dans une fenêtre de terminal distincte. Lorsque vous saisissez des commandes Happy, les journaux affichent les problèmes Happy des commandes shell en arrière-plan. C'est un bon moyen de comprendre le fonctionnement de Happy, si vous êtes intéressé par les espaces de noms réseau Linux.

Par exemple, happy-node-add node00 crée un nœud "Happy". La sortie du journal pour cette commande est la suivante:

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

Toutes les lignes Driver:CallCmd() sont les commandes shell que Happy appelle. Examinez chaque ligne du journal:

# 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

Exemples de topologies

Des exemples de topologies sont inclus dans les dépôts Happy et OpenWeave à des fins de test. Utilisez-les également pour apprendre les commandes permettant de créer des topologies complexes.

Les topologie sont au format JSON et Shell Script.

JSON

Les fichiers de topologie JSON sont chargés à l'aide des commandes happy-state-load ou weave-state-load. Si la topologie inclut Weave, vous devez utiliser weave-state-load pour la charger, sinon les commandes spécifiques à Weave sont ignorées.

Par exemple, une topologie sans Weave:

happy-state-load thread_wifi_ap_internet.json

Topologie avec Weave:

weave-state-load three_nodes_on_thread_weave.json

Pour enregistrer votre topologie actuelle dans un fichier JSON distinct en vue d'une utilisation ultérieure (par exemple, un script de scénario de test), utilisez happy-shell -s:

happy-shell -s my_topology.json

Le fichier d'état de la topologie est alors enregistré dans le répertoire $HOME.

Scripts shell

Les fichiers de topologie de script shell contiennent l'ensemble des commandes Happy et Weave permettant de créer les topologies dans les fichiers JSON correspondants. Par défaut, ces scripts ne disposent pas d'autorisations d'exécution. Vous pouvez les exécuter de deux manières:

À l'aide de la commande bash:

bash thread_wifi_ap_internet.sh

En appliquant des autorisations d'exécution:

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

Configuration

Happy dispose de trois fichiers de configuration:

Fichier de configurationDescription
~/.happy_conf.jsonVariables de configuration pour un usage personnel ou pour les plug-ins. Définissez ces valeurs à l'aide de la commande happy-configuration.
<path-to-happy>/happy/conf/main_config.jsonVariables de configuration principales de Happy.
<path-to-happy>/happy/conf/log_config.jsonConfiguration des journaux.

Ajouter des variables de configuration

Nous vous recommandons d'utiliser la commande happy-configuration pour définir des variables personnelles ou de plug-in en plus des valeurs par défaut dont votre déploiement spécifique de Happy a besoin.

Par exemple, pour indiquer à Happy où trouver le répertoire test-apps Weave pour les scripts de test, définissez la variable weave_path:

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

Happy stocke les variables de configuration dans ~/.happy_conf.json.

Processus dans les nœuds

Happy fournit des commandes pour démarrer et arrêter des processus dans des nœuds simulés.

Pour démarrer un processus:

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

Par exemple, pour exécuter un ping en continu dans un nœud nommé ThreadNode:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

Dans l'exemple ci-dessus, ContinuousPing est le nom défini par l'utilisateur pour le processus que Happy utilise pour le gérer. Utilisez happy-process-wait pour suspendre l'exécution du processus et happy-process-stop pour arrêter le processus.

La sortie du processus se trouve dans /tmp. Par exemple, après avoir lancé le processus ContinuousPing, vérifiez le répertoire /tmp:

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

Ce fichier .out contient la sortie du processus ContinuousPing.

Utilisation de sudo

Happy modifie la configuration réseau contrôlée par le noyau Linux. Étant donné que seul root peut modifier la configuration du kernel, Happy vous invite à saisir le mot de passe sudo pendant l'opération.

Happy utilise la variable d'environnement système $SUDO pour appeler sudo. Si $SUDO n'est pas défini, Happy effectue un appel sudo normal.

Script Python

Après l'installation, les packages Happy Python peuvent être importés dans un environnement Python à l'aide de l'instruction import suivante:

import happy

Les modules de commande individuels trouvés dans /happy sont importés comme suit:

import happy.HappyNodeAdd

Pour récupérer les options du module, appelez la fonction option(). Par exemple, pour récupérer les options du module HappyNodeAdd:

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