만족스러운 이용

happy-* 명령어와 함께 -h 플래그를 사용하여 해당 명령어의 도움말 및 옵션 목록을 확인합니다.

상태 파일

행복한 저장소는 단일 레코드를 사용하여 JSON 파일에 주의해서 유지관리합니다. Happy는 이 상태 파일을 사용하여 적절한 명령어를 실행하여 토폴로지를 만들거나 삭제할 수 있습니다.

기본 상태 파일은 ~/.happy_state.json에 있습니다. 기본 상태 이름은 happy-state 출력에서 보는 바와 같이 happy입니다.

happy-state

State Name:  happy

병렬 상태

Happy는 여러 개의 동시 병렬 상태를 지원합니다. 현재 상태는 HAPPY_STATE_ID 환경 변수에 의해 지정됩니다. HAPPY_STATE_ID이 환경에 없으면 happy의 기본 상태 값이 사용됩니다.

즐거운 설치 중에 HAPPY_STATE_ID 앱이 생성되지 않았습니다. 다른 Happy 상태로 즉시 전환하려면 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에서 만든 모든 네트워크 네임스페이스가 Linux 호스트 네트워크 구성에 영향을 주지 않고 시스템에서 삭제됩니다.

예를 들어 happy의 상태와 sunny의 상태는 다음과 같습니다.

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 문제가 표시됩니다. 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>

예를 들어 스레드 스레드라는 노드에서 핑을 계속 실행하려면 다음을 수행합니다.

happy-process-start ThreadNode ContinuousPing ping 8.8.8.8

위의 예에서 ConstantPing은 Happy가 프로세스를 관리하는 데 사용하는 프로세스의 사용자 정의 이름입니다. happy-process-wait을 사용하여 프로세스 실행을 정지하고 happy-process-stop를 사용하여 프로세스를 종료합니다.

프로세스 출력은 /tmp에 있습니다. 예를 들어 ConstantPing 프로세스를 시작한 후 /tmp 디렉터리를 확인합니다.

ls /tmp/happy*
/tmp/happy_018691_1524087014.192197_ContinuousPing.out

.out 파일에는 ConstantPing 프로세스 출력이 포함되어 있습니다.

sudo 사용

Linux 커널에서 제어하는 네트워크 구성을 변경합니다. root만 커널 구성을 변경할 수 있으므로 작업 중에 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()