From b5a16a189889431c6142af9755e7ef2bed3bef4e Mon Sep 17 00:00:00 2001 From: jnfrati Date: Thu, 4 Jun 2026 12:49:48 +0200 Subject: [PATCH] chore: move token commands under admin CLI --- combined/cmd/admin.go | 51 ++++++++++++++++++++++----------- combined/cmd/root.go | 1 - combined/cmd/token.go | 63 ----------------------------------------- management/cmd/admin.go | 42 ++++++++++++++++++--------- management/cmd/root.go | 4 --- management/cmd/token.go | 55 ----------------------------------- 6 files changed, 63 insertions(+), 153 deletions(-) delete mode 100644 combined/cmd/token.go delete mode 100644 management/cmd/token.go diff --git a/combined/cmd/admin.go b/combined/cmd/admin.go index 52bef218b..5a9ff5d40 100644 --- a/combined/cmd/admin.go +++ b/combined/cmd/admin.go @@ -11,18 +11,49 @@ import ( "github.com/netbirdio/netbird/formatter/hook" admincmd "github.com/netbirdio/netbird/management/cmd/admin" + tokencmd "github.com/netbirdio/netbird/management/cmd/token" "github.com/netbirdio/netbird/management/server/store" "github.com/netbirdio/netbird/management/server/types" "github.com/netbirdio/netbird/util" ) -// newAdminCommands creates the admin command tree with combined-specific resource opener. +// newAdminCommands creates the admin command tree with combined-specific resource openers. func newAdminCommands() *cobra.Command { - return admincmd.NewCommands(withAdminResources) + cmd := admincmd.NewCommands(withAdminResources) + cmd.AddCommand(tokencmd.NewCommands(withAdminTokenStore)) + return cmd } // withAdminResources loads the combined YAML config, initializes stores, and calls fn. func withAdminResources(cmd *cobra.Command, fn func(ctx context.Context, resources admincmd.Resources) error) error { + return withAdminStore(cmd, func(ctx context.Context, managementStore store.Store, cfg *CombinedConfig) error { + mgmtConfig, err := cfg.ToManagementConfig() + if err != nil { + return fmt.Errorf("create management config: %w", err) + } + + idpStorage, err := admincmd.OpenEmbeddedIDPStorage(mgmtConfig.EmbeddedIdP) + if err != nil { + return err + } + defer func() { + if err := idpStorage.Close(); err != nil { + log.Debugf("close embedded IdP storage: %v", err) + } + }() + + return fn(ctx, admincmd.Resources{Store: managementStore, IDPStorage: idpStorage}) + }) +} + +// withAdminTokenStore opens only the management store for admin token commands. +func withAdminTokenStore(cmd *cobra.Command, fn func(ctx context.Context, s store.Store) error) error { + return withAdminStore(cmd, func(ctx context.Context, managementStore store.Store, _ *CombinedConfig) error { + return fn(ctx, managementStore) + }) +} + +func withAdminStore(cmd *cobra.Command, fn func(ctx context.Context, s store.Store, cfg *CombinedConfig) error) error { if err := util.InitLog("error", "console"); err != nil { return fmt.Errorf("init log: %w", err) } @@ -56,19 +87,5 @@ func withAdminResources(cmd *cobra.Command, fn func(ctx context.Context, resourc } }() - mgmtConfig, err := cfg.ToManagementConfig() - if err != nil { - return fmt.Errorf("create management config: %w", err) - } - idpStorage, err := admincmd.OpenEmbeddedIDPStorage(mgmtConfig.EmbeddedIdP) - if err != nil { - return err - } - defer func() { - if err := idpStorage.Close(); err != nil { - log.Debugf("close embedded IdP storage: %v", err) - } - }() - - return fn(ctx, admincmd.Resources{Store: managementStore, IDPStorage: idpStorage}) + return fn(ctx, managementStore, cfg) } diff --git a/combined/cmd/root.go b/combined/cmd/root.go index 261e529d6..cb116aa6c 100644 --- a/combined/cmd/root.go +++ b/combined/cmd/root.go @@ -64,7 +64,6 @@ func init() { rootCmd.PersistentFlags().StringVarP(&configPath, "config", "c", "", "path to YAML configuration file (required)") _ = rootCmd.MarkPersistentFlagRequired("config") - rootCmd.AddCommand(newTokenCommands()) rootCmd.AddCommand(newAdminCommands()) } diff --git a/combined/cmd/token.go b/combined/cmd/token.go deleted file mode 100644 index 550480062..000000000 --- a/combined/cmd/token.go +++ /dev/null @@ -1,63 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - "os" - "strings" - - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - - "github.com/netbirdio/netbird/formatter/hook" - tokencmd "github.com/netbirdio/netbird/management/cmd/token" - "github.com/netbirdio/netbird/management/server/store" - "github.com/netbirdio/netbird/management/server/types" - "github.com/netbirdio/netbird/util" -) - -// newTokenCommands creates the token command tree with combined-specific store opener. -func newTokenCommands() *cobra.Command { - return tokencmd.NewCommands(withTokenStore) -} - -// withTokenStore loads the combined YAML config, initializes the store, and calls fn. -func withTokenStore(cmd *cobra.Command, fn func(ctx context.Context, s store.Store) error) error { - if err := util.InitLog("error", "console"); err != nil { - return fmt.Errorf("init log: %w", err) - } - - ctx := context.WithValue(cmd.Context(), hook.ExecutionContextKey, hook.SystemSource) //nolint:staticcheck - - cfg, err := LoadConfig(configPath) - if err != nil { - return fmt.Errorf("load config: %w", err) - } - - if dsn := cfg.Server.Store.DSN; dsn != "" { - switch strings.ToLower(cfg.Server.Store.Engine) { - case "postgres": - os.Setenv("NB_STORE_ENGINE_POSTGRES_DSN", dsn) - case "mysql": - os.Setenv("NB_STORE_ENGINE_MYSQL_DSN", dsn) - } - } - if file := cfg.Server.Store.File; file != "" { - os.Setenv("NB_STORE_ENGINE_SQLITE_FILE", file) - } - - datadir := cfg.Management.DataDir - engine := types.Engine(cfg.Management.Store.Engine) - - s, err := store.NewStore(ctx, engine, datadir, nil, true) - if err != nil { - return fmt.Errorf("create store: %w", err) - } - defer func() { - if err := s.Close(ctx); err != nil { - log.Debugf("close store: %v", err) - } - }() - - return fn(ctx, s) -} diff --git a/management/cmd/admin.go b/management/cmd/admin.go index 28d930ccc..34def7036 100644 --- a/management/cmd/admin.go +++ b/management/cmd/admin.go @@ -10,6 +10,7 @@ import ( "github.com/netbirdio/netbird/formatter/hook" admincmd "github.com/netbirdio/netbird/management/cmd/admin" + tokencmd "github.com/netbirdio/netbird/management/cmd/token" nbconfig "github.com/netbirdio/netbird/management/internals/server/config" "github.com/netbirdio/netbird/management/server/store" "github.com/netbirdio/netbird/util" @@ -17,15 +18,40 @@ import ( var adminDatadir string -// newAdminCommands creates the admin command tree with management-specific resource opener. +// newAdminCommands creates the admin command tree with management-specific resource openers. func newAdminCommands() *cobra.Command { cmd := admincmd.NewCommands(withAdminResources) cmd.PersistentFlags().StringVar(&adminDatadir, "datadir", "", "Override the data directory from config (used for store.db and the default idp.db)") + cmd.AddCommand(tokencmd.NewCommands(withAdminTokenStore)) return cmd } -// withAdminResources initializes logging, loads config, opens the management store and embedded IdP storage, and calls fn. +// withAdminResources initializes logging, loads config, opens the management store +// and embedded IdP storage, and calls fn. func withAdminResources(cmd *cobra.Command, fn func(ctx context.Context, resources admincmd.Resources) error) error { + return withAdminStore(cmd, func(ctx context.Context, managementStore store.Store, config *nbconfig.Config) error { + idpStorage, err := admincmd.OpenEmbeddedIDPStorage(config.EmbeddedIdP) + if err != nil { + return err + } + defer func() { + if err := idpStorage.Close(); err != nil { + log.Debugf("close embedded IdP storage: %v", err) + } + }() + + return fn(ctx, admincmd.Resources{Store: managementStore, IDPStorage: idpStorage}) + }) +} + +// withAdminTokenStore opens only the management store for admin token commands. +func withAdminTokenStore(cmd *cobra.Command, fn func(ctx context.Context, s store.Store) error) error { + return withAdminStore(cmd, func(ctx context.Context, managementStore store.Store, _ *nbconfig.Config) error { + return fn(ctx, managementStore) + }) +} + +func withAdminStore(cmd *cobra.Command, fn func(ctx context.Context, s store.Store, config *nbconfig.Config) error) error { if err := util.InitLog("error", "console"); err != nil { return fmt.Errorf("init log: %w", err) } @@ -59,15 +85,5 @@ func withAdminResources(cmd *cobra.Command, fn func(ctx context.Context, resourc } }() - idpStorage, err := admincmd.OpenEmbeddedIDPStorage(config.EmbeddedIdP) - if err != nil { - return err - } - defer func() { - if err := idpStorage.Close(); err != nil { - log.Debugf("close embedded IdP storage: %v", err) - } - }() - - return fn(ctx, admincmd.Resources{Store: managementStore, IDPStorage: idpStorage}) + return fn(ctx, managementStore, config) } diff --git a/management/cmd/root.go b/management/cmd/root.go index 0d7d9c6f5..4f691b520 100644 --- a/management/cmd/root.go +++ b/management/cmd/root.go @@ -83,10 +83,6 @@ func init() { rootCmd.AddCommand(migrationCmd) - tc := newTokenCommands() - tc.PersistentFlags().StringVar(&nbconfig.MgmtConfigPath, "config", defaultMgmtConfig, "Netbird config file location") - rootCmd.AddCommand(tc) - ac := newAdminCommands() ac.PersistentFlags().StringVar(&nbconfig.MgmtConfigPath, "config", defaultMgmtConfig, "Netbird config file location") rootCmd.AddCommand(ac) diff --git a/management/cmd/token.go b/management/cmd/token.go deleted file mode 100644 index 67af1a5f5..000000000 --- a/management/cmd/token.go +++ /dev/null @@ -1,55 +0,0 @@ -package cmd - -import ( - "context" - "fmt" - - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - - "github.com/netbirdio/netbird/formatter/hook" - tokencmd "github.com/netbirdio/netbird/management/cmd/token" - nbconfig "github.com/netbirdio/netbird/management/internals/server/config" - "github.com/netbirdio/netbird/management/server/store" - "github.com/netbirdio/netbird/util" -) - -var tokenDatadir string - -// newTokenCommands creates the token command tree with management-specific store opener. -func newTokenCommands() *cobra.Command { - cmd := tokencmd.NewCommands(withTokenStore) - cmd.PersistentFlags().StringVar(&tokenDatadir, "datadir", "", "Override the data directory from config (where store.db is located)") - return cmd -} - -// withTokenStore initializes logging, loads config, opens the store, and calls fn. -func withTokenStore(cmd *cobra.Command, fn func(ctx context.Context, s store.Store) error) error { - if err := util.InitLog("error", "console"); err != nil { - return fmt.Errorf("init log: %w", err) - } - - ctx := context.WithValue(cmd.Context(), hook.ExecutionContextKey, hook.SystemSource) //nolint:staticcheck - - config, err := LoadMgmtConfig(ctx, nbconfig.MgmtConfigPath) - if err != nil { - return fmt.Errorf("load config: %w", err) - } - - datadir := config.Datadir - if tokenDatadir != "" { - datadir = tokenDatadir - } - - s, err := store.NewStore(ctx, config.StoreConfig.Engine, datadir, nil, true) - if err != nil { - return fmt.Errorf("create store: %w", err) - } - defer func() { - if err := s.Close(ctx); err != nil { - log.Debugf("close store: %v", err) - } - }() - - return fn(ctx, s) -}