diff --git a/pkg/cmd/grafana/apiserver/cmd.go b/pkg/cmd/grafana/apiserver/cmd.go index 5ae93266724..bfa7e532a46 100644 --- a/pkg/cmd/grafana/apiserver/cmd.go +++ b/pkg/cmd/grafana/apiserver/cmd.go @@ -62,7 +62,7 @@ func newCommandStartExampleAPIServer(o *APIServerOptions, stopCh <-chan struct{} } cmd.Flags().StringVar(&runtimeConfig, "runtime-config", "", "A set of key=value pairs that enable or disable built-in APIs.") - o.factory.InitFlags(cmd.Flags()) + o.factory.GetOptions().AddFlags(cmd.Flags()) // Register standard k8s flags with the command line o.RecommendedOptions = options.NewRecommendedOptions( diff --git a/pkg/cmd/grafana/apiserver/server.go b/pkg/cmd/grafana/apiserver/server.go index 07059d9c857..19a9236db60 100644 --- a/pkg/cmd/grafana/apiserver/server.go +++ b/pkg/cmd/grafana/apiserver/server.go @@ -110,6 +110,7 @@ func (o *APIServerOptions) ModifiedApplyTo(config *genericapiserver.RecommendedC if err != nil { return err } + return nil } @@ -160,6 +161,7 @@ func (o *APIServerOptions) Config() (*genericapiserver.RecommendedConfig, error) func (o *APIServerOptions) Validate(args []string) error { errors := []error{} errors = append(errors, o.RecommendedOptions.Validate()...) + errors = append(errors, o.factory.GetOptions().ValidateOptions()...) return utilerrors.NewAggregate(errors) } diff --git a/pkg/services/apiserver/options/options.go b/pkg/services/apiserver/options/options.go index 32a07be624f..42cb6557036 100644 --- a/pkg/services/apiserver/options/options.go +++ b/pkg/services/apiserver/options/options.go @@ -10,6 +10,11 @@ import ( genericoptions "k8s.io/apiserver/pkg/server/options" ) +type OptionsProvider interface { + AddFlags(fs *pflag.FlagSet) + ValidateOptions() []error +} + const defaultEtcdPathPrefix = "/registry/grafana.app" type Options struct { @@ -17,6 +22,7 @@ type Options struct { AggregatorOptions *AggregatorServerOptions StorageOptions *StorageOptions ExtraOptions *ExtraOptions + APIOptions []OptionsProvider } func NewOptions(codec runtime.Codec) *Options { @@ -36,6 +42,10 @@ func (o *Options) AddFlags(fs *pflag.FlagSet) { o.AggregatorOptions.AddFlags(fs) o.StorageOptions.AddFlags(fs) o.ExtraOptions.AddFlags(fs) + + for _, api := range o.APIOptions { + api.AddFlags(fs) + } } func (o *Options) Validate() []error { @@ -69,6 +79,11 @@ func (o *Options) Validate() []error { } } + for _, api := range o.APIOptions { + if errs := api.ValidateOptions(); len(errs) != 0 { + return errs + } + } return nil } @@ -100,7 +115,6 @@ func (o *Options) ApplyTo(serverConfig *genericapiserver.RecommendedConfig) erro } serverConfig.SecureServing = nil } - return nil } diff --git a/pkg/services/apiserver/standalone/factory.go b/pkg/services/apiserver/standalone/factory.go index eec8ddacb1a..b9a7f4455c7 100644 --- a/pkg/services/apiserver/standalone/factory.go +++ b/pkg/services/apiserver/standalone/factory.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/grafana/grafana-plugin-sdk-go/backend" - "github.com/spf13/pflag" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" @@ -19,6 +18,7 @@ import ( "github.com/grafana/grafana/pkg/services/accesscontrol/actest" "github.com/grafana/grafana/pkg/services/apiserver/builder" "github.com/grafana/grafana/pkg/services/apiserver/endpoints/request" + "github.com/grafana/grafana/pkg/services/apiserver/options" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/setting" testdatasource "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource" @@ -26,7 +26,7 @@ import ( type APIServerFactory interface { // Called before the groups are loaded so any custom command can be registered - InitFlags(flags *pflag.FlagSet) + GetOptions() options.OptionsProvider // Given the flags, what can we produce GetEnabled(runtime []RuntimeConfig) ([]schema.GroupVersion, error) @@ -42,7 +42,9 @@ func GetDummyAPIFactory() APIServerFactory { type DummyAPIFactory struct{} -func (p *DummyAPIFactory) InitFlags(flags *pflag.FlagSet) {} +func (p *DummyAPIFactory) GetOptions() options.OptionsProvider { + return nil +} func (p *DummyAPIFactory) GetEnabled(runtime []RuntimeConfig) ([]schema.GroupVersion, error) { gv := []schema.GroupVersion{}