Feliz uso

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

Archivos de estado

Happy almacena y mantiene cuidadosamente su estado de topología en un archivo JSON con un solo registro. 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 muestra en el resultado de happy-state:

happy-state

State Name:  happy

Estados paralelos

Happy admite varios estados paralelos coexistentes. La variable de entorno HAPPY_STATE_ID determina el estado actual. 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 feliz. Crea uno con un valor distinto de state para cambiar de inmediato a otro estado Happy.

export HAPPY_STATE_ID="sunny"

Ahora, cuando se verifica happy-state, se genera un estado diferente:

happy-state

State Name:  sunny

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

Desinstalación con estados paralelos

Si usas estados paralelos paralelos y quieres desinstalarlo, asegúrate de ejecutar happy-state-delete con cada estado activo. Esto garantiza que todos los espacios de nombres de red creados por Happy se quiten del 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 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 de registro a /tmp/${HAPPY_STATE_ID}_debug_log.txt.

Para ver los registros Happy, ejecuta happy-state -l en otra ventana de terminal. Cuando ingresas comandos de Happy, los registros muestran los problemas de Happy de la 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 con los que Feliz llama. Considera cada línea en el 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 Happy y OpenWeave para realizar pruebas. También úsalos para aprender los comandos a fin de crear topologías complejas.

Las topologías están en formato JSON y Shell Script.

JSON

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

Por ejemplo, una topología sin Weave:

happy-state-load thread_wifi_ap_internet.json

Una topología con Weave:

weave-state-load three_nodes_on_thread_weave.json

Si deseas guardar la topología actual como un archivo JSON separado para usarla más adelante (por ejemplo, en una secuencia de comandos de caso de prueba), usa happy-shell -s:

happy-shell -s my_topology.json

De esta manera, se 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. Estas secuencias de comandos no tienen permisos ejecutables de forma predeterminada. Se pueden ejecutar de dos maneras:

Mediante el comando bash:

bash thread_wifi_ap_internet.sh

Mediante la aplicación de permisos ejecutables:

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.jsonVariables de configuración para uso personal o de complemento. Establece estos valores con el comando happy-configuration.
<path-to-happy>/happy/conf/main_config.jsonVariables principales de configuración 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, haz lo siguiente:

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

Por ejemplo, para ejecutar continuamente un ping en un nodo llamado ThreadNode:

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 utiliza para administrar el proceso. Usa happy-process-wait para suspender la ejecución del proceso y happy-process-stop a fin de finalizar el proceso.

El resultado del proceso se encuentra en /tmp. Por ejemplo, después de iniciar el proceso 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. Como solo root puede cambiar la configuración del kernel, Happy te solicitará que ingreses la contraseña sudo durante la operación.

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

Secuencias de comandos de Python

Después de la instalación, los paquetes de Happy Python pueden importarse a un entorno de Python mediante la siguiente declaración 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:

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