OF-Config 라이브러리¶
이 장에서는 Ryu에 포함된 OF-Config 클라이언트 라이브러리에 대해 소개합니다.
OF-Config 프로토콜¶
OF-Config는 OpenFlow 스위치의 관리를 위한 프로토콜입니다. NETCONF (RFC 6241) 스키마로 정의되며, 논리 스위치, 포트, 큐 등의 상태를 얻어오거나 설정이 가능합니다.
OpenFlow와 동일하게 ONF에서 제정한 것으로, 다음 사이트에서 스펙을 확인할 수 있습니다.
https://www.opennetworking.org/sdn-resources/onf-specifications/openflow-config
이 라이브러리는 OF-Config 1.1.1을 준수하고 있습니다.
주석
현재 Open vSwitch는 OF-Config를 지원하지 않지만 같은 목적을 위해 OVSDB하는 서비스를 제공하고 있습니다. OF-Config는 비교적 새로운 표준으로 Open vSwitch가 OVSDB을 구현했을 때는 아직 존재하지 않았었습니다.
OVSDB 프로토콜은 RFC 7047으로 스펙이 공개되어 있지만, 사실상 Open vSwitch 전용 프로토콜이 되고 있습니다. OF-Config는 비록 갓 등장하였지만 미래에는 많은 OpenFlow 스위치에서 구현될 것으로 예상됩니다.
라이브러리 구성¶
ryu.lib.of_config.capable_switch.OFCapableSwitch 클래스¶
NETCONF 세션을 처리하기 위한 클래스입니다.
from ryu.lib.of_config.capable_switch import OFCapableSwitch
ryu.lib.of_config.classes 모듈¶
설정 내용을 python 객체로 취급하기위한 클래스 군을 제공하는 모듈입니다.
주석
클래스 이름은 기본적으로 OF-Config 1.1.1 yang specification에 grouping 키워드로 사용되는 이름과 동일합니다. 예. OFPortType
import ryu.lib.of_config.classes as ofc
예제¶
스위치에 연결¶
SSH 트랜스 포트를 사용하여 스위치에 연결합니다. unknown_host_cb에는 알 수 없는 SSH 호스트 키를 처리하는 콜백 함수가 있지만, 여기에서는 무조건 연결을 계속하도록 하고 있습니다.
sess = OFCapableSwitch(
host='localhost',
port=1830,
username='linc',
password='linc',
unknown_host_cb=lambda host, fingeprint: True)
GET¶
NETCONF GET을 사용하여 상태를 가져 오는 방법입니다. 모든 포트의 /resources/port/resource-id와 /resources/port/current-rate를 표시합니다.
csw = sess.get()
for p in csw.resources.port:
print p.resource_id, p.current_rate
GET-CONFIG¶
NETCONF GET-CONFIG를 사용하여 설정을 검색하는 예입니다.
주석
실행은 현재 NETCONF의 데이터 저장소에서 실행되는 설정입니다. 구현에 따라, 그 밖에도 startup (장치를 시작할 때 로드되는 기타 설정) 나 candidate (후보 설정) 등의 데이터 스토어를 이용할 수 있습니다.
모든 포트의 /resources/port/resource-id와 /resources/port/configuration/admin-state를 표시합니다.
csw = sess.get_config('running')
for p in csw.resources.port:
print p.resource_id, p.configuration.admin_state
EDIT-CONFIG¶
NETCONF EDIT-CONFIG를 사용하여 설정을 변경하는 예입니다. 기본적으로 GET-CONFIG에서 얻은 설정을 편집하여 EDIT-CONFIG를 사용해 다시 전송하는 단계입니다.
주석
프로토콜상에서는 EDIT-CONFIG 설정의 부분적 편집을 할 수도 있지만 이러한 방법이 무난합니다.
모든 포트의 /resources/port/configuration/admin-state를 down으로 설정합니다.
csw = sess.get_config('running')
for p in csw.resources.port:
p.configuration.admin_state = 'down'
sess.edit_config('running', csw)