From 8d5d3f1dc87ae29f086c4977184cc38e400cc7f9 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 19 Jan 2025 16:32:55 +0000 Subject: [PATCH] WIP implement multi connstr config --- cmd/africastalking/main.go | 24 +++++++++++------------- cmd/async/main.go | 26 +++++++++++++------------- cmd/http/main.go | 24 ++++++++++++------------ cmd/main.go | 23 +++++++++++------------ cmd/ssh/main.go | 28 ++++++++++++---------------- config/args.go | 17 +++++++++++++++++ config/config.go | 9 ++++----- devtools/admin/main.go | 24 +++++++++++++----------- devtools/store/dump/main.go | 20 ++++++++++---------- internal/cmd/cmd.go | 5 +++-- services/local.go | 2 +- ssh/ssh.go | 7 +++---- testutil/engine.go | 24 +++++++++++++++++++----- 13 files changed, 129 insertions(+), 104 deletions(-) create mode 100644 config/args.go diff --git a/cmd/africastalking/main.go b/cmd/africastalking/main.go index 483cb19..ef72f5d 100644 --- a/cmd/africastalking/main.go +++ b/cmd/africastalking/main.go @@ -36,8 +36,7 @@ var ( func main() { config.LoadConfig() - var connStr string - var resourceDir string + var override config.Override var size uint var engineDebug bool var host string @@ -46,10 +45,11 @@ func main() { var gettextDir string var langs args.LangVar - - flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") - flag.StringVar(&connStr, "c", "", "connection string") flag.BoolVar(&engineDebug, "d", false, "use engine debug output") + flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") + flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") + flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") + flag.StringVar(&override.StateConn, "state", "?", "state store connection string") flag.UintVar(&size, "s", 160, "max size of output") flag.StringVar(&host, "h", config.Host(), "http host") flag.UintVar(&port, "p", config.Port(), "http port") @@ -57,16 +57,14 @@ func main() { flag.Var(&langs, "language", "add symbol resolution for language") flag.Parse() - if connStr == "" { - connStr = config.DbConn() - } - connData, err := storage.ToConnData(connStr) + config.Apply(&override) + conns, err := config.GetConns() if err != nil { - fmt.Fprintf(os.Stderr, "connstr err: %v", err) + fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) os.Exit(1) } - logg.Infof("start command", "build", build, "conn", connData, "resourcedir", resourceDir, "outputsize", size) + logg.Infof("start command", "build", build, "conn", conns, "outputsize", size) ctx := context.Background() ln, err := lang.LanguageFromCode(config.Language()) @@ -89,7 +87,7 @@ func main() { cfg.EngineDebug = true } - menuStorageService := storage.NewMenuStorageService(connData, resourceDir) + menuStorageService := storage.NewMenuStorageService(conns) rs, err := menuStorageService.GetResource(ctx) if err != nil { fmt.Fprintf(os.Stderr, "menustorageservice: %v\n", err) @@ -119,7 +117,7 @@ func main() { os.Exit(1) } - accountService := services.New(ctx, menuStorageService, connData) + accountService := services.New(ctx, menuStorageService) hl, err := lhs.GetHandler(accountService) if err != nil { diff --git a/cmd/async/main.go b/cmd/async/main.go index b092fba..2241c17 100644 --- a/cmd/async/main.go +++ b/cmd/async/main.go @@ -43,10 +43,9 @@ func (p *asyncRequestParser) GetInput(r any) ([]byte, error) { func main() { config.LoadConfig() - - var connStr string + + var override config.Override var sessionId string - var resourceDir string var size uint var engineDebug bool var host string @@ -56,8 +55,11 @@ func main() { var langs args.LangVar flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") - flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") - flag.StringVar(&connStr, "c", "", "connection string") + flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") + flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") + flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") + flag.StringVar(&override.StateConn, "state", "?", "state store connection string") + flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.UintVar(&size, "s", 160, "max size of output") flag.StringVar(&host, "h", config.Host(), "http host") @@ -66,16 +68,14 @@ func main() { flag.Var(&langs, "language", "add symbol resolution for language") flag.Parse() - if connStr == "" { - connStr = config.DbConn() - } - connData, err := storage.ToConnData(connStr) + config.Apply(&override) + conns, err := config.GetConns() if err != nil { - fmt.Fprintf(os.Stderr, "connstr err: %v", err) + fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) os.Exit(1) } - logg.Infof("start command", "conn", connData, "resourcedir", resourceDir, "outputsize", size, "sessionId", sessionId) + logg.Infof("start command", "conn", conns, "outputsize", size, "sessionId", sessionId) ctx := context.Background() @@ -99,7 +99,7 @@ func main() { cfg.EngineDebug = true } - menuStorageService := storage.NewMenuStorageService(connData, resourceDir) + menuStorageService := storage.NewMenuStorageService(conns) if err != nil { fmt.Fprintf(os.Stderr, err.Error()) os.Exit(1) @@ -126,7 +126,7 @@ func main() { lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs.SetDataStore(&userdataStore) - accountService := services.New(ctx, menuStorageService, connData) + accountService := services.New(ctx, menuStorageService) hl, err := lhs.GetHandler(accountService) if err != nil { diff --git a/cmd/http/main.go b/cmd/http/main.go index a024808..f2e5813 100644 --- a/cmd/http/main.go +++ b/cmd/http/main.go @@ -35,8 +35,7 @@ var ( func main() { config.LoadConfig() - var connStr string - var resourceDir string + var override config.Override var size uint var engineDebug bool var host string @@ -45,8 +44,11 @@ func main() { var gettextDir string var langs args.LangVar - flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") - flag.StringVar(&connStr, "c", "", "connection string") +flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") + flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") + flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") + flag.StringVar(&override.StateConn, "state", "?", "state store connection string") + flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.UintVar(&size, "s", 160, "max size of output") flag.StringVar(&host, "h", config.Host(), "http host") @@ -55,16 +57,14 @@ func main() { flag.Var(&langs, "language", "add symbol resolution for language") flag.Parse() - if connStr == "" { - connStr = config.DbConn() - } - connData, err := storage.ToConnData(connStr) + config.Apply(&override) + conns, err := config.GetConns() if err != nil { - fmt.Fprintf(os.Stderr, "connstr err: %v", err) + fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) os.Exit(1) } - logg.Infof("start command", "conn", connData, "resourcedir", resourceDir, "outputsize", size) + logg.Infof("start command", "conn", conns, "outputsize", size) ctx := context.Background() @@ -88,7 +88,7 @@ func main() { cfg.EngineDebug = true } - menuStorageService := storage.NewMenuStorageService(connData, resourceDir) + menuStorageService := storage.NewMenuStorageService(conns) rs, err := menuStorageService.GetResource(ctx) if err != nil { @@ -115,7 +115,7 @@ func main() { os.Exit(1) } - accountService := services.New(ctx, menuStorageService, connData) + accountService := services.New(ctx, menuStorageService) hl, err := lhs.GetHandler(accountService) if err != nil { diff --git a/cmd/main.go b/cmd/main.go index a6351b4..defd00e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -29,34 +29,33 @@ var ( func main() { config.LoadConfig() - var connStr string + var override config.Override var size uint var sessionId string var engineDebug bool - var resourceDir string var err error var gettextDir string var langs args.LangVar - flag.StringVar(&resourceDir, "resourcedir", scriptDir, "resource dir") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") - flag.StringVar(&connStr, "c", "", "connection string") + flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") + flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") + flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") + flag.StringVar(&override.StateConn, "state", "?", "state store connection string") flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.UintVar(&size, "s", 160, "max size of output") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.Var(&langs, "language", "add symbol resolution for language") flag.Parse() - if connStr == "" { - connStr = config.DbConn() - } - connData, err := storage.ToConnData(connStr) + config.Apply(&override) + conns, err := config.GetConns() if err != nil { - fmt.Fprintf(os.Stderr, "connstr err: %v\n", err) + fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) os.Exit(1) } - logg.Infof("start command", "conn", connData, "outputsize", size) + logg.Infof("start command", "conn", conns, "outputsize", size) if len(langs.Langs()) == 0 { langs.Set(config.Language()) @@ -82,7 +81,7 @@ func main() { MenuSeparator: menuSeparator, } - menuStorageService := storage.NewMenuStorageService(connData, resourceDir) + menuStorageService := storage.NewMenuStorageService(conns) if err != nil { fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err) os.Exit(1) @@ -124,7 +123,7 @@ func main() { os.Exit(1) } - accountService := services.New(ctx, menuStorageService, connData) + accountService := services.New(ctx, menuStorageService) hl, err := lhs.GetHandler(accountService) if err != nil { fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err) diff --git a/cmd/ssh/main.go b/cmd/ssh/main.go index 5119a88..e375ad1 100644 --- a/cmd/ssh/main.go +++ b/cmd/ssh/main.go @@ -31,34 +31,31 @@ var ( func main() { config.LoadConfig() - var connStr string + var override config.Override var authConnStr string - var resourceDir string var size uint var engineDebug bool var stateDebug bool var host string var port uint - flag.StringVar(&connStr, "c", "", "connection string") - flag.StringVar(&authConnStr, "authdb", "", "auth connection string") - flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") + //flag.StringVar(&authConnStr, "authdb", "", "auth connection string") + flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") + flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") + flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") + flag.StringVar(&override.StateConn, "state", "?", "state store connection string") flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.UintVar(&size, "s", 160, "max size of output") flag.StringVar(&host, "h", config.HostSSH(), "socket host") flag.UintVar(&port, "p", config.PortSSH(), "socket port") flag.Parse() - if connStr == "" { - connStr = config.DbConn() - } - if authConnStr == "" { - authConnStr = connStr - } - connData, err := storage.ToConnData(connStr) + config.Apply(&override) + conns, err := config.GetConns() if err != nil { - fmt.Fprintf(os.Stderr, "connstr err: %v", err) + fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) os.Exit(1) } + authConnData, err := storage.ToConnData(authConnStr) if err != nil { fmt.Fprintf(os.Stderr, "auth connstr err: %v", err) @@ -79,7 +76,7 @@ func main() { logg.WarnCtxf(ctx, "!!!!! Do not expose to internet and only use with tunnel!") logg.WarnCtxf(ctx, "!!!!! (See ssh -L <...>)") - logg.Infof("start command", "conn", connData, "authconn", authConnData, "resourcedir", resourceDir, "outputsize", size, "keyfile", sshKeyFile, "host", host, "port", port) + logg.Infof("start command", "conn", conns, "authconn", authConnData, "outputsize", size, "keyfile", sshKeyFile, "host", host, "port", port) pfp := path.Join(scriptDir, "pp.csv") @@ -117,8 +114,7 @@ func main() { Cfg: cfg, Debug: engineDebug, FlagFile: pfp, - Conn: connData, - ResourceDir: resourceDir, + Conn: conns, SrvKeyFile: sshKeyFile, Host: host, Port: port, diff --git a/config/args.go b/config/args.go new file mode 100644 index 0000000..969d221 --- /dev/null +++ b/config/args.go @@ -0,0 +1,17 @@ +package config + +import ( + viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config" +) + +type Override struct { + DbConn string + StateConn string + ResourceConn string + UserConn string +} + +func Apply(o *Override) error { + viseconfig.ApplyConn(&o.DbConn, &o.StateConn, &o.ResourceConn, &o.UserConn) + return nil +} diff --git a/config/config.go b/config/config.go index 61521f2..0a1b5c1 100644 --- a/config/config.go +++ b/config/config.go @@ -6,6 +6,10 @@ import ( apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config" ) +var ( + GetConns = viseconfig.GetConns +) + func init() { env.LoadEnvVariables() } @@ -17,7 +21,6 @@ const ( defaultHTTPPort uint = 7123 ) - func LoadConfig() error { err := viseconfig.LoadConfig() if err != nil { @@ -30,10 +33,6 @@ func LoadConfig() error { return nil } -func DbConn() string { - return viseconfig.DbConn -} - func Language() string { return viseconfig.DefaultLanguage } diff --git a/devtools/admin/main.go b/devtools/admin/main.go index 3ef0466..762360f 100644 --- a/devtools/admin/main.go +++ b/devtools/admin/main.go @@ -24,21 +24,23 @@ func main() { config.LoadConfig() var sessionId string - var connStr string + var override config.Override flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") - flag.StringVar(&connStr, "c", "", "connection string") + flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") + flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") + flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") + flag.StringVar(&override.StateConn, "state", "?", "state store connection string") + flag.Parse() - - if connStr == "" { - connStr = config.DbConn() - } - connData, err := storage.ToConnData(connStr) + config.Apply(&override) + conns, err := config.GetConns() if err != nil { - fmt.Fprintf(os.Stderr, "connstr err: %v\n", err) + fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) os.Exit(1) } + ctx := context.Background() ctx = context.WithValue(ctx, "SessionId", sessionId) @@ -49,16 +51,16 @@ func main() { os.Exit(1) } - x := cmd.NewCmd(connData, sessionId, flagParser) + x := cmd.NewCmd(sessionId, flagParser) err = x.Parse(flag.Args()) if err != nil { fmt.Fprintf(os.Stderr, "cmd parse fail: %v\n", err) os.Exit(1) } - logg.Infof("start command", "conn", connData, "subcmd", x) + logg.Infof("start command", "conn", conns, "subcmd", x) - menuStorageService := storage.NewMenuStorageService(connData, "") + menuStorageService := storage.NewMenuStorageService(conns) if err != nil { fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err) os.Exit(1) diff --git a/devtools/store/dump/main.go b/devtools/store/dump/main.go index 34e4400..c0cb2bd 100644 --- a/devtools/store/dump/main.go +++ b/devtools/store/dump/main.go @@ -32,7 +32,7 @@ func formatItem(k []byte, v []byte, sessionId string) (string, error) { func main() { config.LoadConfig() - var connStr string + var override config.Override var sessionId string var database string var engineDebug bool @@ -40,27 +40,27 @@ func main() { var first bool flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") - flag.StringVar(&connStr, "c", "", "connection string") + flag.StringVar(&override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)") + flag.StringVar(&override.ResourceConn, "resource", "?", "resource connection string") + flag.StringVar(&override.UserConn, "userdata", "?", "userdata store connection string") + flag.StringVar(&override.StateConn, "state", "?", "state store connection string") flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.Parse() - if connStr == "" { - connStr = config.DbConn() - } - connData, err := storage.ToConnData(connStr) + config.Apply(&override) + conns, err := config.GetConns() if err != nil { - fmt.Fprintf(os.Stderr, "connstr err: %v\n", err) + fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err) os.Exit(1) } - logg.Infof("start command", "conn", connData) + logg.Infof("start command", "conn", conns) ctx := context.Background() ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "Database", database) - resourceDir := scriptDir - menuStorageService := storage.NewMenuStorageService(connData, resourceDir) + menuStorageService := storage.NewMenuStorageService(conns) store, err := menuStorageService.GetUserdataDb(ctx) if err != nil { diff --git a/internal/cmd/cmd.go b/internal/cmd/cmd.go index 1ebfd11..fe98f31 100644 --- a/internal/cmd/cmd.go +++ b/internal/cmd/cmd.go @@ -22,9 +22,10 @@ type Cmd struct { exec func(ctx context.Context, ss storage.StorageService) error } -func NewCmd(conn storage.ConnData, sessionId string, flagParser *application.FlagManager) *Cmd { +//func NewCmd(conn storage.ConnData, sessionId string, flagParser *application.FlagManager) *Cmd { +func NewCmd(sessionId string, flagParser *application.FlagManager) *Cmd { return &Cmd{ - conn: conn, +// conn: conn, sessionId: sessionId, flagParser: flagParser, } diff --git a/services/local.go b/services/local.go index e79c8fb..3f266a9 100644 --- a/services/local.go +++ b/services/local.go @@ -37,7 +37,7 @@ func (d *localEmitter) emit(ctx context.Context, msg apievent.Msg) error { return err } -func New(ctx context.Context, storageService storage.StorageService, conn storage.ConnData) remote.AccountService { +func New(ctx context.Context, storageService storage.StorageService) remote.AccountService { svc := devremote.NewDevAccountService(ctx, storageService) svc = svc.WithAutoVoucher(ctx, "FOO", 42) eu := event.NewEventsUpdater(svc, storageService) diff --git a/ssh/ssh.go b/ssh/ssh.go index 6408f76..530291d 100644 --- a/ssh/ssh.go +++ b/ssh/ssh.go @@ -75,8 +75,7 @@ type SshRunner struct { Ctx context.Context Cfg engine.Config FlagFile string - Conn storage.ConnData - ResourceDir string + Conn storage.Conns Debug bool SrvKeyFile string Host string @@ -148,7 +147,7 @@ func(s *SshRunner) Stop() error { func(s *SshRunner) GetEngine(sessionId string) (engine.Engine, func(), error) { ctx := s.Ctx - menuStorageService := storage.NewMenuStorageService(s.Conn, s.ResourceDir) + menuStorageService := storage.NewMenuStorageService(s.Conn) rs, err := menuStorageService.GetResource(ctx) if err != nil { @@ -180,7 +179,7 @@ func(s *SshRunner) GetEngine(sessionId string) (engine.Engine, func(), error) { } // TODO: clear up why pointer here and by-value other cmds - accountService := services.New(ctx, menuStorageService, s.Conn) + accountService := services.New(ctx, menuStorageService) hl, err := lhs.GetHandler(accountService) if err != nil { diff --git a/testutil/engine.go b/testutil/engine.go index 8f3c2f7..37e89a9 100644 --- a/testutil/engine.go +++ b/testutil/engine.go @@ -112,10 +112,16 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) { } if setDbType == "postgres" { - setConnStr = config.DbConn + conns, err := config.GetConns() + if err != nil { + fmt.Fprintf(os.Stderr, "Getconns error: %v", err) + os.Exit(1) + } + conn := conns[storage.STORETYPE_USER] + setConnStr = conn.String() setConnStr, err = updateSearchPath(setConnStr, setDbSchema) if err != nil { - fmt.Println("Error:", err) + fmt.Fprintf(os.Stderr, "Update search paths Error: %v\n", err) os.Exit(1) } } else { @@ -125,15 +131,23 @@ func TestEngine(sessionId string) (engine.Engine, func(), chan bool) { os.Exit(1) } } - conn, err := storage.ToConnData(setConnStr) if err != nil { fmt.Fprintf(os.Stderr, "connstr parse err: %v", err) os.Exit(1) } + conns := storage.NewConns() + conns.Set(conn, storage.STORETYPE_STATE) + conns.Set(conn, storage.STORETYPE_USER) + + conn, err = storage.ToConnData(scriptDir) + if err != nil { + fmt.Fprintf(os.Stderr, "connstr parse err: %v", err) + os.Exit(1) + } + conns.Set(conn, storage.STORETYPE_RESOURCE) - resourceDir := scriptDir - menuStorageService := storage.NewMenuStorageService(conn, resourceDir) + menuStorageService := storage.NewMenuStorageService(conns) rs, err := menuStorageService.GetResource(ctx) if err != nil {