package main import ( "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 { srv *httputil.Server address string name string handler http.Handler shutdownDur time.Duration enabled bool } const ( enabledKeyPostfix = ".enabled" addressKeyPostfix = ".address" shutdownTimeoutKeyPostfix = ".shutdown_timeout" ) func (c *httpComponent) init() { log.Info(fmt.Sprintf("init %s", c.name)) c.enabled = cfg.GetBool(c.name + enabledKeyPostfix) c.address = cfg.GetString(c.name + addressKeyPostfix) c.shutdownDur = cfg.GetDuration(c.name + shutdownTimeoutKeyPostfix) if c.enabled { c.srv = httputil.New( httputil.HTTPSrvPrm{ Address: c.address, Handler: c.handler, }, httputil.WithShutdownTimeout(c.shutdownDur), ) } else { log.Info(fmt.Sprintf("%s is disabled, skip", c.name)) c.srv = nil } } func (c *httpComponent) start() { if c.srv != nil { log.Info(fmt.Sprintf("start %s", c.name)) wg.Add(1) go func() { exitErr(c.srv.Serve()) wg.Done() }() } } func (c *httpComponent) shutdown() error { if c.srv != nil { log.Info(fmt.Sprintf("shutdown %s", c.name)) return c.srv.Shutdown() } return nil } func (c *httpComponent) reload() { log.Info(fmt.Sprintf("reload %s", c.name)) enabled := cfg.GetBool(c.name + enabledKeyPostfix) address := cfg.GetString(c.name + addressKeyPostfix) dur := cfg.GetDuration(c.name + shutdownTimeoutKeyPostfix) if enabled != c.enabled || enabled && (address != c.address || dur != c.shutdownDur) { log.Info(fmt.Sprintf("%s config updated", c.name)) if err := c.shutdown(); err != nil { log.Debug(logs.FrostFSIRCouldNotShutdownHTTPServer, zap.String("error", err.Error()), ) } else { c.init() c.start() } } }