공통 gRPC API 정의 및 생성된 코드를 제공하는 공유 모듈입니다.
esba-tnc-agent와esba-tnc-proxy간의 통신을 위한 공통 API 정의- Protocol Buffers로 정의된 서비스 및 메시지 타입
- 두 프로젝트에서 공유하여 사용하는 생성된 gRPC 코드
- GoVPP 라이브러리 및 binapi 코드 제공
- binapi에서 proto 자동 생성 도구 (proto-generator)
esba-tnc-api/
├── govpp/ # GoVPP 라이브러리 (로컬)
│ ├── binapi/ # 생성된 binapi 코드
│ ├── binapigen/ # binapi generator
│ └── ...
├── proto/
│ ├── agent.proto # gRPC 서비스 정의
│ ├── agent.pb.go # 생성된 메시지 코드
│ └── agent_grpc.pb.go # 생성된 서비스 코드
├── tools/
│ └── proto-generator/ # binapi → proto 변환 도구
│ ├── config/
│ │ └── proto.yaml # 변환 설정 파일
│ └── ...
├── scripts/
│ ├── generate-binapi.sh # binapi 생성 스크립트
│ └── generate-proto.sh # proto 파일 컴파일 스크립트
├── go.mod
├── go.sum
└── README.md
cd esba-tnc-api
./scripts/generate-proto.sh또는 수동으로:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
proto/agent.protorequire esba-tnc-api v0.0.0
replace esba-tnc-api => ../esba-tnc-apirequire esba-tnc-api v0.0.0
replace esba-tnc-api => ../esba-tnc-apiimport (
pb "esba-tnc-api/proto"
)
// 서버에서
proto.RegisterTncAgentServer(grpcServer, &server{})
// 클라이언트에서
client := pb.NewTncAgentClient(conn)TncAgent: VPP 데이터 수집 및 이벤트 스트리밍 서비스
HealthCheck: 서버 상태 확인CollectInterfaces: 인터페이스 정보 수집CollectNeighbors: Neighbor 정보 수집CollectFIB: FIB 정보 수집CollectACL: ACL 정보 수집CollectMemif: Memif 정보 수집CollectSRv6: SRv6 정보 수집CollectVersion: VPP 버전 정보 수집CollectHardware: 하드웨어 정보 수집CollectIPAddresses: IP 주소 정보 수집CollectL2FIB: L2 FIB 정보 수집CollectBridgeDomains: Bridge Domain 정보 수집CollectVXLAN: VXLAN 터널 정보 수집CollectUPFApplications: UPF 애플리케이션 정보 수집CollectUPFNWI: UPF Network Instance 정보 수집CollectUPFPFCPEndpoints: UPF PFCP 엔드포인트 정보 수집CollectUPFPolicies: UPF 정책 정보 수집CollectUPFNATPools: UPF NAT 풀 정보 수집
WatchEvents: VPP 이벤트 실시간 스트리밍
주요 메시지 타입은 proto/agent.proto에 정의되어 있습니다:
HealthCheckRequest/HealthCheckResponse: 헬스 체크CollectRequest: 리소스 수집 요청InterfaceList: 인터페이스 목록NeighborList: Neighbor 목록FIBList: FIB 목록ACLList: ACL 목록MemifList: Memif 목록SRv6List: SRv6 목록VersionInfo: VPP 버전 정보HardwareInfo: 하드웨어 정보IPAddressList: IP 주소 목록L2FIBList: L2 FIB 목록BridgeDomainList: Bridge Domain 목록VXLANList: VXLAN 터널 목록UPFApplicationList: UPF 애플리케이션 목록UPFNWIList: UPF Network Instance 목록UPFPFCPEndpointList: UPF PFCP 엔드포인트 목록UPFPolicyList: UPF 정책 목록UPFNATPoolList: UPF NAT 풀 목록WatchEventsRequest/Event: 이벤트 스트리밍
proto-generator를 사용하여 binapi에서 자동으로 proto와 변환 함수를 생성:
# 전체 빌드 (binapi → proto → 컴파일 → 변환 함수)
./scripts/generate-all.sh --with-binapi
# 또는 단계별 실행
# 1. binapi 생성 (VPP API에서)
./scripts/generate-binapi.sh /usr/share/vpp/api
# 2. proto 생성
cd tools/proto-generator
go run . --proto
# 3. proto 컴파일
cd ../..
./scripts/generate-proto.sh
# 4. 변환 함수 생성
cd tools/proto-generator
go run . --converters# 1. proto 파일 수정
vim proto/agent.proto
# 2. 코드 재생성
./scripts/generate-proto.sh
# 3. 변경사항 확인
git diff proto/
# 4. 다른 프로젝트에서 업데이트
cd ../esba-tnc-agent
go mod tidy
cd ../esba-tnc-proxy
go mod tidyproto-generator는 binapi Go 코드를 파싱하여 proto 정의와 변환 함수를 자동 생성합니다.
tools/proto-generator/config/proto.yaml에서 변환할 리소스를 설정합니다:
resources:
- name: interfaces
binapi_message: SwInterfaceDetails
proto_message: Interface
list_message: InterfaceList
fields:
- binapi_field: SwIfIndex
proto_field: sw_if_indexcd tools/proto-generator
# proto만 생성
go run . --proto
# 변환 함수만 생성
go run . --converters
# 둘 다 생성
go run . --proto --convertersproto/agent_generated.proto: 생성된 proto 정의../esba-tnc-agent/agent/grpc/handler/converters_gen.go: 생성된 변환 함수
새로운 VPP 리소스를 esba-tnc-api에 추가할 때는 다음 단계를 따라야 합니다:
tools/proto-generator/config/proto.yaml에 새로운 리소스를 추가합니다.
예시: tools/proto-generator/config/proto.yaml
resources:
# ... 기존 리소스들 ...
# 새로운 리소스 추가
- name: new_resource
binapi_message: NewResourceDetails
proto_message: NewResource
list_message: NewResourceList
fields:
- binapi_field: ID
proto_field: id
converter: "uint32({{field}})"
- binapi_field: Name
proto_field: name
converter: "string(bytes.Trim({{field}}, \"\\x00\"))"
# ... 추가 필드들 ...cd tools/proto-generator
go run . --binapi-dir=../govpp/binapi --output=../proto --config=config/proto.yaml --proto이 명령은 proto/agent_generated.proto에 새로운 리소스 정의를 생성합니다.
proto/agent.proto에 직접 추가:
// RPC 메서드 추가
rpc CollectNewResource(CollectRequest) returns (NewResourceList);
// 메시지 타입 추가
message NewResourceList {
repeated NewResourceEntry resources = 1;
}
message NewResourceEntry {
uint32 id = 1;
string name = 2;
// ... 추가 필드들 ...
}./scripts/generate-proto.sh또는 수동으로:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
proto/agent.proto이 명령은 다음 파일들을 생성합니다:
proto/agent.pb.go: 메시지 타입 코드proto/agent_grpc.pb.go: 서비스 코드
변경사항을 커밋하고 새 버전 태그를 생성합니다:
# 변경사항 커밋
git add .
git commit -m "feat: Add NewResource collection support"
# 새 버전 태그 생성 (예: v0.1.5)
git tag -a v0.1.5 -m "feat: Add NewResource collection support"
# GitHub에 push
git push origin main
git push origin v0.1.5다른 프로젝트(esba-tnc-agent, esba-tnc-proxy)에서 새 버전을 사용하도록 업데이트:
# esba-tnc-agent/go.mod
require github.com/clonealpha/esba-tnc-api v0.1.5
# esba-tnc-proxy/go.mod
require github.com/clonealpha/esba-tnc-api v0.1.5proto-generator를 사용하여 변환 함수를 자동 생성할 수 있습니다:
cd tools/proto-generator
go run . --binapi-dir=../govpp/binapi --output=../esba-tnc-agent/agent/grpc/handler --config=config/proto.yaml --converters이 명령은 esba-tnc-agent/agent/grpc/handler/converters_gen.go에 변환 함수를 생성합니다.
새 리소스 추가 시 다음 항목을 확인하세요:
-
tools/proto-generator/config/proto.yaml에 리소스 설정 추가 -
proto/agent.proto에 RPC 메서드 및 메시지 타입 추가 (수동 또는 자동) - Proto 파일 컴파일 완료 (
agent.pb.go,agent_grpc.pb.go생성 확인) - 빌드 테스트 (
go build ./...) - 버전 태그 생성 및 GitHub push
-
esba-tnc-agent에서 새 버전 사용하도록 업데이트 -
esba-tnc-proxy에서 새 버전 사용하도록 업데이트
- 버전 관리: 새로운 리소스를 추가할 때마다 버전을 올려야 합니다 (예: v0.1.4 → v0.1.5)
- 하위 호환성: 기존 RPC 메서드나 메시지 타입을 변경할 때는 주의해야 합니다
- proto-generator 사용: 가능하면 proto-generator를 사용하여 일관성을 유지하세요
- 문서 업데이트: README의 RPC 메서드 목록과 메시지 타입 목록을 업데이트하세요
github.com/clonealpha/esba-tnc-api/govpp: GoVPP 라이브러리 (서브모듈)google.golang.org/grpc: gRPC 라이브러리google.golang.org/protobuf: Protocol Buffers 라이브러리
esba-tnc-api는 GoVPP를 서브모듈(govpp/)로 제공합니다. 모듈 경로는 github.com/clonealpha/esba-tnc-api/govpp입니다.
다른 프로젝트에서는 esba-tnc-api/govpp를 직접 import합니다:
// esba-tnc-agent/go.mod
require (
github.com/clonealpha/esba-tnc-api v0.1.5
github.com/clonealpha/esba-tnc-api/govpp v0.1.5
)코드에서는 다음과 같이 import합니다:
import (
"github.com/clonealpha/esba-tnc-api/govpp/api"
"github.com/clonealpha/esba-tnc-api/govpp/binapi/interface"
)- Protocol Buffers 문서
- gRPC 문서
- esba-tnc-agent: gRPC 서버 구현
- esba-tnc-proxy: gRPC 클라이언트 구현