Bom uso

Use a flag -h com qualquer comando happy-* para conferir a ajuda e a lista de opções desse comando.

Arquivos de estado

O Happy armazena e mantém cuidadosamente o estado da topologia em um arquivo JSON com um único registro. Usando esse arquivo de estado, Happy pode executar os comandos apropriados para criar ou remover uma topologia.

O arquivo de estado padrão está localizado em ~/.happy_state.json. O nome do estado padrão é happy, conforme visto na saída happy-state:

happy-state

State Name:  happy

Estados paralelos

O Happy oferece suporte a vários estados paralelos coexistentes. O estado atual é ditado pela variável de ambiente HAPPY_STATE_ID. Se HAPPY_STATE_ID não existir no ambiente, o valor de estado padrão de happy será usado.

O HAPPY_STATE_ID não é criado durante a instalação do Happy. Crie um com um valor diferente de state para mudar imediatamente para outro estado "Happy".

export HAPPY_STATE_ID="sunny"

Agora, verificar happy-state resulta em um estado diferente:

happy-state

State Name:  sunny

Cada estado é mantido no próprio arquivo ~/.${HAPPY_STATE_ID}_state.json. Para alternar entre estados, execute o comando export HAPPY_STATE_ID="<state-name>" novamente.

Desinstalação com estados paralelos

Se você usar estados felizes paralelos e quiser desinstalar o Happy, execute happy-state-delete com cada estado ativo. Isso garante que todos os namespaces de rede criados pela Happy sejam removidos do sistema sem afetar a configuração de rede do host do Linux.

Por exemplo, com dois estados de happy e sunny:

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

Remova manualmente cada arquivo de estado paralelo conforme necessário:

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

Registros

O Happy envia registros para syslog por padrão. Um segundo backup de registro é enviado para /tmp/${HAPPY_STATE_ID}_debug_log.txt.

Para ver os registros da Happy, execute happy-state -l em uma janela de terminal separada. Quando você digita comandos Happy, os registros mostram os comandos do shell Happy em segundo plano. Essa é uma boa maneira de entender como o Happy funciona, se você tiver interesse nos namespaces de rede do Linux.

Por exemplo, happy-node-add node00 cria um nó feliz. A saída do registro para esse 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

Todas as linhas Driver:CallCmd() são os comandos do shell que Happy chama. Considere cada linha no 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

Exemplos de topologias

As topologias de amostra estão incluídas nos repositórios Happy e OpenWeave para testes. Use-os também para aprender os comandos de construção de topologias complexas.

As topologias estão nos formatos JSON e Shell Script.

JSON

Os arquivos de topologia JSON são carregados usando os comandos happy-state-load ou weave-state-load. Se a topologia incluir a Weave, use weave-state-load para carregar a topologia. Caso contrário, os comandos específicos da Weave serão ignorados.

Por exemplo, uma topologia sem a Weave:

happy-state-load thread_wifi_ap_internet.json

Uma topologia com a interpolação:

weave-state-load three_nodes_on_thread_weave.json

Para salvar a topologia atual como um arquivo JSON separado para uso posterior (por exemplo, um script de caso de teste), use happy-shell -s:

happy-shell -s my_topology.json

Isso salva o arquivo de estado de topologia no diretório $HOME.

Scripts de shell

Os arquivos de topologia de script de shell contêm o conjunto de comandos Happy e Weave para criar as topologias nos arquivos JSON correspondentes. Por padrão, esses scripts não têm permissões executáveis. Eles podem ser executados de duas maneiras:

Usando o comando bash:

bash thread_wifi_ap_internet.sh

Ao aplicar permissões executáveis:

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

Configuração

O Happy tem três arquivos de configuração:

Arquivo de configuraçãoDescrição
~/.happy_conf.jsonVariáveis de configuração para uso pessoal ou de plug-in. Defina esses valores usando o comando happy-configuration.
<path-to-happy>/happy/conf/main_config.jsonVariáveis de configuração principais do Happy.
<path-to-happy>/happy/conf/log_config.jsonConfiguração de registros.

Adicionar variáveis de configuração

Recomendamos que você use o comando happy-configuration para definir variáveis pessoais ou de plug-in além dos padrões necessários para sua implantação específica da Happy.

Por exemplo, para que Happy saiba onde encontrar o diretório test-apps do Weave para scripts de teste, defina a variável weave_path:

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

Happy armazena variáveis de configuração em ~/.happy_conf.json.

Processos em nós

Happy fornece comandos para iniciar e interromper processos em nós simulados.

Para iniciar um processo:

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

Por exemplo, para executar continuamente um ping em um nó chamado ThreadNode:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

No exemplo acima, ContinuousPing é o nome definido pelo usuário para o processo que Happy usa para gerenciá-lo. Use happy-process-wait para suspender a execução do processo e happy-process-stop para encerrar o processo.

A saída do processo está em /tmp. Por exemplo, depois de iniciar o processo ContinuousPing, verifique o diretório /tmp:

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

Esse arquivo .out contém a saída do processo ContinuousPing.

Uso de sudo

Happy muda a configuração de rede controlada pelo kernel do Linux. Como apenas root pode mudar a configuração do kernel, a Happy solicita que você insira a senha sudo durante a operação.

Happy usa a variável de ambiente do sistema $SUDO para chamar sudo. Se $SUDO não for definido, o Happy fará uma chamada sudo normal.

Scripting do Python

Após a instalação, os pacotes Happy Python podem ser importados para um ambiente Python usando a seguinte instrução import:

import happy

Módulos de comando individuais encontrados em /happy são importados da seguinte maneira:

import happy.HappyNodeAdd

Para recuperar as opções do módulo, chame a função option(). Por exemplo, para extrair as opções do módulo HappyNodeAdd:

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