From 02c7895449e4b1f9241fc603b755d26f563729a6 Mon Sep 17 00:00:00 2001 From: Mike Mason Date: Wed, 19 Jul 2023 17:48:22 +0000 Subject: [PATCH] fix metal provider flag and env loading, and return error if provider not defined --- cmd/serve.go | 1 + internal/metal/config.go | 9 +++++++++ internal/metal/errors.go | 3 +++ internal/metal/metal.go | 4 ++++ internal/metal/providers/emapi/config.go | 16 ++++++++++++++++ internal/metal/providers/emgql/config.go | 12 ++++++++++++ 6 files changed, 45 insertions(+) diff --git a/cmd/serve.go b/cmd/serve.go index 717e50e..fc9b058 100644 --- a/cmd/serve.go +++ b/cmd/serve.go @@ -37,6 +37,7 @@ func init() { oauth2x.MustViperFlags(viper.GetViper(), serveCmd.Flags()) permissions.MustViperFlags(viper.GetViper(), serveCmd.Flags()) + metal.MustViperFlags(viper.GetViper(), serveCmd.Flags()) } func serve(cmd *cobra.Command, _ []string) { diff --git a/internal/metal/config.go b/internal/metal/config.go index 9f1d89d..1464abc 100644 --- a/internal/metal/config.go +++ b/internal/metal/config.go @@ -1,6 +1,9 @@ package metal import ( + "github.com/spf13/pflag" + "github.com/spf13/viper" + "go.equinixmetal.net/infra9-metal-bridge/internal/metal/providers/emapi" "go.equinixmetal.net/infra9-metal-bridge/internal/metal/providers/emgql" ) @@ -13,3 +16,9 @@ type Config struct { // EMAPI sets the provider to Equinix Metal API. EMAPI emapi.Config } + +// MustViperFlags registers command flags along with the viper bindings. +func MustViperFlags(v *viper.Viper, flags *pflag.FlagSet) { + emgql.MustViperFlags(v, flags) + emapi.MustViperFlags(v, flags) +} diff --git a/internal/metal/errors.go b/internal/metal/errors.go index 106ca78..f368680 100644 --- a/internal/metal/errors.go +++ b/internal/metal/errors.go @@ -5,4 +5,7 @@ import "errors" var ( // ErrUnauthorized is returned when the token provided did not validate to a user. ErrUnauthorized = errors.New("unauthorized key") + + // ErrMetalProviderRequired is returned when no provider has been configured for the metal client. + ErrMetalProviderRequired = errors.New("metal provider required") ) diff --git a/internal/metal/metal.go b/internal/metal/metal.go index 779958f..81786ae 100644 --- a/internal/metal/metal.go +++ b/internal/metal/metal.go @@ -61,5 +61,9 @@ func New(options ...Option) (Client, error) { client.logger = zap.NewNop() } + if client.provider == nil { + return nil, ErrMetalProviderRequired + } + return client, nil } diff --git a/internal/metal/providers/emapi/config.go b/internal/metal/providers/emapi/config.go index 6627a41..cfffe30 100644 --- a/internal/metal/providers/emapi/config.go +++ b/internal/metal/providers/emapi/config.go @@ -3,6 +3,10 @@ package emapi import ( "fmt" "net/url" + + "github.com/spf13/pflag" + "github.com/spf13/viper" + "go.infratographer.com/x/viperx" ) // Config provides configuration for connecting to the Equinix Metal API provider. @@ -17,6 +21,18 @@ type Config struct { ConsumerToken string } +// MustViperFlags registers command flags along with the viper bindings. +func MustViperFlags(v *viper.Viper, flags *pflag.FlagSet) { + flags.String("emapi-base-url", "", "Equinix Metal Rest API Base URL") + viperx.MustBindFlag(v, "equinixmetal.emapi.baseurl", flags.Lookup("emapi-base-url")) + + flags.String("emapi-auth-token", "", "Equinix Metal Rest Auth Token") + viperx.MustBindFlag(v, "equinixmetal.emapi.authtoken", flags.Lookup("emapi-auth-token")) + + flags.String("emapi-consumer-token", "", "Equinix Metal Rest Consumer Token") + viperx.MustBindFlag(v, "equinixmetal.emapi.consumertoken", flags.Lookup("emapi-consumer-token")) +} + // Populated checks if any field has been populated. func (c Config) Populated() bool { return c.AuthToken != "" || c.ConsumerToken != "" || c.BaseURL != "" diff --git a/internal/metal/providers/emgql/config.go b/internal/metal/providers/emgql/config.go index 7a23789..de207dc 100644 --- a/internal/metal/providers/emgql/config.go +++ b/internal/metal/providers/emgql/config.go @@ -1,11 +1,23 @@ package emgql +import ( + "github.com/spf13/pflag" + "github.com/spf13/viper" + "go.infratographer.com/x/viperx" +) + // Config provides configuration for connecting to the Equinix Metal API provider. type Config struct { // BaseURL is the baseurl to use when connecting to the Equinix Metal API Provider. BaseURL string } +// MustViperFlags registers command flags along with the viper bindings. +func MustViperFlags(v *viper.Viper, flags *pflag.FlagSet) { + flags.String("emgql-base-url", "", "Equinix Metal GraphQL Base URL") + viperx.MustBindFlag(v, "equinixmetal.emgql.baseurl", flags.Lookup("emgql-base-url")) +} + // Populated checks if any field has been populated. func (c Config) Populated() bool { return c.BaseURL != ""