昨年前半ころからAPI周りも含めてGoBGPのコード構成が大幅に変更されて、昨年末に2.0へとメジャーバージョンアップされました。APIに関しては、こちらで議論されてますが、そもそもメッセージがバイナリ形式ではなくprotobufで定義されるようになり、Cの関数も廃止されました。いうわけで、当初こちらの記事で紹介したメッセージの処理はもう使えなくなってます。こちらのリポジトリに、PythonのgRPCでGoBGP2.0のAPIを利用する場合の例をあげておきました。protobuf)をカレントバージョンにアップデートしてサンプルコードを実行したところ、案の定こちらの更新が必要でした。2017/1/18追記gRPCのPythonクライアント実行環境を用意するまでの手順は、もうこの記事の記載通りではなくなってますよーという指摘をしてくれた方(隣席の同僚)が、諸々アップデートしてまとめてくれました。これから試される方は、こちらのブログを参考にして実行環境を準備してください。2016/5/26追記この記事を公開した後、GoBGPでgRPCのAPIが変更されたため一部のコードは記載通りに動作しなくなりました。GitHubに公開しているサンプルコードは最新のGoBGPで動作するようAPI変更に対応していますので、記事中のコードに必要な修正はこちらのコミットをご確認ください。きっかけソフトウェアBGPデーモンのニューブリードとして巷で話題のGoBGP、最近は利用事例を公開してくれるユーザも増えているようです。自分もコーダンス小島さんの記事を拝見して俄かに試したくなりました。本気で使いたくなった動機のひとつとして、特殊経路を生成するのにずっと使っているquaggaのbgpdをexpect的な処理でアプリから操作しているわけですが、管理する経路が多くなってくると処理が滞るケースが発生してきている、という事情があります。小島さんがJANOG37のLTで発表されたgobgp-nodeのように、gRPCでクライアントから制御する手法をテストしてみることにしました。Tornadoのアプリから制御することになるので、Python版のクライアント処理を書いてみました。この記事を読んだひとがすぐ試せるように、grpcの実行環境を用意するところから手順を紹介します。amd64、Pythonは2.7.6です。バイナリのgo1.6をダウンロードして手順通りGOROOTとGOPATHの環境変数を設定しておきます。インストールは超簡単です。経路生成、削除とローカルRIBからの取得を実行するクライアントプログラムのテストですので、ピアセッションを開始する必要はありません。こちらの手順を参考に、インストールしたら適当なコンフィグでgobgpdを実行しておきます。$GOBGP_API/gobgp.protogobgp_pb2.pyが生成されていれば大丈夫で、これで準備完了です。gRPCリクエスト送信データのシリアライズとレスポンスのデコードをどうするかprotobufやgRPCの仕組みをちょっと読んでからやりはじめてみると、経路を操作するためのリクエストは以下のかんじで作成することがわかります。シリアライズする処理が必要になります。自前でせっせとやる使用するパス属性とかけっこう決まってるのでチマチマやってもいいか、、ということでやってみました。コロン区切り表記コミュニティのリストは、GoBGPのサーバ側でやってる処理とかを参考にして以下のようにしてました。逆にRIBのエントリを取得するGetRib()メソッドの戻り値のバイト文字列をTable->Destination->Pathにデコードする処理は、適当にやるとかなり荒れそうだし、がんばってちゃんとやるのもナニかなぁ、と思いました。小島さんのgobgp-nodeのようにGoBGPの共有ライブラリを使うか、RyuやExaBGPとかのモジュールをインポートして使うか、の選択になります。後者の方は、シリアライズとデコードのためだけにわざわざ追加でインストールするのもナニかなぁという気がしたのと、共有ライブラリの関数の戻り値の扱いがけっこう簡単なことを教えていただいたので、前者の方法でいくことにしました。共有ライブラリを利用するためにコンパイルまずは$GOPATH配下に設置されているgogbpのソースからビルドしておきます。*golibgobgp.soとlibgobgp.hが生成されます。Pythonからの利用方法gobgp-nodeでは、C++で書いたNodeアドオンからリンクしてGoBGPのシリアライズ処理を利用していて、本体からはアドオンのファンクションを実行するような作りになっています。(詳しくはJANOG発表資料をご参照)Pythonの場合は、標準ライブラリのctypesを使って直接ロードして、GoBGPの関数をメソッドとして利用できます。みて確認しますが、まず共有ライブラリ関数とPython側のデータの受け渡し用に、Pythonでも対応する構造体をctypes.Structureのサブクラスとして定義しておきます。]...>>>そして利用する関数の引数と戻り値のタイプを定義しておきます。)ここまでやっておくと共有ライブラリの関数を使えるようになります。引数を渡し方で、じつはgobgpのCLIと全く同じシンタックスでいいのです。no-exportと同等のことをしたければ、以下のようにしてシリアライズ処理ができちゃいます。'path_attributes_len']となってます。Pathメッセージの内容(上記のnlriとpattrs)は以下の4つの値を使って渡すことができます。処理を把握できたので、各処理を実行するスクリプトにして公開してみました。https://github.com/tamihiro/gobgp_grpc_demoこの記事で紹介したようにgRPCが動作する環境を用意すれば、すぐに試せるはずです。Community試したりソースをチェックして気づいたことなどご指摘いただけると助かります。まとめ共有ライブラリを利用することによって、Pythonのクライアントでもこれほど簡潔に処理を記述することができました。firstな設計」という謳い文句通りであることを実感しました。その他の機能や性能においても進化をつづけているので今後ますます楽しみです。upLoginユーザーは見つかりませんでした。