From 3651b72fe8cedb88be94835da75ded45464177b0 Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Tue, 29 Apr 2025 21:19:27 -0300 Subject: [PATCH 01/13] backend: initial add of v1 dataplane api proto and setup for security roles API --- backend/pkg/api/routes.go | 9 + .../redpanda/api/common/v1/errordetails.pb.go | 278 - .../redpanda/api/common/v1/linthint.pb.go | 177 - .../v1/dataplanev1connect/security.connect.go | 283 + .../dataplanev1connect/security.connect.gw.go | 71 + .../redpanda/api/dataplane/v1/security.pb.go | 1272 +++ .../api/dataplane/v1/security.pb.gw.go | 722 ++ .../api/dataplane/v1/security_grpc.pb.go | 330 + .../redpanda/api/common/v1/errordetails_pb.ts | 138 - .../redpanda/api/common/v1/linthint_pb.ts | 73 - .../security-SecurityService_connectquery.ts | 105 + .../api/dataplane/v1/security_connect.ts | 85 + .../redpanda/api/dataplane/v1/security_pb.ts | 795 ++ proto/gen/openapi/openapi.json | 7060 +---------------- proto/gen/openapi/openapi.yaml | 420 + .../redpanda/api/dataplane/v1/security.proto | 370 + 16 files changed, 4463 insertions(+), 7725 deletions(-) delete mode 100644 backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go delete mode 100644 backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.go create mode 100644 backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.gw.go create mode 100644 backend/pkg/protogen/redpanda/api/dataplane/v1/security_grpc.pb.go delete mode 100644 frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts delete mode 100644 frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/dataplane/v1/security-SecurityService_connectquery.ts create mode 100644 frontend/src/protogen/redpanda/api/dataplane/v1/security_connect.ts create mode 100644 frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts create mode 100644 proto/redpanda/api/dataplane/v1/security.proto diff --git a/backend/pkg/api/routes.go b/backend/pkg/api/routes.go index 5683c79dd5..bde5b0ffed 100644 --- a/backend/pkg/api/routes.go +++ b/backend/pkg/api/routes.go @@ -175,6 +175,7 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { dataplanev1connect.TransformServiceName: transformSvcV1, dataplanev1connect.KafkaConnectServiceName: kafkaConnectSvcV1, dataplanev1connect.CloudStorageServiceName: dataplanev1connect.UnimplementedCloudStorageServiceHandler{}, + dataplanev1connect.SecurityServiceName: dataplanev1connect.UnimplementedSecurityServiceHandler{}, }, }) @@ -284,6 +285,9 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { cloudStorageSvcPathV1, cloudStorageSvcHandlerV1 := dataplanev1connect.NewCloudStorageServiceHandler( hookOutput.Services[dataplanev1connect.CloudStorageServiceName].(dataplanev1connect.CloudStorageServiceHandler), connect.WithInterceptors(hookOutput.Interceptors...)) + securitySvcPathV1, securitySvcHandlerV1 := dataplanev1connect.NewSecurityServiceHandler( + hookOutput.Services[dataplanev1connect.SecurityServiceName].(dataplanev1connect.SecurityServiceHandler), + connect.WithInterceptors(hookOutput.Interceptors...)) ossServices := []ConnectService{ { @@ -406,6 +410,11 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { MountPath: consoleSecretsServicePath, Handler: consoleSecretsServiceHandler, }, + { + ServiceName: dataplanev1connect.SecurityServiceName, + MountPath: securitySvcPathV1, + Handler: securitySvcHandlerV1, + }, } // Order matters. OSS services first, so Enterprise handlers override OSS. diff --git a/backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go b/backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go deleted file mode 100644 index 8345fe3b1c..0000000000 --- a/backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go +++ /dev/null @@ -1,278 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.0 -// protoc (unknown) -// source: redpanda/api/common/v1/errordetails.proto - -package commonv1 - -import ( - reflect "reflect" - sync "sync" - - status "google.golang.org/genproto/googleapis/rpc/status" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - anypb "google.golang.org/protobuf/types/known/anypb" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// AttemptInfo contains information about retryable actions and their specific attempts. -type AttemptInfo struct { - state protoimpl.MessageState `protogen:"open.v1"` - Attempts []*AttemptInfo_Attempt `protobuf:"bytes,1,rep,name=attempts,proto3" json:"attempts,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *AttemptInfo) Reset() { - *x = AttemptInfo{} - mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *AttemptInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AttemptInfo) ProtoMessage() {} - -func (x *AttemptInfo) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AttemptInfo.ProtoReflect.Descriptor instead. -func (*AttemptInfo) Descriptor() ([]byte, []int) { - return file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP(), []int{0} -} - -func (x *AttemptInfo) GetAttempts() []*AttemptInfo_Attempt { - if x != nil { - return x.Attempts - } - return nil -} - -// ExternalError is an error that may be returned to external users. Other -// errors thrown by internal systems are discarded by default, so internal -// errors with sensitive information are not exposed. -type ExternalError struct { - state protoimpl.MessageState `protogen:"open.v1"` - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - Details []*anypb.Any `protobuf:"bytes,2,rep,name=details,proto3" json:"details,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ExternalError) Reset() { - *x = ExternalError{} - mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ExternalError) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ExternalError) ProtoMessage() {} - -func (x *ExternalError) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[1] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ExternalError.ProtoReflect.Descriptor instead. -func (*ExternalError) Descriptor() ([]byte, []int) { - return file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP(), []int{1} -} - -func (x *ExternalError) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -func (x *ExternalError) GetDetails() []*anypb.Any { - if x != nil { - return x.Details - } - return nil -} - -type AttemptInfo_Attempt struct { - state protoimpl.MessageState `protogen:"open.v1"` - Number int32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` - Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *AttemptInfo_Attempt) Reset() { - *x = AttemptInfo_Attempt{} - mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *AttemptInfo_Attempt) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AttemptInfo_Attempt) ProtoMessage() {} - -func (x *AttemptInfo_Attempt) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[2] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AttemptInfo_Attempt.ProtoReflect.Descriptor instead. -func (*AttemptInfo_Attempt) Descriptor() ([]byte, []int) { - return file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP(), []int{0, 0} -} - -func (x *AttemptInfo_Attempt) GetNumber() int32 { - if x != nil { - return x.Number - } - return 0 -} - -func (x *AttemptInfo_Attempt) GetStatus() *status.Status { - if x != nil { - return x.Status - } - return nil -} - -var File_redpanda_api_common_v1_errordetails_proto protoreflect.FileDescriptor - -var file_redpanda_api_common_v1_errordetails_proto_rawDesc = []byte{ - 0x0a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x72, 0x65, 0x64, - 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa5, 0x01, 0x0a, 0x0b, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x47, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, - 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x52, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, - 0x1a, 0x4d, 0x0a, 0x07, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x59, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, - 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x83, 0x02, 0x0a, 0x1a, 0x63, - 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x11, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x57, - 0x62, 0x75, 0x66, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, - 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x75, 0x66, - 0x66, 0x65, 0x72, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x43, 0xaa, 0x02, 0x16, - 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x16, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0xe2, - 0x02, 0x22, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, - 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_redpanda_api_common_v1_errordetails_proto_rawDescOnce sync.Once - file_redpanda_api_common_v1_errordetails_proto_rawDescData = file_redpanda_api_common_v1_errordetails_proto_rawDesc -) - -func file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP() []byte { - file_redpanda_api_common_v1_errordetails_proto_rawDescOnce.Do(func() { - file_redpanda_api_common_v1_errordetails_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_common_v1_errordetails_proto_rawDescData) - }) - return file_redpanda_api_common_v1_errordetails_proto_rawDescData -} - -var file_redpanda_api_common_v1_errordetails_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_redpanda_api_common_v1_errordetails_proto_goTypes = []any{ - (*AttemptInfo)(nil), // 0: redpanda.api.common.v1.AttemptInfo - (*ExternalError)(nil), // 1: redpanda.api.common.v1.ExternalError - (*AttemptInfo_Attempt)(nil), // 2: redpanda.api.common.v1.AttemptInfo.Attempt - (*anypb.Any)(nil), // 3: google.protobuf.Any - (*status.Status)(nil), // 4: google.rpc.Status -} -var file_redpanda_api_common_v1_errordetails_proto_depIdxs = []int32{ - 2, // 0: redpanda.api.common.v1.AttemptInfo.attempts:type_name -> redpanda.api.common.v1.AttemptInfo.Attempt - 3, // 1: redpanda.api.common.v1.ExternalError.details:type_name -> google.protobuf.Any - 4, // 2: redpanda.api.common.v1.AttemptInfo.Attempt.status:type_name -> google.rpc.Status - 3, // [3:3] is the sub-list for method output_type - 3, // [3:3] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name -} - -func init() { file_redpanda_api_common_v1_errordetails_proto_init() } -func file_redpanda_api_common_v1_errordetails_proto_init() { - if File_redpanda_api_common_v1_errordetails_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_redpanda_api_common_v1_errordetails_proto_rawDesc, - NumEnums: 0, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_redpanda_api_common_v1_errordetails_proto_goTypes, - DependencyIndexes: file_redpanda_api_common_v1_errordetails_proto_depIdxs, - MessageInfos: file_redpanda_api_common_v1_errordetails_proto_msgTypes, - }.Build() - File_redpanda_api_common_v1_errordetails_proto = out.File - file_redpanda_api_common_v1_errordetails_proto_rawDesc = nil - file_redpanda_api_common_v1_errordetails_proto_goTypes = nil - file_redpanda_api_common_v1_errordetails_proto_depIdxs = nil -} diff --git a/backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go b/backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go deleted file mode 100644 index f3f43a6506..0000000000 --- a/backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go +++ /dev/null @@ -1,177 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.0 -// protoc (unknown) -// source: redpanda/api/common/v1/linthint.proto - -package commonv1 - -import ( - reflect "reflect" - sync "sync" - - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// LintHint is a generic linting hint. -type LintHint struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Line number of the lint. - Line int32 `protobuf:"varint,1,opt,name=line,proto3" json:"line,omitempty"` - // Column number of the lint. - Column int32 `protobuf:"varint,2,opt,name=column,proto3" json:"column,omitempty"` - // The hint message. - Hint string `protobuf:"bytes,3,opt,name=hint,proto3" json:"hint,omitempty"` - // Optional lint type or enum. - LintType string `protobuf:"bytes,4,opt,name=lint_type,json=lintType,proto3" json:"lint_type,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *LintHint) Reset() { - *x = LintHint{} - mi := &file_redpanda_api_common_v1_linthint_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *LintHint) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LintHint) ProtoMessage() {} - -func (x *LintHint) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_common_v1_linthint_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LintHint.ProtoReflect.Descriptor instead. -func (*LintHint) Descriptor() ([]byte, []int) { - return file_redpanda_api_common_v1_linthint_proto_rawDescGZIP(), []int{0} -} - -func (x *LintHint) GetLine() int32 { - if x != nil { - return x.Line - } - return 0 -} - -func (x *LintHint) GetColumn() int32 { - if x != nil { - return x.Column - } - return 0 -} - -func (x *LintHint) GetHint() string { - if x != nil { - return x.Hint - } - return "" -} - -func (x *LintHint) GetLintType() string { - if x != nil { - return x.LintType - } - return "" -} - -var File_redpanda_api_common_v1_linthint_proto protoreflect.FileDescriptor - -var file_redpanda_api_common_v1_linthint_proto_rawDesc = []byte{ - 0x0a, 0x25, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x69, 0x6e, 0x74, 0x68, 0x69, 0x6e, - 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, - 0x67, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, - 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x69, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, - 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6c, 0x69, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0xff, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, - 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x4c, 0x69, 0x6e, 0x74, 0x68, 0x69, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x57, 0x62, 0x75, 0x66, 0x2e, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, - 0x6e, 0x64, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2f, 0x67, - 0x6f, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x76, - 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x43, 0xaa, 0x02, 0x16, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, - 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x31, - 0xca, 0x02, 0x16, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, - 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x22, 0x52, 0x65, 0x64, 0x70, - 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, - 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, - 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} - -var ( - file_redpanda_api_common_v1_linthint_proto_rawDescOnce sync.Once - file_redpanda_api_common_v1_linthint_proto_rawDescData = file_redpanda_api_common_v1_linthint_proto_rawDesc -) - -func file_redpanda_api_common_v1_linthint_proto_rawDescGZIP() []byte { - file_redpanda_api_common_v1_linthint_proto_rawDescOnce.Do(func() { - file_redpanda_api_common_v1_linthint_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_common_v1_linthint_proto_rawDescData) - }) - return file_redpanda_api_common_v1_linthint_proto_rawDescData -} - -var file_redpanda_api_common_v1_linthint_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_redpanda_api_common_v1_linthint_proto_goTypes = []any{ - (*LintHint)(nil), // 0: redpanda.api.common.v1.LintHint -} -var file_redpanda_api_common_v1_linthint_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_redpanda_api_common_v1_linthint_proto_init() } -func file_redpanda_api_common_v1_linthint_proto_init() { - if File_redpanda_api_common_v1_linthint_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_redpanda_api_common_v1_linthint_proto_rawDesc, - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_redpanda_api_common_v1_linthint_proto_goTypes, - DependencyIndexes: file_redpanda_api_common_v1_linthint_proto_depIdxs, - MessageInfos: file_redpanda_api_common_v1_linthint_proto_msgTypes, - }.Build() - File_redpanda_api_common_v1_linthint_proto = out.File - file_redpanda_api_common_v1_linthint_proto_rawDesc = nil - file_redpanda_api_common_v1_linthint_proto_goTypes = nil - file_redpanda_api_common_v1_linthint_proto_depIdxs = nil -} diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.go b/backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.go new file mode 100644 index 0000000000..b935a5da0e --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.go @@ -0,0 +1,283 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: redpanda/api/dataplane/v1/security.proto + +package dataplanev1connect + +import ( + context "context" + errors "errors" + http "net/http" + strings "strings" + + connect "connectrpc.com/connect" + + v1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // SecurityServiceName is the fully-qualified name of the SecurityService service. + SecurityServiceName = "redpanda.api.dataplane.v1.SecurityService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // SecurityServiceListRolesProcedure is the fully-qualified name of the SecurityService's ListRoles + // RPC. + SecurityServiceListRolesProcedure = "/redpanda.api.dataplane.v1.SecurityService/ListRoles" + // SecurityServiceCreateRoleProcedure is the fully-qualified name of the SecurityService's + // CreateRole RPC. + SecurityServiceCreateRoleProcedure = "/redpanda.api.dataplane.v1.SecurityService/CreateRole" + // SecurityServiceGetRoleProcedure is the fully-qualified name of the SecurityService's GetRole RPC. + SecurityServiceGetRoleProcedure = "/redpanda.api.dataplane.v1.SecurityService/GetRole" + // SecurityServiceDeleteRoleProcedure is the fully-qualified name of the SecurityService's + // DeleteRole RPC. + SecurityServiceDeleteRoleProcedure = "/redpanda.api.dataplane.v1.SecurityService/DeleteRole" + // SecurityServiceListRoleMembersProcedure is the fully-qualified name of the SecurityService's + // ListRoleMembers RPC. + SecurityServiceListRoleMembersProcedure = "/redpanda.api.dataplane.v1.SecurityService/ListRoleMembers" + // SecurityServiceUpdateRoleMembershipProcedure is the fully-qualified name of the SecurityService's + // UpdateRoleMembership RPC. + SecurityServiceUpdateRoleMembershipProcedure = "/redpanda.api.dataplane.v1.SecurityService/UpdateRoleMembership" +) + +// These variables are the protoreflect.Descriptor objects for the RPCs defined in this package. +var ( + securityServiceServiceDescriptor = v1.File_redpanda_api_dataplane_v1_security_proto.Services().ByName("SecurityService") + securityServiceListRolesMethodDescriptor = securityServiceServiceDescriptor.Methods().ByName("ListRoles") + securityServiceCreateRoleMethodDescriptor = securityServiceServiceDescriptor.Methods().ByName("CreateRole") + securityServiceGetRoleMethodDescriptor = securityServiceServiceDescriptor.Methods().ByName("GetRole") + securityServiceDeleteRoleMethodDescriptor = securityServiceServiceDescriptor.Methods().ByName("DeleteRole") + securityServiceListRoleMembersMethodDescriptor = securityServiceServiceDescriptor.Methods().ByName("ListRoleMembers") + securityServiceUpdateRoleMembershipMethodDescriptor = securityServiceServiceDescriptor.Methods().ByName("UpdateRoleMembership") +) + +// SecurityServiceClient is a client for the redpanda.api.dataplane.v1.SecurityService service. +type SecurityServiceClient interface { + // ListRoles lists all the roles based on optional filter. + ListRoles(context.Context, *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) + CreateRole(context.Context, *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) + // GetRole retrieves the specific role. + GetRole(context.Context, *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) + // DeleteRole deletes the role from the system. + DeleteRole(context.Context, *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) + // ListRoleMembership lists all the members assigned to a role based on optional filter. + ListRoleMembers(context.Context, *connect.Request[v1.ListRoleMembersRequest]) (*connect.Response[v1.ListRoleMembersResponse], error) + // UpdateRoleMembership updates role membership. + // Partially update role membership, adding or removing from a role + // ONLY those members listed in the “add” or “remove” fields, respectively. + // Adding a member that is already assigned to the role (or removing one that is not) is a no-op, + // and the rest of the members will be added and removed and reported. + UpdateRoleMembership(context.Context, *connect.Request[v1.UpdateRoleMembershipRequest]) (*connect.Response[v1.UpdateRoleMembershipResponse], error) +} + +// NewSecurityServiceClient constructs a client for the redpanda.api.dataplane.v1.SecurityService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewSecurityServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) SecurityServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + return &securityServiceClient{ + listRoles: connect.NewClient[v1.ListRolesRequest, v1.ListRolesResponse]( + httpClient, + baseURL+SecurityServiceListRolesProcedure, + connect.WithSchema(securityServiceListRolesMethodDescriptor), + connect.WithClientOptions(opts...), + ), + createRole: connect.NewClient[v1.CreateRoleRequest, v1.CreateRoleResponse]( + httpClient, + baseURL+SecurityServiceCreateRoleProcedure, + connect.WithSchema(securityServiceCreateRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + getRole: connect.NewClient[v1.GetRoleRequest, v1.GetRoleResponse]( + httpClient, + baseURL+SecurityServiceGetRoleProcedure, + connect.WithSchema(securityServiceGetRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + deleteRole: connect.NewClient[v1.DeleteRoleRequest, v1.DeleteRoleResponse]( + httpClient, + baseURL+SecurityServiceDeleteRoleProcedure, + connect.WithSchema(securityServiceDeleteRoleMethodDescriptor), + connect.WithClientOptions(opts...), + ), + listRoleMembers: connect.NewClient[v1.ListRoleMembersRequest, v1.ListRoleMembersResponse]( + httpClient, + baseURL+SecurityServiceListRoleMembersProcedure, + connect.WithSchema(securityServiceListRoleMembersMethodDescriptor), + connect.WithClientOptions(opts...), + ), + updateRoleMembership: connect.NewClient[v1.UpdateRoleMembershipRequest, v1.UpdateRoleMembershipResponse]( + httpClient, + baseURL+SecurityServiceUpdateRoleMembershipProcedure, + connect.WithSchema(securityServiceUpdateRoleMembershipMethodDescriptor), + connect.WithClientOptions(opts...), + ), + } +} + +// securityServiceClient implements SecurityServiceClient. +type securityServiceClient struct { + listRoles *connect.Client[v1.ListRolesRequest, v1.ListRolesResponse] + createRole *connect.Client[v1.CreateRoleRequest, v1.CreateRoleResponse] + getRole *connect.Client[v1.GetRoleRequest, v1.GetRoleResponse] + deleteRole *connect.Client[v1.DeleteRoleRequest, v1.DeleteRoleResponse] + listRoleMembers *connect.Client[v1.ListRoleMembersRequest, v1.ListRoleMembersResponse] + updateRoleMembership *connect.Client[v1.UpdateRoleMembershipRequest, v1.UpdateRoleMembershipResponse] +} + +// ListRoles calls redpanda.api.dataplane.v1.SecurityService.ListRoles. +func (c *securityServiceClient) ListRoles(ctx context.Context, req *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) { + return c.listRoles.CallUnary(ctx, req) +} + +// CreateRole calls redpanda.api.dataplane.v1.SecurityService.CreateRole. +func (c *securityServiceClient) CreateRole(ctx context.Context, req *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) { + return c.createRole.CallUnary(ctx, req) +} + +// GetRole calls redpanda.api.dataplane.v1.SecurityService.GetRole. +func (c *securityServiceClient) GetRole(ctx context.Context, req *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) { + return c.getRole.CallUnary(ctx, req) +} + +// DeleteRole calls redpanda.api.dataplane.v1.SecurityService.DeleteRole. +func (c *securityServiceClient) DeleteRole(ctx context.Context, req *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) { + return c.deleteRole.CallUnary(ctx, req) +} + +// ListRoleMembers calls redpanda.api.dataplane.v1.SecurityService.ListRoleMembers. +func (c *securityServiceClient) ListRoleMembers(ctx context.Context, req *connect.Request[v1.ListRoleMembersRequest]) (*connect.Response[v1.ListRoleMembersResponse], error) { + return c.listRoleMembers.CallUnary(ctx, req) +} + +// UpdateRoleMembership calls redpanda.api.dataplane.v1.SecurityService.UpdateRoleMembership. +func (c *securityServiceClient) UpdateRoleMembership(ctx context.Context, req *connect.Request[v1.UpdateRoleMembershipRequest]) (*connect.Response[v1.UpdateRoleMembershipResponse], error) { + return c.updateRoleMembership.CallUnary(ctx, req) +} + +// SecurityServiceHandler is an implementation of the redpanda.api.dataplane.v1.SecurityService +// service. +type SecurityServiceHandler interface { + // ListRoles lists all the roles based on optional filter. + ListRoles(context.Context, *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) + CreateRole(context.Context, *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) + // GetRole retrieves the specific role. + GetRole(context.Context, *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) + // DeleteRole deletes the role from the system. + DeleteRole(context.Context, *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) + // ListRoleMembership lists all the members assigned to a role based on optional filter. + ListRoleMembers(context.Context, *connect.Request[v1.ListRoleMembersRequest]) (*connect.Response[v1.ListRoleMembersResponse], error) + // UpdateRoleMembership updates role membership. + // Partially update role membership, adding or removing from a role + // ONLY those members listed in the “add” or “remove” fields, respectively. + // Adding a member that is already assigned to the role (or removing one that is not) is a no-op, + // and the rest of the members will be added and removed and reported. + UpdateRoleMembership(context.Context, *connect.Request[v1.UpdateRoleMembershipRequest]) (*connect.Response[v1.UpdateRoleMembershipResponse], error) +} + +// NewSecurityServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewSecurityServiceHandler(svc SecurityServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + securityServiceListRolesHandler := connect.NewUnaryHandler( + SecurityServiceListRolesProcedure, + svc.ListRoles, + connect.WithSchema(securityServiceListRolesMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + securityServiceCreateRoleHandler := connect.NewUnaryHandler( + SecurityServiceCreateRoleProcedure, + svc.CreateRole, + connect.WithSchema(securityServiceCreateRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + securityServiceGetRoleHandler := connect.NewUnaryHandler( + SecurityServiceGetRoleProcedure, + svc.GetRole, + connect.WithSchema(securityServiceGetRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + securityServiceDeleteRoleHandler := connect.NewUnaryHandler( + SecurityServiceDeleteRoleProcedure, + svc.DeleteRole, + connect.WithSchema(securityServiceDeleteRoleMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + securityServiceListRoleMembersHandler := connect.NewUnaryHandler( + SecurityServiceListRoleMembersProcedure, + svc.ListRoleMembers, + connect.WithSchema(securityServiceListRoleMembersMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + securityServiceUpdateRoleMembershipHandler := connect.NewUnaryHandler( + SecurityServiceUpdateRoleMembershipProcedure, + svc.UpdateRoleMembership, + connect.WithSchema(securityServiceUpdateRoleMembershipMethodDescriptor), + connect.WithHandlerOptions(opts...), + ) + return "/redpanda.api.dataplane.v1.SecurityService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case SecurityServiceListRolesProcedure: + securityServiceListRolesHandler.ServeHTTP(w, r) + case SecurityServiceCreateRoleProcedure: + securityServiceCreateRoleHandler.ServeHTTP(w, r) + case SecurityServiceGetRoleProcedure: + securityServiceGetRoleHandler.ServeHTTP(w, r) + case SecurityServiceDeleteRoleProcedure: + securityServiceDeleteRoleHandler.ServeHTTP(w, r) + case SecurityServiceListRoleMembersProcedure: + securityServiceListRoleMembersHandler.ServeHTTP(w, r) + case SecurityServiceUpdateRoleMembershipProcedure: + securityServiceUpdateRoleMembershipHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedSecurityServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedSecurityServiceHandler struct{} + +func (UnimplementedSecurityServiceHandler) ListRoles(context.Context, *connect.Request[v1.ListRolesRequest]) (*connect.Response[v1.ListRolesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1.SecurityService.ListRoles is not implemented")) +} + +func (UnimplementedSecurityServiceHandler) CreateRole(context.Context, *connect.Request[v1.CreateRoleRequest]) (*connect.Response[v1.CreateRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1.SecurityService.CreateRole is not implemented")) +} + +func (UnimplementedSecurityServiceHandler) GetRole(context.Context, *connect.Request[v1.GetRoleRequest]) (*connect.Response[v1.GetRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1.SecurityService.GetRole is not implemented")) +} + +func (UnimplementedSecurityServiceHandler) DeleteRole(context.Context, *connect.Request[v1.DeleteRoleRequest]) (*connect.Response[v1.DeleteRoleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1.SecurityService.DeleteRole is not implemented")) +} + +func (UnimplementedSecurityServiceHandler) ListRoleMembers(context.Context, *connect.Request[v1.ListRoleMembersRequest]) (*connect.Response[v1.ListRoleMembersResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1.SecurityService.ListRoleMembers is not implemented")) +} + +func (UnimplementedSecurityServiceHandler) UpdateRoleMembership(context.Context, *connect.Request[v1.UpdateRoleMembershipRequest]) (*connect.Response[v1.UpdateRoleMembershipResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("redpanda.api.dataplane.v1.SecurityService.UpdateRoleMembership is not implemented")) +} diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.gw.go b/backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.gw.go new file mode 100644 index 0000000000..54d107d8fc --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1/dataplanev1connect/security.connect.gw.go @@ -0,0 +1,71 @@ +// Code generated by protoc-gen-connect-gateway. DO NOT EDIT. +// +// Source: redpanda/api/dataplane/v1/security.proto + +package dataplanev1connect + +import ( + context "context" + fmt "fmt" + + runtime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + connect_gateway "go.vallahaye.net/connect-gateway" + + v1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" +) + +// SecurityServiceGatewayServer implements the gRPC server API for the SecurityService service. +type SecurityServiceGatewayServer struct { + v1.UnimplementedSecurityServiceServer + listRoles connect_gateway.UnaryHandler[v1.ListRolesRequest, v1.ListRolesResponse] + createRole connect_gateway.UnaryHandler[v1.CreateRoleRequest, v1.CreateRoleResponse] + getRole connect_gateway.UnaryHandler[v1.GetRoleRequest, v1.GetRoleResponse] + deleteRole connect_gateway.UnaryHandler[v1.DeleteRoleRequest, v1.DeleteRoleResponse] + listRoleMembers connect_gateway.UnaryHandler[v1.ListRoleMembersRequest, v1.ListRoleMembersResponse] + updateRoleMembership connect_gateway.UnaryHandler[v1.UpdateRoleMembershipRequest, v1.UpdateRoleMembershipResponse] +} + +// NewSecurityServiceGatewayServer constructs a Connect-Gateway gRPC server for the SecurityService +// service. +func NewSecurityServiceGatewayServer(svc SecurityServiceHandler, opts ...connect_gateway.HandlerOption) *SecurityServiceGatewayServer { + return &SecurityServiceGatewayServer{ + listRoles: connect_gateway.NewUnaryHandler(SecurityServiceListRolesProcedure, svc.ListRoles, opts...), + createRole: connect_gateway.NewUnaryHandler(SecurityServiceCreateRoleProcedure, svc.CreateRole, opts...), + getRole: connect_gateway.NewUnaryHandler(SecurityServiceGetRoleProcedure, svc.GetRole, opts...), + deleteRole: connect_gateway.NewUnaryHandler(SecurityServiceDeleteRoleProcedure, svc.DeleteRole, opts...), + listRoleMembers: connect_gateway.NewUnaryHandler(SecurityServiceListRoleMembersProcedure, svc.ListRoleMembers, opts...), + updateRoleMembership: connect_gateway.NewUnaryHandler(SecurityServiceUpdateRoleMembershipProcedure, svc.UpdateRoleMembership, opts...), + } +} + +func (s *SecurityServiceGatewayServer) ListRoles(ctx context.Context, req *v1.ListRolesRequest) (*v1.ListRolesResponse, error) { + return s.listRoles(ctx, req) +} + +func (s *SecurityServiceGatewayServer) CreateRole(ctx context.Context, req *v1.CreateRoleRequest) (*v1.CreateRoleResponse, error) { + return s.createRole(ctx, req) +} + +func (s *SecurityServiceGatewayServer) GetRole(ctx context.Context, req *v1.GetRoleRequest) (*v1.GetRoleResponse, error) { + return s.getRole(ctx, req) +} + +func (s *SecurityServiceGatewayServer) DeleteRole(ctx context.Context, req *v1.DeleteRoleRequest) (*v1.DeleteRoleResponse, error) { + return s.deleteRole(ctx, req) +} + +func (s *SecurityServiceGatewayServer) ListRoleMembers(ctx context.Context, req *v1.ListRoleMembersRequest) (*v1.ListRoleMembersResponse, error) { + return s.listRoleMembers(ctx, req) +} + +func (s *SecurityServiceGatewayServer) UpdateRoleMembership(ctx context.Context, req *v1.UpdateRoleMembershipRequest) (*v1.UpdateRoleMembershipResponse, error) { + return s.updateRoleMembership(ctx, req) +} + +// RegisterSecurityServiceHandlerGatewayServer registers the Connect handlers for the +// SecurityService "svc" to "mux". +func RegisterSecurityServiceHandlerGatewayServer(mux *runtime.ServeMux, svc SecurityServiceHandler, opts ...connect_gateway.HandlerOption) { + if err := v1.RegisterSecurityServiceHandlerServer(context.TODO(), mux, NewSecurityServiceGatewayServer(svc, opts...)); err != nil { + panic(fmt.Errorf("connect-gateway: %w", err)) + } +} diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go new file mode 100644 index 0000000000..3214f235f3 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go @@ -0,0 +1,1272 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/dataplane/v1/security.proto + +package dataplanev1 + +import ( + reflect "reflect" + sync "sync" + + _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" + _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + + _ "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/auth/v1" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Role defines a role in the system. +type Role struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The name of the role. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Role) Reset() { + *x = Role{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Role) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Role) ProtoMessage() {} + +func (x *Role) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Role.ProtoReflect.Descriptor instead. +func (*Role) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{0} +} + +func (x *Role) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// ListRolesRequest is the request for ListRoles. +type ListRolesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Optional filter. + Filter *ListRolesRequest_Filter `protobuf:"bytes,1,opt,name=filter,proto3,oneof" json:"filter,omitempty"` + // Page size. + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Value of the next_page_token field returned by the previous response. + // If not provided, the system assumes the first page is requested. + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRolesRequest) Reset() { + *x = ListRolesRequest{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRolesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRolesRequest) ProtoMessage() {} + +func (x *ListRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRolesRequest.ProtoReflect.Descriptor instead. +func (*ListRolesRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{1} +} + +func (x *ListRolesRequest) GetFilter() *ListRolesRequest_Filter { + if x != nil { + return x.Filter + } + return nil +} + +func (x *ListRolesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListRolesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// ListRolesResponse is the response for ListRoles. +type ListRolesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The roles in the system. + Roles []*Role `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + // Token to retrieve the next page. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRolesResponse) Reset() { + *x = ListRolesResponse{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRolesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRolesResponse) ProtoMessage() {} + +func (x *ListRolesResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRolesResponse.ProtoReflect.Descriptor instead. +func (*ListRolesResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{2} +} + +func (x *ListRolesResponse) GetRoles() []*Role { + if x != nil { + return x.Roles + } + return nil +} + +func (x *ListRolesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// CreateRoleRequest is the request for CreateRole. +type CreateRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role to create. + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRoleRequest) Reset() { + *x = CreateRoleRequest{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRoleRequest) ProtoMessage() {} + +func (x *CreateRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRoleRequest.ProtoReflect.Descriptor instead. +func (*CreateRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{3} +} + +func (x *CreateRoleRequest) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +// CreateRoleResponse is the response for CreateRole. +type CreateRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role. + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateRoleResponse) Reset() { + *x = CreateRoleResponse{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRoleResponse) ProtoMessage() {} + +func (x *CreateRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRoleResponse.ProtoReflect.Descriptor instead. +func (*CreateRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{4} +} + +func (x *CreateRoleResponse) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +// CreateRoleRequest is the request for CreateRole. +type GetRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role name. + RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRoleRequest) Reset() { + *x = GetRoleRequest{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoleRequest) ProtoMessage() {} + +func (x *GetRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoleRequest.ProtoReflect.Descriptor instead. +func (*GetRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{5} +} + +func (x *GetRoleRequest) GetRoleName() string { + if x != nil { + return x.RoleName + } + return "" +} + +// GetRoleResponse is the response to GetRole. +type GetRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The Role. + Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + // Members assigned to the role. + Members []*RoleMembership `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetRoleResponse) Reset() { + *x = GetRoleResponse{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRoleResponse) ProtoMessage() {} + +func (x *GetRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRoleResponse.ProtoReflect.Descriptor instead. +func (*GetRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{6} +} + +func (x *GetRoleResponse) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +func (x *GetRoleResponse) GetMembers() []*RoleMembership { + if x != nil { + return x.Members + } + return nil +} + +// DeleteRoleRequest is the request for DeleteRole. +type DeleteRoleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role name. + RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + // Whether to delete the ACLs bound to the role. + DeleteAcls bool `protobuf:"varint,2,opt,name=delete_acls,json=deleteAcls,proto3" json:"delete_acls,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRoleRequest) Reset() { + *x = DeleteRoleRequest{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRoleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRoleRequest) ProtoMessage() {} + +func (x *DeleteRoleRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRoleRequest.ProtoReflect.Descriptor instead. +func (*DeleteRoleRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{7} +} + +func (x *DeleteRoleRequest) GetRoleName() string { + if x != nil { + return x.RoleName + } + return "" +} + +func (x *DeleteRoleRequest) GetDeleteAcls() bool { + if x != nil { + return x.DeleteAcls + } + return false +} + +// DeleteRoleResponse is the response for DeleteRole. +type DeleteRoleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteRoleResponse) Reset() { + *x = DeleteRoleResponse{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteRoleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteRoleResponse) ProtoMessage() {} + +func (x *DeleteRoleResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteRoleResponse.ProtoReflect.Descriptor instead. +func (*DeleteRoleResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{8} +} + +// List role members for a role. That is user principals assigned to that role. +type ListRoleMembersRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role name. + RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + // Optional filter. + Filter *ListRoleMembersRequest_Filter `protobuf:"bytes,2,opt,name=filter,proto3,oneof" json:"filter,omitempty"` + // Page size. + PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Value of the next_page_token field returned by the previous response. + // If not provided, the system assumes the first page is requested. + PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoleMembersRequest) Reset() { + *x = ListRoleMembersRequest{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoleMembersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoleMembersRequest) ProtoMessage() {} + +func (x *ListRoleMembersRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoleMembersRequest.ProtoReflect.Descriptor instead. +func (*ListRoleMembersRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{9} +} + +func (x *ListRoleMembersRequest) GetRoleName() string { + if x != nil { + return x.RoleName + } + return "" +} + +func (x *ListRoleMembersRequest) GetFilter() *ListRoleMembersRequest_Filter { + if x != nil { + return x.Filter + } + return nil +} + +func (x *ListRoleMembersRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListRoleMembersRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// ListRoleMembersResponse is the response for ListRoleMembers. +type ListRoleMembersResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role name. + RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + // Members assigned to the role. + Members []*RoleMembership `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` + // Token to retrieve the next page. + NextPageToken string `protobuf:"bytes,3,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoleMembersResponse) Reset() { + *x = ListRoleMembersResponse{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoleMembersResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoleMembersResponse) ProtoMessage() {} + +func (x *ListRoleMembersResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoleMembersResponse.ProtoReflect.Descriptor instead. +func (*ListRoleMembersResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{10} +} + +func (x *ListRoleMembersResponse) GetRoleName() string { + if x != nil { + return x.RoleName + } + return "" +} + +func (x *ListRoleMembersResponse) GetMembers() []*RoleMembership { + if x != nil { + return x.Members + } + return nil +} + +func (x *ListRoleMembersResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// RoleMembership is the role membership. +type RoleMembership struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The name of the principal assigned to the role. + Principal string `protobuf:"bytes,1,opt,name=principal,proto3" json:"principal,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RoleMembership) Reset() { + *x = RoleMembership{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RoleMembership) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoleMembership) ProtoMessage() {} + +func (x *RoleMembership) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoleMembership.ProtoReflect.Descriptor instead. +func (*RoleMembership) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{11} +} + +func (x *RoleMembership) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +// UpdateRoleMembershipRequest is the request to UpdateRoleMembership. +type UpdateRoleMembershipRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role name. + RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + // Create the role if it doesn't already exist. + // If the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored. + Create bool `protobuf:"varint,2,opt,name=create,proto3" json:"create,omitempty"` + // Members to assign to the role. + Add []*RoleMembership `protobuf:"bytes,3,rep,name=add,proto3" json:"add,omitempty"` + // Members to remove from the role. + Remove []*RoleMembership `protobuf:"bytes,4,rep,name=remove,proto3" json:"remove,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRoleMembershipRequest) Reset() { + *x = UpdateRoleMembershipRequest{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRoleMembershipRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRoleMembershipRequest) ProtoMessage() {} + +func (x *UpdateRoleMembershipRequest) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRoleMembershipRequest.ProtoReflect.Descriptor instead. +func (*UpdateRoleMembershipRequest) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateRoleMembershipRequest) GetRoleName() string { + if x != nil { + return x.RoleName + } + return "" +} + +func (x *UpdateRoleMembershipRequest) GetCreate() bool { + if x != nil { + return x.Create + } + return false +} + +func (x *UpdateRoleMembershipRequest) GetAdd() []*RoleMembership { + if x != nil { + return x.Add + } + return nil +} + +func (x *UpdateRoleMembershipRequest) GetRemove() []*RoleMembership { + if x != nil { + return x.Remove + } + return nil +} + +// UpdateRoleMembershipResponse is the response for UpdateRoleMembership. +type UpdateRoleMembershipResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The role name. + RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + // Members assigned to the role. + Added []*RoleMembership `protobuf:"bytes,2,rep,name=added,proto3" json:"added,omitempty"` + // Members removed from the role. + Removed []*RoleMembership `protobuf:"bytes,3,rep,name=removed,proto3" json:"removed,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateRoleMembershipResponse) Reset() { + *x = UpdateRoleMembershipResponse{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateRoleMembershipResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRoleMembershipResponse) ProtoMessage() {} + +func (x *UpdateRoleMembershipResponse) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRoleMembershipResponse.ProtoReflect.Descriptor instead. +func (*UpdateRoleMembershipResponse) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{13} +} + +func (x *UpdateRoleMembershipResponse) GetRoleName() string { + if x != nil { + return x.RoleName + } + return "" +} + +func (x *UpdateRoleMembershipResponse) GetAdded() []*RoleMembership { + if x != nil { + return x.Added + } + return nil +} + +func (x *UpdateRoleMembershipResponse) GetRemoved() []*RoleMembership { + if x != nil { + return x.Removed + } + return nil +} + +// Filter options. +type ListRolesRequest_Filter struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Filter results only roles named with the prefix. + NamePrefix string `protobuf:"bytes,1,opt,name=name_prefix,json=namePrefix,proto3" json:"name_prefix,omitempty"` + // Filter results to only roles with names which contain the string. + NameContains string `protobuf:"bytes,2,opt,name=name_contains,json=nameContains,proto3" json:"name_contains,omitempty"` + // Return only roles assigned to this principal. + Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRolesRequest_Filter) Reset() { + *x = ListRolesRequest_Filter{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRolesRequest_Filter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRolesRequest_Filter) ProtoMessage() {} + +func (x *ListRolesRequest_Filter) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRolesRequest_Filter.ProtoReflect.Descriptor instead. +func (*ListRolesRequest_Filter) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{1, 0} +} + +func (x *ListRolesRequest_Filter) GetNamePrefix() string { + if x != nil { + return x.NamePrefix + } + return "" +} + +func (x *ListRolesRequest_Filter) GetNameContains() string { + if x != nil { + return x.NameContains + } + return "" +} + +func (x *ListRolesRequest_Filter) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +// Filter options. +type ListRoleMembersRequest_Filter struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Filter results to only members with names which contain the string. + NameContains string `protobuf:"bytes,1,opt,name=name_contains,json=nameContains,proto3" json:"name_contains,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoleMembersRequest_Filter) Reset() { + *x = ListRoleMembersRequest_Filter{} + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoleMembersRequest_Filter) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoleMembersRequest_Filter) ProtoMessage() {} + +func (x *ListRoleMembersRequest_Filter) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_dataplane_v1_security_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoleMembersRequest_Filter.ProtoReflect.Descriptor instead. +func (*ListRoleMembersRequest_Filter) Descriptor() ([]byte, []int) { + return file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP(), []int{9, 0} +} + +func (x *ListRoleMembersRequest_Filter) GetNameContains() string { + if x != nil { + return x.NameContains + } + return "" +} + +var File_redpanda_api_dataplane_v1_security_proto protoreflect.FileDescriptor + +var file_redpanda_api_dataplane_v1_security_proto_rawDesc = []byte{ + 0x0a, 0x28, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, + 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x28, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, + 0x75, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x33, 0x0a, 0x04, 0x52, 0x6f, + 0x6c, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x17, 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, + 0x08, 0x5e, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, + 0xe4, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13, 0xba, 0x48, 0x10, 0x1a, 0x0e, 0x18, + 0xe8, 0x07, 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0xa2, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x12, 0x35, 0x0a, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xba, 0x48, 0x11, 0x72, 0x0f, 0x18, 0x80, 0x01, + 0x32, 0x0a, 0x5e, 0x28, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2a, 0x29, 0x24, 0x52, 0x0a, 0x6e, 0x61, + 0x6d, 0x65, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x14, 0xba, 0x48, 0x11, 0x72, 0x0f, 0x18, 0x80, 0x01, 0x32, 0x0a, 0x5e, 0x28, 0x5b, 0x5e, 0x2c, + 0x3d, 0x5d, 0x2a, 0x29, 0x24, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0x18, 0x80, 0x01, + 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x5f, + 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x72, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x48, 0x0a, 0x11, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x33, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x49, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, + 0x46, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, + 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x72, + 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8b, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, + 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x12, 0x43, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x07, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x6a, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, + 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, + 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x63, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x63, 0x6c, + 0x73, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, + 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, + 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x55, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, + 0x30, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x13, 0xba, 0x48, 0x10, 0x1a, 0x0e, 0x18, 0xe8, 0x07, 0x28, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x1a, 0x37, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x0d, 0x6e, 0x61, + 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0x18, 0x80, 0x01, 0x52, 0x0c, 0x6e, 0x61, 0x6d, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x22, 0xa3, 0x01, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, + 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, + 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2e, 0x0a, 0x0e, 0x52, 0x6f, + 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x1c, 0x0a, 0x09, + 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x22, 0xeb, 0x01, 0x0a, 0x1b, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, + 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, + 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x52, 0x03, 0x61, 0x64, 0x64, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, + 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0xda, 0x01, 0x0a, 0x1c, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, + 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, 0x48, + 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, 0x5e, + 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x3f, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, + 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x07, 0x72, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x32, 0xcd, 0x0d, 0x0a, 0x0f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x91, 0x02, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xa8, 0x01, 0x92, 0x41, 0x8b, 0x01, 0x12, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x20, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x1a, 0x3e, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x2e, 0x20, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x3a, 0x20, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x20, 0x62, 0x61, 0x73, 0x65, 0x64, 0x20, 0x6f, 0x6e, 0x20, 0x72, 0x6f, 0x6c, + 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x63, + 0x69, 0x70, 0x61, 0x6c, 0x2e, 0x4a, 0x3d, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x36, 0x0a, 0x02, + 0x4f, 0x4b, 0x12, 0x30, 0x0a, 0x2e, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0xf5, 0x01, + 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x89, 0x01, 0x92, 0x41, 0x67, 0x12, + 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x1a, 0x0e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x4a, 0x48, 0x0a, 0x03, + 0x32, 0x30, 0x31, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x6f, 0x6c, 0x65, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x2f, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x11, 0x3a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x09, 0x2f, 0x76, 0x31, 0x2f, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x8c, 0x02, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x12, 0x29, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa9, 0x01, 0x92, 0x41, 0x80, 0x01, 0x12, + 0x08, 0x47, 0x65, 0x74, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x1a, 0x0b, 0x47, 0x65, 0x74, 0x20, 0x61, + 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, 0x4a, 0x3b, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x34, 0x0a, + 0x02, 0x4f, 0x4b, 0x12, 0x2e, 0x0a, 0x2c, 0x1a, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4a, 0x2a, 0x0a, 0x03, 0x34, 0x30, 0x34, 0x12, 0x23, 0x0a, 0x09, 0x4e, 0x6f, + 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x8a, + 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, + 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x83, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x97, 0x01, 0x92, 0x41, 0x6f, 0x12, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x52, + 0x6f, 0x6c, 0x65, 0x1a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x52, 0x6f, + 0x6c, 0x65, 0x2e, 0x4a, 0x24, 0x0a, 0x03, 0x32, 0x30, 0x34, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x6f, + 0x6c, 0x65, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x12, 0x00, 0x4a, 0x2a, 0x0a, 0x03, 0x34, 0x30, 0x34, + 0x12, 0x23, 0x0a, 0x09, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x16, 0x0a, + 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x17, 0x2a, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0xa5, 0x02, 0x0a, 0x0f, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x31, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xaa, 0x01, 0x92, 0x41, 0x7a, 0x12, 0x11, 0x4c, 0x69, 0x73, + 0x74, 0x20, 0x52, 0x6f, 0x6c, 0x65, 0x20, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x1a, 0x20, + 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, + 0x4a, 0x43, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x3c, 0x0a, 0x02, 0x4f, 0x4b, 0x12, 0x36, 0x0a, + 0x34, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x12, 0xc9, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, + 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x36, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, + 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbf, 0x01, 0x92, + 0x41, 0x93, 0x01, 0x12, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x52, 0x6f, 0x6c, 0x65, + 0x1a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x2e, + 0x4a, 0x48, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x41, 0x0a, 0x02, 0x4f, 0x4b, 0x12, 0x3b, 0x0a, + 0x39, 0x1a, 0x37, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, + 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x2a, 0x0a, 0x03, 0x34, 0x30, + 0x34, 0x12, 0x23, 0x0a, 0x09, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x16, + 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x1a, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x1a, 0x25, + 0x92, 0x41, 0x22, 0x0a, 0x08, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x20, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x20, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x2e, 0x42, 0x92, 0x02, 0x0a, 0x1d, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x5b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2d, 0x64, 0x61, + 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, 0x65, 0x6e, 0x2f, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x44, 0xaa, 0x02, 0x19, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, + 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x25, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, + 0x70, 0x69, 0x5c, 0x44, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1c, 0x52, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x44, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_redpanda_api_dataplane_v1_security_proto_rawDescOnce sync.Once + file_redpanda_api_dataplane_v1_security_proto_rawDescData = file_redpanda_api_dataplane_v1_security_proto_rawDesc +) + +func file_redpanda_api_dataplane_v1_security_proto_rawDescGZIP() []byte { + file_redpanda_api_dataplane_v1_security_proto_rawDescOnce.Do(func() { + file_redpanda_api_dataplane_v1_security_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_dataplane_v1_security_proto_rawDescData) + }) + return file_redpanda_api_dataplane_v1_security_proto_rawDescData +} + +var file_redpanda_api_dataplane_v1_security_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_redpanda_api_dataplane_v1_security_proto_goTypes = []any{ + (*Role)(nil), // 0: redpanda.api.dataplane.v1.Role + (*ListRolesRequest)(nil), // 1: redpanda.api.dataplane.v1.ListRolesRequest + (*ListRolesResponse)(nil), // 2: redpanda.api.dataplane.v1.ListRolesResponse + (*CreateRoleRequest)(nil), // 3: redpanda.api.dataplane.v1.CreateRoleRequest + (*CreateRoleResponse)(nil), // 4: redpanda.api.dataplane.v1.CreateRoleResponse + (*GetRoleRequest)(nil), // 5: redpanda.api.dataplane.v1.GetRoleRequest + (*GetRoleResponse)(nil), // 6: redpanda.api.dataplane.v1.GetRoleResponse + (*DeleteRoleRequest)(nil), // 7: redpanda.api.dataplane.v1.DeleteRoleRequest + (*DeleteRoleResponse)(nil), // 8: redpanda.api.dataplane.v1.DeleteRoleResponse + (*ListRoleMembersRequest)(nil), // 9: redpanda.api.dataplane.v1.ListRoleMembersRequest + (*ListRoleMembersResponse)(nil), // 10: redpanda.api.dataplane.v1.ListRoleMembersResponse + (*RoleMembership)(nil), // 11: redpanda.api.dataplane.v1.RoleMembership + (*UpdateRoleMembershipRequest)(nil), // 12: redpanda.api.dataplane.v1.UpdateRoleMembershipRequest + (*UpdateRoleMembershipResponse)(nil), // 13: redpanda.api.dataplane.v1.UpdateRoleMembershipResponse + (*ListRolesRequest_Filter)(nil), // 14: redpanda.api.dataplane.v1.ListRolesRequest.Filter + (*ListRoleMembersRequest_Filter)(nil), // 15: redpanda.api.dataplane.v1.ListRoleMembersRequest.Filter +} +var file_redpanda_api_dataplane_v1_security_proto_depIdxs = []int32{ + 14, // 0: redpanda.api.dataplane.v1.ListRolesRequest.filter:type_name -> redpanda.api.dataplane.v1.ListRolesRequest.Filter + 0, // 1: redpanda.api.dataplane.v1.ListRolesResponse.roles:type_name -> redpanda.api.dataplane.v1.Role + 0, // 2: redpanda.api.dataplane.v1.CreateRoleRequest.role:type_name -> redpanda.api.dataplane.v1.Role + 0, // 3: redpanda.api.dataplane.v1.CreateRoleResponse.role:type_name -> redpanda.api.dataplane.v1.Role + 0, // 4: redpanda.api.dataplane.v1.GetRoleResponse.role:type_name -> redpanda.api.dataplane.v1.Role + 11, // 5: redpanda.api.dataplane.v1.GetRoleResponse.members:type_name -> redpanda.api.dataplane.v1.RoleMembership + 15, // 6: redpanda.api.dataplane.v1.ListRoleMembersRequest.filter:type_name -> redpanda.api.dataplane.v1.ListRoleMembersRequest.Filter + 11, // 7: redpanda.api.dataplane.v1.ListRoleMembersResponse.members:type_name -> redpanda.api.dataplane.v1.RoleMembership + 11, // 8: redpanda.api.dataplane.v1.UpdateRoleMembershipRequest.add:type_name -> redpanda.api.dataplane.v1.RoleMembership + 11, // 9: redpanda.api.dataplane.v1.UpdateRoleMembershipRequest.remove:type_name -> redpanda.api.dataplane.v1.RoleMembership + 11, // 10: redpanda.api.dataplane.v1.UpdateRoleMembershipResponse.added:type_name -> redpanda.api.dataplane.v1.RoleMembership + 11, // 11: redpanda.api.dataplane.v1.UpdateRoleMembershipResponse.removed:type_name -> redpanda.api.dataplane.v1.RoleMembership + 1, // 12: redpanda.api.dataplane.v1.SecurityService.ListRoles:input_type -> redpanda.api.dataplane.v1.ListRolesRequest + 3, // 13: redpanda.api.dataplane.v1.SecurityService.CreateRole:input_type -> redpanda.api.dataplane.v1.CreateRoleRequest + 5, // 14: redpanda.api.dataplane.v1.SecurityService.GetRole:input_type -> redpanda.api.dataplane.v1.GetRoleRequest + 7, // 15: redpanda.api.dataplane.v1.SecurityService.DeleteRole:input_type -> redpanda.api.dataplane.v1.DeleteRoleRequest + 9, // 16: redpanda.api.dataplane.v1.SecurityService.ListRoleMembers:input_type -> redpanda.api.dataplane.v1.ListRoleMembersRequest + 12, // 17: redpanda.api.dataplane.v1.SecurityService.UpdateRoleMembership:input_type -> redpanda.api.dataplane.v1.UpdateRoleMembershipRequest + 2, // 18: redpanda.api.dataplane.v1.SecurityService.ListRoles:output_type -> redpanda.api.dataplane.v1.ListRolesResponse + 4, // 19: redpanda.api.dataplane.v1.SecurityService.CreateRole:output_type -> redpanda.api.dataplane.v1.CreateRoleResponse + 6, // 20: redpanda.api.dataplane.v1.SecurityService.GetRole:output_type -> redpanda.api.dataplane.v1.GetRoleResponse + 8, // 21: redpanda.api.dataplane.v1.SecurityService.DeleteRole:output_type -> redpanda.api.dataplane.v1.DeleteRoleResponse + 10, // 22: redpanda.api.dataplane.v1.SecurityService.ListRoleMembers:output_type -> redpanda.api.dataplane.v1.ListRoleMembersResponse + 13, // 23: redpanda.api.dataplane.v1.SecurityService.UpdateRoleMembership:output_type -> redpanda.api.dataplane.v1.UpdateRoleMembershipResponse + 18, // [18:24] is the sub-list for method output_type + 12, // [12:18] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name +} + +func init() { file_redpanda_api_dataplane_v1_security_proto_init() } +func file_redpanda_api_dataplane_v1_security_proto_init() { + if File_redpanda_api_dataplane_v1_security_proto != nil { + return + } + file_redpanda_api_dataplane_v1_security_proto_msgTypes[1].OneofWrappers = []any{} + file_redpanda_api_dataplane_v1_security_proto_msgTypes[9].OneofWrappers = []any{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_dataplane_v1_security_proto_rawDesc, + NumEnums: 0, + NumMessages: 16, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_redpanda_api_dataplane_v1_security_proto_goTypes, + DependencyIndexes: file_redpanda_api_dataplane_v1_security_proto_depIdxs, + MessageInfos: file_redpanda_api_dataplane_v1_security_proto_msgTypes, + }.Build() + File_redpanda_api_dataplane_v1_security_proto = out.File + file_redpanda_api_dataplane_v1_security_proto_rawDesc = nil + file_redpanda_api_dataplane_v1_security_proto_goTypes = nil + file_redpanda_api_dataplane_v1_security_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.gw.go b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.gw.go new file mode 100644 index 0000000000..416dc74376 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.gw.go @@ -0,0 +1,722 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: redpanda/api/dataplane/v1/security.proto + +/* +Package dataplanev1 is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package dataplanev1 + +import ( + "context" + "io" + "net/http" + + "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" + "github.com/grpc-ecosystem/grpc-gateway/v2/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = metadata.Join + +var ( + filter_SecurityService_ListRoles_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_SecurityService_ListRoles_0(ctx context.Context, marshaler runtime.Marshaler, client SecurityServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListRolesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SecurityService_ListRoles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SecurityService_ListRoles_0(ctx context.Context, marshaler runtime.Marshaler, server SecurityServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListRolesRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SecurityService_ListRoles_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListRoles(ctx, &protoReq) + return msg, metadata, err + +} + +func request_SecurityService_CreateRole_0(ctx context.Context, marshaler runtime.Marshaler, client SecurityServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateRoleRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Role); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CreateRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SecurityService_CreateRole_0(ctx context.Context, marshaler runtime.Marshaler, server SecurityServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq CreateRoleRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.Role); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CreateRole(ctx, &protoReq) + return msg, metadata, err + +} + +func request_SecurityService_GetRole_0(ctx context.Context, marshaler runtime.Marshaler, client SecurityServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetRoleRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + msg, err := client.GetRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SecurityService_GetRole_0(ctx context.Context, marshaler runtime.Marshaler, server SecurityServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetRoleRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + msg, err := server.GetRole(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_SecurityService_DeleteRole_0 = &utilities.DoubleArray{Encoding: map[string]int{"role_name": 0, "roleName": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} +) + +func request_SecurityService_DeleteRole_0(ctx context.Context, marshaler runtime.Marshaler, client SecurityServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteRoleRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SecurityService_DeleteRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DeleteRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SecurityService_DeleteRole_0(ctx context.Context, marshaler runtime.Marshaler, server SecurityServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq DeleteRoleRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SecurityService_DeleteRole_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.DeleteRole(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_SecurityService_ListRoleMembers_0 = &utilities.DoubleArray{Encoding: map[string]int{"role_name": 0, "roleName": 1}, Base: []int{1, 1, 2, 0, 0}, Check: []int{0, 1, 1, 2, 3}} +) + +func request_SecurityService_ListRoleMembers_0(ctx context.Context, marshaler runtime.Marshaler, client SecurityServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListRoleMembersRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SecurityService_ListRoleMembers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.ListRoleMembers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SecurityService_ListRoleMembers_0(ctx context.Context, marshaler runtime.Marshaler, server SecurityServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListRoleMembersRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_SecurityService_ListRoleMembers_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.ListRoleMembers(ctx, &protoReq) + return msg, metadata, err + +} + +func request_SecurityService_UpdateRoleMembership_0(ctx context.Context, marshaler runtime.Marshaler, client SecurityServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateRoleMembershipRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + msg, err := client.UpdateRoleMembership(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_SecurityService_UpdateRoleMembership_0(ctx context.Context, marshaler runtime.Marshaler, server SecurityServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UpdateRoleMembershipRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["role_name"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "role_name") + } + + protoReq.RoleName, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "role_name", err) + } + + msg, err := server.UpdateRoleMembership(ctx, &protoReq) + return msg, metadata, err + +} + +// RegisterSecurityServiceHandlerServer registers the http handlers for service SecurityService to "mux". +// UnaryRPC :call SecurityServiceServer directly. +// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterSecurityServiceHandlerFromEndpoint instead. +func RegisterSecurityServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server SecurityServiceServer) error { + + mux.Handle("GET", pattern_SecurityService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/ListRoles", runtime.WithHTTPPathPattern("/v1/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SecurityService_ListRoles_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_ListRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_SecurityService_CreateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/CreateRole", runtime.WithHTTPPathPattern("/v1/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SecurityService_CreateRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_CreateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_SecurityService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/GetRole", runtime.WithHTTPPathPattern("/v1/roles/{role_name}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SecurityService_GetRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_GetRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_SecurityService_DeleteRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/DeleteRole", runtime.WithHTTPPathPattern("/v1/roles/{role_name}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SecurityService_DeleteRole_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_DeleteRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_SecurityService_ListRoleMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/ListRoleMembers", runtime.WithHTTPPathPattern("/v1/roles/{role_name}/members")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SecurityService_ListRoleMembers_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_ListRoleMembers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_SecurityService_UpdateRoleMembership_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/UpdateRoleMembership", runtime.WithHTTPPathPattern("/v1/roles/{role_name}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_SecurityService_UpdateRoleMembership_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_UpdateRoleMembership_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterSecurityServiceHandlerFromEndpoint is same as RegisterSecurityServiceHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterSecurityServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.DialContext(ctx, endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterSecurityServiceHandler(ctx, mux, conn) +} + +// RegisterSecurityServiceHandler registers the http handlers for service SecurityService to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterSecurityServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterSecurityServiceHandlerClient(ctx, mux, NewSecurityServiceClient(conn)) +} + +// RegisterSecurityServiceHandlerClient registers the http handlers for service SecurityService +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "SecurityServiceClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "SecurityServiceClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "SecurityServiceClient" to call the correct interceptors. +func RegisterSecurityServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client SecurityServiceClient) error { + + mux.Handle("GET", pattern_SecurityService_ListRoles_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/ListRoles", runtime.WithHTTPPathPattern("/v1/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SecurityService_ListRoles_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_ListRoles_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("POST", pattern_SecurityService_CreateRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/CreateRole", runtime.WithHTTPPathPattern("/v1/roles")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SecurityService_CreateRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_CreateRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_SecurityService_GetRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/GetRole", runtime.WithHTTPPathPattern("/v1/roles/{role_name}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SecurityService_GetRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_GetRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("DELETE", pattern_SecurityService_DeleteRole_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/DeleteRole", runtime.WithHTTPPathPattern("/v1/roles/{role_name}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SecurityService_DeleteRole_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_DeleteRole_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_SecurityService_ListRoleMembers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/ListRoleMembers", runtime.WithHTTPPathPattern("/v1/roles/{role_name}/members")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SecurityService_ListRoleMembers_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_ListRoleMembers_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("PUT", pattern_SecurityService_UpdateRoleMembership_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/redpanda.api.dataplane.v1.SecurityService/UpdateRoleMembership", runtime.WithHTTPPathPattern("/v1/roles/{role_name}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_SecurityService_UpdateRoleMembership_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_SecurityService_UpdateRoleMembership_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_SecurityService_ListRoles_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "roles"}, "")) + + pattern_SecurityService_CreateRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "roles"}, "")) + + pattern_SecurityService_GetRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "roles", "role_name"}, "")) + + pattern_SecurityService_DeleteRole_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "roles", "role_name"}, "")) + + pattern_SecurityService_ListRoleMembers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2, 2, 3}, []string{"v1", "roles", "role_name", "members"}, "")) + + pattern_SecurityService_UpdateRoleMembership_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "roles", "role_name"}, "")) +) + +var ( + forward_SecurityService_ListRoles_0 = runtime.ForwardResponseMessage + + forward_SecurityService_CreateRole_0 = runtime.ForwardResponseMessage + + forward_SecurityService_GetRole_0 = runtime.ForwardResponseMessage + + forward_SecurityService_DeleteRole_0 = runtime.ForwardResponseMessage + + forward_SecurityService_ListRoleMembers_0 = runtime.ForwardResponseMessage + + forward_SecurityService_UpdateRoleMembership_0 = runtime.ForwardResponseMessage +) diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1/security_grpc.pb.go b/backend/pkg/protogen/redpanda/api/dataplane/v1/security_grpc.pb.go new file mode 100644 index 0000000000..c67d65d9d5 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1/security_grpc.pb.go @@ -0,0 +1,330 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: redpanda/api/dataplane/v1/security.proto + +package dataplanev1 + +import ( + context "context" + + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// 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.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + SecurityService_ListRoles_FullMethodName = "/redpanda.api.dataplane.v1.SecurityService/ListRoles" + SecurityService_CreateRole_FullMethodName = "/redpanda.api.dataplane.v1.SecurityService/CreateRole" + SecurityService_GetRole_FullMethodName = "/redpanda.api.dataplane.v1.SecurityService/GetRole" + SecurityService_DeleteRole_FullMethodName = "/redpanda.api.dataplane.v1.SecurityService/DeleteRole" + SecurityService_ListRoleMembers_FullMethodName = "/redpanda.api.dataplane.v1.SecurityService/ListRoleMembers" + SecurityService_UpdateRoleMembership_FullMethodName = "/redpanda.api.dataplane.v1.SecurityService/UpdateRoleMembership" +) + +// SecurityServiceClient is the client API for SecurityService 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. +type SecurityServiceClient interface { + // ListRoles lists all the roles based on optional filter. + ListRoles(ctx context.Context, in *ListRolesRequest, opts ...grpc.CallOption) (*ListRolesResponse, error) + CreateRole(ctx context.Context, in *CreateRoleRequest, opts ...grpc.CallOption) (*CreateRoleResponse, error) + // GetRole retrieves the specific role. + GetRole(ctx context.Context, in *GetRoleRequest, opts ...grpc.CallOption) (*GetRoleResponse, error) + // DeleteRole deletes the role from the system. + DeleteRole(ctx context.Context, in *DeleteRoleRequest, opts ...grpc.CallOption) (*DeleteRoleResponse, error) + // ListRoleMembership lists all the members assigned to a role based on optional filter. + ListRoleMembers(ctx context.Context, in *ListRoleMembersRequest, opts ...grpc.CallOption) (*ListRoleMembersResponse, error) + // UpdateRoleMembership updates role membership. + // Partially update role membership, adding or removing from a role + // ONLY those members listed in the “add” or “remove” fields, respectively. + // Adding a member that is already assigned to the role (or removing one that is not) is a no-op, + // and the rest of the members will be added and removed and reported. + UpdateRoleMembership(ctx context.Context, in *UpdateRoleMembershipRequest, opts ...grpc.CallOption) (*UpdateRoleMembershipResponse, error) +} + +type securityServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewSecurityServiceClient(cc grpc.ClientConnInterface) SecurityServiceClient { + return &securityServiceClient{cc} +} + +func (c *securityServiceClient) ListRoles(ctx context.Context, in *ListRolesRequest, opts ...grpc.CallOption) (*ListRolesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRolesResponse) + err := c.cc.Invoke(ctx, SecurityService_ListRoles_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *securityServiceClient) CreateRole(ctx context.Context, in *CreateRoleRequest, opts ...grpc.CallOption) (*CreateRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CreateRoleResponse) + err := c.cc.Invoke(ctx, SecurityService_CreateRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *securityServiceClient) GetRole(ctx context.Context, in *GetRoleRequest, opts ...grpc.CallOption) (*GetRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetRoleResponse) + err := c.cc.Invoke(ctx, SecurityService_GetRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *securityServiceClient) DeleteRole(ctx context.Context, in *DeleteRoleRequest, opts ...grpc.CallOption) (*DeleteRoleResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DeleteRoleResponse) + err := c.cc.Invoke(ctx, SecurityService_DeleteRole_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *securityServiceClient) ListRoleMembers(ctx context.Context, in *ListRoleMembersRequest, opts ...grpc.CallOption) (*ListRoleMembersResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRoleMembersResponse) + err := c.cc.Invoke(ctx, SecurityService_ListRoleMembers_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *securityServiceClient) UpdateRoleMembership(ctx context.Context, in *UpdateRoleMembershipRequest, opts ...grpc.CallOption) (*UpdateRoleMembershipResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UpdateRoleMembershipResponse) + err := c.cc.Invoke(ctx, SecurityService_UpdateRoleMembership_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// SecurityServiceServer is the server API for SecurityService service. +// All implementations must embed UnimplementedSecurityServiceServer +// for forward compatibility. +type SecurityServiceServer interface { + // ListRoles lists all the roles based on optional filter. + ListRoles(context.Context, *ListRolesRequest) (*ListRolesResponse, error) + CreateRole(context.Context, *CreateRoleRequest) (*CreateRoleResponse, error) + // GetRole retrieves the specific role. + GetRole(context.Context, *GetRoleRequest) (*GetRoleResponse, error) + // DeleteRole deletes the role from the system. + DeleteRole(context.Context, *DeleteRoleRequest) (*DeleteRoleResponse, error) + // ListRoleMembership lists all the members assigned to a role based on optional filter. + ListRoleMembers(context.Context, *ListRoleMembersRequest) (*ListRoleMembersResponse, error) + // UpdateRoleMembership updates role membership. + // Partially update role membership, adding or removing from a role + // ONLY those members listed in the “add” or “remove” fields, respectively. + // Adding a member that is already assigned to the role (or removing one that is not) is a no-op, + // and the rest of the members will be added and removed and reported. + UpdateRoleMembership(context.Context, *UpdateRoleMembershipRequest) (*UpdateRoleMembershipResponse, error) + mustEmbedUnimplementedSecurityServiceServer() +} + +// UnimplementedSecurityServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedSecurityServiceServer struct{} + +func (UnimplementedSecurityServiceServer) ListRoles(context.Context, *ListRolesRequest) (*ListRolesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRoles not implemented") +} +func (UnimplementedSecurityServiceServer) CreateRole(context.Context, *CreateRoleRequest) (*CreateRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateRole not implemented") +} +func (UnimplementedSecurityServiceServer) GetRole(context.Context, *GetRoleRequest) (*GetRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRole not implemented") +} +func (UnimplementedSecurityServiceServer) DeleteRole(context.Context, *DeleteRoleRequest) (*DeleteRoleResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteRole not implemented") +} +func (UnimplementedSecurityServiceServer) ListRoleMembers(context.Context, *ListRoleMembersRequest) (*ListRoleMembersResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRoleMembers not implemented") +} +func (UnimplementedSecurityServiceServer) UpdateRoleMembership(context.Context, *UpdateRoleMembershipRequest) (*UpdateRoleMembershipResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateRoleMembership not implemented") +} +func (UnimplementedSecurityServiceServer) mustEmbedUnimplementedSecurityServiceServer() {} +func (UnimplementedSecurityServiceServer) testEmbeddedByValue() {} + +// UnsafeSecurityServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to SecurityServiceServer will +// result in compilation errors. +type UnsafeSecurityServiceServer interface { + mustEmbedUnimplementedSecurityServiceServer() +} + +func RegisterSecurityServiceServer(s grpc.ServiceRegistrar, srv SecurityServiceServer) { + // If the following call pancis, it indicates UnimplementedSecurityServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&SecurityService_ServiceDesc, srv) +} + +func _SecurityService_ListRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRolesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SecurityServiceServer).ListRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SecurityService_ListRoles_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SecurityServiceServer).ListRoles(ctx, req.(*ListRolesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SecurityService_CreateRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SecurityServiceServer).CreateRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SecurityService_CreateRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SecurityServiceServer).CreateRole(ctx, req.(*CreateRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SecurityService_GetRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SecurityServiceServer).GetRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SecurityService_GetRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SecurityServiceServer).GetRole(ctx, req.(*GetRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SecurityService_DeleteRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteRoleRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SecurityServiceServer).DeleteRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SecurityService_DeleteRole_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SecurityServiceServer).DeleteRole(ctx, req.(*DeleteRoleRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SecurityService_ListRoleMembers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRoleMembersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SecurityServiceServer).ListRoleMembers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SecurityService_ListRoleMembers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SecurityServiceServer).ListRoleMembers(ctx, req.(*ListRoleMembersRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _SecurityService_UpdateRoleMembership_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRoleMembershipRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SecurityServiceServer).UpdateRoleMembership(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SecurityService_UpdateRoleMembership_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SecurityServiceServer).UpdateRoleMembership(ctx, req.(*UpdateRoleMembershipRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// SecurityService_ServiceDesc is the grpc.ServiceDesc for SecurityService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var SecurityService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "redpanda.api.dataplane.v1.SecurityService", + HandlerType: (*SecurityServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "ListRoles", + Handler: _SecurityService_ListRoles_Handler, + }, + { + MethodName: "CreateRole", + Handler: _SecurityService_CreateRole_Handler, + }, + { + MethodName: "GetRole", + Handler: _SecurityService_GetRole_Handler, + }, + { + MethodName: "DeleteRole", + Handler: _SecurityService_DeleteRole_Handler, + }, + { + MethodName: "ListRoleMembers", + Handler: _SecurityService_ListRoleMembers_Handler, + }, + { + MethodName: "UpdateRoleMembership", + Handler: _SecurityService_UpdateRoleMembership_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "redpanda/api/dataplane/v1/security.proto", +} diff --git a/frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts b/frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts deleted file mode 100644 index a56094450b..0000000000 --- a/frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts +++ /dev/null @@ -1,138 +0,0 @@ -// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" -// @generated from file redpanda/api/common/v1/errordetails.proto (package redpanda.api.common.v1, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Any, Message, proto3 } from "@bufbuild/protobuf"; -import { Status } from "../../../../google/rpc/status_pb"; - -/** - * AttemptInfo contains information about retryable actions and their specific attempts. - * - * @generated from message redpanda.api.common.v1.AttemptInfo - */ -export class AttemptInfo extends Message { - /** - * @generated from field: repeated redpanda.api.common.v1.AttemptInfo.Attempt attempts = 1; - */ - attempts: AttemptInfo_Attempt[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.common.v1.AttemptInfo"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "attempts", kind: "message", T: AttemptInfo_Attempt, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AttemptInfo { - return new AttemptInfo().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AttemptInfo { - return new AttemptInfo().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AttemptInfo { - return new AttemptInfo().fromJsonString(jsonString, options); - } - - static equals(a: AttemptInfo | PlainMessage | undefined, b: AttemptInfo | PlainMessage | undefined): boolean { - return proto3.util.equals(AttemptInfo, a, b); - } -} - -/** - * @generated from message redpanda.api.common.v1.AttemptInfo.Attempt - */ -export class AttemptInfo_Attempt extends Message { - /** - * @generated from field: int32 number = 1; - */ - number = 0; - - /** - * @generated from field: google.rpc.Status status = 2; - */ - status?: Status; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.common.v1.AttemptInfo.Attempt"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "number", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 2, name: "status", kind: "message", T: Status }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): AttemptInfo_Attempt { - return new AttemptInfo_Attempt().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): AttemptInfo_Attempt { - return new AttemptInfo_Attempt().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): AttemptInfo_Attempt { - return new AttemptInfo_Attempt().fromJsonString(jsonString, options); - } - - static equals(a: AttemptInfo_Attempt | PlainMessage | undefined, b: AttemptInfo_Attempt | PlainMessage | undefined): boolean { - return proto3.util.equals(AttemptInfo_Attempt, a, b); - } -} - -/** - * ExternalError is an error that may be returned to external users. Other - * errors thrown by internal systems are discarded by default, so internal - * errors with sensitive information are not exposed. - * - * @generated from message redpanda.api.common.v1.ExternalError - */ -export class ExternalError extends Message { - /** - * @generated from field: string message = 1; - */ - message = ""; - - /** - * @generated from field: repeated google.protobuf.Any details = 2; - */ - details: Any[] = []; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.common.v1.ExternalError"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "message", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "details", kind: "message", T: Any, repeated: true }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ExternalError { - return new ExternalError().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ExternalError { - return new ExternalError().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ExternalError { - return new ExternalError().fromJsonString(jsonString, options); - } - - static equals(a: ExternalError | PlainMessage | undefined, b: ExternalError | PlainMessage | undefined): boolean { - return proto3.util.equals(ExternalError, a, b); - } -} - diff --git a/frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts b/frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts deleted file mode 100644 index 1135f6e0cd..0000000000 --- a/frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts +++ /dev/null @@ -1,73 +0,0 @@ -// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" -// @generated from file redpanda/api/common/v1/linthint.proto (package redpanda.api.common.v1, syntax proto3) -/* eslint-disable */ -// @ts-nocheck - -import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; -import { Message, proto3 } from "@bufbuild/protobuf"; - -/** - * LintHint is a generic linting hint. - * - * @generated from message redpanda.api.common.v1.LintHint - */ -export class LintHint extends Message { - /** - * Line number of the lint. - * - * @generated from field: int32 line = 1; - */ - line = 0; - - /** - * Column number of the lint. - * - * @generated from field: int32 column = 2; - */ - column = 0; - - /** - * The hint message. - * - * @generated from field: string hint = 3; - */ - hint = ""; - - /** - * Optional lint type or enum. - * - * @generated from field: string lint_type = 4; - */ - lintType = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.common.v1.LintHint"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "line", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 2, name: "column", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "hint", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 4, name: "lint_type", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): LintHint { - return new LintHint().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): LintHint { - return new LintHint().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): LintHint { - return new LintHint().fromJsonString(jsonString, options); - } - - static equals(a: LintHint | PlainMessage | undefined, b: LintHint | PlainMessage | undefined): boolean { - return proto3.util.equals(LintHint, a, b); - } -} - diff --git a/frontend/src/protogen/redpanda/api/dataplane/v1/security-SecurityService_connectquery.ts b/frontend/src/protogen/redpanda/api/dataplane/v1/security-SecurityService_connectquery.ts new file mode 100644 index 0000000000..5e39302f6a --- /dev/null +++ b/frontend/src/protogen/redpanda/api/dataplane/v1/security-SecurityService_connectquery.ts @@ -0,0 +1,105 @@ +// @generated by protoc-gen-connect-query v1.4.0 with parameter "target=ts,import_extension=,js_import_style=legacy_commonjs" +// @generated from file redpanda/api/dataplane/v1/security.proto (package redpanda.api.dataplane.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { MethodKind } from "@bufbuild/protobuf"; +import { CreateRoleRequest, CreateRoleResponse, DeleteRoleRequest, DeleteRoleResponse, GetRoleRequest, GetRoleResponse, ListRoleMembersRequest, ListRoleMembersResponse, ListRolesRequest, ListRolesResponse, UpdateRoleMembershipRequest, UpdateRoleMembershipResponse } from "./security_pb"; + +/** + * ListRoles lists all the roles based on optional filter. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.ListRoles + */ +export const listRoles = { + localName: "listRoles", + name: "ListRoles", + kind: MethodKind.Unary, + I: ListRolesRequest, + O: ListRolesResponse, + service: { + typeName: "redpanda.api.dataplane.v1.SecurityService" + } +} as const; + +/** + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.CreateRole + */ +export const createRole = { + localName: "createRole", + name: "CreateRole", + kind: MethodKind.Unary, + I: CreateRoleRequest, + O: CreateRoleResponse, + service: { + typeName: "redpanda.api.dataplane.v1.SecurityService" + } +} as const; + +/** + * GetRole retrieves the specific role. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.GetRole + */ +export const getRole = { + localName: "getRole", + name: "GetRole", + kind: MethodKind.Unary, + I: GetRoleRequest, + O: GetRoleResponse, + service: { + typeName: "redpanda.api.dataplane.v1.SecurityService" + } +} as const; + +/** + * DeleteRole deletes the role from the system. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.DeleteRole + */ +export const deleteRole = { + localName: "deleteRole", + name: "DeleteRole", + kind: MethodKind.Unary, + I: DeleteRoleRequest, + O: DeleteRoleResponse, + service: { + typeName: "redpanda.api.dataplane.v1.SecurityService" + } +} as const; + +/** + * ListRoleMembership lists all the members assigned to a role based on optional filter. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.ListRoleMembers + */ +export const listRoleMembers = { + localName: "listRoleMembers", + name: "ListRoleMembers", + kind: MethodKind.Unary, + I: ListRoleMembersRequest, + O: ListRoleMembersResponse, + service: { + typeName: "redpanda.api.dataplane.v1.SecurityService" + } +} as const; + +/** + * UpdateRoleMembership updates role membership. + * Partially update role membership, adding or removing from a role + * ONLY those members listed in the “add” or “remove” fields, respectively. + * Adding a member that is already assigned to the role (or removing one that is not) is a no-op, + * and the rest of the members will be added and removed and reported. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.UpdateRoleMembership + */ +export const updateRoleMembership = { + localName: "updateRoleMembership", + name: "UpdateRoleMembership", + kind: MethodKind.Unary, + I: UpdateRoleMembershipRequest, + O: UpdateRoleMembershipResponse, + service: { + typeName: "redpanda.api.dataplane.v1.SecurityService" + } +} as const; diff --git a/frontend/src/protogen/redpanda/api/dataplane/v1/security_connect.ts b/frontend/src/protogen/redpanda/api/dataplane/v1/security_connect.ts new file mode 100644 index 0000000000..b23ad9884f --- /dev/null +++ b/frontend/src/protogen/redpanda/api/dataplane/v1/security_connect.ts @@ -0,0 +1,85 @@ +// @generated by protoc-gen-connect-es v1.2.0 with parameter "target=ts,import_extension=" +// @generated from file redpanda/api/dataplane/v1/security.proto (package redpanda.api.dataplane.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import { CreateRoleRequest, CreateRoleResponse, DeleteRoleRequest, DeleteRoleResponse, GetRoleRequest, GetRoleResponse, ListRoleMembersRequest, ListRoleMembersResponse, ListRolesRequest, ListRolesResponse, UpdateRoleMembershipRequest, UpdateRoleMembershipResponse } from "./security_pb"; +import { MethodKind } from "@bufbuild/protobuf"; + +/** + * @generated from service redpanda.api.dataplane.v1.SecurityService + */ +export const SecurityService = { + typeName: "redpanda.api.dataplane.v1.SecurityService", + methods: { + /** + * ListRoles lists all the roles based on optional filter. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.ListRoles + */ + listRoles: { + name: "ListRoles", + I: ListRolesRequest, + O: ListRolesResponse, + kind: MethodKind.Unary, + }, + /** + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.CreateRole + */ + createRole: { + name: "CreateRole", + I: CreateRoleRequest, + O: CreateRoleResponse, + kind: MethodKind.Unary, + }, + /** + * GetRole retrieves the specific role. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.GetRole + */ + getRole: { + name: "GetRole", + I: GetRoleRequest, + O: GetRoleResponse, + kind: MethodKind.Unary, + }, + /** + * DeleteRole deletes the role from the system. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.DeleteRole + */ + deleteRole: { + name: "DeleteRole", + I: DeleteRoleRequest, + O: DeleteRoleResponse, + kind: MethodKind.Unary, + }, + /** + * ListRoleMembership lists all the members assigned to a role based on optional filter. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.ListRoleMembers + */ + listRoleMembers: { + name: "ListRoleMembers", + I: ListRoleMembersRequest, + O: ListRoleMembersResponse, + kind: MethodKind.Unary, + }, + /** + * UpdateRoleMembership updates role membership. + * Partially update role membership, adding or removing from a role + * ONLY those members listed in the “add” or “remove” fields, respectively. + * Adding a member that is already assigned to the role (or removing one that is not) is a no-op, + * and the rest of the members will be added and removed and reported. + * + * @generated from rpc redpanda.api.dataplane.v1.SecurityService.UpdateRoleMembership + */ + updateRoleMembership: { + name: "UpdateRoleMembership", + I: UpdateRoleMembershipRequest, + O: UpdateRoleMembershipResponse, + kind: MethodKind.Unary, + }, + } +} as const; + diff --git a/frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts b/frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts new file mode 100644 index 0000000000..c3f553798d --- /dev/null +++ b/frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts @@ -0,0 +1,795 @@ +// @generated by protoc-gen-es v1.6.0 with parameter "target=ts,import_extension=" +// @generated from file redpanda/api/dataplane/v1/security.proto (package redpanda.api.dataplane.v1, syntax proto3) +/* eslint-disable */ +// @ts-nocheck + +import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; +import { Message, proto3 } from "@bufbuild/protobuf"; + +/** + * Role defines a role in the system. + * + * @generated from message redpanda.api.dataplane.v1.Role + */ +export class Role extends Message { + /** + * The name of the role. + * + * @generated from field: string name = 1; + */ + name = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.Role"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): Role { + return new Role().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): Role { + return new Role().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): Role { + return new Role().fromJsonString(jsonString, options); + } + + static equals(a: Role | PlainMessage | undefined, b: Role | PlainMessage | undefined): boolean { + return proto3.util.equals(Role, a, b); + } +} + +/** + * ListRolesRequest is the request for ListRoles. + * + * @generated from message redpanda.api.dataplane.v1.ListRolesRequest + */ +export class ListRolesRequest extends Message { + /** + * Optional filter. + * + * @generated from field: optional redpanda.api.dataplane.v1.ListRolesRequest.Filter filter = 1; + */ + filter?: ListRolesRequest_Filter; + + /** + * Page size. + * + * @generated from field: int32 page_size = 2; + */ + pageSize = 0; + + /** + * Value of the next_page_token field returned by the previous response. + * If not provided, the system assumes the first page is requested. + * + * @generated from field: string page_token = 3; + */ + pageToken = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.ListRolesRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "filter", kind: "message", T: ListRolesRequest_Filter, opt: true }, + { no: 2, name: "page_size", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + { no: 3, name: "page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListRolesRequest { + return new ListRolesRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListRolesRequest { + return new ListRolesRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListRolesRequest { + return new ListRolesRequest().fromJsonString(jsonString, options); + } + + static equals(a: ListRolesRequest | PlainMessage | undefined, b: ListRolesRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ListRolesRequest, a, b); + } +} + +/** + * Filter options. + * + * @generated from message redpanda.api.dataplane.v1.ListRolesRequest.Filter + */ +export class ListRolesRequest_Filter extends Message { + /** + * Filter results only roles named with the prefix. + * + * @generated from field: string name_prefix = 1; + */ + namePrefix = ""; + + /** + * Filter results to only roles with names which contain the string. + * + * @generated from field: string name_contains = 2; + */ + nameContains = ""; + + /** + * Return only roles assigned to this principal. + * + * @generated from field: string principal = 3; + */ + principal = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.ListRolesRequest.Filter"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name_prefix", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "name_contains", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "principal", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListRolesRequest_Filter { + return new ListRolesRequest_Filter().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListRolesRequest_Filter { + return new ListRolesRequest_Filter().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListRolesRequest_Filter { + return new ListRolesRequest_Filter().fromJsonString(jsonString, options); + } + + static equals(a: ListRolesRequest_Filter | PlainMessage | undefined, b: ListRolesRequest_Filter | PlainMessage | undefined): boolean { + return proto3.util.equals(ListRolesRequest_Filter, a, b); + } +} + +/** + * ListRolesResponse is the response for ListRoles. + * + * @generated from message redpanda.api.dataplane.v1.ListRolesResponse + */ +export class ListRolesResponse extends Message { + /** + * The roles in the system. + * + * @generated from field: repeated redpanda.api.dataplane.v1.Role roles = 1; + */ + roles: Role[] = []; + + /** + * Token to retrieve the next page. + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.ListRolesResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "roles", kind: "message", T: Role, repeated: true }, + { no: 2, name: "next_page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListRolesResponse { + return new ListRolesResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListRolesResponse { + return new ListRolesResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListRolesResponse { + return new ListRolesResponse().fromJsonString(jsonString, options); + } + + static equals(a: ListRolesResponse | PlainMessage | undefined, b: ListRolesResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(ListRolesResponse, a, b); + } +} + +/** + * CreateRoleRequest is the request for CreateRole. + * + * @generated from message redpanda.api.dataplane.v1.CreateRoleRequest + */ +export class CreateRoleRequest extends Message { + /** + * The role to create. + * + * @generated from field: redpanda.api.dataplane.v1.Role role = 1; + */ + role?: Role; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.CreateRoleRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role", kind: "message", T: Role }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateRoleRequest { + return new CreateRoleRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateRoleRequest { + return new CreateRoleRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateRoleRequest { + return new CreateRoleRequest().fromJsonString(jsonString, options); + } + + static equals(a: CreateRoleRequest | PlainMessage | undefined, b: CreateRoleRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateRoleRequest, a, b); + } +} + +/** + * CreateRoleResponse is the response for CreateRole. + * + * @generated from message redpanda.api.dataplane.v1.CreateRoleResponse + */ +export class CreateRoleResponse extends Message { + /** + * The role. + * + * @generated from field: redpanda.api.dataplane.v1.Role role = 1; + */ + role?: Role; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.CreateRoleResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role", kind: "message", T: Role }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): CreateRoleResponse { + return new CreateRoleResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): CreateRoleResponse { + return new CreateRoleResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): CreateRoleResponse { + return new CreateRoleResponse().fromJsonString(jsonString, options); + } + + static equals(a: CreateRoleResponse | PlainMessage | undefined, b: CreateRoleResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(CreateRoleResponse, a, b); + } +} + +/** + * CreateRoleRequest is the request for CreateRole. + * + * @generated from message redpanda.api.dataplane.v1.GetRoleRequest + */ +export class GetRoleRequest extends Message { + /** + * The role name. + * + * @generated from field: string role_name = 1; + */ + roleName = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.GetRoleRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetRoleRequest { + return new GetRoleRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetRoleRequest { + return new GetRoleRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetRoleRequest { + return new GetRoleRequest().fromJsonString(jsonString, options); + } + + static equals(a: GetRoleRequest | PlainMessage | undefined, b: GetRoleRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(GetRoleRequest, a, b); + } +} + +/** + * GetRoleResponse is the response to GetRole. + * + * @generated from message redpanda.api.dataplane.v1.GetRoleResponse + */ +export class GetRoleResponse extends Message { + /** + * The Role. + * + * @generated from field: redpanda.api.dataplane.v1.Role role = 1; + */ + role?: Role; + + /** + * Members assigned to the role. + * + * @generated from field: repeated redpanda.api.dataplane.v1.RoleMembership members = 2; + */ + members: RoleMembership[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.GetRoleResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role", kind: "message", T: Role }, + { no: 2, name: "members", kind: "message", T: RoleMembership, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): GetRoleResponse { + return new GetRoleResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): GetRoleResponse { + return new GetRoleResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): GetRoleResponse { + return new GetRoleResponse().fromJsonString(jsonString, options); + } + + static equals(a: GetRoleResponse | PlainMessage | undefined, b: GetRoleResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(GetRoleResponse, a, b); + } +} + +/** + * DeleteRoleRequest is the request for DeleteRole. + * + * @generated from message redpanda.api.dataplane.v1.DeleteRoleRequest + */ +export class DeleteRoleRequest extends Message { + /** + * The role name. + * + * @generated from field: string role_name = 1; + */ + roleName = ""; + + /** + * Whether to delete the ACLs bound to the role. + * + * @generated from field: bool delete_acls = 2; + */ + deleteAcls = false; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.DeleteRoleRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "delete_acls", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteRoleRequest { + return new DeleteRoleRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteRoleRequest { + return new DeleteRoleRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteRoleRequest { + return new DeleteRoleRequest().fromJsonString(jsonString, options); + } + + static equals(a: DeleteRoleRequest | PlainMessage | undefined, b: DeleteRoleRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteRoleRequest, a, b); + } +} + +/** + * DeleteRoleResponse is the response for DeleteRole. + * + * @generated from message redpanda.api.dataplane.v1.DeleteRoleResponse + */ +export class DeleteRoleResponse extends Message { + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.DeleteRoleResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): DeleteRoleResponse { + return new DeleteRoleResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): DeleteRoleResponse { + return new DeleteRoleResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): DeleteRoleResponse { + return new DeleteRoleResponse().fromJsonString(jsonString, options); + } + + static equals(a: DeleteRoleResponse | PlainMessage | undefined, b: DeleteRoleResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(DeleteRoleResponse, a, b); + } +} + +/** + * List role members for a role. That is user principals assigned to that role. + * + * @generated from message redpanda.api.dataplane.v1.ListRoleMembersRequest + */ +export class ListRoleMembersRequest extends Message { + /** + * The role name. + * + * @generated from field: string role_name = 1; + */ + roleName = ""; + + /** + * Optional filter. + * + * @generated from field: optional redpanda.api.dataplane.v1.ListRoleMembersRequest.Filter filter = 2; + */ + filter?: ListRoleMembersRequest_Filter; + + /** + * Page size. + * + * @generated from field: int32 page_size = 3; + */ + pageSize = 0; + + /** + * Value of the next_page_token field returned by the previous response. + * If not provided, the system assumes the first page is requested. + * + * @generated from field: string page_token = 4; + */ + pageToken = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.ListRoleMembersRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "filter", kind: "message", T: ListRoleMembersRequest_Filter, opt: true }, + { no: 3, name: "page_size", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, + { no: 4, name: "page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListRoleMembersRequest { + return new ListRoleMembersRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListRoleMembersRequest { + return new ListRoleMembersRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListRoleMembersRequest { + return new ListRoleMembersRequest().fromJsonString(jsonString, options); + } + + static equals(a: ListRoleMembersRequest | PlainMessage | undefined, b: ListRoleMembersRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(ListRoleMembersRequest, a, b); + } +} + +/** + * Filter options. + * + * @generated from message redpanda.api.dataplane.v1.ListRoleMembersRequest.Filter + */ +export class ListRoleMembersRequest_Filter extends Message { + /** + * Filter results to only members with names which contain the string. + * + * @generated from field: string name_contains = 1; + */ + nameContains = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.ListRoleMembersRequest.Filter"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "name_contains", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListRoleMembersRequest_Filter { + return new ListRoleMembersRequest_Filter().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListRoleMembersRequest_Filter { + return new ListRoleMembersRequest_Filter().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListRoleMembersRequest_Filter { + return new ListRoleMembersRequest_Filter().fromJsonString(jsonString, options); + } + + static equals(a: ListRoleMembersRequest_Filter | PlainMessage | undefined, b: ListRoleMembersRequest_Filter | PlainMessage | undefined): boolean { + return proto3.util.equals(ListRoleMembersRequest_Filter, a, b); + } +} + +/** + * ListRoleMembersResponse is the response for ListRoleMembers. + * + * @generated from message redpanda.api.dataplane.v1.ListRoleMembersResponse + */ +export class ListRoleMembersResponse extends Message { + /** + * The role name. + * + * @generated from field: string role_name = 1; + */ + roleName = ""; + + /** + * Members assigned to the role. + * + * @generated from field: repeated redpanda.api.dataplane.v1.RoleMembership members = 2; + */ + members: RoleMembership[] = []; + + /** + * Token to retrieve the next page. + * + * @generated from field: string next_page_token = 3; + */ + nextPageToken = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.ListRoleMembersResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "members", kind: "message", T: RoleMembership, repeated: true }, + { no: 3, name: "next_page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): ListRoleMembersResponse { + return new ListRoleMembersResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): ListRoleMembersResponse { + return new ListRoleMembersResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): ListRoleMembersResponse { + return new ListRoleMembersResponse().fromJsonString(jsonString, options); + } + + static equals(a: ListRoleMembersResponse | PlainMessage | undefined, b: ListRoleMembersResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(ListRoleMembersResponse, a, b); + } +} + +/** + * RoleMembership is the role membership. + * + * @generated from message redpanda.api.dataplane.v1.RoleMembership + */ +export class RoleMembership extends Message { + /** + * The name of the principal assigned to the role. + * + * @generated from field: string principal = 1; + */ + principal = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.RoleMembership"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "principal", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RoleMembership { + return new RoleMembership().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RoleMembership { + return new RoleMembership().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RoleMembership { + return new RoleMembership().fromJsonString(jsonString, options); + } + + static equals(a: RoleMembership | PlainMessage | undefined, b: RoleMembership | PlainMessage | undefined): boolean { + return proto3.util.equals(RoleMembership, a, b); + } +} + +/** + * UpdateRoleMembershipRequest is the request to UpdateRoleMembership. + * + * @generated from message redpanda.api.dataplane.v1.UpdateRoleMembershipRequest + */ +export class UpdateRoleMembershipRequest extends Message { + /** + * The role name. + * + * @generated from field: string role_name = 1; + */ + roleName = ""; + + /** + * Create the role if it doesn't already exist. + * If the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored. + * + * @generated from field: bool create = 2; + */ + create = false; + + /** + * Members to assign to the role. + * + * @generated from field: repeated redpanda.api.dataplane.v1.RoleMembership add = 3; + */ + add: RoleMembership[] = []; + + /** + * Members to remove from the role. + * + * @generated from field: repeated redpanda.api.dataplane.v1.RoleMembership remove = 4; + */ + remove: RoleMembership[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.UpdateRoleMembershipRequest"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "create", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 3, name: "add", kind: "message", T: RoleMembership, repeated: true }, + { no: 4, name: "remove", kind: "message", T: RoleMembership, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): UpdateRoleMembershipRequest { + return new UpdateRoleMembershipRequest().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): UpdateRoleMembershipRequest { + return new UpdateRoleMembershipRequest().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): UpdateRoleMembershipRequest { + return new UpdateRoleMembershipRequest().fromJsonString(jsonString, options); + } + + static equals(a: UpdateRoleMembershipRequest | PlainMessage | undefined, b: UpdateRoleMembershipRequest | PlainMessage | undefined): boolean { + return proto3.util.equals(UpdateRoleMembershipRequest, a, b); + } +} + +/** + * UpdateRoleMembershipResponse is the response for UpdateRoleMembership. + * + * @generated from message redpanda.api.dataplane.v1.UpdateRoleMembershipResponse + */ +export class UpdateRoleMembershipResponse extends Message { + /** + * The role name. + * + * @generated from field: string role_name = 1; + */ + roleName = ""; + + /** + * Members assigned to the role. + * + * @generated from field: repeated redpanda.api.dataplane.v1.RoleMembership added = 2; + */ + added: RoleMembership[] = []; + + /** + * Members removed from the role. + * + * @generated from field: repeated redpanda.api.dataplane.v1.RoleMembership removed = 3; + */ + removed: RoleMembership[] = []; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "redpanda.api.dataplane.v1.UpdateRoleMembershipResponse"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "added", kind: "message", T: RoleMembership, repeated: true }, + { no: 3, name: "removed", kind: "message", T: RoleMembership, repeated: true }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): UpdateRoleMembershipResponse { + return new UpdateRoleMembershipResponse().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): UpdateRoleMembershipResponse { + return new UpdateRoleMembershipResponse().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): UpdateRoleMembershipResponse { + return new UpdateRoleMembershipResponse().fromJsonString(jsonString, options); + } + + static equals(a: UpdateRoleMembershipResponse | PlainMessage | undefined, b: UpdateRoleMembershipResponse | PlainMessage | undefined): boolean { + return proto3.util.equals(UpdateRoleMembershipResponse, a, b); + } +} + diff --git a/proto/gen/openapi/openapi.json b/proto/gen/openapi/openapi.json index 2b0b1105c5..48b7109d87 100644 --- a/proto/gen/openapi/openapi.json +++ b/proto/gen/openapi/openapi.json @@ -1,7059 +1 @@ -{ - "components": { - "schemas": { - "ACL.Operation": { - "description": "The operation that is allowed or denied (e.g. READ).", - "enum": [ - "OPERATION_ANY", - "OPERATION_ALL", - "OPERATION_READ", - "OPERATION_WRITE", - "OPERATION_CREATE", - "OPERATION_DELETE", - "OPERATION_ALTER", - "OPERATION_DESCRIBE", - "OPERATION_CLUSTER_ACTION", - "OPERATION_DESCRIBE_CONFIGS", - "OPERATION_ALTER_CONFIGS", - "OPERATION_IDEMPOTENT_WRITE", - "OPERATION_CREATE_TOKENS", - "OPERATION_DESCRIBE_TOKENS" - ], - "type": "string" - }, - "Action": { - "enum": ["ACTION_PREPARE", "ACTION_EXECUTE", "ACTION_FINISH", "ACTION_CANCEL"], - "type": "string" - }, - "AddPartitionsToTopicsRequest": { - "properties": { - "partition_count": { - "description": "The number of partitions to add for the topics.", - "format": "int32", - "type": "integer" - }, - "topic_names": { - "description": "The topic names.", - "items": { - "type": "string" - }, - "type": "array" - }, - "validate_only": { - "description": "Validate the request only, do not execute it.", - "type": "boolean" - } - }, - "type": "object" - }, - "AddPartitionsToTopicsResponse": { - "properties": { - "statuses": { - "description": "The status of the operation for each topic.", - "items": { - "$ref": "#/components/schemas/AlterTopicPartitionStatus" - }, - "type": "array" - } - }, - "type": "object" - }, - "AddTopicPartitionsBody": { - "properties": { - "partition_count": { - "description": "The number of partitions to add to the topic.", - "format": "int32", - "type": "integer" - }, - "validate_only": { - "description": "Validate the request only, do not execute it.", - "type": "boolean" - } - }, - "type": "object" - }, - "AddTopicPartitionsResponse": { - "type": "object" - }, - "AlterTopicPartitionStatus": { - "properties": { - "error": { - "description": "The error if any.", - "type": "string" - }, - "success": { - "description": "Whether the operation was successful.", - "type": "boolean" - }, - "topic_name": { - "description": "The topic name.", - "type": "string" - } - }, - "type": "object" - }, - "BadRequest": { - "description": "Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.", - "properties": { - "field_violations": { - "description": "Describes all violations in a client request.", - "items": { - "$ref": "#/components/schemas/FieldViolation" - }, - "type": "array" - } - }, - "title": "BadRequest", - "type": "object" - }, - "Config": { - "properties": { - "name": { - "description": "A topic-level config key (e.g. `segment.bytes`).", - "type": "string" - }, - "value": { - "description": "A topic-level config value (e.g. 1073741824).", - "nullable": true, - "type": "string" - } - }, - "type": "object" - }, - "ConfigAlterOperation": { - "enum": [ - "CONFIG_ALTER_OPERATION_SET", - "CONFIG_ALTER_OPERATION_DELETE", - "CONFIG_ALTER_OPERATION_APPEND", - "CONFIG_ALTER_OPERATION_SUBTRACT" - ], - "type": "string" - }, - "ConfigSource": { - "enum": [ - "CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG", - "CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG", - "CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG", - "CONFIG_SOURCE_STATIC_BROKER_CONFIG", - "CONFIG_SOURCE_DEFAULT_CONFIG", - "CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG" - ], - "type": "string" - }, - "ConfigSynonym": { - "properties": { - "name": { - "type": "string" - }, - "source": { - "$ref": "#/components/schemas/ConfigSource" - }, - "value": { - "nullable": true, - "type": "string" - } - }, - "type": "object" - }, - "ConfigType": { - "enum": [ - "CONFIG_TYPE_BOOLEAN", - "CONFIG_TYPE_STRING", - "CONFIG_TYPE_INT", - "CONFIG_TYPE_SHORT", - "CONFIG_TYPE_LONG", - "CONFIG_TYPE_DOUBLE", - "CONFIG_TYPE_LIST", - "CONFIG_TYPE_CLASS", - "CONFIG_TYPE_PASSWORD" - ], - "type": "string" - }, - "Configuration": { - "properties": { - "config_synonyms": { - "description": "If no config value is set at the topic level, it will inherit the value\nset at the broker or cluster level. `name` is the corresponding config\nkey whose value is inherited. `source` indicates whether the inherited\nconfig is default, broker, etc.", - "items": { - "$ref": "#/components/schemas/ConfigSynonym" - }, - "type": "array" - }, - "documentation": { - "description": "Config documentation.", - "nullable": true, - "type": "string" - }, - "name": { - "description": "A topic-level config key (e.g. `segment.bytes`).", - "type": "string" - }, - "read_only": { - "description": "Whether the config is read-only, or is dynamic and can be altered.", - "type": "boolean" - }, - "sensitive": { - "description": "Whether this is a sensitive config key and value.", - "type": "boolean" - }, - "source": { - "$ref": "#/components/schemas/ConfigSource" - }, - "type": { - "$ref": "#/components/schemas/ConfigType" - }, - "value": { - "description": "A topic-level config value (e.g. 1073741824).", - "nullable": true, - "type": "string" - } - }, - "type": "object" - }, - "ConnectCluster": { - "properties": { - "address": { - "description": "The host address of the Kafka Connect cluster.", - "type": "string" - }, - "info": { - "$ref": "#/components/schemas/ConnectCluster.Info" - }, - "name": { - "description": "Unique name of connect cluster. For Redpanda Cloud, the value is `redpanda`.", - "type": "string" - }, - "plugins": { - "items": { - "$ref": "#/components/schemas/ConnectorPlugin" - }, - "type": "array" - } - }, - "type": "object" - }, - "ConnectCluster.Info": { - "properties": { - "commit": { - "description": "The git commit ID of the connect worker source code.", - "type": "string" - }, - "kafka_cluster_id": { - "description": "Cluster ID.", - "type": "string" - }, - "version": { - "description": "Connect worker version.", - "type": "string" - } - }, - "type": "object" - }, - "Connector": { - "properties": { - "state": { - "description": "State of the connector instance.", - "type": "string" - }, - "trace": { - "description": "String value of stack trace.", - "type": "string" - }, - "worker_id": { - "description": "ID of worker that the connector is assigned to.", - "type": "string" - } - }, - "type": "object" - }, - "ConnectorError": { - "properties": { - "content": { - "description": "Detailed description of the error.", - "type": "string" - }, - "title": { - "description": "Short description of the error.", - "type": "string" - }, - "type": { - "$ref": "#/components/schemas/ConnectorError.Type" - } - }, - "title": "ConnectorError is the error of a connector, this is holistic error\nabstraction, made parsing the error trace of connector or Task", - "type": "object" - }, - "ConnectorError.Type": { - "description": "Error level.", - "enum": ["TYPE_ERROR", "TYPE_WARNING"], - "type": "string" - }, - "ConnectorHolisticState": { - "description": "State of a connector or one of its tasks, as described in the [Kafka Connect documentation](https://kafka.apache.org/documentation.html#connect_administration). Takes into account not just the state of the connector instance itself, but also the tasks within the connector.\n\n - CONNECTOR_HOLISTIC_STATE_PAUSED: The connector or task has been administratively paused.\n - CONNECTOR_HOLISTIC_STATE_RESTARTING: The connector or task is restarting.\n - CONNECTOR_HOLISTIC_STATE_DESTROYED: The connector is destroyed, regardless of any tasks.\n - CONNECTOR_HOLISTIC_STATE_STOPPED: The connector or task has been stopped.\n - CONNECTOR_HOLISTIC_STATE_UNASSIGNED: - The connector or task has not yet been assigned to a worker,\n- THe connector is running, but there are unassigned tasks.\n - CONNECTOR_HOLISTIC_STATE_HEALTHY: The connector is running, > 0 tasks, all of them in running state.\n - CONNECTOR_HOLISTIC_STATE_UNHEALTHY: - The connector has failed,\n- The connector is running, but has no tasks,\n- Connector is running and has tasks, but all tasks have failed.\n - CONNECTOR_HOLISTIC_STATE_DEGRADED: The connector is running and has tasks, and at least one task, but not all, have failed.\n - CONNECTOR_HOLISTIC_STATE_UNKNOWN: The connector or task state could not be determined.", - "enum": [ - "CONNECTOR_HOLISTIC_STATE_PAUSED", - "CONNECTOR_HOLISTIC_STATE_RESTARTING", - "CONNECTOR_HOLISTIC_STATE_DESTROYED", - "CONNECTOR_HOLISTIC_STATE_STOPPED", - "CONNECTOR_HOLISTIC_STATE_UNASSIGNED", - "CONNECTOR_HOLISTIC_STATE_HEALTHY", - "CONNECTOR_HOLISTIC_STATE_UNHEALTHY", - "CONNECTOR_HOLISTIC_STATE_DEGRADED", - "CONNECTOR_HOLISTIC_STATE_UNKNOWN" - ], - "type": "string" - }, - "ConnectorInfoStatus": { - "properties": { - "info": { - "$ref": "#/components/schemas/ConnectorSpec" - }, - "name": { - "description": "Name of connector.", - "type": "string" - }, - "status": { - "$ref": "#/components/schemas/ConnectorStatus" - } - }, - "type": "object" - }, - "ConnectorPlugin": { - "properties": { - "class": { - "type": "string" - }, - "type": { - "type": "string" - }, - "version": { - "type": "string" - } - }, - "type": "object" - }, - "ConnectorSpec": { - "description": "Connector specifications as defined in the Kafka Connect\nAPI. You may include this in the request body when creating a new connector.", - "properties": { - "config": { - "additionalProperties": { - "type": "string" - }, - "description": "Connector configuration properties.", - "type": "object" - }, - "name": { - "description": "Name of connector.", - "type": "string" - }, - "tasks": { - "items": { - "$ref": "#/components/schemas/TaskInfo" - }, - "readOnly": true, - "type": "array" - }, - "type": { - "readOnly": true, - "type": "string" - } - }, - "required": ["name", "config"], - "type": "object" - }, - "ConnectorStatus": { - "properties": { - "connector": { - "$ref": "#/components/schemas/Connector" - }, - "errors": { - "description": "List of parsed connectors' and tasks' errors.", - "items": { - "$ref": "#/components/schemas/ConnectorError" - }, - "type": "array" - }, - "holistic_state": { - "$ref": "#/components/schemas/ConnectorHolisticState" - }, - "name": { - "description": "Name of connector.", - "type": "string" - }, - "tasks": { - "description": "Status of connector tasks. For more information, see the [https://docs.redpanda.com/current/deploy/deployment-option/cloud/managed-connectors/monitor-connectors/#connector-tasks](Monitor Connectors) documentation.", - "items": { - "$ref": "#/components/schemas/TaskStatus" - }, - "type": "array" - }, - "type": { - "description": "Type of connector (sink or source).", - "type": "string" - } - }, - "type": "object" - }, - "CreateACLRequest": { - "properties": { - "host": { - "description": "The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.", - "type": "string" - }, - "operation": { - "$ref": "#/components/schemas/ACL.Operation" - }, - "permission_type": { - "$ref": "#/components/schemas/PermissionType" - }, - "principal": { - "description": "The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.", - "type": "string" - }, - "resource_name": { - "description": "The name of the resource this ACL targets.\nFor requests with resource_type CLUSTER, this will default to \"kafka-cluster\".", - "type": "string" - }, - "resource_pattern_type": { - "$ref": "#/components/schemas/ResourcePatternType" - }, - "resource_type": { - "$ref": "#/components/schemas/ResourceType" - } - }, - "required": ["resource_type", "resource_pattern_type", "principal", "host", "operation", "permission_type"], - "type": "object" - }, - "CreateACLResponse": { - "type": "object" - }, - "CreateConnectorResponse": { - "properties": { - "connector": { - "$ref": "#/components/schemas/ConnectorSpec" - } - }, - "type": "object" - }, - "CreateKafkaConnectSecretBody": { - "description": "CreateKafkaConnectSecretRequest is the request of CreateKafkaConnectSecret.", - "properties": { - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "Secret labels.", - "type": "object" - }, - "name": { - "description": "Name of connector.", - "type": "string" - }, - "secret_data": { - "description": "The secret data. Must be Base64-encoded.", - "format": "byte", - "type": "string" - } - }, - "required": ["name", "secret_data"], - "type": "object" - }, - "CreateKafkaConnectSecretResponse": { - "description": "CreateKafkaConnectSecretResponse is the response of CreateKafkaConnectSecret.", - "properties": { - "secret": { - "$ref": "#/components/schemas/Secret" - } - }, - "type": "object" - }, - "CreatePipelineResponse": { - "properties": { - "pipeline": { - "$ref": "#/components/schemas/Pipeline" - } - }, - "type": "object" - }, - "CreateSecretRequest": { - "description": "CreateSecretRequest is the request of CreateSecret.", - "properties": { - "id": { - "description": "Secret identifier.", - "type": "string" - }, - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "Secret labels.", - "type": "object" - }, - "scopes": { - "items": { - "$ref": "#/components/schemas/Scope" - }, - "title": "Secret scopes", - "type": "array" - }, - "secret_data": { - "description": "The secret data. Must be Base64-encoded.", - "format": "byte", - "type": "string" - } - }, - "required": ["secret_data"], - "type": "object" - }, - "CreateSecretResponse": { - "description": "CreateSecretResponse is the response of CreateSecret.", - "properties": { - "secret": { - "$ref": "#/components/schemas/Secret" - } - }, - "type": "object" - }, - "CreateTopicRequest.Topic": { - "properties": { - "configs": { - "description": "An array of key-value config pairs for a topic.\nThese correspond to Kafka topic-level configs.", - "items": { - "$ref": "#/components/schemas/Config" - }, - "type": "array" - }, - "name": { - "description": "Name of topic.", - "type": "string" - }, - "partition_count": { - "description": "The number of partitions to give the topic. If specifying\npartitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default partition count, set to null.", - "format": "int32", - "nullable": true, - "type": "integer" - }, - "replica_assignments": { - "description": "Manually specify broker ID assignments for partition replicas. If manually assigning replicas, both `replication_factor` and\n`partition_count` must be -1.", - "items": { - "$ref": "#/components/schemas/ReplicaAssignment" - }, - "type": "array" - }, - "replication_factor": { - "description": "The number of replicas every partition must have.\nIf specifying partitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default replication factor, set to null.", - "format": "int32", - "nullable": true, - "type": "integer" - } - }, - "type": "object" - }, - "CreateTopicResponse": { - "properties": { - "partition_count": { - "description": "The number of partitions created for the topic.\nThis field has a default value of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.", - "format": "int32", - "type": "integer" - }, - "replication_factor": { - "description": "The number of replicas per topic partition.\nThis field has a default of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.", - "format": "int32", - "type": "integer" - }, - "topic_name": { - "description": "Name of topic.", - "type": "string" - } - }, - "type": "object" - }, - "CreateUserRequest.User": { - "properties": { - "mechanism": { - "$ref": "#/components/schemas/SASLMechanism" - }, - "name": { - "description": "Username.", - "type": "string" - }, - "password": { - "description": "Password.", - "type": "string" - } - }, - "type": "object" - }, - "CreateUserResponse": { - "properties": { - "user": { - "$ref": "#/components/schemas/CreateUserResponse.User" - } - }, - "type": "object" - }, - "CreateUserResponse.User": { - "properties": { - "mechanism": { - "$ref": "#/components/schemas/SASLMechanism" - }, - "name": { - "title": "Name of newly-created user", - "type": "string" - } - }, - "type": "object" - }, - "DeleteACLsRequest.Filter": { - "properties": { - "host": { - "description": "The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.", - "nullable": true, - "type": "string" - }, - "operation": { - "$ref": "#/components/schemas/ACL.Operation" - }, - "permission_type": { - "$ref": "#/components/schemas/PermissionType" - }, - "principal": { - "description": "The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.", - "nullable": true, - "type": "string" - }, - "resource_name": { - "description": "The name of the resource this ACL targets.", - "nullable": true, - "type": "string" - }, - "resource_pattern_type": { - "$ref": "#/components/schemas/ResourcePatternType" - }, - "resource_type": { - "$ref": "#/components/schemas/ResourceType" - } - }, - "required": ["resource_type", "resource_pattern_type", "operation", "permission_type"], - "type": "object" - }, - "DeleteACLsResponse": { - "properties": { - "matching_acls": { - "items": { - "$ref": "#/components/schemas/MatchingACL" - }, - "type": "array" - } - }, - "type": "object" - }, - "DeleteKafkaConnectSecretResponse": { - "description": "DeleteKafkaConnectSecretResponse is the response of DeleteKafkaConnectSecret.", - "type": "object" - }, - "DeleteMountTaskResponse": { - "type": "object" - }, - "DeletePipelineResponse": { - "type": "object" - }, - "DeleteSecretResponse": { - "description": "DeleteSecretResponse is the response of DeleteSecret.", - "type": "object" - }, - "DeleteTopicResponse": { - "type": "object" - }, - "DeleteTransformResponse": { - "type": "object" - }, - "DeleteUserResponse": { - "type": "object" - }, - "DeployTransformRequest": { - "description": "Metadata required to deploy a new Wasm\ntransform in a Redpanda cluster.", - "properties": { - "environment_variables": { - "description": "The environment variables you want to apply to your transform's environment", - "items": { - "$ref": "#/components/schemas/EnvironmentVariable" - }, - "type": "array" - }, - "input_topic_name": { - "description": "The input topic to apply the transform to.", - "example": "orders", - "type": "string" - }, - "name": { - "description": "Name of the transform.", - "example": "redact-payment-details-in-orders", - "type": "string" - }, - "output_topic_names": { - "description": "Output topic to write the transform results to.", - "example": "orders-redacted", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "required": ["name", "input_topic_name", "output_topic_names"], - "type": "object" - }, - "EnvironmentVariable": { - "properties": { - "key": { - "description": "The key of your environment variable.", - "example": "LOG_LEVEL", - "type": "string" - }, - "value": { - "description": "The value of your environment variable.", - "example": "DEBUG", - "type": "string" - } - }, - "required": ["key", "value"], - "type": "object" - }, - "ErrorInfo": { - "description": "Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n { \"reason\": \"API_DISABLED\"\n \"domain\": \"googleapis.com\"\n \"metadata\": {\n \"resource\": \"projects/123\",\n \"service\": \"pubsub.googleapis.com\"\n }\n }\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n { \"reason\": \"STOCKOUT\"\n \"domain\": \"spanner.googleapis.com\",\n \"metadata\": {\n \"availableRegions\": \"us-central1,us-east2\"\n }\n }", - "properties": { - "domain": { - "description": "The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".", - "type": "string" - }, - "metadata": { - "additionalProperties": { - "type": "string" - }, - "description": "Additional structured details about this error.\n\nKeys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n{\"instanceLimit\": \"100/request\"}, should be returned as,\n{\"instanceLimitPerRequest\": \"100\"}, if the client exceeds the number of\ninstances that can be created in a single (batch) request.", - "type": "object" - }, - "reason": { - "description": "The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.", - "type": "string" - } - }, - "title": "ErrorInfo", - "type": "object" - }, - "FieldViolation": { - "description": "A message type used to describe a single bad request field.", - "properties": { - "description": { - "description": "A description of why the request element is bad.", - "type": "string" - }, - "field": { - "description": "A path that leads to a field in the request body. The value will be a\nsequence of dot-separated identifiers that identify a protocol buffer\nfield.\n\nConsider the following:\n\n message CreateContactRequest {\n message EmailAddress {\n enum Type {\n TYPE_UNSPECIFIED = 0;\n HOME = 1;\n WORK = 2;\n }\n\n optional string email = 1;\n repeated EmailType type = 2;\n }\n\n string full_name = 1;\n repeated EmailAddress email_addresses = 2;\n }\n\nIn this example, in proto `field` could take one of the following values:\n\n* `full_name` for a violation in the `full_name` value\n* `email_addresses[1].email` for a violation in the `email` field of the\n first `email_addresses` message\n* `email_addresses[3].type[2]` for a violation in the second `type`\n value in the third `email_addresses` message.\n\nIn JSON, the same values are represented as:\n\n* `fullName` for a violation in the `fullName` value\n* `emailAddresses[1].email` for a violation in the `email` field of the\n first `emailAddresses` message\n* `emailAddresses[3].type[2]` for a violation in the second `type`\n value in the third `emailAddresses` message.", - "type": "string" - } - }, - "type": "object" - }, - "GetConnectClusterResponse": { - "properties": { - "cluster": { - "$ref": "#/components/schemas/ConnectCluster" - } - }, - "type": "object" - }, - "GetConnectorConfigResponse": { - "properties": { - "config": { - "additionalProperties": { - "type": "string" - }, - "type": "object" - } - }, - "type": "object" - }, - "GetConnectorResponse": { - "properties": { - "connector": { - "$ref": "#/components/schemas/ConnectorSpec" - } - }, - "type": "object" - }, - "GetConnectorStatusResponse": { - "properties": { - "status": { - "$ref": "#/components/schemas/ConnectorStatus" - } - }, - "type": "object" - }, - "GetKafkaConnectSecretResponse": { - "description": "GetKafkaConnectSecretResponse is the response of GetKafkaConnectSecret.", - "properties": { - "secret": { - "$ref": "#/components/schemas/Secret" - } - }, - "type": "object" - }, - "GetMountTaskResponse": { - "properties": { - "task": { - "$ref": "#/components/schemas/MountTask" - } - }, - "type": "object" - }, - "GetPipelineResponse": { - "properties": { - "pipeline": { - "$ref": "#/components/schemas/Pipeline" - } - }, - "type": "object" - }, - "GetPipelineServiceConfigSchemaResponse": { - "properties": { - "config_schema": { - "description": "JSON schema of the configuration components that are allowed for Connect pipelines.", - "type": "string" - } - }, - "type": "object" - }, - "GetPipelinesBySecretsResponse": { - "properties": { - "pipelines_for_secret": { - "items": { - "$ref": "#/components/schemas/PipelinesForSecret" - }, - "type": "array" - } - }, - "type": "object" - }, - "GetPipelinesForSecretResponse": { - "properties": { - "pipelines_for_secret": { - "$ref": "#/components/schemas/PipelinesForSecret" - } - }, - "type": "object" - }, - "GetSecretResponse": { - "description": "GetSecretResponse is the response of GetSecret.", - "properties": { - "secret": { - "$ref": "#/components/schemas/Secret" - } - }, - "type": "object" - }, - "GetTopicConfigurationsResponse": { - "properties": { - "configurations": { - "items": { - "$ref": "#/components/schemas/Configuration" - }, - "type": "array" - } - }, - "type": "object" - }, - "GetTransformResponse": { - "properties": { - "transform": { - "$ref": "#/components/schemas/TransformMetadata" - } - }, - "type": "object" - }, - "Help": { - "description": "Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.", - "properties": { - "links": { - "description": "URL(s) pointing to additional information on handling the current error.", - "items": { - "$ref": "#/components/schemas/Link" - }, - "type": "array" - } - }, - "title": "Help", - "type": "object" - }, - "Link": { - "description": "Describes a URL link.", - "properties": { - "description": { - "description": "Describes what the link offers.", - "type": "string" - }, - "url": { - "description": "The URL of the link.", - "type": "string" - } - }, - "type": "object" - }, - "ListACLsRequest.Filter": { - "properties": { - "host": { - "description": "The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.", - "nullable": true, - "type": "string" - }, - "operation": { - "$ref": "#/components/schemas/ACL.Operation" - }, - "permission_type": { - "$ref": "#/components/schemas/PermissionType" - }, - "principal": { - "description": "The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.", - "nullable": true, - "type": "string" - }, - "resource_name": { - "description": "The name of the resource this ACL targets.", - "nullable": true, - "type": "string" - }, - "resource_pattern_type": { - "$ref": "#/components/schemas/ResourcePatternType" - }, - "resource_type": { - "$ref": "#/components/schemas/ResourceType" - } - }, - "type": "object" - }, - "ListACLsResponse": { - "properties": { - "resources": { - "items": { - "$ref": "#/components/schemas/Resource" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListConnectClustersResponse": { - "properties": { - "clusters": { - "items": { - "$ref": "#/components/schemas/ConnectCluster" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListConnectorTopicsResponse": { - "properties": { - "topics": { - "description": "Topic names.", - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListConnectorsResponse": { - "properties": { - "connectors": { - "description": "List of connectors, where the parent key is the connector name.", - "items": { - "$ref": "#/components/schemas/ConnectorInfoStatus" - }, - "type": "array" - }, - "next_page_token": { - "description": "Page Token to fetch the next page. The value can be used as page_token in the next call to this endpoint.", - "type": "string" - } - }, - "type": "object" - }, - "ListKafkaConnectSecretsResponse": { - "description": "ListKafkaConnectSecretsResponse is the response of ListKafkaConnectSecrets.", - "properties": { - "next_page_token": { - "description": "Token to retrieve the next page.", - "type": "string" - }, - "secrets": { - "description": "Secrets retrieved.", - "items": { - "$ref": "#/components/schemas/Secret" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListMountTasksResponse": { - "properties": { - "tasks": { - "items": { - "$ref": "#/components/schemas/MountTask" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListMountableTopicsResponse": { - "properties": { - "topics": { - "items": { - "$ref": "#/components/schemas/TopicLocation" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListPipelinesRequest.Filter": { - "properties": { - "name_contains": { - "description": "Any pipelines that partially match this name will be returned.", - "type": "string" - }, - "tags[string]": { - "additionalProperties": { - "type": "string" - }, - "description": "Pipelines that match all the provided tags will be returned.", - "type": "object" - } - }, - "type": "object" - }, - "ListPipelinesResponse": { - "properties": { - "next_page_token": { - "type": "string" - }, - "pipelines": { - "items": { - "$ref": "#/components/schemas/Pipeline" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListSecretScopesResponse": { - "description": "ListSecretScopesResponse is the response of ListSecretScopes.", - "properties": { - "scopes": { - "items": { - "$ref": "#/components/schemas/Scope" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListSecretsFilter": { - "description": "ListSecretsFilter are the filter options for listing secrets.", - "properties": { - "labels[string][string]": { - "additionalProperties": { - "type": "string" - }, - "description": "The secret labels to search for.", - "type": "object" - }, - "name_contains": { - "description": "Substring match on secret name. Case-sensitive.", - "type": "string" - }, - "scopes": { - "items": { - "$ref": "#/components/schemas/Scope" - }, - "title": "Secret scopes to search for", - "type": "array" - } - }, - "type": "object" - }, - "ListSecretsResponse": { - "description": "ListSecretsResponse is the response of ListSecrets.", - "properties": { - "next_page_token": { - "description": "Token to retrieve the next page.", - "type": "string" - }, - "secrets": { - "description": "Secrets retrieved.", - "items": { - "$ref": "#/components/schemas/Secret" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListTopicsRequest.Filter": { - "properties": { - "name_contains": { - "description": "Substring match on topic name. Case-sensitive.", - "type": "string" - } - }, - "type": "object" - }, - "ListTopicsResponse": { - "properties": { - "next_page_token": { - "type": "string" - }, - "topics": { - "items": { - "$ref": "#/components/schemas/ListTopicsResponse.Topic" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListTopicsResponse.Topic": { - "properties": { - "internal": { - "description": "Whether topic is internal only.", - "type": "boolean" - }, - "name": { - "description": "Topic name.", - "type": "string" - }, - "partition_count": { - "description": "Topic partition count.", - "format": "int32", - "type": "integer" - }, - "replication_factor": { - "description": "Topic replication factor.", - "format": "int32", - "type": "integer" - } - }, - "type": "object" - }, - "ListTransformsRequest.Filter": { - "properties": { - "name_contains": { - "description": "Substring match on transform name. Case-sensitive.", - "type": "string" - } - }, - "type": "object" - }, - "ListTransformsResponse": { - "properties": { - "next_page_token": { - "description": "Token to retrieve the next page.", - "type": "string" - }, - "transforms": { - "items": { - "$ref": "#/components/schemas/TransformMetadata" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListUsersRequest.Filter": { - "properties": { - "name": { - "description": "Username.", - "type": "string" - }, - "name_contains": { - "description": "Substring match on username. Case-sensitive.", - "type": "string" - } - }, - "type": "object" - }, - "ListUsersResponse": { - "properties": { - "next_page_token": { - "description": "Token to retrieve the next page.", - "type": "string" - }, - "users": { - "items": { - "$ref": "#/components/schemas/ListUsersResponse.User" - }, - "type": "array" - } - }, - "type": "object" - }, - "ListUsersResponse.User": { - "properties": { - "mechanism": { - "$ref": "#/components/schemas/SASLMechanism" - }, - "name": { - "description": "Username.", - "type": "string" - } - }, - "type": "object" - }, - "MatchingACL": { - "properties": { - "error": { - "$ref": "#/components/schemas/rpc.Status" - }, - "host": { - "description": "The host address to use for this ACL.", - "type": "string" - }, - "operation": { - "$ref": "#/components/schemas/ACL.Operation" - }, - "permission_type": { - "$ref": "#/components/schemas/PermissionType" - }, - "principal": { - "description": "The user for whom this ACL applies.", - "type": "string" - }, - "resource_name": { - "description": "The name of the resource this ACL targets.", - "type": "string" - }, - "resource_pattern_type": { - "$ref": "#/components/schemas/ResourcePatternType" - }, - "resource_type": { - "$ref": "#/components/schemas/ResourceType" - } - }, - "type": "object" - }, - "MountTask": { - "properties": { - "id": { - "description": "Unique identifier for this mount task.", - "format": "int32", - "type": "integer" - }, - "state": { - "$ref": "#/components/schemas/MountTask.State" - }, - "topics": { - "description": "List of topics that are being mounted or unmounted.", - "items": { - "$ref": "#/components/schemas/MountTask.Topic" - }, - "type": "array" - }, - "type": { - "$ref": "#/components/schemas/MountTask.Type" - } - }, - "type": "object" - }, - "MountTask.State": { - "description": " - STATE_PLANNED: Planned: The mount task has been created and is awaiting further actions.\n - STATE_PREPARING: Preparing: The mount task is gathering resources and preparing for execution.\n - STATE_PREPARED: Prepared: All preparations are complete, and the mount task is ready to be executed.\n - STATE_EXECUTING: Executing: The mount task is actively transferring or transforming data.\n - STATE_EXECUTED: Executed: The core mount task actions are complete, but the mount task has not yet cut over or finalized.\n - STATE_CUT_OVER: Cut Over: The mount task has reached a critical point where ownership is transferred or final adjustments are made.\n - STATE_FINISHED: Finished: The mount task has been successfully completed, and no further actions are required.\n - STATE_CANCELING: Canceling: The mount task is in the process of being canceled, and rollback or cleanup actions may be in progress.\n - STATE_CANCELLED: Cancelled: The mount task has been fully canceled, and no further actions will be taken.", - "enum": [ - "STATE_PLANNED", - "STATE_PREPARING", - "STATE_PREPARED", - "STATE_EXECUTING", - "STATE_EXECUTED", - "STATE_CUT_OVER", - "STATE_FINISHED", - "STATE_CANCELING", - "STATE_CANCELLED" - ], - "type": "string" - }, - "MountTask.Topic": { - "properties": { - "source_topic_reference": { - "description": "The topic reference in the object storage bucket.\nThis field is only set for tasks of type MOUNT.", - "type": "string" - }, - "topic_reference": { - "description": "The topic reference within the current cluster, which may be either a simple topic name or a full reference\nin the form: cluster-uuid/topic-name/revision.", - "type": "string" - } - }, - "type": "object" - }, - "MountTask.Type": { - "description": " - TYPE_MOUNT: Mount represents the process of making topics available in a cluster by loading them from object storage.\n - TYPE_UNMOUNT: Unmount represents the process of offloading topics back to object storage.", - "enum": ["TYPE_MOUNT", "TYPE_UNMOUNT"], - "type": "string" - }, - "MountTopicsResponse": { - "properties": { - "mount_task_id": { - "format": "int32", - "title": "ID of mount", - "type": "integer" - } - }, - "type": "object" - }, - "Options": { - "properties": { - "include_tasks": { - "description": "Restart connector's tasks.", - "type": "boolean" - }, - "only_failed": { - "description": "Restart only connectors that have failed.", - "type": "boolean" - } - }, - "type": "object" - }, - "PartitionStatus": { - "enum": [ - "PARTITION_STATUS_RUNNING", - "PARTITION_STATUS_INACTIVE", - "PARTITION_STATUS_ERRORED", - "PARTITION_STATUS_UNKNOWN" - ], - "type": "string" - }, - "PartitionTransformStatus": { - "properties": { - "broker_id": { - "format": "int32", - "type": "integer" - }, - "lag": { - "format": "int32", - "type": "integer" - }, - "partition_id": { - "format": "int32", - "type": "integer" - }, - "status": { - "$ref": "#/components/schemas/PartitionStatus" - } - }, - "type": "object" - }, - "PermissionType": { - "description": "Whether the operation should be allowed or denied.", - "enum": ["PERMISSION_TYPE_ANY", "PERMISSION_TYPE_DENY", "PERMISSION_TYPE_ALLOW"], - "type": "string" - }, - "Pipeline": { - "description": "Defines the pipeline resource.", - "properties": { - "config_yaml": { - "description": "The Repanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.", - "title": "The pipeline configuration in YAML.\nSee https://docs.redpanda.com/redpanda-connect/configuration/about/", - "type": "string" - }, - "description": { - "description": "Optional pipeline description.", - "type": "string" - }, - "display_name": { - "description": "User-friendly pipeline name.", - "type": "string" - }, - "id": { - "description": "Pipeline ID.", - "type": "string" - }, - "resources": { - "$ref": "#/components/schemas/Resources" - }, - "state": { - "$ref": "#/components/schemas/Pipeline.State" - }, - "status": { - "$ref": "#/components/schemas/Pipeline.Status" - }, - "tags": { - "additionalProperties": { - "type": "string" - }, - "description": "Tags are key-value pairs that can be assigned to a pipeline resource.\nThey help organize pipelines and enable filtering when listing them.", - "type": "object" - }, - "url": { - "description": "URL to connect to the pipeline, e.g. via http_server.\nMay be empty if no http_server is used.", - "type": "string" - } - }, - "required": ["id", "display_name", "config_yaml"], - "type": "object" - }, - "Pipeline.State": { - "description": "State of the pipeline.\n\n - STATE_STARTING: The pipeline is starting.\n - STATE_RUNNING: The pipeline is running.\n - STATE_STOPPING: The pipeline is in the process of stopping.\n - STATE_STOPPED: The pipeline is stopped and in paused state.\n - STATE_ERROR: The pipeline encountered an error. See [Error Handling](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/error_handling/) for further guidance.\n - STATE_COMPLETED: The pipeline has completed the job successfully.", - "enum": [ - "STATE_STARTING", - "STATE_RUNNING", - "STATE_STOPPING", - "STATE_STOPPED", - "STATE_ERROR", - "STATE_COMPLETED" - ], - "type": "string" - }, - "Pipeline.Status": { - "description": "Pipeline status may contain an error message.", - "properties": { - "error": { - "type": "string" - } - }, - "type": "object" - }, - "PipelineCreate": { - "description": "PipelineCreate contains the details for the pipeline creation request.", - "properties": { - "config_yaml": { - "description": "The Repanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.", - "type": "string" - }, - "description": { - "description": "Pipeline description.", - "type": "string" - }, - "display_name": { - "description": "User-friendly pipeline name.", - "type": "string" - }, - "resources": { - "$ref": "#/components/schemas/Resources" - }, - "tags": { - "additionalProperties": { - "type": "string" - }, - "description": "Optional lList of tags to attach to a pipeline.", - "type": "object" - } - }, - "required": ["display_name", "config_yaml"], - "type": "object" - }, - "PipelineUpdate": { - "properties": { - "config_yaml": { - "description": "The Repanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.", - "type": "string" - }, - "description": { - "description": "Pipeline description.", - "type": "string" - }, - "display_name": { - "description": "User-friendly pipeline name.", - "type": "string" - }, - "resources": { - "$ref": "#/components/schemas/Resources" - }, - "tags": { - "additionalProperties": { - "type": "string" - }, - "description": "A map of tags to add, update or delete.\nIf a tag's value is empty, the server interprets that as a deletion.", - "type": "object" - } - }, - "required": ["display_name", "config_yaml"], - "type": "object" - }, - "PipelinesForSecret": { - "properties": { - "pipelines": { - "items": { - "$ref": "#/components/schemas/Pipeline" - }, - "type": "array" - }, - "secret_id": { - "type": "string" - } - }, - "type": "object" - }, - "Policy": { - "properties": { - "host": { - "description": "The host address for this ACL.", - "type": "string" - }, - "operation": { - "$ref": "#/components/schemas/ACL.Operation" - }, - "permission_type": { - "$ref": "#/components/schemas/PermissionType" - }, - "principal": { - "description": "The user for whom this ACL applies.", - "type": "string" - } - }, - "type": "object" - }, - "QuotaFailure": { - "description": "Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.", - "properties": { - "violations": { - "description": "Describes all quota violations.", - "items": { - "$ref": "#/components/schemas/QuotaFailure.Violation" - }, - "type": "array" - } - }, - "title": "QuotaFailure", - "type": "object" - }, - "QuotaFailure.Violation": { - "description": "A message type used to describe a single quota violation. For example, a\ndaily quota or a custom quota that was exceeded.", - "properties": { - "description": { - "description": "A description of how the quota check failed. Clients can use this\ndescription to find more about the quota configuration in the service's\npublic documentation, or find the relevant quota limit to adjust through\ndeveloper console.\n\nFor example: \"Service disabled\" or \"Daily Limit for read operations\nexceeded\".", - "type": "string" - }, - "subject": { - "description": "The subject on which the quota check failed.\nFor example, \"clientip:\" or \"project:\".", - "type": "string" - } - }, - "type": "object" - }, - "ReplicaAssignment": { - "properties": { - "partition_id": { - "description": "A partition to create.", - "format": "int32", - "type": "integer" - }, - "replica_ids": { - "description": "The broker IDs the partition replicas are assigned to.", - "items": { - "format": "int32", - "type": "integer" - }, - "type": "array" - } - }, - "type": "object" - }, - "Resource": { - "properties": { - "acls": { - "items": { - "$ref": "#/components/schemas/Policy" - }, - "type": "array" - }, - "resource_name": { - "description": "The name of the resource this ACL targets.", - "type": "string" - }, - "resource_pattern_type": { - "$ref": "#/components/schemas/ResourcePatternType" - }, - "resource_type": { - "$ref": "#/components/schemas/ResourceType" - } - }, - "type": "object" - }, - "ResourcePatternType": { - "description": "The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).", - "enum": [ - "RESOURCE_PATTERN_TYPE_ANY", - "RESOURCE_PATTERN_TYPE_MATCH", - "RESOURCE_PATTERN_TYPE_LITERAL", - "RESOURCE_PATTERN_TYPE_PREFIXED" - ], - "type": "string" - }, - "ResourceType": { - "description": "The type of resource (topic, consumer group, etc.) this\nACL targets.", - "enum": [ - "RESOURCE_TYPE_ANY", - "RESOURCE_TYPE_TOPIC", - "RESOURCE_TYPE_GROUP", - "RESOURCE_TYPE_CLUSTER", - "RESOURCE_TYPE_TRANSACTIONAL_ID", - "RESOURCE_TYPE_DELEGATION_TOKEN", - "RESOURCE_TYPE_USER" - ], - "type": "string" - }, - "Resources": { - "properties": { - "cpu_shares": { - "description": "`cpu_shares` is a string specifying the amount of CPU to allocate for the\npipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable\nunits include:\n- Decimal SI units: \"m\" (e.g., \"500m\" for 500 millicores, \"2\" for 2 cores)\nCPU shares can be specified in millicores (1 core = 1000 millicores).\nIf you don't specify a unit, the value is interpreted as the number of cores.", - "type": "string" - }, - "memory_shares": { - "description": "`memory_shares` is a string specifying the amount of memory to allocate for\nthe pipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable units\ninclude:\n- Decimal SI units: \"K\", \"M\", \"G\", \"T\", \"P\", \"E\" (e.g., \"128M\" for 128\n megabytes)\n- Binary SI units: \"Ki\", \"Mi\", \"Gi\", \"Ti\", \"Pi\", \"Ei\" (e.g., \"512Mi\" for\n512 mebibytes) If you don't specify a unit, the value is interpreted as\nbytes.", - "type": "string" - } - }, - "required": ["memory_shares", "cpu_shares"], - "type": "object" - }, - "SASLMechanism": { - "description": "SASL mechanism to use for authentication.", - "enum": ["SASL_MECHANISM_SCRAM_SHA_256", "SASL_MECHANISM_SCRAM_SHA_512"], - "type": "string" - }, - "Scope": { - "description": "Defines the scope of a secret.", - "enum": ["SCOPE_REDPANDA_CONNECT", "SCOPE_REDPANDA_CLUSTER"], - "type": "string" - }, - "Secret": { - "description": "Defines the secret resource.", - "properties": { - "id": { - "description": "Secret identifier.", - "readOnly": true, - "type": "string" - }, - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "Secret labels.", - "type": "object" - }, - "scopes": { - "items": { - "$ref": "#/components/schemas/Scope" - }, - "title": "Secret scopes", - "type": "array" - } - }, - "type": "object" - }, - "SetConfiguration": { - "properties": { - "name": { - "description": "A topic-level config key (e.g. `segment.bytes`).", - "type": "string" - }, - "value": { - "description": "A topic-level config value (e.g. 1073741824).", - "nullable": true, - "type": "string" - } - }, - "type": "object" - }, - "SetPartitionsToTopicsRequest": { - "properties": { - "partition_count": { - "description": "The number of partitions to set for the topics.", - "format": "int32", - "type": "integer" - }, - "topic_names": { - "description": "The topic names.", - "items": { - "type": "string" - }, - "type": "array" - }, - "validate_only": { - "description": "Validate the request only, do not execute it.", - "type": "boolean" - } - }, - "type": "object" - }, - "SetPartitionsToTopicsResponse": { - "properties": { - "statuses": { - "description": "The status of the operation for each topic.", - "items": { - "$ref": "#/components/schemas/AlterTopicPartitionStatus" - }, - "type": "array" - } - }, - "type": "object" - }, - "SetTopicConfigurationsResponse": { - "properties": { - "configurations": { - "description": "Topic's complete set of configurations after this update.", - "items": { - "$ref": "#/components/schemas/Configuration" - }, - "type": "array" - } - }, - "type": "object" - }, - "SetTopicPartitionsBody": { - "properties": { - "partition_count": { - "description": "The number of partitions to set for the topic.", - "format": "int32", - "type": "integer" - }, - "validate_only": { - "description": "Validate the request only, do not execute it.", - "type": "boolean" - } - }, - "type": "object" - }, - "SetTopicPartitionsResponse": { - "type": "object" - }, - "StartPipelineResponse": { - "properties": { - "pipeline": { - "$ref": "#/components/schemas/Pipeline" - } - }, - "type": "object" - }, - "StopPipelineResponse": { - "properties": { - "pipeline": { - "$ref": "#/components/schemas/Pipeline" - } - }, - "type": "object" - }, - "TaskInfo": { - "properties": { - "connector": { - "description": "Name of connector.", - "type": "string" - }, - "task": { - "description": "The connector task ID.", - "format": "int32", - "type": "integer" - } - }, - "type": "object" - }, - "TaskStatus": { - "properties": { - "id": { - "description": "The connector task ID.", - "format": "int32", - "type": "integer" - }, - "state": { - "description": "State of connector task.", - "type": "string" - }, - "trace": { - "description": "String value of stack trace.", - "type": "string" - }, - "worker_id": { - "description": "ID of worker that the task is assigned to.", - "type": "string" - } - }, - "type": "object" - }, - "TopicLocation": { - "properties": { - "topic_location": { - "description": "Full reference for the unmounted topic in this format: `topic-name/cluster-uuid/revision`.\nUse this as unique identifier for mounting a topic if there are multiple topics available\nwith the same name.", - "type": "string" - }, - "topic_name": { - "description": "Topic name.", - "type": "string" - } - }, - "type": "object" - }, - "TopicMount": { - "description": "TopicMount defines the migration of a topic from the cloud storage into this cluster,\nso that it becomes available via the Kafka API.", - "properties": { - "alias": { - "description": "Alias may be provided to mount the topic under a different name. Leave\nblank to re-use the source topic name. The alias does not persist if you\nunmount the topic again.", - "type": "string" - }, - "source_topic_reference": { - "description": "The topic name or full reference of the topic to mount. The full reference\nmust be used in case the same topic exists more than once. This may be the case if\nthe same topic has been unmounted multiple times. List all mountable topics to\nfind the full reference (contains topic name, cluster uuid and revision).", - "type": "string" - } - }, - "required": ["source_topic_reference"], - "type": "object" - }, - "TransformMetadata": { - "properties": { - "environment_variables": { - "description": "The environment variables you want to apply to your transform's environment", - "items": { - "$ref": "#/components/schemas/EnvironmentVariable" - }, - "type": "array" - }, - "input_topic_name": { - "description": "Input topic to apply the transform to.", - "type": "string" - }, - "name": { - "description": "Name of transform.", - "type": "string" - }, - "output_topic_names": { - "description": "Output topics to write the transform results to.", - "items": { - "type": "string" - }, - "type": "array" - }, - "statuses": { - "items": { - "$ref": "#/components/schemas/PartitionTransformStatus" - }, - "type": "array" - } - }, - "type": "object" - }, - "UnmountTopicsResponse": { - "properties": { - "mount_task_id": { - "format": "int32", - "title": "ID of unmount", - "type": "integer" - } - }, - "type": "object" - }, - "UpdateConfiguration": { - "properties": { - "name": { - "description": "A topic-level config key (e.g. `segment.bytes`).", - "type": "string" - }, - "operation": { - "$ref": "#/components/schemas/ConfigAlterOperation" - }, - "value": { - "description": "A topic-level config value (e.g. 1073741824).", - "nullable": true, - "type": "string" - } - }, - "type": "object" - }, - "UpdateKafkaConnectSecretBody": { - "description": "UpdateKafkaConnectSecretRequest is the request of UpdateKafkaConnectSecret.", - "properties": { - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "Secret labels.", - "type": "object" - }, - "secret_data": { - "description": "The secret data. Must be Base64-encoded.", - "format": "byte", - "type": "string" - } - }, - "required": ["secret_data"], - "type": "object" - }, - "UpdateKafkaConnectSecretResponse": { - "description": "UpdateKafkaConnectSecretResponse is the response of UpdateKafkaConnectSecret.", - "properties": { - "secret": { - "$ref": "#/components/schemas/Secret" - } - }, - "type": "object" - }, - "UpdateMountTaskBody": { - "properties": { - "action": { - "$ref": "#/components/schemas/Action" - } - }, - "required": ["action"], - "type": "object" - }, - "UpdateMountTaskResponse": { - "type": "object" - }, - "UpdatePipelineResponse": { - "properties": { - "pipeline": { - "$ref": "#/components/schemas/Pipeline" - } - }, - "type": "object" - }, - "UpdateSecretBody": { - "description": "UpdateSecretRequest is the request of UpdateSecret.", - "properties": { - "labels": { - "additionalProperties": { - "type": "string" - }, - "description": "Secret labels.", - "type": "object" - }, - "scopes": { - "items": { - "$ref": "#/components/schemas/Scope" - }, - "title": "Secret scopes", - "type": "array" - }, - "secret_data": { - "description": "The secret data. Must be Base64-encoded.", - "format": "byte", - "type": "string" - } - }, - "required": ["secret_data"], - "type": "object" - }, - "UpdateSecretResponse": { - "description": "UpdateSecretResponse is the response of UpdateSecret.", - "properties": { - "secret": { - "$ref": "#/components/schemas/Secret" - } - }, - "type": "object" - }, - "UpdateTopicConfigurationsResponse": { - "properties": { - "configurations": { - "description": "Topic's complete set of configurations after applying this partial patch.", - "items": { - "$ref": "#/components/schemas/Configuration" - }, - "type": "array" - } - }, - "type": "object" - }, - "UpdateUserRequest.User": { - "properties": { - "mechanism": { - "$ref": "#/components/schemas/SASLMechanism" - }, - "name": { - "description": "Username.", - "type": "string" - }, - "password": { - "description": "Password.", - "type": "string" - } - }, - "type": "object" - }, - "UpdateUserResponse": { - "properties": { - "user": { - "$ref": "#/components/schemas/UpdateUserResponse.User" - } - }, - "type": "object" - }, - "UpdateUserResponse.User": { - "description": "Updated user's name and SASL mechanism.", - "properties": { - "mechanism": { - "$ref": "#/components/schemas/SASLMechanism" - }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "UpsertConnectorResponse": { - "properties": { - "connector": { - "$ref": "#/components/schemas/ConnectorSpec" - } - }, - "type": "object" - }, - "rpc.Status": { - "description": "The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors).", - "properties": { - "code": { - "description": "RPC status code, as described [here](https://github.com/googleapis/googleapis/blob/b4c238feaa1097c53798ed77035bbfeb7fc72e96/google/rpc/code.proto#L32).", - "enum": [ - "OK", - "CANCELLED", - "UNKNOWN", - "INVALID_ARGUMENT", - "DEADLINE_EXCEEDED", - "NOT_FOUND", - "ALREADY_EXISTS", - "PERMISSION_DENIED", - "UNAUTHENTICATED", - "RESOURCE_EXHAUSTED", - "FAILED_PRECONDITION", - "ABORTED", - "OUT_OF_RANGE", - "UNIMPLEMENTED", - "INTERNAL", - "UNAVAILABLE", - "DATA_LOSS" - ], - "format": "int32", - "type": "string" - }, - "details": { - "items": { - "description": "Details of the error.", - "oneOf": [ - { - "allOf": [ - { - "properties": { - "@type": { - "description": "Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.", - "enum": ["type.googleapis.com/google.rpc.BadRequest"], - "type": "string" - } - } - }, - { - "$ref": "#/components/schemas/BadRequest" - } - ] - }, - { - "allOf": [ - { - "properties": { - "@type": { - "description": "Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.", - "enum": ["type.googleapis.com/google.rpc.ErrorInfo"], - "type": "string" - } - } - }, - { - "$ref": "#/components/schemas/ErrorInfo" - } - ] - }, - { - "allOf": [ - { - "properties": { - "@type": { - "description": "Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.", - "enum": ["type.googleapis.com/google.rpc.QuotaFailure"], - "type": "string" - } - } - }, - { - "$ref": "#/components/schemas/QuotaFailure" - } - ] - }, - { - "allOf": [ - { - "properties": { - "@type": { - "description": "Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.", - "enum": ["type.googleapis.com/google.rpc.Help"], - "type": "string" - } - } - }, - { - "$ref": "#/components/schemas/Help" - } - ] - } - ] - }, - "type": "array" - }, - "message": { - "description": "Detailed error message. No compatibility guarantees are given for the text contained in this message.", - "type": "string" - } - }, - "type": "object" - } - }, - "securitySchemes": { - "auth0": { - "description": "RedpandaCloud", - "flows": { - "implicit": { - "authorizationUrl": "https://auth.prd.cloud.redpanda.com/oauth/authorize", - "scopes": {}, - "x-client-id": "dQjapNIAHhF7EQqQToRla3yEII9sUSap" - } - }, - "type": "oauth2" - } - } - }, - "info": { - "title": "Redpanda Cloud Data Plane API", - "version": "v1" - }, - "openapi": "3.0.3", - "paths": { - "/v1/acls": { - "delete": { - "description": "Delete all ACLs that match the filter criteria. The `filter.` query string parameters find matching ACLs that meet all specified conditions.", - "operationId": "ACLService_DeleteACLs", - "parameters": [ - { - "description": "The type of resource (topic, consumer group, etc.) this\nACL targets.", - "in": "query", - "name": "filter.resource_type", - "required": true, - "schema": { - "enum": [ - "RESOURCE_TYPE_ANY", - "RESOURCE_TYPE_TOPIC", - "RESOURCE_TYPE_GROUP", - "RESOURCE_TYPE_CLUSTER", - "RESOURCE_TYPE_TRANSACTIONAL_ID", - "RESOURCE_TYPE_DELEGATION_TOKEN", - "RESOURCE_TYPE_USER" - ], - "type": "string" - } - }, - { - "description": "The name of the resource this ACL targets.", - "in": "query", - "name": "filter.resource_name", - "schema": { - "type": "string" - } - }, - { - "description": "The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).", - "in": "query", - "name": "filter.resource_pattern_type", - "required": true, - "schema": { - "enum": [ - "RESOURCE_PATTERN_TYPE_ANY", - "RESOURCE_PATTERN_TYPE_MATCH", - "RESOURCE_PATTERN_TYPE_LITERAL", - "RESOURCE_PATTERN_TYPE_PREFIXED" - ], - "type": "string" - } - }, - { - "description": "The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.", - "in": "query", - "name": "filter.principal", - "schema": { - "type": "string" - } - }, - { - "description": "The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.", - "in": "query", - "name": "filter.host", - "schema": { - "type": "string" - } - }, - { - "description": "The operation that is allowed or denied (e.g. READ).", - "in": "query", - "name": "filter.operation", - "required": true, - "schema": { - "enum": [ - "OPERATION_ANY", - "OPERATION_ALL", - "OPERATION_READ", - "OPERATION_WRITE", - "OPERATION_CREATE", - "OPERATION_DELETE", - "OPERATION_ALTER", - "OPERATION_DESCRIBE", - "OPERATION_CLUSTER_ACTION", - "OPERATION_DESCRIBE_CONFIGS", - "OPERATION_ALTER_CONFIGS", - "OPERATION_IDEMPOTENT_WRITE", - "OPERATION_CREATE_TOKENS", - "OPERATION_DESCRIBE_TOKENS" - ], - "type": "string" - } - }, - { - "description": "Whether the operation should be allowed or denied.", - "in": "query", - "name": "filter.permission_type", - "required": true, - "schema": { - "enum": ["PERMISSION_TYPE_ANY", "PERMISSION_TYPE_DENY", "PERMISSION_TYPE_ALLOW"], - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteACLsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete ACLs", - "tags": ["Redpanda ACLs"] - }, - "get": { - "description": "List all ACLs. The `filter.` query string parameters find matching ACLs that meet all specified conditions.", - "operationId": "ACLService_ListACLs", - "parameters": [ - { - "description": "The type of resource (topic, consumer group, etc.) this\nACL targets.", - "in": "query", - "name": "filter.resource_type", - "schema": { - "enum": [ - "RESOURCE_TYPE_ANY", - "RESOURCE_TYPE_TOPIC", - "RESOURCE_TYPE_GROUP", - "RESOURCE_TYPE_CLUSTER", - "RESOURCE_TYPE_TRANSACTIONAL_ID", - "RESOURCE_TYPE_DELEGATION_TOKEN", - "RESOURCE_TYPE_USER" - ], - "type": "string" - } - }, - { - "description": "The name of the resource this ACL targets.", - "in": "query", - "name": "filter.resource_name", - "schema": { - "type": "string" - } - }, - { - "description": "The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).", - "in": "query", - "name": "filter.resource_pattern_type", - "schema": { - "enum": [ - "RESOURCE_PATTERN_TYPE_ANY", - "RESOURCE_PATTERN_TYPE_MATCH", - "RESOURCE_PATTERN_TYPE_LITERAL", - "RESOURCE_PATTERN_TYPE_PREFIXED" - ], - "type": "string" - } - }, - { - "description": "The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.", - "in": "query", - "name": "filter.principal", - "schema": { - "type": "string" - } - }, - { - "description": "The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.", - "in": "query", - "name": "filter.host", - "schema": { - "type": "string" - } - }, - { - "description": "The operation that is allowed or denied (e.g. READ).", - "in": "query", - "name": "filter.operation", - "schema": { - "enum": [ - "OPERATION_ANY", - "OPERATION_ALL", - "OPERATION_READ", - "OPERATION_WRITE", - "OPERATION_CREATE", - "OPERATION_DELETE", - "OPERATION_ALTER", - "OPERATION_DESCRIBE", - "OPERATION_CLUSTER_ACTION", - "OPERATION_DESCRIBE_CONFIGS", - "OPERATION_ALTER_CONFIGS", - "OPERATION_IDEMPOTENT_WRITE", - "OPERATION_CREATE_TOKENS", - "OPERATION_DESCRIBE_TOKENS" - ], - "type": "string" - } - }, - { - "description": "Whether the operation should be allowed or denied.", - "in": "query", - "name": "filter.permission_type", - "schema": { - "enum": ["PERMISSION_TYPE_ANY", "PERMISSION_TYPE_DENY", "PERMISSION_TYPE_ALLOW"], - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListACLsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List ACLs", - "tags": ["Redpanda ACLs"] - }, - "post": { - "description": "Create a new ACL.", - "operationId": "ACLService_CreateACL", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateACLRequest" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateACLResponse" - } - } - }, - "description": "Created" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Create ACL", - "tags": ["Redpanda ACLs"] - } - }, - "/v1/cloud-storage/mount-tasks": { - "get": { - "description": "This operation retrieves the status of a task responsible for mounting or unmounting topics. It provides details on the task’s type (mount or unmount), its current state, and the topics involved.", - "operationId": "CloudStorageService_ListMountTasks", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListMountTasksResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Retrieve the mount task status", - "tags": ["Cloud Storage"] - } - }, - "/v1/cloud-storage/mount-tasks/{id}": { - "delete": { - "description": "Delete a mount or unmount by ID.", - "operationId": "CloudStorageService_DeleteMountTask", - "parameters": [ - { - "description": "Unique identifier of the mount or unmount task to delete.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "format": "int32", - "type": "integer" - } - } - ], - "responses": { - "202": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/DeleteMountTaskResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete a mount or unmount", - "tags": ["Cloud Storage"] - }, - "get": { - "description": "Retrieves the status of a mount or unmount by ID. The response provides details on the operation type (mount or unmount), its current state, and the topics involved. Use the ID returned when you start the mount or unmount, or use the ListMountTasks endpoint to retrieve a list of IDs.", - "operationId": "CloudStorageService_GetMountTask", - "parameters": [ - { - "description": "Unique identifier of the mount or unmount task to retrieve.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "format": "int32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetMountTaskResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get the status of a mount or unmount by ID", - "tags": ["Cloud Storage"] - }, - "post": { - "description": "This operation allows performing an action on an ongoing mount task.", - "operationId": "CloudStorageService_UpdateMountTask", - "parameters": [ - { - "description": "ID is the unique identifier of the mount or unmount to update.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "format": "int32", - "type": "integer" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMountTaskBody" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateMountTaskResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Update a mount or unmount", - "tags": ["Cloud Storage"] - } - }, - "/v1/cloud-storage/topics/mount": { - "post": { - "description": "Attach mountable topics from object storage to a cluster, making them available for consumption and production again. Mounting a topic reloads its data and state to the local brokers, allowing active use of the topic.", - "operationId": "CloudStorageService_MountTopics", - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/TopicMount" - }, - "required": ["topics"], - "type": "array" - } - } - }, - "required": true, - "x-originalParamName": "topics" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MountTopicsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Mount topics from object storage", - "tags": ["Cloud Storage"] - } - }, - "/v1/cloud-storage/topics/mountable": { - "get": { - "description": "Retrieve all topics that are currently unmounted and available to be mounted to the cluster. These topics reside in object storage and can be mounted for consumption or production within the cluster.", - "operationId": "CloudStorageService_ListMountableTopics", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListMountableTopicsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List mountable topics", - "tags": ["Cloud Storage"] - } - }, - "/v1/cloud-storage/topics/unmount": { - "post": { - "description": "Unmount topics to object storage, freeing up all local cluster resources. Once you unmount a topic, it can no longer be consumed or produced to. It detaches from the active cluster while its data remains safely stored in the external object storage.", - "operationId": "CloudStorageService_UnmountTopics", - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "type": "string" - }, - "required": ["topics"], - "type": "array" - } - } - }, - "description": "List of topics to unmount.", - "required": true, - "x-originalParamName": "topics" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UnmountTopicsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Unmount topics to object storage", - "tags": ["Cloud Storage"] - } - }, - "/v1/kafka-connect/clusters": { - "get": { - "description": "List connect clusters available for being consumed by the console's kafka-connect service.", - "operationId": "KafkaConnectService_ListConnectClusters", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListConnectClustersResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List connect clusters", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}": { - "get": { - "description": "Get information about an available Kafka Connect cluster.", - "operationId": "KafkaConnectService_GetConnectCluster", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectCluster" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Connect cluster not found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get connect cluster", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors": { - "get": { - "description": "List connectors managed by the Kafka Connect service.", - "operationId": "KafkaConnectService_ListConnectors", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.", - "in": "query", - "name": "page_token", - "schema": { - "type": "string" - } - }, - { - "description": "Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.", - "in": "query", - "name": "page_size", - "schema": { - "format": "int32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListConnectorsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List connectors", - "tags": ["Kafka Connect"] - }, - "post": { - "description": "Create a connector with the specified configuration.", - "operationId": "KafkaConnectService_CreateConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectorSpec" - } - } - }, - "required": true, - "x-originalParamName": "connector" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectorSpec" - } - } - }, - "description": "Created" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Create connector", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}": { - "delete": { - "description": "Delete a connector. This operation force stops all tasks and also deletes the connector configuration.", - "operationId": "KafkaConnectService_DeleteConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Deleted" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete connector", - "tags": ["Kafka Connect"] - }, - "get": { - "description": "Get information about a connector in a specific cluster.", - "operationId": "KafkaConnectService_GetConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectorSpec" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get connector", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/config": { - "get": { - "description": "Get the configuration for the connector.", - "operationId": "KafkaConnectService_GetConnectorConfig", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get connector configuration", - "tags": ["Kafka Connect"] - }, - "put": { - "description": "Update the configuration for an existing connector with the specified name, or create a new connector using the given configuration. Returns information about the connector after the change has been made.", - "operationId": "KafkaConnectService_UpsertConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector. If a connector with this name does not already exist, a new connector is created.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "additionalProperties": { - "type": "string" - }, - "required": ["config"], - "type": "object" - } - } - }, - "description": "Connector configuration property.", - "required": true, - "x-originalParamName": "config" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectorSpec" - } - } - }, - "description": "Updated" - }, - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectorSpec" - } - } - }, - "description": "Created" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Upsert connector configuration", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/pause": { - "put": { - "description": "Pause the connector and its tasks, which stops messages from processing until the connector is resumed. This call is asynchronous and may take some time to process.", - "operationId": "KafkaConnectService_PauseConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "202": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Pause request accepted" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Pause connector", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/restart": { - "post": { - "description": "Triggers a connector restart. You must specify whether or not tasks are also restarted, and whether only failed connectors are restarted.", - "operationId": "KafkaConnectService_RestartConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Options" - } - } - }, - "required": true, - "x-originalParamName": "options" - }, - "responses": { - "204": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Restart connector request success" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Restart connector", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/resume": { - "put": { - "description": "Resume a paused connector and its tasks, and resumes message processing. This call is asynchronous and may take some time to process. If the connector was not paused, this operation does not do anything.", - "operationId": "KafkaConnectService_ResumeConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "202": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Resume request accepted" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Resume connector", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/status": { - "get": { - "description": "Gets the current status of the connector, including the state for each of its tasks, error information, etc.", - "operationId": "KafkaConnectService_GetConnectorStatus", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ConnectorStatus" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get connector status", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/stop": { - "put": { - "description": "Stops a connector, but does not delete it. All tasks for the connector are shut down completely. This call is asynchronous and may take some time to process.", - "operationId": "KafkaConnectService_StopConnector", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "202": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Request accepted" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Stop connector", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics": { - "get": { - "description": "Returns a list of connector topic names. If the connector is inactive, this call returns an empty list.", - "operationId": "KafkaConnectService_ListConnectorTopics", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListConnectorTopicsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List connector topics", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics/reset": { - "put": { - "description": "Resets the set of topic names that the connector is using.", - "operationId": "KafkaConnectService_ResetConnectorTopics", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Name of connector using the topics to be reset.", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Reset connector topics", - "tags": ["Kafka Connect"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/secrets": { - "get": { - "description": "List Kafka Connect cluster secrets. Optional: filter based on secret name and labels.", - "operationId": "SecretService_ListKafkaConnectSecrets", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Substring match on secret name. Case-sensitive.", - "in": "query", - "name": "filter.name_contains", - "schema": { - "type": "string" - } - }, - { - "description": "This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18", - "in": "query", - "name": "filter.labels[string][string]", - "schema": { - "type": "string" - } - }, - { - "description": "Secret scopes to search for", - "in": "query", - "name": "filter.scopes", - "schema": { - "items": { - "enum": ["SCOPE_REDPANDA_CONNECT", "SCOPE_REDPANDA_CLUSTER"], - "type": "string" - }, - "type": "array" - } - }, - { - "description": "Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.", - "in": "query", - "name": "page_token", - "schema": { - "type": "string" - } - }, - { - "description": "Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.", - "in": "query", - "name": "page_size", - "schema": { - "format": "int32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListSecretsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List Connect Cluster Secrets", - "tags": ["Secrets"] - }, - "post": { - "description": "Create a Kafka Connect cluster secret.", - "operationId": "SecretService_CreateKafkaConnectSecret", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateKafkaConnectSecretBody" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Secret" - } - } - }, - "description": "Secret created" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Create Connect Cluster Secret", - "tags": ["Secrets"] - } - }, - "/v1/kafka-connect/clusters/{cluster_name}/secrets/{id}": { - "delete": { - "description": "Delete a Kafka Connect cluster secret.", - "operationId": "SecretService_DeleteKafkaConnectSecret", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "ID of the secret to delete.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Secret deleted successfully" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete Connect Cluster Secret", - "tags": ["Secrets"] - }, - "get": { - "description": "Get a specific Kafka Connect cluster secret.", - "operationId": "SecretService_GetKafkaConnectSecret", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "The ID of the secret to retrieve.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Secret" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get Connect Cluster Secret", - "tags": ["Secrets"] - }, - "put": { - "description": "Update a Kafka Connect cluster secret.", - "operationId": "SecretService_UpdateKafkaConnectSecret", - "parameters": [ - { - "description": "Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.", - "in": "path", - "name": "cluster_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "ID of the secret to update.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateKafkaConnectSecretBody" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Secret" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Update Connect Cluster Secret", - "tags": ["Secrets"] - } - }, - "/v1/redpanda-connect/config-schema": { - "get": { - "description": "The configuration schema includes available [components and processors](https://docs.redpanda.com/redpanda-cloud/develop/connect/components/about) in this Redpanda Connect instance.", - "operationId": "PipelineService_GetPipelineServiceConfigSchema", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetPipelineServiceConfigSchemaResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Retrieve the schema for Redpanda Connect pipeline configurations.", - "tags": ["Redpanda Connect Pipeline"] - } - }, - "/v1/redpanda-connect/pipelines": { - "get": { - "description": "List Redpanda Connect pipelines. Optional: filter based on pipeline name.", - "operationId": "PipelineService_ListPipelines", - "parameters": [ - { - "description": "Any pipelines that partially match this name will be returned.", - "in": "query", - "name": "filter.name_contains", - "schema": { - "type": "string" - } - }, - { - "description": "This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18", - "in": "query", - "name": "filter.tags[string]", - "schema": { - "type": "string" - } - }, - { - "description": "Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.", - "in": "query", - "name": "page_size", - "schema": { - "format": "int32", - "type": "integer" - } - }, - { - "description": "Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.", - "in": "query", - "name": "page_token", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListPipelinesResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List Redpanda Connect pipelines", - "tags": ["Redpanda Connect Pipeline"] - }, - "post": { - "description": "Create a new Redpanda Connect pipeline.", - "operationId": "PipelineService_CreatePipeline", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PipelineCreate" - } - } - }, - "required": true, - "x-originalParamName": "pipeline" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pipeline" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Create Redpanda Connect pipeline", - "tags": ["Redpanda Connect Pipeline"] - } - }, - "/v1/redpanda-connect/pipelines-by-secrets": { - "get": { - "description": "Get Redpanda Connect pipelines by secrets.", - "operationId": "PipelineService_GetPipelinesBySecrets", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetPipelinesBySecretsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get Redpanda Connect pipelines by secrets", - "tags": ["Redpanda Connect Pipeline"] - } - }, - "/v1/redpanda-connect/pipelines-for-secret": { - "get": { - "description": "Get Redpanda Connect pipelines for a given secret.", - "operationId": "PipelineService_GetPipelinesForSecret", - "parameters": [ - { - "description": "Secret ID.", - "in": "query", - "name": "secret_id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetPipelinesForSecretResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get Redpanda Connect pipelines for secret", - "tags": ["Redpanda Connect Pipeline"] - } - }, - "/v1/redpanda-connect/pipelines/{id}": { - "delete": { - "description": "Delete a Redpanda Connect pipeline.", - "operationId": "PipelineService_DeletePipeline", - "parameters": [ - { - "description": "Pipeline ID.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Deleted" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete a Redpanda Connect pipeline", - "tags": ["Redpanda Connect Pipeline"] - }, - "get": { - "description": "Get a specific Redpanda Connect pipeline.", - "operationId": "PipelineService_GetPipeline", - "parameters": [ - { - "description": "Pipeline ID.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pipeline" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get Redpanda Connect pipeline", - "tags": ["Redpanda Connect Pipeline"] - }, - "put": { - "description": "Update the [configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) of a Redpanda Connect pipeline.", - "operationId": "PipelineService_UpdatePipeline", - "parameters": [ - { - "description": "Pipeline ID.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "description": "Specifies which fields should be updated. If not provided,\nall fields will be updated.", - "in": "query", - "name": "update_mask", - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PipelineUpdate" - } - } - }, - "required": true, - "x-originalParamName": "pipeline" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pipeline" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Update a Redpanda Connect pipeline", - "tags": ["Redpanda Connect Pipeline"] - } - }, - "/v1/redpanda-connect/pipelines/{id}/start": { - "put": { - "description": "Start a stopped Redpanda Connect pipeline.", - "operationId": "PipelineService_StartPipeline", - "parameters": [ - { - "description": "Pipeline ID.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pipeline" - } - } - }, - "description": "Started" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Start a Redpanda Connect pipeline", - "tags": ["Redpanda Connect Pipeline"] - } - }, - "/v1/redpanda-connect/pipelines/{id}/stop": { - "put": { - "description": "Stop a running Redpanda Connect pipeline.", - "operationId": "PipelineService_StopPipeline", - "parameters": [ - { - "description": "Pipeline ID.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Pipeline" - } - } - }, - "description": "Stopped" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Stops a Redpanda Connect pipeline", - "tags": ["Redpanda Connect Pipeline"] - } - }, - "/v1/secret-scopes": { - "get": { - "description": "List supported secret scopes.", - "operationId": "SecretService_ListSecretScopes", - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListSecretScopesResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List Secret Scopes", - "tags": ["Secrets"] - } - }, - "/v1/secrets": { - "get": { - "description": "List secrets. Optional: filter based on secret name and labels.", - "operationId": "SecretService_ListSecrets", - "parameters": [ - { - "description": "Substring match on secret name. Case-sensitive.", - "in": "query", - "name": "filter.name_contains", - "schema": { - "type": "string" - } - }, - { - "description": "This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18", - "in": "query", - "name": "filter.labels[string]", - "schema": { - "type": "string" - } - }, - { - "description": "Secret scopes to search for", - "in": "query", - "name": "filter.scopes", - "schema": { - "items": { - "enum": ["SCOPE_REDPANDA_CONNECT", "SCOPE_REDPANDA_CLUSTER"], - "type": "string" - }, - "type": "array" - } - }, - { - "description": "Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.", - "in": "query", - "name": "page_token", - "schema": { - "type": "string" - } - }, - { - "description": "Limit the paginated response to a number of items.", - "in": "query", - "name": "page_size", - "schema": { - "format": "int32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListSecretsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List Secrets", - "tags": ["Secrets"] - }, - "post": { - "description": "Create a secret.", - "operationId": "SecretService_CreateSecret", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateSecretRequest" - } - } - }, - "description": "CreateSecretRequest is the request of CreateSecret.", - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Secret" - } - } - }, - "description": "Secret created" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Create Secret", - "tags": ["Secrets"] - } - }, - "/v1/secrets/{id}": { - "delete": { - "description": "Delete a secret.", - "operationId": "SecretService_DeleteSecret", - "parameters": [ - { - "description": "The id of the secret to delete.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Secret deleted successfully" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete Secret", - "tags": ["Secrets"] - }, - "get": { - "description": "Get a secret.", - "operationId": "SecretService_GetSecret", - "parameters": [ - { - "description": "The id of the secret to retrieve.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Secret" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get Secret", - "tags": ["Secrets"] - }, - "put": { - "description": "Update a secret.", - "operationId": "SecretService_UpdateSecret", - "parameters": [ - { - "description": "Secret identifier.", - "in": "path", - "name": "id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateSecretBody" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/Secret" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Update Secret", - "tags": ["Secrets"] - } - }, - "/v1/topics": { - "get": { - "description": "List topics, with partition count and replication factor. Optional: filter based on topic name.", - "operationId": "TopicService_ListTopics", - "parameters": [ - { - "description": "Substring match on topic name. Case-sensitive.", - "in": "query", - "name": "filter.name_contains", - "schema": { - "type": "string" - } - }, - { - "description": "Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.", - "in": "query", - "name": "page_size", - "schema": { - "format": "int32", - "type": "integer" - } - }, - { - "description": "Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.", - "in": "query", - "name": "page_token", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ListTopicsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List Topics", - "tags": ["Topics"] - }, - "post": { - "description": "Create a [topic](https://docs.redpanda.com/redpanda-cloud/get-started/create-topic/).", - "operationId": "TopicService_CreateTopic", - "parameters": [ - { - "description": "If true, makes this request a dry run; everything is validated but\nno topics are actually created.", - "in": "query", - "name": "validate_only", - "schema": { - "type": "boolean" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateTopicRequest.Topic" - } - } - }, - "description": "The topic to create.", - "required": true, - "x-originalParamName": "topic" - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/CreateTopicResponse" - } - } - }, - "description": "Topic created" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Create Topic", - "tags": ["Topics"] - } - }, - "/v1/topics-partitions": { - "patch": { - "description": "Add partitions to existing topics. Depending on the partitioning strategy used, this may impact ordering guarantees.", - "operationId": "TopicService_AddPartitionsToTopics", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddPartitionsToTopicsRequest" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddPartitionsToTopicsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Add Topic Partitions", - "tags": ["Topics"] - }, - "put": { - "description": "Set partition counts for existing topics. New value must be equal to or larger than the current count of partitions in the topic. All topics will have the same final count of partitions. Depending on the partitioning strategy used, this may impact ordering guarantees.", - "operationId": "TopicService_SetPartitionsToTopics", - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetPartitionsToTopicsRequest" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetPartitionsToTopicsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Set Topic Partitions", - "tags": ["Topics"] - } - }, - "/v1/topics/{topic_name}": { - "delete": { - "description": "Delete the Kafka topic with the requested name.", - "operationId": "TopicService_DeleteTopic", - "parameters": [ - { - "description": "Topic name.", - "in": "path", - "name": "topic_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "content": { - "application/json": { - "schema": {} - } - }, - "description": "Topic deleted successfully" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Requested topic does not exist" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete Topic", - "tags": ["Topics"] - } - }, - "/v1/topics/{topic_name}/configurations": { - "get": { - "description": "Get key-value configs for a topic.", - "operationId": "TopicService_GetTopicConfigurations", - "parameters": [ - { - "description": "Topic name", - "in": "path", - "name": "topic_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/GetTopicConfigurationsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get Topic Configurations", - "tags": ["Topics"] - }, - "patch": { - "description": "Update a subset of the topic configurations.", - "operationId": "TopicService_UpdateTopicConfigurations", - "parameters": [ - { - "description": "Topic name", - "in": "path", - "name": "topic_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/UpdateConfiguration" - }, - "type": "array" - } - } - }, - "required": true, - "x-originalParamName": "configurations" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UpdateTopicConfigurationsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Update Topic Configuration", - "tags": ["Topics"] - }, - "put": { - "description": "Update the entire set of key-value configurations for a topic. Config entries that are not provided in the request are removed and will fall back to their default values.", - "operationId": "TopicService_SetTopicConfigurations", - "parameters": [ - { - "description": "Name of topic.", - "in": "path", - "name": "topic_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "items": { - "$ref": "#/components/schemas/SetConfiguration" - }, - "type": "array" - } - } - }, - "required": true, - "x-originalParamName": "configurations" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetTopicConfigurationsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Set Topic Configurations", - "tags": ["Topics"] - } - }, - "/v1/topics/{topic_name}/partitions": { - "patch": { - "description": "Add partitions to an existing topic. Depending on the partitioning strategy used, this may impact ordering guarantees.", - "operationId": "TopicService_AddTopicPartitions", - "parameters": [ - { - "description": "The topic name.", - "in": "path", - "name": "topic_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddTopicPartitionsBody" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/AddTopicPartitionsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Add Topic Partitions", - "tags": ["Topics"] - }, - "put": { - "description": "Set partitions to an existing topic. New value must be equal to or larger than the current count of partitions in the topic. Depending on the partitioning strategy used, this may impact ordering guarantees.", - "operationId": "TopicService_SetTopicPartitions", - "parameters": [ - { - "description": "The topic name.", - "in": "path", - "name": "topic_name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetTopicPartitionsBody" - } - } - }, - "required": true, - "x-originalParamName": "body" - }, - "responses": { - "200": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/SetTopicPartitionsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Set Topic Partitions", - "tags": ["Topics"] - } - }, - "/v1/transforms": { - "get": { - "description": "Retrieve a list of Wasm transforms. Optional: filter based on transform name.", - "operationId": "TransformService_ListTransforms", - "parameters": [ - { - "description": "Substring match on transform name. Case-sensitive.", - "in": "query", - "name": "filter.name_contains", - "schema": { - "type": "string" - } - }, - { - "description": "Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.", - "in": "query", - "name": "page_token", - "schema": { - "type": "string" - } - }, - { - "description": "Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.", - "in": "query", - "name": "page_size", - "schema": { - "format": "int32", - "type": "integer" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "example": { - "next_page_token": "", - "transforms": [ - { - "environment_variables": [], - "input_topic_name": "topic1", - "name": "transform1", - "output_topic_names": ["output-topic11", "output-topic12"], - "statuses": [ - { - "broker_id": 1, - "lag": 1, - "partition_id": 1, - "status": "PARTITION_STATUS_RUNNING" - } - ] - }, - { - "environment_variables": [], - "input_topic_name": "topic2", - "name": "transform2", - "output_topic_names": ["output-topic21", "output-topic22"], - "statuses": [ - { - "broker_id": 2, - "lag": 2, - "partition_id": 2, - "status": "PARTITION_STATUS_RUNNING" - } - ] - } - ] - }, - "schema": { - "$ref": "#/components/schemas/ListTransformsResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List Transforms", - "tags": ["WASM Transforms"] - }, - "put": { - "description": "Initiate deployment of a new Wasm transform. This endpoint uses multipart/form-data encoding. Following deployment, a brief period is required before the Wasm transform becomes operational. Monitor the partition statuses to check whether the transform is active. This usually takes around 3s, but no longer than 10s.", - "operationId": "TransformService_DeployTransform", - "requestBody": { - "content": { - "multipart/form-data": { - "schema": { - "example": "{\"name\":\"redact-orders\",\"input_topic_name\":\"orders\",\"output_topic_names\":[\"orders-redacted\"],\"environment_variables\":[{\"key\":\"LOGGER_LEVEL\",\"value\":\"DEBUG\"}]}", - "properties": { - "metadata": { - "$ref": "#/components/schemas/DeployTransformRequest" - }, - "wasm_binary": { - "description": "Binary file containing the compiled WASM transform. The maximum size for this file is 10MiB.", - "format": "binary", - "type": "string" - } - }, - "type": "object" - } - } - }, - "description": "Transform metadata as well as the WASM binary", - "required": true - }, - "responses": { - "201": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/TransformMetadata" - } - } - }, - "description": "Created" - } - }, - "summary": "Deploy Transform", - "tags": ["WASM Transforms"] - } - }, - "/v1/transforms/{name}": { - "delete": { - "description": "Delete a Wasm transform with the requested name.", - "operationId": "TransformService_DeleteTransform", - "parameters": [ - { - "description": "Name of transform.", - "example": { - "name": "transform1" - }, - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "content": { - "application/json": { - "example": {}, - "schema": {} - } - }, - "description": "Transform deleted successfully" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete Transform", - "tags": ["WASM Transforms"] - }, - "get": { - "description": "Get a specific Wasm transform.", - "operationId": "TransformService_GetTransform", - "parameters": [ - { - "description": "Name of transform.", - "example": { - "name": "transform1" - }, - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "example": { - "transform": { - "environment_variables": [], - "input_topic_name": "topic1", - "name": "transform1", - "output_topic_names": ["output-topic1", "output-topic2"], - "statuses": [ - { - "broker_id": 1, - "lag": 1, - "partition_id": 1, - "status": "PARTITION_STATUS_RUNNING" - } - ] - } - }, - "schema": { - "$ref": "#/components/schemas/GetTransformResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Get Transform", - "tags": ["WASM Transforms"] - } - }, - "/v1/users": { - "get": { - "description": "List users. Optional: filter based on username.", - "operationId": "UserService_ListUsers", - "parameters": [ - { - "description": "Username.", - "in": "query", - "name": "filter.name", - "schema": { - "type": "string" - } - }, - { - "description": "Substring match on username. Case-sensitive.", - "in": "query", - "name": "filter.name_contains", - "schema": { - "type": "string" - } - }, - { - "description": "Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.", - "in": "query", - "name": "page_size", - "schema": { - "format": "int32", - "type": "integer" - } - }, - { - "description": "Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.", - "in": "query", - "name": "page_token", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "content": { - "application/json": { - "example": { - "next_page_token": "", - "users": [ - { - "name": "payment-service" - }, - { - "name": "jane" - } - ] - }, - "schema": { - "$ref": "#/components/schemas/ListUsersResponse" - } - } - }, - "description": "OK" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "List Users", - "tags": ["Redpanda Users"] - }, - "post": { - "description": "Create a new user.", - "operationId": "UserService_CreateUser", - "requestBody": { - "content": { - "application/json": { - "example": { - "mechanism": "SASL_MECHANISM_SCRAM_SHA_256", - "name": "payment-service", - "password": "secure-password" - }, - "schema": { - "$ref": "#/components/schemas/CreateUserRequest.User" - } - } - }, - "required": true, - "x-originalParamName": "user" - }, - "responses": { - "201": { - "content": { - "application/json": { - "example": { - "user": { - "mechanism": "SASL_MECHANISM_SCRAM_SHA_256", - "name": "payment-service" - } - }, - "schema": { - "$ref": "#/components/schemas/CreateUserRequest.User" - } - } - }, - "description": "User created" - }, - "400": { - "content": { - "application/json": { - "example": { - "code": "INVALID_ARGUMENT", - "details": [ - { - "@type": "type.googleapis.com/google.rpc.ErrorInfo", - "domain": "redpanda.com/dataplane", - "metadata": {}, - "reason": "REASON_INVALID_INPUT" - }, - { - "@type": "type.googleapis.com/google.rpc.BadRequest", - "field_violations": [ - { - "description": "value length must be at least 3 characters", - "field": "user.password" - }, - { - "description": "value is required", - "field": "user.mechanism" - } - ] - } - ], - "message": "provided parameters are invalid" - }, - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Bad request. Check API documentation and update request." - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Create User", - "tags": ["Redpanda Users"] - } - }, - "/v1/users/{name}": { - "delete": { - "description": "Delete the specified user", - "operationId": "UserService_DeleteUser", - "parameters": [ - { - "description": "Username", - "in": "path", - "name": "name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "204": { - "content": { - "application/json": { - "example": {}, - "schema": {} - } - }, - "description": "User deleted successfully" - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "404": { - "content": { - "application/json": { - "example": { - "code": "NOT_FOUND", - "details": [ - { - "@type": "type.googleapis.com/google.rpc.ErrorInfo", - "domain": "redpanda.com/dataplane", - "metadata": {}, - "reason": "REASON_RESOURCE_NOT_FOUND" - } - ], - "message": "user not found" - }, - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Not Found" - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Delete User", - "tags": ["Redpanda Users"] - } - }, - "/v1/users/{user.name}": { - "put": { - "description": "Update a user's credentials.", - "operationId": "UserService_UpdateUser", - "parameters": [ - { - "description": "Username.", - "in": "path", - "name": "user.name", - "required": true, - "schema": { - "type": "string" - } - } - ], - "requestBody": { - "content": { - "application/json": { - "example": { - "user": { - "mechanism": "SASL_MECHANISM_SCRAM_SHA_256", - "password": "new-password" - } - }, - "schema": { - "properties": { - "mechanism": { - "$ref": "#/components/schemas/SASLMechanism" - }, - "password": { - "description": "Password.", - "type": "string" - } - }, - "type": "object" - } - } - }, - "required": true, - "x-originalParamName": "user" - }, - "responses": { - "200": { - "content": { - "application/json": { - "example": { - "user": { - "mechanism": "SASL_MECHANISM_SCRAM_SHA_256", - "name": "payment-service" - } - }, - "schema": { - "$ref": "#/components/schemas/UpdateUserResponse.User" - } - } - }, - "description": "OK" - }, - "400": { - "content": { - "application/json": { - "example": { - "code": "INVALID_ARGUMENT", - "details": [ - { - "@type": "type.googleapis.com/google.rpc.ErrorInfo", - "domain": "redpanda.com/dataplane", - "metadata": {}, - "reason": "REASON_INVALID_INPUT" - }, - { - "@type": "type.googleapis.com/google.rpc.BadRequest", - "field_violations": [ - { - "description": "value length must be at least 3 characters", - "field": "user.password" - }, - { - "description": "value is required", - "field": "user.mechanism" - } - ] - } - ], - "message": "provided parameters are invalid" - }, - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Bad request. Check API documentation and update request." - }, - "401": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Unauthenticated." - }, - "500": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "Internal Server Error. Reach out to support." - }, - "default": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/rpc.Status" - } - } - }, - "description": "An unexpected error response." - } - }, - "summary": "Update User", - "tags": ["Redpanda Users"] - } - } - }, - "security": [ - { - "auth0": [] - } - ], - "servers": [ - { - "description": "Data Plane API", - "url": "{dataplane_api_url}", - "variables": { - "dataplane_api_url": { - "default": "https://{dataplane_api_url}", - "description": "Find the Data Plane API base URL of a cluster by calling the Get Cluster endpoint of the Control Plane API. The dataplane_api.url field is returned in the response body.

\n\t\t\t\t\tExample (Dedicated): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.fmc.prd.cloud.redpanda.com\"
\n\t\t\t\t\tExample (BYOC): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.byoc.prd.cloud.redpanda.com\"" - } - } - } - ], - "tags": [ - { - "description": "Manage Redpanda access control lists (ACLs). See [Redpanda Cloud Authorization](https://docs.redpanda.com/redpanda-cloud/security/authorization/cloud-authorization/) for more information.", - "name": "Redpanda ACLs" - }, - { - "description": "Manage Redpanda topics stored in object storage. See: [Mountable Topics](https://docs.redpanda.com/redpanda-cloud/manage/mountable-topics/)", - "name": "Cloud Storage" - }, - { - "description": "Manage Wasm transforms in Redpanda.", - "name": "WASM Transforms" - }, - { - "description": "Manage [connectors](https://docs.redpanda.com/redpanda-cloud/develop/managed-connectors/) and interact with the Kafka Connect API.", - "name": "Kafka Connect" - }, - { - "description": "Create and manage [Redpanda Connect](https://docs.redpanda.com/redpanda-cloud/develop/connect/about) pipelines and their configurations.", - "name": "Redpanda Connect Pipeline" - }, - { - "description": "Manage [secrets](https://docs.redpanda.com/redpanda-cloud/security/secrets) for Redpanda Cloud.", - "name": "Secrets" - }, - { - "description": "Manage Redpanda topics.", - "name": "Topics" - }, - { - "description": "Manage Redpanda users. To manage access, see the Data Plane [ACL endpoints](https://docs.redpanda.com/api/cloud-dataplane-api/#get-/v1/acls).", - "name": "Redpanda Users" - } - ] -} +{"components":{"schemas":{"ACL.Operation":{"description":"The operation that is allowed or denied (e.g. READ).","enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"},"Action":{"enum":["ACTION_PREPARE","ACTION_EXECUTE","ACTION_FINISH","ACTION_CANCEL"],"type":"string"},"AddPartitionsToTopicsRequest":{"properties":{"partition_count":{"description":"The number of partitions to add for the topics.","format":"int32","type":"integer"},"topic_names":{"description":"The topic names.","items":{"type":"string"},"type":"array"},"validate_only":{"description":"Validate the request only, do not execute it.","type":"boolean"}},"type":"object"},"AddPartitionsToTopicsResponse":{"properties":{"statuses":{"description":"The status of the operation for each topic.","items":{"$ref":"#/components/schemas/AlterTopicPartitionStatus"},"type":"array"}},"type":"object"},"AddTopicPartitionsBody":{"properties":{"partition_count":{"description":"The number of partitions to add to the topic.","format":"int32","type":"integer"},"validate_only":{"description":"Validate the request only, do not execute it.","type":"boolean"}},"type":"object"},"AddTopicPartitionsResponse":{"type":"object"},"AlterTopicPartitionStatus":{"properties":{"error":{"description":"The error if any.","type":"string"},"success":{"description":"Whether the operation was successful.","type":"boolean"},"topic_name":{"description":"The topic name.","type":"string"}},"type":"object"},"BadRequest":{"description":"Describes violations in a client request. This error type focuses on the\nsyntactic aspects of the request.","properties":{"field_violations":{"description":"Describes all violations in a client request.","items":{"$ref":"#/components/schemas/FieldViolation"},"type":"array"}},"title":"BadRequest","type":"object"},"Config":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"ConfigAlterOperation":{"enum":["CONFIG_ALTER_OPERATION_SET","CONFIG_ALTER_OPERATION_DELETE","CONFIG_ALTER_OPERATION_APPEND","CONFIG_ALTER_OPERATION_SUBTRACT"],"type":"string"},"ConfigSource":{"enum":["CONFIG_SOURCE_DYNAMIC_TOPIC_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_CONFIG","CONFIG_SOURCE_DYNAMIC_DEFAULT_BROKER_CONFIG","CONFIG_SOURCE_STATIC_BROKER_CONFIG","CONFIG_SOURCE_DEFAULT_CONFIG","CONFIG_SOURCE_DYNAMIC_BROKER_LOGGER_CONFIG"],"type":"string"},"ConfigSynonym":{"properties":{"name":{"type":"string"},"source":{"$ref":"#/components/schemas/ConfigSource"},"value":{"nullable":true,"type":"string"}},"type":"object"},"ConfigType":{"enum":["CONFIG_TYPE_BOOLEAN","CONFIG_TYPE_STRING","CONFIG_TYPE_INT","CONFIG_TYPE_SHORT","CONFIG_TYPE_LONG","CONFIG_TYPE_DOUBLE","CONFIG_TYPE_LIST","CONFIG_TYPE_CLASS","CONFIG_TYPE_PASSWORD"],"type":"string"},"Configuration":{"properties":{"config_synonyms":{"description":"If no config value is set at the topic level, it will inherit the value\nset at the broker or cluster level. `name` is the corresponding config\nkey whose value is inherited. `source` indicates whether the inherited\nconfig is default, broker, etc.","items":{"$ref":"#/components/schemas/ConfigSynonym"},"type":"array"},"documentation":{"description":"Config documentation.","nullable":true,"type":"string"},"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"read_only":{"description":"Whether the config is read-only, or is dynamic and can be altered.","type":"boolean"},"sensitive":{"description":"Whether this is a sensitive config key and value.","type":"boolean"},"source":{"$ref":"#/components/schemas/ConfigSource"},"type":{"$ref":"#/components/schemas/ConfigType"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"ConnectCluster":{"properties":{"address":{"description":"The host address of the Kafka Connect cluster.","type":"string"},"info":{"$ref":"#/components/schemas/ConnectCluster.Info"},"name":{"description":"Unique name of connect cluster. For Redpanda Cloud, the value is `redpanda`.","type":"string"},"plugins":{"items":{"$ref":"#/components/schemas/ConnectorPlugin"},"type":"array"}},"type":"object"},"ConnectCluster.Info":{"properties":{"commit":{"description":"The git commit ID of the connect worker source code.","type":"string"},"kafka_cluster_id":{"description":"Cluster ID.","type":"string"},"version":{"description":"Connect worker version.","type":"string"}},"type":"object"},"Connector":{"properties":{"state":{"description":"State of the connector instance.","type":"string"},"trace":{"description":"String value of stack trace.","type":"string"},"worker_id":{"description":"ID of worker that the connector is assigned to.","type":"string"}},"type":"object"},"ConnectorError":{"properties":{"content":{"description":"Detailed description of the error.","type":"string"},"title":{"description":"Short description of the error.","type":"string"},"type":{"$ref":"#/components/schemas/ConnectorError.Type"}},"title":"ConnectorError is the error of a connector, this is holistic error\nabstraction, made parsing the error trace of connector or Task","type":"object"},"ConnectorError.Type":{"description":"Error level.","enum":["TYPE_ERROR","TYPE_WARNING"],"type":"string"},"ConnectorHolisticState":{"description":"State of a connector or one of its tasks, as described in the [Kafka Connect documentation](https://kafka.apache.org/documentation.html#connect_administration). Takes into account not just the state of the connector instance itself, but also the tasks within the connector.\n\n - CONNECTOR_HOLISTIC_STATE_PAUSED: The connector or task has been administratively paused.\n - CONNECTOR_HOLISTIC_STATE_RESTARTING: The connector or task is restarting.\n - CONNECTOR_HOLISTIC_STATE_DESTROYED: The connector is destroyed, regardless of any tasks.\n - CONNECTOR_HOLISTIC_STATE_STOPPED: The connector or task has been stopped.\n - CONNECTOR_HOLISTIC_STATE_UNASSIGNED: - The connector or task has not yet been assigned to a worker,\n- THe connector is running, but there are unassigned tasks.\n - CONNECTOR_HOLISTIC_STATE_HEALTHY: The connector is running, \u003e 0 tasks, all of them in running state.\n - CONNECTOR_HOLISTIC_STATE_UNHEALTHY: - The connector has failed,\n- The connector is running, but has no tasks,\n- Connector is running and has tasks, but all tasks have failed.\n - CONNECTOR_HOLISTIC_STATE_DEGRADED: The connector is running and has tasks, and at least one task, but not all, have failed.\n - CONNECTOR_HOLISTIC_STATE_UNKNOWN: The connector or task state could not be determined.","enum":["CONNECTOR_HOLISTIC_STATE_PAUSED","CONNECTOR_HOLISTIC_STATE_RESTARTING","CONNECTOR_HOLISTIC_STATE_DESTROYED","CONNECTOR_HOLISTIC_STATE_STOPPED","CONNECTOR_HOLISTIC_STATE_UNASSIGNED","CONNECTOR_HOLISTIC_STATE_HEALTHY","CONNECTOR_HOLISTIC_STATE_UNHEALTHY","CONNECTOR_HOLISTIC_STATE_DEGRADED","CONNECTOR_HOLISTIC_STATE_UNKNOWN"],"type":"string"},"ConnectorInfoStatus":{"properties":{"info":{"$ref":"#/components/schemas/ConnectorSpec"},"name":{"description":"Name of connector.","type":"string"},"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"ConnectorPlugin":{"properties":{"class":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"}},"type":"object"},"ConnectorSpec":{"description":"Connector specifications as defined in the Kafka Connect\nAPI. You may include this in the request body when creating a new connector.","properties":{"config":{"additionalProperties":{"type":"string"},"description":"Connector configuration properties.","type":"object"},"name":{"description":"Name of connector.","type":"string"},"tasks":{"items":{"$ref":"#/components/schemas/TaskInfo"},"readOnly":true,"type":"array"},"type":{"readOnly":true,"type":"string"}},"required":["name","config"],"type":"object"},"ConnectorStatus":{"properties":{"connector":{"$ref":"#/components/schemas/Connector"},"errors":{"description":"List of parsed connectors' and tasks' errors.","items":{"$ref":"#/components/schemas/ConnectorError"},"type":"array"},"holistic_state":{"$ref":"#/components/schemas/ConnectorHolisticState"},"name":{"description":"Name of connector.","type":"string"},"tasks":{"description":"Status of connector tasks. For more information, see the [https://docs.redpanda.com/current/deploy/deployment-option/cloud/managed-connectors/monitor-connectors/#connector-tasks](Monitor Connectors) documentation.","items":{"$ref":"#/components/schemas/TaskStatus"},"type":"array"},"type":{"description":"Type of connector (sink or source).","type":"string"}},"type":"object"},"CreateACLRequest":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.\nFor requests with resource_type CLUSTER, this will default to \"kafka-cluster\".","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","principal","host","operation","permission_type"],"type":"object"},"CreateACLResponse":{"type":"object"},"CreateConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"CreateKafkaConnectSecretBody":{"description":"CreateKafkaConnectSecretRequest is the request of CreateKafkaConnectSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"name":{"description":"Name of connector.","type":"string"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["name","secret_data"],"type":"object"},"CreateKafkaConnectSecretResponse":{"description":"CreateKafkaConnectSecretResponse is the response of CreateKafkaConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"CreatePipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"CreateRoleResponse":{"description":"CreateRoleResponse is the response for CreateRole.","properties":{"role":{"$ref":"#/components/schemas/Role"}},"type":"object"},"CreateSecretRequest":{"description":"CreateSecretRequest is the request of CreateSecret.","properties":{"id":{"description":"Secret identifier.","type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"CreateSecretResponse":{"description":"CreateSecretResponse is the response of CreateSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"CreateTopicRequest.Topic":{"properties":{"configs":{"description":"An array of key-value config pairs for a topic.\nThese correspond to Kafka topic-level configs.","items":{"$ref":"#/components/schemas/Config"},"type":"array"},"name":{"description":"Name of topic.","type":"string"},"partition_count":{"description":"The number of partitions to give the topic. If specifying\npartitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default partition count, set to null.","format":"int32","nullable":true,"type":"integer"},"replica_assignments":{"description":"Manually specify broker ID assignments for partition replicas. If manually assigning replicas, both `replication_factor` and\n`partition_count` must be -1.","items":{"$ref":"#/components/schemas/ReplicaAssignment"},"type":"array"},"replication_factor":{"description":"The number of replicas every partition must have.\nIf specifying partitions manually (see `replica_assignments`), set to -1.\nOr, to use the cluster default replication factor, set to null.","format":"int32","nullable":true,"type":"integer"}},"type":"object"},"CreateTopicResponse":{"properties":{"partition_count":{"description":"The number of partitions created for the topic.\nThis field has a default value of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.","format":"int32","type":"integer"},"replication_factor":{"description":"The number of replicas per topic partition.\nThis field has a default of -1, which may be returned if the broker\ndoes not support v5+ of this request which added support for returning\nthis information.","format":"int32","type":"integer"},"topic_name":{"description":"Name of topic.","type":"string"}},"type":"object"},"CreateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"},"password":{"description":"Password.","type":"string"}},"type":"object"},"CreateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/CreateUserResponse.User"}},"type":"object"},"CreateUserResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"title":"Name of newly-created user","type":"string"}},"type":"object"},"DeleteACLsRequest.Filter":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","nullable":true,"type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"required":["resource_type","resource_pattern_type","operation","permission_type"],"type":"object"},"DeleteACLsResponse":{"properties":{"matching_acls":{"items":{"$ref":"#/components/schemas/MatchingACL"},"type":"array"}},"type":"object"},"DeleteKafkaConnectSecretResponse":{"description":"DeleteKafkaConnectSecretResponse is the response of DeleteKafkaConnectSecret.","type":"object"},"DeleteMountTaskResponse":{"type":"object"},"DeletePipelineResponse":{"type":"object"},"DeleteRoleResponse":{"description":"DeleteRoleResponse is the response for DeleteRole.","type":"object"},"DeleteSecretResponse":{"description":"DeleteSecretResponse is the response of DeleteSecret.","type":"object"},"DeleteTopicResponse":{"type":"object"},"DeleteTransformResponse":{"type":"object"},"DeleteUserResponse":{"type":"object"},"DeployTransformRequest":{"description":"Metadata required to deploy a new Wasm\ntransform in a Redpanda cluster.","properties":{"environment_variables":{"description":"The environment variables you want to apply to your transform's environment","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"input_topic_name":{"description":"The input topic to apply the transform to.","example":"orders","type":"string"},"name":{"description":"Name of the transform.","example":"redact-payment-details-in-orders","type":"string"},"output_topic_names":{"description":"Output topic to write the transform results to.","example":"orders-redacted","items":{"type":"string"},"type":"array"}},"required":["name","input_topic_name","output_topic_names"],"type":"object"},"EnvironmentVariable":{"properties":{"key":{"description":"The key of your environment variable.","example":"LOG_LEVEL","type":"string"},"value":{"description":"The value of your environment variable.","example":"DEBUG","type":"string"}},"required":["key","value"],"type":"object"},"ErrorInfo":{"description":"Describes the cause of the error with structured details.\n\nExample of an error when contacting the \"pubsub.googleapis.com\" API when it\nis not enabled:\n\n { \"reason\": \"API_DISABLED\"\n \"domain\": \"googleapis.com\"\n \"metadata\": {\n \"resource\": \"projects/123\",\n \"service\": \"pubsub.googleapis.com\"\n }\n }\n\nThis response indicates that the pubsub.googleapis.com API is not enabled.\n\nExample of an error that is returned when attempting to create a Spanner\ninstance in a region that is out of stock:\n\n { \"reason\": \"STOCKOUT\"\n \"domain\": \"spanner.googleapis.com\",\n \"metadata\": {\n \"availableRegions\": \"us-central1,us-east2\"\n }\n }","properties":{"domain":{"description":"The logical grouping to which the \"reason\" belongs. The error domain\nis typically the registered service name of the tool or product that\ngenerates the error. Example: \"pubsub.googleapis.com\". If the error is\ngenerated by some common infrastructure, the error domain must be a\nglobally unique value that identifies the infrastructure. For Google API\ninfrastructure, the error domain is \"googleapis.com\".","type":"string"},"metadata":{"additionalProperties":{"type":"string"},"description":"Additional structured details about this error.\n\nKeys should match /[a-zA-Z0-9-_]/ and be limited to 64 characters in\nlength. When identifying the current value of an exceeded limit, the units\nshould be contained in the key, not the value. For example, rather than\n{\"instanceLimit\": \"100/request\"}, should be returned as,\n{\"instanceLimitPerRequest\": \"100\"}, if the client exceeds the number of\ninstances that can be created in a single (batch) request.","type":"object"},"reason":{"description":"The reason of the error. This is a constant value that identifies the\nproximate cause of the error. Error reasons are unique within a particular\ndomain of errors. This should be at most 63 characters and match a\nregular expression of `[A-Z][A-Z0-9_]+[A-Z0-9]`, which represents\nUPPER_SNAKE_CASE.","type":"string"}},"title":"ErrorInfo","type":"object"},"FieldViolation":{"description":"A message type used to describe a single bad request field.","properties":{"description":{"description":"A description of why the request element is bad.","type":"string"},"field":{"description":"A path that leads to a field in the request body. The value will be a\nsequence of dot-separated identifiers that identify a protocol buffer\nfield.\n\nConsider the following:\n\n message CreateContactRequest {\n message EmailAddress {\n enum Type {\n TYPE_UNSPECIFIED = 0;\n HOME = 1;\n WORK = 2;\n }\n\n optional string email = 1;\n repeated EmailType type = 2;\n }\n\n string full_name = 1;\n repeated EmailAddress email_addresses = 2;\n }\n\nIn this example, in proto `field` could take one of the following values:\n\n* `full_name` for a violation in the `full_name` value\n* `email_addresses[1].email` for a violation in the `email` field of the\n first `email_addresses` message\n* `email_addresses[3].type[2]` for a violation in the second `type`\n value in the third `email_addresses` message.\n\nIn JSON, the same values are represented as:\n\n* `fullName` for a violation in the `fullName` value\n* `emailAddresses[1].email` for a violation in the `email` field of the\n first `emailAddresses` message\n* `emailAddresses[3].type[2]` for a violation in the second `type`\n value in the third `emailAddresses` message.","type":"string"}},"type":"object"},"GetConnectClusterResponse":{"properties":{"cluster":{"$ref":"#/components/schemas/ConnectCluster"}},"type":"object"},"GetConnectorConfigResponse":{"properties":{"config":{"additionalProperties":{"type":"string"},"type":"object"}},"type":"object"},"GetConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"GetConnectorStatusResponse":{"properties":{"status":{"$ref":"#/components/schemas/ConnectorStatus"}},"type":"object"},"GetKafkaConnectSecretResponse":{"description":"GetKafkaConnectSecretResponse is the response of GetKafkaConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"GetMountTaskResponse":{"properties":{"task":{"$ref":"#/components/schemas/MountTask"}},"type":"object"},"GetPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"GetPipelineServiceConfigSchemaResponse":{"properties":{"config_schema":{"description":"JSON schema of the configuration components that are allowed for Connect pipelines.","type":"string"}},"type":"object"},"GetPipelinesBySecretsResponse":{"properties":{"pipelines_for_secret":{"items":{"$ref":"#/components/schemas/PipelinesForSecret"},"type":"array"}},"type":"object"},"GetPipelinesForSecretResponse":{"properties":{"pipelines_for_secret":{"$ref":"#/components/schemas/PipelinesForSecret"}},"type":"object"},"GetRoleResponse":{"description":"GetRoleResponse is the response to GetRole.","properties":{"members":{"description":"Members assigned to the role.","items":{"$ref":"#/components/schemas/RoleMembership"},"type":"array"},"role":{"$ref":"#/components/schemas/Role"}},"type":"object"},"GetSecretResponse":{"description":"GetSecretResponse is the response of GetSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"GetTopicConfigurationsResponse":{"properties":{"configurations":{"items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"GetTransformResponse":{"properties":{"transform":{"$ref":"#/components/schemas/TransformMetadata"}},"type":"object"},"Help":{"description":"Provides links to documentation or for performing an out of band action.\n\nFor example, if a quota check failed with an error indicating the calling\nproject hasn't enabled the accessed service, this can contain a URL pointing\ndirectly to the right place in the developer console to flip the bit.","properties":{"links":{"description":"URL(s) pointing to additional information on handling the current error.","items":{"$ref":"#/components/schemas/Link"},"type":"array"}},"title":"Help","type":"object"},"Link":{"description":"Describes a URL link.","properties":{"description":{"description":"Describes what the link offers.","type":"string"},"url":{"description":"The URL of the link.","type":"string"}},"type":"object"},"ListACLsRequest.Filter":{"properties":{"host":{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","nullable":true,"type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","nullable":true,"type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","nullable":true,"type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ListACLsResponse":{"properties":{"resources":{"items":{"$ref":"#/components/schemas/Resource"},"type":"array"}},"type":"object"},"ListConnectClustersResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/ConnectCluster"},"type":"array"}},"type":"object"},"ListConnectorTopicsResponse":{"properties":{"topics":{"description":"Topic names.","items":{"type":"string"},"type":"array"}},"type":"object"},"ListConnectorsResponse":{"properties":{"connectors":{"description":"List of connectors, where the parent key is the connector name.","items":{"$ref":"#/components/schemas/ConnectorInfoStatus"},"type":"array"},"next_page_token":{"description":"Page Token to fetch the next page. The value can be used as page_token in the next call to this endpoint.","type":"string"}},"type":"object"},"ListKafkaConnectSecretsResponse":{"description":"ListKafkaConnectSecretsResponse is the response of ListKafkaConnectSecrets.","properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"secrets":{"description":"Secrets retrieved.","items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"type":"object"},"ListMountTasksResponse":{"properties":{"tasks":{"items":{"$ref":"#/components/schemas/MountTask"},"type":"array"}},"type":"object"},"ListMountableTopicsResponse":{"properties":{"topics":{"items":{"$ref":"#/components/schemas/TopicLocation"},"type":"array"}},"type":"object"},"ListPipelinesRequest.Filter":{"properties":{"name_contains":{"description":"Any pipelines that partially match this name will be returned.","type":"string"},"tags[string]":{"additionalProperties":{"type":"string"},"description":"Pipelines that match all the provided tags will be returned.","type":"object"}},"type":"object"},"ListPipelinesResponse":{"properties":{"next_page_token":{"type":"string"},"pipelines":{"items":{"$ref":"#/components/schemas/Pipeline"},"type":"array"}},"type":"object"},"ListRoleMembersRequest.Filter":{"description":"Filter options.","properties":{"name_contains":{"description":"Filter results to only members with names which contain the string.","type":"string"}},"type":"object"},"ListRoleMembersResponse":{"description":"ListRoleMembersResponse is the response for ListRoleMembers.","properties":{"members":{"description":"Members assigned to the role.","items":{"$ref":"#/components/schemas/RoleMembership"},"type":"array"},"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"role_name":{"description":"The role name.","type":"string"}},"type":"object"},"ListRolesRequest.Filter":{"description":"Filter options.","properties":{"name_contains":{"description":"Filter results to only roles with names which contain the string.","type":"string"},"name_prefix":{"description":"Filter results only roles named with the prefix.","type":"string"},"principal":{"description":"Return only roles assigned to this principal.","type":"string"}},"type":"object"},"ListRolesResponse":{"description":"ListRolesResponse is the response for ListRoles.","properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"roles":{"description":"The roles in the system.","items":{"$ref":"#/components/schemas/Role"},"type":"array"}},"type":"object"},"ListSecretScopesResponse":{"description":"ListSecretScopesResponse is the response of ListSecretScopes.","properties":{"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"type":"array"}},"type":"object"},"ListSecretsFilter":{"description":"ListSecretsFilter are the filter options for listing secrets.","properties":{"labels[string][string]":{"additionalProperties":{"type":"string"},"description":"The secret labels to search for.","type":"object"},"name_contains":{"description":"Substring match on secret name. Case-sensitive.","type":"string"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes to search for","type":"array"}},"type":"object"},"ListSecretsResponse":{"description":"ListSecretsResponse is the response of ListSecrets.","properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"secrets":{"description":"Secrets retrieved.","items":{"$ref":"#/components/schemas/Secret"},"type":"array"}},"type":"object"},"ListTopicsRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on topic name. Case-sensitive.","type":"string"}},"type":"object"},"ListTopicsResponse":{"properties":{"next_page_token":{"type":"string"},"topics":{"items":{"$ref":"#/components/schemas/ListTopicsResponse.Topic"},"type":"array"}},"type":"object"},"ListTopicsResponse.Topic":{"properties":{"internal":{"description":"Whether topic is internal only.","type":"boolean"},"name":{"description":"Topic name.","type":"string"},"partition_count":{"description":"Topic partition count.","format":"int32","type":"integer"},"replication_factor":{"description":"Topic replication factor.","format":"int32","type":"integer"}},"type":"object"},"ListTransformsRequest.Filter":{"properties":{"name_contains":{"description":"Substring match on transform name. Case-sensitive.","type":"string"}},"type":"object"},"ListTransformsResponse":{"properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"transforms":{"items":{"$ref":"#/components/schemas/TransformMetadata"},"type":"array"}},"type":"object"},"ListUsersRequest.Filter":{"properties":{"name":{"description":"Username.","type":"string"},"name_contains":{"description":"Substring match on username. Case-sensitive.","type":"string"}},"type":"object"},"ListUsersResponse":{"properties":{"next_page_token":{"description":"Token to retrieve the next page.","type":"string"},"users":{"items":{"$ref":"#/components/schemas/ListUsersResponse.User"},"type":"array"}},"type":"object"},"ListUsersResponse.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"}},"type":"object"},"MatchingACL":{"properties":{"error":{"$ref":"#/components/schemas/rpc.Status"},"host":{"description":"The host address to use for this ACL.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies.","type":"string"},"resource_name":{"description":"The name of the resource this ACL targets.","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"MountTask":{"properties":{"id":{"description":"Unique identifier for this mount task.","format":"int32","type":"integer"},"state":{"$ref":"#/components/schemas/MountTask.State"},"topics":{"description":"List of topics that are being mounted or unmounted.","items":{"$ref":"#/components/schemas/MountTask.Topic"},"type":"array"},"type":{"$ref":"#/components/schemas/MountTask.Type"}},"type":"object"},"MountTask.State":{"description":" - STATE_PLANNED: Planned: The mount task has been created and is awaiting further actions.\n - STATE_PREPARING: Preparing: The mount task is gathering resources and preparing for execution.\n - STATE_PREPARED: Prepared: All preparations are complete, and the mount task is ready to be executed.\n - STATE_EXECUTING: Executing: The mount task is actively transferring or transforming data.\n - STATE_EXECUTED: Executed: The core mount task actions are complete, but the mount task has not yet cut over or finalized.\n - STATE_CUT_OVER: Cut Over: The mount task has reached a critical point where ownership is transferred or final adjustments are made.\n - STATE_FINISHED: Finished: The mount task has been successfully completed, and no further actions are required.\n - STATE_CANCELING: Canceling: The mount task is in the process of being canceled, and rollback or cleanup actions may be in progress.\n - STATE_CANCELLED: Cancelled: The mount task has been fully canceled, and no further actions will be taken.","enum":["STATE_PLANNED","STATE_PREPARING","STATE_PREPARED","STATE_EXECUTING","STATE_EXECUTED","STATE_CUT_OVER","STATE_FINISHED","STATE_CANCELING","STATE_CANCELLED"],"type":"string"},"MountTask.Topic":{"properties":{"source_topic_reference":{"description":"The topic reference in the object storage bucket.\nThis field is only set for tasks of type MOUNT.","type":"string"},"topic_reference":{"description":"The topic reference within the current cluster, which may be either a simple topic name or a full reference\nin the form: cluster-uuid/topic-name/revision.","type":"string"}},"type":"object"},"MountTask.Type":{"description":" - TYPE_MOUNT: Mount represents the process of making topics available in a cluster by loading them from object storage.\n - TYPE_UNMOUNT: Unmount represents the process of offloading topics back to object storage.","enum":["TYPE_MOUNT","TYPE_UNMOUNT"],"type":"string"},"MountTopicsResponse":{"properties":{"mount_task_id":{"format":"int32","title":"ID of mount","type":"integer"}},"type":"object"},"Options":{"properties":{"include_tasks":{"description":"Restart connector's tasks.","type":"boolean"},"only_failed":{"description":"Restart only connectors that have failed.","type":"boolean"}},"type":"object"},"PartitionStatus":{"enum":["PARTITION_STATUS_RUNNING","PARTITION_STATUS_INACTIVE","PARTITION_STATUS_ERRORED","PARTITION_STATUS_UNKNOWN"],"type":"string"},"PartitionTransformStatus":{"properties":{"broker_id":{"format":"int32","type":"integer"},"lag":{"format":"int32","type":"integer"},"partition_id":{"format":"int32","type":"integer"},"status":{"$ref":"#/components/schemas/PartitionStatus"}},"type":"object"},"PermissionType":{"description":"Whether the operation should be allowed or denied.","enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"},"Pipeline":{"description":"Defines the pipeline resource.","properties":{"config_yaml":{"description":"The Repanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","title":"The pipeline configuration in YAML.\nSee https://docs.redpanda.com/redpanda-connect/configuration/about/","type":"string"},"description":{"description":"Optional pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"id":{"description":"Pipeline ID.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"state":{"$ref":"#/components/schemas/Pipeline.State"},"status":{"$ref":"#/components/schemas/Pipeline.Status"},"tags":{"additionalProperties":{"type":"string"},"description":"Tags are key-value pairs that can be assigned to a pipeline resource.\nThey help organize pipelines and enable filtering when listing them.","type":"object"},"url":{"description":"URL to connect to the pipeline, e.g. via http_server.\nMay be empty if no http_server is used.","type":"string"}},"required":["id","display_name","config_yaml"],"type":"object"},"Pipeline.State":{"description":"State of the pipeline.\n\n - STATE_STARTING: The pipeline is starting.\n - STATE_RUNNING: The pipeline is running.\n - STATE_STOPPING: The pipeline is in the process of stopping.\n - STATE_STOPPED: The pipeline is stopped and in paused state.\n - STATE_ERROR: The pipeline encountered an error. See [Error Handling](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/error_handling/) for further guidance.\n - STATE_COMPLETED: The pipeline has completed the job successfully.","enum":["STATE_STARTING","STATE_RUNNING","STATE_STOPPING","STATE_STOPPED","STATE_ERROR","STATE_COMPLETED"],"type":"string"},"Pipeline.Status":{"description":"Pipeline status may contain an error message.","properties":{"error":{"type":"string"}},"type":"object"},"PipelineCreate":{"description":"PipelineCreate contains the details for the pipeline creation request.","properties":{"config_yaml":{"description":"The Repanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","type":"string"},"description":{"description":"Pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"tags":{"additionalProperties":{"type":"string"},"description":"Optional lList of tags to attach to a pipeline.","type":"object"}},"required":["display_name","config_yaml"],"type":"object"},"PipelineUpdate":{"properties":{"config_yaml":{"description":"The Repanda Connect pipeline configuration in YAML format. See the [Redpanda Connect Configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) documentation for more details.","type":"string"},"description":{"description":"Pipeline description.","type":"string"},"display_name":{"description":"User-friendly pipeline name.","type":"string"},"resources":{"$ref":"#/components/schemas/Resources"},"tags":{"additionalProperties":{"type":"string"},"description":"A map of tags to add, update or delete.\nIf a tag's value is empty, the server interprets that as a deletion.","type":"object"}},"required":["display_name","config_yaml"],"type":"object"},"PipelinesForSecret":{"properties":{"pipelines":{"items":{"$ref":"#/components/schemas/Pipeline"},"type":"array"},"secret_id":{"type":"string"}},"type":"object"},"Policy":{"properties":{"host":{"description":"The host address for this ACL.","type":"string"},"operation":{"$ref":"#/components/schemas/ACL.Operation"},"permission_type":{"$ref":"#/components/schemas/PermissionType"},"principal":{"description":"The user for whom this ACL applies.","type":"string"}},"type":"object"},"QuotaFailure":{"description":"Describes how a quota check failed.\n\nFor example if a daily limit was exceeded for the calling project,\na service could respond with a QuotaFailure detail containing the project\nid and the description of the quota limit that was exceeded. If the\ncalling project hasn't enabled the service in the developer console, then\na service could respond with the project id and set `service_disabled`\nto true.\n\nAlso see RetryInfo and Help types for other details about handling a\nquota failure.","properties":{"violations":{"description":"Describes all quota violations.","items":{"$ref":"#/components/schemas/QuotaFailure.Violation"},"type":"array"}},"title":"QuotaFailure","type":"object"},"QuotaFailure.Violation":{"description":"A message type used to describe a single quota violation. For example, a\ndaily quota or a custom quota that was exceeded.","properties":{"description":{"description":"A description of how the quota check failed. Clients can use this\ndescription to find more about the quota configuration in the service's\npublic documentation, or find the relevant quota limit to adjust through\ndeveloper console.\n\nFor example: \"Service disabled\" or \"Daily Limit for read operations\nexceeded\".","type":"string"},"subject":{"description":"The subject on which the quota check failed.\nFor example, \"clientip:\u003cip address of client\u003e\" or \"project:\u003cGoogle\ndeveloper project id\u003e\".","type":"string"}},"type":"object"},"ReplicaAssignment":{"properties":{"partition_id":{"description":"A partition to create.","format":"int32","type":"integer"},"replica_ids":{"description":"The broker IDs the partition replicas are assigned to.","items":{"format":"int32","type":"integer"},"type":"array"}},"type":"object"},"Resource":{"properties":{"acls":{"items":{"$ref":"#/components/schemas/Policy"},"type":"array"},"resource_name":{"description":"The name of the resource this ACL targets.","type":"string"},"resource_pattern_type":{"$ref":"#/components/schemas/ResourcePatternType"},"resource_type":{"$ref":"#/components/schemas/ResourceType"}},"type":"object"},"ResourcePatternType":{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"},"ResourceType":{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"},"Resources":{"properties":{"cpu_shares":{"description":"`cpu_shares` is a string specifying the amount of CPU to allocate for the\npipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable\nunits include:\n- Decimal SI units: \"m\" (e.g., \"500m\" for 500 millicores, \"2\" for 2 cores)\nCPU shares can be specified in millicores (1 core = 1000 millicores).\nIf you don't specify a unit, the value is interpreted as the number of cores.","type":"string"},"memory_shares":{"description":"`memory_shares` is a string specifying the amount of memory to allocate for\nthe pipeline.\n\nThis follows the [Kubernetes quantity](https://kubernetes.io/docs/reference/kubernetes-api/common-definitions/quantity/) format. Acceptable units\ninclude:\n- Decimal SI units: \"K\", \"M\", \"G\", \"T\", \"P\", \"E\" (e.g., \"128M\" for 128\n megabytes)\n- Binary SI units: \"Ki\", \"Mi\", \"Gi\", \"Ti\", \"Pi\", \"Ei\" (e.g., \"512Mi\" for\n512 mebibytes) If you don't specify a unit, the value is interpreted as\nbytes.","type":"string"}},"required":["memory_shares","cpu_shares"],"type":"object"},"Role":{"description":"Role defines a role in the system.","properties":{"name":{"description":"The name of the role.","type":"string"}},"type":"object"},"RoleMembership":{"description":"RoleMembership is the role membership.","properties":{"principal":{"description":"The name of the principal assigned to the role.","type":"string"}},"type":"object"},"SASLMechanism":{"description":"SASL mechanism to use for authentication.","enum":["SASL_MECHANISM_SCRAM_SHA_256","SASL_MECHANISM_SCRAM_SHA_512"],"type":"string"},"Scope":{"description":"Defines the scope of a secret.","enum":["SCOPE_REDPANDA_CONNECT","SCOPE_REDPANDA_CLUSTER"],"type":"string"},"Secret":{"description":"Defines the secret resource.","properties":{"id":{"description":"Secret identifier.","readOnly":true,"type":"string"},"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"}},"type":"object"},"SetConfiguration":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"SetPartitionsToTopicsRequest":{"properties":{"partition_count":{"description":"The number of partitions to set for the topics.","format":"int32","type":"integer"},"topic_names":{"description":"The topic names.","items":{"type":"string"},"type":"array"},"validate_only":{"description":"Validate the request only, do not execute it.","type":"boolean"}},"type":"object"},"SetPartitionsToTopicsResponse":{"properties":{"statuses":{"description":"The status of the operation for each topic.","items":{"$ref":"#/components/schemas/AlterTopicPartitionStatus"},"type":"array"}},"type":"object"},"SetTopicConfigurationsResponse":{"properties":{"configurations":{"description":"Topic's complete set of configurations after this update.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"SetTopicPartitionsBody":{"properties":{"partition_count":{"description":"The number of partitions to set for the topic.","format":"int32","type":"integer"},"validate_only":{"description":"Validate the request only, do not execute it.","type":"boolean"}},"type":"object"},"SetTopicPartitionsResponse":{"type":"object"},"StartPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"StopPipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"TaskInfo":{"properties":{"connector":{"description":"Name of connector.","type":"string"},"task":{"description":"The connector task ID.","format":"int32","type":"integer"}},"type":"object"},"TaskStatus":{"properties":{"id":{"description":"The connector task ID.","format":"int32","type":"integer"},"state":{"description":"State of connector task.","type":"string"},"trace":{"description":"String value of stack trace.","type":"string"},"worker_id":{"description":"ID of worker that the task is assigned to.","type":"string"}},"type":"object"},"TopicLocation":{"properties":{"topic_location":{"description":"Full reference for the unmounted topic in this format: `topic-name/cluster-uuid/revision`.\nUse this as unique identifier for mounting a topic if there are multiple topics available\nwith the same name.","type":"string"},"topic_name":{"description":"Topic name.","type":"string"}},"type":"object"},"TopicMount":{"description":"TopicMount defines the migration of a topic from the cloud storage into this cluster,\nso that it becomes available via the Kafka API.","properties":{"alias":{"description":"Alias may be provided to mount the topic under a different name. Leave\nblank to re-use the source topic name. The alias does not persist if you\nunmount the topic again.","type":"string"},"source_topic_reference":{"description":"The topic name or full reference of the topic to mount. The full reference\nmust be used in case the same topic exists more than once. This may be the case if\nthe same topic has been unmounted multiple times. List all mountable topics to\nfind the full reference (contains topic name, cluster uuid and revision).","type":"string"}},"required":["source_topic_reference"],"type":"object"},"TransformMetadata":{"properties":{"environment_variables":{"description":"The environment variables you want to apply to your transform's environment","items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},"input_topic_name":{"description":"Input topic to apply the transform to.","type":"string"},"name":{"description":"Name of transform.","type":"string"},"output_topic_names":{"description":"Output topics to write the transform results to.","items":{"type":"string"},"type":"array"},"statuses":{"items":{"$ref":"#/components/schemas/PartitionTransformStatus"},"type":"array"}},"type":"object"},"UnmountTopicsResponse":{"properties":{"mount_task_id":{"format":"int32","title":"ID of unmount","type":"integer"}},"type":"object"},"UpdateConfiguration":{"properties":{"name":{"description":"A topic-level config key (e.g. `segment.bytes`).","type":"string"},"operation":{"$ref":"#/components/schemas/ConfigAlterOperation"},"value":{"description":"A topic-level config value (e.g. 1073741824).","nullable":true,"type":"string"}},"type":"object"},"UpdateKafkaConnectSecretBody":{"description":"UpdateKafkaConnectSecretRequest is the request of UpdateKafkaConnectSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"UpdateKafkaConnectSecretResponse":{"description":"UpdateKafkaConnectSecretResponse is the response of UpdateKafkaConnectSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"UpdateMountTaskBody":{"properties":{"action":{"$ref":"#/components/schemas/Action"}},"required":["action"],"type":"object"},"UpdateMountTaskResponse":{"type":"object"},"UpdatePipelineResponse":{"properties":{"pipeline":{"$ref":"#/components/schemas/Pipeline"}},"type":"object"},"UpdateRoleMembershipBody":{"description":"UpdateRoleMembershipRequest is the request to UpdateRoleMembership.","properties":{"add":{"description":"Members to assign to the role.","items":{"$ref":"#/components/schemas/RoleMembership"},"type":"array"},"create":{"description":"Create the role if it doesn't already exist.\nIf the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored.","type":"boolean"},"remove":{"description":"Members to remove from the role.","items":{"$ref":"#/components/schemas/RoleMembership"},"type":"array"}},"type":"object"},"UpdateRoleMembershipResponse":{"description":"UpdateRoleMembershipResponse is the response for UpdateRoleMembership.","properties":{"added":{"description":"Members assigned to the role.","items":{"$ref":"#/components/schemas/RoleMembership"},"type":"array"},"removed":{"description":"Members removed from the role.","items":{"$ref":"#/components/schemas/RoleMembership"},"type":"array"},"role_name":{"description":"The role name.","type":"string"}},"type":"object"},"UpdateSecretBody":{"description":"UpdateSecretRequest is the request of UpdateSecret.","properties":{"labels":{"additionalProperties":{"type":"string"},"description":"Secret labels.","type":"object"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Secret scopes","type":"array"},"secret_data":{"description":"The secret data. Must be Base64-encoded.","format":"byte","type":"string"}},"required":["secret_data"],"type":"object"},"UpdateSecretResponse":{"description":"UpdateSecretResponse is the response of UpdateSecret.","properties":{"secret":{"$ref":"#/components/schemas/Secret"}},"type":"object"},"UpdateTopicConfigurationsResponse":{"properties":{"configurations":{"description":"Topic's complete set of configurations after applying this partial patch.","items":{"$ref":"#/components/schemas/Configuration"},"type":"array"}},"type":"object"},"UpdateUserRequest.User":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"description":"Username.","type":"string"},"password":{"description":"Password.","type":"string"}},"type":"object"},"UpdateUserResponse":{"properties":{"user":{"$ref":"#/components/schemas/UpdateUserResponse.User"}},"type":"object"},"UpdateUserResponse.User":{"description":"Updated user's name and SASL mechanism.","properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"name":{"type":"string"}},"type":"object"},"UpsertConnectorResponse":{"properties":{"connector":{"$ref":"#/components/schemas/ConnectorSpec"}},"type":"object"},"rpc.Status":{"description":"The `Status` type defines a logical error model that is suitable for\ndifferent programming environments, including REST APIs and RPC APIs. It is\nused by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details.\n\nYou can find out more about this error model and how to work with it in the\n[API Design Guide](https://cloud.google.com/apis/design/errors).","properties":{"code":{"description":"RPC status code, as described [here](https://github.com/googleapis/googleapis/blob/b4c238feaa1097c53798ed77035bbfeb7fc72e96/google/rpc/code.proto#L32).","enum":["OK","CANCELLED","UNKNOWN","INVALID_ARGUMENT","DEADLINE_EXCEEDED","NOT_FOUND","ALREADY_EXISTS","PERMISSION_DENIED","UNAUTHENTICATED","RESOURCE_EXHAUSTED","FAILED_PRECONDITION","ABORTED","OUT_OF_RANGE","UNIMPLEMENTED","INTERNAL","UNAVAILABLE","DATA_LOSS"],"format":"int32","type":"string"},"details":{"items":{"description":"Details of the error.","oneOf":[{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.BadRequest"],"type":"string"}}},{"$ref":"#/components/schemas/BadRequest"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.ErrorInfo"],"type":"string"}}},{"$ref":"#/components/schemas/ErrorInfo"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.QuotaFailure"],"type":"string"}}},{"$ref":"#/components/schemas/QuotaFailure"}]},{"allOf":[{"properties":{"@type":{"description":"Fully qualified protobuf type name of the underlying response, prefixed with `type.googleapis.com/`.","enum":["type.googleapis.com/google.rpc.Help"],"type":"string"}}},{"$ref":"#/components/schemas/Help"}]}]},"type":"array"},"message":{"description":"Detailed error message. No compatibility guarantees are given for the text contained in this message.","type":"string"}},"type":"object"}},"securitySchemes":{"auth0":{"description":"RedpandaCloud","flows":{"implicit":{"authorizationUrl":"https://auth.prd.cloud.redpanda.com/oauth/authorize","scopes":{},"x-client-id":"dQjapNIAHhF7EQqQToRla3yEII9sUSap"}},"type":"oauth2"}}},"info":{"title":"Redpanda Cloud Data Plane API","version":"v1"},"openapi":"3.0.3","paths":{"/v1/acls":{"delete":{"description":"Delete all ACLs that match the filter criteria. The `filter.` query string parameters find matching ACLs that meet all specified conditions.","operationId":"ACLService_DeleteACLs","parameters":[{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","in":"query","name":"filter.resource_type","required":true,"schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"description":"The name of the resource this ACL targets.","in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","in":"query","name":"filter.resource_pattern_type","required":true,"schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","in":"query","name":"filter.principal","schema":{"type":"string"}},{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","in":"query","name":"filter.host","schema":{"type":"string"}},{"description":"The operation that is allowed or denied (e.g. READ).","in":"query","name":"filter.operation","required":true,"schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"description":"Whether the operation should be allowed or denied.","in":"query","name":"filter.permission_type","required":true,"schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete ACLs","tags":["Redpanda ACLs"]},"get":{"description":"List all ACLs. The `filter.` query string parameters find matching ACLs that meet all specified conditions.","operationId":"ACLService_ListACLs","parameters":[{"description":"The type of resource (topic, consumer group, etc.) this\nACL targets.","in":"query","name":"filter.resource_type","schema":{"enum":["RESOURCE_TYPE_ANY","RESOURCE_TYPE_TOPIC","RESOURCE_TYPE_GROUP","RESOURCE_TYPE_CLUSTER","RESOURCE_TYPE_TRANSACTIONAL_ID","RESOURCE_TYPE_DELEGATION_TOKEN","RESOURCE_TYPE_USER"],"type":"string"}},{"description":"The name of the resource this ACL targets.","in":"query","name":"filter.resource_name","schema":{"type":"string"}},{"description":"The pattern to use for matching the specified resource_name\n(any, exact match, literal, or prefixed).","in":"query","name":"filter.resource_pattern_type","schema":{"enum":["RESOURCE_PATTERN_TYPE_ANY","RESOURCE_PATTERN_TYPE_MATCH","RESOURCE_PATTERN_TYPE_LITERAL","RESOURCE_PATTERN_TYPE_PREFIXED"],"type":"string"}},{"description":"The user for whom this ACL applies. With the Kafka simple\nauthorizer, you must include the prefix \"User:\" with the user name.","in":"query","name":"filter.principal","schema":{"type":"string"}},{"description":"The host address to use for this ACL. To allow a principal\naccess from multiple hosts, you must create an ACL for each host.","in":"query","name":"filter.host","schema":{"type":"string"}},{"description":"The operation that is allowed or denied (e.g. READ).","in":"query","name":"filter.operation","schema":{"enum":["OPERATION_ANY","OPERATION_ALL","OPERATION_READ","OPERATION_WRITE","OPERATION_CREATE","OPERATION_DELETE","OPERATION_ALTER","OPERATION_DESCRIBE","OPERATION_CLUSTER_ACTION","OPERATION_DESCRIBE_CONFIGS","OPERATION_ALTER_CONFIGS","OPERATION_IDEMPOTENT_WRITE","OPERATION_CREATE_TOKENS","OPERATION_DESCRIBE_TOKENS"],"type":"string"}},{"description":"Whether the operation should be allowed or denied.","in":"query","name":"filter.permission_type","schema":{"enum":["PERMISSION_TYPE_ANY","PERMISSION_TYPE_DENY","PERMISSION_TYPE_ALLOW"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListACLsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List ACLs","tags":["Redpanda ACLs"]},"post":{"description":"Create a new ACL.","operationId":"ACLService_CreateACL","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLRequest"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateACLResponse"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create ACL","tags":["Redpanda ACLs"]}},"/v1/cloud-storage/mount-tasks":{"get":{"description":"This operation retrieves the status of a task responsible for mounting or unmounting topics. It provides details on the task’s type (mount or unmount), its current state, and the topics involved.","operationId":"CloudStorageService_ListMountTasks","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMountTasksResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Retrieve the mount task status","tags":["Cloud Storage"]}},"/v1/cloud-storage/mount-tasks/{id}":{"delete":{"description":"Delete a mount or unmount by ID.","operationId":"CloudStorageService_DeleteMountTask","parameters":[{"description":"Unique identifier of the mount or unmount task to delete.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete a mount or unmount","tags":["Cloud Storage"]},"get":{"description":"Retrieves the status of a mount or unmount by ID. The response provides details on the operation type (mount or unmount), its current state, and the topics involved. Use the ID returned when you start the mount or unmount, or use the ListMountTasks endpoint to retrieve a list of IDs.","operationId":"CloudStorageService_GetMountTask","parameters":[{"description":"Unique identifier of the mount or unmount task to retrieve.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get the status of a mount or unmount by ID","tags":["Cloud Storage"]},"post":{"description":"This operation allows performing an action on an ongoing mount task.","operationId":"CloudStorageService_UpdateMountTask","parameters":[{"description":"ID is the unique identifier of the mount or unmount to update.","in":"path","name":"id","required":true,"schema":{"format":"int32","type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMountTaskBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMountTaskResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update a mount or unmount","tags":["Cloud Storage"]}},"/v1/cloud-storage/topics/mount":{"post":{"description":"Attach mountable topics from object storage to a cluster, making them available for consumption and production again. Mounting a topic reloads its data and state to the local brokers, allowing active use of the topic.","operationId":"CloudStorageService_MountTopics","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/TopicMount"},"required":["topics"],"type":"array"}}},"required":true,"x-originalParamName":"topics"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MountTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Mount topics from object storage","tags":["Cloud Storage"]}},"/v1/cloud-storage/topics/mountable":{"get":{"description":"Retrieve all topics that are currently unmounted and available to be mounted to the cluster. These topics reside in object storage and can be mounted for consumption or production within the cluster.","operationId":"CloudStorageService_ListMountableTopics","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListMountableTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List mountable topics","tags":["Cloud Storage"]}},"/v1/cloud-storage/topics/unmount":{"post":{"description":"Unmount topics to object storage, freeing up all local cluster resources. Once you unmount a topic, it can no longer be consumed or produced to. It detaches from the active cluster while its data remains safely stored in the external object storage.","operationId":"CloudStorageService_UnmountTopics","requestBody":{"content":{"application/json":{"schema":{"items":{"type":"string"},"required":["topics"],"type":"array"}}},"description":"List of topics to unmount.","required":true,"x-originalParamName":"topics"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UnmountTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Unmount topics to object storage","tags":["Cloud Storage"]}},"/v1/kafka-connect/clusters":{"get":{"description":"List connect clusters available for being consumed by the console's kafka-connect service.","operationId":"KafkaConnectService_ListConnectClusters","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectClustersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connect clusters","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}":{"get":{"description":"Get information about an available Kafka Connect cluster.","operationId":"KafkaConnectService_GetConnectCluster","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectCluster"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Connect cluster not found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connect cluster","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors":{"get":{"description":"List connectors managed by the Kafka Connect service.","operationId":"KafkaConnectService_ListConnectors","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectorsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connectors","tags":["Kafka Connect"]},"post":{"description":"Create a connector with the specified configuration.","operationId":"KafkaConnectService_CreateConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"required":true,"x-originalParamName":"connector"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create connector","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}":{"delete":{"description":"Delete a connector. This operation force stops all tasks and also deletes the connector configuration.","operationId":"KafkaConnectService_DeleteConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete connector","tags":["Kafka Connect"]},"get":{"description":"Get information about a connector in a specific cluster.","operationId":"KafkaConnectService_GetConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/config":{"get":{"description":"Get the configuration for the connector.","operationId":"KafkaConnectService_GetConnectorConfig","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector configuration","tags":["Kafka Connect"]},"put":{"description":"Update the configuration for an existing connector with the specified name, or create a new connector using the given configuration. Returns information about the connector after the change has been made.","operationId":"KafkaConnectService_UpsertConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector. If a connector with this name does not already exist, a new connector is created.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"required":["config"],"type":"object"}}},"description":"Connector configuration property.","required":true,"x-originalParamName":"config"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Updated"},"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorSpec"}}},"description":"Created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Upsert connector configuration","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/pause":{"put":{"description":"Pause the connector and its tasks, which stops messages from processing until the connector is resumed. This call is asynchronous and may take some time to process.","operationId":"KafkaConnectService_PauseConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Pause request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Pause connector","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/restart":{"post":{"description":"Triggers a connector restart. You must specify whether or not tasks are also restarted, and whether only failed connectors are restarted.","operationId":"KafkaConnectService_RestartConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Options"}}},"required":true,"x-originalParamName":"options"},"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Restart connector request success"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Restart connector","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/resume":{"put":{"description":"Resume a paused connector and its tasks, and resumes message processing. This call is asynchronous and may take some time to process. If the connector was not paused, this operation does not do anything.","operationId":"KafkaConnectService_ResumeConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Resume request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Resume connector","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/status":{"get":{"description":"Gets the current status of the connector, including the state for each of its tasks, error information, etc.","operationId":"KafkaConnectService_GetConnectorStatus","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectorStatus"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get connector status","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/stop":{"put":{"description":"Stops a connector, but does not delete it. All tasks for the connector are shut down completely. This call is asynchronous and may take some time to process.","operationId":"KafkaConnectService_StopConnector","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"202":{"content":{"application/json":{"schema":{}}},"description":"Request accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Stop connector","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics":{"get":{"description":"Returns a list of connector topic names. If the connector is inactive, this call returns an empty list.","operationId":"KafkaConnectService_ListConnectorTopics","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListConnectorTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List connector topics","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/connectors/{name}/topics/reset":{"put":{"description":"Resets the set of topic names that the connector is using.","operationId":"KafkaConnectService_ResetConnectorTopics","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Name of connector using the topics to be reset.","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Reset connector topics","tags":["Kafka Connect"]}},"/v1/kafka-connect/clusters/{cluster_name}/secrets":{"get":{"description":"List Kafka Connect cluster secrets. Optional: filter based on secret name and labels.","operationId":"SecretService_ListKafkaConnectSecrets","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"Substring match on secret name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string][string]","schema":{"type":"string"}},{"description":"Secret scopes to search for","in":"query","name":"filter.scopes","schema":{"items":{"enum":["SCOPE_REDPANDA_CONNECT","SCOPE_REDPANDA_CLUSTER"],"type":"string"},"type":"array"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Connect Cluster Secrets","tags":["Secrets"]},"post":{"description":"Create a Kafka Connect cluster secret.","operationId":"SecretService_CreateKafkaConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateKafkaConnectSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Connect Cluster Secret","tags":["Secrets"]}},"/v1/kafka-connect/clusters/{cluster_name}/secrets/{id}":{"delete":{"description":"Delete a Kafka Connect cluster secret.","operationId":"SecretService_DeleteKafkaConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"ID of the secret to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Connect Cluster Secret","tags":["Secrets"]},"get":{"description":"Get a specific Kafka Connect cluster secret.","operationId":"SecretService_GetKafkaConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"The ID of the secret to retrieve.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Connect Cluster Secret","tags":["Secrets"]},"put":{"description":"Update a Kafka Connect cluster secret.","operationId":"SecretService_UpdateKafkaConnectSecret","parameters":[{"description":"Unique name of target connect cluster. For Redpanda Cloud, use `redpanda`.","in":"path","name":"cluster_name","required":true,"schema":{"type":"string"}},{"description":"ID of the secret to update.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateKafkaConnectSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Connect Cluster Secret","tags":["Secrets"]}},"/v1/redpanda-connect/config-schema":{"get":{"description":"The configuration schema includes available [components and processors](https://docs.redpanda.com/redpanda-cloud/develop/connect/components/about) in this Redpanda Connect instance.","operationId":"PipelineService_GetPipelineServiceConfigSchema","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelineServiceConfigSchemaResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Retrieve the schema for Redpanda Connect pipeline configurations.","tags":["Redpanda Connect Pipeline"]}},"/v1/redpanda-connect/pipelines":{"get":{"description":"List Redpanda Connect pipelines. Optional: filter based on pipeline name.","operationId":"PipelineService_ListPipelines","parameters":[{"description":"Any pipelines that partially match this name will be returned.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.tags[string]","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListPipelinesResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Redpanda Connect pipelines","tags":["Redpanda Connect Pipeline"]},"post":{"description":"Create a new Redpanda Connect pipeline.","operationId":"PipelineService_CreatePipeline","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineCreate"}}},"required":true,"x-originalParamName":"pipeline"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline"]}},"/v1/redpanda-connect/pipelines-by-secrets":{"get":{"description":"Get Redpanda Connect pipelines by secrets.","operationId":"PipelineService_GetPipelinesBySecrets","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelinesBySecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipelines by secrets","tags":["Redpanda Connect Pipeline"]}},"/v1/redpanda-connect/pipelines-for-secret":{"get":{"description":"Get Redpanda Connect pipelines for a given secret.","operationId":"PipelineService_GetPipelinesForSecret","parameters":[{"description":"Secret ID.","in":"query","name":"secret_id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetPipelinesForSecretResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipelines for secret","tags":["Redpanda Connect Pipeline"]}},"/v1/redpanda-connect/pipelines/{id}":{"delete":{"description":"Delete a Redpanda Connect pipeline.","operationId":"PipelineService_DeletePipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Deleted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline"]},"get":{"description":"Get a specific Redpanda Connect pipeline.","operationId":"PipelineService_GetPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline"]},"put":{"description":"Update the [configuration](https://docs.redpanda.com/redpanda-cloud/develop/connect/configuration/about) of a Redpanda Connect pipeline.","operationId":"PipelineService_UpdatePipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"description":"Specifies which fields should be updated. If not provided,\nall fields will be updated.","in":"query","name":"update_mask","schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PipelineUpdate"}}},"required":true,"x-originalParamName":"pipeline"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline"]}},"/v1/redpanda-connect/pipelines/{id}/start":{"put":{"description":"Start a stopped Redpanda Connect pipeline.","operationId":"PipelineService_StartPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"Started"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Start a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline"]}},"/v1/redpanda-connect/pipelines/{id}/stop":{"put":{"description":"Stop a running Redpanda Connect pipeline.","operationId":"PipelineService_StopPipeline","parameters":[{"description":"Pipeline ID.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pipeline"}}},"description":"Stopped"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Stops a Redpanda Connect pipeline","tags":["Redpanda Connect Pipeline"]}},"/v1/roles":{"get":{"description":"List roles. Optional: filter based on role name and principal.","operationId":"SecurityService_ListRoles","parameters":[{"description":"Filter results only roles named with the prefix.","in":"query","name":"filter.name_prefix","schema":{"type":"string"}},{"description":"Filter results to only roles with names which contain the string.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Return only roles assigned to this principal.","in":"query","name":"filter.principal","schema":{"type":"string"}},{"description":"Page size.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRolesResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Roles","tags":["Security"]},"post":{"description":"Create a role.","operationId":"SecurityService_CreateRole","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Role"}}},"description":"The role to create.","required":true,"x-originalParamName":"role"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRoleResponse"}}},"description":"Role created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Role","tags":["Security"]}},"/v1/roles/{role_name}":{"delete":{"description":"Delete a Role.","operationId":"SecurityService_DeleteRole","parameters":[{"description":"The role name.","in":"path","name":"role_name","required":true,"schema":{"type":"string"}},{"description":"Whether to delete the ACLs bound to the role.","in":"query","name":"delete_acls","schema":{"type":"boolean"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Role deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Role","tags":["Security"]},"get":{"description":"Get a role.","operationId":"SecurityService_GetRole","parameters":[{"description":"The role name.","in":"path","name":"role_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetRoleResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Role","tags":["Security"]},"put":{"description":"Update a role.","operationId":"SecurityService_UpdateRoleMembership","parameters":[{"description":"The role name.","in":"path","name":"role_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoleMembershipBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoleMembershipResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Role","tags":["Security"]}},"/v1/roles/{role_name}/members":{"get":{"description":"List members assigned to a role.","operationId":"SecurityService_ListRoleMembers","parameters":[{"description":"The role name.","in":"path","name":"role_name","required":true,"schema":{"type":"string"}},{"description":"Filter results to only members with names which contain the string.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Page size.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListRoleMembersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Role Members","tags":["Security"]}},"/v1/secret-scopes":{"get":{"description":"List supported secret scopes.","operationId":"SecretService_ListSecretScopes","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretScopesResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Secret Scopes","tags":["Secrets"]}},"/v1/secrets":{"get":{"description":"List secrets. Optional: filter based on secret name and labels.","operationId":"SecretService_ListSecrets","parameters":[{"description":"Substring match on secret name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"This is a request variable of the map type. The query format is \"map_name[key]=value\", e.g. If the map name is Age, the key type is string, and the value type is integer, the query parameter is expressed as Age[\"bob\"]=18","in":"query","name":"filter.labels[string]","schema":{"type":"string"}},{"description":"Secret scopes to search for","in":"query","name":"filter.scopes","schema":{"items":{"enum":["SCOPE_REDPANDA_CONNECT","SCOPE_REDPANDA_CLUSTER"],"type":"string"},"type":"array"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListSecretsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Secrets","tags":["Secrets"]},"post":{"description":"Create a secret.","operationId":"SecretService_CreateSecret","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSecretRequest"}}},"description":"CreateSecretRequest is the request of CreateSecret.","required":true,"x-originalParamName":"body"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"Secret created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Secret","tags":["Secrets"]}},"/v1/secrets/{id}":{"delete":{"description":"Delete a secret.","operationId":"SecretService_DeleteSecret","parameters":[{"description":"The id of the secret to delete.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Secret deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Secret","tags":["Secrets"]},"get":{"description":"Get a secret.","operationId":"SecretService_GetSecret","parameters":[{"description":"The id of the secret to retrieve.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Secret","tags":["Secrets"]},"put":{"description":"Update a secret.","operationId":"SecretService_UpdateSecret","parameters":[{"description":"Secret identifier.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateSecretBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Secret"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Secret","tags":["Secrets"]}},"/v1/topics":{"get":{"description":"List topics, with partition count and replication factor. Optional: filter based on topic name.","operationId":"TopicService_ListTopics","parameters":[{"description":"Substring match on topic name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response. If not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Topics","tags":["Topics"]},"post":{"description":"Create a [topic](https://docs.redpanda.com/redpanda-cloud/get-started/create-topic/).","operationId":"TopicService_CreateTopic","parameters":[{"description":"If true, makes this request a dry run; everything is validated but\nno topics are actually created.","in":"query","name":"validate_only","schema":{"type":"boolean"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicRequest.Topic"}}},"description":"The topic to create.","required":true,"x-originalParamName":"topic"},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTopicResponse"}}},"description":"Topic created"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create Topic","tags":["Topics"]}},"/v1/topics-partitions":{"patch":{"description":"Add partitions to existing topics. Depending on the partitioning strategy used, this may impact ordering guarantees.","operationId":"TopicService_AddPartitionsToTopics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPartitionsToTopicsRequest"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddPartitionsToTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Add Topic Partitions","tags":["Topics"]},"put":{"description":"Set partition counts for existing topics. New value must be equal to or larger than the current count of partitions in the topic. All topics will have the same final count of partitions. Depending on the partitioning strategy used, this may impact ordering guarantees.","operationId":"TopicService_SetPartitionsToTopics","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPartitionsToTopicsRequest"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPartitionsToTopicsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Set Topic Partitions","tags":["Topics"]}},"/v1/topics/{topic_name}":{"delete":{"description":"Delete the Kafka topic with the requested name.","operationId":"TopicService_DeleteTopic","parameters":[{"description":"Topic name.","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"schema":{}}},"description":"Topic deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Requested topic does not exist"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Topic","tags":["Topics"]}},"/v1/topics/{topic_name}/configurations":{"get":{"description":"Get key-value configs for a topic.","operationId":"TopicService_GetTopicConfigurations","parameters":[{"description":"Topic name","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GetTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Topic Configurations","tags":["Topics"]},"patch":{"description":"Update a subset of the topic configurations.","operationId":"TopicService_UpdateTopicConfigurations","parameters":[{"description":"Topic name","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UpdateConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configurations"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update Topic Configuration","tags":["Topics"]},"put":{"description":"Update the entire set of key-value configurations for a topic. Config entries that are not provided in the request are removed and will fall back to their default values.","operationId":"TopicService_SetTopicConfigurations","parameters":[{"description":"Name of topic.","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/SetConfiguration"},"type":"array"}}},"required":true,"x-originalParamName":"configurations"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTopicConfigurationsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Set Topic Configurations","tags":["Topics"]}},"/v1/topics/{topic_name}/partitions":{"patch":{"description":"Add partitions to an existing topic. Depending on the partitioning strategy used, this may impact ordering guarantees.","operationId":"TopicService_AddTopicPartitions","parameters":[{"description":"The topic name.","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTopicPartitionsBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddTopicPartitionsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Add Topic Partitions","tags":["Topics"]},"put":{"description":"Set partitions to an existing topic. New value must be equal to or larger than the current count of partitions in the topic. Depending on the partitioning strategy used, this may impact ordering guarantees.","operationId":"TopicService_SetTopicPartitions","parameters":[{"description":"The topic name.","in":"path","name":"topic_name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTopicPartitionsBody"}}},"required":true,"x-originalParamName":"body"},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetTopicPartitionsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Set Topic Partitions","tags":["Topics"]}},"/v1/transforms":{"get":{"description":"Retrieve a list of Wasm transforms. Optional: filter based on transform name.","operationId":"TransformService_ListTransforms","parameters":[{"description":"Substring match on transform name. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"example":{"next_page_token":"","transforms":[{"environment_variables":[],"input_topic_name":"topic1","name":"transform1","output_topic_names":["output-topic11","output-topic12"],"statuses":[{"broker_id":1,"lag":1,"partition_id":1,"status":"PARTITION_STATUS_RUNNING"}]},{"environment_variables":[],"input_topic_name":"topic2","name":"transform2","output_topic_names":["output-topic21","output-topic22"],"statuses":[{"broker_id":2,"lag":2,"partition_id":2,"status":"PARTITION_STATUS_RUNNING"}]}]},"schema":{"$ref":"#/components/schemas/ListTransformsResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Transforms","tags":["WASM Transforms"]},"put":{"description":"Initiate deployment of a new Wasm transform. This endpoint uses multipart/form-data encoding. Following deployment, a brief period is required before the Wasm transform becomes operational. Monitor the partition statuses to check whether the transform is active. This usually takes around 3s, but no longer than 10s.","operationId":"TransformService_DeployTransform","requestBody":{"content":{"multipart/form-data":{"schema":{"example":"{\"name\":\"redact-orders\",\"input_topic_name\":\"orders\",\"output_topic_names\":[\"orders-redacted\"],\"environment_variables\":[{\"key\":\"LOGGER_LEVEL\",\"value\":\"DEBUG\"}]}","properties":{"metadata":{"$ref":"#/components/schemas/DeployTransformRequest"},"wasm_binary":{"description":"Binary file containing the compiled WASM transform. The maximum size for this file is 10MiB.","format":"binary","type":"string"}},"type":"object"}}},"description":"Transform metadata as well as the WASM binary","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransformMetadata"}}},"description":"Created"}},"summary":"Deploy Transform","tags":["WASM Transforms"]}},"/v1/transforms/{name}":{"delete":{"description":"Delete a Wasm transform with the requested name.","operationId":"TransformService_DeleteTransform","parameters":[{"description":"Name of transform.","example":{"name":"transform1"},"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"Transform deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete Transform","tags":["WASM Transforms"]},"get":{"description":"Get a specific Wasm transform.","operationId":"TransformService_GetTransform","parameters":[{"description":"Name of transform.","example":{"name":"transform1"},"in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"transform":{"environment_variables":[],"input_topic_name":"topic1","name":"transform1","output_topic_names":["output-topic1","output-topic2"],"statuses":[{"broker_id":1,"lag":1,"partition_id":1,"status":"PARTITION_STATUS_RUNNING"}]}},"schema":{"$ref":"#/components/schemas/GetTransformResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Get Transform","tags":["WASM Transforms"]}},"/v1/users":{"get":{"description":"List users. Optional: filter based on username.","operationId":"UserService_ListUsers","parameters":[{"description":"Username.","in":"query","name":"filter.name","schema":{"type":"string"}},{"description":"Substring match on username. Case-sensitive.","in":"query","name":"filter.name_contains","schema":{"type":"string"}},{"description":"Limit the paginated response to a number of items. Defaults to 100. Use -1 to disable pagination.","in":"query","name":"page_size","schema":{"format":"int32","type":"integer"}},{"description":"Value of the next_page_token field returned by the previous response.\nIf not provided, the system assumes the first page is requested.","in":"query","name":"page_token","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"example":{"next_page_token":"","users":[{"name":"payment-service"},{"name":"jane"}]},"schema":{"$ref":"#/components/schemas/ListUsersResponse"}}},"description":"OK"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"List Users","tags":["Redpanda Users"]},"post":{"description":"Create a new user.","operationId":"UserService_CreateUser","requestBody":{"content":{"application/json":{"example":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service","password":"secure-password"},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"required":true,"x-originalParamName":"user"},"responses":{"201":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/CreateUserRequest.User"}}},"description":"User created"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password"},{"description":"value is required","field":"user.mechanism"}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Bad request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Create User","tags":["Redpanda Users"]}},"/v1/users/{name}":{"delete":{"description":"Delete the specified user","operationId":"UserService_DeleteUser","parameters":[{"description":"Username","in":"path","name":"name","required":true,"schema":{"type":"string"}}],"responses":{"204":{"content":{"application/json":{"example":{},"schema":{}}},"description":"User deleted successfully"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"404":{"content":{"application/json":{"example":{"code":"NOT_FOUND","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_RESOURCE_NOT_FOUND"}],"message":"user not found"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Delete User","tags":["Redpanda Users"]}},"/v1/users/{user.name}":{"put":{"description":"Update a user's credentials.","operationId":"UserService_UpdateUser","parameters":[{"description":"Username.","in":"path","name":"user.name","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","password":"new-password"}},"schema":{"properties":{"mechanism":{"$ref":"#/components/schemas/SASLMechanism"},"password":{"description":"Password.","type":"string"}},"type":"object"}}},"required":true,"x-originalParamName":"user"},"responses":{"200":{"content":{"application/json":{"example":{"user":{"mechanism":"SASL_MECHANISM_SCRAM_SHA_256","name":"payment-service"}},"schema":{"$ref":"#/components/schemas/UpdateUserResponse.User"}}},"description":"OK"},"400":{"content":{"application/json":{"example":{"code":"INVALID_ARGUMENT","details":[{"@type":"type.googleapis.com/google.rpc.ErrorInfo","domain":"redpanda.com/dataplane","metadata":{},"reason":"REASON_INVALID_INPUT"},{"@type":"type.googleapis.com/google.rpc.BadRequest","field_violations":[{"description":"value length must be at least 3 characters","field":"user.password"},{"description":"value is required","field":"user.mechanism"}]}],"message":"provided parameters are invalid"},"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Bad request. Check API documentation and update request."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Unauthenticated."},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"Internal Server Error. Reach out to support."},"default":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/rpc.Status"}}},"description":"An unexpected error response."}},"summary":"Update User","tags":["Redpanda Users"]}}},"security":[{"auth0":[]}],"servers":[{"description":"Data Plane API","url":"{dataplane_api_url}","variables":{"dataplane_api_url":{"default":"https://{dataplane_api_url}","description":"Find the Data Plane API base URL of a cluster by calling the Get Cluster endpoint of the Control Plane API. The dataplane_api.url field is returned in the response body.\u003cbr\u003e\u003cbr\u003e\n\t\t\t\t\tExample (Dedicated): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.fmc.prd.cloud.redpanda.com\"\u003cbr\u003e\n\t\t\t\t\tExample (BYOC): \"https://api-a4cb21.ck09mi9c4vs17hng9gig.byoc.prd.cloud.redpanda.com\""}}}],"tags":[{"description":"Manage Redpanda access control lists (ACLs). See [Redpanda Cloud Authorization](https://docs.redpanda.com/redpanda-cloud/security/authorization/cloud-authorization/) for more information.","name":"Redpanda ACLs"},{"description":"Manage Redpanda topics stored in object storage. See: [Mountable Topics](https://docs.redpanda.com/redpanda-cloud/manage/mountable-topics/)","name":"Cloud Storage"},{"description":"Manage Wasm transforms in Redpanda.","name":"WASM Transforms"},{"description":"Manage [connectors](https://docs.redpanda.com/redpanda-cloud/develop/managed-connectors/) and interact with the Kafka Connect API.","name":"Kafka Connect"},{"description":"Create and manage [Redpanda Connect](https://docs.redpanda.com/redpanda-cloud/develop/connect/about) pipelines and their configurations.","name":"Redpanda Connect Pipeline"},{"description":"Manage [secrets](https://docs.redpanda.com/redpanda-cloud/security/secrets) for Redpanda Cloud.","name":"Secrets"},{"description":"Manage Redpanda roles.","name":"Security"},{"description":"Manage Redpanda topics.","name":"Topics"},{"description":"Manage Redpanda users. To manage access, see the Data Plane [ACL endpoints](https://docs.redpanda.com/api/cloud-dataplane-api/#get-/v1/acls).","name":"Redpanda Users"}]} \ No newline at end of file diff --git a/proto/gen/openapi/openapi.yaml b/proto/gen/openapi/openapi.yaml index 591a651a86..d55f54f739 100644 --- a/proto/gen/openapi/openapi.yaml +++ b/proto/gen/openapi/openapi.yaml @@ -388,6 +388,12 @@ components: pipeline: $ref: '#/components/schemas/Pipeline' type: object + CreateRoleResponse: + description: CreateRoleResponse is the response for CreateRole. + properties: + role: + $ref: '#/components/schemas/Role' + type: object CreateSecretRequest: description: CreateSecretRequest is the request of CreateSecret. properties: @@ -545,6 +551,9 @@ components: type: object DeletePipelineResponse: type: object + DeleteRoleResponse: + description: DeleteRoleResponse is the response for DeleteRole. + type: object DeleteSecretResponse: description: DeleteSecretResponse is the response of DeleteSecret. type: object @@ -759,6 +768,17 @@ components: pipelines_for_secret: $ref: '#/components/schemas/PipelinesForSecret' type: object + GetRoleResponse: + description: GetRoleResponse is the response to GetRole. + properties: + members: + description: Members assigned to the role. + items: + $ref: '#/components/schemas/RoleMembership' + type: array + role: + $ref: '#/components/schemas/Role' + type: object GetSecretResponse: description: GetSecretResponse is the response of GetSecret. properties: @@ -908,6 +928,53 @@ components: $ref: '#/components/schemas/Pipeline' type: array type: object + ListRoleMembersRequest.Filter: + description: Filter options. + properties: + name_contains: + description: Filter results to only members with names which contain the string. + type: string + type: object + ListRoleMembersResponse: + description: ListRoleMembersResponse is the response for ListRoleMembers. + properties: + members: + description: Members assigned to the role. + items: + $ref: '#/components/schemas/RoleMembership' + type: array + next_page_token: + description: Token to retrieve the next page. + type: string + role_name: + description: The role name. + type: string + type: object + ListRolesRequest.Filter: + description: Filter options. + properties: + name_contains: + description: Filter results to only roles with names which contain the string. + type: string + name_prefix: + description: Filter results only roles named with the prefix. + type: string + principal: + description: Return only roles assigned to this principal. + type: string + type: object + ListRolesResponse: + description: ListRolesResponse is the response for ListRoles. + properties: + next_page_token: + description: Token to retrieve the next page. + type: string + roles: + description: The roles in the system. + items: + $ref: '#/components/schemas/Role' + type: array + type: object ListSecretScopesResponse: description: ListSecretScopesResponse is the response of ListSecretScopes. properties: @@ -1402,6 +1469,20 @@ components: - memory_shares - cpu_shares type: object + Role: + description: Role defines a role in the system. + properties: + name: + description: The name of the role. + type: string + type: object + RoleMembership: + description: RoleMembership is the role membership. + properties: + principal: + description: The name of the principal assigned to the role. + type: string + type: object SASLMechanism: description: SASL mechanism to use for authentication. enum: @@ -1631,6 +1712,42 @@ components: pipeline: $ref: '#/components/schemas/Pipeline' type: object + UpdateRoleMembershipBody: + description: UpdateRoleMembershipRequest is the request to UpdateRoleMembership. + properties: + add: + description: Members to assign to the role. + items: + $ref: '#/components/schemas/RoleMembership' + type: array + create: + description: |- + Create the role if it doesn't already exist. + If the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored. + type: boolean + remove: + description: Members to remove from the role. + items: + $ref: '#/components/schemas/RoleMembership' + type: array + type: object + UpdateRoleMembershipResponse: + description: UpdateRoleMembershipResponse is the response for UpdateRoleMembership. + properties: + added: + description: Members assigned to the role. + items: + $ref: '#/components/schemas/RoleMembership' + type: array + removed: + description: Members removed from the role. + items: + $ref: '#/components/schemas/RoleMembership' + type: array + role_name: + description: The role name. + type: string + type: object UpdateSecretBody: description: UpdateSecretRequest is the request of UpdateSecret. properties: @@ -3735,6 +3852,307 @@ paths: summary: Stops a Redpanda Connect pipeline tags: - Redpanda Connect Pipeline + /v1/roles: + get: + description: 'List roles. Optional: filter based on role name and principal.' + operationId: SecurityService_ListRoles + parameters: + - description: Filter results only roles named with the prefix. + in: query + name: filter.name_prefix + schema: + type: string + - description: Filter results to only roles with names which contain the string. + in: query + name: filter.name_contains + schema: + type: string + - description: Return only roles assigned to this principal. + in: query + name: filter.principal + schema: + type: string + - description: Page size. + in: query + name: page_size + schema: + format: int32 + type: integer + - description: |- + Value of the next_page_token field returned by the previous response. + If not provided, the system assumes the first page is requested. + in: query + name: page_token + schema: + type: string + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/ListRolesResponse' + description: OK + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Unauthenticated. + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Internal Server Error. Reach out to support. + default: + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: An unexpected error response. + summary: List Roles + tags: + - Security + post: + description: Create a role. + operationId: SecurityService_CreateRole + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Role' + description: The role to create. + required: true + x-originalParamName: role + responses: + "201": + content: + application/json: + schema: + $ref: '#/components/schemas/CreateRoleResponse' + description: Role created + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Unauthenticated. + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Internal Server Error. Reach out to support. + default: + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: An unexpected error response. + summary: Create Role + tags: + - Security + /v1/roles/{role_name}: + delete: + description: Delete a Role. + operationId: SecurityService_DeleteRole + parameters: + - description: The role name. + in: path + name: role_name + required: true + schema: + type: string + - description: Whether to delete the ACLs bound to the role. + in: query + name: delete_acls + schema: + type: boolean + responses: + "204": + content: + application/json: + schema: {} + description: Role deleted successfully + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Unauthenticated. + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Not Found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Internal Server Error. Reach out to support. + default: + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: An unexpected error response. + summary: Delete Role + tags: + - Security + get: + description: Get a role. + operationId: SecurityService_GetRole + parameters: + - description: The role name. + in: path + name: role_name + required: true + schema: + type: string + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/GetRoleResponse' + description: OK + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Unauthenticated. + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Not Found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Internal Server Error. Reach out to support. + default: + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: An unexpected error response. + summary: Get Role + tags: + - Security + put: + description: Update a role. + operationId: SecurityService_UpdateRoleMembership + parameters: + - description: The role name. + in: path + name: role_name + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRoleMembershipBody' + required: true + x-originalParamName: body + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateRoleMembershipResponse' + description: OK + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Unauthenticated. + "404": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Not Found + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Internal Server Error. Reach out to support. + default: + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: An unexpected error response. + summary: Update Role + tags: + - Security + /v1/roles/{role_name}/members: + get: + description: List members assigned to a role. + operationId: SecurityService_ListRoleMembers + parameters: + - description: The role name. + in: path + name: role_name + required: true + schema: + type: string + - description: Filter results to only members with names which contain the string. + in: query + name: filter.name_contains + schema: + type: string + - description: Page size. + in: query + name: page_size + schema: + format: int32 + type: integer + - description: |- + Value of the next_page_token field returned by the previous response. + If not provided, the system assumes the first page is requested. + in: query + name: page_token + schema: + type: string + responses: + "200": + content: + application/json: + schema: + $ref: '#/components/schemas/ListRoleMembersResponse' + description: OK + "401": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Unauthenticated. + "500": + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: Internal Server Error. Reach out to support. + default: + content: + application/json: + schema: + $ref: '#/components/schemas/rpc.Status' + description: An unexpected error response. + summary: List Role Members + tags: + - Security /v1/secret-scopes: get: description: List supported secret scopes. @@ -4989,6 +5407,8 @@ tags: name: Redpanda Connect Pipeline - description: Manage [secrets](https://docs.redpanda.com/redpanda-cloud/security/secrets) for Redpanda Cloud. name: Secrets + - description: Manage Redpanda roles. + name: Security - description: Manage Redpanda topics. name: Topics - description: Manage Redpanda users. To manage access, see the Data Plane [ACL endpoints](https://docs.redpanda.com/api/cloud-dataplane-api/#get-/v1/acls). diff --git a/proto/redpanda/api/dataplane/v1/security.proto b/proto/redpanda/api/dataplane/v1/security.proto new file mode 100644 index 0000000000..4df435a79c --- /dev/null +++ b/proto/redpanda/api/dataplane/v1/security.proto @@ -0,0 +1,370 @@ +syntax = "proto3"; + +package redpanda.api.dataplane.v1; + +import "buf/validate/validate.proto"; +import "google/api/annotations.proto"; +import "protoc-gen-openapiv2/options/annotations.proto"; +import "redpanda/api/auth/v1/authorization.proto"; + +// Role defines a role in the system. +message Role { + // The name of the role. + string name = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.min_len = 1, + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^[^,=]+$" + ]; +} + +// ListRolesRequest is the request for ListRoles. +message ListRolesRequest { + // Filter options. + message Filter { + // Filter results only roles named with the prefix. + string name_prefix = 1 [ + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^([^,=]*)$" + ]; + + // Filter results to only roles with names which contain the string. + string name_contains = 2 [ + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^([^,=]*)$" + ]; + + // Return only roles assigned to this principal. + string principal = 3 [(buf.validate.field).string.max_len = 128]; + } + + // Optional filter. + optional Filter filter = 1; + + // Page size. + int32 page_size = 2 [(buf.validate.field).int32 = { + gte: -1 + lte: 1000 + }]; + + // Value of the next_page_token field returned by the previous response. + // If not provided, the system assumes the first page is requested. + string page_token = 3; +} + +// ListRolesResponse is the response for ListRoles. +message ListRolesResponse { + // The roles in the system. + repeated Role roles = 1; + + // Token to retrieve the next page. + string next_page_token = 2; +} + +// CreateRoleRequest is the request for CreateRole. +message CreateRoleRequest { + // The role to create. + Role role = 1; +} + +// CreateRoleResponse is the response for CreateRole. +message CreateRoleResponse { + // The role. + Role role = 1; +} + +// CreateRoleRequest is the request for CreateRole. +message GetRoleRequest { + // The role name. + string role_name = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.min_len = 1, + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^[^,=]+$" + ]; +} + +// GetRoleResponse is the response to GetRole. +message GetRoleResponse { + // The Role. + Role role = 1; + + // Members assigned to the role. + repeated RoleMembership members = 2; +} + +// DeleteRoleRequest is the request for DeleteRole. +message DeleteRoleRequest { + // The role name. + string role_name = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.min_len = 1, + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^[^,=]+$" + ]; + + // Whether to delete the ACLs bound to the role. + bool delete_acls = 2; +} + +// DeleteRoleResponse is the response for DeleteRole. +message DeleteRoleResponse {} + +// List role members for a role. That is user principals assigned to that role. +message ListRoleMembersRequest { + // Filter options. + message Filter { + // Filter results to only members with names which contain the string. + string name_contains = 1 [(buf.validate.field).string.max_len = 128]; + } + + // The role name. + string role_name = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.min_len = 1, + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^[^,=]+$" + ]; + + // Optional filter. + optional Filter filter = 2; + + // Page size. + int32 page_size = 3 [(buf.validate.field).int32 = { + gte: -1 + lte: 1000 + }]; + + // Value of the next_page_token field returned by the previous response. + // If not provided, the system assumes the first page is requested. + string page_token = 4; +} + +// ListRoleMembersResponse is the response for ListRoleMembers. +message ListRoleMembersResponse { + // The role name. + string role_name = 1; + + // Members assigned to the role. + repeated RoleMembership members = 2; + + // Token to retrieve the next page. + string next_page_token = 3; +} + +// RoleMembership is the role membership. +message RoleMembership { + // The name of the principal assigned to the role. + string principal = 1; +} + +// UpdateRoleMembershipRequest is the request to UpdateRoleMembership. +message UpdateRoleMembershipRequest { + // The role name. + string role_name = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.min_len = 1, + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^[^,=]+$" + ]; + + // Create the role if it doesn't already exist. + // If the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored. + bool create = 2; + + // Members to assign to the role. + repeated RoleMembership add = 3; + + // Members to remove from the role. + repeated RoleMembership remove = 4; +} + +// UpdateRoleMembershipResponse is the response for UpdateRoleMembership. +message UpdateRoleMembershipResponse { + // The role name. + string role_name = 1 [ + (buf.validate.field).required = true, + (buf.validate.field).string.min_len = 1, + (buf.validate.field).string.max_len = 128, + (buf.validate.field).string.pattern = "^[^,=]+$" + ]; + + // Members assigned to the role. + repeated RoleMembership added = 2; + + // Members removed from the role. + repeated RoleMembership removed = 3; +} + +service SecurityService { + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_tag) = { + name: "Security" + description: "Manage Redpanda roles." + }; + + // ListRoles lists all the roles based on optional filter. + rpc ListRoles(ListRolesRequest) returns (ListRolesResponse) { + option (google.api.http) = {get: "/v1/roles"}; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "List Roles" + description: "List roles. Optional: filter based on role name and principal." + responses: { + key: "200" + value: { + description: "OK" + schema: { + json_schema: {ref: ".redpanda.api.dataplane.v1.ListRolesResponse"} + } + } + } + }; + option (redpanda.api.auth.v1.authorization) = { + required_permission: PERMISSION_ADMIN + api: API_REDPANDA_ADMIN + }; + } + + rpc CreateRole(CreateRoleRequest) returns (CreateRoleResponse) { + option (google.api.http) = { + post: "/v1/roles" + body: "role" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Create Role" + description: "Create a role." + responses: { + key: "201" + value: { + description: "Role created" + schema: { + json_schema: {ref: ".redpanda.api.dataplane.v1.CreateRoleResponse"} + } + } + } + }; + option (redpanda.api.auth.v1.authorization) = { + required_permission: PERMISSION_ADMIN + api: API_REDPANDA_ADMIN + }; + } + + // GetRole retrieves the specific role. + rpc GetRole(GetRoleRequest) returns (GetRoleResponse) { + option (google.api.http) = {get: "/v1/roles/{role_name}"}; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Get Role" + description: "Get a role." + responses: { + key: "200" + value: { + description: "OK" + schema: { + json_schema: {ref: ".redpanda.api.dataplane.v1.GetRoleResponse"} + } + } + } + responses: { + key: "404" + value: { + description: "Not Found" + schema: { + json_schema: {ref: ".google.rpc.Status"} + } + } + } + }; + option (redpanda.api.auth.v1.authorization) = { + required_permission: PERMISSION_ADMIN + api: API_REDPANDA_ADMIN + }; + } + + // DeleteRole deletes the role from the system. + rpc DeleteRole(DeleteRoleRequest) returns (DeleteRoleResponse) { + option (google.api.http) = {delete: "/v1/roles/{role_name}"}; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Delete Role" + description: "Delete a Role." + responses: { + key: "204" + value: { + description: "Role deleted successfully" + schema: {} + } + } + responses: { + key: "404" + value: { + description: "Not Found" + schema: { + json_schema: {ref: ".google.rpc.Status"} + } + } + } + }; + option (redpanda.api.auth.v1.authorization) = { + required_permission: PERMISSION_ADMIN + api: API_REDPANDA_ADMIN + }; + } + + // ListRoleMembership lists all the members assigned to a role based on optional filter. + rpc ListRoleMembers(ListRoleMembersRequest) returns (ListRoleMembersResponse) { + option (google.api.http) = {get: "/v1/roles/{role_name}/members"}; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "List Role Members" + description: "List members assigned to a role." + responses: { + key: "200" + value: { + description: "OK" + schema: { + json_schema: {ref: ".redpanda.api.dataplane.v1.ListRoleMembersResponse"} + } + } + } + }; + option (redpanda.api.auth.v1.authorization) = { + required_permission: PERMISSION_ADMIN + api: API_REDPANDA_ADMIN + }; + } + + // UpdateRoleMembership updates role membership. + // Partially update role membership, adding or removing from a role + // ONLY those members listed in the “add” or “remove” fields, respectively. + // Adding a member that is already assigned to the role (or removing one that is not) is a no-op, + // and the rest of the members will be added and removed and reported. + rpc UpdateRoleMembership(UpdateRoleMembershipRequest) returns (UpdateRoleMembershipResponse) { + option (google.api.http) = { + put: "/v1/roles/{role_name}" + body: "*" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Update Role" + description: "Update a role." + responses: { + key: "200" + value: { + description: "OK" + schema: { + json_schema: {ref: ".redpanda.api.dataplane.v1.UpdateRoleMembershipResponse"} + } + } + } + responses: { + key: "404" + value: { + description: "Not Found" + schema: { + json_schema: {ref: ".google.rpc.Status"} + } + } + } + }; + option (redpanda.api.auth.v1.authorization) = { + required_permission: PERMISSION_ADMIN + api: API_REDPANDA_ADMIN + }; + } +} From f514da72279cb19767926b2c5d374fba1e861fef Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Wed, 30 Apr 2025 16:26:15 -0300 Subject: [PATCH 02/13] backend: update permissions for viewer roles API --- .../protogen/redpanda/api/console/v1alpha1/security.pb.go | 6 +++--- proto/redpanda/api/console/v1alpha1/security.proto | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go b/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go index 31a230f417..1d5130ea52 100644 --- a/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go +++ b/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go @@ -1056,7 +1056,7 @@ var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x7b, 0x0a, + 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x7b, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, @@ -1071,7 +1071,7 @@ var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x7b, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x7b, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, @@ -1088,7 +1088,7 @@ var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, - 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x99, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, + 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x99, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, diff --git a/proto/redpanda/api/console/v1alpha1/security.proto b/proto/redpanda/api/console/v1alpha1/security.proto index d708a4f5ae..b565648ae3 100644 --- a/proto/redpanda/api/console/v1alpha1/security.proto +++ b/proto/redpanda/api/console/v1alpha1/security.proto @@ -198,7 +198,7 @@ service SecurityService { // ListRoles lists all the roles based on optional filter. rpc ListRoles(ListRolesRequest) returns (ListRolesResponse) { option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_ADMIN + required_permission: PERMISSION_VIEW api: API_REDPANDA_ADMIN }; } @@ -213,7 +213,7 @@ service SecurityService { // GetRole retrieves the specific role. rpc GetRole(GetRoleRequest) returns (GetRoleResponse) { option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_ADMIN + required_permission: PERMISSION_VIEW api: API_REDPANDA_ADMIN }; } @@ -229,7 +229,7 @@ service SecurityService { // ListRoleMembership lists all the members assigned to a role based on optional filter. rpc ListRoleMembers(ListRoleMembersRequest) returns (ListRoleMembersResponse) { option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_ADMIN + required_permission: PERMISSION_VIEW api: API_REDPANDA_ADMIN }; } From c1ce050b79b2d64719a27fe5473af563036c77de Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Wed, 30 Apr 2025 16:44:12 -0300 Subject: [PATCH 03/13] backend: update permissions for viewer roles API --- .../pkg/protogen/redpanda/api/dataplane/v1/security.pb.go | 6 +++--- proto/redpanda/api/dataplane/v1/security.proto | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go index 3214f235f3..6c44b43360 100644 --- a/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go @@ -1068,7 +1068,7 @@ var file_redpanda_api_dataplane_v1_security_proto_rawDesc = []byte{ 0x4f, 0x4b, 0x12, 0x30, 0x0a, 0x2e, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, + 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0xf5, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, @@ -1100,7 +1100,7 @@ var file_redpanda_api_dataplane_v1_security_proto_rawDesc = []byte{ 0x6e, 0x73, 0x65, 0x4a, 0x2a, 0x0a, 0x03, 0x34, 0x30, 0x34, 0x12, 0x23, 0x0a, 0x09, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x8a, - 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, + 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x83, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, @@ -1134,7 +1134,7 @@ var file_redpanda_api_dataplane_v1_security_proto_rawDesc = []byte{ 0x34, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xc9, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, diff --git a/proto/redpanda/api/dataplane/v1/security.proto b/proto/redpanda/api/dataplane/v1/security.proto index 4df435a79c..4cbada39d0 100644 --- a/proto/redpanda/api/dataplane/v1/security.proto +++ b/proto/redpanda/api/dataplane/v1/security.proto @@ -219,7 +219,7 @@ service SecurityService { } }; option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_ADMIN + required_permission: PERMISSION_VIEW api: API_REDPANDA_ADMIN }; } @@ -274,7 +274,7 @@ service SecurityService { } }; option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_ADMIN + required_permission: PERMISSION_VIEW api: API_REDPANDA_ADMIN }; } @@ -325,7 +325,7 @@ service SecurityService { } }; option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_ADMIN + required_permission: PERMISSION_VIEW api: API_REDPANDA_ADMIN }; } From d7215ae27c2089a0910f650f3056857fd0dd0f4e Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Wed, 30 Apr 2025 22:37:39 -0300 Subject: [PATCH 04/13] backend: register cloud storage service and security service into gateway mux --- backend/pkg/api/routes.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/backend/pkg/api/routes.go b/backend/pkg/api/routes.go index bde5b0ffed..db7dc02fcb 100644 --- a/backend/pkg/api/routes.go +++ b/backend/pkg/api/routes.go @@ -282,11 +282,13 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { kafkaConnectSvcPathV1, kafkaConnectSvcHandlerV1 := dataplanev1connect.NewKafkaConnectServiceHandler( hookOutput.Services[dataplanev1connect.KafkaConnectServiceName].(dataplanev1connect.KafkaConnectServiceHandler), connect.WithInterceptors(hookOutput.Interceptors...)) + cloudStorageSvc := hookOutput.Services[dataplanev1connect.CloudStorageServiceName].(dataplanev1connect.CloudStorageServiceHandler) cloudStorageSvcPathV1, cloudStorageSvcHandlerV1 := dataplanev1connect.NewCloudStorageServiceHandler( - hookOutput.Services[dataplanev1connect.CloudStorageServiceName].(dataplanev1connect.CloudStorageServiceHandler), + cloudStorageSvc, connect.WithInterceptors(hookOutput.Interceptors...)) + securitySvc := hookOutput.Services[dataplanev1connect.SecurityServiceName].(dataplanev1connect.SecurityServiceHandler) securitySvcPathV1, securitySvcHandlerV1 := dataplanev1connect.NewSecurityServiceHandler( - hookOutput.Services[dataplanev1connect.SecurityServiceName].(dataplanev1connect.SecurityServiceHandler), + securitySvc, connect.WithInterceptors(hookOutput.Interceptors...)) ossServices := []ConnectService{ @@ -451,6 +453,8 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { dataplanev1connect.RegisterUserServiceHandlerGatewayServer(gwMux, userSvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) dataplanev1connect.RegisterTransformServiceHandlerGatewayServer(gwMux, transformSvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) dataplanev1connect.RegisterKafkaConnectServiceHandlerGatewayServer(gwMux, kafkaConnectSvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) + dataplanev1connect.RegisterCloudStorageServiceHandlerGatewayServer(gwMux, cloudStorageSvc, connectgateway.WithInterceptors(hookOutput.Interceptors...)) + dataplanev1connect.RegisterSecurityServiceHandlerGatewayServer(gwMux, securitySvc, connectgateway.WithInterceptors(hookOutput.Interceptors...)) // mount From d7ecabcb1c0c9071565121f41f8a4cc1004b2a04 Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Wed, 30 Apr 2025 22:47:02 -0300 Subject: [PATCH 05/13] backend: register cloud storage service and security service into gateway mux --- backend/pkg/api/routes.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/backend/pkg/api/routes.go b/backend/pkg/api/routes.go index db7dc02fcb..b8069b9cba 100644 --- a/backend/pkg/api/routes.go +++ b/backend/pkg/api/routes.go @@ -261,8 +261,9 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { kafkaConnectSvcPathV1Alpha2, kafkaConnectSvcHandlerV1Alpha2 := dataplanev1alpha2connect.NewKafkaConnectServiceHandler( hookOutput.Services[dataplanev1alpha2connect.KafkaConnectServiceName].(dataplanev1alpha2connect.KafkaConnectServiceHandler), connect.WithInterceptors(hookOutput.Interceptors...)) + cloudStorageSvcV1Alpha2 := hookOutput.Services[dataplanev1alpha2connect.CloudStorageServiceName].(dataplanev1alpha2connect.CloudStorageServiceHandler) cloudStorageSvcPathV1Alpha2, cloudStorageSvcHandlerV1Alpha2 := dataplanev1alpha2connect.NewCloudStorageServiceHandler( - hookOutput.Services[dataplanev1alpha2connect.CloudStorageServiceName].(dataplanev1alpha2connect.CloudStorageServiceHandler), + cloudStorageSvcV1Alpha2, connect.WithInterceptors(hookOutput.Interceptors...)) // v1 @@ -282,13 +283,13 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { kafkaConnectSvcPathV1, kafkaConnectSvcHandlerV1 := dataplanev1connect.NewKafkaConnectServiceHandler( hookOutput.Services[dataplanev1connect.KafkaConnectServiceName].(dataplanev1connect.KafkaConnectServiceHandler), connect.WithInterceptors(hookOutput.Interceptors...)) - cloudStorageSvc := hookOutput.Services[dataplanev1connect.CloudStorageServiceName].(dataplanev1connect.CloudStorageServiceHandler) + cloudStorageSvcV1 := hookOutput.Services[dataplanev1connect.CloudStorageServiceName].(dataplanev1connect.CloudStorageServiceHandler) cloudStorageSvcPathV1, cloudStorageSvcHandlerV1 := dataplanev1connect.NewCloudStorageServiceHandler( - cloudStorageSvc, + cloudStorageSvcV1, connect.WithInterceptors(hookOutput.Interceptors...)) - securitySvc := hookOutput.Services[dataplanev1connect.SecurityServiceName].(dataplanev1connect.SecurityServiceHandler) + securitySvcV1 := hookOutput.Services[dataplanev1connect.SecurityServiceName].(dataplanev1connect.SecurityServiceHandler) securitySvcPathV1, securitySvcHandlerV1 := dataplanev1connect.NewSecurityServiceHandler( - securitySvc, + securitySvcV1, connect.WithInterceptors(hookOutput.Interceptors...)) ossServices := []ConnectService{ @@ -445,6 +446,7 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { dataplanev1alpha2connect.RegisterUserServiceHandlerGatewayServer(gwMux, userSvcV1alpha2, connectgateway.WithInterceptors(hookOutput.Interceptors...)) dataplanev1alpha2connect.RegisterTransformServiceHandlerGatewayServer(gwMux, transformSvcV1alpha2, connectgateway.WithInterceptors(hookOutput.Interceptors...)) dataplanev1alpha2connect.RegisterKafkaConnectServiceHandlerGatewayServer(gwMux, kafkaConnectSvcV1alpha2, connectgateway.WithInterceptors(hookOutput.Interceptors...)) + dataplanev1alpha2connect.RegisterCloudStorageServiceHandlerGatewayServer(gwMux, cloudStorageSvcV1Alpha2, connectgateway.WithInterceptors(hookOutput.Interceptors...)) // v1 @@ -453,8 +455,8 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { dataplanev1connect.RegisterUserServiceHandlerGatewayServer(gwMux, userSvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) dataplanev1connect.RegisterTransformServiceHandlerGatewayServer(gwMux, transformSvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) dataplanev1connect.RegisterKafkaConnectServiceHandlerGatewayServer(gwMux, kafkaConnectSvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) - dataplanev1connect.RegisterCloudStorageServiceHandlerGatewayServer(gwMux, cloudStorageSvc, connectgateway.WithInterceptors(hookOutput.Interceptors...)) - dataplanev1connect.RegisterSecurityServiceHandlerGatewayServer(gwMux, securitySvc, connectgateway.WithInterceptors(hookOutput.Interceptors...)) + dataplanev1connect.RegisterCloudStorageServiceHandlerGatewayServer(gwMux, cloudStorageSvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) + dataplanev1connect.RegisterSecurityServiceHandlerGatewayServer(gwMux, securitySvcV1, connectgateway.WithInterceptors(hookOutput.Interceptors...)) // mount From b65b709d1a264670ab800f7f5e6c52604c14bd6f Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Thu, 1 May 2025 11:12:44 -0300 Subject: [PATCH 06/13] frontend, proto: make console security service embed the dataplane security service --- .../api/console/v1alpha1/security.pb.go | 963 ++++++------------ .../api/console/v1alpha1/security_pb.ts | 400 +------- frontend/src/state/backendApi.ts | 38 +- .../api/console/v1alpha1/security.proto | 161 +-- 4 files changed, 364 insertions(+), 1198 deletions(-) diff --git a/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go b/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go index 1d5130ea52..8dd016842a 100644 --- a/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go +++ b/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go @@ -10,11 +10,11 @@ import ( reflect "reflect" sync "sync" - _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" _ "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/auth/v1" + v1 "github.com/redpanda-data/console/backend/pkg/protogen/redpanda/api/dataplane/v1" ) const ( @@ -24,69 +24,17 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// Role defines a role in the system. -type Role struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The name of the role. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Role) Reset() { - *x = Role{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Role) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Role) ProtoMessage() {} - -func (x *Role) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Role.ProtoReflect.Descriptor instead. -func (*Role) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{0} -} - -func (x *Role) GetName() string { - if x != nil { - return x.Name - } - return "" -} - // ListRolesRequest is the request for ListRoles. type ListRolesRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Optional filter. - Filter *ListRolesRequest_Filter `protobuf:"bytes,1,opt,name=filter,proto3,oneof" json:"filter,omitempty"` - // Page size. - PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // Value of the next_page_token field returned by the previous response. - // If not provided, the system assumes the first page is requested. - PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Request *v1.ListRolesRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ListRolesRequest) Reset() { *x = ListRolesRequest{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[1] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -98,7 +46,7 @@ func (x *ListRolesRequest) String() string { func (*ListRolesRequest) ProtoMessage() {} func (x *ListRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[1] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[0] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -111,44 +59,27 @@ func (x *ListRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRolesRequest.ProtoReflect.Descriptor instead. func (*ListRolesRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{1} + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{0} } -func (x *ListRolesRequest) GetFilter() *ListRolesRequest_Filter { +func (x *ListRolesRequest) GetRequest() *v1.ListRolesRequest { if x != nil { - return x.Filter + return x.Request } return nil } -func (x *ListRolesRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListRolesRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - // ListRolesResponse is the response for ListRoles. type ListRolesResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The roles in the system. - Roles []*Role `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - // Token to retrieve the next page. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Response *v1.ListRolesResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ListRolesResponse) Reset() { *x = ListRolesResponse{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[2] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -160,7 +91,7 @@ func (x *ListRolesResponse) String() string { func (*ListRolesResponse) ProtoMessage() {} func (x *ListRolesResponse) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[2] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[1] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -173,35 +104,27 @@ func (x *ListRolesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRolesResponse.ProtoReflect.Descriptor instead. func (*ListRolesResponse) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{2} + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{1} } -func (x *ListRolesResponse) GetRoles() []*Role { +func (x *ListRolesResponse) GetResponse() *v1.ListRolesResponse { if x != nil { - return x.Roles + return x.Response } return nil } -func (x *ListRolesResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - // CreateRoleRequest is the request for CreateRole. type CreateRoleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role to create. - Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Request *v1.CreateRoleRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *CreateRoleRequest) Reset() { *x = CreateRoleRequest{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[3] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -213,7 +136,7 @@ func (x *CreateRoleRequest) String() string { func (*CreateRoleRequest) ProtoMessage() {} func (x *CreateRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[3] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -226,28 +149,27 @@ func (x *CreateRoleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateRoleRequest.ProtoReflect.Descriptor instead. func (*CreateRoleRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{3} + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{2} } -func (x *CreateRoleRequest) GetRole() *Role { +func (x *CreateRoleRequest) GetRequest() *v1.CreateRoleRequest { if x != nil { - return x.Role + return x.Request } return nil } // CreateRoleResponse is the response for CreateRole. type CreateRoleResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role. - Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Response *v1.CreateRoleResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *CreateRoleResponse) Reset() { *x = CreateRoleResponse{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[4] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -259,7 +181,7 @@ func (x *CreateRoleResponse) String() string { func (*CreateRoleResponse) ProtoMessage() {} func (x *CreateRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[4] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -272,28 +194,27 @@ func (x *CreateRoleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateRoleResponse.ProtoReflect.Descriptor instead. func (*CreateRoleResponse) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{4} + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{3} } -func (x *CreateRoleResponse) GetRole() *Role { +func (x *CreateRoleResponse) GetResponse() *v1.CreateRoleResponse { if x != nil { - return x.Role + return x.Response } return nil } -// CreateRoleRequest is the request for CreateRole. +// GetRoleRequest is the request for GetRole. type GetRoleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role name. - RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Request *v1.GetRoleRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GetRoleRequest) Reset() { *x = GetRoleRequest{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[5] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -305,7 +226,7 @@ func (x *GetRoleRequest) String() string { func (*GetRoleRequest) ProtoMessage() {} func (x *GetRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[5] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -318,30 +239,27 @@ func (x *GetRoleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoleRequest.ProtoReflect.Descriptor instead. func (*GetRoleRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{5} + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{4} } -func (x *GetRoleRequest) GetRoleName() string { +func (x *GetRoleRequest) GetRequest() *v1.GetRoleRequest { if x != nil { - return x.RoleName + return x.Request } - return "" + return nil } // GetRoleResponse is the response to GetRole. type GetRoleResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The Role. - Role *Role `protobuf:"bytes,1,opt,name=role,proto3" json:"role,omitempty"` - // Members assigned to the role. - Members []*RoleMembership `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Response *v1.GetRoleResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *GetRoleResponse) Reset() { *x = GetRoleResponse{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[6] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -353,7 +271,7 @@ func (x *GetRoleResponse) String() string { func (*GetRoleResponse) ProtoMessage() {} func (x *GetRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[6] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -366,37 +284,27 @@ func (x *GetRoleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoleResponse.ProtoReflect.Descriptor instead. func (*GetRoleResponse) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{6} -} - -func (x *GetRoleResponse) GetRole() *Role { - if x != nil { - return x.Role - } - return nil + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{5} } -func (x *GetRoleResponse) GetMembers() []*RoleMembership { +func (x *GetRoleResponse) GetResponse() *v1.GetRoleResponse { if x != nil { - return x.Members + return x.Response } return nil } // DeleteRoleRequest is the request for DeleteRole. type DeleteRoleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role name. - RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` - // Whether to delete the ACLs bound to the role. - DeleteAcls bool `protobuf:"varint,2,opt,name=delete_acls,json=deleteAcls,proto3" json:"delete_acls,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Request *v1.DeleteRoleRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *DeleteRoleRequest) Reset() { *x = DeleteRoleRequest{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[7] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -408,7 +316,7 @@ func (x *DeleteRoleRequest) String() string { func (*DeleteRoleRequest) ProtoMessage() {} func (x *DeleteRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[7] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -421,33 +329,27 @@ func (x *DeleteRoleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRoleRequest.ProtoReflect.Descriptor instead. func (*DeleteRoleRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{7} -} - -func (x *DeleteRoleRequest) GetRoleName() string { - if x != nil { - return x.RoleName - } - return "" + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{6} } -func (x *DeleteRoleRequest) GetDeleteAcls() bool { +func (x *DeleteRoleRequest) GetRequest() *v1.DeleteRoleRequest { if x != nil { - return x.DeleteAcls + return x.Request } - return false + return nil } // DeleteRoleResponse is the response for DeleteRole. type DeleteRoleResponse struct { state protoimpl.MessageState `protogen:"open.v1"` + Response *v1.DeleteRoleResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *DeleteRoleResponse) Reset() { *x = DeleteRoleResponse{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[8] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -459,7 +361,7 @@ func (x *DeleteRoleResponse) String() string { func (*DeleteRoleResponse) ProtoMessage() {} func (x *DeleteRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[8] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -472,28 +374,27 @@ func (x *DeleteRoleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteRoleResponse.ProtoReflect.Descriptor instead. func (*DeleteRoleResponse) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{8} + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{7} +} + +func (x *DeleteRoleResponse) GetResponse() *v1.DeleteRoleResponse { + if x != nil { + return x.Response + } + return nil } // List role members for a role. That is user principals assigned to that role. type ListRoleMembersRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role name. - RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` - // Optional filter. - Filter *ListRoleMembersRequest_Filter `protobuf:"bytes,2,opt,name=filter,proto3,oneof" json:"filter,omitempty"` - // Page size. - PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` - // Value of the next_page_token field returned by the previous response. - // If not provided, the system assumes the first page is requested. - PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Request *v1.ListRoleMembersRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ListRoleMembersRequest) Reset() { *x = ListRoleMembersRequest{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[9] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -505,7 +406,7 @@ func (x *ListRoleMembersRequest) String() string { func (*ListRoleMembersRequest) ProtoMessage() {} func (x *ListRoleMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[9] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -518,53 +419,27 @@ func (x *ListRoleMembersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRoleMembersRequest.ProtoReflect.Descriptor instead. func (*ListRoleMembersRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{9} -} - -func (x *ListRoleMembersRequest) GetRoleName() string { - if x != nil { - return x.RoleName - } - return "" + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{8} } -func (x *ListRoleMembersRequest) GetFilter() *ListRoleMembersRequest_Filter { +func (x *ListRoleMembersRequest) GetRequest() *v1.ListRoleMembersRequest { if x != nil { - return x.Filter + return x.Request } return nil } -func (x *ListRoleMembersRequest) GetPageSize() int32 { - if x != nil { - return x.PageSize - } - return 0 -} - -func (x *ListRoleMembersRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - // ListRoleMembersResponse is the response for ListRoleMembers. type ListRoleMembersResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role name. - RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` - // Members assigned to the role. - Members []*RoleMembership `protobuf:"bytes,2,rep,name=members,proto3" json:"members,omitempty"` - // Token to retrieve the next page. - NextPageToken string `protobuf:"bytes,3,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Response *v1.ListRoleMembersResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ListRoleMembersResponse) Reset() { *x = ListRoleMembersResponse{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[10] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -576,7 +451,7 @@ func (x *ListRoleMembersResponse) String() string { func (*ListRoleMembersResponse) ProtoMessage() {} func (x *ListRoleMembersResponse) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[10] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -589,95 +464,27 @@ func (x *ListRoleMembersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRoleMembersResponse.ProtoReflect.Descriptor instead. func (*ListRoleMembersResponse) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{10} -} - -func (x *ListRoleMembersResponse) GetRoleName() string { - if x != nil { - return x.RoleName - } - return "" + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{9} } -func (x *ListRoleMembersResponse) GetMembers() []*RoleMembership { +func (x *ListRoleMembersResponse) GetResponse() *v1.ListRoleMembersResponse { if x != nil { - return x.Members + return x.Response } return nil } -func (x *ListRoleMembersResponse) GetNextPageToken() string { - if x != nil { - return x.NextPageToken - } - return "" -} - -// RoleMembership is the role membership. -type RoleMembership struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The name of the principal assigned to the role. - Principal string `protobuf:"bytes,1,opt,name=principal,proto3" json:"principal,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *RoleMembership) Reset() { - *x = RoleMembership{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *RoleMembership) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RoleMembership) ProtoMessage() {} - -func (x *RoleMembership) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[11] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RoleMembership.ProtoReflect.Descriptor instead. -func (*RoleMembership) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{11} -} - -func (x *RoleMembership) GetPrincipal() string { - if x != nil { - return x.Principal - } - return "" -} - // UpdateRoleMembershipRequest is the request to UpdateRoleMembership. type UpdateRoleMembershipRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role name. - RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` - // Create the role if it doesn't already exist. - // If the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored. - Create bool `protobuf:"varint,2,opt,name=create,proto3" json:"create,omitempty"` - // Members to assign to the role. - Add []*RoleMembership `protobuf:"bytes,3,rep,name=add,proto3" json:"add,omitempty"` - // Members to remove from the role. - Remove []*RoleMembership `protobuf:"bytes,4,rep,name=remove,proto3" json:"remove,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Request *v1.UpdateRoleMembershipRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *UpdateRoleMembershipRequest) Reset() { *x = UpdateRoleMembershipRequest{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[12] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -689,7 +496,7 @@ func (x *UpdateRoleMembershipRequest) String() string { func (*UpdateRoleMembershipRequest) ProtoMessage() {} func (x *UpdateRoleMembershipRequest) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[12] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -702,53 +509,27 @@ func (x *UpdateRoleMembershipRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRoleMembershipRequest.ProtoReflect.Descriptor instead. func (*UpdateRoleMembershipRequest) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{12} -} - -func (x *UpdateRoleMembershipRequest) GetRoleName() string { - if x != nil { - return x.RoleName - } - return "" -} - -func (x *UpdateRoleMembershipRequest) GetCreate() bool { - if x != nil { - return x.Create - } - return false -} - -func (x *UpdateRoleMembershipRequest) GetAdd() []*RoleMembership { - if x != nil { - return x.Add - } - return nil + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{10} } -func (x *UpdateRoleMembershipRequest) GetRemove() []*RoleMembership { +func (x *UpdateRoleMembershipRequest) GetRequest() *v1.UpdateRoleMembershipRequest { if x != nil { - return x.Remove + return x.Request } return nil } // UpdateRoleMembershipResponse is the response for UpdateRoleMembership. type UpdateRoleMembershipResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - // The role name. - RoleName string `protobuf:"bytes,1,opt,name=role_name,json=roleName,proto3" json:"role_name,omitempty"` - // Members assigned to the role. - Added []*RoleMembership `protobuf:"bytes,2,rep,name=added,proto3" json:"added,omitempty"` - // Members removed from the role. - Removed []*RoleMembership `protobuf:"bytes,3,rep,name=removed,proto3" json:"removed,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Response *v1.UpdateRoleMembershipResponse `protobuf:"bytes,1,opt,name=response,proto3" json:"response,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *UpdateRoleMembershipResponse) Reset() { *x = UpdateRoleMembershipResponse{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[13] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -760,7 +541,7 @@ func (x *UpdateRoleMembershipResponse) String() string { func (*UpdateRoleMembershipResponse) ProtoMessage() {} func (x *UpdateRoleMembershipResponse) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[13] + mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -773,140 +554,16 @@ func (x *UpdateRoleMembershipResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRoleMembershipResponse.ProtoReflect.Descriptor instead. func (*UpdateRoleMembershipResponse) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{13} -} - -func (x *UpdateRoleMembershipResponse) GetRoleName() string { - if x != nil { - return x.RoleName - } - return "" -} - -func (x *UpdateRoleMembershipResponse) GetAdded() []*RoleMembership { - if x != nil { - return x.Added - } - return nil + return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{11} } -func (x *UpdateRoleMembershipResponse) GetRemoved() []*RoleMembership { +func (x *UpdateRoleMembershipResponse) GetResponse() *v1.UpdateRoleMembershipResponse { if x != nil { - return x.Removed + return x.Response } return nil } -// Filter options. -type ListRolesRequest_Filter struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Filter results only roles named with the prefix. - NamePrefix string `protobuf:"bytes,1,opt,name=name_prefix,json=namePrefix,proto3" json:"name_prefix,omitempty"` - // Filter results to only roles with names which contain the string. - NameContains string `protobuf:"bytes,2,opt,name=name_contains,json=nameContains,proto3" json:"name_contains,omitempty"` - // Return only roles assigned to this principal. - Principal string `protobuf:"bytes,3,opt,name=principal,proto3" json:"principal,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ListRolesRequest_Filter) Reset() { - *x = ListRolesRequest_Filter{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListRolesRequest_Filter) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListRolesRequest_Filter) ProtoMessage() {} - -func (x *ListRolesRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[14] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListRolesRequest_Filter.ProtoReflect.Descriptor instead. -func (*ListRolesRequest_Filter) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{1, 0} -} - -func (x *ListRolesRequest_Filter) GetNamePrefix() string { - if x != nil { - return x.NamePrefix - } - return "" -} - -func (x *ListRolesRequest_Filter) GetNameContains() string { - if x != nil { - return x.NameContains - } - return "" -} - -func (x *ListRolesRequest_Filter) GetPrincipal() string { - if x != nil { - return x.Principal - } - return "" -} - -// Filter options. -type ListRoleMembersRequest_Filter struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Filter results to only members with names which contain the string. - NameContains string `protobuf:"bytes,1,opt,name=name_contains,json=nameContains,proto3" json:"name_contains,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *ListRoleMembersRequest_Filter) Reset() { - *x = ListRoleMembersRequest_Filter{} - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *ListRoleMembersRequest_Filter) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ListRoleMembersRequest_Filter) ProtoMessage() {} - -func (x *ListRoleMembersRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_redpanda_api_console_v1alpha1_security_proto_msgTypes[15] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ListRoleMembersRequest_Filter.ProtoReflect.Descriptor instead. -func (*ListRoleMembersRequest_Filter) Descriptor() ([]byte, []int) { - return file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP(), []int{9, 0} -} - -func (x *ListRoleMembersRequest_Filter) GetNameContains() string { - if x != nil { - return x.NameContains - } - return "" -} - var File_redpanda_api_console_v1alpha1_security_proto protoreflect.FileDescriptor var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ @@ -914,210 +571,156 @@ var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x1b, 0x62, - 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x28, 0x72, 0x65, 0x64, 0x70, - 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x31, - 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x33, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2b, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, 0x48, 0x14, 0xc8, - 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, 0x5e, 0x2c, 0x3d, - 0x5d, 0x2b, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe8, 0x02, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, - 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13, 0xba, 0x48, 0x10, 0x1a, 0x0e, 0x18, 0xe8, 0x07, - 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x52, 0x08, 0x70, 0x61, 0x67, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0xa2, 0x01, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, - 0x35, 0x0a, 0x0b, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xba, 0x48, 0x11, 0x72, 0x0f, 0x18, 0x80, 0x01, 0x32, 0x0a, - 0x5e, 0x28, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2a, 0x29, 0x24, 0x52, 0x0a, 0x6e, 0x61, 0x6d, 0x65, - 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x39, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x14, 0xba, - 0x48, 0x11, 0x72, 0x0f, 0x18, 0x80, 0x01, 0x32, 0x0a, 0x5e, 0x28, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, - 0x2a, 0x29, 0x24, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0x18, 0x80, 0x01, 0x52, 0x09, - 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x22, 0x76, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, - 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x4c, 0x0a, 0x11, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x37, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x4d, 0x0a, 0x12, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x37, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x46, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, - 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, - 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, - 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x93, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x47, - 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x07, - 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x22, 0x6a, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, - 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x17, 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, - 0x5e, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x63, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, - 0x63, 0x6c, 0x73, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbe, 0x02, 0x0a, 0x16, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, - 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x59, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x72, 0x65, 0x64, - 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x30, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x42, 0x13, 0xba, 0x48, 0x10, 0x1a, 0x0e, 0x18, - 0xe8, 0x07, 0x28, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x52, 0x08, 0x70, - 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x37, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x12, 0x2d, 0x0a, 0x0d, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0x18, 0x80, - 0x01, 0x52, 0x0c, 0x6e, 0x61, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0xa7, 0x01, 0x0a, 0x17, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2e, 0x0a, 0x0e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, - 0x70, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x22, 0xf3, 0x01, 0x0a, 0x1b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, - 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x03, 0x61, 0x64, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x03, - 0x61, 0x64, 0x64, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, - 0x69, 0x70, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x22, 0xe2, 0x01, 0x0a, 0x1c, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, - 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x09, 0x72, - 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, - 0xba, 0x48, 0x14, 0xc8, 0x01, 0x01, 0x72, 0x0f, 0x10, 0x01, 0x18, 0x80, 0x01, 0x32, 0x08, 0x5e, - 0x5b, 0x5e, 0x2c, 0x3d, 0x5d, 0x2b, 0x24, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x43, 0x0a, 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x1a, 0x28, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x75, 0x74, 0x68, + 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x28, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x59, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x11, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x48, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x46, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, - 0x05, 0x61, 0x64, 0x64, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, - 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, - 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x32, - 0xa2, 0x06, 0x0a, 0x0f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x78, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x7b, 0x0a, - 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, - 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, + 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x59, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x0a, 0x11, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x46, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, + 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0x0a, 0x16, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x4b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x69, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x1b, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x72, 0x65, + 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, + 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, + 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x73, 0x0a, 0x1c, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x08, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, + 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0xa2, 0x06, 0x0a, 0x0f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x78, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x2f, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, + 0x7b, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x72, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x7b, - 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, - 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, - 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x8a, 0x01, 0x0a, 0x0f, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, - 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, + 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x72, 0x0a, 0x07, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, - 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x99, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, - 0x70, 0x12, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, + 0x12, 0x7b, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x31, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x8a, 0x01, + 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x12, 0x35, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, - 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, - 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, - 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, - 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, - 0x08, 0x03, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, - 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0d, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x63, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, - 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x62, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x67, - 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, - 0xa2, 0x02, 0x03, 0x52, 0x41, 0x43, 0xaa, 0x02, 0x1d, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x1d, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5c, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x29, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, - 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5c, 0x56, 0x31, - 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x20, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, - 0x70, 0x69, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x61, - 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x99, 0x01, 0x0a, 0x14, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x68, 0x69, 0x70, 0x12, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x3b, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, + 0x73, 0x68, 0x69, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, + 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x42, 0xae, 0x02, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x72, + 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x42, 0x0d, 0x53, 0x65, + 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x63, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, + 0x62, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x67, 0x65, 0x6e, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0x3b, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x43, 0xaa, 0x02, 0x1d, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xca, 0x02, 0x1d, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5c, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0xe2, 0x02, 0x29, 0x52, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x5c, + 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x20, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, + 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x3a, 0x3a, 0x56, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1132,50 +735,58 @@ func file_redpanda_api_console_v1alpha1_security_proto_rawDescGZIP() []byte { return file_redpanda_api_console_v1alpha1_security_proto_rawDescData } -var file_redpanda_api_console_v1alpha1_security_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_redpanda_api_console_v1alpha1_security_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_redpanda_api_console_v1alpha1_security_proto_goTypes = []any{ - (*Role)(nil), // 0: redpanda.api.console.v1alpha1.Role - (*ListRolesRequest)(nil), // 1: redpanda.api.console.v1alpha1.ListRolesRequest - (*ListRolesResponse)(nil), // 2: redpanda.api.console.v1alpha1.ListRolesResponse - (*CreateRoleRequest)(nil), // 3: redpanda.api.console.v1alpha1.CreateRoleRequest - (*CreateRoleResponse)(nil), // 4: redpanda.api.console.v1alpha1.CreateRoleResponse - (*GetRoleRequest)(nil), // 5: redpanda.api.console.v1alpha1.GetRoleRequest - (*GetRoleResponse)(nil), // 6: redpanda.api.console.v1alpha1.GetRoleResponse - (*DeleteRoleRequest)(nil), // 7: redpanda.api.console.v1alpha1.DeleteRoleRequest - (*DeleteRoleResponse)(nil), // 8: redpanda.api.console.v1alpha1.DeleteRoleResponse - (*ListRoleMembersRequest)(nil), // 9: redpanda.api.console.v1alpha1.ListRoleMembersRequest - (*ListRoleMembersResponse)(nil), // 10: redpanda.api.console.v1alpha1.ListRoleMembersResponse - (*RoleMembership)(nil), // 11: redpanda.api.console.v1alpha1.RoleMembership - (*UpdateRoleMembershipRequest)(nil), // 12: redpanda.api.console.v1alpha1.UpdateRoleMembershipRequest - (*UpdateRoleMembershipResponse)(nil), // 13: redpanda.api.console.v1alpha1.UpdateRoleMembershipResponse - (*ListRolesRequest_Filter)(nil), // 14: redpanda.api.console.v1alpha1.ListRolesRequest.Filter - (*ListRoleMembersRequest_Filter)(nil), // 15: redpanda.api.console.v1alpha1.ListRoleMembersRequest.Filter + (*ListRolesRequest)(nil), // 0: redpanda.api.console.v1alpha1.ListRolesRequest + (*ListRolesResponse)(nil), // 1: redpanda.api.console.v1alpha1.ListRolesResponse + (*CreateRoleRequest)(nil), // 2: redpanda.api.console.v1alpha1.CreateRoleRequest + (*CreateRoleResponse)(nil), // 3: redpanda.api.console.v1alpha1.CreateRoleResponse + (*GetRoleRequest)(nil), // 4: redpanda.api.console.v1alpha1.GetRoleRequest + (*GetRoleResponse)(nil), // 5: redpanda.api.console.v1alpha1.GetRoleResponse + (*DeleteRoleRequest)(nil), // 6: redpanda.api.console.v1alpha1.DeleteRoleRequest + (*DeleteRoleResponse)(nil), // 7: redpanda.api.console.v1alpha1.DeleteRoleResponse + (*ListRoleMembersRequest)(nil), // 8: redpanda.api.console.v1alpha1.ListRoleMembersRequest + (*ListRoleMembersResponse)(nil), // 9: redpanda.api.console.v1alpha1.ListRoleMembersResponse + (*UpdateRoleMembershipRequest)(nil), // 10: redpanda.api.console.v1alpha1.UpdateRoleMembershipRequest + (*UpdateRoleMembershipResponse)(nil), // 11: redpanda.api.console.v1alpha1.UpdateRoleMembershipResponse + (*v1.ListRolesRequest)(nil), // 12: redpanda.api.dataplane.v1.ListRolesRequest + (*v1.ListRolesResponse)(nil), // 13: redpanda.api.dataplane.v1.ListRolesResponse + (*v1.CreateRoleRequest)(nil), // 14: redpanda.api.dataplane.v1.CreateRoleRequest + (*v1.CreateRoleResponse)(nil), // 15: redpanda.api.dataplane.v1.CreateRoleResponse + (*v1.GetRoleRequest)(nil), // 16: redpanda.api.dataplane.v1.GetRoleRequest + (*v1.GetRoleResponse)(nil), // 17: redpanda.api.dataplane.v1.GetRoleResponse + (*v1.DeleteRoleRequest)(nil), // 18: redpanda.api.dataplane.v1.DeleteRoleRequest + (*v1.DeleteRoleResponse)(nil), // 19: redpanda.api.dataplane.v1.DeleteRoleResponse + (*v1.ListRoleMembersRequest)(nil), // 20: redpanda.api.dataplane.v1.ListRoleMembersRequest + (*v1.ListRoleMembersResponse)(nil), // 21: redpanda.api.dataplane.v1.ListRoleMembersResponse + (*v1.UpdateRoleMembershipRequest)(nil), // 22: redpanda.api.dataplane.v1.UpdateRoleMembershipRequest + (*v1.UpdateRoleMembershipResponse)(nil), // 23: redpanda.api.dataplane.v1.UpdateRoleMembershipResponse } var file_redpanda_api_console_v1alpha1_security_proto_depIdxs = []int32{ - 14, // 0: redpanda.api.console.v1alpha1.ListRolesRequest.filter:type_name -> redpanda.api.console.v1alpha1.ListRolesRequest.Filter - 0, // 1: redpanda.api.console.v1alpha1.ListRolesResponse.roles:type_name -> redpanda.api.console.v1alpha1.Role - 0, // 2: redpanda.api.console.v1alpha1.CreateRoleRequest.role:type_name -> redpanda.api.console.v1alpha1.Role - 0, // 3: redpanda.api.console.v1alpha1.CreateRoleResponse.role:type_name -> redpanda.api.console.v1alpha1.Role - 0, // 4: redpanda.api.console.v1alpha1.GetRoleResponse.role:type_name -> redpanda.api.console.v1alpha1.Role - 11, // 5: redpanda.api.console.v1alpha1.GetRoleResponse.members:type_name -> redpanda.api.console.v1alpha1.RoleMembership - 15, // 6: redpanda.api.console.v1alpha1.ListRoleMembersRequest.filter:type_name -> redpanda.api.console.v1alpha1.ListRoleMembersRequest.Filter - 11, // 7: redpanda.api.console.v1alpha1.ListRoleMembersResponse.members:type_name -> redpanda.api.console.v1alpha1.RoleMembership - 11, // 8: redpanda.api.console.v1alpha1.UpdateRoleMembershipRequest.add:type_name -> redpanda.api.console.v1alpha1.RoleMembership - 11, // 9: redpanda.api.console.v1alpha1.UpdateRoleMembershipRequest.remove:type_name -> redpanda.api.console.v1alpha1.RoleMembership - 11, // 10: redpanda.api.console.v1alpha1.UpdateRoleMembershipResponse.added:type_name -> redpanda.api.console.v1alpha1.RoleMembership - 11, // 11: redpanda.api.console.v1alpha1.UpdateRoleMembershipResponse.removed:type_name -> redpanda.api.console.v1alpha1.RoleMembership - 1, // 12: redpanda.api.console.v1alpha1.SecurityService.ListRoles:input_type -> redpanda.api.console.v1alpha1.ListRolesRequest - 3, // 13: redpanda.api.console.v1alpha1.SecurityService.CreateRole:input_type -> redpanda.api.console.v1alpha1.CreateRoleRequest - 5, // 14: redpanda.api.console.v1alpha1.SecurityService.GetRole:input_type -> redpanda.api.console.v1alpha1.GetRoleRequest - 7, // 15: redpanda.api.console.v1alpha1.SecurityService.DeleteRole:input_type -> redpanda.api.console.v1alpha1.DeleteRoleRequest - 9, // 16: redpanda.api.console.v1alpha1.SecurityService.ListRoleMembers:input_type -> redpanda.api.console.v1alpha1.ListRoleMembersRequest - 12, // 17: redpanda.api.console.v1alpha1.SecurityService.UpdateRoleMembership:input_type -> redpanda.api.console.v1alpha1.UpdateRoleMembershipRequest - 2, // 18: redpanda.api.console.v1alpha1.SecurityService.ListRoles:output_type -> redpanda.api.console.v1alpha1.ListRolesResponse - 4, // 19: redpanda.api.console.v1alpha1.SecurityService.CreateRole:output_type -> redpanda.api.console.v1alpha1.CreateRoleResponse - 6, // 20: redpanda.api.console.v1alpha1.SecurityService.GetRole:output_type -> redpanda.api.console.v1alpha1.GetRoleResponse - 8, // 21: redpanda.api.console.v1alpha1.SecurityService.DeleteRole:output_type -> redpanda.api.console.v1alpha1.DeleteRoleResponse - 10, // 22: redpanda.api.console.v1alpha1.SecurityService.ListRoleMembers:output_type -> redpanda.api.console.v1alpha1.ListRoleMembersResponse - 13, // 23: redpanda.api.console.v1alpha1.SecurityService.UpdateRoleMembership:output_type -> redpanda.api.console.v1alpha1.UpdateRoleMembershipResponse + 12, // 0: redpanda.api.console.v1alpha1.ListRolesRequest.request:type_name -> redpanda.api.dataplane.v1.ListRolesRequest + 13, // 1: redpanda.api.console.v1alpha1.ListRolesResponse.response:type_name -> redpanda.api.dataplane.v1.ListRolesResponse + 14, // 2: redpanda.api.console.v1alpha1.CreateRoleRequest.request:type_name -> redpanda.api.dataplane.v1.CreateRoleRequest + 15, // 3: redpanda.api.console.v1alpha1.CreateRoleResponse.response:type_name -> redpanda.api.dataplane.v1.CreateRoleResponse + 16, // 4: redpanda.api.console.v1alpha1.GetRoleRequest.request:type_name -> redpanda.api.dataplane.v1.GetRoleRequest + 17, // 5: redpanda.api.console.v1alpha1.GetRoleResponse.response:type_name -> redpanda.api.dataplane.v1.GetRoleResponse + 18, // 6: redpanda.api.console.v1alpha1.DeleteRoleRequest.request:type_name -> redpanda.api.dataplane.v1.DeleteRoleRequest + 19, // 7: redpanda.api.console.v1alpha1.DeleteRoleResponse.response:type_name -> redpanda.api.dataplane.v1.DeleteRoleResponse + 20, // 8: redpanda.api.console.v1alpha1.ListRoleMembersRequest.request:type_name -> redpanda.api.dataplane.v1.ListRoleMembersRequest + 21, // 9: redpanda.api.console.v1alpha1.ListRoleMembersResponse.response:type_name -> redpanda.api.dataplane.v1.ListRoleMembersResponse + 22, // 10: redpanda.api.console.v1alpha1.UpdateRoleMembershipRequest.request:type_name -> redpanda.api.dataplane.v1.UpdateRoleMembershipRequest + 23, // 11: redpanda.api.console.v1alpha1.UpdateRoleMembershipResponse.response:type_name -> redpanda.api.dataplane.v1.UpdateRoleMembershipResponse + 0, // 12: redpanda.api.console.v1alpha1.SecurityService.ListRoles:input_type -> redpanda.api.console.v1alpha1.ListRolesRequest + 2, // 13: redpanda.api.console.v1alpha1.SecurityService.CreateRole:input_type -> redpanda.api.console.v1alpha1.CreateRoleRequest + 4, // 14: redpanda.api.console.v1alpha1.SecurityService.GetRole:input_type -> redpanda.api.console.v1alpha1.GetRoleRequest + 6, // 15: redpanda.api.console.v1alpha1.SecurityService.DeleteRole:input_type -> redpanda.api.console.v1alpha1.DeleteRoleRequest + 8, // 16: redpanda.api.console.v1alpha1.SecurityService.ListRoleMembers:input_type -> redpanda.api.console.v1alpha1.ListRoleMembersRequest + 10, // 17: redpanda.api.console.v1alpha1.SecurityService.UpdateRoleMembership:input_type -> redpanda.api.console.v1alpha1.UpdateRoleMembershipRequest + 1, // 18: redpanda.api.console.v1alpha1.SecurityService.ListRoles:output_type -> redpanda.api.console.v1alpha1.ListRolesResponse + 3, // 19: redpanda.api.console.v1alpha1.SecurityService.CreateRole:output_type -> redpanda.api.console.v1alpha1.CreateRoleResponse + 5, // 20: redpanda.api.console.v1alpha1.SecurityService.GetRole:output_type -> redpanda.api.console.v1alpha1.GetRoleResponse + 7, // 21: redpanda.api.console.v1alpha1.SecurityService.DeleteRole:output_type -> redpanda.api.console.v1alpha1.DeleteRoleResponse + 9, // 22: redpanda.api.console.v1alpha1.SecurityService.ListRoleMembers:output_type -> redpanda.api.console.v1alpha1.ListRoleMembersResponse + 11, // 23: redpanda.api.console.v1alpha1.SecurityService.UpdateRoleMembership:output_type -> redpanda.api.console.v1alpha1.UpdateRoleMembershipResponse 18, // [18:24] is the sub-list for method output_type 12, // [12:18] is the sub-list for method input_type 12, // [12:12] is the sub-list for extension type_name @@ -1188,15 +799,13 @@ func file_redpanda_api_console_v1alpha1_security_proto_init() { if File_redpanda_api_console_v1alpha1_security_proto != nil { return } - file_redpanda_api_console_v1alpha1_security_proto_msgTypes[1].OneofWrappers = []any{} - file_redpanda_api_console_v1alpha1_security_proto_msgTypes[9].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_redpanda_api_console_v1alpha1_security_proto_rawDesc, NumEnums: 0, - NumMessages: 16, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, diff --git a/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts b/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts index fa3043e859..ce590e7b5f 100644 --- a/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts +++ b/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts @@ -5,47 +5,7 @@ import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf"; import { Message, proto3 } from "@bufbuild/protobuf"; - -/** - * Role defines a role in the system. - * - * @generated from message redpanda.api.console.v1alpha1.Role - */ -export class Role extends Message { - /** - * The name of the role. - * - * @generated from field: string name = 1; - */ - name = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.console.v1alpha1.Role"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): Role { - return new Role().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): Role { - return new Role().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): Role { - return new Role().fromJsonString(jsonString, options); - } - - static equals(a: Role | PlainMessage | undefined, b: Role | PlainMessage | undefined): boolean { - return proto3.util.equals(Role, a, b); - } -} +import { CreateRoleRequest as CreateRoleRequest$1, CreateRoleResponse as CreateRoleResponse$1, DeleteRoleRequest as DeleteRoleRequest$1, DeleteRoleResponse as DeleteRoleResponse$1, GetRoleRequest as GetRoleRequest$1, GetRoleResponse as GetRoleResponse$1, ListRoleMembersRequest as ListRoleMembersRequest$1, ListRoleMembersResponse as ListRoleMembersResponse$1, ListRolesRequest as ListRolesRequest$1, ListRolesResponse as ListRolesResponse$1, UpdateRoleMembershipRequest as UpdateRoleMembershipRequest$1, UpdateRoleMembershipResponse as UpdateRoleMembershipResponse$1 } from "../../dataplane/v1/security_pb"; /** * ListRolesRequest is the request for ListRoles. @@ -54,26 +14,9 @@ export class Role extends Message { */ export class ListRolesRequest extends Message { /** - * Optional filter. - * - * @generated from field: optional redpanda.api.console.v1alpha1.ListRolesRequest.Filter filter = 1; - */ - filter?: ListRolesRequest_Filter; - - /** - * Page size. - * - * @generated from field: int32 page_size = 2; - */ - pageSize = 0; - - /** - * Value of the next_page_token field returned by the previous response. - * If not provided, the system assumes the first page is requested. - * - * @generated from field: string page_token = 3; + * @generated from field: redpanda.api.dataplane.v1.ListRolesRequest request = 1; */ - pageToken = ""; + request?: ListRolesRequest$1; constructor(data?: PartialMessage) { super(); @@ -83,9 +26,7 @@ export class ListRolesRequest extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.ListRolesRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "filter", kind: "message", T: ListRolesRequest_Filter, opt: true }, - { no: 2, name: "page_size", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 3, name: "page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 1, name: "request", kind: "message", T: ListRolesRequest$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ListRolesRequest { @@ -105,63 +46,6 @@ export class ListRolesRequest extends Message { } } -/** - * Filter options. - * - * @generated from message redpanda.api.console.v1alpha1.ListRolesRequest.Filter - */ -export class ListRolesRequest_Filter extends Message { - /** - * Filter results only roles named with the prefix. - * - * @generated from field: string name_prefix = 1; - */ - namePrefix = ""; - - /** - * Filter results to only roles with names which contain the string. - * - * @generated from field: string name_contains = 2; - */ - nameContains = ""; - - /** - * Return only roles assigned to this principal. - * - * @generated from field: string principal = 3; - */ - principal = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.console.v1alpha1.ListRolesRequest.Filter"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "name_prefix", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "name_contains", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 3, name: "principal", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ListRolesRequest_Filter { - return new ListRolesRequest_Filter().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ListRolesRequest_Filter { - return new ListRolesRequest_Filter().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ListRolesRequest_Filter { - return new ListRolesRequest_Filter().fromJsonString(jsonString, options); - } - - static equals(a: ListRolesRequest_Filter | PlainMessage | undefined, b: ListRolesRequest_Filter | PlainMessage | undefined): boolean { - return proto3.util.equals(ListRolesRequest_Filter, a, b); - } -} - /** * ListRolesResponse is the response for ListRoles. * @@ -169,18 +53,9 @@ export class ListRolesRequest_Filter extends Message { */ export class ListRolesResponse extends Message { /** - * The roles in the system. - * - * @generated from field: repeated redpanda.api.console.v1alpha1.Role roles = 1; - */ - roles: Role[] = []; - - /** - * Token to retrieve the next page. - * - * @generated from field: string next_page_token = 2; + * @generated from field: redpanda.api.dataplane.v1.ListRolesResponse response = 1; */ - nextPageToken = ""; + response?: ListRolesResponse$1; constructor(data?: PartialMessage) { super(); @@ -190,8 +65,7 @@ export class ListRolesResponse extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.ListRolesResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "roles", kind: "message", T: Role, repeated: true }, - { no: 2, name: "next_page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 1, name: "response", kind: "message", T: ListRolesResponse$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ListRolesResponse { @@ -218,11 +92,9 @@ export class ListRolesResponse extends Message { */ export class CreateRoleRequest extends Message { /** - * The role to create. - * - * @generated from field: redpanda.api.console.v1alpha1.Role role = 1; + * @generated from field: redpanda.api.dataplane.v1.CreateRoleRequest request = 1; */ - role?: Role; + request?: CreateRoleRequest$1; constructor(data?: PartialMessage) { super(); @@ -232,7 +104,7 @@ export class CreateRoleRequest extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.CreateRoleRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "role", kind: "message", T: Role }, + { no: 1, name: "request", kind: "message", T: CreateRoleRequest$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): CreateRoleRequest { @@ -259,11 +131,9 @@ export class CreateRoleRequest extends Message { */ export class CreateRoleResponse extends Message { /** - * The role. - * - * @generated from field: redpanda.api.console.v1alpha1.Role role = 1; + * @generated from field: redpanda.api.dataplane.v1.CreateRoleResponse response = 1; */ - role?: Role; + response?: CreateRoleResponse$1; constructor(data?: PartialMessage) { super(); @@ -273,7 +143,7 @@ export class CreateRoleResponse extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.CreateRoleResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "role", kind: "message", T: Role }, + { no: 1, name: "response", kind: "message", T: CreateRoleResponse$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): CreateRoleResponse { @@ -294,17 +164,15 @@ export class CreateRoleResponse extends Message { } /** - * CreateRoleRequest is the request for CreateRole. + * GetRoleRequest is the request for GetRole. * * @generated from message redpanda.api.console.v1alpha1.GetRoleRequest */ export class GetRoleRequest extends Message { /** - * The role name. - * - * @generated from field: string role_name = 1; + * @generated from field: redpanda.api.dataplane.v1.GetRoleRequest request = 1; */ - roleName = ""; + request?: GetRoleRequest$1; constructor(data?: PartialMessage) { super(); @@ -314,7 +182,7 @@ export class GetRoleRequest extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.GetRoleRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 1, name: "request", kind: "message", T: GetRoleRequest$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): GetRoleRequest { @@ -341,18 +209,9 @@ export class GetRoleRequest extends Message { */ export class GetRoleResponse extends Message { /** - * The Role. - * - * @generated from field: redpanda.api.console.v1alpha1.Role role = 1; - */ - role?: Role; - - /** - * Members assigned to the role. - * - * @generated from field: repeated redpanda.api.console.v1alpha1.RoleMembership members = 2; + * @generated from field: redpanda.api.dataplane.v1.GetRoleResponse response = 1; */ - members: RoleMembership[] = []; + response?: GetRoleResponse$1; constructor(data?: PartialMessage) { super(); @@ -362,8 +221,7 @@ export class GetRoleResponse extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.GetRoleResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "role", kind: "message", T: Role }, - { no: 2, name: "members", kind: "message", T: RoleMembership, repeated: true }, + { no: 1, name: "response", kind: "message", T: GetRoleResponse$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): GetRoleResponse { @@ -390,18 +248,9 @@ export class GetRoleResponse extends Message { */ export class DeleteRoleRequest extends Message { /** - * The role name. - * - * @generated from field: string role_name = 1; + * @generated from field: redpanda.api.dataplane.v1.DeleteRoleRequest request = 1; */ - roleName = ""; - - /** - * Whether to delete the ACLs bound to the role. - * - * @generated from field: bool delete_acls = 2; - */ - deleteAcls = false; + request?: DeleteRoleRequest$1; constructor(data?: PartialMessage) { super(); @@ -411,8 +260,7 @@ export class DeleteRoleRequest extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.DeleteRoleRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "delete_acls", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, + { no: 1, name: "request", kind: "message", T: DeleteRoleRequest$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): DeleteRoleRequest { @@ -438,6 +286,11 @@ export class DeleteRoleRequest extends Message { * @generated from message redpanda.api.console.v1alpha1.DeleteRoleResponse */ export class DeleteRoleResponse extends Message { + /** + * @generated from field: redpanda.api.dataplane.v1.DeleteRoleResponse response = 1; + */ + response?: DeleteRoleResponse$1; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -446,6 +299,7 @@ export class DeleteRoleResponse extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.DeleteRoleResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "response", kind: "message", T: DeleteRoleResponse$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): DeleteRoleResponse { @@ -472,33 +326,9 @@ export class DeleteRoleResponse extends Message { */ export class ListRoleMembersRequest extends Message { /** - * The role name. - * - * @generated from field: string role_name = 1; - */ - roleName = ""; - - /** - * Optional filter. - * - * @generated from field: optional redpanda.api.console.v1alpha1.ListRoleMembersRequest.Filter filter = 2; + * @generated from field: redpanda.api.dataplane.v1.ListRoleMembersRequest request = 1; */ - filter?: ListRoleMembersRequest_Filter; - - /** - * Page size. - * - * @generated from field: int32 page_size = 3; - */ - pageSize = 0; - - /** - * Value of the next_page_token field returned by the previous response. - * If not provided, the system assumes the first page is requested. - * - * @generated from field: string page_token = 4; - */ - pageToken = ""; + request?: ListRoleMembersRequest$1; constructor(data?: PartialMessage) { super(); @@ -508,10 +338,7 @@ export class ListRoleMembersRequest extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.ListRoleMembersRequest"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "filter", kind: "message", T: ListRoleMembersRequest_Filter, opt: true }, - { no: 3, name: "page_size", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, - { no: 4, name: "page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 1, name: "request", kind: "message", T: ListRoleMembersRequest$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ListRoleMembersRequest { @@ -531,47 +358,6 @@ export class ListRoleMembersRequest extends Message { } } -/** - * Filter options. - * - * @generated from message redpanda.api.console.v1alpha1.ListRoleMembersRequest.Filter - */ -export class ListRoleMembersRequest_Filter extends Message { - /** - * Filter results to only members with names which contain the string. - * - * @generated from field: string name_contains = 1; - */ - nameContains = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.console.v1alpha1.ListRoleMembersRequest.Filter"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "name_contains", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): ListRoleMembersRequest_Filter { - return new ListRoleMembersRequest_Filter().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): ListRoleMembersRequest_Filter { - return new ListRoleMembersRequest_Filter().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): ListRoleMembersRequest_Filter { - return new ListRoleMembersRequest_Filter().fromJsonString(jsonString, options); - } - - static equals(a: ListRoleMembersRequest_Filter | PlainMessage | undefined, b: ListRoleMembersRequest_Filter | PlainMessage | undefined): boolean { - return proto3.util.equals(ListRoleMembersRequest_Filter, a, b); - } -} - /** * ListRoleMembersResponse is the response for ListRoleMembers. * @@ -579,25 +365,9 @@ export class ListRoleMembersRequest_Filter extends Message { /** - * The role name. - * - * @generated from field: string role_name = 1; + * @generated from field: redpanda.api.dataplane.v1.ListRoleMembersResponse response = 1; */ - roleName = ""; - - /** - * Members assigned to the role. - * - * @generated from field: repeated redpanda.api.console.v1alpha1.RoleMembership members = 2; - */ - members: RoleMembership[] = []; - - /** - * Token to retrieve the next page. - * - * @generated from field: string next_page_token = 3; - */ - nextPageToken = ""; + response?: ListRoleMembersResponse$1; constructor(data?: PartialMessage) { super(); @@ -607,9 +377,7 @@ export class ListRoleMembersResponse extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "redpanda.api.console.v1alpha1.ListRoleMembersResponse"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "members", kind: "message", T: RoleMembership, repeated: true }, - { no: 3, name: "next_page_token", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 1, name: "response", kind: "message", T: ListRoleMembersResponse$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): ListRoleMembersResponse { @@ -629,47 +397,6 @@ export class ListRoleMembersResponse extends Message { } } -/** - * RoleMembership is the role membership. - * - * @generated from message redpanda.api.console.v1alpha1.RoleMembership - */ -export class RoleMembership extends Message { - /** - * The name of the principal assigned to the role. - * - * @generated from field: string principal = 1; - */ - principal = ""; - - constructor(data?: PartialMessage) { - super(); - proto3.util.initPartial(data, this); - } - - static readonly runtime: typeof proto3 = proto3; - static readonly typeName = "redpanda.api.console.v1alpha1.RoleMembership"; - static readonly fields: FieldList = proto3.util.newFieldList(() => [ - { no: 1, name: "principal", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - ]); - - static fromBinary(bytes: Uint8Array, options?: Partial): RoleMembership { - return new RoleMembership().fromBinary(bytes, options); - } - - static fromJson(jsonValue: JsonValue, options?: Partial): RoleMembership { - return new RoleMembership().fromJson(jsonValue, options); - } - - static fromJsonString(jsonString: string, options?: Partial): RoleMembership { - return new RoleMembership().fromJsonString(jsonString, options); - } - - static equals(a: RoleMembership | PlainMessage | undefined, b: RoleMembership | PlainMessage | undefined): boolean { - return proto3.util.equals(RoleMembership, a, b); - } -} - /** * UpdateRoleMembershipRequest is the request to UpdateRoleMembership. * @@ -677,33 +404,9 @@ export class RoleMembership extends Message { */ export class UpdateRoleMembershipRequest extends Message { /** - * The role name. - * - * @generated from field: string role_name = 1; - */ - roleName = ""; - - /** - * Create the role if it doesn't already exist. - * If the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored. - * - * @generated from field: bool create = 2; - */ - create = false; - - /** - * Members to assign to the role. - * - * @generated from field: repeated redpanda.api.console.v1alpha1.RoleMembership add = 3; + * @generated from field: redpanda.api.dataplane.v1.UpdateRoleMembershipRequest request = 1; */ - add: RoleMembership[] = []; - - /** - * Members to remove from the role. - * - * @generated from field: repeated redpanda.api.console.v1alpha1.RoleMembership remove = 4; - */ - remove: RoleMembership[] = []; + request?: UpdateRoleMembershipRequest$1; constructor(data?: PartialMessage) { super(); @@ -713,10 +416,7 @@ export class UpdateRoleMembershipRequest extends Message [ - { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "create", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, - { no: 3, name: "add", kind: "message", T: RoleMembership, repeated: true }, - { no: 4, name: "remove", kind: "message", T: RoleMembership, repeated: true }, + { no: 1, name: "request", kind: "message", T: UpdateRoleMembershipRequest$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): UpdateRoleMembershipRequest { @@ -743,25 +443,9 @@ export class UpdateRoleMembershipRequest extends Message { /** - * The role name. - * - * @generated from field: string role_name = 1; - */ - roleName = ""; - - /** - * Members assigned to the role. - * - * @generated from field: repeated redpanda.api.console.v1alpha1.RoleMembership added = 2; - */ - added: RoleMembership[] = []; - - /** - * Members removed from the role. - * - * @generated from field: repeated redpanda.api.console.v1alpha1.RoleMembership removed = 3; + * @generated from field: redpanda.api.dataplane.v1.UpdateRoleMembershipResponse response = 1; */ - removed: RoleMembership[] = []; + response?: UpdateRoleMembershipResponse$1; constructor(data?: PartialMessage) { super(); @@ -771,9 +455,7 @@ export class UpdateRoleMembershipResponse extends Message [ - { no: 1, name: "role_name", kind: "scalar", T: 9 /* ScalarType.STRING */ }, - { no: 2, name: "added", kind: "message", T: RoleMembership, repeated: true }, - { no: 3, name: "removed", kind: "message", T: RoleMembership, repeated: true }, + { no: 1, name: "response", kind: "message", T: UpdateRoleMembershipResponse$1 }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): UpdateRoleMembershipResponse { diff --git a/frontend/src/state/backendApi.ts b/frontend/src/state/backendApi.ts index f0e2b02124..98fbde21d0 100644 --- a/frontend/src/state/backendApi.ts +++ b/frontend/src/state/backendApi.ts @@ -2074,21 +2074,23 @@ export const rolesApi = observable({ if (Features.rolesApi) { let nextPageToken = ''; while (true) { - const res = await client.listRoles({ pageSize: 500, pageToken: nextPageToken }).catch((error) => { + const res = await client.listRoles({ request: { pageSize: 500, pageToken: nextPageToken } }).catch((error) => { this.rolesError = error; return null; }); - if (res === null) { + if (res === null || res.response === null) { break; } - const newRoles = res.roles.map((x) => x.name); - roles.push(...newRoles); + if (res.response) { + const newRoles = res.response?.roles.map((x) => x.name); + roles.push(...newRoles); - if (!res.nextPageToken || res.nextPageToken.length === 0) break; + if (!res.response?.nextPageToken || res.response?.nextPageToken.length === 0) break; - nextPageToken = res.nextPageToken; + nextPageToken = res.response?.nextPageToken; + } } } @@ -2103,7 +2105,7 @@ export const rolesApi = observable({ if (Features.rolesApi) { for (const role of this.roles) { - rolePromises.push(client.getRole({ roleName: role })); + rolePromises.push(client.getRole({ request: { roleName: role } })); } } @@ -2113,10 +2115,10 @@ export const rolesApi = observable({ for (const r of rolePromises) { const res = await r; - if (res.role == null) continue; // how could this ever happen, maybe someone deleted the role right before we retreived the members? - const roleName = res.role.name; + if (res.response == null || res.response.role == null) continue; // how could this ever happen, maybe someone deleted the role right before we retreived the members? + const roleName = res.response.role.name; - const members = res.members + const members = res.response.members .map((x) => { const principalParts = x.principal.split(':'); if (principalParts.length !== 2) { @@ -2143,7 +2145,7 @@ export const rolesApi = observable({ if (!client) throw new Error('security client is not initialized'); if (Features.rolesApi) { - await client.createRole({ role: { name } }); + await client.createRole({ request: { role: { name } } }); } }, @@ -2152,7 +2154,7 @@ export const rolesApi = observable({ if (!client) throw new Error('security client is not initialized'); if (Features.rolesApi) { - await client.deleteRole({ roleName: name, deleteAcls }); + await client.deleteRole({ request: { roleName: name, deleteAcls } }); } }, @@ -2160,11 +2162,13 @@ export const rolesApi = observable({ const client = appConfig.securityClient; if (!client) throw new Error('security client is not initialized'); - return await client.updateRoleMembership({ - roleName: roleName, - add: addUsers.map((u) => ({ principal: `User:${u}` })), - remove: removeUsers.map((u) => ({ principal: `User:${u}` })), - create, + return await client.updateRoleMembership( { + request: { + roleName: roleName, + add: addUsers.map((u) => ({ principal: `User:${u}` })), + remove: removeUsers.map((u) => ({ principal: `User:${u}` })), + create, + } }); }, }); diff --git a/proto/redpanda/api/console/v1alpha1/security.proto b/proto/redpanda/api/console/v1alpha1/security.proto index b565648ae3..387d9887d9 100644 --- a/proto/redpanda/api/console/v1alpha1/security.proto +++ b/proto/redpanda/api/console/v1alpha1/security.proto @@ -2,196 +2,67 @@ syntax = "proto3"; package redpanda.api.console.v1alpha1; -import "buf/validate/validate.proto"; import "redpanda/api/auth/v1/authorization.proto"; - -// Role defines a role in the system. -message Role { - // The name of the role. - string name = 1 [ - (buf.validate.field).required = true, - (buf.validate.field).string.min_len = 1, - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^[^,=]+$" - ]; -} +import "redpanda/api/dataplane/v1/security.proto"; // ListRolesRequest is the request for ListRoles. message ListRolesRequest { - // Filter options. - message Filter { - // Filter results only roles named with the prefix. - string name_prefix = 1 [ - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^([^,=]*)$" - ]; - - // Filter results to only roles with names which contain the string. - string name_contains = 2 [ - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^([^,=]*)$" - ]; - - // Return only roles assigned to this principal. - string principal = 3 [(buf.validate.field).string.max_len = 128]; - } - - // Optional filter. - optional Filter filter = 1; - - // Page size. - int32 page_size = 2 [(buf.validate.field).int32 = { - gte: -1 - lte: 1000 - }]; - - // Value of the next_page_token field returned by the previous response. - // If not provided, the system assumes the first page is requested. - string page_token = 3; + redpanda.api.dataplane.v1.ListRolesRequest request = 1; } // ListRolesResponse is the response for ListRoles. message ListRolesResponse { - // The roles in the system. - repeated Role roles = 1; - - // Token to retrieve the next page. - string next_page_token = 2; + redpanda.api.dataplane.v1.ListRolesResponse response = 1; } // CreateRoleRequest is the request for CreateRole. message CreateRoleRequest { - // The role to create. - Role role = 1; + redpanda.api.dataplane.v1.CreateRoleRequest request = 1; } // CreateRoleResponse is the response for CreateRole. message CreateRoleResponse { - // The role. - Role role = 1; + redpanda.api.dataplane.v1.CreateRoleResponse response = 1; } -// CreateRoleRequest is the request for CreateRole. +// GetRoleRequest is the request for GetRole. message GetRoleRequest { - // The role name. - string role_name = 1 [ - (buf.validate.field).required = true, - (buf.validate.field).string.min_len = 1, - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^[^,=]+$" - ]; + redpanda.api.dataplane.v1.GetRoleRequest request = 1; } // GetRoleResponse is the response to GetRole. message GetRoleResponse { - // The Role. - Role role = 1; - - // Members assigned to the role. - repeated RoleMembership members = 2; + redpanda.api.dataplane.v1.GetRoleResponse response = 1; } // DeleteRoleRequest is the request for DeleteRole. message DeleteRoleRequest { - // The role name. - string role_name = 1 [ - (buf.validate.field).required = true, - (buf.validate.field).string.min_len = 1, - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^[^,=]+$" - ]; - - // Whether to delete the ACLs bound to the role. - bool delete_acls = 2; + redpanda.api.dataplane.v1.DeleteRoleRequest request = 1; } // DeleteRoleResponse is the response for DeleteRole. -message DeleteRoleResponse {} +message DeleteRoleResponse { + redpanda.api.dataplane.v1.DeleteRoleResponse response = 1; +} // List role members for a role. That is user principals assigned to that role. message ListRoleMembersRequest { - // Filter options. - message Filter { - // Filter results to only members with names which contain the string. - string name_contains = 1 [(buf.validate.field).string.max_len = 128]; - } - - // The role name. - string role_name = 1 [ - (buf.validate.field).required = true, - (buf.validate.field).string.min_len = 1, - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^[^,=]+$" - ]; - - // Optional filter. - optional Filter filter = 2; - - // Page size. - int32 page_size = 3 [(buf.validate.field).int32 = { - gte: -1 - lte: 1000 - }]; - - // Value of the next_page_token field returned by the previous response. - // If not provided, the system assumes the first page is requested. - string page_token = 4; + redpanda.api.dataplane.v1.ListRoleMembersRequest request = 1; } // ListRoleMembersResponse is the response for ListRoleMembers. message ListRoleMembersResponse { - // The role name. - string role_name = 1; - - // Members assigned to the role. - repeated RoleMembership members = 2; - - // Token to retrieve the next page. - string next_page_token = 3; -} - -// RoleMembership is the role membership. -message RoleMembership { - // The name of the principal assigned to the role. - string principal = 1; + redpanda.api.dataplane.v1.ListRoleMembersResponse response = 1; } // UpdateRoleMembershipRequest is the request to UpdateRoleMembership. message UpdateRoleMembershipRequest { - // The role name. - string role_name = 1 [ - (buf.validate.field).required = true, - (buf.validate.field).string.min_len = 1, - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^[^,=]+$" - ]; - - // Create the role if it doesn't already exist. - // If the role is created in this way, the “add” list will be respected, but the “remove” list will be ignored. - bool create = 2; - - // Members to assign to the role. - repeated RoleMembership add = 3; - - // Members to remove from the role. - repeated RoleMembership remove = 4; + redpanda.api.dataplane.v1.UpdateRoleMembershipRequest request = 1; } // UpdateRoleMembershipResponse is the response for UpdateRoleMembership. message UpdateRoleMembershipResponse { - // The role name. - string role_name = 1 [ - (buf.validate.field).required = true, - (buf.validate.field).string.min_len = 1, - (buf.validate.field).string.max_len = 128, - (buf.validate.field).string.pattern = "^[^,=]+$" - ]; - - // Members assigned to the role. - repeated RoleMembership added = 2; - - // Members removed from the role. - repeated RoleMembership removed = 3; + redpanda.api.dataplane.v1.UpdateRoleMembershipResponse response = 1; } service SecurityService { From e8e648240963056811c286461fe764612419afae Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Fri, 2 May 2025 11:59:51 -0300 Subject: [PATCH 07/13] backend: add nolint comments --- backend/pkg/api/routes.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/pkg/api/routes.go b/backend/pkg/api/routes.go index b8069b9cba..729895b567 100644 --- a/backend/pkg/api/routes.go +++ b/backend/pkg/api/routes.go @@ -261,7 +261,7 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { kafkaConnectSvcPathV1Alpha2, kafkaConnectSvcHandlerV1Alpha2 := dataplanev1alpha2connect.NewKafkaConnectServiceHandler( hookOutput.Services[dataplanev1alpha2connect.KafkaConnectServiceName].(dataplanev1alpha2connect.KafkaConnectServiceHandler), connect.WithInterceptors(hookOutput.Interceptors...)) - cloudStorageSvcV1Alpha2 := hookOutput.Services[dataplanev1alpha2connect.CloudStorageServiceName].(dataplanev1alpha2connect.CloudStorageServiceHandler) + cloudStorageSvcV1Alpha2 := hookOutput.Services[dataplanev1alpha2connect.CloudStorageServiceName].(dataplanev1alpha2connect.CloudStorageServiceHandler) //nolint:revive // we control the map cloudStorageSvcPathV1Alpha2, cloudStorageSvcHandlerV1Alpha2 := dataplanev1alpha2connect.NewCloudStorageServiceHandler( cloudStorageSvcV1Alpha2, connect.WithInterceptors(hookOutput.Interceptors...)) @@ -283,11 +283,11 @@ func (api *API) setupConnectWithGRPCGateway(r chi.Router) { kafkaConnectSvcPathV1, kafkaConnectSvcHandlerV1 := dataplanev1connect.NewKafkaConnectServiceHandler( hookOutput.Services[dataplanev1connect.KafkaConnectServiceName].(dataplanev1connect.KafkaConnectServiceHandler), connect.WithInterceptors(hookOutput.Interceptors...)) - cloudStorageSvcV1 := hookOutput.Services[dataplanev1connect.CloudStorageServiceName].(dataplanev1connect.CloudStorageServiceHandler) + cloudStorageSvcV1 := hookOutput.Services[dataplanev1connect.CloudStorageServiceName].(dataplanev1connect.CloudStorageServiceHandler) //nolint:revive // we control the map cloudStorageSvcPathV1, cloudStorageSvcHandlerV1 := dataplanev1connect.NewCloudStorageServiceHandler( cloudStorageSvcV1, connect.WithInterceptors(hookOutput.Interceptors...)) - securitySvcV1 := hookOutput.Services[dataplanev1connect.SecurityServiceName].(dataplanev1connect.SecurityServiceHandler) + securitySvcV1 := hookOutput.Services[dataplanev1connect.SecurityServiceName].(dataplanev1connect.SecurityServiceHandler) //nolint:revive // we control the map securitySvcPathV1, securitySvcHandlerV1 := dataplanev1connect.NewSecurityServiceHandler( securitySvcV1, connect.WithInterceptors(hookOutput.Interceptors...)) From 93cfb14a9e2a8375bdc9caf3761c1a1a4914b089 Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Fri, 2 May 2025 14:46:42 -0300 Subject: [PATCH 08/13] frontend: fix roles query to use new embedded structure --- frontend/src/react-query/api/security.tsx | 50 ++++++++++++++++++----- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/frontend/src/react-query/api/security.tsx b/frontend/src/react-query/api/security.tsx index f12e7ec707..67bb1f1234 100644 --- a/frontend/src/react-query/api/security.tsx +++ b/frontend/src/react-query/api/security.tsx @@ -12,26 +12,44 @@ import { ListRolesRequestSchema, type ListRolesResponse, } from 'protogen/redpanda/api/console/v1alpha1/security_pb'; +import { + type ListRoleMembersRequest as ListRoleMembersRequestDataPlane, + ListRoleMembersRequestSchema as ListRoleMembersRequestSchemaDataPlane, + type ListRoleMembersResponse as ListRoleMembersResponseDataPlane, + type ListRolesRequest as ListRolesRequestDataPlane, + ListRolesRequestSchema as ListRolesRequestSchemaDataPlane, + type ListRolesResponse as ListRolesResponseDataPlane, +} from 'protogen/redpanda/api/dataplane/v1/security_pb'; import { MAX_PAGE_SIZE, type MessageInit, type QueryOptions } from 'react-query/react-query.utils'; import { useInfiniteQueryWithAllPages } from 'react-query/use-infinite-query-with-all-pages'; export const useListRolesQuery = ( - input?: MessageInit, + input?: MessageInit, options?: QueryOptions, ListRolesResponse>, ) => { - const listRolesRequest = create(ListRolesRequestSchema, { + const listRolesRequestDataPlane = create(ListRolesRequestSchemaDataPlane, { pageToken: '', pageSize: MAX_PAGE_SIZE, ...input, }); + const listRolesRequest = create(ListRolesRequestSchema, { + request: listRolesRequestDataPlane, + }) as MessageInit & Required, 'request'>>; + const listRolesResult = useInfiniteQueryWithAllPages(listRoles, listRolesRequest, { - pageParamKey: 'pageToken', + pageParamKey: 'request', enabled: options?.enabled, - getNextPageParam: (lastPage) => lastPage?.nextPageToken, + getNextPageParam: (lastPage) => + lastPage?.response?.nextPageToken + ? { + ...listRolesRequestDataPlane, + pageToken: lastPage.response?.nextPageToken, + } + : undefined, }); - const roles = listRolesResult?.data?.pages?.flatMap(({ roles }) => roles); + const roles = listRolesResult?.data?.pages?.flatMap(({ response }) => response?.roles); return { ...listRolesResult, @@ -42,22 +60,32 @@ export const useListRolesQuery = ( }; export const useListRoleMembersQuery = ( - input?: MessageInit, + input?: MessageInit, options?: QueryOptions, ListRoleMembersResponse>, ) => { - const listRoleMembersRequest = create(ListRoleMembersRequestSchema, { + const listRoleMembersRequestDataPlane = create(ListRoleMembersRequestSchemaDataPlane, { pageSize: MAX_PAGE_SIZE, pageToken: '', ...input, }); - const listRoleMembersResult = useInfiniteQueryWithAllPages(listRoleMembers, listRoleMembersRequest, { - pageParamKey: 'pageToken', + const listRolesMembersRequest = create(ListRoleMembersRequestSchema, { + request: listRoleMembersRequestDataPlane, + }) as MessageInit & Required, 'request'>>; + + const listRoleMembersResult = useInfiniteQueryWithAllPages(listRoleMembers, listRolesMembersRequest, { + pageParamKey: 'request', enabled: options?.enabled, - getNextPageParam: (lastPage) => lastPage?.nextPageToken, + getNextPageParam: (lastPage) => + lastPage?.response?.nextPageToken + ? { + ...listRoleMembersRequestDataPlane, + pageToken: lastPage.response?.nextPageToken, + } + : undefined, }); - const members = listRoleMembersResult?.data?.pages?.flatMap(({ members }) => members); + const members = listRoleMembersResult?.data?.pages?.flatMap(({ response }) => response?.members); return { ...listRoleMembersResult, From 4ba717ac1802ea3ecd37b40eed1d16d5f8f2f804 Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Fri, 2 May 2025 14:53:06 -0300 Subject: [PATCH 09/13] frontend: fix newRole in RoleForm --- .../src/components/pages/acls/RoleForm.tsx | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/frontend/src/components/pages/acls/RoleForm.tsx b/frontend/src/components/pages/acls/RoleForm.tsx index ba92dcecb5..a05231a773 100644 --- a/frontend/src/components/pages/acls/RoleForm.tsx +++ b/frontend/src/components/pages/acls/RoleForm.tsx @@ -131,27 +131,29 @@ export const RoleForm = observer(({ initialData }: RoleFormProps) => { true, ); - const unpackedPrincipalGroup = unpackPrincipalGroup(aclPrincipalGroup); - - for (const aclFlat of unpackedPrincipalGroup) { - await api.createACL({ - host: aclFlat.host, - principal: aclFlat.principal, - resourceType: aclFlat.resourceType, - resourceName: aclFlat.resourceName, - resourcePatternType: aclFlat.resourcePatternType as unknown as 'Literal' | 'Prefixed', - operation: aclFlat.operation as unknown as Exclude, - permissionType: aclFlat.permissionType as unknown as 'Allow' | 'Deny', + if (newRole.response) { + const unpackedPrincipalGroup = unpackPrincipalGroup(aclPrincipalGroup); + + for (const aclFlat of unpackedPrincipalGroup) { + await api.createACL({ + host: aclFlat.host, + principal: aclFlat.principal, + resourceType: aclFlat.resourceType, + resourceName: aclFlat.resourceName, + resourcePatternType: aclFlat.resourcePatternType as unknown as 'Literal' | 'Prefixed', + operation: aclFlat.operation as unknown as Exclude, + permissionType: aclFlat.permissionType as unknown as 'Allow' | 'Deny', + }); + } + + setIsLoading(false); + toast({ + status: 'success', + title: `Role ${newRole.response.roleName} successfully ${editMode ? 'updated' : 'created'}`, }); - } - - setIsLoading(false); - toast({ - status: 'success', - title: `Role ${newRole.roleName} successfully ${editMode ? 'updated' : 'created'}`, - }); - history.push(`/security/roles/${encodeURIComponent(newRole.roleName)}/details`); + history.push(`/security/roles/${encodeURIComponent(newRole.response.roleName)}/details`); + } } catch (err) { toast({ status: 'error', From 18283eeb7bdb23688ee45b4ded52f1a21f202c44 Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Fri, 2 May 2025 15:15:31 -0300 Subject: [PATCH 10/13] proto: pin buf.build/redpandadata/common --- .../redpanda/api/common/v1/errordetails.pb.go | 278 ++++++++++++++++++ .../redpanda/api/common/v1/linthint.pb.go | 177 +++++++++++ .../redpanda/api/common/v1/errordetails_pb.ts | 85 ++++++ .../redpanda/api/common/v1/linthint_pb.ts | 56 ++++ taskfiles/proto.yaml | 2 +- 5 files changed, 597 insertions(+), 1 deletion(-) create mode 100644 backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go create mode 100644 backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go create mode 100644 frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts create mode 100644 frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts diff --git a/backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go b/backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go new file mode 100644 index 0000000000..8345fe3b1c --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/common/v1/errordetails.pb.go @@ -0,0 +1,278 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/common/v1/errordetails.proto + +package commonv1 + +import ( + reflect "reflect" + sync "sync" + + status "google.golang.org/genproto/googleapis/rpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// AttemptInfo contains information about retryable actions and their specific attempts. +type AttemptInfo struct { + state protoimpl.MessageState `protogen:"open.v1"` + Attempts []*AttemptInfo_Attempt `protobuf:"bytes,1,rep,name=attempts,proto3" json:"attempts,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AttemptInfo) Reset() { + *x = AttemptInfo{} + mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AttemptInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AttemptInfo) ProtoMessage() {} + +func (x *AttemptInfo) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AttemptInfo.ProtoReflect.Descriptor instead. +func (*AttemptInfo) Descriptor() ([]byte, []int) { + return file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP(), []int{0} +} + +func (x *AttemptInfo) GetAttempts() []*AttemptInfo_Attempt { + if x != nil { + return x.Attempts + } + return nil +} + +// ExternalError is an error that may be returned to external users. Other +// errors thrown by internal systems are discarded by default, so internal +// errors with sensitive information are not exposed. +type ExternalError struct { + state protoimpl.MessageState `protogen:"open.v1"` + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + Details []*anypb.Any `protobuf:"bytes,2,rep,name=details,proto3" json:"details,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExternalError) Reset() { + *x = ExternalError{} + mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExternalError) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExternalError) ProtoMessage() {} + +func (x *ExternalError) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExternalError.ProtoReflect.Descriptor instead. +func (*ExternalError) Descriptor() ([]byte, []int) { + return file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP(), []int{1} +} + +func (x *ExternalError) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *ExternalError) GetDetails() []*anypb.Any { + if x != nil { + return x.Details + } + return nil +} + +type AttemptInfo_Attempt struct { + state protoimpl.MessageState `protogen:"open.v1"` + Number int32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"` + Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AttemptInfo_Attempt) Reset() { + *x = AttemptInfo_Attempt{} + mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AttemptInfo_Attempt) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AttemptInfo_Attempt) ProtoMessage() {} + +func (x *AttemptInfo_Attempt) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_common_v1_errordetails_proto_msgTypes[2] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AttemptInfo_Attempt.ProtoReflect.Descriptor instead. +func (*AttemptInfo_Attempt) Descriptor() ([]byte, []int) { + return file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP(), []int{0, 0} +} + +func (x *AttemptInfo_Attempt) GetNumber() int32 { + if x != nil { + return x.Number + } + return 0 +} + +func (x *AttemptInfo_Attempt) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +var File_redpanda_api_common_v1_errordetails_proto protoreflect.FileDescriptor + +var file_redpanda_api_common_v1_errordetails_proto_rawDesc = []byte{ + 0x0a, 0x29, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x72, 0x65, 0x64, + 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa5, 0x01, 0x0a, 0x0b, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x47, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x72, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x41, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x52, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x1a, 0x4d, 0x0a, 0x07, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x59, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, + 0x79, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x83, 0x02, 0x0a, 0x1a, 0x63, + 0x6f, 0x6d, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x11, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x57, + 0x62, 0x75, 0x66, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, + 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x43, 0xaa, 0x02, 0x16, + 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x16, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0xe2, + 0x02, 0x22, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, + 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_redpanda_api_common_v1_errordetails_proto_rawDescOnce sync.Once + file_redpanda_api_common_v1_errordetails_proto_rawDescData = file_redpanda_api_common_v1_errordetails_proto_rawDesc +) + +func file_redpanda_api_common_v1_errordetails_proto_rawDescGZIP() []byte { + file_redpanda_api_common_v1_errordetails_proto_rawDescOnce.Do(func() { + file_redpanda_api_common_v1_errordetails_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_common_v1_errordetails_proto_rawDescData) + }) + return file_redpanda_api_common_v1_errordetails_proto_rawDescData +} + +var file_redpanda_api_common_v1_errordetails_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_redpanda_api_common_v1_errordetails_proto_goTypes = []any{ + (*AttemptInfo)(nil), // 0: redpanda.api.common.v1.AttemptInfo + (*ExternalError)(nil), // 1: redpanda.api.common.v1.ExternalError + (*AttemptInfo_Attempt)(nil), // 2: redpanda.api.common.v1.AttemptInfo.Attempt + (*anypb.Any)(nil), // 3: google.protobuf.Any + (*status.Status)(nil), // 4: google.rpc.Status +} +var file_redpanda_api_common_v1_errordetails_proto_depIdxs = []int32{ + 2, // 0: redpanda.api.common.v1.AttemptInfo.attempts:type_name -> redpanda.api.common.v1.AttemptInfo.Attempt + 3, // 1: redpanda.api.common.v1.ExternalError.details:type_name -> google.protobuf.Any + 4, // 2: redpanda.api.common.v1.AttemptInfo.Attempt.status:type_name -> google.rpc.Status + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_redpanda_api_common_v1_errordetails_proto_init() } +func file_redpanda_api_common_v1_errordetails_proto_init() { + if File_redpanda_api_common_v1_errordetails_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_common_v1_errordetails_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_redpanda_api_common_v1_errordetails_proto_goTypes, + DependencyIndexes: file_redpanda_api_common_v1_errordetails_proto_depIdxs, + MessageInfos: file_redpanda_api_common_v1_errordetails_proto_msgTypes, + }.Build() + File_redpanda_api_common_v1_errordetails_proto = out.File + file_redpanda_api_common_v1_errordetails_proto_rawDesc = nil + file_redpanda_api_common_v1_errordetails_proto_goTypes = nil + file_redpanda_api_common_v1_errordetails_proto_depIdxs = nil +} diff --git a/backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go b/backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go new file mode 100644 index 0000000000..f3f43a6506 --- /dev/null +++ b/backend/pkg/protogen/redpanda/api/common/v1/linthint.pb.go @@ -0,0 +1,177 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.0 +// protoc (unknown) +// source: redpanda/api/common/v1/linthint.proto + +package commonv1 + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// LintHint is a generic linting hint. +type LintHint struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Line number of the lint. + Line int32 `protobuf:"varint,1,opt,name=line,proto3" json:"line,omitempty"` + // Column number of the lint. + Column int32 `protobuf:"varint,2,opt,name=column,proto3" json:"column,omitempty"` + // The hint message. + Hint string `protobuf:"bytes,3,opt,name=hint,proto3" json:"hint,omitempty"` + // Optional lint type or enum. + LintType string `protobuf:"bytes,4,opt,name=lint_type,json=lintType,proto3" json:"lint_type,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LintHint) Reset() { + *x = LintHint{} + mi := &file_redpanda_api_common_v1_linthint_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LintHint) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LintHint) ProtoMessage() {} + +func (x *LintHint) ProtoReflect() protoreflect.Message { + mi := &file_redpanda_api_common_v1_linthint_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LintHint.ProtoReflect.Descriptor instead. +func (*LintHint) Descriptor() ([]byte, []int) { + return file_redpanda_api_common_v1_linthint_proto_rawDescGZIP(), []int{0} +} + +func (x *LintHint) GetLine() int32 { + if x != nil { + return x.Line + } + return 0 +} + +func (x *LintHint) GetColumn() int32 { + if x != nil { + return x.Column + } + return 0 +} + +func (x *LintHint) GetHint() string { + if x != nil { + return x.Hint + } + return "" +} + +func (x *LintHint) GetLintType() string { + if x != nil { + return x.LintType + } + return "" +} + +var File_redpanda_api_common_v1_linthint_proto protoreflect.FileDescriptor + +var file_redpanda_api_common_v1_linthint_proto_rawDesc = []byte{ + 0x0a, 0x25, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x69, 0x6e, 0x74, 0x68, 0x69, 0x6e, + 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x22, + 0x67, 0x0a, 0x08, 0x4c, 0x69, 0x6e, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, + 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x69, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x6c, + 0x69, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6c, 0x69, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x42, 0xff, 0x01, 0x0a, 0x1a, 0x63, 0x6f, 0x6d, + 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x4c, 0x69, 0x6e, 0x74, 0x68, 0x69, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x57, 0x62, 0x75, 0x66, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x67, 0x6f, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, + 0x6e, 0x64, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x73, 0x2f, 0x67, + 0x6f, 0x2f, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x76, + 0x31, 0xa2, 0x02, 0x03, 0x52, 0x41, 0x43, 0xaa, 0x02, 0x16, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, + 0x64, 0x61, 0x2e, 0x41, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x31, + 0xca, 0x02, 0x16, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, + 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x22, 0x52, 0x65, 0x64, 0x70, + 0x61, 0x6e, 0x64, 0x61, 0x5c, 0x41, 0x70, 0x69, 0x5c, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5c, + 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x19, 0x52, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x3a, 0x3a, 0x41, 0x70, 0x69, 0x3a, 0x3a, + 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_redpanda_api_common_v1_linthint_proto_rawDescOnce sync.Once + file_redpanda_api_common_v1_linthint_proto_rawDescData = file_redpanda_api_common_v1_linthint_proto_rawDesc +) + +func file_redpanda_api_common_v1_linthint_proto_rawDescGZIP() []byte { + file_redpanda_api_common_v1_linthint_proto_rawDescOnce.Do(func() { + file_redpanda_api_common_v1_linthint_proto_rawDescData = protoimpl.X.CompressGZIP(file_redpanda_api_common_v1_linthint_proto_rawDescData) + }) + return file_redpanda_api_common_v1_linthint_proto_rawDescData +} + +var file_redpanda_api_common_v1_linthint_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_redpanda_api_common_v1_linthint_proto_goTypes = []any{ + (*LintHint)(nil), // 0: redpanda.api.common.v1.LintHint +} +var file_redpanda_api_common_v1_linthint_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_redpanda_api_common_v1_linthint_proto_init() } +func file_redpanda_api_common_v1_linthint_proto_init() { + if File_redpanda_api_common_v1_linthint_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_redpanda_api_common_v1_linthint_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_redpanda_api_common_v1_linthint_proto_goTypes, + DependencyIndexes: file_redpanda_api_common_v1_linthint_proto_depIdxs, + MessageInfos: file_redpanda_api_common_v1_linthint_proto_msgTypes, + }.Build() + File_redpanda_api_common_v1_linthint_proto = out.File + file_redpanda_api_common_v1_linthint_proto_rawDesc = nil + file_redpanda_api_common_v1_linthint_proto_goTypes = nil + file_redpanda_api_common_v1_linthint_proto_depIdxs = nil +} diff --git a/frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts b/frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts new file mode 100644 index 0000000000..31a697b434 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/common/v1/errordetails_pb.ts @@ -0,0 +1,85 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/common/v1/errordetails.proto (package redpanda.api.common.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Any } from "@bufbuild/protobuf/wkt"; +import { file_google_protobuf_any } from "@bufbuild/protobuf/wkt"; +import type { Status } from "../../../../google/rpc/status_pb"; +import { file_google_rpc_status } from "../../../../google/rpc/status_pb"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/common/v1/errordetails.proto. + */ +export const file_redpanda_api_common_v1_errordetails: GenFile = /*@__PURE__*/ + fileDesc("CilyZWRwYW5kYS9hcGkvY29tbW9uL3YxL2Vycm9yZGV0YWlscy5wcm90bxIWcmVkcGFuZGEuYXBpLmNvbW1vbi52MSKLAQoLQXR0ZW1wdEluZm8SPQoIYXR0ZW1wdHMYASADKAsyKy5yZWRwYW5kYS5hcGkuY29tbW9uLnYxLkF0dGVtcHRJbmZvLkF0dGVtcHQaPQoHQXR0ZW1wdBIOCgZudW1iZXIYASABKAUSIgoGc3RhdHVzGAIgASgLMhIuZ29vZ2xlLnJwYy5TdGF0dXMiRwoNRXh0ZXJuYWxFcnJvchIPCgdtZXNzYWdlGAEgASgJEiUKB2RldGFpbHMYAiADKAsyFC5nb29nbGUucHJvdG9idWYuQW55QoMCChpjb20ucmVkcGFuZGEuYXBpLmNvbW1vbi52MUIRRXJyb3JkZXRhaWxzUHJvdG9QAVpXYnVmLmJ1aWxkL2dlbi9nby9yZWRwYW5kYWRhdGEvY29tbW9uL3Byb3RvY29sYnVmZmVycy9nby9yZWRwYW5kYS9hcGkvY29tbW9uL3YxO2NvbW1vbnYxogIDUkFDqgIWUmVkcGFuZGEuQXBpLkNvbW1vbi5WMcoCFlJlZHBhbmRhXEFwaVxDb21tb25cVjHiAiJSZWRwYW5kYVxBcGlcQ29tbW9uXFYxXEdQQk1ldGFkYXRh6gIZUmVkcGFuZGE6OkFwaTo6Q29tbW9uOjpWMWIGcHJvdG8z", [file_google_protobuf_any, file_google_rpc_status]); + +/** + * AttemptInfo contains information about retryable actions and their specific attempts. + * + * @generated from message redpanda.api.common.v1.AttemptInfo + */ +export type AttemptInfo = Message<"redpanda.api.common.v1.AttemptInfo"> & { + /** + * @generated from field: repeated redpanda.api.common.v1.AttemptInfo.Attempt attempts = 1; + */ + attempts: AttemptInfo_Attempt[]; +}; + +/** + * Describes the message redpanda.api.common.v1.AttemptInfo. + * Use `create(AttemptInfoSchema)` to create a new message. + */ +export const AttemptInfoSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_common_v1_errordetails, 0); + +/** + * @generated from message redpanda.api.common.v1.AttemptInfo.Attempt + */ +export type AttemptInfo_Attempt = Message<"redpanda.api.common.v1.AttemptInfo.Attempt"> & { + /** + * @generated from field: int32 number = 1; + */ + number: number; + + /** + * @generated from field: google.rpc.Status status = 2; + */ + status?: Status; +}; + +/** + * Describes the message redpanda.api.common.v1.AttemptInfo.Attempt. + * Use `create(AttemptInfo_AttemptSchema)` to create a new message. + */ +export const AttemptInfo_AttemptSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_common_v1_errordetails, 0, 0); + +/** + * ExternalError is an error that may be returned to external users. Other + * errors thrown by internal systems are discarded by default, so internal + * errors with sensitive information are not exposed. + * + * @generated from message redpanda.api.common.v1.ExternalError + */ +export type ExternalError = Message<"redpanda.api.common.v1.ExternalError"> & { + /** + * @generated from field: string message = 1; + */ + message: string; + + /** + * @generated from field: repeated google.protobuf.Any details = 2; + */ + details: Any[]; +}; + +/** + * Describes the message redpanda.api.common.v1.ExternalError. + * Use `create(ExternalErrorSchema)` to create a new message. + */ +export const ExternalErrorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_common_v1_errordetails, 1); + diff --git a/frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts b/frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts new file mode 100644 index 0000000000..bfeb3b4ba2 --- /dev/null +++ b/frontend/src/protogen/redpanda/api/common/v1/linthint_pb.ts @@ -0,0 +1,56 @@ +// @generated by protoc-gen-es v2.2.5 with parameter "target=ts" +// @generated from file redpanda/api/common/v1/linthint.proto (package redpanda.api.common.v1, syntax proto3) +/* eslint-disable */ + +import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv1"; +import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv1"; +import type { Message } from "@bufbuild/protobuf"; + +/** + * Describes the file redpanda/api/common/v1/linthint.proto. + */ +export const file_redpanda_api_common_v1_linthint: GenFile = /*@__PURE__*/ + fileDesc("CiVyZWRwYW5kYS9hcGkvY29tbW9uL3YxL2xpbnRoaW50LnByb3RvEhZyZWRwYW5kYS5hcGkuY29tbW9uLnYxIkkKCExpbnRIaW50EgwKBGxpbmUYASABKAUSDgoGY29sdW1uGAIgASgFEgwKBGhpbnQYAyABKAkSEQoJbGludF90eXBlGAQgASgJQv8BChpjb20ucmVkcGFuZGEuYXBpLmNvbW1vbi52MUINTGludGhpbnRQcm90b1ABWldidWYuYnVpbGQvZ2VuL2dvL3JlZHBhbmRhZGF0YS9jb21tb24vcHJvdG9jb2xidWZmZXJzL2dvL3JlZHBhbmRhL2FwaS9jb21tb24vdjE7Y29tbW9udjGiAgNSQUOqAhZSZWRwYW5kYS5BcGkuQ29tbW9uLlYxygIWUmVkcGFuZGFcQXBpXENvbW1vblxWMeICIlJlZHBhbmRhXEFwaVxDb21tb25cVjFcR1BCTWV0YWRhdGHqAhlSZWRwYW5kYTo6QXBpOjpDb21tb246OlYxYgZwcm90bzM"); + +/** + * LintHint is a generic linting hint. + * + * @generated from message redpanda.api.common.v1.LintHint + */ +export type LintHint = Message<"redpanda.api.common.v1.LintHint"> & { + /** + * Line number of the lint. + * + * @generated from field: int32 line = 1; + */ + line: number; + + /** + * Column number of the lint. + * + * @generated from field: int32 column = 2; + */ + column: number; + + /** + * The hint message. + * + * @generated from field: string hint = 3; + */ + hint: string; + + /** + * Optional lint type or enum. + * + * @generated from field: string lint_type = 4; + */ + lintType: string; +}; + +/** + * Describes the message redpanda.api.common.v1.LintHint. + * Use `create(LintHintSchema)` to create a new message. + */ +export const LintHintSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_redpanda_api_common_v1_linthint, 0); + diff --git a/taskfiles/proto.yaml b/taskfiles/proto.yaml index 1662ce0dfa..aa406586a8 100644 --- a/taskfiles/proto.yaml +++ b/taskfiles/proto.yaml @@ -56,7 +56,7 @@ tasks: {{ .PATH_PREFIX }} buf generate --template=proto/buf.gen.yaml - for: { var: BUF_INPUTS } cmd: "{{ .PATH_PREFIX }} buf generate --template={{ .ITEM }}/buf.gen.yaml {{ .ITEM }}" - - "{{ .PATH_PREFIX }} buf generate --template=proto/buf.gen.yaml buf.build/redpandadata/common" + - "{{ .PATH_PREFIX }} buf generate --template=proto/buf.gen.yaml buf.build/redpandadata/common:3f349e63f44a494ead60d43089c654ee" - task: :backend:fmt - task: generate-openapi3 - if [[ $CI == "true" ]]; then git diff -w --exit-code; fi From 3c4c92cdc33146c8c6974d3ec6430b03dce40b6a Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Fri, 2 May 2025 15:26:41 -0300 Subject: [PATCH 11/13] frontend: remove unused imports --- frontend/src/react-query/api/security.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/react-query/api/security.tsx b/frontend/src/react-query/api/security.tsx index 67bb1f1234..0d3603829a 100644 --- a/frontend/src/react-query/api/security.tsx +++ b/frontend/src/react-query/api/security.tsx @@ -15,10 +15,8 @@ import { import { type ListRoleMembersRequest as ListRoleMembersRequestDataPlane, ListRoleMembersRequestSchema as ListRoleMembersRequestSchemaDataPlane, - type ListRoleMembersResponse as ListRoleMembersResponseDataPlane, type ListRolesRequest as ListRolesRequestDataPlane, ListRolesRequestSchema as ListRolesRequestSchemaDataPlane, - type ListRolesResponse as ListRolesResponseDataPlane, } from 'protogen/redpanda/api/dataplane/v1/security_pb'; import { MAX_PAGE_SIZE, type MessageInit, type QueryOptions } from 'react-query/react-query.utils'; import { useInfiniteQueryWithAllPages } from 'react-query/use-infinite-query-with-all-pages'; From f07cea881c00e207a930c8664dcc542727aa6ac4 Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Mon, 5 May 2025 10:44:10 -0300 Subject: [PATCH 12/13] proto: make all security api permissions admin, fix proto taskfile --- .../pkg/protogen/redpanda/api/dataplane/v1/security.pb.go | 6 +++--- frontend/src/protogen/google/api/field_behavior_pb.ts | 2 +- frontend/src/protogen/google/rpc/code_pb.ts | 2 +- frontend/src/protogen/google/rpc/status_pb.ts | 2 +- .../src/protogen/redpanda/api/dataplane/v1/security_pb.ts | 2 +- proto/redpanda/api/dataplane/v1/security.proto | 6 +++--- taskfiles/proto.yaml | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go index 6c44b43360..3214f235f3 100644 --- a/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go +++ b/backend/pkg/protogen/redpanda/api/dataplane/v1/security.pb.go @@ -1068,7 +1068,7 @@ var file_redpanda_api_dataplane_v1_security_proto_rawDesc = []byte{ 0x4f, 0x4b, 0x12, 0x30, 0x0a, 0x2e, 0x1a, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, + 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0b, 0x12, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0xf5, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, @@ -1100,7 +1100,7 @@ var file_redpanda_api_dataplane_v1_security_proto_rawDesc = []byte{ 0x6e, 0x73, 0x65, 0x4a, 0x2a, 0x0a, 0x03, 0x34, 0x30, 0x34, 0x12, 0x23, 0x0a, 0x09, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x14, 0x1a, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x8a, - 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, + 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x83, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2c, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, @@ -1134,7 +1134,7 @@ var file_redpanda_api_dataplane_v1_security_proto_rawDesc = []byte{ 0x34, 0x1a, 0x32, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x64, 0x61, 0x74, 0x61, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x82, 0xd3, 0xe4, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0xc9, 0x02, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, diff --git a/frontend/src/protogen/google/api/field_behavior_pb.ts b/frontend/src/protogen/google/api/field_behavior_pb.ts index 819a954609..aa28562e85 100644 --- a/frontend/src/protogen/google/api/field_behavior_pb.ts +++ b/frontend/src/protogen/google/api/field_behavior_pb.ts @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/frontend/src/protogen/google/rpc/code_pb.ts b/frontend/src/protogen/google/rpc/code_pb.ts index aadf3283aa..7666742461 100644 --- a/frontend/src/protogen/google/rpc/code_pb.ts +++ b/frontend/src/protogen/google/rpc/code_pb.ts @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/frontend/src/protogen/google/rpc/status_pb.ts b/frontend/src/protogen/google/rpc/status_pb.ts index 05d37285aa..e546280847 100644 --- a/frontend/src/protogen/google/rpc/status_pb.ts +++ b/frontend/src/protogen/google/rpc/status_pb.ts @@ -1,4 +1,4 @@ -// Copyright 2024 Google LLC +// Copyright 2025 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts b/frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts index b631ac0cfa..5dc86d533b 100644 --- a/frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts +++ b/frontend/src/protogen/redpanda/api/dataplane/v1/security_pb.ts @@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file redpanda/api/dataplane/v1/security.proto. */ export const file_redpanda_api_dataplane_v1_security: GenFile = /*@__PURE__*/ - fileDesc("CihyZWRwYW5kYS9hcGkvZGF0YXBsYW5lL3YxL3NlY3VyaXR5LnByb3RvEhlyZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxIi0KBFJvbGUSJQoEbmFtZRgBIAEoCUIXukgUyAEBcg8QARiAATIIXlteLD1dKyQioQIKEExpc3RSb2xlc1JlcXVlc3QSRwoGZmlsdGVyGAEgASgLMjIucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXF1ZXN0LkZpbHRlckgAiAEBEiYKCXBhZ2Vfc2l6ZRgCIAEoBUITukgQGg4Y6Aco////////////ARISCgpwYWdlX3Rva2VuGAMgASgJGn0KBkZpbHRlchIpCgtuYW1lX3ByZWZpeBgBIAEoCUIUukgRcg8YgAEyCl4oW14sPV0qKSQSKwoNbmFtZV9jb250YWlucxgCIAEoCUIUukgRcg8YgAEyCl4oW14sPV0qKSQSGwoJcHJpbmNpcGFsGAMgASgJQgi6SAVyAxiAAUIJCgdfZmlsdGVyIlwKEUxpc3RSb2xlc1Jlc3BvbnNlEi4KBXJvbGVzGAEgAygLMh8ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSJCChFDcmVhdGVSb2xlUmVxdWVzdBItCgRyb2xlGAEgASgLMh8ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlIkMKEkNyZWF0ZVJvbGVSZXNwb25zZRItCgRyb2xlGAEgASgLMh8ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlIjwKDkdldFJvbGVSZXF1ZXN0EioKCXJvbGVfbmFtZRgBIAEoCUIXukgUyAEBcg8QARiAATIIXlteLD1dKyQifAoPR2V0Um9sZVJlc3BvbnNlEi0KBHJvbGUYASABKAsyHy5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGUSOgoHbWVtYmVycxgCIAMoCzIpLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuUm9sZU1lbWJlcnNoaXAiVAoRRGVsZXRlUm9sZVJlcXVlc3QSKgoJcm9sZV9uYW1lGAEgASgJQhe6SBTIAQFyDxABGIABMgheW14sPV0rJBITCgtkZWxldGVfYWNscxgCIAEoCCIUChJEZWxldGVSb2xlUmVzcG9uc2UihQIKFkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QSKgoJcm9sZV9uYW1lGAEgASgJQhe6SBTIAQFyDxABGIABMgheW14sPV0rJBJNCgZmaWx0ZXIYAiABKAsyOC5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QuRmlsdGVySACIAQESJgoJcGFnZV9zaXplGAMgASgFQhO6SBAaDhjoByj///////////8BEhIKCnBhZ2VfdG9rZW4YBCABKAkaKQoGRmlsdGVyEh8KDW5hbWVfY29udGFpbnMYASABKAlCCLpIBXIDGIABQgkKB19maWx0ZXIigQEKF0xpc3RSb2xlTWVtYmVyc1Jlc3BvbnNlEhEKCXJvbGVfbmFtZRgBIAEoCRI6CgdtZW1iZXJzGAIgAygLMikucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlTWVtYmVyc2hpcBIXCg9uZXh0X3BhZ2VfdG9rZW4YAyABKAkiIwoOUm9sZU1lbWJlcnNoaXASEQoJcHJpbmNpcGFsGAEgASgJIswBChtVcGRhdGVSb2xlTWVtYmVyc2hpcFJlcXVlc3QSKgoJcm9sZV9uYW1lGAEgASgJQhe6SBTIAQFyDxABGIABMgheW14sPV0rJBIOCgZjcmVhdGUYAiABKAgSNgoDYWRkGAMgAygLMikucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlTWVtYmVyc2hpcBI5CgZyZW1vdmUYBCADKAsyKS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGVNZW1iZXJzaGlwIsABChxVcGRhdGVSb2xlTWVtYmVyc2hpcFJlc3BvbnNlEioKCXJvbGVfbmFtZRgBIAEoCUIXukgUyAEBcg8QARiAATIIXlteLD1dKyQSOAoFYWRkZWQYAiADKAsyKS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGVNZW1iZXJzaGlwEjoKB3JlbW92ZWQYAyADKAsyKS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGVNZW1iZXJzaGlwMs0NCg9TZWN1cml0eVNlcnZpY2USkQIKCUxpc3RSb2xlcxIrLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuTGlzdFJvbGVzUmVxdWVzdBosLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuTGlzdFJvbGVzUmVzcG9uc2UiqAGSQYsBEgpMaXN0IFJvbGVzGj5MaXN0IHJvbGVzLiBPcHRpb25hbDogZmlsdGVyIGJhc2VkIG9uIHJvbGUgbmFtZSBhbmQgcHJpbmNpcGFsLko9CgMyMDASNgoCT0sSMAouGiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXNwb25zZYqmHQQIARADgtPkkwILEgkvdjEvcm9sZXMS9QEKCkNyZWF0ZVJvbGUSLC5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkNyZWF0ZVJvbGVSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5DcmVhdGVSb2xlUmVzcG9uc2UiiQGSQWcSC0NyZWF0ZSBSb2xlGg5DcmVhdGUgYSByb2xlLkpICgMyMDESQQoMUm9sZSBjcmVhdGVkEjEKLxotLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuQ3JlYXRlUm9sZVJlc3BvbnNliqYdBAgDEAOC0+STAhE6BHJvbGUiCS92MS9yb2xlcxKMAgoHR2V0Um9sZRIpLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuR2V0Um9sZVJlcXVlc3QaKi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkdldFJvbGVSZXNwb25zZSKpAZJBgAESCEdldCBSb2xlGgtHZXQgYSByb2xlLko7CgMyMDASNAoCT0sSLgosGioucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5HZXRSb2xlUmVzcG9uc2VKKgoDNDA0EiMKCU5vdCBGb3VuZBIWChQaEi5nb29nbGUucnBjLlN0YXR1c4qmHQQIARADgtPkkwIXEhUvdjEvcm9sZXMve3JvbGVfbmFtZX0SgwIKCkRlbGV0ZVJvbGUSLC5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkRlbGV0ZVJvbGVSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5EZWxldGVSb2xlUmVzcG9uc2UilwGSQW8SC0RlbGV0ZSBSb2xlGg5EZWxldGUgYSBSb2xlLkokCgMyMDQSHQoZUm9sZSBkZWxldGVkIHN1Y2Nlc3NmdWxseRIASioKAzQwNBIjCglOb3QgRm91bmQSFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXOKph0ECAMQA4LT5JMCFyoVL3YxL3JvbGVzL3tyb2xlX25hbWV9EqUCCg9MaXN0Um9sZU1lbWJlcnMSMS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QaMi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1Jlc3BvbnNlIqoBkkF6EhFMaXN0IFJvbGUgTWVtYmVycxogTGlzdCBtZW1iZXJzIGFzc2lnbmVkIHRvIGEgcm9sZS5KQwoDMjAwEjwKAk9LEjYKNBoyLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuTGlzdFJvbGVNZW1iZXJzUmVzcG9uc2WKph0ECAEQA4LT5JMCHxIdL3YxL3JvbGVzL3tyb2xlX25hbWV9L21lbWJlcnMSyQIKFFVwZGF0ZVJvbGVNZW1iZXJzaGlwEjYucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5VcGRhdGVSb2xlTWVtYmVyc2hpcFJlcXVlc3QaNy5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlVwZGF0ZVJvbGVNZW1iZXJzaGlwUmVzcG9uc2UivwGSQZMBEgtVcGRhdGUgUm9sZRoOVXBkYXRlIGEgcm9sZS5KSAoDMjAwEkEKAk9LEjsKORo3LnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZUoqCgM0MDQSIwoJTm90IEZvdW5kEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVziqYdBAgDEAOC0+STAho6ASoaFS92MS9yb2xlcy97cm9sZV9uYW1lfRolkkEiCghTZWN1cml0eRIWTWFuYWdlIFJlZHBhbmRhIHJvbGVzLkKSAgodY29tLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjFCDVNlY3VyaXR5UHJvdG9QAVpbZ2l0aHViLmNvbS9yZWRwYW5kYS1kYXRhL2NvbnNvbGUvYmFja2VuZC9wa2cvcHJvdG9nZW4vcmVkcGFuZGEvYXBpL2RhdGFwbGFuZS92MTtkYXRhcGxhbmV2MaICA1JBRKoCGVJlZHBhbmRhLkFwaS5EYXRhcGxhbmUuVjHKAhlSZWRwYW5kYVxBcGlcRGF0YXBsYW5lXFYx4gIlUmVkcGFuZGFcQXBpXERhdGFwbGFuZVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkRhdGFwbGFuZTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_protoc_gen_openapiv2_options_annotations, file_redpanda_api_auth_v1_authorization]); + fileDesc("CihyZWRwYW5kYS9hcGkvZGF0YXBsYW5lL3YxL3NlY3VyaXR5LnByb3RvEhlyZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxIi0KBFJvbGUSJQoEbmFtZRgBIAEoCUIXukgUyAEBcg8QARiAATIIXlteLD1dKyQioQIKEExpc3RSb2xlc1JlcXVlc3QSRwoGZmlsdGVyGAEgASgLMjIucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXF1ZXN0LkZpbHRlckgAiAEBEiYKCXBhZ2Vfc2l6ZRgCIAEoBUITukgQGg4Y6Aco////////////ARISCgpwYWdlX3Rva2VuGAMgASgJGn0KBkZpbHRlchIpCgtuYW1lX3ByZWZpeBgBIAEoCUIUukgRcg8YgAEyCl4oW14sPV0qKSQSKwoNbmFtZV9jb250YWlucxgCIAEoCUIUukgRcg8YgAEyCl4oW14sPV0qKSQSGwoJcHJpbmNpcGFsGAMgASgJQgi6SAVyAxiAAUIJCgdfZmlsdGVyIlwKEUxpc3RSb2xlc1Jlc3BvbnNlEi4KBXJvbGVzGAEgAygLMh8ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlEhcKD25leHRfcGFnZV90b2tlbhgCIAEoCSJCChFDcmVhdGVSb2xlUmVxdWVzdBItCgRyb2xlGAEgASgLMh8ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlIkMKEkNyZWF0ZVJvbGVSZXNwb25zZRItCgRyb2xlGAEgASgLMh8ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlIjwKDkdldFJvbGVSZXF1ZXN0EioKCXJvbGVfbmFtZRgBIAEoCUIXukgUyAEBcg8QARiAATIIXlteLD1dKyQifAoPR2V0Um9sZVJlc3BvbnNlEi0KBHJvbGUYASABKAsyHy5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGUSOgoHbWVtYmVycxgCIAMoCzIpLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuUm9sZU1lbWJlcnNoaXAiVAoRRGVsZXRlUm9sZVJlcXVlc3QSKgoJcm9sZV9uYW1lGAEgASgJQhe6SBTIAQFyDxABGIABMgheW14sPV0rJBITCgtkZWxldGVfYWNscxgCIAEoCCIUChJEZWxldGVSb2xlUmVzcG9uc2UihQIKFkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QSKgoJcm9sZV9uYW1lGAEgASgJQhe6SBTIAQFyDxABGIABMgheW14sPV0rJBJNCgZmaWx0ZXIYAiABKAsyOC5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QuRmlsdGVySACIAQESJgoJcGFnZV9zaXplGAMgASgFQhO6SBAaDhjoByj///////////8BEhIKCnBhZ2VfdG9rZW4YBCABKAkaKQoGRmlsdGVyEh8KDW5hbWVfY29udGFpbnMYASABKAlCCLpIBXIDGIABQgkKB19maWx0ZXIigQEKF0xpc3RSb2xlTWVtYmVyc1Jlc3BvbnNlEhEKCXJvbGVfbmFtZRgBIAEoCRI6CgdtZW1iZXJzGAIgAygLMikucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlTWVtYmVyc2hpcBIXCg9uZXh0X3BhZ2VfdG9rZW4YAyABKAkiIwoOUm9sZU1lbWJlcnNoaXASEQoJcHJpbmNpcGFsGAEgASgJIswBChtVcGRhdGVSb2xlTWVtYmVyc2hpcFJlcXVlc3QSKgoJcm9sZV9uYW1lGAEgASgJQhe6SBTIAQFyDxABGIABMgheW14sPV0rJBIOCgZjcmVhdGUYAiABKAgSNgoDYWRkGAMgAygLMikucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5Sb2xlTWVtYmVyc2hpcBI5CgZyZW1vdmUYBCADKAsyKS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGVNZW1iZXJzaGlwIsABChxVcGRhdGVSb2xlTWVtYmVyc2hpcFJlc3BvbnNlEioKCXJvbGVfbmFtZRgBIAEoCUIXukgUyAEBcg8QARiAATIIXlteLD1dKyQSOAoFYWRkZWQYAiADKAsyKS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGVNZW1iZXJzaGlwEjoKB3JlbW92ZWQYAyADKAsyKS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlJvbGVNZW1iZXJzaGlwMs0NCg9TZWN1cml0eVNlcnZpY2USkQIKCUxpc3RSb2xlcxIrLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuTGlzdFJvbGVzUmVxdWVzdBosLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuTGlzdFJvbGVzUmVzcG9uc2UiqAGSQYsBEgpMaXN0IFJvbGVzGj5MaXN0IHJvbGVzLiBPcHRpb25hbDogZmlsdGVyIGJhc2VkIG9uIHJvbGUgbmFtZSBhbmQgcHJpbmNpcGFsLko9CgMyMDASNgoCT0sSMAouGiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXNwb25zZYqmHQQIAxADgtPkkwILEgkvdjEvcm9sZXMS9QEKCkNyZWF0ZVJvbGUSLC5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkNyZWF0ZVJvbGVSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5DcmVhdGVSb2xlUmVzcG9uc2UiiQGSQWcSC0NyZWF0ZSBSb2xlGg5DcmVhdGUgYSByb2xlLkpICgMyMDESQQoMUm9sZSBjcmVhdGVkEjEKLxotLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuQ3JlYXRlUm9sZVJlc3BvbnNliqYdBAgDEAOC0+STAhE6BHJvbGUiCS92MS9yb2xlcxKMAgoHR2V0Um9sZRIpLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuR2V0Um9sZVJlcXVlc3QaKi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkdldFJvbGVSZXNwb25zZSKpAZJBgAESCEdldCBSb2xlGgtHZXQgYSByb2xlLko7CgMyMDASNAoCT0sSLgosGioucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5HZXRSb2xlUmVzcG9uc2VKKgoDNDA0EiMKCU5vdCBGb3VuZBIWChQaEi5nb29nbGUucnBjLlN0YXR1c4qmHQQIAxADgtPkkwIXEhUvdjEvcm9sZXMve3JvbGVfbmFtZX0SgwIKCkRlbGV0ZVJvbGUSLC5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkRlbGV0ZVJvbGVSZXF1ZXN0Gi0ucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5EZWxldGVSb2xlUmVzcG9uc2UilwGSQW8SC0RlbGV0ZSBSb2xlGg5EZWxldGUgYSBSb2xlLkokCgMyMDQSHQoZUm9sZSBkZWxldGVkIHN1Y2Nlc3NmdWxseRIASioKAzQwNBIjCglOb3QgRm91bmQSFgoUGhIuZ29vZ2xlLnJwYy5TdGF0dXOKph0ECAMQA4LT5JMCFyoVL3YxL3JvbGVzL3tyb2xlX25hbWV9EqUCCg9MaXN0Um9sZU1lbWJlcnMSMS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QaMi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1Jlc3BvbnNlIqoBkkF6EhFMaXN0IFJvbGUgTWVtYmVycxogTGlzdCBtZW1iZXJzIGFzc2lnbmVkIHRvIGEgcm9sZS5KQwoDMjAwEjwKAk9LEjYKNBoyLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuTGlzdFJvbGVNZW1iZXJzUmVzcG9uc2WKph0ECAMQA4LT5JMCHxIdL3YxL3JvbGVzL3tyb2xlX25hbWV9L21lbWJlcnMSyQIKFFVwZGF0ZVJvbGVNZW1iZXJzaGlwEjYucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5VcGRhdGVSb2xlTWVtYmVyc2hpcFJlcXVlc3QaNy5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLlVwZGF0ZVJvbGVNZW1iZXJzaGlwUmVzcG9uc2UivwGSQZMBEgtVcGRhdGUgUm9sZRoOVXBkYXRlIGEgcm9sZS5KSAoDMjAwEkEKAk9LEjsKORo3LnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZUoqCgM0MDQSIwoJTm90IEZvdW5kEhYKFBoSLmdvb2dsZS5ycGMuU3RhdHVziqYdBAgDEAOC0+STAho6ASoaFS92MS9yb2xlcy97cm9sZV9uYW1lfRolkkEiCghTZWN1cml0eRIWTWFuYWdlIFJlZHBhbmRhIHJvbGVzLkKSAgodY29tLnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjFCDVNlY3VyaXR5UHJvdG9QAVpbZ2l0aHViLmNvbS9yZWRwYW5kYS1kYXRhL2NvbnNvbGUvYmFja2VuZC9wa2cvcHJvdG9nZW4vcmVkcGFuZGEvYXBpL2RhdGFwbGFuZS92MTtkYXRhcGxhbmV2MaICA1JBRKoCGVJlZHBhbmRhLkFwaS5EYXRhcGxhbmUuVjHKAhlSZWRwYW5kYVxBcGlcRGF0YXBsYW5lXFYx4gIlUmVkcGFuZGFcQXBpXERhdGFwbGFuZVxWMVxHUEJNZXRhZGF0YeoCHFJlZHBhbmRhOjpBcGk6OkRhdGFwbGFuZTo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_protoc_gen_openapiv2_options_annotations, file_redpanda_api_auth_v1_authorization]); /** * Role defines a role in the system. diff --git a/proto/redpanda/api/dataplane/v1/security.proto b/proto/redpanda/api/dataplane/v1/security.proto index 4cbada39d0..4df435a79c 100644 --- a/proto/redpanda/api/dataplane/v1/security.proto +++ b/proto/redpanda/api/dataplane/v1/security.proto @@ -219,7 +219,7 @@ service SecurityService { } }; option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_VIEW + required_permission: PERMISSION_ADMIN api: API_REDPANDA_ADMIN }; } @@ -274,7 +274,7 @@ service SecurityService { } }; option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_VIEW + required_permission: PERMISSION_ADMIN api: API_REDPANDA_ADMIN }; } @@ -325,7 +325,7 @@ service SecurityService { } }; option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_VIEW + required_permission: PERMISSION_ADMIN api: API_REDPANDA_ADMIN }; } diff --git a/taskfiles/proto.yaml b/taskfiles/proto.yaml index aa406586a8..1662ce0dfa 100644 --- a/taskfiles/proto.yaml +++ b/taskfiles/proto.yaml @@ -56,7 +56,7 @@ tasks: {{ .PATH_PREFIX }} buf generate --template=proto/buf.gen.yaml - for: { var: BUF_INPUTS } cmd: "{{ .PATH_PREFIX }} buf generate --template={{ .ITEM }}/buf.gen.yaml {{ .ITEM }}" - - "{{ .PATH_PREFIX }} buf generate --template=proto/buf.gen.yaml buf.build/redpandadata/common:3f349e63f44a494ead60d43089c654ee" + - "{{ .PATH_PREFIX }} buf generate --template=proto/buf.gen.yaml buf.build/redpandadata/common" - task: :backend:fmt - task: generate-openapi3 - if [[ $CI == "true" ]]; then git diff -w --exit-code; fi From 72e8fa423b3e276ef6b4d14d0ce8530ee7d1d422 Mon Sep 17 00:00:00 2001 From: Bojan Djurkovic Date: Mon, 5 May 2025 10:49:01 -0300 Subject: [PATCH 13/13] proto: make all security api permissions admin in console service --- .../protogen/redpanda/api/console/v1alpha1/security.pb.go | 6 +++--- .../protogen/redpanda/api/console/v1alpha1/security_pb.ts | 2 +- proto/redpanda/api/console/v1alpha1/security.proto | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go b/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go index 8dd016842a..8bff2bfb4b 100644 --- a/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go +++ b/backend/pkg/protogen/redpanda/api/console/v1alpha1/security.pb.go @@ -659,7 +659,7 @@ var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x7b, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x43, 0x72, @@ -674,7 +674,7 @@ var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x7b, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x44, @@ -691,7 +691,7 @@ var file_redpanda_api_console_v1alpha1_security_proto_rawDesc = []byte{ 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x01, 0x10, 0x03, 0x12, 0x99, 0x01, 0x0a, 0x14, 0x55, + 0x22, 0x08, 0x8a, 0xa6, 0x1d, 0x04, 0x08, 0x03, 0x10, 0x03, 0x12, 0x99, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x12, 0x3a, 0x2e, 0x72, 0x65, 0x64, 0x70, 0x61, 0x6e, 0x64, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, diff --git a/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts b/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts index ddf35516b5..3d8cd55223 100644 --- a/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts +++ b/frontend/src/protogen/redpanda/api/console/v1alpha1/security_pb.ts @@ -13,7 +13,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file redpanda/api/console/v1alpha1/security.proto. */ export const file_redpanda_api_console_v1alpha1_security: GenFile = /*@__PURE__*/ - fileDesc("CixyZWRwYW5kYS9hcGkvY29uc29sZS92MWFscGhhMS9zZWN1cml0eS5wcm90bxIdcmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEiUAoQTGlzdFJvbGVzUmVxdWVzdBI8CgdyZXF1ZXN0GAEgASgLMisucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXF1ZXN0IlMKEUxpc3RSb2xlc1Jlc3BvbnNlEj4KCHJlc3BvbnNlGAEgASgLMiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXNwb25zZSJSChFDcmVhdGVSb2xlUmVxdWVzdBI9CgdyZXF1ZXN0GAEgASgLMiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5DcmVhdGVSb2xlUmVxdWVzdCJVChJDcmVhdGVSb2xlUmVzcG9uc2USPwoIcmVzcG9uc2UYASABKAsyLS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkNyZWF0ZVJvbGVSZXNwb25zZSJMCg5HZXRSb2xlUmVxdWVzdBI6CgdyZXF1ZXN0GAEgASgLMikucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5HZXRSb2xlUmVxdWVzdCJPCg9HZXRSb2xlUmVzcG9uc2USPAoIcmVzcG9uc2UYASABKAsyKi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkdldFJvbGVSZXNwb25zZSJSChFEZWxldGVSb2xlUmVxdWVzdBI9CgdyZXF1ZXN0GAEgASgLMiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5EZWxldGVSb2xlUmVxdWVzdCJVChJEZWxldGVSb2xlUmVzcG9uc2USPwoIcmVzcG9uc2UYASABKAsyLS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkRlbGV0ZVJvbGVSZXNwb25zZSJcChZMaXN0Um9sZU1lbWJlcnNSZXF1ZXN0EkIKB3JlcXVlc3QYASABKAsyMS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QiXwoXTGlzdFJvbGVNZW1iZXJzUmVzcG9uc2USRAoIcmVzcG9uc2UYASABKAsyMi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1Jlc3BvbnNlImYKG1VwZGF0ZVJvbGVNZW1iZXJzaGlwUmVxdWVzdBJHCgdyZXF1ZXN0GAEgASgLMjYucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5VcGRhdGVSb2xlTWVtYmVyc2hpcFJlcXVlc3QiaQocVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZRJJCghyZXNwb25zZRgBIAEoCzI3LnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZTKiBgoPU2VjdXJpdHlTZXJ2aWNlEngKCUxpc3RSb2xlcxIvLnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkxpc3RSb2xlc1JlcXVlc3QaMC5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5MaXN0Um9sZXNSZXNwb25zZSIIiqYdBAgBEAMSewoKQ3JlYXRlUm9sZRIwLnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkNyZWF0ZVJvbGVSZXF1ZXN0GjEucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuQ3JlYXRlUm9sZVJlc3BvbnNlIgiKph0ECAMQAxJyCgdHZXRSb2xlEi0ucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuR2V0Um9sZVJlcXVlc3QaLi5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5HZXRSb2xlUmVzcG9uc2UiCIqmHQQIARADEnsKCkRlbGV0ZVJvbGUSMC5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5EZWxldGVSb2xlUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkRlbGV0ZVJvbGVSZXNwb25zZSIIiqYdBAgDEAMSigEKD0xpc3RSb2xlTWVtYmVycxI1LnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QaNi5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5MaXN0Um9sZU1lbWJlcnNSZXNwb25zZSIIiqYdBAgBEAMSmQEKFFVwZGF0ZVJvbGVNZW1iZXJzaGlwEjoucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXF1ZXN0GjsucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZSIIiqYdBAgDEANCrgIKIWNvbS5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMUINU2VjdXJpdHlQcm90b1ABWmNnaXRodWIuY29tL3JlZHBhbmRhLWRhdGEvY29uc29sZS9iYWNrZW5kL3BrZy9wcm90b2dlbi9yZWRwYW5kYS9hcGkvY29uc29sZS92MWFscGhhMTtjb25zb2xldjFhbHBoYTGiAgNSQUOqAh1SZWRwYW5kYS5BcGkuQ29uc29sZS5WMWFscGhhMcoCHVJlZHBhbmRhXEFwaVxDb25zb2xlXFYxYWxwaGEx4gIpUmVkcGFuZGFcQXBpXENvbnNvbGVcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAiBSZWRwYW5kYTo6QXBpOjpDb25zb2xlOjpWMWFscGhhMWIGcHJvdG8z", [file_redpanda_api_auth_v1_authorization, file_redpanda_api_dataplane_v1_security]); + fileDesc("CixyZWRwYW5kYS9hcGkvY29uc29sZS92MWFscGhhMS9zZWN1cml0eS5wcm90bxIdcmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEiUAoQTGlzdFJvbGVzUmVxdWVzdBI8CgdyZXF1ZXN0GAEgASgLMisucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXF1ZXN0IlMKEUxpc3RSb2xlc1Jlc3BvbnNlEj4KCHJlc3BvbnNlGAEgASgLMiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5MaXN0Um9sZXNSZXNwb25zZSJSChFDcmVhdGVSb2xlUmVxdWVzdBI9CgdyZXF1ZXN0GAEgASgLMiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5DcmVhdGVSb2xlUmVxdWVzdCJVChJDcmVhdGVSb2xlUmVzcG9uc2USPwoIcmVzcG9uc2UYASABKAsyLS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkNyZWF0ZVJvbGVSZXNwb25zZSJMCg5HZXRSb2xlUmVxdWVzdBI6CgdyZXF1ZXN0GAEgASgLMikucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5HZXRSb2xlUmVxdWVzdCJPCg9HZXRSb2xlUmVzcG9uc2USPAoIcmVzcG9uc2UYASABKAsyKi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkdldFJvbGVSZXNwb25zZSJSChFEZWxldGVSb2xlUmVxdWVzdBI9CgdyZXF1ZXN0GAEgASgLMiwucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5EZWxldGVSb2xlUmVxdWVzdCJVChJEZWxldGVSb2xlUmVzcG9uc2USPwoIcmVzcG9uc2UYASABKAsyLS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkRlbGV0ZVJvbGVSZXNwb25zZSJcChZMaXN0Um9sZU1lbWJlcnNSZXF1ZXN0EkIKB3JlcXVlc3QYASABKAsyMS5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QiXwoXTGlzdFJvbGVNZW1iZXJzUmVzcG9uc2USRAoIcmVzcG9uc2UYASABKAsyMi5yZWRwYW5kYS5hcGkuZGF0YXBsYW5lLnYxLkxpc3RSb2xlTWVtYmVyc1Jlc3BvbnNlImYKG1VwZGF0ZVJvbGVNZW1iZXJzaGlwUmVxdWVzdBJHCgdyZXF1ZXN0GAEgASgLMjYucmVkcGFuZGEuYXBpLmRhdGFwbGFuZS52MS5VcGRhdGVSb2xlTWVtYmVyc2hpcFJlcXVlc3QiaQocVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZRJJCghyZXNwb25zZRgBIAEoCzI3LnJlZHBhbmRhLmFwaS5kYXRhcGxhbmUudjEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZTKiBgoPU2VjdXJpdHlTZXJ2aWNlEngKCUxpc3RSb2xlcxIvLnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkxpc3RSb2xlc1JlcXVlc3QaMC5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5MaXN0Um9sZXNSZXNwb25zZSIIiqYdBAgDEAMSewoKQ3JlYXRlUm9sZRIwLnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkNyZWF0ZVJvbGVSZXF1ZXN0GjEucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuQ3JlYXRlUm9sZVJlc3BvbnNlIgiKph0ECAMQAxJyCgdHZXRSb2xlEi0ucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuR2V0Um9sZVJlcXVlc3QaLi5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5HZXRSb2xlUmVzcG9uc2UiCIqmHQQIAxADEnsKCkRlbGV0ZVJvbGUSMC5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5EZWxldGVSb2xlUmVxdWVzdBoxLnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkRlbGV0ZVJvbGVSZXNwb25zZSIIiqYdBAgDEAMSigEKD0xpc3RSb2xlTWVtYmVycxI1LnJlZHBhbmRhLmFwaS5jb25zb2xlLnYxYWxwaGExLkxpc3RSb2xlTWVtYmVyc1JlcXVlc3QaNi5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMS5MaXN0Um9sZU1lbWJlcnNSZXNwb25zZSIIiqYdBAgDEAMSmQEKFFVwZGF0ZVJvbGVNZW1iZXJzaGlwEjoucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXF1ZXN0GjsucmVkcGFuZGEuYXBpLmNvbnNvbGUudjFhbHBoYTEuVXBkYXRlUm9sZU1lbWJlcnNoaXBSZXNwb25zZSIIiqYdBAgDEANCrgIKIWNvbS5yZWRwYW5kYS5hcGkuY29uc29sZS52MWFscGhhMUINU2VjdXJpdHlQcm90b1ABWmNnaXRodWIuY29tL3JlZHBhbmRhLWRhdGEvY29uc29sZS9iYWNrZW5kL3BrZy9wcm90b2dlbi9yZWRwYW5kYS9hcGkvY29uc29sZS92MWFscGhhMTtjb25zb2xldjFhbHBoYTGiAgNSQUOqAh1SZWRwYW5kYS5BcGkuQ29uc29sZS5WMWFscGhhMcoCHVJlZHBhbmRhXEFwaVxDb25zb2xlXFYxYWxwaGEx4gIpUmVkcGFuZGFcQXBpXENvbnNvbGVcVjFhbHBoYTFcR1BCTWV0YWRhdGHqAiBSZWRwYW5kYTo6QXBpOjpDb25zb2xlOjpWMWFscGhhMWIGcHJvdG8z", [file_redpanda_api_auth_v1_authorization, file_redpanda_api_dataplane_v1_security]); /** * ListRolesRequest is the request for ListRoles. diff --git a/proto/redpanda/api/console/v1alpha1/security.proto b/proto/redpanda/api/console/v1alpha1/security.proto index 387d9887d9..e3877972db 100644 --- a/proto/redpanda/api/console/v1alpha1/security.proto +++ b/proto/redpanda/api/console/v1alpha1/security.proto @@ -69,7 +69,7 @@ service SecurityService { // ListRoles lists all the roles based on optional filter. rpc ListRoles(ListRolesRequest) returns (ListRolesResponse) { option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_VIEW + required_permission: PERMISSION_ADMIN api: API_REDPANDA_ADMIN }; } @@ -84,7 +84,7 @@ service SecurityService { // GetRole retrieves the specific role. rpc GetRole(GetRoleRequest) returns (GetRoleResponse) { option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_VIEW + required_permission: PERMISSION_ADMIN api: API_REDPANDA_ADMIN }; } @@ -100,7 +100,7 @@ service SecurityService { // ListRoleMembership lists all the members assigned to a role based on optional filter. rpc ListRoleMembers(ListRoleMembersRequest) returns (ListRoleMembersResponse) { option (redpanda.api.auth.v1.authorization) = { - required_permission: PERMISSION_VIEW + required_permission: PERMISSION_ADMIN api: API_REDPANDA_ADMIN }; }