4주차 과제 - 장지원

CLI 사용법

분석 대상

test_metadef_resource_types / openstack image metadef resource type list

openstack.image.v2.metadef_resource_type — openstacksdk 4.4.1.dev6 documentation

  • 사용 목적

    • Openstack Glance에서 이미지 메타데이터 정의에 사용되는 리소스 유형 목록을 조회하는 명령어

    • 이미지 메타데이터를 정의할 때, 어떤 리소스에 대한 메타데이터를 만들 수 있는지 확인하는 데 사용됨

Openstack Glance

  • Openstack의 이미지 관리 서비스를 제공하는 컴포넌트

  • 사용자가 가상 머신 이미지를 업로드, 저장, 검색, 공유 등 관리할 수 있도록 지원

  • S3같은 외부 스토리지와 연동 가능

  • 동작 과정

    • 사용자가 Glance에 이미지를 업로드

    • Nova는 인스턴스 생성 시, Glance에 해당 이미지를 요청

      • 이미지 메타데이터를 제공
    • Nova-compute는 Glance에서 이미지를 다운로드 하여 인스턴스를 배포

      • 이미지 파일 자체는 스토리지에 있으며, Glance는 이에 대한 경로 같은 메타데이터 정보를 제공

동작

  • openstack image metadef resource type list 실행 시의 화면

    python shell.py image metadef resource type list
    +---------------------+
    | Name                |
    +---------------------+
    | OS::Glance::Image   |
    | OS::Cinder::Volume  |
    | OS::Nova::Flavor    |
    | OS::Nova::Aggregate |
    | OS::Nova::Server    |
    | OS::Trove::Instance |
    +---------------------+
    
    
    • Name : OpenStack Glance 메타데이터 정의를 적용할 수 있는 리소스 유형의 이름

      • Glance가 단순히 이미지에 대한 메타데이터만 관리하는 것이 아니라, 다양한 OpenStack 서비스 리소스에 대한 메타데이터를 통합적으로 관리할 수 있다는 것을 해당 출력을 통해 알 수 있음
  • OCA-OpenStack/python-openstackclient/openstackclient/image/v2/metadef_resource_types.py

    """Image V2 Action Implementations"""
    
    from osc_lib.command import command
    from osc_lib import utils
    
    from openstackclient.i18n import _
    
    class ListMetadefResourceTypes(command.Lister):
        _description = _("List metadef resource types")
    
        def take_action(self, parsed_args):
            image_client = self.app.client_manager.image
            data = image_client.metadef_resource_types()
            columns = ['Name'] # 'Description', 'Namespace' 추가
            column_headers = columns
            return (
                column_headers,
                (
                    utils.get_item_properties(
                        s,
                        columns,
                    )
                    for s in data
                ),
            )
    
    
    
    • 해당 코드의 columns 값을 수정하면 cli에 표시되는 칼럼을 변경할 수 있다.
    python-openstackclient/openstackclient/shell.py image metadef resource type list 
    +---------------------+----------------------+
    | Name                | created_at           |
    +---------------------+----------------------+
    | OS::Glance::Image   | 2025-07-16T07:28:08Z |
    | OS::Cinder::Volume  | 2025-07-16T07:28:08Z |
    | OS::Nova::Flavor    | 2025-07-16T07:28:08Z |
    | OS::Nova::Aggregate | 2025-07-16T07:28:08Z |
    | OS::Nova::Server    | 2025-07-16T07:28:08Z |
    | OS::Trove::Instance | 2025-07-16T07:28:08Z |
    +---------------------+----------------------+
    
    
  • image_client = self.app.client_manager.image 를 통해 Glance를 호출한다.

    • client_manager은 Openstack 서비스(Nova, Cinder 등)에 연결하기 위한 클라이언트 객체들의 집합
  • 사용 가능한 칼럼 리스트는 openstacksdk/openstack/image/v2/metadef_resource_type.py 파일에서 확인할 수 있다.

    # openstacksdk/openstack/image/v2/metadef_resource_type.py
    
    from openstack import resource
    
    class MetadefResourceType(resource.Resource):
        resources_key = 'resource_types'
        base_path = '/metadefs/resource_types'
    
        # capabilities
        allow_list = True
    
        #: The name of metadata definition resource type
        name = resource.Body('name', alternate_id=True)
        #: The date and time when the resource type was created.
        created_at = resource.Body('created_at')
        #: The date and time when the resource type was updated.
        updated_at = resource.Body('updated_at')
    
    
    

옵션

$ openstack image metadef resource type list -help
usage: shell image metadef resource type list [-h] [-f {csv,json,table,value,yaml}] [-c COLUMN]
                                              [--quote {all,minimal,none,nonnumeric}] [--noindent]
                                              [--max-width <integer>] [--fit-width] [--print-empty]
                                              [--sort-column SORT_COLUMN] [--sort-ascending |
                                              --sort-descending]

List metadef resource types

options:
  -h, --help            show this help message and exit

output formatters:
  output formatter options

  -f, --format {csv,json,table,value,yaml}
                        the output format, defaults to table
  -c, --column COLUMN
                        specify the column(s) to include, can be repeated to show multiple columns
  --sort-column SORT_COLUMN
                        specify the column(s) to sort the data (columns specified first have a priority, non-
                        existing columns are ignored), can be repeated
  --sort-ascending      sort the column(s) in ascending order
  --sort-descending     sort the column(s) in descending order

CSV Formatter:
  --quote {all,minimal,none,nonnumeric}
                        when to include quotes, defaults to nonnumeric

json formatter:
  --noindent            whether to disable indenting the JSON

table formatter:
  --max-width <integer>
                        Maximum display width, <1 to disable. You can also use the CLIFF_MAX_TERM_WIDTH
                        environment variable, but the parameter takes precedence.
  --fit-width           Fit the table to the display width. Implied if --max-width greater than 0. Set the
                        environment variable CLIFF_FIT_WIDTH=1 to always enable
  --print-empty         Print empty table if there is no data to show.

This command is provided by the python-openstackclient plugin.

  • python-openstackclient/openstackclient/image/v2/metadef_resource_types.py의 import 부분을 보면 osc_lib의 command를 통해 옵션을 제공하고 있음을 알 수 있다.

    # python-openstackclient/openstackclient/image/v2/metadef_resource_types.py
    
    ㄹ"""Image V2 Action Implementations"""
    
    from osc_lib.command import command
    from osc_lib import utils
    
    from openstackclient.i18n import _
    
    
  • osc_lib.command는 cliff의 lister을 import 하여 사용하기에 최종적으로는 해당 클래스를 확인하면 된다.

    # osc-lib/osc_lib/command/command.py
    
    import abc
    import argparse
    import logging
    import typing as ty
    
    from cliff import command
    from cliff import lister
    from cliff import show
    
    from osc_lib import exceptions
    from osc_lib.i18n import _
    
    if ty.TYPE_CHECKING:
        from osc_lib import shell
    
    
    
    # lib/python3.13/site-packages/cliff/lister.py
    
    class Lister(display.DisplayCommandBase, metaclass=abc.ABCMeta):
    ...
    	def get_parser(self, prog_name: str) -> _argparse.ArgumentParser:
    	        parser = super().get_parser(prog_name)
    	        group = self._formatter_group
    	        group.add_argument(
    	            '--sort-column',
    	            action='append',
    	            default=[],
    	            dest='sort_columns',
    	            metavar='SORT_COLUMN',
    	            help=(
    	                'specify the column(s) to sort the data (columns specified '
    	                'first have a priority, non-existing columns are ignored), '
    	                'can be repeated'
    	            ),
    	        )
    	        sort_dir_group = group.add_mutually_exclusive_group()
    	        sort_dir_group.add_argument(
    	            '--sort-ascending',
    	            action='store_const',
    	            dest='sort_direction',
    	            const='asc',
    	            help=('sort the column(s) in ascending order'),
    	        )
    	        sort_dir_group.add_argument(
    	            '--sort-descending',
    	            action='store_const',
    	            dest='sort_direction',
    	            const='desc',
    	            help=('sort the column(s) in descending order'),
    	        )
    	        return parser