From 5dde6add580cbeaba8dce25a8817ba88e34047b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Michon?= Date: Mon, 18 Sep 2023 16:14:04 +0200 Subject: [PATCH] refactor(auth): drop the use of errgo --- apps/list.go | 2 +- cmd/addon_providers_list.go | 2 +- cmd/addons.go | 20 +++--- cmd/addons_providers_plans_list.go | 2 +- cmd/alerts.go | 20 +++--- cmd/apps.go | 4 +- cmd/autoscalers.go | 20 +++--- cmd/backups.go | 6 +- cmd/changelog.go | 2 +- cmd/collaborators.go | 6 +- cmd/commands.go | 6 +- cmd/config.go | 2 +- cmd/create.go | 2 +- cmd/cron_tasks.go | 2 +- cmd/dashboard.go | 2 +- cmd/databases.go | 14 ++--- cmd/db_tunnel.go | 2 +- cmd/deployments.go | 12 ++-- cmd/destroy.go | 2 +- cmd/domains.go | 12 ++-- cmd/env.go | 8 +-- cmd/error.go | 11 ++-- cmd/git.go | 4 +- cmd/influxdb.go | 4 +- cmd/integration_link.go | 30 ++++----- cmd/keys.go | 6 +- cmd/log_drains.go | 6 +- cmd/login.go | 4 +- cmd/logout.go | 8 ++- cmd/logs.go | 2 +- cmd/logs_archives.go | 2 +- cmd/maintenance.go | 6 +- cmd/mongo.go | 2 +- cmd/mysql.go | 4 +- cmd/notification_platforms.go | 2 +- cmd/notifiers.go | 10 +-- cmd/one_off_stop.go | 4 +- cmd/open.go | 2 +- cmd/pgsql.go | 4 +- cmd/ps.go | 2 +- cmd/redis.go | 4 +- cmd/region_migrations.go | 10 +-- cmd/regions.go | 2 +- cmd/rename.go | 2 +- cmd/restart.go | 2 +- cmd/review_apps.go | 2 +- cmd/routing_settings.go | 6 +- cmd/run.go | 2 +- cmd/scale.go | 4 +- cmd/scm_integrations.go | 14 ++--- cmd/self.go | 2 +- cmd/sendsignal.go | 2 +- cmd/stacks.go | 4 +- cmd/stats.go | 2 +- cmd/timeline.go | 2 +- cmd/update.go | 2 +- cmd/user-timeline.go | 2 +- config/auth.go | 97 +++++++++++++++--------------- config/auth_test.go | 19 +++--- config/config.go | 10 +-- config/region.go | 2 +- session/destroy.go | 7 ++- session/login.go | 2 +- utils/consent.go | 2 +- 64 files changed, 236 insertions(+), 228 deletions(-) diff --git a/apps/list.go b/apps/list.go index 24f6cfc15..837de3238 100644 --- a/apps/list.go +++ b/apps/list.go @@ -31,7 +31,7 @@ func List(ctx context.Context) error { t := tablewriter.NewWriter(os.Stdout) t.SetHeader([]string{"Name", "Role", "Status"}) - currentUser, err := config.C.CurrentUser() + currentUser, err := config.C.CurrentUser(ctx) if err != nil { return errgo.Notef(err, "fail to get current user") } diff --git a/cmd/addon_providers_list.go b/cmd/addon_providers_list.go index 95ffad5e8..97f53eee4 100644 --- a/cmd/addon_providers_list.go +++ b/cmd/addon_providers_list.go @@ -15,7 +15,7 @@ var ( Usage: "List all addons", Action: func(c *cli.Context) error { if err := addonproviders.List(c.Context); err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/addons.go b/cmd/addons.go index 36d4a0f17..7e7126ca9 100644 --- a/cmd/addons.go +++ b/cmd/addons.go @@ -29,7 +29,7 @@ var ( err := addons.List(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil @@ -60,7 +60,7 @@ var ( err := addons.Provision(c.Context, currentApp, c.Args().First(), c.Args().Slice()[1]) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil @@ -92,12 +92,12 @@ var ( addonUUID, err := utils.GetAddonUUIDFromType(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } err = addons.Destroy(c.Context, currentApp, addonUUID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil @@ -127,12 +127,12 @@ var ( addonUUID, err := utils.GetAddonUUIDFromType(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } err = addons.Upgrade(c.Context, currentApp, addonUUID, c.Args().Slice()[1]) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -162,12 +162,12 @@ var ( addonUUID, err := utils.GetAddonUUIDFromType(c.Context, currentApp, addonName) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } err = addons.Info(c.Context, currentApp, addonUUID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil @@ -214,7 +214,7 @@ var ( err := addons.UpdateConfig(ctx, currentApp, currentAddon, config) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil @@ -222,7 +222,7 @@ var ( BashComplete: func(c *cli.Context) { err := autocomplete.CmdFlagsAutoComplete(c, "addons-config") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } }, } diff --git a/cmd/addons_providers_plans_list.go b/cmd/addons_providers_plans_list.go index e0f11b8f0..d54c7db88 100644 --- a/cmd/addons_providers_plans_list.go +++ b/cmd/addons_providers_plans_list.go @@ -23,7 +23,7 @@ var ( return nil } if err := addonproviders.Plans(c.Context, c.Args().First()); err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/alerts.go b/cmd/alerts.go index 41e8930a0..41b48a1bc 100644 --- a/cmd/alerts.go +++ b/cmd/alerts.go @@ -31,7 +31,7 @@ var ( err := alerts.List(c.Context, detect.CurrentApp(c)) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -66,7 +66,7 @@ var ( if !isValidAlertAddOpts(c) { err := cli.ShowCommandHelp(c, "alerts-add") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -87,7 +87,7 @@ var ( Notifiers: c.StringSlice("n"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -125,7 +125,7 @@ var ( if c.Args().Len() != 1 { err := cli.ShowCommandHelp(c, "alerts-update") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -171,7 +171,7 @@ var ( err := alerts.Update(c.Context, currentApp, alertID, params) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -196,7 +196,7 @@ var ( if c.Args().Len() != 1 { err := cli.ShowCommandHelp(c, "alerts-enable") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -210,7 +210,7 @@ var ( Disabled: &disabled, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -235,7 +235,7 @@ var ( if c.Args().Len() != 1 { err := cli.ShowCommandHelp(c, "alerts-disable") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -249,7 +249,7 @@ var ( Disabled: &disabled, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -281,7 +281,7 @@ var ( err := alerts.Remove(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/apps.go b/cmd/apps.go index 99e20b540..70c408e5f 100644 --- a/cmd/apps.go +++ b/cmd/apps.go @@ -16,7 +16,7 @@ var ( Usage: "List your apps", Action: func(c *cli.Context) error { if err := apps.List(c.Context); err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -38,7 +38,7 @@ var ( Action: func(c *cli.Context) error { currentApp := detect.CurrentApp(c) if err := apps.Info(c.Context, currentApp); err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/autoscalers.go b/cmd/autoscalers.go index 6fe9f4c12..68c1687a9 100644 --- a/cmd/autoscalers.go +++ b/cmd/autoscalers.go @@ -28,7 +28,7 @@ var ( err := autoscalers.List(c.Context, detect.CurrentApp(c)) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -57,7 +57,7 @@ var ( if !isValidAutoscalerAddOpts(c) { err := cli.ShowCommandHelp(c, "autoscalers-add") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -74,7 +74,7 @@ var ( MaxContainers: c.Int("max-containers"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -107,7 +107,7 @@ var ( if c.Args().Len() != 0 || !c.IsSet("c") { err := cli.ShowCommandHelp(c, "autoscalers-update") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -139,7 +139,7 @@ var ( } err := autoscalers.Update(c.Context, currentApp, c.String("c"), params) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -162,7 +162,7 @@ var ( if c.Args().Len() != 1 { err := cli.ShowCommandHelp(c, "autoscalers-enable") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -176,7 +176,7 @@ var ( Disabled: &disabled, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -200,7 +200,7 @@ var ( if c.Args().Len() != 1 { err := cli.ShowCommandHelp(c, "autoscalers-disable") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -214,7 +214,7 @@ var ( Disabled: &disabled, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -246,7 +246,7 @@ var ( err := autoscalers.Remove(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/backups.go b/cmd/backups.go index d650a7f96..d40066381 100644 --- a/cmd/backups.go +++ b/cmd/backups.go @@ -27,7 +27,7 @@ var ( err := db.ListBackups(c.Context, currentApp, addonName) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -51,7 +51,7 @@ var ( err := db.CreateBackup(c.Context, currentApp, addonName) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -94,7 +94,7 @@ var ( err := db.DownloadBackup(c.Context, currentApp, addonName, backup, opts) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/changelog.go b/cmd/changelog.go index e6720d657..b450deb69 100644 --- a/cmd/changelog.go +++ b/cmd/changelog.go @@ -20,7 +20,7 @@ var ( Action: func(c *cli.Context) error { err := update.ShowLastChangelog() if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/collaborators.go b/cmd/collaborators.go index aece66a57..95d4b6095 100644 --- a/cmd/collaborators.go +++ b/cmd/collaborators.go @@ -23,7 +23,7 @@ var ( } else { err := collaborators.List(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } return nil @@ -51,7 +51,7 @@ var ( utils.CheckForConsent(c.Context, currentApp, utils.ConsentTypeContainers) err := collaborators.Add(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } return nil @@ -80,7 +80,7 @@ var ( utils.CheckForConsent(c.Context, currentApp, utils.ConsentTypeContainers) err := collaborators.Remove(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } return nil diff --git a/cmd/commands.go b/cmd/commands.go index 7a69253e5..6a823174e 100644 --- a/cmd/commands.go +++ b/cmd/commands.go @@ -81,11 +81,11 @@ func regionalCommandAction(action cli.ActionFunc) cli.ActionFunc { return func(c *cli.Context) error { token := os.Getenv("SCALINGO_API_TOKEN") - currentUser, err := config.C.CurrentUser() + currentUser, err := config.C.CurrentUser(c.Context) if err != nil || currentUser == nil { err := session.Login(c.Context, session.LoginOpts{APIToken: token}) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } @@ -93,7 +93,7 @@ func regionalCommandAction(action cli.ActionFunc) cli.ActionFunc { Token: token, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } currentRegion := regionNameFromFlags(c) diff --git a/cmd/config.go b/cmd/config.go index f02931ee2..75fcb521a 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -24,7 +24,7 @@ var ( if regionName != "" { err := config.SetRegion(c.Context, regionName) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } diff --git a/cmd/create.go b/cmd/create.go index 05ea123e0..b95ca3436 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -35,7 +35,7 @@ var ( err := apps.Create(c.Context, c.Args().First(), detect.RemoteNameFromFlags(c), c.String("buildpack")) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/cron_tasks.go b/cmd/cron_tasks.go index aaf24e79b..41d1d9651 100644 --- a/cmd/cron_tasks.go +++ b/cmd/cron_tasks.go @@ -28,7 +28,7 @@ var ( currentApp := detect.CurrentApp(c) err := crontasks.List(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/dashboard.go b/cmd/dashboard.go index b34f07d49..e90e2769b 100644 --- a/cmd/dashboard.go +++ b/cmd/dashboard.go @@ -30,7 +30,7 @@ var ( currentRegion := config.C.ScalingoRegion err := apps.Dashboard(currentApp, currentRegion) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/databases.go b/cmd/databases.go index 011094fc1..0890e4d1c 100644 --- a/cmd/databases.go +++ b/cmd/databases.go @@ -39,12 +39,12 @@ var ( utils.CheckForConsent(c.Context, currentApp, utils.ConsentTypeDBs) addonName := addonUUIDFromFlags(c, currentApp, true) if c.NArg() != 1 { - errorQuit(errors.New("feature argument should be specified")) + errorQuit(c.Context, errors.New("feature argument should be specified")) } feature := c.Args().First() err := db.EnableFeature(c, currentApp, addonName, feature) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -69,12 +69,12 @@ var ( utils.CheckForConsent(c.Context, currentApp, utils.ConsentTypeDBs) addonName := addonUUIDFromFlags(c, currentApp, true) if c.NArg() != 1 { - errorQuit(errors.New("feature argument should be specified")) + errorQuit(c.Context, errors.New("feature argument should be specified")) } feature := c.Args().First() err := db.DisableFeature(c.Context, currentApp, addonName, feature) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -110,7 +110,7 @@ var ( scheduleAtFlag := c.String("schedule-at") disable := c.Bool("unschedule") if scheduleAtFlag != "" && disable { - errorQuit(errors.New("you cannot use both --schedule-at and --unschedule at the same time")) + errorQuit(c.Context, errors.New("you cannot use both --schedule-at and --unschedule at the same time")) } if disable { @@ -122,7 +122,7 @@ var ( params.Enabled = &t scheduleAt, loc, err := parseScheduleAtFlag(scheduleAtFlag) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } localTime := time.Date(1986, 7, 22, scheduleAt, 0, 0, 0, loc) hour := localTime.UTC().Hour() @@ -132,7 +132,7 @@ var ( if disable || scheduleAtFlag != "" { err := db.BackupsConfiguration(c.Context, currentApp, addonName, params) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } return nil diff --git a/cmd/db_tunnel.go b/cmd/db_tunnel.go index 923d1e8e2..4cb675851 100644 --- a/cmd/db_tunnel.go +++ b/cmd/db_tunnel.go @@ -82,7 +82,7 @@ var ( Reconnect: c.Bool("reconnect"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/deployments.go b/cmd/deployments.go index 14acf2a52..2bfcf0006 100644 --- a/cmd/deployments.go +++ b/cmd/deployments.go @@ -32,7 +32,7 @@ var ( utils.CheckForConsent(c.Context, currentApp, utils.ConsentTypeContainers) err := deployments.ResetCache(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } io.Status("Deployment cache successfully deleted") } @@ -59,7 +59,7 @@ var ( PerPage: c.Int("per-page"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -85,7 +85,7 @@ var ( err := deployments.Logs(c.Context, currentApp, deploymentID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -107,7 +107,7 @@ var ( AppName: currentApp, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -153,13 +153,13 @@ It is a reference to the code you are deploying, version, commit SHA, etc.`, io.Status(fmt.Sprintf("Deploying WAR archive: %s", archivePath)) err := deployments.DeployWar(c.Context, currentApp, archivePath, gitRef, opts) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } else { io.Status(fmt.Sprintf("Deploying tarball archive: %s", archivePath)) err := deployments.Deploy(c.Context, currentApp, archivePath, gitRef, opts) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } return nil diff --git a/cmd/destroy.go b/cmd/destroy.go index ebb05ce44..451605329 100644 --- a/cmd/destroy.go +++ b/cmd/destroy.go @@ -40,7 +40,7 @@ var ( utils.CheckForConsent(c.Context, currentApp) err := apps.Destroy(c.Context, currentApp, c.Bool("force")) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } return nil diff --git a/cmd/domains.go b/cmd/domains.go index 818d49a09..fb727b964 100644 --- a/cmd/domains.go +++ b/cmd/domains.go @@ -31,7 +31,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -74,7 +74,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -106,7 +106,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -147,7 +147,7 @@ var ( cli.ShowCommandHelp(c, "domains-ssl") } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -179,7 +179,7 @@ This domain is called the canonical domain. This command sets the canonical doma err := domains.SetCanonical(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -210,7 +210,7 @@ This domain is called the canonical domain. This command sets the canonical doma err := domains.UnsetCanonical(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/env.go b/cmd/env.go index ad68f8efd..5700cc595 100644 --- a/cmd/env.go +++ b/cmd/env.go @@ -35,7 +35,7 @@ var ( err = env.Display(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil @@ -68,7 +68,7 @@ var ( variableValue, err := env.Get(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } fmt.Println(variableValue) return nil @@ -106,7 +106,7 @@ var ( return nil } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -136,7 +136,7 @@ var ( cli.ShowCommandHelp(c, "env-unset") } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/error.go b/cmd/error.go index 7183239b4..36ca02f2a 100644 --- a/cmd/error.go +++ b/cmd/error.go @@ -1,6 +1,7 @@ package cmd import ( + "context" "fmt" "net/http" @@ -59,21 +60,21 @@ func (r *ReportError) Report() { } func errorQuitWithHelpMessage(err error, ctxCli *cli.Context, command string) { - displayError(err) + displayError(ctxCli.Context, err) fmt.Print("\n") _ = cli.ShowCommandHelp(ctxCli, command) os.Exit(1) } -func errorQuit(err error) { - displayError(err) +func errorQuit(ctx context.Context, err error) { + displayError(ctx, err) os.Exit(1) } -func displayError(err error) { - currentUser, autherr := config.C.CurrentUser() +func displayError(ctx context.Context, err error) { + currentUser, autherr := config.C.CurrentUser(ctx) if autherr != nil { debug.Println("Fail to get current user") debug.Println(errgo.Details(err)) diff --git a/cmd/git.go b/cmd/git.go index d320ed095..70852e303 100644 --- a/cmd/git.go +++ b/cmd/git.go @@ -44,7 +44,7 @@ var ( ForcePutRemote: c.Bool("force"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -72,7 +72,7 @@ var ( err := git.Show(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/influxdb.go b/cmd/influxdb.go index 4c6166454..3c6782196 100644 --- a/cmd/influxdb.go +++ b/cmd/influxdb.go @@ -21,7 +21,7 @@ var ( }, Description: CommandDescription{ Description: `Run an interactive console with your InfluxDB addon - + The --size flag makes it easy to specify the size of the container executing the InfluxDB console. Each container size has different price and performance. You can read more about container sizes here: @@ -48,7 +48,7 @@ http://doc.scalingo.com/internals/container-sizes.html`, VariableName: c.String("e"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/integration_link.go b/cmd/integration_link.go index 71c2cc712..4c2d2b08d 100644 --- a/cmd/integration_link.go +++ b/cmd/integration_link.go @@ -46,7 +46,7 @@ var ( currentApp := detect.CurrentApp(c) err := integrationlink.Show(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -103,7 +103,7 @@ List of available integrations: integrationURL := c.Args().First() integrationURLParsed, err := url.Parse(integrationURL) if err != nil { - errorQuit(errgo.Notef(err, "error parsing the repository url")) + errorQuit(c.Context, errgo.Notef(err, "error parsing the repository url")) } // If the customer forgot to specify the scheme, we automatically prefix with https:// if integrationURLParsed.Scheme == "" { @@ -129,14 +129,14 @@ List of available integrations: } os.Exit(1) } - errorQuit(err) + errorQuit(c.Context, err) } var params scalingo.SCMRepoLinkCreateParams if c.NumFlags() == 0 { params, err = interactiveCreate() if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } else { branch := c.String("branch") @@ -182,7 +182,7 @@ List of available integrations: if deployReviewApps && allowReviewAppsFromForks && !awareOfSecurityRisks { allowReviewAppsFromForks, err = askForConfirmationToAllowReviewAppsFromForks("Allow automatic creation of review apps from forks?") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } } @@ -216,10 +216,10 @@ List of available integrations: io.Error("") io.Errorf("The complete error message from the SCM API is: %s\n", scerr.APIError) } else { - errorQuit(err) + errorQuit(c.Context, err) } } else { - errorQuit(err) + errorQuit(c.Context, err) } } return nil @@ -307,7 +307,7 @@ List of available integrations: if allowReviewAppsFromForks && !awareOfSecurityRisks { stillAllowed, err := askForConfirmationToAllowReviewAppsFromForks("Allow automatic creation of review apps from forks?") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } params.AutomaticCreationFromForksAllowed = &stillAllowed @@ -315,7 +315,7 @@ List of available integrations: err := integrationlink.Update(c.Context, currentApp, *params) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -346,7 +346,7 @@ List of available integrations: err := integrationlink.Delete(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -380,7 +380,7 @@ List of available integrations: follow := c.Bool("follow") err := integrationlink.ManualDeploy(c.Context, currentApp, branchName, follow) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -418,12 +418,12 @@ List of available integrations: pullRequestID, err := strconv.Atoi(c.Args().First()) if err != nil { - errorQuit(errgo.Notef(err, "invalid pull / merge request id")) + errorQuit(c.Context, errgo.Notef(err, "invalid pull / merge request id")) } pullRequest, err := integrationlink.PullRequest(c.Context, currentApp, pullRequestID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } if pullRequest.OpenedFromAForkedRepo { @@ -432,7 +432,7 @@ List of available integrations: io.Info("\nYou are about to deploy a Review App from a Pull Request opened from a fork.") allowReviewAppsFromForks, err := askForConfirmationToAllowReviewAppsFromForks("Deploy this Pull Request coming from a forked repository?") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } if !allowReviewAppsFromForks { @@ -444,7 +444,7 @@ List of available integrations: err = integrationlink.ManualReviewApp(c.Context, currentApp, pullRequestID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/keys.go b/cmd/keys.go index acd856e0c..5b99c12ca 100644 --- a/cmd/keys.go +++ b/cmd/keys.go @@ -20,7 +20,7 @@ var ( Action: func(c *cli.Context) error { err := keys.List(c.Context) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -47,7 +47,7 @@ var ( } err := keys.Add(c.Context, c.Args().First(), c.Args().Slice()[1]) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -74,7 +74,7 @@ var ( } err := keys.Remove(c.Context, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/log_drains.go b/cmd/log_drains.go index b4a36a74c..9a9aecb3f 100644 --- a/cmd/log_drains.go +++ b/cmd/log_drains.go @@ -50,7 +50,7 @@ Use the parameter "--with-addons" to list log drains of all addons connected to AddonID: addonID, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -131,7 +131,7 @@ Warning: At the moment, only databases addons are able to forward logs to a drai }, }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -207,7 +207,7 @@ Warning: At the moment, only databases addons are able to forward logs to a drai }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/login.go b/cmd/login.go index 223eaaa29..67cfe1bbf 100644 --- a/cmd/login.go +++ b/cmd/login.go @@ -23,7 +23,7 @@ var ( Description: "Login to Scalingo platform", Action: func(c *cli.Context) error { if c.Bool("ssh") && c.Bool("password-only") { - errorQuit(errors.New("you cannot use both --ssh and --password-only at the same time")) + errorQuit(c.Context, errors.New("you cannot use both --ssh and --password-only at the same time")) } err := session.Login(c.Context, session.LoginOpts{ @@ -33,7 +33,7 @@ var ( SSHIdentity: c.String("ssh-identity"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/logout.go b/cmd/logout.go index 3f5d14155..5e304b449 100644 --- a/cmd/logout.go +++ b/cmd/logout.go @@ -16,15 +16,17 @@ var ( Usage: "Logout from Scalingo", Description: "Remove login information stored on your computer", Action: func(c *cli.Context) error { - currentUser, err := config.C.CurrentUser() + ctx := c.Context + currentUser, err := config.C.CurrentUser(ctx) if err != nil { - errorQuit(err) + errorQuit(ctx, err) } if currentUser == nil { io.Status("You are already logged out.") return nil } - if err := session.DestroyToken(); err != nil { + err = session.DestroyToken(ctx) + if err != nil { panic(err) } io.Status("Scalingo credentials have been deleted.") diff --git a/cmd/logs.go b/cmd/logs.go index 46258ffd7..0febd390d 100644 --- a/cmd/logs.go +++ b/cmd/logs.go @@ -57,7 +57,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/logs_archives.go b/cmd/logs_archives.go index 69670d566..ba0cd6043 100644 --- a/cmd/logs_archives.go +++ b/cmd/logs_archives.go @@ -48,7 +48,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/maintenance.go b/cmd/maintenance.go index b9e1a4a39..fd61db1a8 100644 --- a/cmd/maintenance.go +++ b/cmd/maintenance.go @@ -37,7 +37,7 @@ var databaseMaintenanceList = cli.Command{ PerPage: c.Int("per-page"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -63,7 +63,7 @@ var databaseMaintenanceInfo = cli.Command{ if c.Args().Len() != 1 { err := cli.ShowCommandHelp(c, "database-maintenance-info") if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } @@ -74,7 +74,7 @@ var databaseMaintenanceInfo = cli.Command{ err := maintenance.Info(c.Context, currentApp, addonName, maintenanceID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/mongo.go b/cmd/mongo.go index 4ec571901..31a288472 100644 --- a/cmd/mongo.go +++ b/cmd/mongo.go @@ -47,7 +47,7 @@ http://doc.scalingo.com/internals/container-sizes.html`, VariableName: c.String("e"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/mysql.go b/cmd/mysql.go index a5e42760f..ee7fad981 100644 --- a/cmd/mysql.go +++ b/cmd/mysql.go @@ -20,7 +20,7 @@ var ( }, Description: CommandDescription{ Description: `Run an interactive console with your MySQL addon - + The --size flag makes it easy to specify the size of the container executing the MySQL console. Each container size has different price and performance. You can read more about container sizes here: @@ -47,7 +47,7 @@ http://doc.scalingo.com/internals/container-sizes.html`, VariableName: c.String("e"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/notification_platforms.go b/cmd/notification_platforms.go index 0d2b66ad6..e000340be 100644 --- a/cmd/notification_platforms.go +++ b/cmd/notification_platforms.go @@ -17,7 +17,7 @@ var ( Action: func(c *cli.Context) error { err := notificationplatforms.List(c.Context) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/notifiers.go b/cmd/notifiers.go index 1e46d21ed..929831d65 100644 --- a/cmd/notifiers.go +++ b/cmd/notifiers.go @@ -31,7 +31,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -61,7 +61,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -130,7 +130,7 @@ var ( err := notifiers.Provision(c.Context, currentApp, c.String("platform"), params) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -208,7 +208,7 @@ var ( cli.ShowCommandHelp(c, "notifiers-update") } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -239,7 +239,7 @@ var ( cli.ShowCommandHelp(c, "notifiers-remove") } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/one_off_stop.go b/cmd/one_off_stop.go index 3bfe3382b..18d233c32 100644 --- a/cmd/one_off_stop.go +++ b/cmd/one_off_stop.go @@ -38,7 +38,7 @@ var ( labelHasOnlyDigit, err := regexp.MatchString("^[0-9]+$", oneOffLabel) if err != nil { // This should never occur as we are pretty sure the provided regexp is valid. - errorQuit(err) + errorQuit(c.Context, err) } if labelHasOnlyDigit { oneOffLabel = "one-off-" + oneOffLabel @@ -48,7 +48,7 @@ var ( err = apps.OneOffStop(c.Context, currentApp, oneOffLabel) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/open.go b/cmd/open.go index 29ef1d737..154dbf97b 100644 --- a/cmd/open.go +++ b/cmd/open.go @@ -30,7 +30,7 @@ var ( err := apps.Open(currentApp, currentRegion) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/pgsql.go b/cmd/pgsql.go index 0a7c60ab5..55407db94 100644 --- a/cmd/pgsql.go +++ b/cmd/pgsql.go @@ -21,7 +21,7 @@ var ( }, Description: CommandDescription{ Description: `Run an interactive console with your PostgreSQL addon - + The --size flag makes it easy to specify the size of the container executing the PostgreSQL console. Each container size has different price and performance. You can read more about container sizes here: @@ -49,7 +49,7 @@ http://doc.scalingo.com/internals/container-sizes.html`, VariableName: c.String("e"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/ps.go b/cmd/ps.go index a64593778..7b224d3da 100644 --- a/cmd/ps.go +++ b/cmd/ps.go @@ -28,7 +28,7 @@ var ( err := apps.Ps(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/redis.go b/cmd/redis.go index b4524fac0..f7292e777 100644 --- a/cmd/redis.go +++ b/cmd/redis.go @@ -20,7 +20,7 @@ var ( }, Description: CommandDescription{ Description: `Run an interactive console with your Redis addon. - + The --size flag makes it easy to specify the size of the container executing the Redis console. Each container size has different price and performance. You can read more about container sizes here: @@ -48,7 +48,7 @@ http://doc.scalingo.com/internals/container-sizes.html`, VariableName: c.String("e"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/region_migrations.go b/cmd/region_migrations.go index 5788b11fc..a885c0014 100644 --- a/cmd/region_migrations.go +++ b/cmd/region_migrations.go @@ -40,7 +40,7 @@ var ( err := regionmigrations.Create(c.Context, currentApp, c.String("to"), c.String("new-name")) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -91,7 +91,7 @@ var ( err := regionmigrations.Run(c.Context, currentApp, migrationID, step) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -118,7 +118,7 @@ var ( err := regionmigrations.Abort(c.Context, currentApp, migrationID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -138,7 +138,7 @@ var ( err := regionmigrations.List(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -166,7 +166,7 @@ var ( err := regionmigrations.Follow(c.Context, currentApp, migrationID) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/regions.go b/cmd/regions.go index 006357c2b..d4df810ac 100644 --- a/cmd/regions.go +++ b/cmd/regions.go @@ -16,7 +16,7 @@ var ( Action: func(c *cli.Context) error { err := regions.List(c.Context) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/rename.go b/cmd/rename.go index 7c70d05dd..74ca27d31 100644 --- a/cmd/rename.go +++ b/cmd/rename.go @@ -30,7 +30,7 @@ var ( err := apps.Rename(c.Context, currentApp, newName) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/restart.go b/cmd/restart.go index 4bef9c87d..5e27f2baf 100644 --- a/cmd/restart.go +++ b/cmd/restart.go @@ -31,7 +31,7 @@ var ( utils.CheckForConsent(c.Context, currentApp, utils.ConsentTypeContainers) if err := apps.Restart(c.Context, currentApp, c.Bool("s"), c.Args().Slice()); err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/review_apps.go b/cmd/review_apps.go index c87f67032..c7498c455 100644 --- a/cmd/review_apps.go +++ b/cmd/review_apps.go @@ -28,7 +28,7 @@ var ( currentApp := detect.CurrentApp(c) err := reviewapps.Show(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/routing_settings.go b/cmd/routing_settings.go index 45eb8c907..134c8615f 100644 --- a/cmd/routing_settings.go +++ b/cmd/routing_settings.go @@ -39,7 +39,7 @@ var ( err := apps.ForceHTTPS(c.Context, currentApp, enable) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -78,7 +78,7 @@ var ( err := apps.StickySession(c.Context, currentApp, enable) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -117,7 +117,7 @@ var ( err := apps.RouterLogs(c.Context, currentApp, enable) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/run.go b/cmd/run.go index 43fa5a370..225cec238 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -103,7 +103,7 @@ var ( err := apps.Run(c.Context, opts) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/scale.go b/cmd/scale.go index e594df439..044e80d73 100644 --- a/cmd/scale.go +++ b/cmd/scale.go @@ -35,14 +35,14 @@ var ( if c.Args().Len() == 0 { err := apps.ContainerTypes(c.Context, currentApp) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil } err := apps.Scale(c.Context, currentApp, c.Bool("s"), c.Args().Slice()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/scm_integrations.go b/cmd/scm_integrations.go index 498cffe51..af075d141 100644 --- a/cmd/scm_integrations.go +++ b/cmd/scm_integrations.go @@ -25,7 +25,7 @@ var ( Action: func(c *cli.Context) error { err := scmintegrations.List(c.Context) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -73,15 +73,15 @@ var ( break case scalingo.SCMGithubEnterpriseType, scalingo.SCMGitlabSelfHostedType: if integrationURL == "" || token == "" { - errorQuit(errors.New("both --url and --token must be set")) + errorQuit(c.Context, errors.New("both --url and --token must be set")) } u, err := url.Parse(integrationURL) if err != nil || u.Scheme == "" || u.Host == "" { - errorQuit(fmt.Errorf("'%s' is not a valid URL", integrationURL)) + errorQuit(c.Context, fmt.Errorf("'%s' is not a valid URL", integrationURL)) } default: - errorQuit(errors.New( + errorQuit(c.Context, errors.New( "unknown integration. Available integrations: github, github-enterprise, gitlab, gitlab-self-hosted", )) } @@ -94,7 +94,7 @@ var ( err := scmintegrations.Create(c.Context, args) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -125,7 +125,7 @@ var ( err := scmintegrations.Delete(c.Context, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -156,7 +156,7 @@ var ( err := scmintegrations.ImportKeys(c.Context, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/self.go b/cmd/self.go index 8c592efeb..b205730f4 100644 --- a/cmd/self.go +++ b/cmd/self.go @@ -16,7 +16,7 @@ var ( Action: func(c *cli.Context) error { err := user.Self(c.Context) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/sendsignal.go b/cmd/sendsignal.go index 76cf157a2..732e598c9 100644 --- a/cmd/sendsignal.go +++ b/cmd/sendsignal.go @@ -43,7 +43,7 @@ var ( err := apps.SendSignal(c.Context, currentApp, c.String("signal"), c.Args().Slice()) if err != nil { rootError := errors.RootCause(err) - errorQuit(rootError) + errorQuit(c.Context, rootError) } return nil }, diff --git a/cmd/stacks.go b/cmd/stacks.go index 8ea0b4b0a..39bbcc8fc 100644 --- a/cmd/stacks.go +++ b/cmd/stacks.go @@ -25,7 +25,7 @@ var ( Action: func(c *cli.Context) error { err := stacks.List(c.Context, c.Bool("with-deprecated")) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, @@ -53,7 +53,7 @@ var ( err := stacks.Set(c.Context, currentApp, c.Args().First()) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/stats.go b/cmd/stats.go index 3bfee8aad..be17735b5 100644 --- a/cmd/stats.go +++ b/cmd/stats.go @@ -30,7 +30,7 @@ var ( err := apps.Stats(c.Context, currentApp, c.Bool("stream")) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/timeline.go b/cmd/timeline.go index 455834209..9e96b0bc0 100644 --- a/cmd/timeline.go +++ b/cmd/timeline.go @@ -38,7 +38,7 @@ var ( PerPage: c.Int("per-page"), }) if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil diff --git a/cmd/update.go b/cmd/update.go index 09670f015..1c2b3a30d 100644 --- a/cmd/update.go +++ b/cmd/update.go @@ -16,7 +16,7 @@ var ( Action: func(c *cli.Context) error { err := update.Check() if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/cmd/user-timeline.go b/cmd/user-timeline.go index 84f27e453..78d4dfd20 100644 --- a/cmd/user-timeline.go +++ b/cmd/user-timeline.go @@ -34,7 +34,7 @@ var ( } if err != nil { - errorQuit(err) + errorQuit(c.Context, err) } return nil }, diff --git a/config/auth.go b/config/auth.go index 492b492ee..aba1ab82a 100644 --- a/config/auth.go +++ b/config/auth.go @@ -11,7 +11,6 @@ import ( "time" "github.com/pkg/errors" - errgo "gopkg.in/errgo.v1" "github.com/Scalingo/cli/config/auth" appio "github.com/Scalingo/cli/io" @@ -28,7 +27,7 @@ var ( type CliAuthenticator struct{} var ( - ErrUnauthenticated = errgo.New("user unauthenticated") + ErrUnauthenticated = errors.New("user unauthenticated") ) func Auth(ctx context.Context) (*scalingo.User, string, error) { @@ -44,7 +43,7 @@ func Auth(ctx context.Context) (*scalingo.User, string, error) { if err == nil { break } else if scalingoerrors.RootCause(err) == io.EOF { - return nil, "", errors.New("canceled by user") + return nil, "", scalingoerrors.New(ctx, "canceled by user") } else { appio.Errorf("Fail to login (%d/3): %v\n\n", i+1, err) } @@ -54,30 +53,30 @@ func Auth(ctx context.Context) (*scalingo.User, string, error) { return nil, "", errors.New("Forgot your password? https://auth.scalingo.com") } if err != nil { - return nil, "", errgo.Mask(err, errgo.Any) + return nil, "", scalingoerrors.Notef(ctx, err, "") } fmt.Print("\n") appio.Statusf("Hello %s, nice to see you!\n\n", user.Username) - err = SetCurrentUser(user, tokens) + err = SetCurrentUser(ctx, user, tokens) if err != nil { - return nil, "", errgo.Mask(err, errgo.Any) + return nil, "", scalingoerrors.Notef(ctx, err, "set current user") } return user, tokens, nil } -func SetCurrentUser(user *scalingo.User, token string) error { +func SetCurrentUser(ctx context.Context, user *scalingo.User, token string) error { authenticator := &CliAuthenticator{} - err := authenticator.StoreAuth(user, token) + err := authenticator.StoreAuth(ctx, user, token) if err != nil { - return errgo.Notef(err, "fail to store user credentials") + return scalingoerrors.Notef(ctx, err, "store credentials") } return nil } -func (a *CliAuthenticator) StoreAuth(user *scalingo.User, token string) error { - authConfig, err := existingAuth() +func (a *CliAuthenticator) StoreAuth(ctx context.Context, user *scalingo.User, token string) error { + authConfig, err := existingAuth(ctx) if err != nil { return err } @@ -89,9 +88,9 @@ func (a *CliAuthenticator) StoreAuth(user *scalingo.User, token string) error { c = make(auth.ConfigPerHostV2) } - authHost, err := a.authHost() + authHost, err := a.authHost(ctx) if err != nil { - return errgo.Notef(err, "fail to get authentication service host") + return scalingoerrors.Notef(ctx, err, "fail to get authentication service host") } c[authHost] = auth.CredentialsData{ @@ -106,33 +105,33 @@ func (a *CliAuthenticator) StoreAuth(user *scalingo.User, token string) error { buffer, err := json.Marshal(&c) if err != nil { - return errgo.Notef(err, "fail to marshal the configuration to JSON") + return scalingoerrors.Notef(ctx, err, "fail to marshal the configuration to JSON") } authConfig.AuthConfigPerHost = json.RawMessage(buffer) - return writeAuthFile(authConfig) + return writeAuthFile(ctx, authConfig) } -func (a *CliAuthenticator) LoadAuth() (*scalingo.User, *auth.UserToken, error) { +func (a *CliAuthenticator) LoadAuth(ctx context.Context) (*scalingo.User, *auth.UserToken, error) { file, err := os.OpenFile(C.AuthFile, os.O_RDONLY, 0600) if os.IsNotExist(err) { return nil, nil, ErrUnauthenticated } if err != nil { - return nil, nil, errgo.Mask(err, errgo.Any) + return nil, nil, scalingoerrors.Notef(ctx, err, "open authentication file for read") } var authConfig auth.ConfigData if err := json.NewDecoder(file).Decode(&authConfig); err != nil { file.Close() - return nil, nil, errgo.Mask(err, errgo.Any) + return nil, nil, scalingoerrors.Notef(ctx, err, "decode authentication file") } file.Close() if authConfig.AuthDataVersion != auth.ConfigVersionV2 && authConfig.AuthDataVersion != auth.ConfigVersionV21 { - err = writeAuthFile(&authConfig) + err = writeAuthFile(ctx, &authConfig) if err != nil { - return nil, nil, errgo.NoteMask(err, "fail to update to authv2", errgo.Any) + return nil, nil, scalingoerrors.Notef(ctx, err, "fail to update to authv2") } return nil, nil, ErrUnauthenticated } @@ -140,7 +139,7 @@ func (a *CliAuthenticator) LoadAuth() (*scalingo.User, *auth.UserToken, error) { var configPerHost auth.ConfigPerHostV2 err = json.Unmarshal(authConfig.AuthConfigPerHost, &configPerHost) if err != nil { - return nil, nil, errgo.Mask(err) + return nil, nil, scalingoerrors.Notef(ctx, err, "unmarshal authentication config per host") } if authConfig.AuthDataVersion == auth.ConfigVersionV2 { @@ -149,18 +148,18 @@ func (a *CliAuthenticator) LoadAuth() (*scalingo.User, *auth.UserToken, error) { delete(configPerHost, "api.scalingo.com") buffer, err := json.Marshal(&configPerHost) if err != nil { - return nil, nil, errgo.Notef(err, "Fail to migrate auth config v2.0 to v2.1") + return nil, nil, scalingoerrors.Notef(ctx, err, "migrate auth config v2.0 to v2.1") } authConfig.AuthConfigPerHost = json.RawMessage(buffer) - err = writeAuthFile(&authConfig) + err = writeAuthFile(ctx, &authConfig) if err != nil { - return nil, nil, errgo.Notef(err, "Fail to migrate auth config v2.0 to v2.1") + return nil, nil, scalingoerrors.Notef(ctx, err, "migrate auth config v2.0 to v2.1") } } - authHost, err := a.authHost() + authHost, err := a.authHost(ctx) if err != nil { - return nil, nil, errgo.Notef(err, "fail to get authentication service host") + return nil, nil, scalingoerrors.Notef(ctx, err, "fail to get authentication service host") } creds, ok := configPerHost[authHost] @@ -170,38 +169,38 @@ func (a *CliAuthenticator) LoadAuth() (*scalingo.User, *auth.UserToken, error) { return creds.User, creds.Tokens, nil } -func (a *CliAuthenticator) RemoveAuth() error { - authConfig, err := existingAuth() +func (a *CliAuthenticator) RemoveAuth(ctx context.Context) error { + authConfig, err := existingAuth(ctx) if err != nil { - return errgo.Mask(err) + return scalingoerrors.Notef(ctx, err, "get authentication config for removal") } var c auth.ConfigPerHostV2 err = json.Unmarshal(authConfig.AuthConfigPerHost, &c) if err != nil { - return errgo.Mask(err) + return scalingoerrors.Notef(ctx, err, "unmarshal authentication config per host") } - authHost, err := a.authHost() + authHost, err := a.authHost(ctx) if err != nil { - return errgo.Notef(err, "fail to get authentication service host") + return scalingoerrors.Notef(ctx, err, "get authentication service host") } delete(c, authHost) buffer, err := json.Marshal(&c) if err != nil { - return errgo.Mask(err) + return scalingoerrors.Notef(ctx, err, "marshal cleaned authentication config") } authConfig.AuthConfigPerHost = json.RawMessage(buffer) - return writeAuthFile(authConfig) + return writeAuthFile(ctx, authConfig) } -func (a *CliAuthenticator) authHost() (string, error) { +func (a *CliAuthenticator) authHost(ctx context.Context) (string, error) { u, err := url.Parse(C.ScalingoAuthURL) if err != nil { - return "", errgo.Notef(err, "fail to parse auth URL: %v", C.ScalingoAuthURL) + return "", scalingoerrors.Notef(ctx, err, "parse auth URL: %v", C.ScalingoAuthURL) } return strings.Split(u.Host, ":")[0], nil } @@ -217,14 +216,14 @@ func tryAuth(ctx context.Context) (*scalingo.User, string, error) { if strings.Contains(err.Error(), "unexpected newline") { continue } - return nil, "", errgo.Mask(err, errgo.Any) + return nil, "", scalingoerrors.Notef(ctx, err, "read username") } login = strings.TrimRight(login, "\n") } password, err := term.Password(" Password: ") if err != nil { - return nil, "", errgo.Mask(err, errgo.Any) + return nil, "", scalingoerrors.Notef(ctx, err, "read password") } fmt.Printf("\n") @@ -233,7 +232,7 @@ func tryAuth(ctx context.Context) (*scalingo.User, string, error) { c, err := ScalingoUnauthenticatedAuthClient(ctx) if err != nil { - return nil, "", errgo.Notef(err, "fail to create an unauthenticated Scalingo client") + return nil, "", scalingoerrors.Notef(ctx, err, "fail to create an unauthenticated Scalingo client") } loginParams := scalingo.LoginParams{} @@ -251,7 +250,7 @@ func tryAuth(ctx context.Context) (*scalingo.User, string, error) { hostname, err := os.Hostname() if err != nil { - return nil, "", errgo.Notef(err, "fail to get current hostname") + return nil, "", scalingoerrors.Notef(ctx, err, "fail to get current hostname") } apiToken, err = c.TokenCreateWithLogin(ctx, scalingo.TokenCreateParams{ @@ -261,7 +260,7 @@ func tryAuth(ctx context.Context) (*scalingo.User, string, error) { if !otpRequired && scalingohttp.IsOTPRequired(err) { otpRequired = true } else { - return nil, "", errgo.Notef(err, "fail to create API token") + return nil, "", scalingoerrors.Notef(ctx, err, "fail to create API token") } } else { retryAuth = false @@ -270,31 +269,31 @@ func tryAuth(ctx context.Context) (*scalingo.User, string, error) { client, err := ScalingoAuthClientFromToken(ctx, apiToken.Token) if err != nil { - return nil, "", errgo.Notef(err, "fail to create an authenticated Scalingo client using the API token") + return nil, "", scalingoerrors.Notef(ctx, err, "fail to create an authenticated Scalingo client using the API token") } userInformation, err := client.Self(ctx) if err != nil { - return nil, "", errgo.Notef(err, "fail to get account data") + return nil, "", scalingoerrors.Notef(ctx, err, "fail to get account data") } return userInformation, apiToken.Token, nil } -func writeAuthFile(authConfig *auth.ConfigData) error { +func writeAuthFile(ctx context.Context, authConfig *auth.ConfigData) error { file, err := os.OpenFile(C.AuthFile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0700) if err != nil { - return errgo.Mask(err, errgo.Any) + return scalingoerrors.Notef(ctx, err, "open authentication file for writing") } defer file.Close() enc := json.NewEncoder(file) if err := enc.Encode(authConfig); err != nil { - return errgo.Mask(err, errgo.Any) + return scalingoerrors.Notef(ctx, err, "encode authentication file") } return nil } -func existingAuth() (*auth.ConfigData, error) { +func existingAuth(ctx context.Context) (*auth.ConfigData, error) { authConfig := auth.NewConfigData() content, err := os.ReadFile(C.AuthFile) if err == nil { @@ -304,11 +303,11 @@ func existingAuth() (*auth.ConfigData, error) { config := make(auth.ConfigPerHostV2) buffer, err := json.Marshal(&config) if err != nil { - return nil, errgo.Mask(err) + return nil, scalingoerrors.Notef(ctx, err, "encode non-existing authentication file") } authConfig.AuthConfigPerHost = json.RawMessage(buffer) } else { - return nil, errgo.Mask(err) + return nil, scalingoerrors.Notef(ctx, err, "read existing authentication file") } return authConfig, nil } diff --git a/config/auth_test.go b/config/auth_test.go index 878be1cf4..131e7a65b 100644 --- a/config/auth_test.go +++ b/config/auth_test.go @@ -1,6 +1,7 @@ package config import ( + "context" "encoding/json" "testing" @@ -12,6 +13,7 @@ import ( ) func TestStoreAuth(t *testing.T) { + ctx := context.Background() u := &scalingo.User{ Email: "test@example.com", Username: "test", @@ -19,27 +21,28 @@ func TestStoreAuth(t *testing.T) { authenticator := &CliAuthenticator{} // First creation - err := authenticator.StoreAuth(u, "0123456789") + err := authenticator.StoreAuth(ctx, u, "0123456789") require.NoError(t, err) clean() // Rewrite over an existing file - err = authenticator.StoreAuth(u, "0123456789") + err = authenticator.StoreAuth(ctx, u, "0123456789") require.NoError(t, err) - err = authenticator.StoreAuth(u, "0123456789") + err = authenticator.StoreAuth(ctx, u, "0123456789") require.NoError(t, err) clean() // Add an additional auth url - err = authenticator.StoreAuth(u, "0123456789") + err = authenticator.StoreAuth(ctx, u, "0123456789") require.NoError(t, err) C.ScalingoAuthURL = "api.scalingo2.dev" - err = authenticator.StoreAuth(u, "0123456789") + err = authenticator.StoreAuth(ctx, u, "0123456789") require.NoError(t, err) clean() } func TestExistingAuth(t *testing.T) { + ctx := context.Background() u := &scalingo.User{ Email: "test@example.com", Username: "test", @@ -47,7 +50,7 @@ func TestExistingAuth(t *testing.T) { authenticator := &CliAuthenticator{} // Before any auth - currentAuth, err := existingAuth() + currentAuth, err := existingAuth(ctx) require.NoError(t, err) var configPerHost auth.ConfigPerHostV2 @@ -56,10 +59,10 @@ func TestExistingAuth(t *testing.T) { assert.True(t, currentAuth.LastUpdate.IsZero()) // After one auth - err = authenticator.StoreAuth(u, "0123456789") + err = authenticator.StoreAuth(ctx, u, "0123456789") require.NoError(t, err) - currentAuth, err = existingAuth() + currentAuth, err = existingAuth(ctx) json.Unmarshal(currentAuth.AuthConfigPerHost, &configPerHost) require.NoError(t, err) assert.Len(t, configPerHost, 1) diff --git a/config/config.go b/config/config.go index 016eccabc..74b45734d 100644 --- a/config/config.go +++ b/config/config.go @@ -140,9 +140,9 @@ func init() { } } -func (config Config) CurrentUser() (*scalingo.User, error) { +func (config Config) CurrentUser(ctx context.Context) (*scalingo.User, error) { authenticator := &CliAuthenticator{} - user, _, err := authenticator.LoadAuth() + user, _, err := authenticator.LoadAuth(ctx) return user, err } @@ -199,7 +199,7 @@ func ScalingoAuthClientFromToken(ctx context.Context, token string) (*scalingo.C func ScalingoAuthClient(ctx context.Context) (*scalingo.Client, error) { auth := &CliAuthenticator{} - _, token, err := auth.LoadAuth() + _, token, err := auth.LoadAuth(ctx) if err != nil { return nil, errgo.Notef(err, "fail to load authentication") } @@ -208,7 +208,7 @@ func ScalingoAuthClient(ctx context.Context) (*scalingo.Client, error) { func ScalingoClient(ctx context.Context) (*scalingo.Client, error) { authenticator := &CliAuthenticator{} - _, token, err := authenticator.LoadAuth() + _, token, err := authenticator.LoadAuth(ctx) if err != nil { return nil, errgo.Notef(err, "fail to load credentials") } @@ -221,7 +221,7 @@ func ScalingoClient(ctx context.Context) (*scalingo.Client, error) { func ScalingoClientForRegion(ctx context.Context, region string) (*scalingo.Client, error) { authenticator := &CliAuthenticator{} - _, token, err := authenticator.LoadAuth() + _, token, err := authenticator.LoadAuth(ctx) if err != nil { return nil, errgo.Notef(err, "fail to load credentials") } diff --git a/config/region.go b/config/region.go index 7b8ccfac8..9a0d3305c 100644 --- a/config/region.go +++ b/config/region.go @@ -71,7 +71,7 @@ func EnsureRegionsCache(ctx context.Context, c Config, opts GetRegionOpts) (Regi token := &auth.UserToken{Token: opts.Token} if token.Token == "" { auth := &CliAuthenticator{} - _, token, err = auth.LoadAuth() + _, token, err = auth.LoadAuth(ctx) if err != nil { return RegionsCache{}, errgo.Notef(err, "fail to load authentication") } diff --git a/session/destroy.go b/session/destroy.go index 349066351..ab87f058c 100644 --- a/session/destroy.go +++ b/session/destroy.go @@ -1,14 +1,17 @@ package session import ( + "context" + "gopkg.in/errgo.v1" "github.com/Scalingo/cli/config" ) -func DestroyToken() error { +func DestroyToken(ctx context.Context) error { authenticator := &config.CliAuthenticator{} - if err := authenticator.RemoveAuth(); err != nil { + err := authenticator.RemoveAuth(ctx) + if err != nil { return errgo.Mask(err) } return nil diff --git a/session/login.go b/session/login.go index 8139de44a..68da659f0 100644 --- a/session/login.go +++ b/session/login.go @@ -155,7 +155,7 @@ func finalizeLogin(ctx context.Context, token string) error { io.Statusf("Hello %s, nice to see you!\n", user.Username) - err = config.SetCurrentUser(user, token) + err = config.SetCurrentUser(ctx, user, token) if err != nil { return errgo.Mask(err) } diff --git a/utils/consent.go b/utils/consent.go index b51b15b08..0d0a706de 100644 --- a/utils/consent.go +++ b/utils/consent.go @@ -37,7 +37,7 @@ func CheckForConsent(ctx context.Context, appName string, consentTypes ...Consen } } - currentUser, err := config.C.CurrentUser() + currentUser, err := config.C.CurrentUser(ctx) if err != nil { return }