OpenStack Endpoint CRUD 동작 구조

김유경·2025년 8월 10일
1

OpenStack Endpoint란?

OpenStack Endpoint는 각 서비스의 접속 지점을 정의하는 핵심 요소로, Keystone에 등록된 서비스가 "어디에서, 어떤 방식으로" 접근 가능한지를 알려주는 주소 역할을 합니다.

구성 요소

  • URL: 서비스에 접근할 실제 주소
  • Interface: 접근 유형
    • public: 외부 사용자 접근용
    • internal: 내부 네트워크 전용
    • admin: 관리자 전용
  • Region: 서비스가 속한 리전
  • Service: 연결된 서비스 (예: compute, image, identity)
  • Enabled: 활성화 여부

기본 CLI 명령어

Endpoint 생성

openstack endpoint create <service> <interface> <url> \
    --region <region> --enable

Endpoint 조회

# 전체 목록 조회
openstack endpoint list

# 특정 인터페이스만 필터링
openstack endpoint list --interface public

# 상세 정보 확인
openstack endpoint show <endpoint-id>

Endpoint 관리

# 비활성화
openstack endpoint set <endpoint-id> --disable

# 삭제
openstack endpoint delete <endpoint-id>

openstack endpoint create 동작 흐름

1) 사용자 입력

openstack endpoint create <service> <interface> <url> --region <region-id> --enable

2) 커맨드 바인딩

endpoint create는 OpenStackClient 안에 미리 등록된 커맨드 클래스(CreateEndpoint)로 연결됩니다.

3) 옵션 파싱

커맨드 클래스의 get_parser()가 argparse로 옵션을 정의합니다.

  • 위치 인자: service, interface, url
  • 옵션 인자: --region, --enable/--disable 등

4) 실행 로직

take_action(parsed_args)에서는 사용자 입력을 표준화한 뒤, OpenStack SDK에 엔드포인트 생성 요청을 보냅니다.

def take_action(self, parsed_args):
    # 1) 서비스/리전 식별자 정규화
    identity = self.app.client_manager.sdk_connection.identity
    service = common.find_service_sdk(identity, parsed_args.service)  # 이름 → service_id

    # 2) 엔드포인트 속성 구성
    attrs = {
        "service_id": service.id,
        "interface": parsed_args.interface,   # public|internal|admin
        "url": parsed_args.url,
        "enabled": parsed_args.enabled,       # True/False
    }

    # Keystone v3는 region_id 사용 권장
    if parsed_args.region:
        try:
            region = identity.get_region(parsed_args.region)  # 이름/ID 모두 허용
            attrs["region_id"] = region.id
        except Exception:
            attrs["region_id"] = parsed_args.region

    # 3) 생성 요청 (SDK 프록시 호출)
    endpoint = identity.create_endpoint(**attrs)

    # 4) 출력 포맷
    return _format_endpoint(endpoint, service=service)

5) SDK 프록시

OpenStack SDK의 Identity Proxy가 고수준 메서드(create_endpoint)를 제공합니다. 내부적으로 공통 헬퍼(_create)에 위임하여 리소스 클래스(Endpoint)를 생성하도록 합니다.

6) 리소스 레벨

Endpoint 리소스는 다음과 같은 메타정보를 가집니다.

  • base_path = "/endpoints"
  • allow_create = True

_create()는 Endpoint 객체를 생성한 뒤, 해당 객체의 create() 메서드를 호출해 HTTP 요청을 실행합니다.

conn = self._get_connection()
res = resource_type.new(connection=conn, **attrs)
return res.create(self, base_path=base_path)

7) HTTP 요청/응답

create() 메서드는 Keystone API에 POST /v3/endpoints 요청을 전송합니다. 요청 본문에는 service_id, interface, url, region_id, enabled 등이 포함됩니다. Keystone 서버로부터 생성된 엔드포인트 정보를 받아 Endpoint 객체에 채웁니다.

8) 출력

CLI는 완성된 Endpoint 객체에서 필요한 컬럼만 추출해 테이블 형태로 렌더링하여 출력합니다.

📍 시퀀스 요약

User
  └─ openstack endpoint create ...

OpenStackClient
  ├─ map "endpoint create" → CreateEndpoint
  ├─ argparse 파싱(get_parser)
  └─ take_action(parsed_args)
       ├─ service/region 정규화 → attrs 구성
       └─ identity.create_endpoint(**attrs)

OpenStack SDK (Identity Proxy)
  └─ _create(Endpoint, **attrs)
        └─ Endpoint.new(...).create(session, base_path="/endpoints")
             ├─ POST /v3/endpoints ({"endpoint": {...}})
             └─ 응답 → Endpoint 객체 채움

CLI Renderer
  └─ 표 형태로 출력

마지막으로

흐름 정리

1) 사용자가 CLI 입력
2) CLI가 옵션을 파싱하고 실행 메서드(take_action) 호출
3) SDK의 Identity 프록시가 고수준 함수 실행
4) 프록시 내부 공통 헬퍼가 표준 CRUD 처리
5) Endpoint 리소스가 실제 HTTP 요청 구성/전송
6) Keystone(Identity API) 응답을 받아 화면에 출력

CRUD 정리

1) 생성 openstack endpoint create ...

  • SDK: identity.create_endpoint(...)
  • HTTP: POST /endpoints

2) 조회 openstack endpoint show <id>

  • SDK: identity.find_endpoint(...) 또는 get_endpoint(...)
  • HTTP: GET /endpoints/{id}

3) 목록 openstack endpoint list [--service ... --interface ... --region ...]

  • SDK: identity.endpoints(**filters)
  • HTTP: GET /endpoints?service_id=&interface=region_id=

4) 수정 openstack endpoint set <id> [--url ... --interface ... --region ... --enable/--disable]

  • SDK: identity.update_endpoint(id, **attrs)
  • HTTP: PATCH /endpoints/{id}

5) 삭제 openstack endpoint delete <id>

  • SDK: identity.delete_endpoint(id)
  • HTTP: DELETE /endpoints/{id}

파일 정리

1) 리소스 정의 openstacksdk/openstack/identity/v3/endpoint.py

  • Endpoint, ProjectEndpoint 클래스 정의
  • API 경로(base_path), CRUD 허용 여부, 쿼리 파라미터 지정

2) 서비스 프록시 openstacksdk/openstack/identity/v3/_proxy.py

  • create_endpoint, get_endpoint, update_endpoint 등 고수준 메서드 제공
  • 내부적으로 Proxy 공통 헬퍼 호출해 리소스 조작 수행

3) Proxy 공통 헬퍼 openstacksdk/openstack/proxy.py

  • _create, _get, _update, _delete, _list 등 표준 CRUD 메서드 구현
  • 리소스 객체 생성 후 해당 리소스의 메서드(create, fetch, commit, delete, list) 호출

4) 리소스 베이스 openstacksdk/openstack/resource.py

  • HTTP 전송(POST/GET/PATCH/DELETE)
  • 응답 파싱 및 리소스 객체 필드 채우기

0개의 댓글