Newer
Older
"fmt"
"net/http"
"time"
"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/status"
cgw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/core"
pgw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/pnd"
agw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/rbac"
tgw "code.fbi.h-da.de/danet/gosdn/api/go/gosdn/topology"
)
var (
// command-line options:
// gRPC server endpoint
grpcServerEndpoint = flag.String("grpc-server-endpoint", "localhost:55055", "gRPC server endpoint")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
err := c.httpServer.Shutdown(ctx)
return err
}
func run() error {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
// Register gRPC server endpoint
// Note: Make sure the gRPC server is running properly and accessible
mux := runtime.NewServeMux()
err := registerHttpHandler(mux)
if err != nil {
return err
}
opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())}
err = cgw.RegisterCoreServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)
if err != nil {
return err
}
err = pgw.RegisterPndServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)
if err != nil {
return err
}
err = agw.RegisterAuthServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)
if err != nil {
return err
}
err = agw.RegisterUserServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)
if err != nil {
return err
}
err = agw.RegisterRoleServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)
if err != nil {
return err
}
err = tgw.RegisterTopologyServiceHandlerFromEndpoint(ctx, mux, *grpcServerEndpoint, opts)
if err != nil {
return err
}
// Set the HTTP server of core to the new server
c.httpServer = &http.Server{Addr: ":8080", Handler: mux}
// Start HTTP server (and proxy calls to gRPC server endpoint)
return c.httpServer.ListenAndServe()
}
func startHttpServer() {
go func() {
if err := run(); err != nil {
log.Info(err)
}
}()
log.Info("Server exiting")
func registerHttpHandler(mux *runtime.ServeMux) error {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
err := liveCheckHandler(mux)
if err != nil {
return err
}
err = readyCheckHandler(mux)
if err != nil {
return err
}
err = metricsHandler(mux)
if err != nil {
return err
}
return nil
func liveCheckHandler(mux *runtime.ServeMux) error {
err := mux.HandlePath("GET", "/livez", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
w.WriteHeader(http.StatusOK)
})
if err != nil {
return status.Errorf(codes.Internal, "%v", err)
}
return nil
func readyCheckHandler(mux *runtime.ServeMux) error {
err := mux.HandlePath("GET", "/readyz", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
w.WriteHeader(http.StatusOK)
})
if err != nil {
return status.Errorf(codes.Internal, "%v", err)
}
return nil
func metricsHandler(mux *runtime.ServeMux) error {
err := mux.HandlePath("GET", "/metrics", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
promhttp.Handler()
})
if err != nil {
return status.Errorf(codes.Internal, "%v", err)
}
return nil