diff options
Diffstat (limited to 'tools/grpc/cpp')
-rw-r--r-- | tools/grpc/cpp/Makefile | 79 | ||||
-rw-r--r-- | tools/grpc/cpp/README.md | 60 | ||||
-rw-r--r-- | tools/grpc/cpp/gobgp_api_client.cc | 63 |
3 files changed, 202 insertions, 0 deletions
diff --git a/tools/grpc/cpp/Makefile b/tools/grpc/cpp/Makefile new file mode 100644 index 00000000..e277acfb --- /dev/null +++ b/tools/grpc/cpp/Makefile @@ -0,0 +1,79 @@ +CXX = g++ +CPPFLAGS += -I/opt/protobuf_3.0.0_alpha4/include -I/opt/grpc/include -pthread +CXXFLAGS += -std=c++11 +LDFLAGS += -L/opt/grpc/lib -L/opt/protobuf_3.0.0_alpha4/lib -lgrpc++_unsecure -lgrpc -lgpr -lprotobuf -lpthread -ldl +PROTOC = protoc +GRPC_CPP_PLUGIN = grpc_cpp_plugin +GRPC_CPP_PLUGIN_PATH ?= `which $(GRPC_CPP_PLUGIN)` + +PROTOS_PATH = . + +vpath %.proto $(PROTOS_PATH) + +all: system-check gobgp_api_client + +gobgp_api_client: gobgp_api_client.pb.o gobgp_api_client.grpc.pb.o gobgp_api_client.o + $(CXX) $^ $(LDFLAGS) -o $@ + +%.grpc.pb.cc: %.proto + $(PROTOC) -I $(PROTOS_PATH) --grpc_out=. --plugin=protoc-gen-grpc=$(GRPC_CPP_PLUGIN_PATH) $< + +%.pb.cc: %.proto + $(PROTOC) -I $(PROTOS_PATH) --cpp_out=. $< + +clean: + rm -f *.o *.pb.cc *.pb.h gobgp_api_client + + +# The following is to test your system and ensure a smoother experience. +# They are by no means necessary to actually compile a grpc-enabled software. + +PROTOC_CMD = which $(PROTOC) +PROTOC_CHECK_CMD = $(PROTOC) --version | grep -q libprotoc.3 +PLUGIN_CHECK_CMD = which $(GRPC_CPP_PLUGIN) +HAS_PROTOC = $(shell $(PROTOC_CMD) > /dev/null && echo true || echo false) +ifeq ($(HAS_PROTOC),true) +HAS_VALID_PROTOC = $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false) +endif +HAS_PLUGIN = $(shell $(PLUGIN_CHECK_CMD) > /dev/null && echo true || echo false) + +SYSTEM_OK = false +ifeq ($(HAS_VALID_PROTOC),true) +ifeq ($(HAS_PLUGIN),true) +SYSTEM_OK = true +endif +endif + +system-check: +ifneq ($(HAS_VALID_PROTOC),true) + @echo " DEPENDENCY ERROR" + @echo + @echo "You don't have protoc 3.0.0 installed in your path." + @echo "Please install Google protocol buffers 3.0.0 and its compiler." + @echo "You can find it here:" + @echo + @echo " https://github.com/google/protobuf/releases/tag/v3.0.0-alpha-1" + @echo + @echo "Here is what I get when trying to evaluate your version of protoc:" + @echo + -$(PROTOC) --version + @echo + @echo +endif +ifneq ($(HAS_PLUGIN),true) + @echo " DEPENDENCY ERROR" + @echo + @echo "You don't have the grpc c++ protobuf plugin installed in your path." + @echo "Please install grpc. You can find it here:" + @echo + @echo " https://github.com/grpc/grpc" + @echo + @echo "Here is what I get when trying to detect if you have the plugin:" + @echo + -which $(GRPC_CPP_PLUGIN) + @echo + @echo +endif +ifneq ($(SYSTEM_OK),true) + @false +endif diff --git a/tools/grpc/cpp/README.md b/tools/grpc/cpp/README.md new file mode 100644 index 00000000..924af8ed --- /dev/null +++ b/tools/grpc/cpp/README.md @@ -0,0 +1,60 @@ +Here you could find nice examples for gobgpd API with C++ client. + +I'm using Ubuntu 14.04 LTS x86_64. + +For gRPC we need so much dependencies, please make coffee and be ready! + +Install ProtoBuffers: +```bash +apt-get update +apt-get install -y gcc make autoconf automake git libtool g++ curl + +cd /usr/src +wget https://github.com/google/protobuf/archive/v3.0.0-alpha-4.tar.gz +tar -xf v3.0.0-alpha-4.tar.gz +cd protobuf-3.0.0-alpha-4/ +./autogen.sh +./configure --prefix=/opt/protobuf_3.0.0_alpha4 +make -j 4 +make install +``` + +Install gRPC: +```bash +apt-get update +apt-get install -y gcc make autoconf automake git libtool g++ python-all-dev python-virtualenv + +cd /usr/src/ +git clone https://github.com/grpc/grpc.git +cd grpc +git submodule update --init +make -j 4 +make install prefix=/opt/grpc +``` + +Add libs to the system path: +```bash +echo "/opt/grpc/lib" > /etc/ld.so.conf.d/grpc.conf +echo "/opt/protobuf_3.0.0_alpha4/lib" > /etc/ld.so.conf.d/protobuf.conf +ldconfig +``` + +Clone this repository and build API example: +```bash +export PATH="$PATH:/opt//grpc/bin:/opt/protobuf_3.0.0_alpha4/bin/" + +cd /usr/src +git clone https://github.com/osrg/gobgp.git +cd gobgp/api/cpp +cp ../gobgp.proto gobgp_api_client.proto +make +``` + +Let's run it: +```bash +./gobgp_api_client +We received: Peer AS: 65001 +Peer router id: 213.133.111.200 +Peer flops: 0 +BGP state: BGP_FSM_ESTABLISHED +``` diff --git a/tools/grpc/cpp/gobgp_api_client.cc b/tools/grpc/cpp/gobgp_api_client.cc new file mode 100644 index 00000000..938b9f0e --- /dev/null +++ b/tools/grpc/cpp/gobgp_api_client.cc @@ -0,0 +1,63 @@ +#include <iostream> +#include <memory> +#include <sstream> +#include <string> + +#include <grpc/grpc.h> +#include <grpc++/channel.h> +#include <grpc++/client_context.h> +#include <grpc++/create_channel.h> +#include <grpc++/security/credentials.h> +#include "gobgp_api_client.grpc.pb.h" + +using grpc::Channel; +using grpc::ClientContext; +using grpc::Status; + +using api::Grpc; + +class GrpcClient { + public: + GrpcClient(std::shared_ptr<Channel> channel) : stub_(Grpc::NewStub(channel)) {} + + std::string GetAllNeighbor(std::string neighbor_ip) { + api::Arguments request; + request.set_rf(4); + request.set_name(neighbor_ip); + + ClientContext context; + + api::Peer peer; + grpc::Status status = stub_->GetNeighbor(&context, request, &peer); + + if (status.ok()) { + api::PeerConf peer_conf = peer.conf(); + api::PeerInfo peer_info = peer.info(); + + std::stringstream buffer; + + buffer + << "Peer AS: " << peer_conf.remote_as() << "\n" + << "Peer router id: " << peer_conf.id() << "\n" + << "Peer flops: " << peer_info.flops() << "\n" + << "BGP state: " << peer_info.bgp_state(); + + return buffer.str(); + } else { + return "Something wrong"; + } + + } + + private: + std::unique_ptr<Grpc::Stub> stub_; +}; + +int main(int argc, char** argv) { + GrpcClient gobgp_client(grpc::CreateChannel("localhost:8080", grpc::InsecureCredentials())); + + std::string reply = gobgp_client.GetAllNeighbor("213.133.111.200"); + std::cout << "We received: " << reply << std::endl; + + return 0; +} |