通过将 -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 问题。如果您对 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
JSON 拓扑文件使用 happy-state-load
或 weave-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()