cmdb/internal/server/server.go

131 lines
2.5 KiB
Go
Raw Permalink Normal View History

2023-01-25 13:40:44 +03:00
// Copyright 2022 Listware
package server
import (
"context"
"fmt"
"net"
"os"
"os/signal"
"syscall"
"git.fg-tech.ru/listware/cmdb/internal/arangodb"
"git.fg-tech.ru/listware/cmdb/internal/cmdb/edge"
"git.fg-tech.ru/listware/cmdb/internal/cmdb/finder"
"git.fg-tech.ru/listware/cmdb/internal/cmdb/qdsl"
"git.fg-tech.ru/listware/cmdb/internal/cmdb/vertex"
"git.fg-tech.ru/listware/proto/sdk/pbcmdb"
"git.fg-tech.ru/listware/proto/sdk/pbcmdb/pbfinder"
"git.fg-tech.ru/listware/proto/sdk/pbcmdb/pbqdsl"
"google.golang.org/grpc"
)
// set max 100 MB
const maxMsgSize = 100 * 1024 * 1024
var (
cmdbAddr = "127.0.0.1"
cmdbPort = "31415"
)
func init() {
if value, ok := os.LookupEnv("CMDB_ADDR"); ok {
cmdbAddr = value
}
if value, ok := os.LookupEnv("CMDB_PORT"); ok {
cmdbPort = value
}
}
func New() {
ctx, cancel := context.WithCancel(context.Background())
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
syscall.SIGHUP,
syscall.SIGUSR1,
syscall.SIGUSR2,
)
go func() {
for {
select {
case sig := <-sigChan:
switch sig {
case syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGINT:
cancel()
}
case <-ctx.Done():
return
}
}
}()
if err := serve(ctx); err != nil {
fmt.Println(err)
return
}
return
}
func serve(ctx context.Context) (err error) {
if err = arangodb.Bootstrap(ctx); err != nil {
return
}
pc, err := net.Listen("tcp", fmt.Sprintf(":%s", cmdbPort))
if err != nil {
return
}
defer pc.Close()
server := grpc.NewServer(
grpc.MaxMsgSize(maxMsgSize),
grpc.MaxRecvMsgSize(maxMsgSize),
grpc.MaxSendMsgSize(maxMsgSize),
)
defer server.Stop()
qdsl, err := qdsl.New(ctx)
if err != nil {
return
}
pbqdsl.RegisterQdslServiceServer(server, pbqdsl.QdslServiceServer(qdsl))
finder, err := finder.New(ctx)
if err != nil {
return
}
pbfinder.RegisterFinderServiceServer(server, pbfinder.FinderServiceServer(finder))
edge, err := edge.New(ctx)
if err != nil {
return
}
pbcmdb.RegisterEdgeServiceServer(server, pbcmdb.EdgeServiceServer(edge))
vertex, err := vertex.New(ctx)
if err != nil {
return
}
pbcmdb.RegisterVertexServiceServer(server, pbcmdb.VertexServiceServer(vertex))
go server.Serve(pc)
<-ctx.Done()
return
}
func Client() (conn *grpc.ClientConn, err error) {
return grpc.Dial(fmt.Sprintf("%s:%s", cmdbAddr, cmdbPort), grpc.WithInsecure(), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(maxMsgSize), grpc.MaxCallSendMsgSize(maxMsgSize)))
}