2020-04-13 22:14:56 +00:00
|
|
|
package endpoints
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"github.com/baez90/inetmock/internal/plugins"
|
2020-04-27 22:26:15 +00:00
|
|
|
config2 "github.com/baez90/inetmock/pkg/config"
|
2020-04-13 22:14:56 +00:00
|
|
|
"github.com/baez90/inetmock/pkg/logging"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type EndpointManager interface {
|
|
|
|
RegisteredEndpoints() []Endpoint
|
|
|
|
StartedEndpoints() []Endpoint
|
2020-04-27 22:26:15 +00:00
|
|
|
CreateEndpoint(name string, multiHandlerConfig config2.MultiHandlerConfig) error
|
2020-04-13 22:14:56 +00:00
|
|
|
StartEndpoints()
|
|
|
|
ShutdownEndpoints()
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewEndpointManager(logger logging.Logger) EndpointManager {
|
|
|
|
return &endpointManager{
|
|
|
|
logger: logger,
|
|
|
|
registry: plugins.Registry(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
type endpointManager struct {
|
|
|
|
logger logging.Logger
|
|
|
|
registeredEndpoints []Endpoint
|
|
|
|
properlyStartedEndpoints []Endpoint
|
|
|
|
registry plugins.HandlerRegistry
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e endpointManager) RegisteredEndpoints() []Endpoint {
|
|
|
|
return e.registeredEndpoints
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e endpointManager) StartedEndpoints() []Endpoint {
|
|
|
|
return e.properlyStartedEndpoints
|
|
|
|
}
|
|
|
|
|
2020-04-27 22:26:15 +00:00
|
|
|
func (e *endpointManager) CreateEndpoint(name string, multiHandlerConfig config2.MultiHandlerConfig) error {
|
2020-04-25 22:22:45 +00:00
|
|
|
for _, handlerConfig := range multiHandlerConfig.HandlerConfigs() {
|
2020-04-27 22:26:15 +00:00
|
|
|
if handler, ok := e.registry.HandlerForName(multiHandlerConfig.Handler); ok {
|
2020-04-13 22:14:56 +00:00
|
|
|
e.registeredEndpoints = append(e.registeredEndpoints, &endpoint{
|
|
|
|
name: name,
|
|
|
|
handler: handler,
|
|
|
|
config: handlerConfig,
|
|
|
|
})
|
2020-04-25 22:22:45 +00:00
|
|
|
} else {
|
2020-04-27 22:26:15 +00:00
|
|
|
return fmt.Errorf("no matching handler registered for names %s", multiHandlerConfig.Handler)
|
2020-04-13 22:14:56 +00:00
|
|
|
}
|
|
|
|
}
|
2020-04-25 22:22:45 +00:00
|
|
|
|
|
|
|
return nil
|
2020-04-13 22:14:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (e *endpointManager) StartEndpoints() {
|
|
|
|
startTime := time.Now()
|
|
|
|
for _, endpoint := range e.registeredEndpoints {
|
|
|
|
endpointLogger := e.logger.With(
|
|
|
|
zap.String("endpoint", endpoint.Name()),
|
|
|
|
)
|
|
|
|
endpointLogger.Info("Starting endpoint")
|
|
|
|
if ok := startEndpoint(endpoint, endpointLogger); ok {
|
|
|
|
e.properlyStartedEndpoints = append(e.properlyStartedEndpoints, endpoint)
|
|
|
|
endpointLogger.Info("successfully started endpoint")
|
|
|
|
} else {
|
|
|
|
endpointLogger.Error("error occurred during endpoint startup - will be skipped for now")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
endpointStartupDuration := time.Since(startTime)
|
|
|
|
e.logger.Info(
|
|
|
|
"Startup of all endpoints completed",
|
|
|
|
zap.Duration("startupTime", endpointStartupDuration),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *endpointManager) ShutdownEndpoints() {
|
|
|
|
var waitGroup sync.WaitGroup
|
|
|
|
waitGroup.Add(len(e.properlyStartedEndpoints))
|
|
|
|
|
|
|
|
for _, endpoint := range e.properlyStartedEndpoints {
|
|
|
|
endpointLogger := e.logger.With(
|
|
|
|
zap.String("endpoint", endpoint.Name()),
|
|
|
|
)
|
|
|
|
endpointLogger.Info("Triggering shutdown of endpoint")
|
|
|
|
go shutdownEndpoint(endpoint, endpointLogger, &waitGroup)
|
|
|
|
}
|
|
|
|
|
|
|
|
waitGroup.Wait()
|
|
|
|
}
|
|
|
|
|
|
|
|
func startEndpoint(ep Endpoint, logger logging.Logger) (success bool) {
|
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
logger.Fatal(
|
|
|
|
"recovered panic during startup of endpoint",
|
|
|
|
zap.Any("recovered", r),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
if err := ep.Start(); err != nil {
|
|
|
|
logger.Error(
|
|
|
|
"failed to start endpoint",
|
|
|
|
zap.Error(err),
|
|
|
|
)
|
|
|
|
} else {
|
|
|
|
success = true
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func shutdownEndpoint(ep Endpoint, logger logging.Logger, wg *sync.WaitGroup) {
|
|
|
|
defer func() {
|
|
|
|
if r := recover(); r != nil {
|
|
|
|
logger.Fatal(
|
|
|
|
"recovered panic during shutdown of endpoint",
|
|
|
|
zap.Any("recovered", r),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
wg.Done()
|
|
|
|
}()
|
|
|
|
if err := ep.Shutdown(); err != nil {
|
|
|
|
logger.Error(
|
|
|
|
"Failed to shutdown endpoint",
|
|
|
|
zap.Error(err),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|