Plugins: Add support for ResourceConversion (#91977)

This commit is contained in:
Todd Treece
2024-08-15 16:02:21 -04:00
committed by GitHub
parent 28f2a4078d
commit e60b0aef83
40 changed files with 156 additions and 110 deletions
@@ -19,6 +19,7 @@ type corePlugin struct {
backend.QueryDataHandler
backend.StreamHandler
backend.AdmissionHandler
backend.ConversionHandler
}
// New returns a new backendplugin.PluginFactoryFunc for creating a core (built-in) backendplugin.Plugin.
@@ -143,10 +144,10 @@ func (cp *corePlugin) ValidateAdmission(ctx context.Context, req *backend.Admiss
return nil, plugins.ErrMethodNotImplemented
}
func (cp *corePlugin) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
func (cp *corePlugin) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if cp.AdmissionHandler != nil {
ctx = backend.WithGrafanaConfig(ctx, req.PluginContext.GrafanaConfig)
return cp.AdmissionHandler.ConvertObject(ctx, req)
return cp.ConversionHandler.ConvertObjects(ctx, req)
}
return nil, plugins.ErrMethodNotImplemented
}
@@ -34,6 +34,7 @@ var pluginSet = map[int]goplugin.PluginSet{
"data": &grpcplugin.DataGRPCPlugin{},
"stream": &grpcplugin.StreamGRPCPlugin{},
"admission": &grpcplugin.AdmissionGRPCPlugin{},
"conversion": &grpcplugin.ConversionGRPCPlugin{},
"renderer": &pluginextensionv2.RendererGRPCPlugin{},
"secretsmanager": &secretsmanagerplugin.SecretsManagerGRPCPlugin{},
},
@@ -26,6 +26,7 @@ type ProtoClient interface {
pluginv2.DiagnosticsClient
pluginv2.StreamClient
pluginv2.AdmissionControlClient
pluginv2.ResourceConversionClient
PID(context.Context) (string, error)
PluginID() string
@@ -202,10 +203,10 @@ func (r *protoClient) MutateAdmission(ctx context.Context, in *pluginv2.Admissio
return c.AdmissionClient.MutateAdmission(ctx, in, opts...)
}
func (r *protoClient) ConvertObject(ctx context.Context, in *pluginv2.ConversionRequest, opts ...grpc.CallOption) (*pluginv2.ConversionResponse, error) {
func (r *protoClient) ConvertObjects(ctx context.Context, in *pluginv2.ConversionRequest, opts ...grpc.CallOption) (*pluginv2.ConversionResponse, error) {
c, exists := r.client(ctx)
if !exists {
return nil, errClientNotStarted
}
return c.AdmissionClient.ConvertObject(ctx, in, opts...)
return c.ConversionClient.ConvertObjects(ctx, in, opts...)
}
@@ -25,6 +25,7 @@ type ClientV2 struct {
grpcplugin.DataClient
grpcplugin.StreamClient
grpcplugin.AdmissionClient
grpcplugin.ConversionClient
pluginextensionv2.RendererPlugin
secretsmanagerplugin.SecretsManagerPlugin
}
@@ -50,6 +51,11 @@ func newClientV2(descriptor PluginDescriptor, logger log.Logger, rpcClient plugi
return nil, err
}
rawConversion, err := rpcClient.Dispense("conversion")
if err != nil {
return nil, err
}
rawStream, err := rpcClient.Dispense("stream")
if err != nil {
return nil, err
@@ -90,6 +96,12 @@ func newClientV2(descriptor PluginDescriptor, logger log.Logger, rpcClient plugi
}
}
if rawConversion != nil {
if conversionClient, ok := rawConversion.(grpcplugin.ConversionClient); ok {
c.ConversionClient = conversionClient
}
}
if rawStream != nil {
if streamClient, ok := rawStream.(grpcplugin.StreamClient); ok {
c.StreamClient = streamClient
@@ -308,13 +320,13 @@ func (c *ClientV2) MutateAdmission(ctx context.Context, req *backend.AdmissionRe
return backend.FromProto().MutationResponse(protoResp), nil
}
func (c *ClientV2) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if c.AdmissionClient == nil {
func (c *ClientV2) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if c.ConversionClient == nil {
return nil, plugins.ErrMethodNotImplemented
}
protoReq := backend.ToProto().ConversionRequest(req)
protoResp, err := c.AdmissionClient.ConvertObject(ctx, protoReq)
protoResp, err := c.ConversionClient.ConvertObjects(ctx, protoReq)
if err != nil {
if status.Code(err) == codes.Unimplemented {
@@ -20,6 +20,7 @@ type pluginClient interface {
backend.QueryDataHandler
backend.CallResourceHandler
backend.AdmissionHandler
backend.ConversionHandler
backend.StreamHandler
}
@@ -217,10 +218,10 @@ func (p *grpcPlugin) MutateAdmission(ctx context.Context, request *backend.Admis
return pluginClient.MutateAdmission(ctx, request)
}
func (p *grpcPlugin) ConvertObject(ctx context.Context, request *backend.ConversionRequest) (*backend.ConversionResponse, error) {
func (p *grpcPlugin) ConvertObjects(ctx context.Context, request *backend.ConversionRequest) (*backend.ConversionResponse, error) {
pluginClient, ok := p.getPluginClient()
if !ok {
return nil, plugins.ErrPluginUnavailable
}
return pluginClient.ConvertObject(ctx, request)
return pluginClient.ConvertObjects(ctx, request)
}
+1
View File
@@ -24,6 +24,7 @@ type Plugin interface {
backend.QueryDataHandler
backend.CallResourceHandler
backend.AdmissionHandler
backend.ConversionHandler
backend.StreamHandler
}
+1
View File
@@ -91,6 +91,7 @@ type Client interface {
backend.CheckHealthHandler
backend.StreamHandler
backend.AdmissionHandler
backend.ConversionHandler
backend.CallResourceHandler
backend.CollectMetricsHandler
}
+2 -2
View File
@@ -218,7 +218,7 @@ func (s *Service) RunStream(ctx context.Context, req *backend.RunStreamRequest,
}
// ConvertObject implements plugins.Client.
func (s *Service) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
func (s *Service) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if req == nil {
return nil, errNilRequest
}
@@ -228,7 +228,7 @@ func (s *Service) ConvertObject(ctx context.Context, req *backend.ConversionRequ
return nil, plugins.ErrPluginNotRegistered
}
return plugin.ConvertObject(ctx, req)
return plugin.ConvertObjects(ctx, req)
}
// MutateAdmission implements plugins.Client.
@@ -29,7 +29,7 @@ type TestClient struct {
RunStreamFunc func(ctx context.Context, req *backend.RunStreamRequest, sender *backend.StreamSender) error
ValidateAdmissionFunc backend.ValidateAdmissionFunc
MutateAdmissionFunc backend.MutateAdmissionFunc
ConvertObjectFunc backend.ConvertObjectFunc
ConvertObjectsFunc backend.ConvertObjectsFunc
}
func (c *TestClient) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
@@ -101,9 +101,9 @@ func (c *TestClient) MutateAdmission(ctx context.Context, req *backend.Admission
return nil, nil
}
func (c *TestClient) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if c.ConvertObjectFunc != nil {
return c.ConvertObjectFunc(ctx, req)
func (c *TestClient) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if c.ConvertObjectsFunc != nil {
return c.ConvertObjectsFunc(ctx, req)
}
return nil, nil
}
@@ -119,7 +119,7 @@ type MiddlewareScenarioContext struct {
InstanceSettingsCallChain []string
ValidateAdmissionCallChain []string
MutateAdmissionCallChain []string
ConvertObjectCallChain []string
ConvertObjectsCallChain []string
}
func (ctx *MiddlewareScenarioContext) NewMiddleware(name string) plugins.ClientMiddleware {
@@ -173,10 +173,10 @@ func (m *TestMiddleware) MutateAdmission(ctx context.Context, req *backend.Admis
return res, err
}
func (m *TestMiddleware) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
m.sCtx.ConvertObjectCallChain = append(m.sCtx.ConvertObjectCallChain, fmt.Sprintf("before %s", m.Name))
res, err := m.next.ConvertObject(ctx, req)
m.sCtx.ConvertObjectCallChain = append(m.sCtx.ConvertObjectCallChain, fmt.Sprintf("after %s", m.Name))
func (m *TestMiddleware) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
m.sCtx.ConvertObjectsCallChain = append(m.sCtx.ConvertObjectsCallChain, fmt.Sprintf("before %s", m.Name))
res, err := m.next.ConvertObjects(ctx, req)
m.sCtx.ConvertObjectsCallChain = append(m.sCtx.ConvertObjectsCallChain, fmt.Sprintf("after %s", m.Name))
return res, err
}
+2 -2
View File
@@ -156,7 +156,7 @@ func (d *Decorator) MutateAdmission(ctx context.Context, req *backend.AdmissionR
return client.MutateAdmission(ctx, req)
}
func (d *Decorator) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
func (d *Decorator) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if req == nil {
return nil, errNilRequest
}
@@ -166,7 +166,7 @@ func (d *Decorator) ConvertObject(ctx context.Context, req *backend.ConversionRe
ctx = backend.WithUser(ctx, req.PluginContext.User)
client := clientFromMiddlewares(d.middlewares, d.client)
return client.ConvertObject(ctx, req)
return client.ConvertObjects(ctx, req)
}
func clientFromMiddlewares(middlewares []plugins.ClientMiddleware, finalClient plugins.Client) plugins.Client {
+2 -2
View File
@@ -239,9 +239,9 @@ func (m *TestMiddleware) MutateAdmission(ctx context.Context, req *backend.Admis
return res, err
}
func (m *TestMiddleware) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
func (m *TestMiddleware) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
m.sCtx.ConvertObjectCallChain = append(m.sCtx.ConvertObjectCallChain, fmt.Sprintf("before %s", m.Name))
res, err := m.next.ConvertObject(ctx, req)
res, err := m.next.ConvertObjects(ctx, req)
m.sCtx.ConvertObjectCallChain = append(m.sCtx.ConvertObjectCallChain, fmt.Sprintf("after %s", m.Name))
return res, err
}
+4 -4
View File
@@ -72,7 +72,7 @@ type FakePluginClient struct {
backend.CallResourceHandlerFunc
backend.MutateAdmissionFunc
backend.ValidateAdmissionFunc
backend.ConvertObjectFunc
backend.ConvertObjectsFunc
mutex sync.RWMutex
backendplugin.Plugin
@@ -185,9 +185,9 @@ func (pc *FakePluginClient) MutateAdmission(ctx context.Context, req *backend.Ad
return nil, plugins.ErrMethodNotImplemented
}
func (pc *FakePluginClient) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if pc.ConvertObjectFunc != nil {
return pc.ConvertObjectFunc(ctx, req)
func (pc *FakePluginClient) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
if pc.ConvertObjectsFunc != nil {
return pc.ConvertObjectsFunc(ctx, req)
}
return nil, plugins.ErrMethodNotImplemented
+4 -2
View File
@@ -76,6 +76,7 @@ var (
_ = backend.CallResourceHandler(&Plugin{})
_ = backend.StreamHandler(&Plugin{})
_ = backend.AdmissionHandler(&Plugin{})
_ = backend.ConversionHandler(&Plugin{})
)
type AngularMeta struct {
@@ -391,12 +392,12 @@ func (p *Plugin) MutateAdmission(ctx context.Context, req *backend.AdmissionRequ
}
// ConvertObject implements backend.AdmissionHandler.
func (p *Plugin) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
func (p *Plugin) ConvertObjects(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) {
pluginClient, ok := p.Client()
if !ok {
return nil, ErrPluginUnavailable
}
return pluginClient.ConvertObject(ctx, req)
return pluginClient.ConvertObjects(ctx, req)
}
func (p *Plugin) File(name string) (fs.File, error) {
@@ -458,6 +459,7 @@ type PluginClient interface {
backend.CheckHealthHandler
backend.CallResourceHandler
backend.AdmissionHandler
backend.ConversionHandler
backend.StreamHandler
}