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 ホスト ネットワーク構成に影響を与えることなくシステムから削除されます。
たとえば、happy
と sunny
の 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 リポジトリの両方に含まれています。また、複雑なトポロジを構築するためのコマンドについても学習します。
- ハッピー:
/topologies
- OpenWeave:
/src/test-apps/happy/topologies/standalone
トポロジは 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()