78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net"
 | |
| 
 | |
| 	pb "github.com/grmrgecko/virtual-vxlan/vxlan"
 | |
| 	log "github.com/sirupsen/logrus"
 | |
| 	"google.golang.org/grpc"
 | |
| 	"google.golang.org/grpc/credentials/insecure"
 | |
| )
 | |
| 
 | |
| // Allows go generate to compile the protobuf to golang.
 | |
| //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative ./vxlan/vxlan.proto
 | |
| 
 | |
| // GRPC server structure.
 | |
| type GRPCServer struct {
 | |
| 	pb.UnimplementedVxlanServer
 | |
| 	RPCPath string
 | |
| 	server  *grpc.Server
 | |
| }
 | |
| 
 | |
| // Start serving GRPC requests.
 | |
| func (s *GRPCServer) Serve(li net.Listener) {
 | |
| 	err := s.server.Serve(li)
 | |
| 	if err != nil {
 | |
| 		log.Errorf("Error serving grpc: %v", err)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // Stop GRPC server.
 | |
| func (s *GRPCServer) Close() {
 | |
| 	s.server.Stop()
 | |
| }
 | |
| 
 | |
| // Start GRPC server.
 | |
| func NewGRPCServer(rpcPath string) (s *GRPCServer, err error) {
 | |
| 	// Verify another server doesn't exist.
 | |
| 	if app.grpcServer != nil {
 | |
| 		return nil, fmt.Errorf("grpc server is already running")
 | |
| 	}
 | |
| 
 | |
| 	// Connect to RPC path.
 | |
| 	li, err := net.Listen("unix", rpcPath)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("failed to listen on socket: %v", err)
 | |
| 	}
 | |
| 
 | |
| 	// Setup server.
 | |
| 	s = new(GRPCServer)
 | |
| 	s.server = grpc.NewServer()
 | |
| 
 | |
| 	// Register the vxlan service to this server.
 | |
| 	pb.RegisterVxlanServer(s.server, s)
 | |
| 
 | |
| 	// Update the global app gRPC server.
 | |
| 	app.grpcServer = s
 | |
| 
 | |
| 	// Start serving requests.
 | |
| 	go s.Serve(li)
 | |
| 	return s, nil
 | |
| }
 | |
| 
 | |
| // Start a connection to the gRPC Server.
 | |
| func NewGRPCClient() (c pb.VxlanClient, conn *grpc.ClientConn, err error) {
 | |
| 	// Read the minimal config.
 | |
| 	config := ReadMinimalConfig()
 | |
| 
 | |
| 	// Start an gRPC client connection to the unix socket.
 | |
| 	conn, err = grpc.NewClient(fmt.Sprintf("unix:%s", config.RPCPath), grpc.WithTransportCredentials(insecure.NewCredentials()))
 | |
| 
 | |
| 	// If connection is successful, provide client to the vxlan service.
 | |
| 	if err == nil {
 | |
| 		c = pb.NewVxlanClient(conn)
 | |
| 	}
 | |
| 	return
 | |
| }
 |