満足な利用

happy-* コマンドに -h フラグを指定すると、そのコマンドのヘルプとオプションの一覧が表示されます。

状態ファイル

格納し、単一のレコードを含む JSON ファイルでトポロジ状態を慎重に維持します。この状態ファイルを使用して、Happy は適切なコマンドを実行し、トポロジを作成または削除できます。

デフォルトの状態ファイルは ~/.happy_state.json にあります。デフォルトの状態名は happy です(happy-state の出力に示されています)。

happy-state

State Name:  happy

並列状態

Happy は、複数の並列状態の共存をサポートしています。現在の状態は HAPPY_STATE_ID 環境変数によって決まります。環境に HAPPY_STATE_ID が存在しない場合、デフォルトの状態値 happy が使用されます。

インストール後、HAPPY_STATE_ID は作成されません。state 以外の値を持つものを作成して、すぐに別のハッピー状態に切り替えます。

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 によって作成されたすべてのネットワーク Namespace が、Linux ホスト ネットワーク構成に影響を与えることなくシステムから削除されます。

たとえば、happysunny の 2 つの状態の場合:

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 にログを送信します。2 番目のログ バックアップが /tmp/${HAPPY_STATE_ID}_debug_log.txt に送信されます。

Happy ログを表示するには、別のターミナル ウィンドウで happy-state -l を実行します。Happy コマンドを入力すると、ログにシェルコマンド Happy の問題がバックグラウンドで表示されます。Linux ネットワーク Namespace に興味がある場合は、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 が呼び出すシェルコマンドです。ログの各行について考えてみましょう。

# 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 形式とシェル スクリプト形式です。

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 ディレクトリに保存されます。

シェル スクリプト

シェル スクリプト トポロジ ファイルには、対応する JSON ファイルにトポロジを作成する Happy コマンドと Weave コマンドのセットが含まれています。これらのスクリプトには、デフォルトで実行権限がありません。実行方法は 2 つあります。

bash コマンドを使用します。

bash thread_wifi_ap_internet.sh

実行可能な権限を適用すると、次のようになります。

chmod +x thread_wifi_ap_internet.sh
./thread_wifi_ap_internet.sh

構成

Happy には 3 つの構成ファイルがあります。

構成ファイル説明
~/.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 の特定のデプロイに必要なデフォルト以外の個人変数またはプラグイン変数を設定することをおすすめします。

たとえば、テスト スクリプトの Weave test-apps ディレクトリの場所を Happy に通知するには、weave_path 変数を設定します。

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

~/.happy_conf.json に Happy ストアの構成変数を格納します。

ノードのプロセス

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 スクリプト

インストール後、Happy Python パッケージは次の import ステートメントを使用して Python 環境にインポートできます。

import happy

/happy にある個々のコマンド モジュールは次のようにインポートされます。

import happy.HappyNodeAdd

モジュール オプションを取得するには、option() 関数を呼び出します。たとえば、HappyNodeAdd モジュール オプションを取得するには、次のようにします。

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