OpenStack Server List에 Column 추가

김유경·2025년 5월 17일

📍 OpenStackClient server list 결과에 사용자 이름(User Name) 추가하기

OpenStack에서 CLI를 통해 인스턴스 목록을 조회할 수 있는 명령어는 다음과 같습니다.

openstack server list

하지만 기본적으로 이 출력에는 해당 인스턴스를 만든 사용자 이름은 표시되지 않습니다. 이 글에서는 OpenStackClient를 직접 수정하여 User Name 필드를 결과에 추가하는 방법을 정리합니다.

수정 대상 파일

python-openstackclient/openstackclient/compute/v2/server.py

OpenStackClient에서 server list 명령을 처리하는 클래스는 다음과 같습니다. take_action() 함수는 실제로 CLI 명령을 실행했을 때 어떤 열(columns)을 출력할지, 어떤 데이터를 불러올지를 정의하는 함수입니다.

class ListServer(command.Lister):
    def take_action(self, parsed_args):
        ...

구현 단계

1. 출력 column에 user_name 추가

  • columns는 API로부터 불러올 속성의 키 목록
  • column_headers는 실제 터미널 출력에 보일 제목(label)

2. 각 서버 오브젝트에 user_name 추가

  • s는 인스턴스(Server) 오브젝트 하나
  • s.user_id: 이 인스턴스를 생성한 사용자 ID
  • Keystone(Identity 서비스)의 users.get()을 통해 사용자 정보 요청
  • 실패 시 "N/A" 처리하여 오류 방지

최종 결과

python -m openstackclient.shell --os-cloud devstack server list

추가 설명

openstack server show 명령어의 내부 동작 과정

1. setup.cfg에서 명령어와 python 코드 연결

openstack server show 라는 CLI 명령을 입력하면, 어떤 python 파일과 클래스를 실행해야 할지를 setup.cfg 파일에서 먼저 찾습니다. 예를 들어, openstack server show 명령을 실행하면, openstackclient/compute/v2/server.py 안에 있는 ShowServer 클래스를 실행합니다.

2. parse_args()로 입력 파싱

사용자가 명령어 뒤에 어떤 옵션을 붙였는지 파악하는 단계입니다.

예시 입력

openstack server show abc123 --diagnostics
  • abc123: 보여줄 서버의 ID
  • --diagnostics: 서버의 진단 정보를 함께 출력하라는 옵션

사용자가 터미널에 입력한 명령어는 내부적으로 parsed_args라는 구조체에 저장되어 이후 실제 데이터를 불러오는 take_action() 함수에서 사용됩니다.

3. take_action() 단계

여기서 실제로 서버 정보를 가져오고, 출력할 데이터를 만듭니다.

(1) 서버 정보 가져오기

take_action()에서는 서버 정보를 실제로 가져옵니다. 이 부분에서는 서버 ID를 이용해서 OpenStack 서버에서 데이터를 요청합니다.

server = compute_client.servers.get(server_id)

(2) 옵션 처리

if parsed_args.diagnostics:
  # 진단 정보 API 추가 호출

if parsed_args.topology:
  # NUMA 구조 등의 추가 정보 요청

(3) 출력 정보 구성

모든 정보를 정리한 뒤, 서버의 상세 정보를 표 형식으로 화면에 출력합니다.

columns = ('ID', 'Name', 'Status', ...)
data = (server.id, server.name, server.status, ...)

참고

📌 언더바(_)가 공백(' ')으로 바뀌는 이유

OpenStack CLI 명령어는 내부적으로 Python의 entry_points 설정을 기반으로 동작합니다. 사용자가 입력하는 명령어는 실제로는 setup.cfg 파일 내 [entry_points] 항목에 정의된 키와 연결됩니다.

예시

[entry_points]
openstack.compute.v2 =
    server_list = openstackclient.compute.v2.server:ListServer

사용자 CLI 입력

openstack server list

→ 내부적으로는 server_list로 변환되어 해당 entry point(List Server 클래스)와 매칭됩니다.

server_list와 같은 python 키는 CLI에서 자동으로 server list처럼 공백 기반 명령어로 치환되며, 이 처리는 OpenStack CLI가 사용하는 cliff 프레임워크에 의해 수행됩니다.

📌 cliff
cliff는 OpenStack CLI 명령어의 등록, 파싱, 출력 처리를 담당하는 python 프레임워크입니다. OpenStackClient 내부에서는 cliff.commandmanager.CommandManager의 load_commands() 함수를 통해 entry_points에 정의된 명령어들을 로드하고 관리합니다.

0개의 댓글