naoki86star

インターネットの片隅でなにかしら書いてみる

python版gobgpdクライアントを試します

2019/08/20追記:この記事のgobgpdは1.3x系のときのものです。

以下のサイトを参考にpythonからgobgpdを動かすことをしました。

GoBGPの共有ライブラリ関数を利用するPython版gobgpdクライアント - Qiita

当方の検証環境は、ubuntu16 on virtualbox on windows7です。時間が経過していくらか変更になっている点があったので、以下に現時点における手順例(差分)を残しておきます。

ubuntu16では、golangは、apt-getで入ってくれました。そのときのgolangではGOROOT=/usr/lib/go-1.6が設定されてます。GOPATHはユーザーが設定するので以下例ではGOPATH=/usrとして書き進めます。

2018/04/28追記:最新gobgpdのbuildに失敗するので開発が活発な間はgolangについてはapt以外の方法で入れるように計画しておくほうがいいかもしれません。一応自分でもgolangの手順を別途書いておきます。*1

$ sudo apt-get install golang
...
$ go env
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH=""
GORACE=""
GOROOT="/usr/lib/go-1.6"
GOTOOLDIR="/usr/lib/go-1.6/pkg/tool/linux_amd64"
GO15VENDOREXPERIMENT="1"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0"
CXX="g++"
CGO_ENABLED="1"

ProtocolBufferは(元記事中はv3.0.0-beta-2)今時点の最新は3.1.0のようです。gRPCにバンドルされているthird_party/protobufを使えばよいです。gRPCをgit cloneして、そのあとgit submodule updateしてprotobuf/gRPC一式ビルドできる準備が整います。third_party/protobufを使う点を除くとコマンドラインも元の記事と同じです。

$ git clone https://github.com/grpc/grpc.git
...

$ cd gprc

$ git submodule update --init
...

$ cd third_party/protobuf
$ ./autogen.sh
...

$ ./configure && make
...

$ sudo make install
...

$ sudo ldconfig
$ cd python/
$ sudo python setup.py install
...

$ cd ../../..
$ make
...

$ sudo make install

$ sudo pip install -rrequirements.txt

$ sudo GRPC_PYTHON_BUILD_WITH_CYTHON=1 python setup.py install

・GoBGPのgRPCサーバと通信するPythonクライアント用のスタブの作成

gRPCが更新されてスタブ生成手順が変わっています。(http://www.grpc.io/docs/quickstart/python.html #Generate gRPC code)*2

以下ではgobgpd/gobgpのインストールでGOPATH=/usrとしてます。

$ sudo GOPATH=/usr go get github.com/osrg/gobgp/gobgpd
$ sudo GOPATH=/usr go get github.com/osrg/gobgp/gobgp
..
$ cd gprc
$ git submodule update --init
..
$ sudo python -m pip install grpcio
$ sudo python -m pip install grpcio-tools
$ python -m grpc_tools.protoc -I/usr/src/github.com/osrg/gobgp/api --python_out=. --grpc_python_out=. /usr/src/github.com/osrg/gobgp/api/gobgp.proto

・共有ライブラリをビルド

$ export GOPATH=/usr
$ cd $GOPATH/src/github.com/osrg/gobgp/gobgp/lib
$ go build --buildmode=c-shared -o libgobgp.so *.go


・python版gobgpdクライアントを試します
GitHub - tamihiro/gobgp_grpc_demo: Yet another gobgpd grpc client written in Python

1例、getrib.pyの動作をみることができます。

まずgobgpdを立ち上げておく、動作確認なので超簡易なgobgpd.confを用意

$ sudo gobgpd -f gobgpd.conf
..
$ pyhton getrib.py -l
$

たとえばgobgpdをあげておかなければgetrib.pyはちゃんとエラーあげてきます。


2017/02/17追記:python protobuf(google.protobuf)のバージョン違いが原因か、getrib.pyが直近の自分環境で正しく動きませんでした。詳細はまとまったら別ページで書くことにします。

*1:https://golang.org/doc/install/sourceに詳しく書いてありますが。。

*2:pythonスタブ生成方法が以前と変わっているのに注意です