Table of Contents

GoBGP

GoBGP containerlab definition

gobgp1:
  kind: linux
  image: mygobgp:4.2.0_v1
  binds:
    - gobgp1/gobgp.toml:/etc/gobgp/gobgp.toml
  exec:
    - ip -6 addr add 2001:db8:8101::2/64 dev eth1
    - ip -6 addr add 2001:db8:9101::2/64 dev eth2
    - ip link set dev eth1 up
    - ip link set dev eth2 up
  cmd: gobgpd -f /etc/gobgp/gobgp.toml -l info -a --api-hosts 0.0.0.0:50051
gobgp.toml
[global.config]
  as = 65577
  router-id = "172.16.0.103"

[[neighbors]]
  [neighbors.config]
    neighbor-address = "2001:db8:8101::1"
    peer-as = 65577
  [[neighbors.afi-safis]]
    [neighbors.afi-safis.config]
      afi-safi-name = "l3vpn-ipv4-unicast"

[[neighbors]]
  [neighbors.config]
    neighbor-address = "2001:db8:9101::1"
    peer-as = 65577
  [[neighbors.afi-safis]]
    [neighbors.afi-safis.config]
      afi-safi-name = "l3vpn-ipv4-unicast"

GoBGP commands

ubuntu@containerlab1:~/jonathan/srv6-mixed5$ docker exec -ti clab-srv6-mixed5-gobgp1 bash
gobgp1:/# gobgp global rib -a ipv4-l3vpn 
   Network                           Labels     Next Hop             AS_PATH              Age        Attrs
*  172.16.0.14:65500:192.168.34.0/24 [917744]   2001:db8:e::1                             20:28:00   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.14} {ClusterList: [172.16.0.101]} {Extcomms: [65000:101]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:e:: Flag: 0 Endpoint Behavior: 64 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.14:65500:192.168.34.0/24 [917744]   2001:db8:e::1                             20:27:59   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.14} {ClusterList: [172.16.0.102]} {Extcomms: [65000:101]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:e:: Flag: 0 Endpoint Behavior: 64 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.14:65500:192.168.44.0/24 [917760]   2001:db8:e::1                             20:28:00   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.14} {ClusterList: [172.16.0.101]} {Extcomms: [65000:102]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:e:: Flag: 0 Endpoint Behavior: 64 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.14:65500:192.168.44.0/24 [917760]   2001:db8:e::1                             20:27:59   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.14} {ClusterList: [172.16.0.102]} {Extcomms: [65000:102]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:e:: Flag: 0 Endpoint Behavior: 64 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.16:65500:192.168.36.0/24 [32]       2001:db8:10::1                            20:27:59   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.16} {ClusterList: [172.16.0.101]} {Extcomms: [65000:101]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:10:: Flag: 0 Endpoint Behavior: 20 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 24, Locator Node Length: 24, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.16:65500:192.168.36.0/24 [32]       2001:db8:10::1                            20:27:59   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.16} {ClusterList: [172.16.0.102]} {Extcomms: [65000:101]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:10:: Flag: 0 Endpoint Behavior: 20 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 24, Locator Node Length: 24, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.16:65501:192.168.46.0/24 [48]       2001:db8:10::1                            20:27:59   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.16} {ClusterList: [172.16.0.101]} {Extcomms: [65000:102]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:10:: Flag: 0 Endpoint Behavior: 20 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 24, Locator Node Length: 24, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.16:65501:192.168.46.0/24 [48]       2001:db8:10::1                            20:27:59   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.16} {ClusterList: [172.16.0.102]} {Extcomms: [65000:102]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:10:: Flag: 0 Endpoint Behavior: 20 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 24, Locator Node Length: 24, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.11:65500:192.168.31.0/24 [917520]   2001:db8:b::1                             00:36:53   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.11} {ClusterList: [172.16.0.101]} {Extcomms: [65000:101]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:b:: Flag: 0 Endpoint Behavior: 63 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.11:65500:192.168.31.0/24 [917520]   2001:db8:b::1                             00:36:53   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.11} {ClusterList: [172.16.0.102]} {Extcomms: [65000:101]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:b:: Flag: 0 Endpoint Behavior: 63 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.11:65500:192.168.41.0/24 [917552]   2001:db8:b::1                             00:36:53   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.11} {ClusterList: [172.16.0.101]} {Extcomms: [65000:102]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:b:: Flag: 0 Endpoint Behavior: 63 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]
*  172.16.0.11:65500:192.168.41.0/24 [917552]   2001:db8:b::1                             00:36:53   [{Origin: ?} {Med: 0} {LocalPref: 100} {Originator: 172.16.0.11} {ClusterList: [172.16.0.102]} {Extcomms: [65000:102]} {Prefix SID attributes: {SRv6 L3 Service Attribute: {SRv6 Information Sub TLV: SID: 2001:db8:b:: Flag: 0 Endpoint Behavior: 63 {SRv6 Structure Sub Sub TLV: [ Locator Block Length: 32, Locator Node Length: 16, Function Length: 16, Argument Length: 0, Transposition Length: 16, Transposition Offset: 48] } } } }]

GoBGP API client

Dockerfile
FROM python:3.12-slim

RUN pip install --no-cache-dir grpcio grpcio-tools

WORKDIR /app

COPY proto/ /app/proto/
COPY gobgp_client.py /app/

RUN mkdir -p /app/gobgpapi && \
    python -m grpc_tools.protoc \
    -I/app/proto \
    --python_out=/app/gobgpapi \
    --grpc_python_out=/app/gobgpapi \
    /app/proto/api/*.proto && \
    # IMPORTANT: Créer les __init__.py pour que Python traite ces dossiers comme des modules
    touch /app/gobgpapi/__init__.py && \
    touch /app/gobgpapi/api/__init__.py

# On ajoute /app et /app/gobgpapi au path
ENV PYTHONPATH=$PYTHONPATH:/app:/app/gobgpapi

CMD ["python", "gobgp_client.py"]
</cocde>


<code - gobgp_client.py>
import grpc
from api import gobgp_pb2, gobgp_pb2_grpc

# Connexion
channel = grpc.insecure_channel('gobgp1:50051')
stub = gobgp_pb2_grpc.GoBgpServiceStub(channel)

try:
    # Dans l'API GoBgpService, la méthode est GetBgp
    # Elle prend un message GetBgpRequest vide
    response = stub.GetBgp(gobgp_pb2.GetBgpRequest())
    print("--- BGP Global Info ---")
    print(response)
except grpc.RpcError as e:
    print(f"Erreur gRPC : {e.code()} - {e.details()}")
except AttributeError:
    # Si GetBgp n'existe pas, essayons GetGlobal (ancienne version)
    print("GetBgp non trouvé, essai de GetGlobal...")
    response = stub.GetGlobal(gobgp_pb2.GetGlobalRequest())
    print(response)
Files structure
ubuntu@containerlab1:~/jonathan/gobgp-client$ ls -ls 
total 20
4 -rw-rw-r--  1 ubuntu ubuntu  628 Feb  3 17:19 Dockerfile
4 -rw-rw-r--  1 ubuntu ubuntu  223 Feb  3 17:08 Dockerfile.bak
4 drwxrwxr-x 12 ubuntu ubuntu 4096 Feb  2 21:49 gobgp
4 -rw-rw-r--  1 ubuntu ubuntu  689 Feb  3 17:24 gobgp_client.py
4 drwxrwxr-x  3 ubuntu ubuntu 4096 Feb  3 17:12 proto
ubuntu@containerlab1:~/jonathan/gobgp-client$
ubuntu@containerlab1:~/jonathan/gobgp-client$
ubuntu@containerlab1:~/jonathan/gobgp-client$
ubuntu@containerlab1:~/jonathan/gobgp-client$ ls -ls proto
total 4
4 drwxrwxr-x 2 ubuntu ubuntu 4096 Feb  3 17:12 api
ubuntu@containerlab1:~/jonathan/gobgp-client$ ls -ls proto/api
total 72
16 -rw-rw-r-- 1 ubuntu ubuntu 13276 Feb  3 17:12 attribute.proto
 4 -rw-rw-r-- 1 ubuntu ubuntu  3428 Feb  3 17:12 capability.proto
 4 -rw-rw-r-- 1 ubuntu ubuntu  1225 Feb  3 17:12 common.proto
 4 -rw-rw-r-- 1 ubuntu ubuntu  3364 Feb  3 17:12 extcom.proto
32 -rw-rw-r-- 1 ubuntu ubuntu 31016 Feb  3 17:12 gobgp.proto
12 -rw-rw-r-- 1 ubuntu ubuntu  8940 Feb  3 17:12 nlri.proto
ubuntu@containerlab1:~/jonathan/gobgp-client$ 
How to launch
ubuntu@containerlab1:~/jonathan/gobgp-client$ docker run --rm -it --network clab-mgmt-net gobgp-client:v8
--- BGP Global Info ---
global {
  asn: 65577
  router_id: "172.16.0.103"
  listen_port: 179
  listen_addresses: "0.0.0.0"
  listen_addresses: "::"
}