open-nomad/plugins/base/server.go
2018-10-29 21:34:34 -04:00

79 lines
1.8 KiB
Go

package base
import (
"fmt"
"golang.org/x/net/context"
plugin "github.com/hashicorp/go-plugin"
"github.com/hashicorp/nomad/plugins/base/proto"
)
// basePluginServer wraps a base plugin and exposes it via gRPC.
type basePluginServer struct {
broker *plugin.GRPCBroker
impl BasePlugin
}
func (b *basePluginServer) PluginInfo(context.Context, *proto.PluginInfoRequest) (*proto.PluginInfoResponse, error) {
resp, err := b.impl.PluginInfo()
if err != nil {
return nil, err
}
var ptype proto.PluginType
switch resp.Type {
case PluginTypeDriver:
ptype = proto.PluginType_DRIVER
case PluginTypeDevice:
ptype = proto.PluginType_DEVICE
default:
return nil, fmt.Errorf("plugin is of unknown type: %q", resp.Type)
}
presp := &proto.PluginInfoResponse{
Type: ptype,
PluginApiVersion: resp.PluginApiVersion,
PluginVersion: resp.PluginVersion,
Name: resp.Name,
}
return presp, nil
}
func (b *basePluginServer) ConfigSchema(context.Context, *proto.ConfigSchemaRequest) (*proto.ConfigSchemaResponse, error) {
spec, err := b.impl.ConfigSchema()
if err != nil {
return nil, err
}
presp := &proto.ConfigSchemaResponse{
Spec: spec,
}
return presp, nil
}
func (b *basePluginServer) SetConfig(ctx context.Context, req *proto.SetConfigRequest) (*proto.SetConfigResponse, error) {
info, err := b.impl.PluginInfo()
if err != nil {
return nil, err
}
// Client configuration is filtered based on plugin type
cfg := nomadConfigFromProto(req.GetNomadConfig())
filteredCfg := new(ClientAgentConfig)
switch info.Type {
case PluginTypeDriver:
filteredCfg.Driver = cfg.Driver
}
// Set the config
if err := b.impl.SetConfig(req.GetMsgpackConfig(), filteredCfg); err != nil {
return nil, fmt.Errorf("SetConfig failed: %v", err)
}
return &proto.SetConfigResponse{}, nil
}