happy-*
コマンドで -h
フラグを使用して、そのコマンドのヘルプとオプションのリストを表示します。
状態ファイル
Happy は、1 つのレコードを含む JSON ファイルでトポロジの状態を慎重に保存し、慎重に管理します。この状態ファイルを使用することで、Happy は適切なコマンドを実行してトポロジを作成または削除できます。
デフォルトの状態ファイルは ~/.happy_state.json
にあります。happy-state
出力に見られるように、デフォルトの状態名は happy
です。
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 をアンインストールする場合は、各 active で happy-state-delete
を実行します。これにより、Happy によって作成されたすべてのネットワーク名前空間が、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 ネットワークの名前空間に関心がある場合の 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 と Shell Script の形式です。
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 つの構成ファイルがあります。
構成ファイル | Description |
---|---|
~/.happy_conf.json | 個人使用またはプラグイン使用の構成変数。これらの値は happy-configuration コマンドを使用して設定します。 |
<path-to-happy>/happy/conf/main_config.json | 主なサービス構成変数 |
<path-to-happy>/happy/conf/log_config.json | ログの構成。 |
構成変数を追加する
個別のデプロイで Happy に必要なデフォルト以外の変数は、happy-configuration
コマンドを使用して設定することをおすすめします。
たとえば、テスト スクリプトの Weave test-apps
ディレクトリの場所を Happy に知らせるには、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
の使用状況
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()