@@ -22,8 +22,9 @@ type Server struct {
2222
2323// GrpcServerSettings holds the gRPC server settings.
2424type ServerSettings struct {
25- IPAddress string
26- Port uint16
25+ IPAddress string
26+ Port uint16
27+ DomainSocketPath string
2728}
2829
2930// NewServer initializes a new gRPC server instance.
@@ -43,24 +44,46 @@ func NewServer(settings ServerSettings, cnsService pb.CNSServer, logger *zap.Log
4344}
4445
4546// Start starts the gRPC server.
47+ // Now this has the capability of listening over both TCP and Unix Domain Sockets.
48+ // If both IPAddress and DomainSocketPath are provided, it will prioritize TCP.
4649func (s * Server ) Start () error {
47- address := net .JoinHostPort (s .Settings .IPAddress , strconv .FormatUint (uint64 (s .Settings .Port ), 10 ))
48- lis , err := net .Listen ("tcp" , address )
49- if err != nil {
50- log .Printf ("[Listener] Failed to listen on gRPC endpoint: %+v" , err )
51- return fmt .Errorf ("failed to listen on address %s: %w" , address , err )
52- }
53- log .Printf ("[Listener] Started listening on gRPC endpoint %s." , address )
50+ if s .Settings .IPAddress != "" || s .Settings .Port != 0 {
51+ address := net .JoinHostPort (s .Settings .IPAddress , strconv .FormatUint (uint64 (s .Settings .Port ), 10 ))
52+ lis , err := net .Listen ("tcp" , address )
53+ if err != nil {
54+ log .Printf ("[Listener] Failed to listen on gRPC endpoint: %+v" , err )
55+ return fmt .Errorf ("failed to listen on address %s: %w" , address , err )
56+ }
57+ log .Printf ("[Listener] Started listening on gRPC endpoint %s." , address )
5458
55- grpcServer := grpc .NewServer ()
56- pb .RegisterCNSServer (grpcServer , s .CnsService )
59+ grpcServer := grpc .NewServer ()
60+ pb .RegisterCNSServer (grpcServer , s .CnsService )
5761
58- // Register reflection service on gRPC server.
59- reflection .Register (grpcServer )
62+ // Register reflection service on gRPC server.
63+ reflection .Register (grpcServer )
6064
61- if err := grpcServer .Serve (lis ); err != nil {
62- return fmt .Errorf ("failed to serve gRPC server: %w" , err )
63- }
65+ if err := grpcServer .Serve (lis ); err != nil {
66+ return fmt .Errorf ("failed to serve gRPC server: %w" , err )
67+ }
68+ } else if s .Settings .DomainSocketPath != "" {
69+ lis , err := net .Listen ("unix" , s .Settings .DomainSocketPath )
70+ if err != nil {
71+ log .Printf ("[Listener] Failed to listen on gRPC Unix Domain Socket: %+v" , err )
72+ return fmt .Errorf ("failed to listen on Unix Domain Socket %s: %w" , s .Settings .DomainSocketPath , err )
73+ }
74+ log .Printf ("[Listener] Started listening on gRPC Unix Domain Socket %s." , s .Settings .DomainSocketPath )
75+
76+ grpcServer := grpc .NewServer ()
77+ pb .RegisterCNSServer (grpcServer , s .CnsService )
6478
79+ // Register reflection service on gRPC server.
80+ reflection .Register (grpcServer )
81+
82+ if err := grpcServer .Serve (lis ); err != nil {
83+ return fmt .Errorf ("failed to serve gRPC server: %w" , err )
84+ }
85+ } else {
86+ return fmt .Errorf ("no valid gRPC server settings provided: IP address or domain socket path must be specified" )
87+ }
6588 return nil
6689}
0 commit comments