mirror of
https://github.com/versity/versitygw.git
synced 2026-01-05 11:24:52 +00:00
Add support for plugin backends
This commit is contained in:
committed by
Gianmaria Del Monte
parent
63fd82654d
commit
9082d469e7
@@ -98,6 +98,7 @@ func main() {
|
|||||||
scoutfsCommand(),
|
scoutfsCommand(),
|
||||||
s3Command(),
|
s3Command(),
|
||||||
azureCommand(),
|
azureCommand(),
|
||||||
|
pluginCommand(),
|
||||||
adminCommand(),
|
adminCommand(),
|
||||||
testCommand(),
|
testCommand(),
|
||||||
utilsCommand(),
|
utilsCommand(),
|
||||||
|
|||||||
60
cmd/versitygw/plugin.go
Normal file
60
cmd/versitygw/plugin.go
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"plugin"
|
||||||
|
|
||||||
|
"github.com/urfave/cli/v2"
|
||||||
|
"github.com/versity/versitygw/plugins"
|
||||||
|
)
|
||||||
|
|
||||||
|
func pluginCommand() *cli.Command {
|
||||||
|
return &cli.Command{
|
||||||
|
Name: "plugin",
|
||||||
|
Usage: "load a backend from a plugin",
|
||||||
|
Description: "Runs a s3 gateway and redirects the requests to the backend defined in the plugin",
|
||||||
|
Action: runPluginBackend,
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "config",
|
||||||
|
Usage: "location of the config file",
|
||||||
|
Aliases: []string{"c"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func runPluginBackend(ctx *cli.Context) error {
|
||||||
|
if ctx.NArg() == 0 {
|
||||||
|
return fmt.Errorf("no plugin file provided to be loaded")
|
||||||
|
}
|
||||||
|
|
||||||
|
pluginPath := ctx.Args().Get(0)
|
||||||
|
config := ctx.String("config")
|
||||||
|
|
||||||
|
p, err := plugin.Open(pluginPath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
backendSymbol, err := p.Lookup("Backend")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
backendPluginPtr, ok := backendSymbol.(*plugins.BackendPlugin)
|
||||||
|
if !ok {
|
||||||
|
return errors.New("plugin is not of type *plugins.BackendPlugin")
|
||||||
|
}
|
||||||
|
|
||||||
|
if backendPluginPtr == nil {
|
||||||
|
return errors.New("variable Backend is nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
be, err := (*backendPluginPtr).New(config)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return runGateway(ctx.Context, be)
|
||||||
|
}
|
||||||
21
plugins/plugins.go
Normal file
21
plugins/plugins.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package plugins
|
||||||
|
|
||||||
|
import "github.com/versity/versitygw/backend"
|
||||||
|
|
||||||
|
// BackendPlugin defines an interface for creating backend
|
||||||
|
// implementation instances.
|
||||||
|
// Plugins implementing this interface can be built as shared
|
||||||
|
// libraries using Go's plugin system (to build use `go build -buildmode=plugin`).
|
||||||
|
// The shared library should export an instance of
|
||||||
|
// this interface in a variable named `Backend`.
|
||||||
|
type BackendPlugin interface {
|
||||||
|
// New creates and initializes a new backend.Backend instance.
|
||||||
|
// The config parameter specifies the path of the file containing
|
||||||
|
// the configuration for the backend.
|
||||||
|
//
|
||||||
|
// Implementations of this method should perform the necessary steps to
|
||||||
|
// establish a connection to the underlying storage system or service
|
||||||
|
// (e.g., network storage system, distributed storage system, cloud storage)
|
||||||
|
// and configure it according to the provided configuration.
|
||||||
|
New(config string) (backend.Backend, error)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user