karmada/pkg/search/proxy/framework/runtime/framework.go

52 lines
1.3 KiB
Go

package runtime
import (
"context"
"fmt"
"net/http"
"sort"
"github.com/karmada-io/karmada/pkg/search/proxy/framework"
)
// frameworkImpl select appropriate plugin to do `Connect()`
type frameworkImpl struct {
plugins []framework.Plugin
}
// frameworkImpl is actually a Proxy
var _ framework.Proxy = (*frameworkImpl)(nil)
// NewFramework create instance of framework.Proxy with determined order of Plugin.
func NewFramework(plugins []framework.Plugin) framework.Proxy {
sort.Slice(plugins, func(i, j int) bool {
return plugins[i].Order() < plugins[j].Order()
})
return &frameworkImpl{
plugins: plugins,
}
}
// Connect implements Proxy
func (c *frameworkImpl) Connect(ctx context.Context, request framework.ProxyRequest) (http.Handler, error) {
plugin, err := c.selectPlugin(request)
if err != nil {
return nil, err
}
return plugin.Connect(ctx, request)
}
// selectPlugin return an appropriate Plugin by query Plugin.SupportRequest in order.
func (c *frameworkImpl) selectPlugin(request framework.ProxyRequest) (framework.Plugin, error) {
for _, plugin := range c.plugins {
if plugin.SupportRequest(request) {
return plugin, nil
}
}
return nil, fmt.Errorf("no plugin found for request: %v %v",
request.RequestInfo.Verb, request.RequestInfo.Path)
}