祝您使用愉快

-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 issues。如果您对 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

使用 happy-state-loadweave-state-load 命令加载 JSON 拓扑文件。如果拓扑包含 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.jsonHappy 的主要配置变量。
<path-to-happy>/happy/conf/log_config.json日志配置。

添加配置变量

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

例如,若要让 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

在上面的示例中,ContinuousPing 是 Happy 用于管理该进程的进程的用户定义名称。使用 happy-process-wait 暂停进程执行,使用 happy-process-stop 终止进程。

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

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

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

sudo 的使用

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

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

Python 脚本

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

import happy

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

import happy.HappyNodeAdd

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

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