blob: 7773934c6fe01462d313374313ba948dccf6dcd4 [file] [log] [blame]
iomododb170e12021-02-21 23:06:20 +04001package server
2
3import (
4 "os"
iomodoc0479a62021-02-22 20:08:36 +04005 "os/signal"
6 "syscall"
iomododb170e12021-02-21 23:06:20 +04007
iomodo3b0b9512021-03-15 00:13:06 +04008 "github.com/giolekva/pcloud/core/kg/common"
iomododb170e12021-02-21 23:06:20 +04009 "github.com/giolekva/pcloud/core/kg/log"
iomododb170e12021-02-21 23:06:20 +040010)
11
12// Server interface
13type Server interface {
14 Start() error
15 Shutdown() error
16}
17
18// Servers represents different server services
19type Servers struct {
20 servers []Server
iomodo3b0b9512021-03-15 00:13:06 +040021 logger common.LoggerIface
iomododb170e12021-02-21 23:06:20 +040022}
23
24// New provides new service application
iomodo3b0b9512021-03-15 00:13:06 +040025func New(logger common.LoggerIface) *Servers {
iomododb170e12021-02-21 23:06:20 +040026 return &Servers{
27 logger: logger,
28 }
29}
30
31// AddServers adds servers to service
32func (ss *Servers) AddServers(servers ...Server) {
33 ss.servers = append(ss.servers, servers...)
34}
35
36// Run runs the service application
37func (ss *Servers) Run() {
38 for _, server := range ss.servers {
39 go func(server Server) {
40 if err := server.Start(); err != nil {
41 ss.logger.Error("can't start server", log.Err(err))
42 os.Exit(1)
43 }
44 }(server)
45 }
iomodoc0479a62021-02-22 20:08:36 +040046 // wait for kill signal before attempting to gracefully shutdown
47 // the running service
48 interruptChan := make(chan os.Signal, 1)
49 signal.Notify(interruptChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
50 <-interruptChan
51 ss.logger.Info("os.Interrupt...")
52 ss.shutdown()
iomododb170e12021-02-21 23:06:20 +040053}
54
55func (ss *Servers) shutdown() {
iomodoc0479a62021-02-22 20:08:36 +040056 ss.logger.Info("Shutting down...")
iomododb170e12021-02-21 23:06:20 +040057
58 errCh := make(chan error, len(ss.servers))
59
60 for _, server := range ss.servers {
61 go func(server Server) {
62 errCh <- server.Shutdown()
63 }(server)
64 }
65
66 for i := 0; i < len(ss.servers); i++ {
67 if err := <-errCh; err != nil {
68 go func(err error) {
iomodoc0479a62021-02-22 20:08:36 +040069 ss.logger.Error("Shutdown error", log.Err(err))
iomododb170e12021-02-21 23:06:20 +040070 os.Exit(1)
71 }(err)
72 return
73 }
74 }
75
iomodoc0479a62021-02-22 20:08:36 +040076 ss.logger.Info("Gracefully stopped")
iomododb170e12021-02-21 23:06:20 +040077}