Allow setting repo user and hostname (#3831)

Allows sourcing info about repo user/hostname from
both the config file and flags for maintenance.
Since user/hostname mostly matters for maintenance
don't add the flags for all commands.

Do allow config file parameters for them since
that has a lot of repo-level information already.
Currently not setup to persist these values in the
config file

---

#### Does this PR need a docs update or release note?

- [ ]  Yes, it's included
- [x] 🕐 Yes, but in a later PR
- [ ]  No

#### Type of change

- [x] 🌻 Feature
- [ ] 🐛 Bugfix
- [ ] 🗺️ Documentation
- [ ] 🤖 Supportability/Tests
- [ ] 💻 CI/Deployment
- [ ] 🧹 Tech Debt/Cleanup

#### Issue(s)

* #3569

#### Test Plan

- [x] 💪 Manual
- [ ]  Unit test
- [ ] 💚 E2E
This commit is contained in:
ashmrtn 2023-07-17 19:14:05 -07:00 committed by GitHub
parent 88bddf5c08
commit 140381fb80
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 69 additions and 11 deletions

View File

@ -10,7 +10,9 @@ import (
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/viper" "github.com/spf13/viper"
"github.com/alcionai/corso/src/cli/flags"
. "github.com/alcionai/corso/src/cli/print" . "github.com/alcionai/corso/src/cli/print"
"github.com/alcionai/corso/src/internal/common/str"
"github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/account"
"github.com/alcionai/corso/src/pkg/logger" "github.com/alcionai/corso/src/pkg/logger"
"github.com/alcionai/corso/src/pkg/storage" "github.com/alcionai/corso/src/pkg/storage"
@ -38,6 +40,8 @@ const (
// Corso passphrase in config // Corso passphrase in config
CorsoPassphrase = "passphrase" CorsoPassphrase = "passphrase"
CorsoUser = "corso_user"
CorsoHost = "corso_host"
) )
var ( var (
@ -53,6 +57,8 @@ type RepoDetails struct {
Storage storage.Storage Storage storage.Storage
Account account.Account Account account.Account
RepoID string RepoID string
RepoUser string
RepoHost string
} }
// Attempts to set the default dir and config file path. // Attempts to set the default dir and config file path.
@ -294,9 +300,20 @@ func getStorageAndAccountWithViper(
return config, clues.Wrap(err, "retrieving storage provider details") return config, clues.Wrap(err, "retrieving storage provider details")
} }
config.RepoUser, config.RepoHost = getUserHost(vpr, readConfigFromViper)
return config, nil return config, nil
} }
func getUserHost(vpr *viper.Viper, readConfigFromViper bool) (string, string) {
user := str.First(flags.UserMaintenanceFV, vpr.GetString(CorsoUser))
host := str.First(flags.HostnameMaintenanceFV, vpr.GetString(CorsoHost))
// Fine if these are empty; later code will assign a meaningful default if
// needed.
return user, host
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Helper funcs // Helper funcs
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------

View File

@ -9,11 +9,15 @@ import (
const ( const (
MaintenanceModeFN = "mode" MaintenanceModeFN = "mode"
ForceMaintenanceFN = "force" ForceMaintenanceFN = "force"
UserMaintenanceFN = "user"
HostnameMaintenanceFN = "host"
) )
var ( var (
MaintenanceModeFV string MaintenanceModeFV string
ForceMaintenanceFV bool ForceMaintenanceFV bool
UserMaintenanceFV string
HostnameMaintenanceFV string
) )
func AddMaintenanceModeFlag(cmd *cobra.Command) { func AddMaintenanceModeFlag(cmd *cobra.Command) {
@ -39,3 +43,21 @@ func AddForceMaintenanceFlag(cmd *cobra.Command) {
"Force maintenance. Caution: user must ensure this is not run concurrently on a single repo") "Force maintenance. Caution: user must ensure this is not run concurrently on a single repo")
cobra.CheckErr(fs.MarkHidden(ForceMaintenanceFN)) cobra.CheckErr(fs.MarkHidden(ForceMaintenanceFN))
} }
func AddMaintenanceUserFlag(cmd *cobra.Command) {
fs := cmd.Flags()
fs.StringVar(
&UserMaintenanceFV,
UserMaintenanceFN,
"",
"Attempt to run maintenance as the specified user for the repo owner user")
}
func AddMaintenanceHostnameFlag(cmd *cobra.Command) {
fs := cmd.Flags()
fs.StringVar(
&HostnameMaintenanceFV,
HostnameMaintenanceFN,
"",
"Attempt to run maintenance with the specified hostname for the repo owner hostname")
}

View File

@ -46,6 +46,8 @@ func AddCommands(cmd *cobra.Command) {
utils.MarkPreReleaseCommand()) utils.MarkPreReleaseCommand())
flags.AddMaintenanceModeFlag(maintenanceCmd) flags.AddMaintenanceModeFlag(maintenanceCmd)
flags.AddForceMaintenanceFlag(maintenanceCmd) flags.AddForceMaintenanceFlag(maintenanceCmd)
flags.AddMaintenanceUserFlag(maintenanceCmd)
flags.AddMaintenanceHostnameFlag(maintenanceCmd)
for _, addRepoTo := range repoCommands { for _, addRepoTo := range repoCommands {
addRepoTo(initCmd) addRepoTo(initCmd)

View File

@ -130,6 +130,8 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
return Only(ctx, err) return Only(ctx, err)
} }
opt := utils.ControlWithConfig(cfg)
// SendStartCorsoEvent uses distict ID as tenant ID because repoID is still not generated // SendStartCorsoEvent uses distict ID as tenant ID because repoID is still not generated
utils.SendStartCorsoEvent( utils.SendStartCorsoEvent(
ctx, ctx,
@ -137,7 +139,7 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
cfg.Account.ID(), cfg.Account.ID(),
map[string]any{"command": "init repo"}, map[string]any{"command": "init repo"},
cfg.Account.ID(), cfg.Account.ID(),
utils.Control()) opt)
s3Cfg, err := cfg.Storage.S3Config() s3Cfg, err := cfg.Storage.S3Config()
if err != nil { if err != nil {
@ -156,7 +158,7 @@ func initS3Cmd(cmd *cobra.Command, args []string) error {
return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config")) return Only(ctx, clues.Wrap(err, "Failed to parse m365 account config"))
} }
r, err := repository.Initialize(ctx, cfg.Account, cfg.Storage, utils.Control()) r, err := repository.Initialize(ctx, cfg.Account, cfg.Storage, opt)
if err != nil { if err != nil {
if succeedIfExists && errors.Is(err, repository.ErrorRepoAlreadyExists) { if succeedIfExists && errors.Is(err, repository.ErrorRepoAlreadyExists) {
return nil return nil
@ -226,7 +228,12 @@ func connectS3Cmd(cmd *cobra.Command, args []string) error {
return Only(ctx, clues.New(invalidEndpointErr)) return Only(ctx, clues.New(invalidEndpointErr))
} }
r, err := repository.ConnectAndSendConnectEvent(ctx, cfg.Account, cfg.Storage, repoID, utils.Control()) r, err := repository.ConnectAndSendConnectEvent(
ctx,
cfg.Account,
cfg.Storage,
repoID,
utils.ControlWithConfig(cfg))
if err != nil { if err != nil {
return Only(ctx, clues.Wrap(err, "Failed to connect to the S3 repository")) return Only(ctx, clues.Wrap(err, "Failed to connect to the S3 repository"))
} }

View File

@ -1,6 +1,7 @@
package utils package utils
import ( import (
"github.com/alcionai/corso/src/cli/config"
"github.com/alcionai/corso/src/cli/flags" "github.com/alcionai/corso/src/cli/flags"
"github.com/alcionai/corso/src/pkg/control" "github.com/alcionai/corso/src/pkg/control"
) )
@ -24,3 +25,12 @@ func Control() control.Options {
return opt return opt
} }
func ControlWithConfig(cfg config.RepoDetails) control.Options {
opt := Control()
opt.Repo.User = cfg.RepoUser
opt.Repo.Host = cfg.RepoHost
return opt
}

View File

@ -34,7 +34,7 @@ func GetAccountAndConnect(
repoID = events.RepoIDNotFound repoID = events.RepoIDNotFound
} }
r, err := repository.Connect(ctx, cfg.Account, cfg.Storage, repoID, Control()) r, err := repository.Connect(ctx, cfg.Account, cfg.Storage, repoID, ControlWithConfig(cfg))
if err != nil { if err != nil {
return nil, nil, nil, clues.Wrap(err, "connecting to the "+cfg.Storage.Provider.String()+" repository") return nil, nil, nil, clues.Wrap(err, "connecting to the "+cfg.Storage.Provider.String()+" repository")
} }