2020-05-03 08:15:24 +00:00
|
|
|
package rpc
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"net/url"
|
|
|
|
"time"
|
2020-12-26 13:11:49 +00:00
|
|
|
|
|
|
|
app2 "gitlab.com/inetmock/inetmock/internal/app"
|
|
|
|
"gitlab.com/inetmock/inetmock/pkg/logging"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"google.golang.org/grpc"
|
2020-05-03 08:15:24 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type INetMockAPI interface {
|
|
|
|
StartServer() error
|
|
|
|
StopServer()
|
|
|
|
}
|
|
|
|
|
|
|
|
type inetmockAPI struct {
|
2020-12-26 13:11:49 +00:00
|
|
|
app app2.App
|
|
|
|
url *url.URL
|
|
|
|
server *grpc.Server
|
|
|
|
logger logging.Logger
|
|
|
|
serverRunning bool
|
2020-05-03 08:15:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewINetMockAPI(
|
2020-12-26 13:11:49 +00:00
|
|
|
app app2.App,
|
2020-05-03 08:15:24 +00:00
|
|
|
) INetMockAPI {
|
|
|
|
return &inetmockAPI{
|
2020-12-26 13:11:49 +00:00
|
|
|
app: app,
|
|
|
|
url: app.Config().APIConfig().ListenURL(),
|
|
|
|
logger: app.Logger().Named("api"),
|
2020-05-03 08:15:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (i *inetmockAPI) StartServer() (err error) {
|
|
|
|
var lis net.Listener
|
|
|
|
if lis, err = createListenerFromURL(i.url); err != nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
i.server = grpc.NewServer()
|
|
|
|
|
|
|
|
RegisterHandlersServer(i.server, &handlersServer{
|
2020-12-26 13:11:49 +00:00
|
|
|
registry: i.app.HandlerRegistry(),
|
2020-05-03 08:15:24 +00:00
|
|
|
})
|
|
|
|
RegisterEndpointsServer(i.server, &endpointsServer{
|
2020-12-26 13:11:49 +00:00
|
|
|
endpointsManager: i.app.EndpointManager(),
|
2020-05-03 08:15:24 +00:00
|
|
|
})
|
|
|
|
|
2020-12-26 13:11:49 +00:00
|
|
|
RegisterHealthServer(i.server, &healthServer{
|
|
|
|
app: i.app,
|
|
|
|
})
|
2020-06-23 12:54:08 +00:00
|
|
|
|
2021-01-13 20:38:52 +00:00
|
|
|
RegisterAuditServer(i.server, &auditServer{
|
2021-01-16 17:26:15 +00:00
|
|
|
logger: i.app.Logger(),
|
|
|
|
eventStream: i.app.EventStream(),
|
2021-01-13 20:38:52 +00:00
|
|
|
})
|
|
|
|
|
2020-05-03 08:15:24 +00:00
|
|
|
go i.startServerAsync(lis)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (i *inetmockAPI) StopServer() {
|
2020-05-10 10:26:59 +00:00
|
|
|
if !i.serverRunning {
|
|
|
|
i.logger.Info(
|
|
|
|
"Skipping API server shutdown because server is not running",
|
|
|
|
)
|
|
|
|
return
|
|
|
|
}
|
2020-05-03 08:15:24 +00:00
|
|
|
gracefulStopChan := make(chan struct{})
|
|
|
|
go func() {
|
|
|
|
i.server.GracefulStop()
|
|
|
|
close(gracefulStopChan)
|
|
|
|
}()
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-gracefulStopChan:
|
|
|
|
case <-time.After(5 * time.Second):
|
|
|
|
i.server.Stop()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (i *inetmockAPI) startServerAsync(listener net.Listener) {
|
2020-05-10 10:26:59 +00:00
|
|
|
i.serverRunning = true
|
2020-05-03 08:15:24 +00:00
|
|
|
if err := i.server.Serve(listener); err != nil {
|
2020-05-10 10:26:59 +00:00
|
|
|
i.serverRunning = false
|
2020-05-03 08:15:24 +00:00
|
|
|
i.logger.Error(
|
|
|
|
"failed to start INetMock API",
|
|
|
|
zap.Error(err),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func createListenerFromURL(url *url.URL) (lis net.Listener, err error) {
|
|
|
|
switch url.Scheme {
|
|
|
|
case "unix":
|
|
|
|
lis, err = net.Listen(url.Scheme, url.Path)
|
|
|
|
default:
|
|
|
|
lis, err = net.Listen(url.Scheme, url.Host)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|