mirror of
https://github.com/grafana/grafana.git
synced 2025-07-30 06:22:21 +08:00
K8s: Move standalone apiserver CLI to enterprise (#93799)
This commit is contained in:
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
@ -80,7 +80,6 @@
|
|||||||
/pkg/apis/query @grafana/grafana-datasources-core-services
|
/pkg/apis/query @grafana/grafana-datasources-core-services
|
||||||
/pkg/bus/ @grafana/grafana-search-and-storage
|
/pkg/bus/ @grafana/grafana-search-and-storage
|
||||||
/pkg/cmd/ @grafana/grafana-backend-group
|
/pkg/cmd/ @grafana/grafana-backend-group
|
||||||
/pkg/cmd/grafana/apiserver @grafana/grafana-app-platform-squad
|
|
||||||
/pkg/components/apikeygen/ @grafana/identity-squad
|
/pkg/components/apikeygen/ @grafana/identity-squad
|
||||||
/pkg/components/satokengen/ @grafana/identity-squad
|
/pkg/components/satokengen/ @grafana/identity-squad
|
||||||
/pkg/components/dashdiffs/ @grafana/grafana-app-platform-squad
|
/pkg/components/dashdiffs/ @grafana/grafana-app-platform-squad
|
||||||
|
@ -5,10 +5,11 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/extensions"
|
"github.com/grafana/grafana/pkg/extensions"
|
||||||
|
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
func getBuildstamp(opts ServerOptions) int64 {
|
func getBuildstamp(opts standalone.BuildInfo) int64 {
|
||||||
buildstampInt64, err := strconv.ParseInt(opts.BuildStamp, 10, 64)
|
buildstampInt64, err := strconv.ParseInt(opts.BuildStamp, 10, 64)
|
||||||
if err != nil || buildstampInt64 == 0 {
|
if err != nil || buildstampInt64 == 0 {
|
||||||
buildstampInt64 = time.Now().Unix()
|
buildstampInt64 = time.Now().Unix()
|
||||||
@ -16,7 +17,7 @@ func getBuildstamp(opts ServerOptions) int64 {
|
|||||||
return buildstampInt64
|
return buildstampInt64
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetBuildInfo(opts ServerOptions) {
|
func SetBuildInfo(opts standalone.BuildInfo) {
|
||||||
setting.BuildVersion = opts.Version
|
setting.BuildVersion = opts.Version
|
||||||
setting.BuildCommit = opts.Commit
|
setting.BuildCommit = opts.Commit
|
||||||
setting.EnterpriseBuildCommit = opts.EnterpriseCommit
|
setting.EnterpriseBuildCommit = opts.EnterpriseCommit
|
||||||
|
@ -21,38 +21,29 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/infra/metrics"
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/infra/process"
|
"github.com/grafana/grafana/pkg/infra/process"
|
||||||
"github.com/grafana/grafana/pkg/server"
|
"github.com/grafana/grafana/pkg/server"
|
||||||
|
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ServerOptions struct {
|
|
||||||
Version string
|
|
||||||
Commit string
|
|
||||||
EnterpriseCommit string
|
|
||||||
BuildBranch string
|
|
||||||
BuildStamp string
|
|
||||||
Context *cli.Context
|
|
||||||
}
|
|
||||||
|
|
||||||
func ServerCommand(version, commit, enterpriseCommit, buildBranch, buildstamp string) *cli.Command {
|
func ServerCommand(version, commit, enterpriseCommit, buildBranch, buildstamp string) *cli.Command {
|
||||||
return &cli.Command{
|
return &cli.Command{
|
||||||
Name: "server",
|
Name: "server",
|
||||||
Usage: "run the grafana server",
|
Usage: "run the grafana server",
|
||||||
Flags: commonFlags,
|
Flags: commonFlags,
|
||||||
Action: func(context *cli.Context) error {
|
Action: func(context *cli.Context) error {
|
||||||
return RunServer(ServerOptions{
|
return RunServer(standalone.BuildInfo{
|
||||||
Version: version,
|
Version: version,
|
||||||
Commit: commit,
|
Commit: commit,
|
||||||
EnterpriseCommit: enterpriseCommit,
|
EnterpriseCommit: enterpriseCommit,
|
||||||
BuildBranch: buildBranch,
|
BuildBranch: buildBranch,
|
||||||
BuildStamp: buildstamp,
|
BuildStamp: buildstamp,
|
||||||
Context: context,
|
}, context)
|
||||||
})
|
|
||||||
},
|
},
|
||||||
Subcommands: []*cli.Command{TargetCommand(version, commit, buildBranch, buildstamp)},
|
Subcommands: []*cli.Command{TargetCommand(version, commit, buildBranch, buildstamp)},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunServer(opts ServerOptions) error {
|
func RunServer(opts standalone.BuildInfo, cli *cli.Context) error {
|
||||||
if Version || VerboseVersion {
|
if Version || VerboseVersion {
|
||||||
if opts.EnterpriseCommit != gcli.DefaultCommitValue && opts.EnterpriseCommit != "" {
|
if opts.EnterpriseCommit != gcli.DefaultCommitValue && opts.EnterpriseCommit != "" {
|
||||||
fmt.Printf("Version %s (commit: %s, branch: %s, enterprise-commit: %s)\n", opts.Version, opts.Commit, opts.BuildBranch, opts.EnterpriseCommit)
|
fmt.Printf("Version %s (commit: %s, branch: %s, enterprise-commit: %s)\n", opts.Version, opts.Commit, opts.BuildBranch, opts.EnterpriseCommit)
|
||||||
@ -106,7 +97,7 @@ func RunServer(opts ServerOptions) error {
|
|||||||
Config: ConfigFile,
|
Config: ConfigFile,
|
||||||
HomePath: HomePath,
|
HomePath: HomePath,
|
||||||
// tailing arguments have precedence over the options string
|
// tailing arguments have precedence over the options string
|
||||||
Args: append(configOptions, opts.Context.Args().Slice()...),
|
Args: append(configOptions, cli.Args().Slice()...),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/infra/log"
|
"github.com/grafana/grafana/pkg/infra/log"
|
||||||
"github.com/grafana/grafana/pkg/infra/metrics"
|
"github.com/grafana/grafana/pkg/infra/metrics"
|
||||||
"github.com/grafana/grafana/pkg/server"
|
"github.com/grafana/grafana/pkg/server"
|
||||||
|
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
"github.com/grafana/grafana/pkg/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -22,18 +23,17 @@ func TargetCommand(version, commit, buildBranch, buildstamp string) *cli.Command
|
|||||||
Usage: "target specific grafana dskit services",
|
Usage: "target specific grafana dskit services",
|
||||||
Flags: commonFlags,
|
Flags: commonFlags,
|
||||||
Action: func(context *cli.Context) error {
|
Action: func(context *cli.Context) error {
|
||||||
return RunTargetServer(ServerOptions{
|
return RunTargetServer(standalone.BuildInfo{
|
||||||
Version: version,
|
Version: version,
|
||||||
Commit: commit,
|
Commit: commit,
|
||||||
BuildBranch: buildBranch,
|
BuildBranch: buildBranch,
|
||||||
BuildStamp: buildstamp,
|
BuildStamp: buildstamp,
|
||||||
Context: context,
|
}, context)
|
||||||
})
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunTargetServer(opts ServerOptions) error {
|
func RunTargetServer(opts standalone.BuildInfo, cli *cli.Context) error {
|
||||||
if Version || VerboseVersion {
|
if Version || VerboseVersion {
|
||||||
fmt.Printf("Version %s (commit: %s, branch: %s)\n", opts.Version, opts.Commit, opts.BuildBranch)
|
fmt.Printf("Version %s (commit: %s, branch: %s)\n", opts.Version, opts.Commit, opts.BuildBranch)
|
||||||
if VerboseVersion {
|
if VerboseVersion {
|
||||||
@ -83,7 +83,7 @@ func RunTargetServer(opts ServerOptions) error {
|
|||||||
Config: ConfigFile,
|
Config: ConfigFile,
|
||||||
HomePath: HomePath,
|
HomePath: HomePath,
|
||||||
// tailing arguments have precedence over the options string
|
// tailing arguments have precedence over the options string
|
||||||
Args: append(configOptions, opts.Context.Args().Slice()...),
|
Args: append(configOptions, cli.Args().Slice()...),
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -1,60 +0,0 @@
|
|||||||
# grafana apiserver (standalone)
|
|
||||||
|
|
||||||
The example-apiserver closely resembles the
|
|
||||||
[sample-apiserver](https://github.com/kubernetes/sample-apiserver/tree/master) project in code and thus
|
|
||||||
allows the same
|
|
||||||
[CLI flags](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/) as kube-apiserver.
|
|
||||||
It is currently used for testing our deployment pipelines for aggregated servers. You can optionally omit the
|
|
||||||
aggregation path altogether and just run this example apiserver as a standalone process.
|
|
||||||
|
|
||||||
## Standalone Mode
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
For setting `--grafana.authn.signing-keys-url`, Grafana must be run with `idForwarding = true` while also ensuring
|
|
||||||
you have logged in to the instance at least once.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
go run ./pkg/cmd/grafana apiserver \
|
|
||||||
--runtime-config=example.grafana.app/v0alpha1=true \
|
|
||||||
--grafana-apiserver-dev-mode \
|
|
||||||
--grafana.authn.signing-keys-url="http://localhost:3000/api/signing-keys/keys" \
|
|
||||||
--verbosity 10 \
|
|
||||||
--secure-port 7443
|
|
||||||
```
|
|
||||||
|
|
||||||
### Verify that all works
|
|
||||||
|
|
||||||
In dev mode, the standalone server's loopback kubeconfig is written to `./data/grafana-apiserver/apiserver.kubeconfig`.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
export KUBECONFIG=./data/grafana-apiserver/apiserver.kubeconfig
|
|
||||||
|
|
||||||
kubectl api-resources
|
|
||||||
NAME SHORTNAMES APIVERSION NAMESPACED KIND
|
|
||||||
dummy example.grafana.app/v0alpha1 true DummyResource
|
|
||||||
runtime example.grafana.app/v0alpha1 false RuntimeInfo
|
|
||||||
```
|
|
||||||
|
|
||||||
### Observability
|
|
||||||
|
|
||||||
Logs, metrics and traces are supported. See `--grafana.log.*`, `--grafana.metrics.*` and `--grafana.tracing.*` flags for details.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
go run ./pkg/cmd/grafana apiserver \
|
|
||||||
--runtime-config=example.grafana.app/v0alpha1=true \
|
|
||||||
--help
|
|
||||||
```
|
|
||||||
|
|
||||||
For example, to enable debug logs, metrics and traces (using [self-instrumentation](../../../../devenv/docker/blocks/self-instrumentation/readme.md)) use the following:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
go run ./pkg/cmd/grafana apiserver \
|
|
||||||
--runtime-config=example.grafana.app/v0alpha1=true \
|
|
||||||
--secure-port=7443 \
|
|
||||||
--grafana.log.level=debug \
|
|
||||||
--verbosity=10 \
|
|
||||||
--grafana.metrics.enable \
|
|
||||||
--grafana.tracing.jaeger.address=http://localhost:14268/api/traces \
|
|
||||||
--grafana.tracing.sampler-param=1
|
|
||||||
```
|
|
@ -1,157 +0,0 @@
|
|||||||
package apiserver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"go.opentelemetry.io/otel"
|
|
||||||
"go.opentelemetry.io/otel/trace"
|
|
||||||
genericapiserver "k8s.io/apiserver/pkg/server"
|
|
||||||
"k8s.io/component-base/cli"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/cmd/grafana-server/commands"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
||||||
"github.com/grafana/grafana/pkg/server"
|
|
||||||
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
|
|
||||||
)
|
|
||||||
|
|
||||||
func newCommandStartStandaloneAPIServer(o *APIServerOptions, stopCh <-chan struct{}) *cobra.Command {
|
|
||||||
devAcknowledgementNotice := "The apiserver command is in heavy development. The entire setup is subject to change without notice"
|
|
||||||
runtimeConfig := ""
|
|
||||||
|
|
||||||
factory, err := server.InitializeAPIServerFactory()
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
o.factory = factory
|
|
||||||
|
|
||||||
cmd := &cobra.Command{
|
|
||||||
Use: "apiserver [api group(s)]",
|
|
||||||
Short: "Run the grafana apiserver",
|
|
||||||
Long: "Run a standalone kubernetes based apiserver that can be aggregated by a root apiserver. " +
|
|
||||||
devAcknowledgementNotice,
|
|
||||||
Example: "grafana apiserver --runtime-config=example.grafana.app/v0alpha1=true",
|
|
||||||
RunE: func(c *cobra.Command, args []string) error {
|
|
||||||
if err := log.SetupConsoleLogger("debug"); err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := o.Validate(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
runtime, err := standalone.ReadRuntimeConfig(runtimeConfig)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
apis, err := o.factory.GetEnabled(runtime)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Currently TracingOptions.ApplyTo, which will configure/initialize tracing,
|
|
||||||
// happens after loadAPIGroupBuilders. Hack to workaround this for now to allow
|
|
||||||
// the tracer to be initialized at a later stage, when tracer is available.
|
|
||||||
// TODO: Fix so that TracingOptions.ApplyTo happens before or during loadAPIGroupBuilders.
|
|
||||||
tracer := newLateInitializedTracingService()
|
|
||||||
|
|
||||||
ctx, cancel := context.WithCancel(c.Context())
|
|
||||||
go func() {
|
|
||||||
<-stopCh
|
|
||||||
cancel()
|
|
||||||
}()
|
|
||||||
|
|
||||||
// Load each group from the args
|
|
||||||
if err := o.loadAPIGroupBuilders(ctx, tracer, apis); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finish the config (a noop for now)
|
|
||||||
if err := o.Complete(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// o.Config(tracer) definitely needs to happen before we override the tracer below
|
|
||||||
// using tracer.InitTracer with the real tracer
|
|
||||||
config, err := o.Config(tracer)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if o.Options.TracingOptions.TracingService != nil {
|
|
||||||
tracer.InitTracer(o.Options.TracingOptions.TracingService)
|
|
||||||
}
|
|
||||||
|
|
||||||
defer o.factory.Shutdown()
|
|
||||||
|
|
||||||
if err := o.RunAPIServer(ctx, config); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.Flags().StringVar(&runtimeConfig, "runtime-config", "", "A set of key=value pairs that enable or disable built-in APIs.")
|
|
||||||
|
|
||||||
o.AddFlags(cmd.Flags())
|
|
||||||
|
|
||||||
return cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
func RunCLI(opts commands.ServerOptions) int {
|
|
||||||
stopCh := genericapiserver.SetupSignalHandler()
|
|
||||||
|
|
||||||
commands.SetBuildInfo(opts)
|
|
||||||
|
|
||||||
options := newAPIServerOptions(os.Stdout, os.Stderr)
|
|
||||||
cmd := newCommandStartStandaloneAPIServer(options, stopCh)
|
|
||||||
|
|
||||||
return cli.Run(cmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
type lateInitializedTracingProvider struct {
|
|
||||||
trace.TracerProvider
|
|
||||||
tracer *lateInitializedTracingService
|
|
||||||
}
|
|
||||||
|
|
||||||
func (tp lateInitializedTracingProvider) Tracer(name string, options ...trace.TracerOption) trace.Tracer {
|
|
||||||
return tp.tracer.getTracer()
|
|
||||||
}
|
|
||||||
|
|
||||||
type lateInitializedTracingService struct {
|
|
||||||
tracing.Tracer
|
|
||||||
mutex sync.RWMutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func newLateInitializedTracingService() *lateInitializedTracingService {
|
|
||||||
ts := &lateInitializedTracingService{
|
|
||||||
Tracer: tracing.NewNoopTracerService(),
|
|
||||||
}
|
|
||||||
|
|
||||||
tp := &lateInitializedTracingProvider{
|
|
||||||
tracer: ts,
|
|
||||||
}
|
|
||||||
|
|
||||||
otel.SetTracerProvider(tp)
|
|
||||||
|
|
||||||
return ts
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *lateInitializedTracingService) getTracer() tracing.Tracer {
|
|
||||||
s.mutex.RLock()
|
|
||||||
t := s.Tracer
|
|
||||||
s.mutex.RUnlock()
|
|
||||||
return t
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *lateInitializedTracingService) InitTracer(tracer *tracing.TracingService) {
|
|
||||||
s.mutex.Lock()
|
|
||||||
s.Tracer = tracer
|
|
||||||
s.mutex.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ tracing.Tracer = &lateInitializedTracingService{}
|
|
@ -1,15 +0,0 @@
|
|||||||
---
|
|
||||||
apiVersion: apiregistration.k8s.io/v1
|
|
||||||
kind: APIService
|
|
||||||
metadata:
|
|
||||||
name: v0alpha1.example.grafana.app
|
|
||||||
spec:
|
|
||||||
version: v0alpha1
|
|
||||||
insecureSkipTLSVerify: true
|
|
||||||
group: example.grafana.app
|
|
||||||
groupPriorityMinimum: 1000
|
|
||||||
versionPriority: 15
|
|
||||||
service:
|
|
||||||
name: example-apiserver
|
|
||||||
namespace: grafana
|
|
||||||
port: 7443
|
|
@ -1,8 +0,0 @@
|
|||||||
apiVersion: service.grafana.app/v0alpha1
|
|
||||||
kind: ExternalName
|
|
||||||
metadata:
|
|
||||||
name: example-apiserver
|
|
||||||
namespace: grafana
|
|
||||||
spec:
|
|
||||||
host: localhost
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
|||||||
resources:
|
|
||||||
- apiservice.yaml
|
|
||||||
- externalname.yaml
|
|
@ -1,201 +0,0 @@
|
|||||||
package apiserver
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
"net"
|
|
||||||
"path"
|
|
||||||
|
|
||||||
"github.com/grafana/pyroscope-go/godeltaprof/http/pprof"
|
|
||||||
"github.com/spf13/pflag"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
utilerrors "k8s.io/apimachinery/pkg/util/errors"
|
|
||||||
genericapiserver "k8s.io/apiserver/pkg/server"
|
|
||||||
"k8s.io/apiserver/pkg/server/mux"
|
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
|
||||||
netutils "k8s.io/utils/net"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/infra/log"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
||||||
grafanaAPIServer "github.com/grafana/grafana/pkg/services/apiserver"
|
|
||||||
"github.com/grafana/grafana/pkg/services/apiserver/builder"
|
|
||||||
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
|
|
||||||
standaloneoptions "github.com/grafana/grafana/pkg/services/apiserver/standalone/options"
|
|
||||||
"github.com/grafana/grafana/pkg/services/apiserver/utils"
|
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
dataPath = "data/grafana-apiserver" // same as grafana core
|
|
||||||
)
|
|
||||||
|
|
||||||
// APIServerOptions contains the state for the apiserver
|
|
||||||
type APIServerOptions struct {
|
|
||||||
factory standalone.APIServerFactory
|
|
||||||
builders []builder.APIGroupBuilder
|
|
||||||
Options *standaloneoptions.Options
|
|
||||||
AlternateDNS []string
|
|
||||||
logger log.Logger
|
|
||||||
|
|
||||||
StdOut io.Writer
|
|
||||||
StdErr io.Writer
|
|
||||||
}
|
|
||||||
|
|
||||||
func newAPIServerOptions(out, errOut io.Writer) *APIServerOptions {
|
|
||||||
logger := log.New("grafana-apiserver")
|
|
||||||
|
|
||||||
return &APIServerOptions{
|
|
||||||
logger: logger,
|
|
||||||
StdOut: out,
|
|
||||||
StdErr: errOut,
|
|
||||||
Options: standaloneoptions.New(logger, grafanaAPIServer.Codecs.LegacyCodec()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *APIServerOptions) loadAPIGroupBuilders(ctx context.Context, tracer tracing.Tracer, apis []schema.GroupVersion) error {
|
|
||||||
o.builders = []builder.APIGroupBuilder{}
|
|
||||||
for _, gv := range apis {
|
|
||||||
api, err := o.factory.MakeAPIServer(ctx, tracer, gv)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
o.builders = append(o.builders, api)
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(o.builders) < 1 {
|
|
||||||
return fmt.Errorf("no apis matched ")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Install schemas
|
|
||||||
for _, b := range o.builders {
|
|
||||||
if err := b.InstallSchema(grafanaAPIServer.Scheme); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *APIServerOptions) Config(tracer tracing.Tracer) (*genericapiserver.RecommendedConfig, error) {
|
|
||||||
if err := o.Options.RecommendedOptions.SecureServing.MaybeDefaultWithSelfSignedCerts(
|
|
||||||
"localhost", o.AlternateDNS, []net.IP{netutils.ParseIPSloppy("127.0.0.1")},
|
|
||||||
); err != nil {
|
|
||||||
return nil, fmt.Errorf("error creating self-signed certificates: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
o.Options.RecommendedOptions.Authentication.RemoteKubeConfigFileOptional = true
|
|
||||||
|
|
||||||
// TODO: determine authorization, currently insecure because Authorization provided by recommended options doesn't work
|
|
||||||
// reason: an aggregated server won't be able to post subjectaccessreviews (Grafana doesn't have this kind)
|
|
||||||
// exact error: the server could not find the requested resource (post subjectaccessreviews.authorization.k8s.io)
|
|
||||||
o.Options.RecommendedOptions.Authorization = nil
|
|
||||||
|
|
||||||
o.Options.RecommendedOptions.Admission = nil
|
|
||||||
o.Options.RecommendedOptions.Etcd = nil
|
|
||||||
|
|
||||||
if o.Options.RecommendedOptions.CoreAPI.CoreAPIKubeconfigPath == "" {
|
|
||||||
o.Options.RecommendedOptions.CoreAPI = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
serverConfig := genericapiserver.NewRecommendedConfig(grafanaAPIServer.Codecs)
|
|
||||||
|
|
||||||
if err := o.Options.ApplyTo(serverConfig); err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to apply options to server config: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if factoryOptions := o.factory.GetOptions(); factoryOptions != nil {
|
|
||||||
err := factoryOptions.ApplyTo(serverConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("factory's applyTo func failed: %s", err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
serverConfig.DisabledPostStartHooks = serverConfig.DisabledPostStartHooks.Insert("generic-apiserver-start-informers")
|
|
||||||
serverConfig.DisabledPostStartHooks = serverConfig.DisabledPostStartHooks.Insert("priority-and-fairness-config-consumer")
|
|
||||||
|
|
||||||
// Add OpenAPI specs for each group+version
|
|
||||||
err := builder.SetupConfig(
|
|
||||||
grafanaAPIServer.Scheme,
|
|
||||||
serverConfig,
|
|
||||||
o.builders,
|
|
||||||
setting.BuildStamp,
|
|
||||||
setting.BuildVersion,
|
|
||||||
setting.BuildCommit,
|
|
||||||
setting.BuildBranch,
|
|
||||||
o.factory.GetBuildHandlerChainFunc(tracer, o.builders),
|
|
||||||
)
|
|
||||||
return serverConfig, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *APIServerOptions) AddFlags(fs *pflag.FlagSet) {
|
|
||||||
o.Options.AddFlags(fs)
|
|
||||||
|
|
||||||
if factoryOptions := o.factory.GetOptions(); factoryOptions != nil {
|
|
||||||
factoryOptions.AddFlags(fs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Validate validates APIServerOptions
|
|
||||||
func (o *APIServerOptions) Validate() error {
|
|
||||||
errors := make([]error, 0)
|
|
||||||
|
|
||||||
if factoryOptions := o.factory.GetOptions(); factoryOptions != nil {
|
|
||||||
errors = append(errors, factoryOptions.ValidateOptions()...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if errs := o.Options.Validate(); len(errs) > 0 {
|
|
||||||
errors = append(errors, errs...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return utilerrors.NewAggregate(errors)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Complete fills in fields required to have valid data
|
|
||||||
func (o *APIServerOptions) Complete() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (o *APIServerOptions) RunAPIServer(ctx context.Context, config *genericapiserver.RecommendedConfig) error {
|
|
||||||
delegationTarget := genericapiserver.NewEmptyDelegate()
|
|
||||||
completedConfig := config.Complete()
|
|
||||||
|
|
||||||
server, err := completedConfig.New("standalone-apiserver", delegationTarget)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Install the API Group+version
|
|
||||||
// #TODO figure out how to configure storage type in o.Options.StorageOptions
|
|
||||||
err = builder.InstallAPIs(grafanaAPIServer.Scheme, grafanaAPIServer.Codecs, server, config.RESTOptionsGetter, o.builders, o.Options.StorageOptions,
|
|
||||||
o.Options.MetricsOptions.MetricsRegisterer, nil, nil, nil, // no need for server lock in standalone
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// write the local config to disk
|
|
||||||
if o.Options.ExtraOptions.DevMode {
|
|
||||||
if err = clientcmd.WriteToFile(
|
|
||||||
utils.FormatKubeConfig(server.LoopbackClientConfig),
|
|
||||||
path.Join(dataPath, "apiserver.kubeconfig"),
|
|
||||||
); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if config.EnableProfiling {
|
|
||||||
deltaProfiling{}.Install(server.Handler.NonGoRestfulMux)
|
|
||||||
}
|
|
||||||
|
|
||||||
return server.PrepareRun().RunWithContext(ctx)
|
|
||||||
}
|
|
||||||
|
|
||||||
// deltaProfiling adds godeltapprof handlers for pprof under /debug/pprof.
|
|
||||||
type deltaProfiling struct{}
|
|
||||||
|
|
||||||
// Install register godeltapprof handlers to the given mux.
|
|
||||||
func (d deltaProfiling) Install(c *mux.PathRecorderMux) {
|
|
||||||
c.UnlistedHandleFunc("/debug/pprof/delta_heap", pprof.Heap)
|
|
||||||
c.UnlistedHandleFunc("/debug/pprof/delta_block", pprof.Block)
|
|
||||||
c.UnlistedHandleFunc("/debug/pprof/delta_mutex", pprof.Mutex)
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
# apiserver-certificates
|
|
||||||
|
|
||||||
These certificates are used for development and testing ONLY. They are generated using the script under
|
|
||||||
[hack/make-aggregator-pki.sh](./hack/make-aggregator-pki.sh).
|
|
||||||
|
|
||||||
The CA, server and client certificates are each 10 years of expiration.
|
|
@ -1,24 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIID9zCCAt+gAwIBAgIUeRrA5l+Rl4LkHPP1DmMFlYzrhW4wDQYJKoZIhvcNAQEL
|
|
||||||
BQAwgYoxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApOZXcgU3dlZGVuMRMwEQYDVQQH
|
|
||||||
DApTdG9ja2hvbG0gMRAwDgYDVQQKDAdHcmFmYW5hMQwwCgYDVQQLDANSJkQxEDAO
|
|
||||||
BgNVBAMMB3Rlc3QtY2ExHzAdBgkqhkiG9w0BCQEWEHRlc3RAZ3JhZmFuYS5hcHAw
|
|
||||||
HhcNMjQwODA1MjMxMzUzWhcNMzQwODAzMjMxMzUzWjCBijELMAkGA1UEBhMCVVMx
|
|
||||||
EzARBgNVBAgMCk5ldyBTd2VkZW4xEzARBgNVBAcMClN0b2NraG9sbSAxEDAOBgNV
|
|
||||||
BAoMB0dyYWZhbmExDDAKBgNVBAsMA1ImRDEQMA4GA1UEAwwHdGVzdC1jYTEfMB0G
|
|
||||||
CSqGSIb3DQEJARYQdGVzdEBncmFmYW5hLmFwcDCCASIwDQYJKoZIhvcNAQEBBQAD
|
|
||||||
ggEPADCCAQoCggEBANj6qsutYwof0e0zHrp35Dey+kQxi+VTr/sAKlSoyySP4fmQ
|
|
||||||
9Qn8mDY4HyJ1oOJFpFAlD0Qp1xGdbvcrlvjoieqmfenW342fza0wqS5K8qkd2rJ7
|
|
||||||
khdAE2mACZTFSjmAa8+1rIRWnR0SaHBmDgdxBfNkET+n+cX+WsDMhmzNvPoPDS/V
|
|
||||||
8LaNih/eOUzb/5hamvD8CNLKakes0u/EsdxOsGFWCkpE1mg9yg0YPms5qUAj9pdV
|
|
||||||
iPH8B5zA1JoukZCrVGPv6R76fJI1LEohiASNFt9cgs2dhdk6QHzGyqNq3T3Cw8yI
|
|
||||||
Cug/Kk9DGqwq9OeXtADa4hhPebj04C4hxk0AT2UCAwEAAaNTMFEwHQYDVR0OBBYE
|
|
||||||
FBBn2SXiiItJQsJZ7MTvIn1s1t3jMB8GA1UdIwQYMBaAFBBn2SXiiItJQsJZ7MTv
|
|
||||||
In1s1t3jMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBABcCcwsg
|
|
||||||
jrcNZheAaKXtdcZT01+doQhaOvhZQhY5L+bCnB0wkBXRJzv8ne+KgLx7auFQP8/2
|
|
||||||
OoPgaiA0R+XtImCkyBd+cr4mo2tYVpHt9+B0HaYGzGoXt0dre47ihlgkqoSwmgvG
|
|
||||||
9++pfrbQGRd5Xb/j0468sd5uQy1PPhsjCzFZTuxXcaAN13MDNikYjjn5mc5coklu
|
|
||||||
hCFH54PgP/PUDXxI0v/QUjNOj7hAdMkqOjzFD9Fze1KjtS3aSZvaaZVrM3x/YS8y
|
|
||||||
1IUgyocgoOKCqBOeEict+g/xghFDe7r2Dlgps/hPD1ojijBl83g5i079jW4y9jm+
|
|
||||||
osFOTGnRx2u0CpE=
|
|
||||||
-----END CERTIFICATE-----
|
|
@ -1,28 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDY+qrLrWMKH9Ht
|
|
||||||
Mx66d+Q3svpEMYvlU6/7ACpUqMskj+H5kPUJ/Jg2OB8idaDiRaRQJQ9EKdcRnW73
|
|
||||||
K5b46Inqpn3p1t+Nn82tMKkuSvKpHdqye5IXQBNpgAmUxUo5gGvPtayEVp0dEmhw
|
|
||||||
Zg4HcQXzZBE/p/nF/lrAzIZszbz6Dw0v1fC2jYof3jlM2/+YWprw/AjSympHrNLv
|
|
||||||
xLHcTrBhVgpKRNZoPcoNGD5rOalAI/aXVYjx/AecwNSaLpGQq1Rj7+ke+nySNSxK
|
|
||||||
IYgEjRbfXILNnYXZOkB8xsqjat09wsPMiAroPypPQxqsKvTnl7QA2uIYT3m49OAu
|
|
||||||
IcZNAE9lAgMBAAECggEAYUTyNy+J1BqSrd66WkZv6SZTeimp+Mrs+71FvMEUnFXi
|
|
||||||
LFJ2/xydEcVT88s+reEheYo7j0egcfWdLrH8UqZQWYB8ts0MV715YzgKx8Vyhizr
|
|
||||||
gxLRWZnwed2brfVJwoBXFHzxkzwO398GMckWZfCdhdBoyRwg5UkS3xZw9qq+mmw8
|
|
||||||
hvt88sDzHwnk/9rMY6KLNhWNiCSAxU65AlpktWRGy2e9wAtyzN+WX/iQwsiAyhk2
|
|
||||||
TV2bHQxRE7FT9hg4UBxzWruYRj4jkLKdH4tVqVKLsV7KutAOiYj3hCjYzOac/5QG
|
|
||||||
XrTRhN/ewAqJCTOI9K8BVT27l3QxREcq480auDwIawKBgQDzOr6+ILgPdqdGX9Nu
|
|
||||||
HoLnNuU6OdFsTJ3qXSp4AGv8ufq47PJmTp3F2ZN9RTDr6Fih7UKhApVvFOy6/Hlr
|
|
||||||
vb0MbL9FOe+2ejtnVmNi13AMexW+nmnOs1oSghXYIbt51/n+5bFmzAo6RFDEG0YT
|
|
||||||
mtRWMj4mifMI0XH31yRk+Yjp6wKBgQDkXxdG0OmoDwlrlbHjVOpEg7/A0diBHfb9
|
|
||||||
yh4MbaVmd6rGgdNkJYq1qB6ctJcLYpKq1QGgj6FyNDNyY/T4lIxRuSHqC2v1Mjt/
|
|
||||||
TaL1BhMsH2Q6+bT8mlmM4cNNgSVHfISJv2mMuKfEqb+uY0y8UU6/lYmwzC5rH4bs
|
|
||||||
TgPNSLmH7wKBgQCk8F9M2y81/UZt6Kmd8T7fwFAt7etgP4yO02LrQY35Mb0eDkBK
|
|
||||||
tGE1O9hSiMsmDseb9yLJwNDJJS1rl65XK7G5bT0/mow9+CG0b9axvlqTfBxAyXgC
|
|
||||||
3YjlKCXcDPPvKlCzU9u7U/5TiOQkOEKLJOF9GlEfHUkb37wjT1e0yarYxQKBgFNF
|
|
||||||
nT40RU8DlKLHJeNH/lhXVh9gJTsHix2Fiqlrfck8T2gsxMEas1aD5A2uB/mdyu9B
|
|
||||||
1mMOnIcBI9VNP3E48WWHRSeLXKU+2NUVoRsJSQpos+qRTP5i5c5qMAXd1pMXg1ib
|
|
||||||
FEi8uGgMoZlcGgn89+MCCwANo8tp5o/Z7qb3Ire/AoGANmc8BAGgKanJVAfu7gDU
|
|
||||||
AgxRg5T0/C6vpWh5k/gFS7AQqgnx8EcRYtuCD4Er5GFRdcyb9AuZccyKzWI5JS89
|
|
||||||
YOmJPrfDd7VzBsrOjwJCXcV6tUUq6yO4Ra8vKlIw7T+mMYZh7xWwGnT8UA+X9F+7
|
|
||||||
yV6kPpraMD/dFbo2TZoNMjc=
|
|
||||||
-----END PRIVATE KEY-----
|
|
@ -1,27 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIEjDCCA3SgAwIBAgIBATANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx
|
|
||||||
EzARBgNVBAgMCk5ldyBTd2VkZW4xEzARBgNVBAcMClN0b2NraG9sbSAxEDAOBgNV
|
|
||||||
BAoMB0dyYWZhbmExDDAKBgNVBAsMA1ImRDEQMA4GA1UEAwwHdGVzdC1jYTEfMB0G
|
|
||||||
CSqGSIb3DQEJARYQdGVzdEBncmFmYW5hLmFwcDAeFw0yNDA4MDUyMzEzNTRaFw0z
|
|
||||||
NDA4MDMyMzEzNTRaMC8xFDASBgNVBAMMC2RldmVsb3BtZW50MRcwFQYDVQQKDA5z
|
|
||||||
eXN0ZW06bWFzdGVyczCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMz3
|
|
||||||
SSM62uPCNG7mbdlgE0bYcpT8f1ZFmyaauXzbqdTF0/VxGCh9YVBFnqlAdfAUFasN
|
|
||||||
HBLQz63PniOWbzmhXZBkrCF/nozg7PgiXJ7aM5ppJyYulOI3sldH49V8KWzcGiJo
|
|
||||||
ZE13kKIlCqnOanErj4RnaxVJvMmWOlt6Zn/ljkDFvwypaOeIX/YO1zuZ95BqGpDh
|
|
||||||
u4CXipKeCM0AjXNvKrHCi5QbNEF0FMyvsX+s76wZtZSpB7vbIfj/h5Z4Scfyovmy
|
|
||||||
cZeqgL2mDAnosKw8/KYAgkcArMHoScTfdCjWthJQlPybJKgMKOJI9OehuP1a89A9
|
|
||||||
t+T/T8ZT75x0YADw+56WDcsYGECiaixrkpB0aiPBtgDm1i1z7ooqSfAfZa0PEgPT
|
|
||||||
L680TK66qXI2GFtNqUkU6+xZEfvuxOdZRXkuIVeQ4UMqaiW9y37ppvKzX4llOD2D
|
|
||||||
VP86D0JxCCuJqxlzSAGbxK61c8mdqM1SKAa5O5Kl0KHxVkGk4zHYtrHqWsy6YOIM
|
|
||||||
CqLMA2vLAeqYwSEn2eQBkTNdhSulrB6JPNBDPNB9+wX5EOX3w+x9lRxn59kQgKyV
|
|
||||||
anf1cm1UYeqjsLPhBjpuwVtHhEAc8uJrSZBM3oKPSYEYxwEo+QG8rcKIpjV9gtCu
|
|
||||||
T3e/WBWlDVBm0NwbxtY/rYc5ggPHMtPhFxBDhjJpAgMBAAGjVzBVMBMGA1UdJQQM
|
|
||||||
MAoGCCsGAQUFBwMCMB0GA1UdDgQWBBQ+z7tF4/VANXrXgsY0PVQFFo6csjAfBgNV
|
|
||||||
HSMEGDAWgBQQZ9kl4oiLSULCWezE7yJ9bNbd4zANBgkqhkiG9w0BAQsFAAOCAQEA
|
|
||||||
NagU3hqJr5wEU79202Rj+aqbzWJlz1jvZVR6PHILB0deTtvYk1EXeVgyjwmz7PW3
|
|
||||||
DLYcpwgW3bTdxhejduFNzKazDOZZ2blUlZlHs1PoBb/ipnw4g+ozO+ZyGs05gCu8
|
|
||||||
DrsxUKX7bpVcKGfPNVg8L4xZbanizO1XUiv6PDBBRZhKXSl+KO9+aN2C/yRnYmpV
|
|
||||||
9dyuMI9nFoMB0K7rxTxiRCIPIWs8nsGouLa6lg6/I+xTAjV0IqNz0rQ66UWJOr3x
|
|
||||||
vLGFdMMaDUSbsNlu18/sCJd+G0rkh24YE6e3I1wGqE9jr4iYsMhkhfp0u4Qojmfp
|
|
||||||
3/7IGZYzvVIN/PvSFBBgZw==
|
|
||||||
-----END CERTIFICATE-----
|
|
@ -1,27 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE REQUEST-----
|
|
||||||
MIIEmjCCAoICAQAwLzEUMBIGA1UEAwwLZGV2ZWxvcG1lbnQxFzAVBgNVBAoMDnN5
|
|
||||||
c3RlbTptYXN0ZXJzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzPdJ
|
|
||||||
Izra48I0buZt2WATRthylPx/VkWbJpq5fNup1MXT9XEYKH1hUEWeqUB18BQVqw0c
|
|
||||||
EtDPrc+eI5ZvOaFdkGSsIX+ejODs+CJcntozmmknJi6U4jeyV0fj1XwpbNwaImhk
|
|
||||||
TXeQoiUKqc5qcSuPhGdrFUm8yZY6W3pmf+WOQMW/DKlo54hf9g7XO5n3kGoakOG7
|
|
||||||
gJeKkp4IzQCNc28qscKLlBs0QXQUzK+xf6zvrBm1lKkHu9sh+P+HlnhJx/Ki+bJx
|
|
||||||
l6qAvaYMCeiwrDz8pgCCRwCswehJxN90KNa2ElCU/JskqAwo4kj056G4/Vrz0D23
|
|
||||||
5P9PxlPvnHRgAPD7npYNyxgYQKJqLGuSkHRqI8G2AObWLXPuiipJ8B9lrQ8SA9Mv
|
|
||||||
rzRMrrqpcjYYW02pSRTr7FkR++7E51lFeS4hV5DhQypqJb3Lfumm8rNfiWU4PYNU
|
|
||||||
/zoPQnEIK4mrGXNIAZvErrVzyZ2ozVIoBrk7kqXQofFWQaTjMdi2sepazLpg4gwK
|
|
||||||
oswDa8sB6pjBISfZ5AGRM12FK6WsHok80EM80H37BfkQ5ffD7H2VHGfn2RCArJVq
|
|
||||||
d/VybVRh6qOws+EGOm7BW0eEQBzy4mtJkEzego9JgRjHASj5AbytwoimNX2C0K5P
|
|
||||||
d79YFaUNUGbQ3BvG1j+thzmCA8cy0+EXEEOGMmkCAwEAAaAmMCQGCSqGSIb3DQEJ
|
|
||||||
DjEXMBUwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggIBAB7x
|
|
||||||
82Hy942/7nSbz9gJUsJ70sYcre0VRduIMzP1Ytk/ni+1QXDZSmdSrgR0cbTL4VIZ
|
|
||||||
zSt5Bp2vxBJqHmGPOXv5oWI+nGrfWzmzBGoGNk4cdNW2ZZCn6Om4L16gLYIlxmm1
|
|
||||||
vgCgnPOYMEi5qtgG6676wSX7gf5+j1gWVDEwNFil8wBUIlA9QRbc2NN0T6479Z4b
|
|
||||||
4tUHzUpGuf788OPUqAdxpkH1xZBKW8HEGsk1+NdHgb5krE2ElwvN9qWX5f2DzzwL
|
|
||||||
sQf3A2IrO4lrso4RHao4X3V+/DOZCx+FK/oXqzyoS4YNnNy6B0377LgYkuuJsbOo
|
|
||||||
IFC7vRhBORvAXEXD/scLEsGKuQzs1vLLiwOp7pBOcGZzxOoqoXc2A6h64qpZKriq
|
|
||||||
T1rK6rmrttaXqYUokjbg/ggpcXCC1BGxsoRvGQoN6aQNV27zUh2wpZqpCpVLoN21
|
|
||||||
eCqM9LVoPMCRqn7ItXE9oJhasPlKDO6amHL3CtxjvU2meXoa+nCia8lL4Sb9pSkB
|
|
||||||
O5eX4k3H/m4zjrpbqp7UdnidcYn4zfrjRBr65bqNr1sOxwUDWOa0kqaOKrgqwhWn
|
|
||||||
ld6zkuekuwzrOK4+Dpf5ybWnVFi8WSz6k9TqQIaeMrzeCBVboufl/ygoIRsTqp7N
|
|
||||||
WcKuZdUx8t16hFZ/NgpHRgfZI9pYdzi2vNSZ6WMM
|
|
||||||
-----END CERTIFICATE REQUEST-----
|
|
@ -1,52 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
nL1C44m2dHWfIuDuGDs008g/12A53A==
|
|
||||||
-----END PRIVATE KEY-----
|
|
@ -1,28 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE-----
|
|
||||||
MIIE0jCCA7qgAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBijELMAkGA1UEBhMCVVMx
|
|
||||||
EzARBgNVBAgMCk5ldyBTd2VkZW4xEzARBgNVBAcMClN0b2NraG9sbSAxEDAOBgNV
|
|
||||||
BAoMB0dyYWZhbmExDDAKBgNVBAsMA1ImRDEQMA4GA1UEAwwHdGVzdC1jYTEfMB0G
|
|
||||||
CSqGSIb3DQEJARYQdGVzdEBncmFmYW5hLmFwcDAeFw0yNDA4MDUyMzEzNTVaFw0z
|
|
||||||
NDA4MDMyMzEzNTVaMCkxEjAQBgNVBAMMCWxvY2FsaG9zdDETMBEGA1UECgwKYWdn
|
|
||||||
cmVnYXRlZDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMbgGuvCKonn
|
|
||||||
9KgW58wqgxiykVbbmT82HmhgOBw5CSg7lVnKQlRzfvUtwZX7UhHXYxOCu0no7RqD
|
|
||||||
Y19QiGOx6SQlaXSMxqPL1PpWMQdX6j/I/H1pHMJ8Ynyd956VlhKUOIQBJMVd46Bg
|
|
||||||
6IEU4izuJ9uqEuHQrO8lb2eaTXAjsOmtIImxBI7xFsxp42wJyo6ptGetyaNCw7UF
|
|
||||||
e8xYmBVSLyfiN/drBx/lcwMiDgzfzf8BsavC96Fa/HujXkybAIyVid2DxKODPT9+
|
|
||||||
7MA1ZY0/Nz3ySKSxIIbfL+1cPihR2GGy1Qwa/GuuJSGAwzy6D/9am5/K3yR927Bk
|
|
||||||
OgMUCIlpGlSDY1qFd79o/n9BJ9FJmlTMgIZ6RokaXAU2uaiE6v7YPYGkXoIz3ncc
|
|
||||||
SBprVom2h3RmM3qDbmXio1gGsDL/2SI+Hpnq2zhCzL28K+bZA6ukYpCNyyaYF9O6
|
|
||||||
X6qi56zGCw/igTJgaYKMsNMSoX+3eHSFxj5JeF4bWcC4qTqmzvfz0HhvX+jjky/V
|
|
||||||
LHCh9ddH1umT/Ss/IxaNarXxXHoUmN33FgFQ+tML4eTvosG6IxUdJ/34qBT+dWk4
|
|
||||||
zNIhStTUNiYPbcSfv8qKLHhMAuZOLsTATLsFQt7bzGZwV8HAuCiqzjg9p4R/dRjE
|
|
||||||
OLhQLZfKkYl99Mgli6v/hooEBSORCulVAgMBAAGjgaIwgZ8wPgYDVR0RBDcwNYIo
|
|
||||||
djBhbHBoYTEuZXhhbXBsZS5ncmFmYW5hLmFwcC5kZWZhdWx0LnN2Y4IJbG9jYWxo
|
|
||||||
b3N0MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAdBgNVHQ4EFgQUFvrZ
|
|
||||||
B0vSR3B7HcNPCZrZ2H7sFw0wHwYDVR0jBBgwFoAUEGfZJeKIi0lCwlnsxO8ifWzW
|
|
||||||
3eMwDQYJKoZIhvcNAQELBQADggEBAGYZYrY+eFmgwFp/ohIcWnekdOiCr7qjnmRo
|
|
||||||
LyNU/EbFz0HUV+yTrtoXLjv8S9D9Yc029Dgj2f31Hp7cOGjUfd0t1DgTBChcFgVr
|
|
||||||
E5ZbhmKEM0tQiBMI6mHvy6hFT+nc9/yftnndHRUyR4xm6E1dMFqpMyMdYKojRmbn
|
|
||||||
F6znVTcjBr4OiDnfTUkqYO8kc3I0qvA5ou4jXAJ9mu3UEbEjwc6C2/Mrr48a42Df
|
|
||||||
rHrwqwnM3DC2+SWVocctk1PRZqMFWypJ9U/HbKPbId79YyHNsI0XtxizV2sX5oXD
|
|
||||||
1NPPEBeEXZ3Nv/gn4d0h57UoBML9165fRRQSe7CkIl8kZigHGCg=
|
|
||||||
-----END CERTIFICATE-----
|
|
@ -1,29 +0,0 @@
|
|||||||
-----BEGIN CERTIFICATE REQUEST-----
|
|
||||||
MIIE3jCCAsYCAQAwKTESMBAGA1UEAwwJbG9jYWxob3N0MRMwEQYDVQQKDAphZ2dy
|
|
||||||
ZWdhdGVkMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxuAa68Iqief0
|
|
||||||
qBbnzCqDGLKRVtuZPzYeaGA4HDkJKDuVWcpCVHN+9S3BlftSEddjE4K7SejtGoNj
|
|
||||||
X1CIY7HpJCVpdIzGo8vU+lYxB1fqP8j8fWkcwnxifJ33npWWEpQ4hAEkxV3joGDo
|
|
||||||
gRTiLO4n26oS4dCs7yVvZ5pNcCOw6a0gibEEjvEWzGnjbAnKjqm0Z63Jo0LDtQV7
|
|
||||||
zFiYFVIvJ+I392sHH+VzAyIODN/N/wGxq8L3oVr8e6NeTJsAjJWJ3YPEo4M9P37s
|
|
||||||
wDVljT83PfJIpLEght8v7Vw+KFHYYbLVDBr8a64lIYDDPLoP/1qbn8rfJH3bsGQ6
|
|
||||||
AxQIiWkaVINjWoV3v2j+f0En0UmaVMyAhnpGiRpcBTa5qITq/tg9gaRegjPedxxI
|
|
||||||
GmtWibaHdGYzeoNuZeKjWAawMv/ZIj4emerbOELMvbwr5tkDq6RikI3LJpgX07pf
|
|
||||||
qqLnrMYLD+KBMmBpgoyw0xKhf7d4dIXGPkl4XhtZwLipOqbO9/PQeG9f6OOTL9Us
|
|
||||||
cKH110fW6ZP9Kz8jFo1qtfFcehSY3fcWAVD60wvh5O+iwbojFR0n/fioFP51aTjM
|
|
||||||
0iFK1NQ2Jg9txJ+/yooseEwC5k4uxMBMuwVC3tvMZnBXwcC4KKrOOD2nhH91GMQ4
|
|
||||||
uFAtl8qRiX30yCWLq/+GigQFI5EK6VUCAwEAAaBwMG4GCSqGSIb3DQEJDjFhMF8w
|
|
||||||
PgYDVR0RBDcwNYIodjBhbHBoYTEuZXhhbXBsZS5ncmFmYW5hLmFwcC5kZWZhdWx0
|
|
||||||
LnN2Y4IJbG9jYWxob3N0MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAN
|
|
||||||
BgkqhkiG9w0BAQsFAAOCAgEAGmr6CnGfcm+DapmhQnQLyq0HyCqKD0PKKamofQLb
|
|
||||||
YVMiCF/zKDV4+gIs2kMK3uWeZ9r4xDa9nEgBw6U2vi14AI79hmpETCrfvK6hterI
|
|
||||||
Znb2TQMYnUY3rt26DFNf3/21/jb/1cn/9z55TaHJGqqlJmvB1LfYJoMN8t6A6xg4
|
|
||||||
J8TYjBuwQQOqFAPRuxmGag44PSC9V5e6gajz56RPyZz2kmdbfPZRNCnqileDWZla
|
|
||||||
7pilwP8QAhrJCPP25edc/5hP2WNTEH/GTa5FFmkNMKEHn6+dnBuMu5w1SygKUYWz
|
|
||||||
37qE7jntZC/RGVZ//npwsVyaa+NbgJNjhg/EMj+sWb/Eet2ETq7v9FCM0QG3HNUk
|
|
||||||
6d6af2YHI3Fo89y5ty1DOydBa5lIxy6gDTwameJYoTem71nPlRtU2b4VFBWZ4xwE
|
|
||||||
ac7Xmon+Z7tOHVwcCPp1cTwJ2TNwha0JxsW0C1g3QG59ILU5FMPlqOuDJi41uWql
|
|
||||||
Q56O+a6MnK7GfGxBMMf4FSlbV3xjUGxqyGy5KwIcsy+u/3axCWPUcoz3g0pApbGO
|
|
||||||
pfsu5Ptr/xMtYjLRXbEcH9Byqx/LrBvD2upwNnlfMtgWIlg/EnZ26Mgardu/NwQq
|
|
||||||
3fpYv00VWbvBE/B/5p5zmEpA67COFejiwVTsbeN345Ue2mq59DNg6BZmaxKH3Sbq
|
|
||||||
Kz8=
|
|
||||||
-----END CERTIFICATE REQUEST-----
|
|
@ -1,52 +0,0 @@
|
|||||||
-----BEGIN PRIVATE KEY-----
|
|
||||||
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
|
|
||||||
C+DUGz2rplZQ/4PtNOcz7reeAFvu6A==
|
|
||||||
-----END PRIVATE KEY-----
|
|
@ -8,8 +8,9 @@ import (
|
|||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
|
||||||
gcli "github.com/grafana/grafana/pkg/cmd/grafana-cli/commands"
|
gcli "github.com/grafana/grafana/pkg/cmd/grafana-cli/commands"
|
||||||
gsrv "github.com/grafana/grafana/pkg/cmd/grafana-server/commands"
|
"github.com/grafana/grafana/pkg/cmd/grafana-server/commands"
|
||||||
"github.com/grafana/grafana/pkg/cmd/grafana/apiserver"
|
"github.com/grafana/grafana/pkg/server"
|
||||||
|
"github.com/grafana/grafana/pkg/services/apiserver/standalone"
|
||||||
)
|
)
|
||||||
|
|
||||||
// The following variables cannot be constants, since they can be overridden through the -X link flag
|
// The following variables cannot be constants, since they can be overridden through the -X link flag
|
||||||
@ -31,7 +32,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func MainApp() *cli.App {
|
func MainApp() *cli.App {
|
||||||
return &cli.App{
|
app := &cli.App{
|
||||||
Name: "grafana",
|
Name: "grafana",
|
||||||
Usage: "Grafana server and command line interface",
|
Usage: "Grafana server and command line interface",
|
||||||
Authors: []*cli.Author{
|
Authors: []*cli.Author{
|
||||||
@ -43,30 +44,32 @@ func MainApp() *cli.App {
|
|||||||
Version: version,
|
Version: version,
|
||||||
Commands: []*cli.Command{
|
Commands: []*cli.Command{
|
||||||
gcli.CLICommand(version),
|
gcli.CLICommand(version),
|
||||||
gsrv.ServerCommand(version, commit, enterpriseCommit, buildBranch, buildstamp),
|
commands.ServerCommand(version, commit, enterpriseCommit, buildBranch, buildstamp),
|
||||||
{
|
|
||||||
// The kubernetes standalone apiserver service runner
|
|
||||||
Name: "apiserver",
|
|
||||||
Usage: "run a standalone api service (experimental)",
|
|
||||||
// Skip parsing flags because the command line is actually managed by cobra
|
|
||||||
SkipFlagParsing: true,
|
|
||||||
Action: func(context *cli.Context) error {
|
|
||||||
// exit here because apiserver handles its own error output
|
|
||||||
os.Exit(apiserver.RunCLI(gsrv.ServerOptions{
|
|
||||||
Version: version,
|
|
||||||
Commit: commit,
|
|
||||||
EnterpriseCommit: enterpriseCommit,
|
|
||||||
BuildBranch: buildBranch,
|
|
||||||
BuildStamp: buildstamp,
|
|
||||||
Context: context,
|
|
||||||
}))
|
|
||||||
return nil
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
CommandNotFound: cmdNotFound,
|
CommandNotFound: cmdNotFound,
|
||||||
EnableBashCompletion: true,
|
EnableBashCompletion: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the global build info
|
||||||
|
buildInfo := standalone.BuildInfo{
|
||||||
|
Version: version,
|
||||||
|
Commit: commit,
|
||||||
|
EnterpriseCommit: enterpriseCommit,
|
||||||
|
BuildBranch: buildBranch,
|
||||||
|
BuildStamp: buildstamp,
|
||||||
|
}
|
||||||
|
commands.SetBuildInfo(buildInfo)
|
||||||
|
|
||||||
|
// Add the enterprise command line to build an api server
|
||||||
|
f, err := server.InitializeAPIServerFactory()
|
||||||
|
if err == nil {
|
||||||
|
cmd := f.GetCLICommand(buildInfo)
|
||||||
|
if cmd != nil {
|
||||||
|
app.Commands = append(app.Commands, cmd)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return app
|
||||||
}
|
}
|
||||||
|
|
||||||
func cmdNotFound(c *cli.Context, command string) {
|
func cmdNotFound(c *cli.Context, command string) {
|
||||||
|
@ -15,11 +15,6 @@ import (
|
|||||||
_ "github.com/go-jose/go-jose/v3"
|
_ "github.com/go-jose/go-jose/v3"
|
||||||
_ "github.com/gobwas/glob"
|
_ "github.com/gobwas/glob"
|
||||||
_ "github.com/googleapis/gax-go/v2"
|
_ "github.com/googleapis/gax-go/v2"
|
||||||
_ "github.com/grafana/dskit/backoff"
|
|
||||||
_ "github.com/grafana/dskit/flagext"
|
|
||||||
_ "github.com/grafana/e2e"
|
|
||||||
_ "github.com/grafana/gofpdf"
|
|
||||||
_ "github.com/grafana/gomemcache/memcache"
|
|
||||||
_ "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
|
_ "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
|
||||||
_ "github.com/grpc-ecosystem/go-grpc-middleware/v2"
|
_ "github.com/grpc-ecosystem/go-grpc-middleware/v2"
|
||||||
_ "github.com/hashicorp/go-multierror"
|
_ "github.com/hashicorp/go-multierror"
|
||||||
@ -29,9 +24,16 @@ import (
|
|||||||
_ "github.com/phpdave11/gofpdi"
|
_ "github.com/phpdave11/gofpdi"
|
||||||
_ "github.com/robfig/cron/v3"
|
_ "github.com/robfig/cron/v3"
|
||||||
_ "github.com/russellhaering/goxmldsig"
|
_ "github.com/russellhaering/goxmldsig"
|
||||||
|
_ "github.com/spf13/cobra" // used by the standalone apiserver cli
|
||||||
_ "github.com/stretchr/testify/require"
|
_ "github.com/stretchr/testify/require"
|
||||||
_ "golang.org/x/time/rate"
|
_ "golang.org/x/time/rate"
|
||||||
_ "xorm.io/builder"
|
_ "xorm.io/builder"
|
||||||
|
|
||||||
|
_ "github.com/grafana/dskit/backoff"
|
||||||
|
_ "github.com/grafana/dskit/flagext"
|
||||||
|
_ "github.com/grafana/e2e"
|
||||||
|
_ "github.com/grafana/gofpdf"
|
||||||
|
_ "github.com/grafana/gomemcache/memcache"
|
||||||
)
|
)
|
||||||
|
|
||||||
var IsEnterprise bool = false
|
var IsEnterprise bool = false
|
||||||
|
@ -465,5 +465,5 @@ func InitializeModuleServer(cfg *setting.Cfg, opts Options, apiOpts api.ServerOp
|
|||||||
// Initialize the standalone APIServer factory
|
// Initialize the standalone APIServer factory
|
||||||
func InitializeAPIServerFactory() (standalone.APIServerFactory, error) {
|
func InitializeAPIServerFactory() (standalone.APIServerFactory, error) {
|
||||||
wire.Build(wireExtsStandaloneAPIServerSet)
|
wire.Build(wireExtsStandaloneAPIServerSet)
|
||||||
return &standalone.DummyAPIFactory{}, nil // Wire will replace this with a real interface
|
return &standalone.NoOpAPIServerFactory{}, nil // Wire will replace this with a real interface
|
||||||
}
|
}
|
||||||
|
@ -141,5 +141,5 @@ var wireExtsModuleServerSet = wire.NewSet(
|
|||||||
)
|
)
|
||||||
|
|
||||||
var wireExtsStandaloneAPIServerSet = wire.NewSet(
|
var wireExtsStandaloneAPIServerSet = wire.NewSet(
|
||||||
standalone.GetDummyAPIFactory,
|
standalone.ProvideAPIServerFactory,
|
||||||
)
|
)
|
||||||
|
@ -1,168 +1,28 @@
|
|||||||
package standalone
|
package standalone
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"github.com/urfave/cli/v2"
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
||||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
||||||
genericapiserver "k8s.io/apiserver/pkg/server"
|
|
||||||
|
|
||||||
"github.com/grafana/grafana/pkg/apis/datasource/v0alpha1"
|
|
||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
||||||
"github.com/grafana/grafana/pkg/plugins"
|
|
||||||
"github.com/grafana/grafana/pkg/registry/apis/datasource"
|
|
||||||
"github.com/grafana/grafana/pkg/registry/apis/query"
|
|
||||||
"github.com/grafana/grafana/pkg/registry/apis/query/client"
|
|
||||||
"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"
|
|
||||||
testdatasource "github.com/grafana/grafana/pkg/tsdb/grafana-testdata-datasource"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type BuildInfo struct {
|
||||||
|
Version string
|
||||||
|
Commit string
|
||||||
|
EnterpriseCommit string
|
||||||
|
BuildBranch string
|
||||||
|
BuildStamp string
|
||||||
|
}
|
||||||
|
|
||||||
type APIServerFactory interface {
|
type APIServerFactory interface {
|
||||||
// Called before the groups are loaded so any custom command can be registered
|
GetCLICommand(info BuildInfo) *cli.Command
|
||||||
GetOptions() options.OptionsProvider
|
|
||||||
|
|
||||||
// Given the flags, what can we produce
|
|
||||||
GetEnabled(runtime []RuntimeConfig) ([]schema.GroupVersion, error)
|
|
||||||
|
|
||||||
// Optional override for apiserver's BuildHandlerChainFunc, return nil if you want to use the grafana's default chain func defined in pkg/services/apiserver/builder/helper.go
|
|
||||||
GetBuildHandlerChainFunc(tracer tracing.Tracer, builders []builder.APIGroupBuilder) builder.BuildHandlerChainFunc
|
|
||||||
|
|
||||||
// Make an API server for a given group+version
|
|
||||||
MakeAPIServer(ctx context.Context, tracer tracing.Tracer, gv schema.GroupVersion) (builder.APIGroupBuilder, error)
|
|
||||||
|
|
||||||
Shutdown()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zero dependency provider for testing
|
// NOOP
|
||||||
func GetDummyAPIFactory() APIServerFactory {
|
func ProvideAPIServerFactory() APIServerFactory {
|
||||||
return &DummyAPIFactory{}
|
return &NoOpAPIServerFactory{}
|
||||||
}
|
}
|
||||||
|
|
||||||
type DummyAPIFactory struct{}
|
type NoOpAPIServerFactory struct{}
|
||||||
|
|
||||||
func (p *DummyAPIFactory) GetOptions() options.OptionsProvider {
|
func (f *NoOpAPIServerFactory) GetCLICommand(info BuildInfo) *cli.Command {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *DummyAPIFactory) GetBuildHandlerChainFunc(_ tracing.Tracer, builders []builder.APIGroupBuilder) builder.BuildHandlerChainFunc {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *DummyAPIFactory) GetEnabled(runtime []RuntimeConfig) ([]schema.GroupVersion, error) {
|
|
||||||
gv := []schema.GroupVersion{}
|
|
||||||
for _, cfg := range runtime {
|
|
||||||
if !cfg.Enabled {
|
|
||||||
return nil, fmt.Errorf("only enabled supported now")
|
|
||||||
}
|
|
||||||
if cfg.Group == "all" {
|
|
||||||
return nil, fmt.Errorf("all not yet supported")
|
|
||||||
}
|
|
||||||
gv = append(gv, schema.GroupVersion{Group: cfg.Group, Version: cfg.Version})
|
|
||||||
}
|
|
||||||
return gv, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *DummyAPIFactory) ApplyTo(config *genericapiserver.RecommendedConfig) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *DummyAPIFactory) MakeAPIServer(_ context.Context, tracer tracing.Tracer, gv schema.GroupVersion) (builder.APIGroupBuilder, error) {
|
|
||||||
if gv.Version != "v0alpha1" {
|
|
||||||
return nil, fmt.Errorf("only alpha supported now")
|
|
||||||
}
|
|
||||||
|
|
||||||
switch gv.Group {
|
|
||||||
// Only works with testdata
|
|
||||||
case "query.grafana.app":
|
|
||||||
return query.NewQueryAPIBuilder(
|
|
||||||
featuremgmt.WithFeatures(),
|
|
||||||
&query.CommonDataSourceClientSupplier{
|
|
||||||
Client: client.NewTestDataClient(),
|
|
||||||
},
|
|
||||||
client.NewTestDataRegistry(),
|
|
||||||
nil, // legacy lookup
|
|
||||||
prometheus.NewRegistry(), // ???
|
|
||||||
tracer,
|
|
||||||
)
|
|
||||||
|
|
||||||
case "testdata.datasource.grafana.app":
|
|
||||||
return datasource.NewDataSourceAPIBuilder(
|
|
||||||
plugins.JSONData{
|
|
||||||
ID: "grafana-testdata-datasource",
|
|
||||||
},
|
|
||||||
testdatasource.ProvideService(), // the client
|
|
||||||
&pluginDatasourceImpl{
|
|
||||||
startup: v1.Now(),
|
|
||||||
},
|
|
||||||
&pluginDatasourceImpl{}, // stub
|
|
||||||
&actest.FakeAccessControl{ExpectedEvaluate: true},
|
|
||||||
true, // show query types
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil, fmt.Errorf("unsupported group")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *DummyAPIFactory) Shutdown() {}
|
|
||||||
|
|
||||||
// Simple stub for standalone datasource testing
|
|
||||||
type pluginDatasourceImpl struct {
|
|
||||||
startup v1.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
_ datasource.PluginDatasourceProvider = (*pluginDatasourceImpl)(nil)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Get implements PluginDatasourceProvider.
|
|
||||||
func (p *pluginDatasourceImpl) Get(ctx context.Context, uid string) (*v0alpha1.DataSourceConnection, error) {
|
|
||||||
all, err := p.List(ctx)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
for idx, v := range all.Items {
|
|
||||||
if v.Name == uid {
|
|
||||||
return &all.Items[idx], nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("not found")
|
|
||||||
}
|
|
||||||
|
|
||||||
// List implements PluginConfigProvider.
|
|
||||||
func (p *pluginDatasourceImpl) List(ctx context.Context) (*v0alpha1.DataSourceConnectionList, error) {
|
|
||||||
info, err := request.NamespaceInfoFrom(ctx, true)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
return &v0alpha1.DataSourceConnectionList{
|
|
||||||
TypeMeta: v0alpha1.GenericConnectionResourceInfo.TypeMeta(),
|
|
||||||
Items: []v0alpha1.DataSourceConnection{
|
|
||||||
{
|
|
||||||
ObjectMeta: v1.ObjectMeta{
|
|
||||||
Name: "PD8C576611E62080A",
|
|
||||||
Namespace: info.Value, // the raw namespace value
|
|
||||||
CreationTimestamp: p.startup,
|
|
||||||
},
|
|
||||||
Title: "gdev-testdata",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginContextForDataSource implements PluginConfigProvider.
|
|
||||||
func (*pluginDatasourceImpl) GetInstanceSettings(ctx context.Context, uid string) (*backend.DataSourceInstanceSettings, error) {
|
|
||||||
return &backend.DataSourceInstanceSettings{}, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// PluginContextWrapper
|
|
||||||
func (*pluginDatasourceImpl) PluginContextForDataSource(ctx context.Context, datasourceSettings *backend.DataSourceInstanceSettings) (backend.PluginContext, error) {
|
|
||||||
return backend.PluginContext{DataSourceInstanceSettings: datasourceSettings}, nil
|
|
||||||
}
|
|
||||||
|
Reference in New Issue
Block a user