forked from TrueCloudLab/frostfs-node
75 lines
1.6 KiB
Go
75 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/logs"
|
|
httputil "git.frostfs.info/TrueCloudLab/frostfs-node/pkg/util/http"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type httpComponent struct {
|
|
address string
|
|
name string
|
|
handler http.Handler
|
|
shutdownDur time.Duration
|
|
enabled bool
|
|
cfg *cfg
|
|
preReload func(c *cfg)
|
|
}
|
|
|
|
func (cmp *httpComponent) init(c *cfg) {
|
|
if !cmp.enabled {
|
|
c.log.Info(fmt.Sprintf("%s is disabled", cmp.name))
|
|
return
|
|
}
|
|
// Init server with parameters
|
|
srv := httputil.New(
|
|
*httputil.NewHTTPSrvPrm(
|
|
cmp.address,
|
|
cmp.handler,
|
|
),
|
|
httputil.WithShutdownTimeout(
|
|
cmp.shutdownDur,
|
|
),
|
|
)
|
|
c.closers = append(c.closers, closer{
|
|
cmp.name,
|
|
func() { stopAndLog(c, cmp.name, srv.Shutdown) },
|
|
})
|
|
c.workers = append(c.workers, worker{
|
|
cmp.name,
|
|
func(ctx context.Context) {
|
|
runAndLog(ctx, c, cmp.name, false, func(context.Context, *cfg) {
|
|
c.log.Info(logs.FrostFSNodeStartListeningEndpoint,
|
|
zap.String("service", cmp.name),
|
|
zap.String("endpoint", cmp.address))
|
|
fatalOnErr(srv.Serve())
|
|
})
|
|
},
|
|
})
|
|
}
|
|
|
|
func (cmp *httpComponent) reload(ctx context.Context) error {
|
|
if cmp.preReload != nil {
|
|
cmp.preReload(cmp.cfg)
|
|
}
|
|
// Shutdown server
|
|
closer := getCloser(cmp.cfg, cmp.name)
|
|
if closer != nil {
|
|
closer.fn()
|
|
}
|
|
// Cleanup
|
|
delCloser(cmp.cfg, cmp.name)
|
|
delWorker(cmp.cfg, cmp.name)
|
|
// Init server with new parameters
|
|
cmp.init(cmp.cfg)
|
|
// Start worker
|
|
if cmp.enabled {
|
|
startWorker(ctx, cmp.cfg, *getWorker(cmp.cfg, cmp.name))
|
|
}
|
|
return nil
|
|
}
|