spire-plugin-sdk/internal/serve.go

66 lines
1.9 KiB
Go

package internal
import (
"context"
"errors"
"github.com/hashicorp/go-hclog"
goplugin "github.com/hashicorp/go-plugin"
"github.com/spiffe/spire-plugin-sdk/pluginsdk"
"github.com/spiffe/spire-plugin-sdk/private"
"google.golang.org/grpc"
)
// Serve serves the plugin with the given loggers and plugin/service servers and an optional test configuration.
func Serve(serverLogger, pluginLogger hclog.Logger, pluginServer pluginsdk.PluginServer, serviceServers []pluginsdk.ServiceServer, testConfig *goplugin.ServeTestConfig) {
goplugin.Serve(&goplugin.ServeConfig{
HandshakeConfig: ServerHandshakeConfig(pluginServer),
Plugins: map[string]goplugin.Plugin{
pluginServer.Type(): newHCPlugin(serverLogger, pluginServer, serviceServers),
},
Logger: pluginLogger,
GRPCServer: goplugin.DefaultGRPCServer,
Test: testConfig,
})
}
type hcServer struct {
goplugin.NetRPCUnsupportedPlugin
logger hclog.Logger
servers []pluginsdk.ServiceServer
}
func newHCPlugin(logger hclog.Logger, pluginServer pluginsdk.PluginServer, serviceServers []pluginsdk.ServiceServer) *hcServer {
return &hcServer{
logger: logger,
servers: append([]pluginsdk.ServiceServer{pluginServer}, serviceServers...),
}
}
func (p *hcServer) GRPCServer(broker *goplugin.GRPCBroker, server *grpc.Server) (err error) {
private.Register(server, p.servers, p.logger, &hcDialer{broker: broker})
return nil
}
func (p *hcServer) GRPCClient(context.Context, *goplugin.GRPCBroker, *grpc.ClientConn) (interface{}, error) {
return nil, errors.New("unimplemented")
}
type hcDialer struct {
broker *goplugin.GRPCBroker
conn grpc.ClientConnInterface
}
func (d *hcDialer) DialHost(ctx context.Context) (grpc.ClientConnInterface, error) {
if d.conn != nil {
return d.conn, nil
}
conn, err := d.broker.Dial(private.HostServiceProviderID)
if err != nil {
return nil, err
}
d.conn = conn
return conn, nil
}