Files
grafana/pkg/registry/apis/secret/inline/service.go
T

80 lines
2.4 KiB
Go

package inline
import (
"fmt"
authnlib "github.com/grafana/authlib/authn"
authlib "github.com/grafana/authlib/types"
"go.opentelemetry.io/otel/trace"
"github.com/grafana/grafana/pkg/registry/apis/secret/contracts"
"github.com/grafana/grafana/pkg/services/authn/grpcutils"
"github.com/grafana/grafana/pkg/setting"
)
func ProvideInlineSecureValueService(
cfg *setting.Cfg,
tracer trace.Tracer,
secureValueService contracts.SecureValueService,
accessClient authlib.AccessClient,
) (contracts.InlineSecureValueSupport, error) {
if cfg.SecretsManagement.GrpcClientEnable {
return NewGRPCSecureValueService(
grpcutils.ReadGrpcClientConfig(cfg),
cfg.SecretsManagement.GrpcServerAddress,
readTLSFromConfig(cfg),
tracer,
cfg.SecretsManagement.GrpcClientLoadBalancing,
)
}
return NewLocalInlineSecureValueService(tracer, secureValueService, accessClient), nil
}
func NewGRPCSecureValueService(
tokenCfg *grpcutils.GrpcClientConfig,
address string,
tlsCfg TLSConfig,
tracer trace.Tracer,
clientLoadBalancingEnabled bool,
) (contracts.InlineSecureValueSupport, error) {
if address == "" {
return nil, fmt.Errorf("grpc_server_address is required when grpc client is enabled")
}
if tokenCfg.Token == "" || tokenCfg.TokenExchangeURL == "" {
return nil, fmt.Errorf("grpc_client_authentication.token and grpc_client_authentication.token_exchange_url are required when grpc client is enabled")
}
tokenExchangeClient, err := authnlib.NewTokenExchangeClient(authnlib.TokenExchangeConfig{
Token: tokenCfg.Token,
TokenExchangeURL: tokenCfg.TokenExchangeURL,
})
if err != nil {
return nil, fmt.Errorf("failed to create token exchange client: %w", err)
}
client, err := NewGRPCInlineClient(tokenExchangeClient, tracer, address, tlsCfg, clientLoadBalancingEnabled)
if err != nil {
return nil, fmt.Errorf("failed to create grpc inline secure value client: %w", err)
}
return client, nil
}
func readTLSFromConfig(cfg *setting.Cfg) TLSConfig {
if !cfg.SecretsManagement.GrpcServerUseTLS {
return TLSConfig{
UseTLS: false,
InsecureSkipVerify: true,
}
}
return TLSConfig{
UseTLS: true,
CAFile: cfg.SectionWithEnvOverrides("grafana-apiserver").Key("apiservice_ca_bundle_file").MustString(""),
ServerName: cfg.SecretsManagement.GrpcServerTLSServerName,
InsecureSkipVerify: cfg.SecretsManagement.GrpcServerTLSSkipVerify,
}
}