Skip to content

Commit 37b6c84

Browse files
bailinheCopilot
andauthored
chore: Refactor Project Configurations (#246)
* chore: Refactor Project Configurations - refactor governor-api flags and configs, creat new package `configs` that contains flags and init functions that is currently duplicated across almost all addons - add some more test against workload identity - fix some lint complaints (noctx) Signed-off-by: Bailin He <bahe@equinix.com> * fix viper unmarshal issue Signed-off-by: Bailin He <bahe@equinix.com> * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * use function options Signed-off-by: Bailin He <bahe@equinix.com> --------- Signed-off-by: Bailin He <bahe@equinix.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent d592b64 commit 37b6c84

17 files changed

Lines changed: 537 additions & 128 deletions

cmd/backup.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package cmd
22

33
import (
4+
"context"
45
"database/sql"
56
"io"
67
"os"
@@ -23,7 +24,7 @@ var (
2324
driverstr := viper.GetString("backup.driver")
2425
conn := viper.GetString("db.uri")
2526

26-
db := newBackupDB(conn)
27+
db := newBackupDB(cmd.Context(), conn)
2728
defer db.Close()
2829

2930
driver := backupper.DBDriverCRDB
@@ -49,7 +50,7 @@ var (
4950
driverstr := viper.GetString("restore.driver")
5051
conn := viper.GetString("db.uri")
5152

52-
db := newBackupDB(conn)
53+
db := newBackupDB(cmd.Context(), conn)
5354
defer db.Close()
5455

5556
driver := backupper.DBDriverCRDB
@@ -98,7 +99,7 @@ func inputReader() io.Reader {
9899
return file
99100
}
100101

101-
func newBackupDB(conn string) *sqlx.DB {
102+
func newBackupDB(ctx context.Context, conn string) *sqlx.DB {
102103
connector, err := pq.NewConnector(conn)
103104
if err != nil {
104105
logger.Fatalw("failed initializing sql connector", "error", err)
@@ -107,7 +108,7 @@ func newBackupDB(conn string) *sqlx.DB {
107108
innerDB := sql.OpenDB(connector)
108109
db := sqlx.NewDb(innerDB, "postgres")
109110

110-
if err := db.Ping(); err != nil {
111+
if err := db.PingContext(ctx); err != nil {
111112
logger.Fatalw("failed verifying database connection", "error", err)
112113
}
113114

cmd/nats.go

Lines changed: 0 additions & 71 deletions
This file was deleted.

cmd/root.go

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package cmd
44
import (
55
"strings"
66

7-
"github.com/metal-toolbox/governor-api/pkg/workloadidentity"
7+
"github.com/metal-toolbox/governor-api/pkg/configs"
88
homedir "github.com/mitchellh/go-homedir"
99
"github.com/spf13/cobra"
1010
"github.com/spf13/pflag"
@@ -17,8 +17,9 @@ const (
1717
)
1818

1919
var (
20-
cfgFile string
21-
logger *zap.SugaredLogger
20+
cfgFile string
21+
logger *zap.SugaredLogger
22+
appConfig = configs.Configs{}
2223
)
2324

2425
// rootCmd represents the base command when called without any subcommands
@@ -54,25 +55,7 @@ func init() {
5455
rootCmd.PersistentFlags().Bool("development", false, "enable development settings")
5556
viperBindFlag("development", rootCmd.PersistentFlags().Lookup("development"))
5657

57-
// NATS flags
58-
rootCmd.PersistentFlags().String("nats-url", "nats://127.0.0.1:4222", "NATS server connection url")
59-
viperBindFlag("nats.url", rootCmd.PersistentFlags().Lookup("nats-url"))
60-
rootCmd.PersistentFlags().String("nats-creds-file", "", "Path to the file containing the NATS credentials file")
61-
viperBindFlag("nats.creds-file", rootCmd.PersistentFlags().Lookup("nats-creds-file"))
62-
rootCmd.PersistentFlags().String("nats-subject-prefix", "governor.events", "prefix for NATS subjects")
63-
viperBindFlag("nats.subject-prefix", rootCmd.PersistentFlags().Lookup("nats-subject-prefix"))
64-
rootCmd.PersistentFlags().Bool("nats-workload-identity-federation-enabled", false, "use workload identity federation to authenticate to NATS")
65-
viperBindFlag("nats.workload-identity-federation.enabled", rootCmd.PersistentFlags().Lookup("nats-workload-identity-federation-enabled"))
66-
rootCmd.PersistentFlags().String("nats-workload-identity-federation-token-url", "", "workload identity federation token URL")
67-
viperBindFlag("nats.workload-identity-federation.token-url", rootCmd.PersistentFlags().Lookup("nats-workload-identity-federation-token-url"))
68-
rootCmd.PersistentFlags().String("nats-workload-identity-federation-kube-service-account", "", "Kubernetes service account token file path")
69-
viperBindFlag("nats.workload-identity-federation.kube-service-account", rootCmd.PersistentFlags().Lookup("nats-workload-identity-federation-kube-service-account"))
70-
rootCmd.PersistentFlags().StringSlice("nats-workload-identity-federation-scopes", []string{}, "workload identity federation scopes")
71-
viperBindFlag("nats.workload-identity-federation.scopes", rootCmd.PersistentFlags().Lookup("nats-workload-identity-federation-scopes"))
72-
rootCmd.PersistentFlags().String("nats-workload-identity-federation-audience", "", "workload identity federation audience")
73-
viperBindFlag("nats.workload-identity-federation.audience", rootCmd.PersistentFlags().Lookup("nats-workload-identity-federation-audience"))
74-
rootCmd.PersistentFlags().String("nats-workload-identity-federation-subject-token-type", string(workloadidentity.DefaultSubjectTokenType), "workload identity federation subject token type")
75-
viperBindFlag("nats.workload-identity-federation.subject-token-type", rootCmd.PersistentFlags().Lookup("nats-workload-identity-federation-subject-token-type"))
58+
configs.AddFlags(rootCmd.PersistentFlags())
7659
}
7760

7861
// initConfig reads in config file and ENV variables if set.
@@ -101,6 +84,14 @@ func initConfig() {
10184
if err == nil {
10285
logger.Infow("using config file", "file", viper.ConfigFileUsed())
10386
}
87+
88+
if err := viper.Unmarshal(&appConfig); err != nil {
89+
logger.Desugar().Fatal("unable to decode config into struct", zap.Error(err))
90+
}
91+
92+
if err := appConfig.Validate(); err != nil {
93+
logger.Desugar().Fatal("invalid config", zap.Error(err))
94+
}
10495
}
10596

10697
func setupLogging() {

cmd/serve.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
"github.com/metal-toolbox/governor-api/internal/api"
1515
"github.com/metal-toolbox/governor-api/internal/dbtools"
1616
"github.com/metal-toolbox/governor-api/internal/eventbus"
17+
"github.com/metal-toolbox/governor-api/pkg/configs"
1718
)
1819

1920
// serveCmd invokes the governor api
@@ -40,7 +41,7 @@ func init() {
4041
func startAPI(ctx context.Context) error {
4142
logger.Debug("initializing tracer and database")
4243

43-
db := initTracingAndDB()
44+
db := initTracingAndDB(ctx)
4445

4546
dbtools.RegisterHooks()
4647

@@ -125,12 +126,12 @@ func startAPI(ctx context.Context) error {
125126
"nats.subject-prefix", viper.GetString("nats.subject-prefix"),
126127
)
127128

128-
nc, natsClose, err := newNATSConnection(ctx, viper.GetViper())
129+
nc, err := appConfig.NATSConn(ctx, appName, configs.WithLogger(logger.Desugar()))
129130
if err != nil {
130131
return err
131132
}
132133

133-
defer natsClose()
134+
defer nc.Close()
134135

135136
eb := eventbus.NewClient(
136137
eventbus.WithLogger(logger.Desugar()),

cmd/tracing.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
2424
)
2525

26-
func initTracingAndDB() *sqlx.DB {
26+
func initTracingAndDB(ctx context.Context) *sqlx.DB {
2727
dbDriverName := "postgres"
2828

2929
connector, err := pq.NewConnector(viper.GetString("db.uri"))
@@ -61,7 +61,7 @@ func initTracingAndDB() *sqlx.DB {
6161

6262
db := sqlx.NewDb(innerDB, dbDriverName)
6363

64-
if err := db.Ping(); err != nil {
64+
if err := db.PingContext(ctx); err != nil {
6565
logger.Fatalw("failed verifying database connection", "error", err)
6666
}
6767

go.mod

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ require (
2222
github.com/jmoiron/sqlx v1.4.0
2323
github.com/lib/pq v1.10.9
2424
github.com/metal-toolbox/auditevent v0.9.0
25+
github.com/metal-toolbox/iam-runtime v0.4.1
26+
github.com/metal-toolbox/iam-runtime-contrib v1.0.1
2527
github.com/mitchellh/go-homedir v1.1.0
2628
github.com/nats-io/nats.go v1.44.0
2729
github.com/peterldowns/pgtestdb v0.1.1
@@ -39,6 +41,7 @@ require (
3941
go.opentelemetry.io/otel/sdk v1.37.0
4042
go.uber.org/zap v1.27.0
4143
golang.org/x/oauth2 v0.30.0
44+
google.golang.org/grpc v1.73.0
4245
gopkg.in/square/go-jose.v2 v2.6.0
4346
)
4447

@@ -61,11 +64,11 @@ require (
6164
github.com/sethvargo/go-retry v0.3.0 // indirect
6265
github.com/sourcegraph/conc v0.3.0 // indirect
6366
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
67+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect
6468
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
6569
golang.org/x/sync v0.16.0 // indirect
6670
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
6771
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
68-
google.golang.org/grpc v1.73.0 // indirect
6972
)
7073

7174
require (

go.sum

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
198198
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
199199
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
200200
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
201+
github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY=
202+
github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g=
203+
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
204+
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
201205
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
202206
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
203207
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
@@ -208,6 +212,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
208212
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
209213
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
210214
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
215+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
216+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
211217
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
212218
github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
213219
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
@@ -218,6 +224,10 @@ github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJK
218224
github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
219225
github.com/metal-toolbox/auditevent v0.9.0 h1:LlXP38RsysaTdWTqBdreNcOmUXI/yDK0LycNYuTIjfM=
220226
github.com/metal-toolbox/auditevent v0.9.0/go.mod h1:2MYKYriPI4EheqlerPwHwx4V4AUaJjmxJg1bQsBwiIU=
227+
github.com/metal-toolbox/iam-runtime v0.4.1 h1:xeUSB9gnc2e4MYhoWXAwBHGJDQFlPEFDcid5PEzR7lA=
228+
github.com/metal-toolbox/iam-runtime v0.4.1/go.mod h1:tZZ1qJy1Rc/onvsX9TRdEu5IYCa9H5WnFlM1EviFqP8=
229+
github.com/metal-toolbox/iam-runtime-contrib v1.0.1 h1:y6DxcWCXnRxLqWc3yHzx8gJ0EsAMel49NYs445357d4=
230+
github.com/metal-toolbox/iam-runtime-contrib v1.0.1/go.mod h1:qVJ4+9u1SCHgWXgYjGvz1OQvHF5LUY6bHQPLKj86WcA=
221231
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
222232
github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg=
223233
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
@@ -301,6 +311,8 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
301311
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
302312
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
303313
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
314+
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
315+
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
304316
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
305317
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
306318
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
@@ -317,6 +329,10 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
317329
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
318330
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
319331
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
332+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
333+
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
334+
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
335+
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
320336
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
321337
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
322338
github.com/zsais/go-gin-prometheus v1.0.1 h1:PtTa1rQhbXEAx0gNQkXr4+SGcElSF1YR/NmO3f5s3o4=
@@ -327,6 +343,8 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
327343
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
328344
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.62.0 h1:fZNpsQuTwFFSGC96aJexNOBrCD7PjD9Tm/HyHtXhmnk=
329345
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.62.0/go.mod h1:+NFxPSeYg0SoiRUO4k0ceJYMCY9FiRbYFmByUpm7GJY=
346+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc=
347+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0=
330348
go.opentelemetry.io/contrib/propagators/b3 v1.37.0 h1:0aGKdIuVhy5l4GClAjl72ntkZJhijf2wg1S7b5oLoYA=
331349
go.opentelemetry.io/contrib/propagators/b3 v1.37.0/go.mod h1:nhyrxEJEOQdwR15zXrCKI6+cJK60PXAkJ/jRyfhr2mg=
332350
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=

0 commit comments

Comments
 (0)