将 -h 标志与任何 happy-* 命令搭配使用,即可查看该命令的帮助和选项列表。
状态文件
Happy 会在包含单个记录的 JSON 文件中存储并谨慎维护其拓扑状态。通过使用此状态文件,Happy 可以运行相应的命令来创建或移除拓扑。
默认状态文件位于 ~/.happy_state.json。默认状态名称为 happy,如 happy-state 输出所示:
happy-stateState Name: happy
并行状态
Happy 支持多个共存的并行状态。当前状态由 HAPPY_STATE_ID 环境变量决定。如果环境中不存在 HAPPY_STATE_ID,则使用 happy 的默认状态值。
在 Happy 安装过程中,系统不会创建 HAPPY_STATE_ID。创建一个值为 state 以外的状态,以立即切换到另一个 Happy 状态。
export HAPPY_STATE_ID="sunny"
现在,检查 happy-state 会产生不同的状态:
happy-stateState Name: sunny
每个状态都维护在自己的 ~/.${HAPPY_STATE_ID}_state.json 文件中。如需切换状态,请再次运行 export HAPPY_STATE_ID="<state-name>" 命令。
在并行状态下卸载
如果您使用并行 Happy 状态,并且想要卸载 Happy,请务必在每个状态都处于活动状态的情况下运行 happy-state-delete。这样可以确保从系统中移除 Happy 创建的所有网络命名空间,而不会影响 Linux 主机网络配置。
例如,使用 happy 和 sunny 两种状态:
export HAPPY_STATE_ID="sunny"happy-state-deleteexport HAPPY_STATE_ID="happy"happy-state-delete
根据需要手动移除每个并行状态文件:
rm -f ~/.sunny_state.jsonrm -f ~/.sunny_state.json.lockrm -f ~/.happy_state.jsonrm -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 代码库中都包含示例拓扑,以供测试。此外,还可以通过这些示例了解构建复杂拓扑的命令。
- 满意:
/topologies - OpenWeave:
/src/test-apps/happy/topologies/standalone
拓扑采用 JSON 和 Shell 脚本格式。
JSON
使用 happy-state-load 或 weave-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.json | Happy 的主要配置变量。 |
<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()