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.
- Satisfactorio:
/topologies
- OpenWeave:
/src/test-apps/happy/topologies/standalone
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ón | Descripción |
---|---|
~/.happy_conf.json | Son 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.json | Variables de configuración principales de Happy |
<path-to-happy>/happy/conf/log_config.json | Configuració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()