fix(cli): completion requires HCLOUD_TOKEN (#19)

The current setup of the CLI requires the user to set HCLOUD_TOKEN for
every single invocation of the binary. Even if we just want to
autocomplete some arguments or even generate the completion scripts in
CI.

This fixes the bug by only initializing the hcloud-go client in the
"cleanup" and "upload" subcommands.
This commit is contained in:
Julian Tölle 2024-05-10 18:06:38 +02:00 committed by GitHub
parent f7dc501b2f
commit bb2ca48200
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 17 additions and 6 deletions

View file

@ -23,7 +23,11 @@ $ hcloud ssh-key list -l apricote.de/created-by=hcloud-upload-image
This command does not handle any parallel executions of hcloud-upload-image This command does not handle any parallel executions of hcloud-upload-image
and will remove in-use resources if called at the same time.`, and will remove in-use resources if called at the same time.`,
GroupID: "primary", GroupID: "primary",
PreRun: initClient,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context() ctx := cmd.Context()
logger := contextlogger.From(ctx) logger := contextlogger.From(ctx)

View file

@ -1,7 +1,6 @@
package cmd package cmd
import ( import (
"context"
"log/slog" "log/slog"
"os" "os"
"time" "time"
@ -46,8 +45,6 @@ var rootCmd = &cobra.Command{
logger := slog.Default() logger := slog.Default()
ctx = contextlogger.New(ctx, logger) ctx = contextlogger.New(ctx, logger)
cmd.SetContext(ctx) cmd.SetContext(ctx)
client = newClient(ctx)
}, },
} }
@ -71,7 +68,15 @@ func initLogger() *slog.Logger {
} }
func newClient(ctx context.Context) *hcloudimages.Client { func initClient(cmd *cobra.Command, _ []string) {
if client != nil {
// Only init if not set.
// Theoretically this is not safe against data races and should use [sync.Once], but :shrug:
return
}
ctx := cmd.Context()
logger := contextlogger.From(ctx) logger := contextlogger.From(ctx)
// Build hcloud-go client // Build hcloud-go client
if os.Getenv("HCLOUD_TOKEN") == "" { if os.Getenv("HCLOUD_TOKEN") == "" {
@ -89,7 +94,7 @@ func newClient(ctx context.Context) *hcloudimages.Client {
opts = append(opts, hcloud.WithDebugWriter(os.Stderr)) opts = append(opts, hcloud.WithDebugWriter(os.Stderr))
} }
return hcloudimages.NewClient(hcloud.NewClient(opts...)) client = hcloudimages.NewClient(hcloud.NewClient(opts...))
} }
func Execute() { func Execute() {

View file

@ -33,6 +33,8 @@ This does cost a bit of money for the server.`,
GroupID: "primary", GroupID: "primary",
PreRun: initClient,
RunE: func(cmd *cobra.Command, args []string) error { RunE: func(cmd *cobra.Command, args []string) error {
ctx := cmd.Context() ctx := cmd.Context()
logger := contextlogger.From(ctx) logger := contextlogger.From(ctx)

2
go.mod
View file

@ -3,7 +3,7 @@ module github.com/apricote/hcloud-upload-image
go 1.22.2 go 1.22.2
require ( require (
github.com/apricote/hcloud-upload-image/hcloudimages v0.0.0 github.com/apricote/hcloud-upload-image/hcloudimages v0.2.0
github.com/hetznercloud/hcloud-go/v2 v2.8.0 github.com/hetznercloud/hcloud-go/v2 v2.8.0
github.com/spf13/cobra v1.8.0 github.com/spf13/cobra v1.8.0
) )