From 67dd6672d994171a18f0c815142b5d8af5aff01e Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Tue, 2 Jul 2024 13:28:06 +0200 Subject: [PATCH 1/3] Remove apiVersion from root PluginContext --- backend/common.go | 3 --- backend/convert_from_protobuf.go | 1 - backend/convert_to_protobuf.go | 1 - 3 files changed, 5 deletions(-) diff --git a/backend/common.go b/backend/common.go index 659a87abe..7c103f1e5 100644 --- a/backend/common.go +++ b/backend/common.go @@ -202,9 +202,6 @@ type PluginContext struct { // UserAgent is the user agent of the Grafana server that initiated the gRPC request. // Will only be set if request is made from Grafana v10.2.0 or later. UserAgent *useragent.UserAgent - - // The requested API version - APIVersion string } func setCustomOptionsFromHTTPSettings(opts *httpclient.Options, httpSettings *HTTPSettings) { diff --git a/backend/convert_from_protobuf.go b/backend/convert_from_protobuf.go index 105f93887..c81dd6681 100644 --- a/backend/convert_from_protobuf.go +++ b/backend/convert_from_protobuf.go @@ -91,7 +91,6 @@ func (f ConvertFromProtobuf) PluginContext(proto *pluginv2.PluginContext) Plugin OrgID: proto.OrgId, PluginID: proto.PluginId, PluginVersion: proto.PluginVersion, - APIVersion: proto.ApiVersion, User: f.User(proto.User), AppInstanceSettings: f.AppInstanceSettings(proto.AppInstanceSettings), DataSourceInstanceSettings: f.DataSourceInstanceSettings(proto.DataSourceInstanceSettings, proto.PluginId), diff --git a/backend/convert_to_protobuf.go b/backend/convert_to_protobuf.go index a2f2a6ec7..522211096 100644 --- a/backend/convert_to_protobuf.go +++ b/backend/convert_to_protobuf.go @@ -125,7 +125,6 @@ func (t ConvertToProtobuf) PluginContext(pluginCtx PluginContext) *pluginv2.Plug OrgId: pluginCtx.OrgID, PluginId: pluginCtx.PluginID, PluginVersion: pluginCtx.PluginVersion, - ApiVersion: pluginCtx.APIVersion, User: t.User(pluginCtx.User), AppInstanceSettings: t.AppInstanceSettings(pluginCtx.AppInstanceSettings), DataSourceInstanceSettings: t.DataSourceInstanceSettings(pluginCtx.DataSourceInstanceSettings), From d8437bb59c71942a15e0861deaf4446a4a24b8f9 Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Tue, 2 Jul 2024 13:36:52 +0200 Subject: [PATCH 2/3] lint fix --- backend/convert_from_protobuf_test.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/backend/convert_from_protobuf_test.go b/backend/convert_from_protobuf_test.go index a9e15e68e..f3efae195 100644 --- a/backend/convert_from_protobuf_test.go +++ b/backend/convert_from_protobuf_test.go @@ -262,7 +262,6 @@ func TestConvertFromProtobufPluginContext(t *testing.T) { requireCounter.Equal(t, protoCtx.DataSourceInstanceSettings.ApiVersion, sdkCtx.DataSourceInstanceSettings.APIVersion) requireCounter.Equal(t, protoCtx.PluginId, sdkCtx.DataSourceInstanceSettings.Type) requireCounter.Equal(t, protoCtx.PluginVersion, sdkCtx.PluginVersion) - requireCounter.Equal(t, protoCtx.ApiVersion, sdkCtx.APIVersion) requireCounter.Equal(t, protoCtx.DataSourceInstanceSettings.Url, sdkCtx.DataSourceInstanceSettings.URL) requireCounter.Equal(t, protoCtx.DataSourceInstanceSettings.User, sdkCtx.DataSourceInstanceSettings.User) requireCounter.Equal(t, protoCtx.DataSourceInstanceSettings.Database, sdkCtx.DataSourceInstanceSettings.Database) @@ -404,7 +403,6 @@ func TestConvertFromProtobufQueryDataRequest(t *testing.T) { // PluginContext requireCounter.Equal(t, protoQDR.PluginContext.OrgId, sdkQDR.PluginContext.OrgID) requireCounter.Equal(t, protoQDR.PluginContext.PluginId, sdkQDR.PluginContext.PluginID) - requireCounter.Equal(t, protoQDR.PluginContext.ApiVersion, sdkQDR.PluginContext.APIVersion) // User requireCounter.Equal(t, protoQDR.PluginContext.User.Login, sdkQDR.PluginContext.User.Login) requireCounter.Equal(t, protoQDR.PluginContext.User.Name, sdkQDR.PluginContext.User.Name) @@ -573,7 +571,6 @@ func TestConvertFromProtobufAdmissionRequest(t *testing.T) { // PluginContext requireCounter.Equal(t, protoAR.PluginContext.OrgId, sdkAR.PluginContext.OrgID) requireCounter.Equal(t, protoAR.PluginContext.PluginId, sdkAR.PluginContext.PluginID) - requireCounter.Equal(t, protoAR.PluginContext.ApiVersion, sdkAR.PluginContext.APIVersion) // User requireCounter.Equal(t, protoAR.PluginContext.User.Login, sdkAR.PluginContext.User.Login) requireCounter.Equal(t, protoAR.PluginContext.User.Name, sdkAR.PluginContext.User.Name) From d6b3a3c5567d3adf767b688961a3960cde9e46d5 Mon Sep 17 00:00:00 2001 From: Andres Martinez Gotor Date: Tue, 2 Jul 2024 13:50:57 +0200 Subject: [PATCH 3/3] fixes --- backend/convert_from_protobuf_test.go | 3 +- genproto/pluginv2/backend.pb.go | 17 ++------- genproto/pluginv2/backend_grpc.pb.go | 54 ++++++++++++++++++--------- proto/backend.proto | 3 -- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/backend/convert_from_protobuf_test.go b/backend/convert_from_protobuf_test.go index f3efae195..b41f125a5 100644 --- a/backend/convert_from_protobuf_test.go +++ b/backend/convert_from_protobuf_test.go @@ -212,8 +212,7 @@ var protoPluginContext = &pluginv2.PluginContext{ GrafanaConfig: map[string]string{ "foo": "bar", }, - UserAgent: "Grafana/10.0.0 (linux; amd64)", - ApiVersion: "v0alpha1", + UserAgent: "Grafana/10.0.0 (linux; amd64)", } func TestConvertFromProtobufPluginContext(t *testing.T) { diff --git a/genproto/pluginv2/backend.pb.go b/genproto/pluginv2/backend.pb.go index f3ea3a5ed..01fd8062d 100644 --- a/genproto/pluginv2/backend.pb.go +++ b/genproto/pluginv2/backend.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: backend.proto @@ -533,8 +533,6 @@ type PluginContext struct { PluginVersion string `protobuf:"bytes,7,opt,name=pluginVersion,proto3" json:"pluginVersion,omitempty"` // The user agent of the Grafana server that initiated the gRPC request. UserAgent string `protobuf:"bytes,8,opt,name=userAgent,proto3" json:"userAgent,omitempty"` - // The API version that initiated a request - ApiVersion string `protobuf:"bytes,9,opt,name=apiVersion,proto3" json:"apiVersion,omitempty"` } func (x *PluginContext) Reset() { @@ -625,13 +623,6 @@ func (x *PluginContext) GetUserAgent() string { return "" } -func (x *PluginContext) GetApiVersion() string { - if x != nil { - return x.ApiVersion - } - return "" -} - type StringList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2398,7 +2389,7 @@ var file_backend_proto_rawDesc = []byte{ 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x94, 0x04, 0x0a, 0x0d, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0xf4, 0x03, 0x0a, 0x0d, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, @@ -2425,9 +2416,7 @@ var file_backend_proto_rawDesc = []byte{ 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x70, - 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x40, 0x0a, 0x12, 0x47, 0x72, + 0x09, 0x75, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x40, 0x0a, 0x12, 0x47, 0x72, 0x61, 0x66, 0x61, 0x6e, 0x61, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, diff --git a/genproto/pluginv2/backend_grpc.pb.go b/genproto/pluginv2/backend_grpc.pb.go index 553664ef6..eaae35aae 100644 --- a/genproto/pluginv2/backend_grpc.pb.go +++ b/genproto/pluginv2/backend_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 +// - protoc-gen-go-grpc v1.4.0 // - protoc (unknown) // source: backend.proto @@ -15,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 const ( Resource_CallResource_FullMethodName = "/pluginv2.Resource/CallResource" @@ -38,11 +38,12 @@ func NewResourceClient(cc grpc.ClientConnInterface) ResourceClient { } func (c *resourceClient) CallResource(ctx context.Context, in *CallResourceRequest, opts ...grpc.CallOption) (Resource_CallResourceClient, error) { - stream, err := c.cc.NewStream(ctx, &Resource_ServiceDesc.Streams[0], Resource_CallResource_FullMethodName, opts...) + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Resource_ServiceDesc.Streams[0], Resource_CallResource_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &resourceCallResourceClient{stream} + x := &resourceCallResourceClient{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -100,7 +101,7 @@ func _Resource_CallResource_Handler(srv interface{}, stream grpc.ServerStream) e if err := stream.RecvMsg(m); err != nil { return err } - return srv.(ResourceServer).CallResource(m, &resourceCallResourceServer{stream}) + return srv.(ResourceServer).CallResource(m, &resourceCallResourceServer{ServerStream: stream}) } type Resource_CallResourceServer interface { @@ -153,8 +154,9 @@ func NewDataClient(cc grpc.ClientConnInterface) DataClient { } func (c *dataClient) QueryData(ctx context.Context, in *QueryDataRequest, opts ...grpc.CallOption) (*QueryDataResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(QueryDataResponse) - err := c.cc.Invoke(ctx, Data_QueryData_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Data_QueryData_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -243,8 +245,9 @@ func NewDiagnosticsClient(cc grpc.ClientConnInterface) DiagnosticsClient { } func (c *diagnosticsClient) CheckHealth(ctx context.Context, in *CheckHealthRequest, opts ...grpc.CallOption) (*CheckHealthResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CheckHealthResponse) - err := c.cc.Invoke(ctx, Diagnostics_CheckHealth_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Diagnostics_CheckHealth_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -252,8 +255,9 @@ func (c *diagnosticsClient) CheckHealth(ctx context.Context, in *CheckHealthRequ } func (c *diagnosticsClient) CollectMetrics(ctx context.Context, in *CollectMetricsRequest, opts ...grpc.CallOption) (*CollectMetricsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CollectMetricsResponse) - err := c.cc.Invoke(ctx, Diagnostics_CollectMetrics_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Diagnostics_CollectMetrics_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -382,8 +386,9 @@ func NewStreamClient(cc grpc.ClientConnInterface) StreamClient { } func (c *streamClient) SubscribeStream(ctx context.Context, in *SubscribeStreamRequest, opts ...grpc.CallOption) (*SubscribeStreamResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(SubscribeStreamResponse) - err := c.cc.Invoke(ctx, Stream_SubscribeStream_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Stream_SubscribeStream_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -391,11 +396,12 @@ func (c *streamClient) SubscribeStream(ctx context.Context, in *SubscribeStreamR } func (c *streamClient) RunStream(ctx context.Context, in *RunStreamRequest, opts ...grpc.CallOption) (Stream_RunStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Stream_ServiceDesc.Streams[0], Stream_RunStream_FullMethodName, opts...) + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Stream_ServiceDesc.Streams[0], Stream_RunStream_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &streamRunStreamClient{stream} + x := &streamRunStreamClient{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -423,8 +429,9 @@ func (x *streamRunStreamClient) Recv() (*StreamPacket, error) { } func (c *streamClient) PublishStream(ctx context.Context, in *PublishStreamRequest, opts ...grpc.CallOption) (*PublishStreamResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(PublishStreamResponse) - err := c.cc.Invoke(ctx, Stream_PublishStream_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Stream_PublishStream_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -500,7 +507,7 @@ func _Stream_RunStream_Handler(srv interface{}, stream grpc.ServerStream) error if err := stream.RecvMsg(m); err != nil { return err } - return srv.(StreamServer).RunStream(m, &streamRunStreamServer{stream}) + return srv.(StreamServer).RunStream(m, &streamRunStreamServer{ServerStream: stream}) } type Stream_RunStreamServer interface { @@ -569,6 +576,11 @@ const ( // AdmissionControlClient is the client API for AdmissionControl service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// Admission control is a service based on the kubernetes admission webhook patterns. +// This service can be used to verify if objects are valid and convert between versions +// See: https://github.com/kubernetes/kubernetes/blob/v1.30.0/pkg/apis/admission/types.go#L41 +// And: https://github.com/grafana/grafana-app-sdk/blob/main/resource/admission.go#L14 type AdmissionControlClient interface { // Validate a resource -- the response is a simple yes/no ValidateAdmission(ctx context.Context, in *AdmissionRequest, opts ...grpc.CallOption) (*ValidationResponse, error) @@ -587,8 +599,9 @@ func NewAdmissionControlClient(cc grpc.ClientConnInterface) AdmissionControlClie } func (c *admissionControlClient) ValidateAdmission(ctx context.Context, in *AdmissionRequest, opts ...grpc.CallOption) (*ValidationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ValidationResponse) - err := c.cc.Invoke(ctx, AdmissionControl_ValidateAdmission_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, AdmissionControl_ValidateAdmission_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -596,8 +609,9 @@ func (c *admissionControlClient) ValidateAdmission(ctx context.Context, in *Admi } func (c *admissionControlClient) MutateAdmission(ctx context.Context, in *AdmissionRequest, opts ...grpc.CallOption) (*MutationResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(MutationResponse) - err := c.cc.Invoke(ctx, AdmissionControl_MutateAdmission_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, AdmissionControl_MutateAdmission_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -605,8 +619,9 @@ func (c *admissionControlClient) MutateAdmission(ctx context.Context, in *Admiss } func (c *admissionControlClient) ConvertObject(ctx context.Context, in *ConversionRequest, opts ...grpc.CallOption) (*ConversionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ConversionResponse) - err := c.cc.Invoke(ctx, AdmissionControl_ConvertObject_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, AdmissionControl_ConvertObject_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -616,6 +631,11 @@ func (c *admissionControlClient) ConvertObject(ctx context.Context, in *Conversi // AdmissionControlServer is the server API for AdmissionControl service. // All implementations should embed UnimplementedAdmissionControlServer // for forward compatibility +// +// Admission control is a service based on the kubernetes admission webhook patterns. +// This service can be used to verify if objects are valid and convert between versions +// See: https://github.com/kubernetes/kubernetes/blob/v1.30.0/pkg/apis/admission/types.go#L41 +// And: https://github.com/grafana/grafana-app-sdk/blob/main/resource/admission.go#L14 type AdmissionControlServer interface { // Validate a resource -- the response is a simple yes/no ValidateAdmission(context.Context, *AdmissionRequest) (*ValidationResponse, error) diff --git a/proto/backend.proto b/proto/backend.proto index e2f8da8d3..b72cf2b1c 100644 --- a/proto/backend.proto +++ b/proto/backend.proto @@ -81,9 +81,6 @@ message PluginContext { // The user agent of the Grafana server that initiated the gRPC request. string userAgent = 8; - - // The API version that initiated a request - string apiVersion = 9; } //---------------------------------------------------------