이번 주는 추석 이후 온라인 팀 미팅에서 오픈스택 영문서를 한국어로 번역 작업을 할 수 있는 Zanata 사용 방법에 대한 안내에 대해 어느 정도 설명을 듣고, 오프라인 스프린트에서 오픈소스 컨트리뷰션 활동을 하면서 스스로에게 정말 의미있는 날을 맞이했다.
드디어 나도 OpenStack이라는 거대한 오픈소스 프로젝트에 첫 커밋을 수정해서 올렸기 때문이다.
2주 동안 멘토님을 꾸준히 괴롭히면서 (?) 함께 storyboard에 올라온 커밋을 잡기 위해 꽤 많은 코드와 파일을 확인했던 것 같다.
수정한 버그에 대한 설명은 한 외국인이 python-openstackclient의 스토리보드에 올린 글로부터 시작한다.
openstack 명령어에 openstack configuration show --mask 라는 것을 사용할 수 있는데, 이 명령어를 사용하면 password라는 설정 부분이 프로그램 상에서 설정한 값으로 가려져야 하는데, 가려지지 않고 그대로 출력되는 상황이었다.
해당 에러를 재현한 결과, 버그라는 것이 확인되었고 추석 전의 팀 미팅에서 내가 해당 이슈를 맡아서 해결하겠다는 이야기를 하고 나서 2주간 길고 긴 버그 해결 과정에 착수하게 되었다.
참고로 오늘 글은 2가지로 구성된다.
- openstack configuration show — mask 에러 해결하기
- openstack 공식 문서 번역하는 작업 들여다보기
나도 기능을 개선하는 일들에 기여할 수 있고, 확실하게 파이썬 코드를 들여다보는데 실력이 많이 늘었다는 것을 느끼는 순간이었다.
이 순간을 잊고 싶지 않아서, 그리고 앞으로 오픈소스 코드를 수정하고 커밋해보는 기쁨을 다른 사람들도 내가 겪었던 과정을 알려주면 좋을 것 같아서 오늘 일을 기록으로 남긴다.
1. openstack configuration show — mask 에러 해결하기
먼저 해당 문제를 해결하기 위해 openstack configuration show라는 명령어가 어떤 파일에서 실행되는지 확인할 필요가 있었고, setup.cfg 파일을 보면 명령어가 정리되어 있어서 어떤 명령어가 어떤 파일을 이용해 실행되는지를 확인할 수 있다.
그러면 openstackclient 경로에 common이라는 폴더가 있고 configuration.py에서 명령어를 받아서 수행하는 것을 볼 수 있다.
실행 파일을 찾았으니, 파일로 넘어가서 구체적으로 어떤 함수가 어떻게 실행되어 결과를 반환하는지 확인해보자.
openstack의 client 레포의 거의 대부분의 클래스 실행 함수의 이름은 take_action이라는 함수를 사용하고 있고, configuration이라고 크게 다른 것은 없었다.
이 함수의 수정 전의 코드를 보면 info라는 변수에서 auth라는 딕셔너리 값을 받아오고 있는데 코드를 작성한 사람의 의도를 보면 secret_opts라는 변수에 마스킹할 값을 넣어 놓고 auth라는 딕셔너리에서 값을 가져오면서 parsed_args.mask가 True일 경우 password & token을 가려주는 것이다.
그러나 중요한 것은 auth에 password & token 값이 넣어져서 전달되는 것이 아닌 상황인데, test_configuration & fake.py (코드 테스트 모듈)에서는 auth에서 값을 받아오고 있었다.
파이참에서 디버깅을 해보고, Gerrit에 올라온 다른 사람들 커밋을 분석해보면서 테스트 코드의 경우 실행하는 코드를 제외하고는 의존성이 없는 것을 확인했고, 해당 코드들을 변경해서 커밋 작업을 진행했다.
그런데 문제가 발생했다.
분명 내가 돌린 tox 테스트 케이스에서는 아무런 문제가 발생하지 않았는데 배포 전에 커밋에 문제가 있는지 테스트를 진행하는 Zuul이라는 툴에서 에러가 발생한 것이다.
알고 보니 우리가 설정한 옵션에서는 auth라는 내가 소거한 값이 출력과정에서 없는데 devstack에서 configuration 설정이라는 것이 있는데 거기서 auth라는 조건이 있던 것이다.
왜 그런지는 전혀 모르겠지만 auth.password / password 양쪽 모두 존재했고, 해당 테스트 케이스 해결을 위해서 test_configuration / fake.py를 모두 원상복귀하는 방향으로 작업을 진행했다.
(즉, 사실상 configuration.py만 고치고 global/env option에서 password를 마스킹하게 처리한 것이다)
추후에 코드리뷰를 받아봐야겠지만, 버그는 해결했지만, 오픈스택이라는 오픈소스 코드를 관리하는 사람이 내 코드를 머지해 줄지 조심스레 기대해봐야겠다.
2. openstack 공식 문서 번역하기
Zanata라는 페이지에 회원가입하면 barbican / contributor-guide를 선택해서 번역할 수 있고, 번역 언어의 팀에 가입을 요청한 뒤 번역 작업에 참여가 가능하다.
생각보다 번역 작업은 어렵지 않아서 몇 문장 번역하는 작업을 테스트 해봤는데, 이걸 메인 컨트리뷰션으로 생각하지는 말고, 틈틈이 시간 날 때 마다 한 문장씩 번역해서 작업에 참여하는 방향으로 진행해야겠다.
오픈스택 처음 참여할 때, 나같은 초심자가 기여할 수 있는 게 있을까 싶었는데, 막상 참여해보니 해 볼 게 무궁무진하다.
3. 후기
저 버그 하나 해결하려고 2주 동안 프로젝트에 시간을 할당했다.
솔직히 버그 해결이 너무 안되니까 그냥 해결하는 걸 포기할까 싶었는데 A4 용지에 안되는 거 하나씩 지워가면서 시도 안해본 걸 계속 새롭게 도전하니까 결국 해결이 되는 코드를 발견했던 것 같다.
버그 하나 해결하는데 2주나 써서 내 코딩 실력이 이렇게 부족했나 싶었는데 결국 끝까지 버티고 해결하려는 시도가 내개 성과를 가져다 준 게 아닌가 싶다.
아, 개발하면서 오랜만에 느끼는 성취감이 단비같다.