커맨드 실행을 통해 코드 구조 문서 정리
md-property-create
namespace 생성 명령어
# 전체 커맨드
md-property-create
test-namespace
--name
property-create
--title
property-title
--schema
"{\\"description\\": \\"test property\\", \\"enum\\": [ \\"xen\\", \\"qemu\\", \\"kvm\\", \\"lxc\\", \\"uml\\", \\"vmware\\", \\"hyperv\\" ], \\"type\\": \\"string\\"}"
utils.py
### 함수 구조가 어떻게 된거지...?
# Decorator for cli-args
def arg(*args, **kwargs):
def _decorator(func):
# Because of the semantics of decorator composition if we just append
# to the options list positional options will appear to be backwards.
func.__dict__.setdefault('arguments', []).insert(0, (args, kwargs))
return func
return _decorator
arg()와 _decorator() 함수가 계속 실행되면서 인자값을 받고 원하는 옵션대로 namespace가 생성되는거 같음
arg(*args, **kwargs)
_decorator(func)
func.__dict__.setdefault
메소드를 사용해 키, 값(args, kwargs)을 하나의 인수로 받음
→ v2/shell.py
에 있는 do
함수들로 이동
v2/shell.py
do_image_create_via_import(gc, args)
이미지 Import를 통해 새로운 이미지 생성함
args
데이터가 @utils.on_data_require_fields(DATA_FIELDS)
에 전달
위 args, _decorator가 계속 실행되면서 do_image_create..함수에 필요한 인자가 arguments 저장
최종적으로…
shell.py
class OpenStackImagesShell(object):
def _append_global_identity_args(self, parser, argv):
# register common identity args
parser.set_defaults(os_auth_url=utils.env('OS_AUTH_URL'))
parser.set_defaults(os_project_name=utils.env(
'OS_PROJECT_NAME', 'OS_TENANT_NAME'))
parser.set_defaults(os_project_id=utils.env(
'OS_PROJECT_ID', 'OS_TENANT_ID'))
parser.add_argument('--os_tenant_id',
help=argparse.SUPPRESS)
parser.add_argument('--os_tenant_name',
help=argparse.SUPPRESS)
parser.add_argument('--os-region-name',
default=utils.env('OS_REGION_NAME'),
help='Defaults to env[OS_REGION_NAME].')
...
OpenStackImagesShell
클래스 실행 후 아래 함수들 실행
_append_global_identity_args()
변수가 parser, argv가 아닌 왜 아래 변수인지 모르겠음
get_base_parser
로 위 변수들 넘어감
def get_base_parser(self, argv):
parser = argparse.ArgumentParser(
prog='glance',
description=__doc__.strip(),
epilog='See "glance help COMMAND" '
'for help on a specific command.',
add_help=False,
formatter_class=HelpFormatter,
)
def get_subcommand_parser(self, version, argv=None):
def _find_actions(self, subparsers, actions_module):
→ 전 함수들의 return 값이 다음 함수들에게 전달됨
class HelpFormatter(argparse.HelpFormatter):
클래스로 이동
main()
실행