Skip to content

Commit

Permalink
feat: add poll interval flag
Browse files Browse the repository at this point in the history
  • Loading branch information
franklinkim committed Mar 22, 2024
1 parent 3f85613 commit 52c1a67
Show file tree
Hide file tree
Showing 10 changed files with 127 additions and 104 deletions.
2 changes: 1 addition & 1 deletion client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ func initRepo(tb testing.TB, l *zap.Logger) *repo.Repo {
r := repo.New(l,
testRepoServer.URL+"/repo-two-dimensions.json",
repo.NewHistory(l,
repo.HistoryWithVarDir(varDir),
repo.HistoryWithHistoryDir(varDir),
),
)
up := make(chan bool, 1)
Expand Down
79 changes: 44 additions & 35 deletions cmd/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package cmd
import (
"time"

"github.com/spf13/cobra"
"github.com/spf13/pflag"
"github.com/spf13/viper"
)
Expand Down Expand Up @@ -32,96 +31,106 @@ func addressFlag(v *viper.Viper) string {
return v.GetString("address")
}

func addAddressFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().String("address", ":8080", "Address to bind to (host:port)")
_ = v.BindPFlag("address", cmd.Flags().Lookup("address"))
func addAddressFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.String("address", ":8080", "Address to bind to (host:port)")
_ = v.BindPFlag("address", flags.Lookup("address"))
_ = v.BindEnv("address", "CONTENT_SERVER_ADDRESS")
}

func basePathFlag(v *viper.Viper) string {
return v.GetString("base_path")
}

func addBasePathFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().String("base-path", "/contentserver", "Base path to export the webserver on")
_ = v.BindPFlag("base_path", cmd.Flags().Lookup("base_path"))
func addBasePathFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.String("base-path", "/contentserver", "Base path to export the webserver on")
_ = v.BindPFlag("base_path", flags.Lookup("base_path"))
_ = v.BindEnv("base_path", "CONTENT_SERVER_BASE_PATH")
}

func pollFlag(v *viper.Viper) bool {
return v.GetBool("poll")
return v.GetBool("poll.enabled")
}

func addPollFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().Bool("poll", false, "If true, the address arg will be used to periodically poll the content url")
_ = v.BindPFlag("poll", cmd.Flags().Lookup("poll"))
_ = v.BindEnv("poll", "CONTENT_SERVER_POLL")
func addPollFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Bool("poll", false, "If true, the address arg will be used to periodically poll the content url")
_ = v.BindPFlag("poll.enabled", flags.Lookup("poll"))
_ = v.BindEnv("poll.enabled", "CONTENT_SERVER_POLL")
}

func pollIntevalFlag(v *viper.Viper) time.Duration {
return v.GetDuration("poll.interval")
}

func addPollIntervalFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Duration("poll-interval", time.Minute, "Specifies the poll interval")
_ = v.BindPFlag("poll", flags.Lookup("poll-interval"))
_ = v.BindEnv("poll", "CONTENT_SERVER_POLL_INTERVAL")
}

func historyDirFlag(v *viper.Viper) string {
return v.GetString("history.dir")
}

func addHistoryDirFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().String("history-dir", "/var/lib/contentserver", "Where to put my data")
_ = v.BindPFlag("history.dir", cmd.Flags().Lookup("history-dir"))
func addHistoryDirFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.String("history-dir", "/var/lib/contentserver", "Where to put my data")
_ = v.BindPFlag("history.dir", flags.Lookup("history-dir"))
_ = v.BindEnv("history.dir", "CONTENT_SERVER_HISTORY_DIR")
}

func historyLimitFlag(v *viper.Viper) string {
return v.GetString("history.limit")
func historyLimitFlag(v *viper.Viper) int {
return v.GetInt("history.limit")
}

func addHistoryLimitFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().Int("history-limit", 2, "Number of history records to keep")
_ = v.BindPFlag("history.limit", cmd.Flags().Lookup("history-limit"))
func addHistoryLimitFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Int("history-limit", 2, "Number of history records to keep")
_ = v.BindPFlag("history.limit", flags.Lookup("history-limit"))
_ = v.BindEnv("history.limit", "CONTENT_SERVER_HISTORY_LIMIT")
}

func gracefulTimeoutFlag(v *viper.Viper) time.Duration {
return v.GetDuration("graceful_timeout")
}

func addGracefulTimeoutFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().Duration("graceful-timeout", 0, "Timeout duration for graceful shutdown")
_ = v.BindPFlag("graceful_timeout", cmd.Flags().Lookup("graceful-timeout"))
func addGracefulTimeoutFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Duration("graceful-timeout", 0, "Timeout duration for graceful shutdown")
_ = v.BindPFlag("graceful_timeout", flags.Lookup("graceful-timeout"))
_ = v.BindEnv("graceful_timeout", "CONTENT_SERVER_GRACEFUL_TIMEOUT")
}

func shutdownTimeoutFlag(v *viper.Viper) time.Duration {
return v.GetDuration("shutdown_timeout")
}

func addShutdownTimeoutFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().Duration("shutdown-timeout", 0, "Timeout duration for shutdown")
_ = v.BindPFlag("shutdown_timeout", cmd.Flags().Lookup("shutdown-timeout"))
func addShutdownTimeoutFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Duration("shutdown-timeout", 0, "Timeout duration for shutdown")
_ = v.BindPFlag("shutdown_timeout", flags.Lookup("shutdown-timeout"))
_ = v.BindEnv("shutdown_timeout", "CONTENT_SERVER_SHUTDOWN_TIMEOUT")
}

func serviceHealthzEnabledFlag(v *viper.Viper) bool {
return v.GetBool("service.healthz.enabled")
}

func addServiceHealthzEnabledFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().Bool("service-healthz-enabled", false, "Enable healthz service")
_ = v.BindPFlag("service.healthz.enabled", cmd.Flags().Lookup("service-healthz-enabled"))
func addServiceHealthzEnabledFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Bool("service-healthz-enabled", false, "Enable healthz service")
_ = v.BindPFlag("service.healthz.enabled", flags.Lookup("service-healthz-enabled"))
}

func servicePrometheusEnabledFlag(v *viper.Viper) bool {
return v.GetBool("service.prometheus.enabled")
}

func addServicePrometheusEnabledFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().Bool("service-prometheus-enabled", false, "Enable prometheus service")
_ = v.BindPFlag("service.prometheus.enabled", cmd.Flags().Lookup("service-prometheus-enabled"))
func addServicePrometheusEnabledFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Bool("service-prometheus-enabled", false, "Enable prometheus service")
_ = v.BindPFlag("service.prometheus.enabled", flags.Lookup("service-prometheus-enabled"))
}

func otelEnabledFlag(v *viper.Viper) bool {
return v.GetBool("otel.enabled")
}

func addOtelEnabledFlag(cmd *cobra.Command, v *viper.Viper) {
cmd.Flags().Bool("otel-enabled", false, "Enable otel service")
_ = v.BindPFlag("otel.enabled", cmd.Flags().Lookup("otel-enabled"))
func addOtelEnabledFlag(flags *pflag.FlagSet, v *viper.Viper) {
flags.Bool("otel-enabled", false, "Enable otel service")
_ = v.BindPFlag("otel.enabled", flags.Lookup("otel-enabled"))
_ = v.BindEnv("otel.enabled", "OTEL_ENABLED")
}
45 changes: 24 additions & 21 deletions cmd/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ func NewHTTPCommand() *cobra.Command {
RunE: func(cmd *cobra.Command, args []string) error {
svr := keel.NewServer(
keel.WithHTTPReadmeService(true),
keel.WithHTTPPrometheusService(v.GetBool("service.prometheus.enabled")),
keel.WithHTTPHealthzService(v.GetBool("service.healthz.enabled")),
keel.WithPrometheusMeter(v.GetBool("service.prometheus.enabled")),
keel.WithOTLPGRPCTracer(v.GetBool("otel.enabled")),
keel.WithGracefulTimeout(v.GetDuration("graceful.timeout")),
keel.WithShutdownTimeout(v.GetDuration("shutdown.timeout")),
keel.WithHTTPPrometheusService(servicePrometheusEnabledFlag(v)),
keel.WithHTTPHealthzService(serviceHealthzEnabledFlag(v)),
keel.WithPrometheusMeter(servicePrometheusEnabledFlag(v)),
keel.WithOTLPGRPCTracer(otelEnabledFlag(v)),
keel.WithGracefulTimeout(gracefulTimeoutFlag(v)),
keel.WithShutdownTimeout(shutdownTimeoutFlag(v)),
)

l := svr.Logger()
Expand All @@ -48,15 +48,16 @@ func NewHTTPCommand() *cobra.Command {
r := repo.New(l,
args[0],
repo.NewHistory(l,
repo.HistoryWithVarDir(v.GetString("history.dir")),
repo.HistoryWithMax(v.GetInt("history.limit")),
repo.HistoryWithHistoryDir(historyDirFlag(v)),
repo.HistoryWithHistoryLimit(historyLimitFlag(v)),
),
repo.WithHTTPClient(
keelhttp.NewHTTPClient(
keelhttp.HTTPClientWithTelemetry(),
),
),
repo.WithPollForUpdates(v.GetBool("poll")),
repo.WithPollInterval(pollIntevalFlag(v)),
repo.WithPoll(pollFlag(v)),
)

// start initial update and handle error
Expand All @@ -68,8 +69,8 @@ func NewHTTPCommand() *cobra.Command {
}))

svr.AddServices(
service.NewHTTP(l, "http", v.GetString("address"),
handler.NewHTTP(l, r, handler.WithPath(v.GetString("path"))),
service.NewHTTP(l, "http", addressFlag(v),
handler.NewHTTP(l, r, handler.WithBasePath(basePathFlag(v))),
middleware.Telemetry(),
middleware.Logger(),
middleware.Recover(),
Expand All @@ -84,16 +85,18 @@ func NewHTTPCommand() *cobra.Command {
},
}

addAddressFlag(cmd, v)
addBasePathFlag(cmd, v)
addPollFlag(cmd, v)
addHistoryDirFlag(cmd, v)
addHistoryLimitFlag(cmd, v)
addGracefulTimeoutFlag(cmd, v)
addShutdownTimeoutFlag(cmd, v)
addOtelEnabledFlag(cmd, v)
addServiceHealthzEnabledFlag(cmd, v)
addServicePrometheusEnabledFlag(cmd, v)
flags := cmd.Flags()
addAddressFlag(flags, v)
addBasePathFlag(flags, v)
addPollFlag(flags, v)
addPollIntervalFlag(flags, v)
addHistoryDirFlag(flags, v)
addHistoryLimitFlag(flags, v)
addGracefulTimeoutFlag(flags, v)
addShutdownTimeoutFlag(flags, v)
addOtelEnabledFlag(flags, v)
addServiceHealthzEnabledFlag(flags, v)
addServicePrometheusEnabledFlag(flags, v)

return cmd
}
21 changes: 12 additions & 9 deletions cmd/socket.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,22 +34,23 @@ func NewSocketCommand() *cobra.Command {
r := repo.New(l,
args[0],
repo.NewHistory(l,
repo.HistoryWithVarDir(v.GetString("history.dir")),
repo.HistoryWithMax(v.GetInt("history.limit")),
repo.HistoryWithHistoryDir(historyDirFlag(v)),
repo.HistoryWithHistoryLimit(historyLimitFlag(v)),
),
repo.WithHTTPClient(
keelhttp.NewHTTPClient(
keelhttp.HTTPClientWithTelemetry(),
),
),
repo.WithPollForUpdates(v.GetBool("poll")),
repo.WithPoll(pollFlag(v)),
repo.WithPollInterval(pollIntevalFlag(v)),
)

// create socket server
handle := handler.NewSocket(l, r)

// listen on socket
ln, err := net.Listen("tcp", v.GetString("address"))
ln, err := net.Listen("tcp", addressFlag(v))
if err != nil {
return err
}
Expand All @@ -62,7 +63,7 @@ func NewSocketCommand() *cobra.Command {
go r.Start(context.Background()) //nolint:errcheck
<-up

l.Info("started listening", zap.String("address", v.GetString("address")))
l.Info("started listening", zap.String("address", addressFlag(v)))

for {
// this blocks until connection or error
Expand All @@ -84,10 +85,12 @@ func NewSocketCommand() *cobra.Command {
},
}

addAddressFlag(cmd, v)
addPollFlag(cmd, v)
addHistoryDirFlag(cmd, v)
addHistoryLimitFlag(cmd, v)
flags := cmd.Flags()
addAddressFlag(flags, v)
addPollFlag(flags, v)
addPollIntervalFlag(flags, v)
addHistoryDirFlag(flags, v)
addHistoryLimitFlag(flags, v)

return cmd
}
18 changes: 9 additions & 9 deletions pkg/handler/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ import (

type (
HTTP struct {
l *zap.Logger
path string
repo *repo.Repo
l *zap.Logger
basePath string
repo *repo.Repo
}
HTTPOption func(*HTTP)
)
Expand All @@ -31,9 +31,9 @@ type (
// NewHTTP returns a shiny new web server
func NewHTTP(l *zap.Logger, repo *repo.Repo, opts ...HTTPOption) http.Handler {
inst := &HTTP{
l: l.Named("http"),
path: "/contentserver",
repo: repo,
l: l.Named("http"),
basePath: "/contentserver",
repo: repo,
}

for _, opt := range opts {
Expand All @@ -47,9 +47,9 @@ func NewHTTP(l *zap.Logger, repo *repo.Repo, opts ...HTTPOption) http.Handler {
// ~ Options
// ------------------------------------------------------------------------------------------------

func WithPath(v string) HTTPOption {
func WithBasePath(v string) HTTPOption {
return func(o *HTTP) {
o.path = v
o.basePath = v
}
}

Expand All @@ -73,7 +73,7 @@ func (h *HTTP) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return
}

route := Route(strings.TrimPrefix(r.URL.Path, h.path+"/"))
route := Route(strings.TrimPrefix(r.URL.Path, h.basePath+"/"))
if route == RouteGetRepo {
h.repo.WriteRepoBytes(w)
w.Header().Set("Content-Type", "application/json")
Expand Down
Loading

0 comments on commit 52c1a67

Please sign in to comment.