Uso satisfecho

Usa la marca -h con cualquier comando happy-* para ver la ayuda y la lista de opciones de ese comando.

Archivos de estado

Almacena Happy y mantiene cuidadosamente su estado de topología en un archivo JSON con un registro único. Con este archivo de estado, Happy puede ejecutar los comandos adecuados para crear o quitar una topología.

El archivo de estado predeterminado se encuentra en ~/.happy_state.json. El nombre de estado predeterminado es happy, como se ve en el resultado de happy-state:

happy-state

State Name:  happy

Estados paralelos

Happy admite varios estados paralelos coexistentes. El estado actual lo determina la variable de entorno HAPPY_STATE_ID. Si HAPPY_STATE_ID no existe en el entorno, se usa el valor de estado predeterminado de happy.

No se crea HAPPY_STATE_ID durante la instalación de Happy. Crea uno con un valor diferente de state para cambiar inmediatamente a otro estado de "Satisfecho".

export HAPPY_STATE_ID="sunny"

Ahora, verifica los resultados de happy-state en un estado diferente:

happy-state

State Name:  sunny

Cada estado se mantiene en su propio archivo ~/.${HAPPY_STATE_ID}_state.json. Para cambiar entre estados, vuelve a ejecutar el comando export HAPPY_STATE_ID="<state-name>".

Desinstalación con estados paralelos

Si usas estados Happy en paralelo y quieres desinstalar Happy, asegúrate de ejecutar happy-state-delete con cada estado activo. Esto garantiza que todos los espacios de nombres de red que creó Happy se quiten de tu sistema sin afectar la configuración de red del host de Linux.

Por ejemplo, con dos estados de happy y sunny:

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

Quita manualmente cada archivo de estado en paralelo según sea necesario:

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

Registros

Happy envía registros a syslog de forma predeterminada. Se envía una segunda copia de seguridad del registro a /tmp/${HAPPY_STATE_ID}_debug_log.txt.

Para ver los registros de Happy, ejecuta happy-state -l en una ventana de terminal independiente. Cuando ingresas comandos Happy, los registros muestran los problemas de Happy de los comandos de shell en segundo plano. Esta es una buena manera de comprender cómo funciona Happy si te interesan los espacios de nombres de red de Linux.

Por ejemplo, happy-node-add node00 crea un nodo Happy. El resultado del registro de este comando es el siguiente:

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

Todas las líneas Driver:CallCmd() son los comandos de shell que llama Happy. Considera cada línea del registro:

# 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

Topologías de muestra

Las topologías de muestra se incluyen en los repositorios de Happy y OpenWeave para pruebas. También puedes usarlas para aprender los comandos que permiten construir topologías complejas.

Las topologías están en formato JSON y de secuencia de comandos de shell.

JSON

Los archivos de topología JSON se cargan con los comandos happy-state-load o weave-state-load. Si la topología incluye Weave, debes usar weave-state-load para cargarla. De lo contrario, se omitirán los comandos específicos de Weave.

Por ejemplo, en una topología sin Weave, se muestra lo siguiente:

happy-state-load thread_wifi_ap_internet.json

Una topología con Weave:

weave-state-load three_nodes_on_thread_weave.json

Para guardar tu topología actual como un archivo JSON independiente para usarla más adelante (por ejemplo, una secuencia de comandos de caso de prueba), usa happy-shell -s:

happy-shell -s my_topology.json

Esto guarda el archivo de estado de la topología en el directorio $HOME.

Secuencias de comandos de shell

Los archivos de topología de secuencia de comandos de shell contienen el conjunto de comandos Happy y Weave para crear las topologías en los archivos JSON correspondientes. De forma predeterminada, estas secuencias de comandos no tienen permisos ejecutables. Se pueden ejecutar de dos maneras:

Mediante el comando bash:

bash thread_wifi_ap_internet.sh

Cuando se aplican permisos ejecutables, ocurre lo siguiente:

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

Configuración

Happy tiene tres archivos de configuración:

Archivo de configuraciónDescripción
~/.happy_conf.jsonSon variables de configuración para uso personal o de complementos. Establece estos valores con el comando happy-configuration.
<path-to-happy>/happy/conf/main_config.jsonVariables de configuración principales de Happy
<path-to-happy>/happy/conf/log_config.jsonConfiguración de registros.

Agrega variables de configuración

Te recomendamos que uses el comando happy-configuration para establecer variables personales o de complementos más allá de los valores predeterminados que necesita tu implementación específica de Happy.

Por ejemplo, para que Happy sepa dónde encontrar el directorio test-apps de Weave para las secuencias de comandos de prueba, configura la variable weave_path:

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

Happy almacena las variables de configuración en ~/.happy_conf.json.

Procesos en nodos

Happy proporciona comandos para iniciar y detener procesos dentro de nodos simulados.

Para iniciar un proceso, sigue estos pasos:

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

Por ejemplo, para ejecutar un ping de forma continua en un nodo llamado ThreadNode, haz lo siguiente:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

En el ejemplo anterior, ContinuousPing es el nombre definido por el usuario para el proceso que Happy usa para administrarlo. Usa happy-process-wait para suspender la ejecución del proceso y happy-process-stop para finalizarlo.

El resultado del proceso está en /tmp. Por ejemplo, después de iniciar el proceso de ContinuousPing, verifica el directorio /tmp:

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

Este archivo .out contiene el resultado del proceso ContinuousPing.

Uso de sudo

Happy cambia la configuración de red que controla el kernel de Linux. Dado que solo root puede cambiar la configuración del kernel, Happy te solicita que ingreses la contraseña de sudo durante la operación.

Happy usa la variable de entorno del sistema $SUDO para llamar a sudo. Si no se define $SUDO, Happy realiza una llamada sudo normal.

Secuencias de comandos de Python

Después de la instalación, los paquetes de Happy Python se pueden importar a un entorno de Python con la siguiente sentencia import:

import happy

Los módulos de comandos individuales que se encuentran en /happy se importan de la siguiente manera:

import happy.HappyNodeAdd

Para recuperar las opciones del módulo, llama a la función option(). Por ejemplo, para recuperar las opciones del módulo HappyNodeAdd, haz lo siguiente:

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