cns/grpc/server.go (49 lines of code) (raw):
package grpc
import (
"fmt"
"log"
"net"
"strconv"
pb "github.com/Azure/azure-container-networking/cns/grpc/v1alpha"
"github.com/pkg/errors"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
)
// Server struct to hold the gRPC server settings and the CNS service.
type Server struct {
Settings ServerSettings
CnsService pb.CNSServer
Logger *zap.Logger
}
// GrpcServerSettings holds the gRPC server settings.
type ServerSettings struct {
IPAddress string
Port uint16
}
// NewServer initializes a new gRPC server instance.
func NewServer(settings ServerSettings, cnsService pb.CNSServer, logger *zap.Logger) (*Server, error) {
if cnsService == nil {
ErrCNSServiceNotDefined := errors.New("CNS service is not defined")
return nil, fmt.Errorf("Failed to create new gRPC server: %w", ErrCNSServiceNotDefined)
}
server := &Server{
Settings: settings,
CnsService: cnsService,
Logger: logger,
}
return server, nil
}
// Start starts the gRPC server.
func (s *Server) Start() error {
address := net.JoinHostPort(s.Settings.IPAddress, strconv.FormatUint(uint64(s.Settings.Port), 10))
lis, err := net.Listen("tcp", address)
if err != nil {
log.Printf("[Listener] Failed to listen on gRPC endpoint: %+v", err)
return fmt.Errorf("failed to listen on address %s: %w", address, err)
}
log.Printf("[Listener] Started listening on gRPC endpoint %s.", address)
grpcServer := grpc.NewServer()
pb.RegisterCNSServer(grpcServer, s.CnsService)
// Register reflection service on gRPC server.
reflection.Register(grpcServer)
if err := grpcServer.Serve(lis); err != nil {
return fmt.Errorf("failed to serve gRPC server: %w", err)
}
return nil
}