ご利用をお待ちしております。

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 ホスト ネットワークの構成に影響を与えずにシステムから削除されます。

たとえば、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 ネットワークの名前空間に関心がある場合の 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 と 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()