快乐使用

通过将 -h 标志与任何 happy-* 命令结合使用,可查看该命令的帮助和选项列表。

状态文件

Happy 使用单条记录在 JSON 文件中存储并仔细维护其拓扑状态。Happy 可以使用此状态文件运行相应的命令来创建或移除拓扑。

默认状态文件位于 ~/.happy_state.json 中。默认状态名称为 happy,如 happy-state 输出中所示:

happy-state

State Name:  happy

并行状态

Happy 支持多种共存状态。当前状态由 HAPPY_STATE_ID 环境变量决定。如果环境中不存在 HAPPY_STATE_ID,系统将使用默认状态值 happy

在 Happy 安装期间未创建 HAPPY_STATE_ID。创建一个值为 state 以外的值以立即切换到其他 Happy 状态。

export HAPPY_STATE_ID="sunny"

现在,检查 happy-state 会导致不同的状态:

happy-state

State Name:  sunny

每种状态都保存在自己的 ~/.${HAPPY_STATE_ID}_state.json 文件中。如需在状态之间切换,请再次运行 export HAPPY_STATE_ID="<state-name>" 命令。

在并行状态下卸载

如果您使用的是并行 Happy 状态并且想要卸载 Happy,请确保在每种状态都处于启用状态的情况下运行 happy-state-delete。这样可确保 Happy 创建的所有网络命名空间都从您的系统中移除,而不会影响 Linux 主机网络配置。

例如,具有 happysunny 的两种状态:

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

根据需要手动移除每个并行状态文件:

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

日志

默认情况下,Happy 会将日志发送到 syslog。系统会向 /tmp/${HAPPY_STATE_ID}_debug_log.txt 发送第二个日志备份。

如需查看 Happy 日志,请在单独的终端窗口中运行 happy-state -l。当您输入 Happy 命令时,日志会显示 shell 命令在后台显示的 Happy 问题。如果您对 Linux 网络命名空间感兴趣,这是了解 Happy 工作原理的绝佳方式。

例如,happy-node-add node00 可创建一个 Happy 节点。此命令的日志输出为:

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

所有 Driver:CallCmd() 行都是 Happy 调用的 shell 命令。请查看日志中的每一行:

# 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

示例拓扑

Happy 和 OpenWeave 代码库中都包含示例拓扑,以便进行测试。此外,您还可以使用它们学习用于构建复杂拓扑的命令。

拓扑采用 JSON 和 Shell 脚本格式。

JSON

JSON 拓扑文件使用 happy-state-loadweave-state-load 命令加载。如果拓扑包含 Weave,您必须使用 weave-state-load 加载拓扑,否则会跳过特定于 Weave 的命令。

例如,不使用 Weave 的拓扑:

happy-state-load thread_wifi_ap_internet.json

Weave 的拓扑:

weave-state-load three_nodes_on_thread_weave.json

如需将当前拓扑保存为单独的 JSON 文件以供日后使用(例如测试用例脚本),请使用 happy-shell -s

happy-shell -s my_topology.json

系统会将拓扑状态文件保存在 $HOME 目录中。

Shell 脚本

Shell 脚本拓扑文件包含一组 Happy 和 Weave 命令,用于在相应的 JSON 文件中创建拓扑。默认情况下,这些脚本没有可执行权限。它们可以通过两种方式运行:

使用 bash 命令:

bash thread_wifi_ap_internet.sh

通过应用可执行权限,您可以:

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

配置

Happy 有三个配置文件:

配置文件说明
~/.happy_conf.json用于个人或插件使用的配置变量。使用 happy-configuration 命令设置这些值。
<path-to-happy>/happy/conf/main_config.json主要 Happy 配置变量。
<path-to-happy>/happy/conf/log_config.json日志配置。

添加配置变量

我们建议您使用 happy-configuration 命令设置特定 Happy 部署所需的默认值以外的任何个人或插件变量。

例如,如需让 Happy 了解在哪里可以找到测试脚本的 Weave test-apps 目录,请设置 weave_path 变量:

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

Happy 将配置变量存储在 ~/.happy_conf.json 中。

节点中的进程

Happy 提供了用于在模拟节点中启动和停止进程的命令。

要开始某个流程,请执行以下操作:

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

例如,如需在名为 ThreadNode 的节点中持续运行 ping:

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

在上面的示例中,PersistentPing 是 Happy 用来管理进程的进程的用户定义名称。使用 happy-process-wait 可挂起进程执行,使用 happy-process-stop 可终止进程。

进程输出在 /tmp 中。例如,启动 PersistentPing 进程后,请检查 /tmp 目录:

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

.out 文件包含 PersistentPing 进程的输出。

sudo 的用法

Happy 更改了由 Linux 内核控制的网络配置。由于只有 root 可以更改内核配置,因此 Happy 会在操作过程中提示您输入 sudo 密码。

Happy 使用 $SUDO 系统环境变量来调用 sudo。如果未定义 $SUDO,Happy 会进行正常的 sudo 调用。

Python 脚本

安装后,Happy Python 软件包可以使用以下 import 语句导入到 Python 环境中:

import happy

/happy 中找到的各个命令模块按以下方式导入:

import happy.HappyNodeAdd

如需检索模块选项,请调用 option() 函数。例如,如需检索 HappyNodeAdd 模块选项,请运行以下命令:

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