(필수 과제) nova server list CLI 명령 결과에 project name , user name 추가
- 칼럼 필드 추가.
identity.find_project()
,identifyfind_user()
추가.- 소스코드
(선택 과제) CLI 실행시 take_action()함수를 찾아가는 과정 분석해보기
- (python-openstackclient)
openstackclient/shell.py
→main()
- python-openstackclient shell.py 내 OpenStackShell 은 osc_lib 자식임
# openstackclient/shell.py
from osc_lib import shell
class OpenStackShell(shell.OpenStackShell):
#...
-
(python-openstackclient)
main()
내OpenStackShell.run()
실행.- 부모 (osc_lib)의 run() 실행
-
super().run(argv)
에 따라 cliff 실행- osc_lib shell.py 내 OpenStackShell 은 cliff 자식임
# osc_lib/shell.py
from cliff import app
class OpenStackShell(app.App):
#...
-
(cliff)
run()
실행initialize_app()
: 플러그인 및 명령어 로드_load_plugins()
가pyproject.toml
에 등록된 클래스 path를 등록함._load_commands()
가 사용할 명령어들을 등록함- 둘 다 자식인 python-openstackclient에 구현되어있음
-
(cliff)
run_subcommand()
실행- (command manager)
find_command()
호출 : command manager를 통해server list
로ListServer
를 찾음
- (command manager)
# python-openstackclient/pyproject.toml
server_list = "openstackclient.compute.v2.server:ListServer"
- (command manager)
run_subcommand()
내에서cmd.run()
호출- 내부에서
take_action()
호출.
- 내부에서
(정리)
- python-openstackclient는 cliff의 구현체이며 cliff는 명령어를 실행하면서 결국 take_action() 을 호출한다.
- python-openstakclient는 pyproject.toml에 openstackclient가 SDK를 실행할 수 있도록 래핑한 클래스 정보를 제공하여 실제로 실행할 take_action()이 구현된 클래스들의 목록을 나열함. (커맨드 패턴)
감사합니다.