131 lines
2.5 KiB
Go
131 lines
2.5 KiB
Go
// 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)))
|
|
}
|