OpenConfig ... 設定・管理のためのデータモデル と エトセトラ

> 「ソフトウェアからのネットワーク機器操作」について何かを書くという [NetOpsCoding Advent Calendar 2016](http://qiita.com/advent-calendar/2016/netopscoding) への投稿記事です。

最近「WhiteBox Switchで動作するネットワークOS（NOS）」を作っていて悩ましいのは、「異なるプラットフォームで動作させた時にも利用可能なデータモデルとは？」というあたり。ひとくちに「WhiteBox Switch」といってもその物理的な違いは大きく、設定可能なパラメータや取得可能な情報が結構異なります。また、その見え方は日々運用するオペレーターや、ネットワーク機器を設定・管理するシステム（NMS: Network Management System）を開発・メンテする人が利用しやすいものである必要があります。

というわけで、参考になりそうな「OpenConfig」という団体の活動について調べてみました。

# OpenConfig とは？

既存のネットワーク機器も各社・各モデルで設定・管理情報などが異なる事が多く、ネットワークの自動化を進ようとしても（労力的に）難しい状況でした。そのため、

* ネットワーク機器メーカーに依存しない（vendor-neutralな）、共通のプログラマブルなインターフェース（API）

を作るべく、２年ほど前に Google, Microsoft, AT&T, British Telecom によって活動を開始しました。
現在も「有志による団体」であり、入会のための契約（legal agreements）や規約（Bylaw）が存在しない、まさに共通の課題を解決するためだけに集まっている団体となります。

現在の会員は [OpenConfig participants](http://www.openconfig.net/about/participants/) に列挙されている通り、17社すべて（機器メーカーではなく）ネットワークをオぺレーションしている企業です。

特徴的なのは「オペレーター主導」という事で、参加条件として、個人ではなく企業の代表として参加すること、自社のオペレーションやデザイン上の課題を持ち寄る事、などを求められています。

> 抜粋：[OpenConfig FAQ for operators](http://www.openconfig.net/docs/faq-for-operators/)
> What do I need to do to join OpenConfig?
> 
> * have the full support of your organization – this should be work you do on behalf of your company, not as an individual interest or private hobby – your company should be willing to be identified as a participant
> * be closely involved in operating, designing, or architecting your organization’s networks so that you can represent your operational requirements

# IETFなど、他の標準化団体との関係

OpenConfigの目的は「ネットワーク機器メーカーに依存しないAPI」がネットワーク機器に実装され利用可能になることであり、標準を作ること自体を目的とはしていません。
そのため、IETFをはじめとする業界団体とは協力して活動しており、[IETF NETCONF Data Modeling Language (netmod) Working Group](https://datatracker.ietf.org/wg/netmod/documents/) で活動しているメンバーも多く、実際に利用可能なデータモデルはIETFで標準化されたものも利用しています。
また、[NETCONF](https://datatracker.ietf.org/doc/rfc6241/), [RESTCONF](https://datatracker.ietf.org/doc/draft-ietf-netconf-restconf/) といったIETFで標準化されたトランスポートを使ったアクセス方法も利用しています。

# OpenConfig の活動

大きく分類すると、以下３つのプロジェクトがあります。

* Data models and APIs
* Streaming telemetry
* Data transport and RPC protocols

データーモデル定義が大きな割合を占めますが、定義ファイル（YANG）を扱うための各種ツールも開発・公開しており、ネットワークプログラマビリティを試してみようとする方にはツール群のありがたみの方が大きく感じそうです。

以降、各プロジェクトと関連ツールの紹介をします。

# [Data models and APIs](http://www.openconfig.net/projects/models/)

ネットワーク機器の設定・管理のための vendor-neutral なデータモデルが、ネットワーク機器（ソフトウェア含む）で利用されることを目指し活動しています。

* これらのデータモデルは OpenConfig が作成しても良いし、OpenConfigの要求に沿うようなサードパーティのモジュールをコンパイルして作成しても良い
* These models may be developed directly by OpenConfig, or compiled from 3rd party modules that conform with the OpenConfig requirements.

と記載されてる通り、データタイプなどは IETF により策定されてものが流用されています。

データモデリング言語としては [YANG (RFC6020)](https://datatracker.ietf.org/doc/rfc6020/) が利用されており、最新の定義ファイルは GitHub レポジトリ（ https://github.com/openconfig/public ）で管理されています。

例えばインターフェース関連データモデルを定義している [openconfig-interfaces.yang](https://github.com/openconfig/public/blob/master/release/models/interfaces/openconfig-interfaces.yang) を参照すると、[ietf-interfaces (RFC7223)](https://tools.ietf.org/html/rfc7223)、[ietf-yang-types RFC6991](https://tools.ietf.org/html/rfc6991) など、IETFで定義されたモデルを流用していることが分かります。

```yang
  import ietf-interfaces { prefix ietf-if; }
  import ietf-yang-types { prefix yang; }
```

2016年11月25日時点で「発行済み（Published）」「レビュー中（under review）」「作業中（in-progress）」のデータモデルは以下の通りです。

![openconfig-models-2016-11-25.png](https://qiita-image-store.s3.amazonaws.com/0/93467/e3c6a58d-578b-8263-219a-5aa310669464.png)
> 引用：[Data models and APIs, Updated 11-25-2016](http://www.openconfig.net/projects/models/)


# [Streaming telemetry](http://www.openconfig.net/projects/telemetry/)

ネットワークのモニタリングを、従来のSNMPから、よりスケールし拡張性のある方法に移行しようという活動で、以下のような動作が提案されています。

* ネットワーク機器は継続的に情報をストリームする（incremental updates）
* 参照する側（NMS等）は必要な情報を OpenConfig データモデルを用いて指定し、購読（Subscribe）する

参考実装（Reference Implementation）を GitHub から入手可能です。
https://github.com/openconfig/reference/tree/master/telemetry

# [Data transport and RPC protocols](http://www.openconfig.net/projects/rpc/)

OpenConfig データモデルは、特定のエンコーディング・トランスポート・RPCプロトコルに依存せず利用可能です。

古くからあるプロトコルとしては、[NETCONF](https://datatracker.ietf.org/doc/rfc6241/) や [RESTCONF](https://datatracker.ietf.org/doc/draft-ietf-netconf-restconf/) といったIETFで標準化されたトランスポートが利用されています。

また、新しい gNMI (gRPC Network Management Interface) というプロトコルも考案されています。
gNMI の参照コードは以下 GitHub レポジトリで入手可能で、gRPC / protobuf3 を用いた Go や Python を用いたコードも既に存在しており、より簡易/スムーズなアプリケーションへの実装が可能になるのではと期待されます。

https://github.com/openconfig/reference/tree/master/rpc/gnmi

# OpenConfig 関連ツール

OpenConfig プロジェクトで開発されたツールは以下ページに列挙されています。

http://www.openconfig.net/software/

* pyangbind
    * pyangプラグイン。YANGモデルをPython class hierarchyに変換する。
* goyang
    * Go言語で記述された YANG パーサー＆コンパイラ
* YANG design studio
    * Eclipseプラグイン。YANGモデルの作成・編集・描画などができる。
* OpenConfig pyang plugins
    * pyangコンパイラのためのプラグイン

中でも goyang はGo言語での開発に重宝しています。


> 日付変わってしまったので、ツールの使い方などはまた来年... m(_ _)m