66 lines
1.9 KiB
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
|
|
}
|