R&D/클라우드

OpenStack neutron 코드 분석 : network

sunshout 2025. 1. 12. 01:20

OpenStack Neutron의 네트워크 생성 코드를 분석하려면, Neutron 프로젝트의 주요 구성 요소와 흐름을 이해해야 합니다. Neutron은 플러그인 기반 아키텍처를 사용하여 네트워크 API 요청을 처리하며, 네트워크의 실제 구현은 플러그인에서 수행됩니다.

아래는 Neutron의 네트워크 생성 코드 흐름과 주요 파일 및 함수에 대한 설명입니다.


Neutron 네트워크 생성의 주요 흐름

  1. API 요청 수신
    • Neutron 서버는 REST API 요청을 수신합니다.
    • 예: POST /v2.0/networks
  2. Controller 처리
    • API 요청은 WSGI 기반 Neutron 서버에서 처리됩니다.
    • 관련 코드 파일: neutron/api/v2/resources.py
    • 요청은 특정 리소스(network)와 관련된 핸들러로 전달됩니다.
  3. DB 작업 및 플러그인 호출
    • 요청 데이터는 데이터베이스에 저장되고 플러그인 호출을 통해 네트워크가 생성됩니다.
    • 관련 파일:
      • neutron/db/db_base_plugin_v2.py
      • neutron/plugins/ml2/plugin.py
  4. 결과 반환
    • API 서버는 네트워크 생성 결과를 JSON 응답으로 반환합니다.

주요 코드 경로 분석

1. API 엔드포인트 처리

파일: neutron/api/v2/resources.py

핵심 클래스: Resource

def create(self, request, body=None):
    # 요청 본문 파싱
    body = self._deserialize(request.body, request.get_content_type())

    # 정책 검사
    self._validate_policy(request, 'create')

    # 플러그인 호출
    action_result = self._plugin.create_network(context, body['network'])

    # 결과 반환
    return self._serialize(action_result, content_type)
 
  • create() 메서드는 API 요청을 처리하며 플러그인에 네트워크 생성 작업을 위임합니다.
  • _plugin.create_network()가 호출되며 실제 네트워크 생성은 플러그인에서 수행됩니다.

2. 데이터베이스 처리

파일: neutron/db/db_base_plugin_v2.py

핵심 클래스: NeutronDbPluginV2

def create_network(self, context, network):
    # 요청 데이터에서 네트워크 정보 추출
    network = network['network']

    # 데이터베이스에 네트워크 추가
    with db_api.CONTEXT_WRITER.using(context):
        # 네트워크 메타데이터 저장
        result = self._create_network_db(context, network)
        
        # 기타 후처리
        self._process_l3_create(context, result, network)

    return result
  • create_network()는 데이터베이스에 네트워크를 생성하며, 플러그인 처리 전에 데이터의 일관성을 유지합니다.
  • _create_network_db()는 네트워크 메타데이터를 Neutron 데이터베이스에 저장하는 역할을 합니다.

3. 플러그인 처리

파일: neutron/plugins/ml2/plugin.py

핵심 클래스: Ml2Plugin

def create_network(self, context, network):
    # 기본 데이터베이스 작업 수행
    result = super(Ml2Plugin, self).create_network(context, network)

    # 메커니즘 드라이버 호출
    self.mechanism_manager.create_network_postcommit(context)

    return result
  • Ml2Plugin은 Neutron의 ML2(Multi-Layer 2) 플러그인으로, 다양한 메커니즘 드라이버를 지원합니다.
  • create_network_postcommit()은 네트워크 생성 후 실제 네트워크 장치 구성이나 추가 작업을 처리합니다.

4. 메커니즘 드라이버

파일: neutron/plugins/ml2/managers.py

핵심 클래스: MechanismManager

def create_network_postcommit(self, context):
    for driver in self.ordered_mechanisms:
        try:
            # 각 드라이버에서 네트워크 생성 작업 수행
            driver.obj.create_network_postcommit(context)
        except Exception as e:
            LOG.error(f"Driver {driver.name} failed: {e}")
  • create_network_postcommit()는 등록된 메커니즘 드라이버를 순차적으로 호출합니다.
  • 메커니즘 드라이버는 플러그인에 따라 다르며, VLAN, VXLAN, GRE 등 다양한 네트워크 기술을 지원합니다.

주요 데이터 흐름 요약

  1. API 레이어 (neutron/api/v2/resources.py)
    • 요청을 파싱하고 정책을 확인한 후 플러그인을 호출합니다.
  2. DB 레이어 (neutron/db/db_base_plugin_v2.py)
    • 네트워크 메타데이터를 Neutron 데이터베이스에 저장합니다.
  3. 플러그인 레이어 (neutron/plugins/ml2/plugin.py)
    • ML2 플러그인을 통해 네트워크 생성 작업을 관리합니다.
  4. 메커니즘 드라이버 레이어 (neutron/plugins/ml2/managers.py)
    • 네트워크 구현 세부 사항을 처리합니다.