Add support for plugins

This commit is contained in:
Paul Lorenz
2021-10-14 13:40:30 -04:00
parent c7873d306a
commit f0ffab7996
2 changed files with 54 additions and 1 deletions
+16 -1
View File
@@ -96,7 +96,8 @@ type Config struct {
InitialDelay time.Duration
}
}
src map[interface{}]interface{}
Plugins []string
src map[interface{}]interface{}
}
func (config *Config) Configure(sub config.Subconfig) error {
@@ -375,6 +376,20 @@ func LoadConfig(path string) (*Config, error) {
}
}
if value, found := cfgmap["plugins"]; found {
if list, ok := value.([]interface{}); ok {
for _, v := range list {
if plugin, ok := v.(string); ok {
cfg.Plugins = append(cfg.Plugins, plugin)
} else {
pfxlog.Logger().Warnf("invalid plugin value: '%v'", plugin)
}
}
} else {
pfxlog.Logger().Warn("invalid plugins value")
}
}
return cfg, nil
}
+38
View File
@@ -53,6 +53,7 @@ import (
"github.com/sirupsen/logrus"
"io"
"math/rand"
"plugin"
"time"
)
@@ -136,6 +137,18 @@ func (self *Router) RegisterXctrl(x xctrl.Xctrl) error {
return nil
}
func (self *Router) GetVersionInfo() common.VersionProvider {
return self.versionProvider
}
func (self *Router) GetConfig() *Config {
return self.config
}
func (self *Router) GetMetricsRegistry() metrics.UsageRegistry {
return self.metricsRegistry
}
func (self *Router) Start() error {
rand.Seed(info.NowInMilliseconds())
@@ -156,6 +169,10 @@ func (self *Router) Start() error {
return err
}
if err := self.registerPlugins(); err != nil {
return err
}
self.startXlinkDialers()
self.startXlinkListeners()
self.startXgressListeners()
@@ -266,6 +283,27 @@ func (self *Router) registerComponents() error {
return nil
}
func (self *Router) registerPlugins() error {
for _, pluginPath := range self.config.Plugins {
goPlugin, err := plugin.Open(pluginPath)
if err != nil {
return errors.Wrapf(err, "router unable to load plugin at path %v", pluginPath)
}
initializeSymbol, err := goPlugin.Lookup("Initialize")
if err != nil {
return errors.Wrapf(err, "router plugin at %v does not contain Initialize symbol", pluginPath)
}
initialize, ok := initializeSymbol.(func(*Router) error)
if !ok {
return errors.Errorf("router plugin at %v exports Initialize symbol, but it is not of type 'func(router *router.Router) error'", pluginPath)
}
if err := initialize(self); err != nil {
return errors.Wrapf(err, "error initializing router plugin at %v", pluginPath)
}
}
return nil
}
func (self *Router) startXlinkDialers() {
for _, lmap := range self.config.Link.Dialers {
binding := lmap["binding"].(string)