52 lines
1.3 KiB
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)
|
|
}
|