만족스러운 사용

해당 명령어의 도움말과 옵션 목록을 보려면 happy-* 명령어와 함께 -h 플래그를 사용합니다.

상태 파일

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 호스트 네트워크 구성에 영향을 미치지 않고 시스템에서 삭제됩니다.

예를 들어 happysunny의 두 상태를 사용합니다.

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 명령어를 입력하면 로그에 셸 명령어 Happy issues in the background가 로그에 표시됩니다. 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 및 셸 스크립트 형식입니다.

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 명령어 집합이 포함되어 있습니다. 이러한 스크립트에는 기본적으로 실행 파일 권한이 없습니다. 다음 두 가지 방법으로 실행할 수 있습니다.

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라는 노드에서 핑을 연속으로 실행하려면 다음을 실행합니다.

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 스크립팅

설치 후 Happy Python 패키지는 다음 import 문을 사용하여 Python 환경으로 가져올 수 있습니다.

import happy

/happy에 있는 개별 명령어 모듈은 다음과 같이 가져옵니다.

import happy.HappyNodeAdd

모듈 옵션을 검색하려면 option() 함수를 호출합니다. 예를 들어 HappyNodeAdd 모듈 옵션을 검색하려면 다음을 실행합니다.

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