将 -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 主机网络配置。
例如,使用 happy
和 sunny
两种状态:
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 代码库中都包含示例拓扑,以供测试。此外,还可以通过这些示例了解构建复杂拓扑的命令。
- 满意:
/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()