diff --git a/gen/go/qdrant/cloud/booking/v1/booking.pb.go b/gen/go/qdrant/cloud/booking/v1/booking.pb.go index c776394b..036a87d6 100644 --- a/gen/go/qdrant/cloud/booking/v1/booking.pb.go +++ b/gen/go/qdrant/cloud/booking/v1/booking.pb.go @@ -702,6 +702,183 @@ func (x *ResourceConfiguration) GetDisk() string { return "" } +// GetQuoteRequest is the request for the GetQuote function +type GetQuoteRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The identifier of the account (in GUID format). + // This is a required field. + AccountId string `protobuf:"bytes,1,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"` + // The cloud provider where the cluster will be hosted. + // Must match one of the provider IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviders` method. + CloudProviderId string `protobuf:"bytes,2,opt,name=cloud_provider_id,json=cloudProviderId,proto3" json:"cloud_provider_id,omitempty"` + // The cloud region where the cluster will be hosted. + // Must match one of the region IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviderRegions` method. + // This field can be omitted if `cloud_provider_id` is set to `hybrid`. + CloudProviderRegionId *string `protobuf:"bytes,3,opt,name=cloud_provider_region_id,json=cloudProviderRegionId,proto3,oneof" json:"cloud_provider_region_id,omitempty"` + // The number of nodes in a cluster. + // This should be a number 1...100 [both included]. + // This is a required field. + NumberOfNodes uint32 `protobuf:"varint,4,opt,name=number_of_nodes,json=numberOfNodes,proto3" json:"number_of_nodes,omitempty"` + // The package identifier used to configure the resources of the cluster. + // Use `qdrant.cloud.booking.v1.BookingService.ListPackages` to select one. + // This is a required field. + PackageId string `protobuf:"bytes,5,opt,name=package_id,json=packageId,proto3" json:"package_id,omitempty"` + // The additional disk storage in GiB on top of the selected package. + // This is an optional field, if not specified additional disk is 0. + AdditionalDiskGib uint32 `protobuf:"varint,6,opt,name=additional_disk_gib,json=additionalDiskGib,proto3" json:"additional_disk_gib,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetQuoteRequest) Reset() { + *x = GetQuoteRequest{} + mi := &file_qdrant_cloud_booking_v1_booking_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetQuoteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetQuoteRequest) ProtoMessage() {} + +func (x *GetQuoteRequest) ProtoReflect() protoreflect.Message { + mi := &file_qdrant_cloud_booking_v1_booking_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 GetQuoteRequest.ProtoReflect.Descriptor instead. +func (*GetQuoteRequest) Descriptor() ([]byte, []int) { + return file_qdrant_cloud_booking_v1_booking_proto_rawDescGZIP(), []int{9} +} + +func (x *GetQuoteRequest) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *GetQuoteRequest) GetCloudProviderId() string { + if x != nil { + return x.CloudProviderId + } + return "" +} + +func (x *GetQuoteRequest) GetCloudProviderRegionId() string { + if x != nil && x.CloudProviderRegionId != nil { + return *x.CloudProviderRegionId + } + return "" +} + +func (x *GetQuoteRequest) GetNumberOfNodes() uint32 { + if x != nil { + return x.NumberOfNodes + } + return 0 +} + +func (x *GetQuoteRequest) GetPackageId() string { + if x != nil { + return x.PackageId + } + return "" +} + +func (x *GetQuoteRequest) GetAdditionalDiskGib() uint32 { + if x != nil { + return x.AdditionalDiskGib + } + return 0 +} + +// GetQuoteResponse is the response from the GetQuote function +type GetQuoteResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The currency of the prices. + // Specifies the currency in which the prices are denominated. + // Must be a 3-letter ISO 4217 currency code (e.g., "USD"). + Currency string `protobuf:"bytes,1,opt,name=currency,proto3" json:"currency,omitempty"` + // The original price per hour in millicents, before any discounts. + OriginalPricePerHour int64 `protobuf:"varint,2,opt,name=original_price_per_hour,json=originalPricePerHour,proto3" json:"original_price_per_hour,omitempty"` + // The discounted price per hour in millicents, after applying discounts. + // If no discounts are applied, this will be the same as original_price_per_hour. + DiscountedPricePerHour int64 `protobuf:"varint,3,opt,name=discounted_price_per_hour,json=discountedPricePerHour,proto3" json:"discounted_price_per_hour,omitempty"` + // The percentage of discount applied (e.g., 10.0 for 10% discount). + // If no discounts are applied, this will be 0.0. + DiscountPercentage float64 `protobuf:"fixed64,4,opt,name=discount_percentage,json=discountPercentage,proto3" json:"discount_percentage,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetQuoteResponse) Reset() { + *x = GetQuoteResponse{} + mi := &file_qdrant_cloud_booking_v1_booking_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetQuoteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetQuoteResponse) ProtoMessage() {} + +func (x *GetQuoteResponse) ProtoReflect() protoreflect.Message { + mi := &file_qdrant_cloud_booking_v1_booking_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 GetQuoteResponse.ProtoReflect.Descriptor instead. +func (*GetQuoteResponse) Descriptor() ([]byte, []int) { + return file_qdrant_cloud_booking_v1_booking_proto_rawDescGZIP(), []int{10} +} + +func (x *GetQuoteResponse) GetCurrency() string { + if x != nil { + return x.Currency + } + return "" +} + +func (x *GetQuoteResponse) GetOriginalPricePerHour() int64 { + if x != nil { + return x.OriginalPricePerHour + } + return 0 +} + +func (x *GetQuoteResponse) GetDiscountedPricePerHour() int64 { + if x != nil { + return x.DiscountedPricePerHour + } + return 0 +} + +func (x *GetQuoteResponse) GetDiscountPercentage() float64 { + if x != nil { + return x.DiscountPercentage + } + return 0 +} + var File_qdrant_cloud_booking_v1_booking_proto protoreflect.FileDescriptor const file_qdrant_cloud_booking_v1_booking_proto_rawDesc = "" + @@ -749,7 +926,24 @@ const file_qdrant_cloud_booking_v1_booking_proto_rawDesc = "" + "\x15ResourceConfiguration\x12\x19\n" + "\x03ram\x18\x01 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x03ram\x12\x19\n" + "\x03cpu\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x03cpu\x12\x1b\n" + - "\x04disk\x18\x03 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04disk*j\n" + + "\x04disk\x18\x03 \x01(\tB\a\xbaH\x04r\x02\x10\x01R\x04disk\"\xb5\x04\n" + + "\x0fGetQuoteRequest\x12'\n" + + "\n" + + "account_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x123\n" + + "\x11cloud_provider_id\x18\x02 \x01(\tB\a\xbaH\x04r\x02\x10\x03R\x0fcloudProviderId\x12E\n" + + "\x18cloud_provider_region_id\x18\x03 \x01(\tB\a\xbaH\x04r\x02\x10\x01H\x00R\x15cloudProviderRegionId\x88\x01\x01\x121\n" + + "\x0fnumber_of_nodes\x18\x04 \x01(\rB\t\xbaH\x06*\x04\x18d(\x01R\rnumberOfNodes\x12'\n" + + "\n" + + "package_id\x18\x05 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\tpackageId\x127\n" + + "\x13additional_disk_gib\x18\x06 \x01(\rB\a\xbaH\x04*\x02(\x00R\x11additionalDiskGib:\xca\x01\xbaH\xc6\x01\x1a\xc3\x01\n" + + "*get_quote.cloud_provider_region_id_present\x12Kcloud_provider_region_id is required when cloud_provider_id is not 'hybrid'\x1aHthis.cloud_provider_id == 'hybrid' || has(this.cloud_provider_region_id)B\x1b\n" + + "\x19_cloud_provider_region_id\"\x8f\x02\n" + + "\x10GetQuoteResponse\x12-\n" + + "\bcurrency\x18\x01 \x01(\tB\x11\xbaH\x0er\f2\n" + + "^[A-Z]{3}$R\bcurrency\x12>\n" + + "\x17original_price_per_hour\x18\x02 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x14originalPricePerHour\x12B\n" + + "\x19discounted_price_per_hour\x18\x03 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x16discountedPricePerHour\x12H\n" + + "\x13discount_percentage\x18\x04 \x01(\x01B\x17\xbaH\x14\x12\x12\x19\x00\x00\x00\x00\x00\x00Y@)\x00\x00\x00\x00\x00\x00\x00\x00R\x12discountPercentage*j\n" + "\rPackageStatus\x12\x1e\n" + "\x1aPACKAGE_STATUS_UNSPECIFIED\x10\x00\x12\x19\n" + "\x15PACKAGE_STATUS_ACTIVE\x10\x01\x12\x1e\n" + @@ -757,7 +951,7 @@ const file_qdrant_cloud_booking_v1_booking_proto_rawDesc = "" + "\vPackageTier\x12#\n" + "\x1fPACKAGE_TIER_STATUS_UNSPECIFIED\x10\x00\x12\x19\n" + "\x15PACKAGE_TIER_STANDARD\x10\x01\x12\x18\n" + - "\x14PACKAGE_TIER_PREMIUM\x10\x022\xe3\x05\n" + + "\x14PACKAGE_TIER_PREMIUM\x10\x022\x8f\a\n" + "\x0eBookingService\x12\x8a\x02\n" + "\fListPackages\x12,.qdrant.cloud.booking.v1.ListPackagesRequest\x1a-.qdrant.cloud.booking.v1.ListPackagesResponse\"\x9c\x01\x8a\xb5\x18\x00\xba\xb5\x18&\n" + "\x11cloud_provider_id\x12\x11cloud_provider_id\xba\xb5\x184\n" + @@ -768,7 +962,8 @@ const file_qdrant_cloud_booking_v1_booking_proto_rawDesc = "" + "package_id\x12\x02id\x82\xd3\xe4\x93\x025\x123/api/booking/v1/accounts/{account_id}/packages/{id}\x12\x86\x02\n" + "\x12ListGlobalPackages\x122.qdrant.cloud.booking.v1.ListGlobalPackagesRequest\x1a3.qdrant.cloud.booking.v1.ListGlobalPackagesResponse\"\x86\x01\x98\xb5\x18\x00\xba\xb5\x18&\n" + "\x11cloud_provider_id\x12\x11cloud_provider_id\xba\xb5\x184\n" + - "\x18cloud_provider_region_id\x12\x18cloud_provider_region_id\x82\xd3\xe4\x93\x02\x1a\x12\x18/api/booking/v1/packagesB\xfe\x01\n" + + "\x18cloud_provider_region_id\x12\x18cloud_provider_region_id\x82\xd3\xe4\x93\x02\x1a\x12\x18/api/booking/v1/packages\x12\xa9\x01\n" + + "\bGetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\"H\x8a\xb5\x18\x0ewrite:clusters\x82\xd3\xe4\x93\x020:\x01*\"+/api/booking/v1/accounts/{account_id}/quoteB\xfe\x01\n" + "\x1bcom.qdrant.cloud.booking.v1B\fBookingProtoP\x01ZRgithub.com/qdrant/qdrant-cloud-public-api/gen/go/qdrant/cloud/booking/v1;bookingv1\xa2\x02\x03QCB\xaa\x02\x17Qdrant.Cloud.Booking.V1\xca\x02\x17Qdrant\\Cloud\\Booking\\V1\xe2\x02#Qdrant\\Cloud\\Booking\\V1\\GPBMetadata\xea\x02\x1aQdrant::Cloud::Booking::V1b\x06proto3" var ( @@ -784,7 +979,7 @@ func file_qdrant_cloud_booking_v1_booking_proto_rawDescGZIP() []byte { } var file_qdrant_cloud_booking_v1_booking_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_qdrant_cloud_booking_v1_booking_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_qdrant_cloud_booking_v1_booking_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_qdrant_cloud_booking_v1_booking_proto_goTypes = []any{ (PackageStatus)(0), // 0: qdrant.cloud.booking.v1.PackageStatus (PackageTier)(0), // 1: qdrant.cloud.booking.v1.PackageTier @@ -797,6 +992,8 @@ var file_qdrant_cloud_booking_v1_booking_proto_goTypes = []any{ (*Package)(nil), // 8: qdrant.cloud.booking.v1.Package (*AvailableAdditionalResources)(nil), // 9: qdrant.cloud.booking.v1.AvailableAdditionalResources (*ResourceConfiguration)(nil), // 10: qdrant.cloud.booking.v1.ResourceConfiguration + (*GetQuoteRequest)(nil), // 11: qdrant.cloud.booking.v1.GetQuoteRequest + (*GetQuoteResponse)(nil), // 12: qdrant.cloud.booking.v1.GetQuoteResponse } var file_qdrant_cloud_booking_v1_booking_proto_depIdxs = []int32{ 0, // 0: qdrant.cloud.booking.v1.ListPackagesRequest.statuses:type_name -> qdrant.cloud.booking.v1.PackageStatus @@ -810,11 +1007,13 @@ var file_qdrant_cloud_booking_v1_booking_proto_depIdxs = []int32{ 2, // 8: qdrant.cloud.booking.v1.BookingService.ListPackages:input_type -> qdrant.cloud.booking.v1.ListPackagesRequest 6, // 9: qdrant.cloud.booking.v1.BookingService.GetPackage:input_type -> qdrant.cloud.booking.v1.GetPackageRequest 4, // 10: qdrant.cloud.booking.v1.BookingService.ListGlobalPackages:input_type -> qdrant.cloud.booking.v1.ListGlobalPackagesRequest - 3, // 11: qdrant.cloud.booking.v1.BookingService.ListPackages:output_type -> qdrant.cloud.booking.v1.ListPackagesResponse - 7, // 12: qdrant.cloud.booking.v1.BookingService.GetPackage:output_type -> qdrant.cloud.booking.v1.GetPackageResponse - 5, // 13: qdrant.cloud.booking.v1.BookingService.ListGlobalPackages:output_type -> qdrant.cloud.booking.v1.ListGlobalPackagesResponse - 11, // [11:14] is the sub-list for method output_type - 8, // [8:11] is the sub-list for method input_type + 11, // 11: qdrant.cloud.booking.v1.BookingService.GetQuote:input_type -> qdrant.cloud.booking.v1.GetQuoteRequest + 3, // 12: qdrant.cloud.booking.v1.BookingService.ListPackages:output_type -> qdrant.cloud.booking.v1.ListPackagesResponse + 7, // 13: qdrant.cloud.booking.v1.BookingService.GetPackage:output_type -> qdrant.cloud.booking.v1.GetPackageResponse + 5, // 14: qdrant.cloud.booking.v1.BookingService.ListGlobalPackages:output_type -> qdrant.cloud.booking.v1.ListGlobalPackagesResponse + 12, // 15: qdrant.cloud.booking.v1.BookingService.GetQuote:output_type -> qdrant.cloud.booking.v1.GetQuoteResponse + 12, // [12:16] is the sub-list for method output_type + 8, // [8:12] is the sub-list for method input_type 8, // [8:8] is the sub-list for extension type_name 8, // [8:8] is the sub-list for extension extendee 0, // [0:8] is the sub-list for field type_name @@ -828,13 +1027,14 @@ func file_qdrant_cloud_booking_v1_booking_proto_init() { file_qdrant_cloud_booking_v1_booking_proto_msgTypes[0].OneofWrappers = []any{} file_qdrant_cloud_booking_v1_booking_proto_msgTypes[2].OneofWrappers = []any{} file_qdrant_cloud_booking_v1_booking_proto_msgTypes[6].OneofWrappers = []any{} + file_qdrant_cloud_booking_v1_booking_proto_msgTypes[9].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_qdrant_cloud_booking_v1_booking_proto_rawDesc), len(file_qdrant_cloud_booking_v1_booking_proto_rawDesc)), NumEnums: 2, - NumMessages: 9, + NumMessages: 11, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/qdrant/cloud/booking/v1/booking_grpc.pb.go b/gen/go/qdrant/cloud/booking/v1/booking_grpc.pb.go index bf655b42..e6297d58 100644 --- a/gen/go/qdrant/cloud/booking/v1/booking_grpc.pb.go +++ b/gen/go/qdrant/cloud/booking/v1/booking_grpc.pb.go @@ -22,6 +22,7 @@ const ( BookingService_ListPackages_FullMethodName = "/qdrant.cloud.booking.v1.BookingService/ListPackages" BookingService_GetPackage_FullMethodName = "/qdrant.cloud.booking.v1.BookingService/GetPackage" BookingService_ListGlobalPackages_FullMethodName = "/qdrant.cloud.booking.v1.BookingService/ListGlobalPackages" + BookingService_GetQuote_FullMethodName = "/qdrant.cloud.booking.v1.BookingService/GetQuote" ) // BookingServiceClient is the client API for BookingService service. @@ -41,6 +42,12 @@ type BookingServiceClient interface { // Lists all public packages. // Authentication not required ListGlobalPackages(ctx context.Context, in *ListGlobalPackagesRequest, opts ...grpc.CallOption) (*ListGlobalPackagesResponse, error) + // Gets a price quote for a cluster configuration. + // This endpoint calculates pricing information including hourly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - write:clusters + GetQuote(ctx context.Context, in *GetQuoteRequest, opts ...grpc.CallOption) (*GetQuoteResponse, error) } type bookingServiceClient struct { @@ -81,6 +88,16 @@ func (c *bookingServiceClient) ListGlobalPackages(ctx context.Context, in *ListG return out, nil } +func (c *bookingServiceClient) GetQuote(ctx context.Context, in *GetQuoteRequest, opts ...grpc.CallOption) (*GetQuoteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetQuoteResponse) + err := c.cc.Invoke(ctx, BookingService_GetQuote_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // BookingServiceServer is the server API for BookingService service. // All implementations must embed UnimplementedBookingServiceServer // for forward compatibility. @@ -98,6 +115,12 @@ type BookingServiceServer interface { // Lists all public packages. // Authentication not required ListGlobalPackages(context.Context, *ListGlobalPackagesRequest) (*ListGlobalPackagesResponse, error) + // Gets a price quote for a cluster configuration. + // This endpoint calculates pricing information including hourly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - write:clusters + GetQuote(context.Context, *GetQuoteRequest) (*GetQuoteResponse, error) mustEmbedUnimplementedBookingServiceServer() } @@ -117,6 +140,9 @@ func (UnimplementedBookingServiceServer) GetPackage(context.Context, *GetPackage func (UnimplementedBookingServiceServer) ListGlobalPackages(context.Context, *ListGlobalPackagesRequest) (*ListGlobalPackagesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListGlobalPackages not implemented") } +func (UnimplementedBookingServiceServer) GetQuote(context.Context, *GetQuoteRequest) (*GetQuoteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetQuote not implemented") +} func (UnimplementedBookingServiceServer) mustEmbedUnimplementedBookingServiceServer() {} func (UnimplementedBookingServiceServer) testEmbeddedByValue() {} @@ -192,6 +218,24 @@ func _BookingService_ListGlobalPackages_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _BookingService_GetQuote_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetQuoteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookingServiceServer).GetQuote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: BookingService_GetQuote_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookingServiceServer).GetQuote(ctx, req.(*GetQuoteRequest)) + } + return interceptor(ctx, in, info, handler) +} + // BookingService_ServiceDesc is the grpc.ServiceDesc for BookingService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -211,6 +255,10 @@ var BookingService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListGlobalPackages", Handler: _BookingService_ListGlobalPackages_Handler, }, + { + MethodName: "GetQuote", + Handler: _BookingService_GetQuote_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "qdrant/cloud/booking/v1/booking.proto", diff --git a/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json b/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json index 13f085dd..8e2f5729 100644 --- a/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json +++ b/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json @@ -117,6 +117,46 @@ ] } }, + "/api/booking/v1/accounts/{accountId}/quote": { + "post": { + "summary": "Gets a price quote for a cluster configuration.\nThis endpoint calculates pricing information including hourly costs,\nand any applicable discounts for the specified cluster configuration.\nRequired permissions:\n- write:clusters", + "operationId": "BookingService_GetQuote", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/v1GetQuoteResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googlerpcStatus" + } + } + }, + "parameters": [ + { + "name": "accountId", + "description": "The identifier of the account (in GUID format).\nThis is a required field.", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/BookingServiceGetQuoteBody" + } + } + ], + "tags": [ + "BookingService" + ] + } + }, "/api/booking/v1/packages": { "get": { "summary": "Lists all public packages.\nAuthentication not required", @@ -158,6 +198,34 @@ } }, "definitions": { + "BookingServiceGetQuoteBody": { + "type": "object", + "properties": { + "cloudProviderId": { + "type": "string", + "description": "The cloud provider where the cluster will be hosted.\nMust match one of the provider IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviders` method." + }, + "cloudProviderRegionId": { + "type": "string", + "description": "The cloud region where the cluster will be hosted.\nMust match one of the region IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviderRegions` method.\nThis field can be omitted if `cloud_provider_id` is set to `hybrid`." + }, + "numberOfNodes": { + "type": "integer", + "format": "int64", + "description": "The number of nodes in a cluster.\nThis should be a number 1...100 [both included].\nThis is a required field." + }, + "packageId": { + "type": "string", + "description": "The package identifier used to configure the resources of the cluster.\nUse `qdrant.cloud.booking.v1.BookingService.ListPackages` to select one.\nThis is a required field." + }, + "additionalDiskGib": { + "type": "integer", + "format": "int64", + "description": "The additional disk storage in GiB on top of the selected package.\nThis is an optional field, if not specified additional disk is 0." + } + }, + "title": "GetQuoteRequest is the request for the GetQuote function" + }, "googlerpcStatus": { "type": "object", "properties": { @@ -207,6 +275,31 @@ }, "title": "GetPackageResponse is the response from the GetPackage function" }, + "v1GetQuoteResponse": { + "type": "object", + "properties": { + "currency": { + "type": "string", + "description": "The currency of the prices.\nSpecifies the currency in which the prices are denominated.\nMust be a 3-letter ISO 4217 currency code (e.g., \"USD\")." + }, + "originalPricePerHour": { + "type": "string", + "format": "int64", + "description": "The original price per hour in millicents, before any discounts." + }, + "discountedPricePerHour": { + "type": "string", + "format": "int64", + "description": "The discounted price per hour in millicents, after applying discounts.\nIf no discounts are applied, this will be the same as original_price_per_hour." + }, + "discountPercentage": { + "type": "number", + "format": "double", + "description": "The percentage of discount applied (e.g., 10.0 for 10% discount).\nIf no discounts are applied, this will be 0.0." + } + }, + "title": "GetQuoteResponse is the response from the GetQuote function" + }, "v1ListGlobalPackagesResponse": { "type": "object", "properties": { diff --git a/gen/python/qdrant/cloud/booking/v1/booking_pb2.py b/gen/python/qdrant/cloud/booking/v1/booking_pb2.py index 5a201cfd..ba812195 100644 --- a/gen/python/qdrant/cloud/booking/v1/booking_pb2.py +++ b/gen/python/qdrant/cloud/booking/v1/booking_pb2.py @@ -27,7 +27,7 @@ from qdrant.cloud.common.v1 import common_pb2 as qdrant_dot_cloud_dot_common_dot_v1_dot_common__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%qdrant/cloud/booking/v1/booking.proto\x12\x17qdrant.cloud.booking.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1cgoogle/api/annotations.proto\x1a#qdrant/cloud/common/v1/common.proto\"\xec\x03\n\x13ListPackagesRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x33\n\x11\x63loud_provider_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x0f\x63loudProviderId\x12\x45\n\x18\x63loud_provider_region_id\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x15\x63loudProviderRegionId\x88\x01\x01\x12\x42\n\x08statuses\x18\x04 \x03(\x0e\x32&.qdrant.cloud.booking.v1.PackageStatusR\x08statuses:\xce\x01\xbaH\xca\x01\x1a\xc7\x01\n.list_packages.cloud_provider_region_id_present\x12Kcloud_provider_region_id is required when cloud_provider_id is not \'hybrid\'\x1aHthis.cloud_provider_id == \'hybrid\' || has(this.cloud_provider_region_id)B\x1b\n\x19_cloud_provider_region_id\"N\n\x14ListPackagesResponse\x12\x36\n\x05items\x18\x01 \x03(\x0b\x32 .qdrant.cloud.booking.v1.PackageR\x05items\"\x8c\x03\n\x19ListGlobalPackagesRequest\x12\x33\n\x11\x63loud_provider_id\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x0f\x63loudProviderId\x12\x45\n\x18\x63loud_provider_region_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x15\x63loudProviderRegionId\x88\x01\x01:\xd5\x01\xbaH\xd1\x01\x1a\xce\x01\n5list_global_packages.cloud_provider_region_id_present\x12Kcloud_provider_region_id is required when cloud_provider_id is not \'hybrid\'\x1aHthis.cloud_provider_id == \'hybrid\' || has(this.cloud_provider_region_id)B\x1b\n\x19_cloud_provider_region_id\"T\n\x1aListGlobalPackagesResponse\x12\x36\n\x05items\x18\x01 \x03(\x0b\x32 .qdrant.cloud.booking.v1.PackageR\x05items\"V\n\x11GetPackageRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x18\n\x02id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"X\n\x12GetPackageResponse\x12\x42\n\x07package\x18\x01 \x01(\x0b\x32 .qdrant.cloud.booking.v1.PackageB\x06\xbaH\x03\xc8\x01\x01R\x07package\"\x88\x05\n\x07Package\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12/\n\x04name\x18\x02 \x01(\tB\x1b\xbaH\x18r\x16\x10\x03\x18@2\x10^[a-zA-Z0-9-_]+$R\x04name\x12%\n\x04type\x18\x03 \x01(\tB\x11\xbaH\x0er\x0cR\x04\x66reeR\x04paidR\x04type\x12\x65\n\x16resource_configuration\x18\x04 \x01(\x0b\x32..qdrant.cloud.booking.v1.ResourceConfigurationR\x15resourceConfiguration\x12-\n\x08\x63urrency\x18\x05 \x01(\tB\x11\xbaH\x0er\x0c\x32\n^[A-Z]{3}$R\x08\x63urrency\x12=\n\x17unit_int_price_per_hour\x18\x06 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x00R\x13unitIntPricePerHour\x12J\n\x06status\x18\x07 \x01(\x0e\x32&.qdrant.cloud.booking.v1.PackageStatusB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x06status\x12\x44\n\x04tier\x18\t \x01(\x0e\x32$.qdrant.cloud.booking.v1.PackageTierB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x04tier\x12\x80\x01\n\x1e\x61vailable_additional_resources\x18\x08 \x01(\x0b\x32\x35.qdrant.cloud.booking.v1.AvailableAdditionalResourcesH\x00R\x1c\x61vailableAdditionalResources\x88\x01\x01\x42!\n\x1f_available_additional_resources\"M\n\x1c\x41vailableAdditionalResources\x12-\n\x13\x64isk_price_per_hour\x18\x01 \x01(\rR\x10\x64iskPricePerHour\"j\n\x15ResourceConfiguration\x12\x19\n\x03ram\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x03ram\x12\x19\n\x03\x63pu\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x03\x63pu\x12\x1b\n\x04\x64isk\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04\x64isk*j\n\rPackageStatus\x12\x1e\n\x1aPACKAGE_STATUS_UNSPECIFIED\x10\x00\x12\x19\n\x15PACKAGE_STATUS_ACTIVE\x10\x01\x12\x1e\n\x1aPACKAGE_STATUS_DEACTIVATED\x10\x02*g\n\x0bPackageTier\x12#\n\x1fPACKAGE_TIER_STATUS_UNSPECIFIED\x10\x00\x12\x19\n\x15PACKAGE_TIER_STANDARD\x10\x01\x12\x18\n\x14PACKAGE_TIER_PREMIUM\x10\x02\x32\xe3\x05\n\x0e\x42ookingService\x12\x8a\x02\n\x0cListPackages\x12,.qdrant.cloud.booking.v1.ListPackagesRequest\x1a-.qdrant.cloud.booking.v1.ListPackagesResponse\"\x9c\x01\x8a\xb5\x18\x00\xba\xb5\x18&\n\x11\x63loud_provider_id\x12\x11\x63loud_provider_id\xba\xb5\x18\x34\n\x18\x63loud_provider_region_id\x12\x18\x63loud_provider_region_id\x82\xd3\xe4\x93\x02\x30\x12./api/booking/v1/accounts/{account_id}/packages\x12\xba\x01\n\nGetPackage\x12*.qdrant.cloud.booking.v1.GetPackageRequest\x1a+.qdrant.cloud.booking.v1.GetPackageResponse\"S\x8a\xb5\x18\x00\xba\xb5\x18\x10\n\npackage_id\x12\x02id\x82\xd3\xe4\x93\x02\x35\x12\x33/api/booking/v1/accounts/{account_id}/packages/{id}\x12\x86\x02\n\x12ListGlobalPackages\x12\x32.qdrant.cloud.booking.v1.ListGlobalPackagesRequest\x1a\x33.qdrant.cloud.booking.v1.ListGlobalPackagesResponse\"\x86\x01\x98\xb5\x18\x00\xba\xb5\x18&\n\x11\x63loud_provider_id\x12\x11\x63loud_provider_id\xba\xb5\x18\x34\n\x18\x63loud_provider_region_id\x12\x18\x63loud_provider_region_id\x82\xd3\xe4\x93\x02\x1a\x12\x18/api/booking/v1/packagesB\xfe\x01\n\x1b\x63om.qdrant.cloud.booking.v1B\x0c\x42ookingProtoP\x01ZRgithub.com/qdrant/qdrant-cloud-public-api/gen/go/qdrant/cloud/booking/v1;bookingv1\xa2\x02\x03QCB\xaa\x02\x17Qdrant.Cloud.Booking.V1\xca\x02\x17Qdrant\\Cloud\\Booking\\V1\xe2\x02#Qdrant\\Cloud\\Booking\\V1\\GPBMetadata\xea\x02\x1aQdrant::Cloud::Booking::V1b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%qdrant/cloud/booking/v1/booking.proto\x12\x17qdrant.cloud.booking.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1cgoogle/api/annotations.proto\x1a#qdrant/cloud/common/v1/common.proto\"\xec\x03\n\x13ListPackagesRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x33\n\x11\x63loud_provider_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x0f\x63loudProviderId\x12\x45\n\x18\x63loud_provider_region_id\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x15\x63loudProviderRegionId\x88\x01\x01\x12\x42\n\x08statuses\x18\x04 \x03(\x0e\x32&.qdrant.cloud.booking.v1.PackageStatusR\x08statuses:\xce\x01\xbaH\xca\x01\x1a\xc7\x01\n.list_packages.cloud_provider_region_id_present\x12Kcloud_provider_region_id is required when cloud_provider_id is not \'hybrid\'\x1aHthis.cloud_provider_id == \'hybrid\' || has(this.cloud_provider_region_id)B\x1b\n\x19_cloud_provider_region_id\"N\n\x14ListPackagesResponse\x12\x36\n\x05items\x18\x01 \x03(\x0b\x32 .qdrant.cloud.booking.v1.PackageR\x05items\"\x8c\x03\n\x19ListGlobalPackagesRequest\x12\x33\n\x11\x63loud_provider_id\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x0f\x63loudProviderId\x12\x45\n\x18\x63loud_provider_region_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x15\x63loudProviderRegionId\x88\x01\x01:\xd5\x01\xbaH\xd1\x01\x1a\xce\x01\n5list_global_packages.cloud_provider_region_id_present\x12Kcloud_provider_region_id is required when cloud_provider_id is not \'hybrid\'\x1aHthis.cloud_provider_id == \'hybrid\' || has(this.cloud_provider_region_id)B\x1b\n\x19_cloud_provider_region_id\"T\n\x1aListGlobalPackagesResponse\x12\x36\n\x05items\x18\x01 \x03(\x0b\x32 .qdrant.cloud.booking.v1.PackageR\x05items\"V\n\x11GetPackageRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x18\n\x02id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\"X\n\x12GetPackageResponse\x12\x42\n\x07package\x18\x01 \x01(\x0b\x32 .qdrant.cloud.booking.v1.PackageB\x06\xbaH\x03\xc8\x01\x01R\x07package\"\x88\x05\n\x07Package\x12\x18\n\x02id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x02id\x12/\n\x04name\x18\x02 \x01(\tB\x1b\xbaH\x18r\x16\x10\x03\x18@2\x10^[a-zA-Z0-9-_]+$R\x04name\x12%\n\x04type\x18\x03 \x01(\tB\x11\xbaH\x0er\x0cR\x04\x66reeR\x04paidR\x04type\x12\x65\n\x16resource_configuration\x18\x04 \x01(\x0b\x32..qdrant.cloud.booking.v1.ResourceConfigurationR\x15resourceConfiguration\x12-\n\x08\x63urrency\x18\x05 \x01(\tB\x11\xbaH\x0er\x0c\x32\n^[A-Z]{3}$R\x08\x63urrency\x12=\n\x17unit_int_price_per_hour\x18\x06 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x00R\x13unitIntPricePerHour\x12J\n\x06status\x18\x07 \x01(\x0e\x32&.qdrant.cloud.booking.v1.PackageStatusB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x06status\x12\x44\n\x04tier\x18\t \x01(\x0e\x32$.qdrant.cloud.booking.v1.PackageTierB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x04tier\x12\x80\x01\n\x1e\x61vailable_additional_resources\x18\x08 \x01(\x0b\x32\x35.qdrant.cloud.booking.v1.AvailableAdditionalResourcesH\x00R\x1c\x61vailableAdditionalResources\x88\x01\x01\x42!\n\x1f_available_additional_resources\"M\n\x1c\x41vailableAdditionalResources\x12-\n\x13\x64isk_price_per_hour\x18\x01 \x01(\rR\x10\x64iskPricePerHour\"j\n\x15ResourceConfiguration\x12\x19\n\x03ram\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x03ram\x12\x19\n\x03\x63pu\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x03\x63pu\x12\x1b\n\x04\x64isk\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04\x64isk\"\xb5\x04\n\x0fGetQuoteRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x33\n\x11\x63loud_provider_id\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x0f\x63loudProviderId\x12\x45\n\x18\x63loud_provider_region_id\x18\x03 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x15\x63loudProviderRegionId\x88\x01\x01\x12\x31\n\x0fnumber_of_nodes\x18\x04 \x01(\rB\t\xbaH\x06*\x04\x18\x64(\x01R\rnumberOfNodes\x12\'\n\npackage_id\x18\x05 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tpackageId\x12\x37\n\x13\x61\x64\x64itional_disk_gib\x18\x06 \x01(\rB\x07\xbaH\x04*\x02(\x00R\x11\x61\x64\x64itionalDiskGib:\xca\x01\xbaH\xc6\x01\x1a\xc3\x01\n*get_quote.cloud_provider_region_id_present\x12Kcloud_provider_region_id is required when cloud_provider_id is not \'hybrid\'\x1aHthis.cloud_provider_id == \'hybrid\' || has(this.cloud_provider_region_id)B\x1b\n\x19_cloud_provider_region_id\"\x8f\x02\n\x10GetQuoteResponse\x12-\n\x08\x63urrency\x18\x01 \x01(\tB\x11\xbaH\x0er\x0c\x32\n^[A-Z]{3}$R\x08\x63urrency\x12>\n\x17original_price_per_hour\x18\x02 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x14originalPricePerHour\x12\x42\n\x19\x64iscounted_price_per_hour\x18\x03 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x16\x64iscountedPricePerHour\x12H\n\x13\x64iscount_percentage\x18\x04 \x01(\x01\x42\x17\xbaH\x14\x12\x12\x19\x00\x00\x00\x00\x00\x00Y@)\x00\x00\x00\x00\x00\x00\x00\x00R\x12\x64iscountPercentage*j\n\rPackageStatus\x12\x1e\n\x1aPACKAGE_STATUS_UNSPECIFIED\x10\x00\x12\x19\n\x15PACKAGE_STATUS_ACTIVE\x10\x01\x12\x1e\n\x1aPACKAGE_STATUS_DEACTIVATED\x10\x02*g\n\x0bPackageTier\x12#\n\x1fPACKAGE_TIER_STATUS_UNSPECIFIED\x10\x00\x12\x19\n\x15PACKAGE_TIER_STANDARD\x10\x01\x12\x18\n\x14PACKAGE_TIER_PREMIUM\x10\x02\x32\x8f\x07\n\x0e\x42ookingService\x12\x8a\x02\n\x0cListPackages\x12,.qdrant.cloud.booking.v1.ListPackagesRequest\x1a-.qdrant.cloud.booking.v1.ListPackagesResponse\"\x9c\x01\x8a\xb5\x18\x00\xba\xb5\x18&\n\x11\x63loud_provider_id\x12\x11\x63loud_provider_id\xba\xb5\x18\x34\n\x18\x63loud_provider_region_id\x12\x18\x63loud_provider_region_id\x82\xd3\xe4\x93\x02\x30\x12./api/booking/v1/accounts/{account_id}/packages\x12\xba\x01\n\nGetPackage\x12*.qdrant.cloud.booking.v1.GetPackageRequest\x1a+.qdrant.cloud.booking.v1.GetPackageResponse\"S\x8a\xb5\x18\x00\xba\xb5\x18\x10\n\npackage_id\x12\x02id\x82\xd3\xe4\x93\x02\x35\x12\x33/api/booking/v1/accounts/{account_id}/packages/{id}\x12\x86\x02\n\x12ListGlobalPackages\x12\x32.qdrant.cloud.booking.v1.ListGlobalPackagesRequest\x1a\x33.qdrant.cloud.booking.v1.ListGlobalPackagesResponse\"\x86\x01\x98\xb5\x18\x00\xba\xb5\x18&\n\x11\x63loud_provider_id\x12\x11\x63loud_provider_id\xba\xb5\x18\x34\n\x18\x63loud_provider_region_id\x12\x18\x63loud_provider_region_id\x82\xd3\xe4\x93\x02\x1a\x12\x18/api/booking/v1/packages\x12\xa9\x01\n\x08GetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\"H\x8a\xb5\x18\x0ewrite:clusters\x82\xd3\xe4\x93\x02\x30\"+/api/booking/v1/accounts/{account_id}/quote:\x01*B\xfe\x01\n\x1b\x63om.qdrant.cloud.booking.v1B\x0c\x42ookingProtoP\x01ZRgithub.com/qdrant/qdrant-cloud-public-api/gen/go/qdrant/cloud/booking/v1;bookingv1\xa2\x02\x03QCB\xaa\x02\x17Qdrant.Cloud.Booking.V1\xca\x02\x17Qdrant\\Cloud\\Booking\\V1\xe2\x02#Qdrant\\Cloud\\Booking\\V1\\GPBMetadata\xea\x02\x1aQdrant::Cloud::Booking::V1b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -75,16 +75,40 @@ _globals['_RESOURCECONFIGURATION'].fields_by_name['cpu']._serialized_options = b'\272H\004r\002\020\001' _globals['_RESOURCECONFIGURATION'].fields_by_name['disk']._loaded_options = None _globals['_RESOURCECONFIGURATION'].fields_by_name['disk']._serialized_options = b'\272H\004r\002\020\001' + _globals['_GETQUOTEREQUEST'].fields_by_name['account_id']._loaded_options = None + _globals['_GETQUOTEREQUEST'].fields_by_name['account_id']._serialized_options = b'\272H\005r\003\260\001\001' + _globals['_GETQUOTEREQUEST'].fields_by_name['cloud_provider_id']._loaded_options = None + _globals['_GETQUOTEREQUEST'].fields_by_name['cloud_provider_id']._serialized_options = b'\272H\004r\002\020\003' + _globals['_GETQUOTEREQUEST'].fields_by_name['cloud_provider_region_id']._loaded_options = None + _globals['_GETQUOTEREQUEST'].fields_by_name['cloud_provider_region_id']._serialized_options = b'\272H\004r\002\020\001' + _globals['_GETQUOTEREQUEST'].fields_by_name['number_of_nodes']._loaded_options = None + _globals['_GETQUOTEREQUEST'].fields_by_name['number_of_nodes']._serialized_options = b'\272H\006*\004\030d(\001' + _globals['_GETQUOTEREQUEST'].fields_by_name['package_id']._loaded_options = None + _globals['_GETQUOTEREQUEST'].fields_by_name['package_id']._serialized_options = b'\272H\005r\003\260\001\001' + _globals['_GETQUOTEREQUEST'].fields_by_name['additional_disk_gib']._loaded_options = None + _globals['_GETQUOTEREQUEST'].fields_by_name['additional_disk_gib']._serialized_options = b'\272H\004*\002(\000' + _globals['_GETQUOTEREQUEST']._loaded_options = None + _globals['_GETQUOTEREQUEST']._serialized_options = b'\272H\306\001\032\303\001\n*get_quote.cloud_provider_region_id_present\022Kcloud_provider_region_id is required when cloud_provider_id is not \'hybrid\'\032Hthis.cloud_provider_id == \'hybrid\' || has(this.cloud_provider_region_id)' + _globals['_GETQUOTERESPONSE'].fields_by_name['currency']._loaded_options = None + _globals['_GETQUOTERESPONSE'].fields_by_name['currency']._serialized_options = b'\272H\016r\0142\n^[A-Z]{3}$' + _globals['_GETQUOTERESPONSE'].fields_by_name['original_price_per_hour']._loaded_options = None + _globals['_GETQUOTERESPONSE'].fields_by_name['original_price_per_hour']._serialized_options = b'\272H\004\"\002(\000' + _globals['_GETQUOTERESPONSE'].fields_by_name['discounted_price_per_hour']._loaded_options = None + _globals['_GETQUOTERESPONSE'].fields_by_name['discounted_price_per_hour']._serialized_options = b'\272H\004\"\002(\000' + _globals['_GETQUOTERESPONSE'].fields_by_name['discount_percentage']._loaded_options = None + _globals['_GETQUOTERESPONSE'].fields_by_name['discount_percentage']._serialized_options = b'\272H\024\022\022\031\000\000\000\000\000\000Y@)\000\000\000\000\000\000\000\000' _globals['_BOOKINGSERVICE'].methods_by_name['ListPackages']._loaded_options = None _globals['_BOOKINGSERVICE'].methods_by_name['ListPackages']._serialized_options = b'\212\265\030\000\272\265\030&\n\021cloud_provider_id\022\021cloud_provider_id\272\265\0304\n\030cloud_provider_region_id\022\030cloud_provider_region_id\202\323\344\223\0020\022./api/booking/v1/accounts/{account_id}/packages' _globals['_BOOKINGSERVICE'].methods_by_name['GetPackage']._loaded_options = None _globals['_BOOKINGSERVICE'].methods_by_name['GetPackage']._serialized_options = b'\212\265\030\000\272\265\030\020\n\npackage_id\022\002id\202\323\344\223\0025\0223/api/booking/v1/accounts/{account_id}/packages/{id}' _globals['_BOOKINGSERVICE'].methods_by_name['ListGlobalPackages']._loaded_options = None _globals['_BOOKINGSERVICE'].methods_by_name['ListGlobalPackages']._serialized_options = b'\230\265\030\000\272\265\030&\n\021cloud_provider_id\022\021cloud_provider_id\272\265\0304\n\030cloud_provider_region_id\022\030cloud_provider_region_id\202\323\344\223\002\032\022\030/api/booking/v1/packages' - _globals['_PACKAGESTATUS']._serialized_start=2238 - _globals['_PACKAGESTATUS']._serialized_end=2344 - _globals['_PACKAGETIER']._serialized_start=2346 - _globals['_PACKAGETIER']._serialized_end=2449 + _globals['_BOOKINGSERVICE'].methods_by_name['GetQuote']._loaded_options = None + _globals['_BOOKINGSERVICE'].methods_by_name['GetQuote']._serialized_options = b'\212\265\030\016write:clusters\202\323\344\223\0020\"+/api/booking/v1/accounts/{account_id}/quote:\001*' + _globals['_PACKAGESTATUS']._serialized_start=3080 + _globals['_PACKAGESTATUS']._serialized_end=3186 + _globals['_PACKAGETIER']._serialized_start=3188 + _globals['_PACKAGETIER']._serialized_end=3291 _globals['_LISTPACKAGESREQUEST']._serialized_start=163 _globals['_LISTPACKAGESREQUEST']._serialized_end=655 _globals['_LISTPACKAGESRESPONSE']._serialized_start=657 @@ -103,6 +127,10 @@ _globals['_AVAILABLEADDITIONALRESOURCES']._serialized_end=2128 _globals['_RESOURCECONFIGURATION']._serialized_start=2130 _globals['_RESOURCECONFIGURATION']._serialized_end=2236 - _globals['_BOOKINGSERVICE']._serialized_start=2452 - _globals['_BOOKINGSERVICE']._serialized_end=3191 + _globals['_GETQUOTEREQUEST']._serialized_start=2239 + _globals['_GETQUOTEREQUEST']._serialized_end=2804 + _globals['_GETQUOTERESPONSE']._serialized_start=2807 + _globals['_GETQUOTERESPONSE']._serialized_end=3078 + _globals['_BOOKINGSERVICE']._serialized_start=3294 + _globals['_BOOKINGSERVICE']._serialized_end=4205 # @@protoc_insertion_point(module_scope) diff --git a/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi b/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi index d0a07deb..2793140a 100644 --- a/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi +++ b/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi @@ -111,3 +111,31 @@ class ResourceConfiguration(_message.Message): cpu: str disk: str def __init__(self, ram: _Optional[str] = ..., cpu: _Optional[str] = ..., disk: _Optional[str] = ...) -> None: ... + +class GetQuoteRequest(_message.Message): + __slots__ = ("account_id", "cloud_provider_id", "cloud_provider_region_id", "number_of_nodes", "package_id", "additional_disk_gib") + ACCOUNT_ID_FIELD_NUMBER: _ClassVar[int] + CLOUD_PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] + CLOUD_PROVIDER_REGION_ID_FIELD_NUMBER: _ClassVar[int] + NUMBER_OF_NODES_FIELD_NUMBER: _ClassVar[int] + PACKAGE_ID_FIELD_NUMBER: _ClassVar[int] + ADDITIONAL_DISK_GIB_FIELD_NUMBER: _ClassVar[int] + account_id: str + cloud_provider_id: str + cloud_provider_region_id: str + number_of_nodes: int + package_id: str + additional_disk_gib: int + def __init__(self, account_id: _Optional[str] = ..., cloud_provider_id: _Optional[str] = ..., cloud_provider_region_id: _Optional[str] = ..., number_of_nodes: _Optional[int] = ..., package_id: _Optional[str] = ..., additional_disk_gib: _Optional[int] = ...) -> None: ... + +class GetQuoteResponse(_message.Message): + __slots__ = ("currency", "original_price_per_hour", "discounted_price_per_hour", "discount_percentage") + CURRENCY_FIELD_NUMBER: _ClassVar[int] + ORIGINAL_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] + DISCOUNTED_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] + DISCOUNT_PERCENTAGE_FIELD_NUMBER: _ClassVar[int] + currency: str + original_price_per_hour: int + discounted_price_per_hour: int + discount_percentage: float + def __init__(self, currency: _Optional[str] = ..., original_price_per_hour: _Optional[int] = ..., discounted_price_per_hour: _Optional[int] = ..., discount_percentage: _Optional[float] = ...) -> None: ... diff --git a/gen/python/qdrant/cloud/booking/v1/booking_pb2_grpc.py b/gen/python/qdrant/cloud/booking/v1/booking_pb2_grpc.py index 7e75ff49..9fe5809d 100644 --- a/gen/python/qdrant/cloud/booking/v1/booking_pb2_grpc.py +++ b/gen/python/qdrant/cloud/booking/v1/booking_pb2_grpc.py @@ -30,6 +30,11 @@ def __init__(self, channel): request_serializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.ListGlobalPackagesRequest.SerializeToString, response_deserializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.ListGlobalPackagesResponse.FromString, _registered_method=True) + self.GetQuote = channel.unary_unary( + '/qdrant.cloud.booking.v1.BookingService/GetQuote', + request_serializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.GetQuoteRequest.SerializeToString, + response_deserializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.GetQuoteResponse.FromString, + _registered_method=True) class BookingServiceServicer(object): @@ -63,6 +68,17 @@ def ListGlobalPackages(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def GetQuote(self, request, context): + """Gets a price quote for a cluster configuration. + This endpoint calculates pricing information including hourly costs, + and any applicable discounts for the specified cluster configuration. + Required permissions: + - write:clusters + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_BookingServiceServicer_to_server(servicer, server): rpc_method_handlers = { @@ -81,6 +97,11 @@ def add_BookingServiceServicer_to_server(servicer, server): request_deserializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.ListGlobalPackagesRequest.FromString, response_serializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.ListGlobalPackagesResponse.SerializeToString, ), + 'GetQuote': grpc.unary_unary_rpc_method_handler( + servicer.GetQuote, + request_deserializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.GetQuoteRequest.FromString, + response_serializer=qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.GetQuoteResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'qdrant.cloud.booking.v1.BookingService', rpc_method_handlers) @@ -173,3 +194,30 @@ def ListGlobalPackages(request, timeout, metadata, _registered_method=True) + + @staticmethod + def GetQuote(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/qdrant.cloud.booking.v1.BookingService/GetQuote', + qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.GetQuoteRequest.SerializeToString, + qdrant_dot_cloud_dot_booking_dot_v1_dot_booking__pb2.GetQuoteResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.d.ts b/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.d.ts index d1f4d866..8073356c 100644 --- a/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.d.ts +++ b/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.d.ts @@ -27,3 +27,13 @@ export const getPackage: typeof BookingService["method"]["getPackage"]; * @generated from rpc qdrant.cloud.booking.v1.BookingService.ListGlobalPackages */ export const listGlobalPackages: typeof BookingService["method"]["listGlobalPackages"]; +/** + * Gets a price quote for a cluster configuration. + * This endpoint calculates pricing information including hourly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - write:clusters + * + * @generated from rpc qdrant.cloud.booking.v1.BookingService.GetQuote + */ +export const getQuote: typeof BookingService["method"]["getQuote"]; diff --git a/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.js b/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.js index bd6f7142..c82cef5b 100644 --- a/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.js +++ b/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.js @@ -29,3 +29,14 @@ export const getPackage = BookingService.method.getPackage; * @generated from rpc qdrant.cloud.booking.v1.BookingService.ListGlobalPackages */ export const listGlobalPackages = BookingService.method.listGlobalPackages; + +/** + * Gets a price quote for a cluster configuration. + * This endpoint calculates pricing information including hourly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - write:clusters + * + * @generated from rpc qdrant.cloud.booking.v1.BookingService.GetQuote + */ +export const getQuote = BookingService.method.getQuote; diff --git a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts index 12ff75e9..e51d6d2b 100644 --- a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts +++ b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts @@ -348,6 +348,119 @@ export declare type ResourceConfigurationValid = ResourceConfiguration; */ export declare const ResourceConfigurationSchema: GenMessage; +/** + * GetQuoteRequest is the request for the GetQuote function + * + * @generated from message qdrant.cloud.booking.v1.GetQuoteRequest + */ +export declare type GetQuoteRequest = Message<"qdrant.cloud.booking.v1.GetQuoteRequest"> & { + /** + * The identifier of the account (in GUID format). + * This is a required field. + * + * @generated from field: string account_id = 1; + */ + accountId: string; + + /** + * The cloud provider where the cluster will be hosted. + * Must match one of the provider IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviders` method. + * + * @generated from field: string cloud_provider_id = 2; + */ + cloudProviderId: string; + + /** + * The cloud region where the cluster will be hosted. + * Must match one of the region IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviderRegions` method. + * This field can be omitted if `cloud_provider_id` is set to `hybrid`. + * + * @generated from field: optional string cloud_provider_region_id = 3; + */ + cloudProviderRegionId?: string; + + /** + * The number of nodes in a cluster. + * This should be a number 1...100 [both included]. + * This is a required field. + * + * @generated from field: uint32 number_of_nodes = 4; + */ + numberOfNodes: number; + + /** + * The package identifier used to configure the resources of the cluster. + * Use `qdrant.cloud.booking.v1.BookingService.ListPackages` to select one. + * This is a required field. + * + * @generated from field: string package_id = 5; + */ + packageId: string; + + /** + * The additional disk storage in GiB on top of the selected package. + * This is an optional field, if not specified additional disk is 0. + * + * @generated from field: uint32 additional_disk_gib = 6; + */ + additionalDiskGib: number; +}; + +export declare type GetQuoteRequestValid = GetQuoteRequest; + +/** + * Describes the message qdrant.cloud.booking.v1.GetQuoteRequest. + * Use `create(GetQuoteRequestSchema)` to create a new message. + */ +export declare const GetQuoteRequestSchema: GenMessage; + +/** + * GetQuoteResponse is the response from the GetQuote function + * + * @generated from message qdrant.cloud.booking.v1.GetQuoteResponse + */ +export declare type GetQuoteResponse = Message<"qdrant.cloud.booking.v1.GetQuoteResponse"> & { + /** + * The currency of the prices. + * Specifies the currency in which the prices are denominated. + * Must be a 3-letter ISO 4217 currency code (e.g., "USD"). + * + * @generated from field: string currency = 1; + */ + currency: string; + + /** + * The original price per hour in millicents, before any discounts. + * + * @generated from field: int64 original_price_per_hour = 2; + */ + originalPricePerHour: bigint; + + /** + * The discounted price per hour in millicents, after applying discounts. + * If no discounts are applied, this will be the same as original_price_per_hour. + * + * @generated from field: int64 discounted_price_per_hour = 3; + */ + discountedPricePerHour: bigint; + + /** + * The percentage of discount applied (e.g., 10.0 for 10% discount). + * If no discounts are applied, this will be 0.0. + * + * @generated from field: double discount_percentage = 4; + */ + discountPercentage: number; +}; + +export declare type GetQuoteResponseValid = GetQuoteResponse; + +/** + * Describes the message qdrant.cloud.booking.v1.GetQuoteResponse. + * Use `create(GetQuoteResponseSchema)` to create a new message. + */ +export declare const GetQuoteResponseSchema: GenMessage; + /** * PackageStatus defines the valid states a package can be in. * @@ -455,5 +568,19 @@ export declare const BookingService: GenService<{ input: typeof ListGlobalPackagesRequestSchema; output: typeof ListGlobalPackagesResponseSchema; }, + /** + * Gets a price quote for a cluster configuration. + * This endpoint calculates pricing information including hourly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - write:clusters + * + * @generated from rpc qdrant.cloud.booking.v1.BookingService.GetQuote + */ + getQuote: { + methodKind: "unary"; + input: typeof GetQuoteRequestSchema; + output: typeof GetQuoteResponseSchema; + }, }>; diff --git a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js index 33b1bc94..0ddc5a48 100644 --- a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js +++ b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js @@ -11,7 +11,7 @@ import { file_qdrant_cloud_common_v1_common } from "../../common/v1/common_pb.js * Describes the file qdrant/cloud/booking/v1/booking.proto. */ export const file_qdrant_cloud_booking_v1_booking = /*@__PURE__*/ - fileDesc("CiVxZHJhbnQvY2xvdWQvYm9va2luZy92MS9ib29raW5nLnByb3RvEhdxZHJhbnQuY2xvdWQuYm9va2luZy52MSKvAwoTTGlzdFBhY2thZ2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIiChFjbG91ZF9wcm92aWRlcl9pZBgCIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAyABKAlCB7pIBHICEAFIAIgBARI4CghzdGF0dXNlcxgEIAMoDjImLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLlBhY2thZ2VTdGF0dXM6zgG6SMoBGscBCi5saXN0X3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSLkAgoZTGlzdEdsb2JhbFBhY2thZ2VzUmVxdWVzdBIiChFjbG91ZF9wcm92aWRlcl9pZBgBIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAiABKAlCB7pIBHICEAFIAIgBATrVAbpI0QEazgEKNWxpc3RfZ2xvYmFsX3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIk0KGkxpc3RHbG9iYWxQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSJHChFHZXRQYWNrYWdlUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIUCgJpZBgCIAEoCUIIukgFcgOwAQEiTwoSR2V0UGFja2FnZVJlc3BvbnNlEjkKB3BhY2thZ2UYASABKAsyIC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlQga6SAPIAQEilQQKB1BhY2thZ2USFAoCaWQYASABKAlCCLpIBXIDsAEBEikKBG5hbWUYAiABKAlCG7pIGHIWEAMYQDIQXlthLXpBLVowLTktX10rJBIfCgR0eXBlGAMgASgJQhG6SA5yDFIEZnJlZVIEcGFpZBJOChZyZXNvdXJjZV9jb25maWd1cmF0aW9uGAQgASgLMi4ucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUmVzb3VyY2VDb25maWd1cmF0aW9uEiMKCGN1cnJlbmN5GAUgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChd1bml0X2ludF9wcmljZV9wZXJfaG91chgGIAEoBUIHukgEGgIoABJCCgZzdGF0dXMYByABKA4yJi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlU3RhdHVzQgq6SAeCAQQQASAAEj4KBHRpZXIYCSABKA4yJC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlVGllckIKukgHggEEEAEgABJiCh5hdmFpbGFibGVfYWRkaXRpb25hbF9yZXNvdXJjZXMYCCABKAsyNS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5BdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzSACIAQFCIQofX2F2YWlsYWJsZV9hZGRpdGlvbmFsX3Jlc291cmNlcyI7ChxBdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzEhsKE2Rpc2tfcHJpY2VfcGVyX2hvdXIYASABKA0iWgoVUmVzb3VyY2VDb25maWd1cmF0aW9uEhQKA3JhbRgBIAEoCUIHukgEcgIQARIUCgNjcHUYAiABKAlCB7pIBHICEAESFQoEZGlzaxgDIAEoCUIHukgEcgIQASpqCg1QYWNrYWdlU3RhdHVzEh4KGlBBQ0tBR0VfU1RBVFVTX1VOU1BFQ0lGSUVEEAASGQoVUEFDS0FHRV9TVEFUVVNfQUNUSVZFEAESHgoaUEFDS0FHRV9TVEFUVVNfREVBQ1RJVkFURUQQAipnCgtQYWNrYWdlVGllchIjCh9QQUNLQUdFX1RJRVJfU1RBVFVTX1VOU1BFQ0lGSUVEEAASGQoVUEFDS0FHRV9USUVSX1NUQU5EQVJEEAESGAoUUEFDS0FHRV9USUVSX1BSRU1JVU0QAjLjBQoOQm9va2luZ1NlcnZpY2USigIKDExpc3RQYWNrYWdlcxIsLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkxpc3RQYWNrYWdlc1JlcXVlc3QaLS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5MaXN0UGFja2FnZXNSZXNwb25zZSKcAYq1GAC6tRgmChFjbG91ZF9wcm92aWRlcl9pZBIRY2xvdWRfcHJvdmlkZXJfaWS6tRg0ChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQSGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZILT5JMCMBIuL2FwaS9ib29raW5nL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9wYWNrYWdlcxK6AQoKR2V0UGFja2FnZRIqLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkdldFBhY2thZ2VSZXF1ZXN0GisucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuR2V0UGFja2FnZVJlc3BvbnNlIlOKtRgAurUYEAoKcGFja2FnZV9pZBICaWSC0+STAjUSMy9hcGkvYm9va2luZy92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vcGFja2FnZXMve2lkfRKGAgoSTGlzdEdsb2JhbFBhY2thZ2VzEjIucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdEdsb2JhbFBhY2thZ2VzUmVxdWVzdBozLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkxpc3RHbG9iYWxQYWNrYWdlc1Jlc3BvbnNlIoYBmLUYALq1GCYKEWNsb3VkX3Byb3ZpZGVyX2lkEhFjbG91ZF9wcm92aWRlcl9pZLq1GDQKGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBIYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkgtPkkwIaEhgvYXBpL2Jvb2tpbmcvdjEvcGFja2FnZXNC/gEKG2NvbS5xZHJhbnQuY2xvdWQuYm9va2luZy52MUIMQm9va2luZ1Byb3RvUAFaUmdpdGh1Yi5jb20vcWRyYW50L3FkcmFudC1jbG91ZC1wdWJsaWMtYXBpL2dlbi9nby9xZHJhbnQvY2xvdWQvYm9va2luZy92MTtib29raW5ndjGiAgNRQ0KqAhdRZHJhbnQuQ2xvdWQuQm9va2luZy5WMcoCF1FkcmFudFxDbG91ZFxCb29raW5nXFYx4gIjUWRyYW50XENsb3VkXEJvb2tpbmdcVjFcR1BCTWV0YWRhdGHqAhpRZHJhbnQ6OkNsb3VkOjpCb29raW5nOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_qdrant_cloud_common_v1_common]); + fileDesc("CiVxZHJhbnQvY2xvdWQvYm9va2luZy92MS9ib29raW5nLnByb3RvEhdxZHJhbnQuY2xvdWQuYm9va2luZy52MSKvAwoTTGlzdFBhY2thZ2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIiChFjbG91ZF9wcm92aWRlcl9pZBgCIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAyABKAlCB7pIBHICEAFIAIgBARI4CghzdGF0dXNlcxgEIAMoDjImLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLlBhY2thZ2VTdGF0dXM6zgG6SMoBGscBCi5saXN0X3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSLkAgoZTGlzdEdsb2JhbFBhY2thZ2VzUmVxdWVzdBIiChFjbG91ZF9wcm92aWRlcl9pZBgBIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAiABKAlCB7pIBHICEAFIAIgBATrVAbpI0QEazgEKNWxpc3RfZ2xvYmFsX3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIk0KGkxpc3RHbG9iYWxQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSJHChFHZXRQYWNrYWdlUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIUCgJpZBgCIAEoCUIIukgFcgOwAQEiTwoSR2V0UGFja2FnZVJlc3BvbnNlEjkKB3BhY2thZ2UYASABKAsyIC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlQga6SAPIAQEilQQKB1BhY2thZ2USFAoCaWQYASABKAlCCLpIBXIDsAEBEikKBG5hbWUYAiABKAlCG7pIGHIWEAMYQDIQXlthLXpBLVowLTktX10rJBIfCgR0eXBlGAMgASgJQhG6SA5yDFIEZnJlZVIEcGFpZBJOChZyZXNvdXJjZV9jb25maWd1cmF0aW9uGAQgASgLMi4ucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUmVzb3VyY2VDb25maWd1cmF0aW9uEiMKCGN1cnJlbmN5GAUgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChd1bml0X2ludF9wcmljZV9wZXJfaG91chgGIAEoBUIHukgEGgIoABJCCgZzdGF0dXMYByABKA4yJi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlU3RhdHVzQgq6SAeCAQQQASAAEj4KBHRpZXIYCSABKA4yJC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlVGllckIKukgHggEEEAEgABJiCh5hdmFpbGFibGVfYWRkaXRpb25hbF9yZXNvdXJjZXMYCCABKAsyNS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5BdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzSACIAQFCIQofX2F2YWlsYWJsZV9hZGRpdGlvbmFsX3Jlc291cmNlcyI7ChxBdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzEhsKE2Rpc2tfcHJpY2VfcGVyX2hvdXIYASABKA0iWgoVUmVzb3VyY2VDb25maWd1cmF0aW9uEhQKA3JhbRgBIAEoCUIHukgEcgIQARIUCgNjcHUYAiABKAlCB7pIBHICEAESFQoEZGlzaxgDIAEoCUIHukgEcgIQASLVAwoPR2V0UXVvdGVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEiIKEWNsb3VkX3Byb3ZpZGVyX2lkGAIgASgJQge6SARyAhADEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgDIAEoCUIHukgEcgIQAUgAiAEBEiIKD251bWJlcl9vZl9ub2RlcxgEIAEoDUIJukgGKgQYZCgBEhwKCnBhY2thZ2VfaWQYBSABKAlCCLpIBXIDsAEBEiQKE2FkZGl0aW9uYWxfZGlza19naWIYBiABKA1CB7pIBCoCKAA6ygG6SMYBGsMBCipnZXRfcXVvdGUuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkX3ByZXNlbnQSS2Nsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX2lkIGlzIG5vdCAnaHlicmlkJxpIdGhpcy5jbG91ZF9wcm92aWRlcl9pZCA9PSAnaHlicmlkJyB8fCBoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpQhsKGV9jbG91ZF9wcm92aWRlcl9yZWdpb25faWQiwwEKEEdldFF1b3RlUmVzcG9uc2USIwoIY3VycmVuY3kYASABKAlCEbpIDnIMMgpeW0EtWl17M30kEigKF29yaWdpbmFsX3ByaWNlX3Blcl9ob3VyGAIgASgDQge6SAQiAigAEioKGWRpc2NvdW50ZWRfcHJpY2VfcGVyX2hvdXIYAyABKANCB7pIBCICKAASNAoTZGlzY291bnRfcGVyY2VudGFnZRgEIAEoAUIXukgUEhIZAAAAAAAAWUApAAAAAAAAAAAqagoNUGFja2FnZVN0YXR1cxIeChpQQUNLQUdFX1NUQVRVU19VTlNQRUNJRklFRBAAEhkKFVBBQ0tBR0VfU1RBVFVTX0FDVElWRRABEh4KGlBBQ0tBR0VfU1RBVFVTX0RFQUNUSVZBVEVEEAIqZwoLUGFja2FnZVRpZXISIwofUEFDS0FHRV9USUVSX1NUQVRVU19VTlNQRUNJRklFRBAAEhkKFVBBQ0tBR0VfVElFUl9TVEFOREFSRBABEhgKFFBBQ0tBR0VfVElFUl9QUkVNSVVNEAIyjwcKDkJvb2tpbmdTZXJ2aWNlEooCCgxMaXN0UGFja2FnZXMSLC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5MaXN0UGFja2FnZXNSZXF1ZXN0Gi0ucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdFBhY2thZ2VzUmVzcG9uc2UinAGKtRgAurUYJgoRY2xvdWRfcHJvdmlkZXJfaWQSEWNsb3VkX3Byb3ZpZGVyX2lkurUYNAoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEhhjbG91ZF9wcm92aWRlcl9yZWdpb25faWSC0+STAjASLi9hcGkvYm9va2luZy92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vcGFja2FnZXMSugEKCkdldFBhY2thZ2USKi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRQYWNrYWdlUmVxdWVzdBorLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkdldFBhY2thZ2VSZXNwb25zZSJTirUYALq1GBAKCnBhY2thZ2VfaWQSAmlkgtPkkwI1EjMvYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3BhY2thZ2VzL3tpZH0ShgIKEkxpc3RHbG9iYWxQYWNrYWdlcxIyLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkxpc3RHbG9iYWxQYWNrYWdlc1JlcXVlc3QaMy5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5MaXN0R2xvYmFsUGFja2FnZXNSZXNwb25zZSKGAZi1GAC6tRgmChFjbG91ZF9wcm92aWRlcl9pZBIRY2xvdWRfcHJvdmlkZXJfaWS6tRg0ChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQSGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZILT5JMCGhIYL2FwaS9ib29raW5nL3YxL3BhY2thZ2VzEqkBCghHZXRRdW90ZRIoLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkdldFF1b3RlUmVxdWVzdBopLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkdldFF1b3RlUmVzcG9uc2UiSIq1GA53cml0ZTpjbHVzdGVyc4LT5JMCMDoBKiIrL2FwaS9ib29raW5nL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9xdW90ZUL+AQobY29tLnFkcmFudC5jbG91ZC5ib29raW5nLnYxQgxCb29raW5nUHJvdG9QAVpSZ2l0aHViLmNvbS9xZHJhbnQvcWRyYW50LWNsb3VkLXB1YmxpYy1hcGkvZ2VuL2dvL3FkcmFudC9jbG91ZC9ib29raW5nL3YxO2Jvb2tpbmd2MaICA1FDQqoCF1FkcmFudC5DbG91ZC5Cb29raW5nLlYxygIXUWRyYW50XENsb3VkXEJvb2tpbmdcVjHiAiNRZHJhbnRcQ2xvdWRcQm9va2luZ1xWMVxHUEJNZXRhZGF0YeoCGlFkcmFudDo6Q2xvdWQ6OkJvb2tpbmc6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_annotations, file_qdrant_cloud_common_v1_common]); /** * Describes the message qdrant.cloud.booking.v1.ListPackagesRequest. @@ -76,6 +76,20 @@ export const AvailableAdditionalResourcesSchema = /*@__PURE__*/ export const ResourceConfigurationSchema = /*@__PURE__*/ messageDesc(file_qdrant_cloud_booking_v1_booking, 8); +/** + * Describes the message qdrant.cloud.booking.v1.GetQuoteRequest. + * Use `create(GetQuoteRequestSchema)` to create a new message. + */ +export const GetQuoteRequestSchema = /*@__PURE__*/ + messageDesc(file_qdrant_cloud_booking_v1_booking, 9); + +/** + * Describes the message qdrant.cloud.booking.v1.GetQuoteResponse. + * Use `create(GetQuoteResponseSchema)` to create a new message. + */ +export const GetQuoteResponseSchema = /*@__PURE__*/ + messageDesc(file_qdrant_cloud_booking_v1_booking, 10); + /** * Describes the enum qdrant.cloud.booking.v1.PackageStatus. */ diff --git a/proto/qdrant/cloud/booking/v1/booking.proto b/proto/qdrant/cloud/booking/v1/booking.proto index b20bf434..7a952cea 100644 --- a/proto/qdrant/cloud/booking/v1/booking.proto +++ b/proto/qdrant/cloud/booking/v1/booking.proto @@ -58,6 +58,20 @@ service BookingService { field_expression: "cloud_provider_region_id" }; } + // Gets a price quote for a cluster configuration. + // This endpoint calculates pricing information including hourly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - write:clusters + rpc GetQuote(GetQuoteRequest) returns (GetQuoteResponse) { + // permissions + option (common.v1.permissions) = "write:clusters"; + // gRPC Gateway REST call + option (google.api.http) = { + post: "/api/booking/v1/accounts/{account_id}/quote" + body: "*" + }; + } } // ListPackagesRequest is the request for the ListPackages function @@ -213,3 +227,55 @@ message ResourceConfiguration { // The amount of disk (e.g., "100GiB") string disk = 3 [(buf.validate.field).string.min_len = 1]; } + +// GetQuoteRequest is the request for the GetQuote function +message GetQuoteRequest { + // The identifier of the account (in GUID format). + // This is a required field. + string account_id = 1 [(buf.validate.field).string = {uuid: true}]; + // The cloud provider where the cluster will be hosted. + // Must match one of the provider IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviders` method. + string cloud_provider_id = 2 [(buf.validate.field).string = {min_len: 3}]; + // The cloud region where the cluster will be hosted. + // Must match one of the region IDs returned by the `qdrant.cloud.platform.v1.PlatformService.ListCloudProviderRegions` method. + // This field can be omitted if `cloud_provider_id` is set to `hybrid`. + optional string cloud_provider_region_id = 3 [(buf.validate.field).string = {min_len: 1}]; + option (buf.validate.message).cel = { + id: "get_quote.cloud_provider_region_id_present" + message: "cloud_provider_region_id is required when cloud_provider_id is not 'hybrid'" + expression: "this.cloud_provider_id == 'hybrid' || has(this.cloud_provider_region_id)" + }; + // The number of nodes in a cluster. + // This should be a number 1...100 [both included]. + // This is a required field. + uint32 number_of_nodes = 4 [(buf.validate.field).uint32 = { + gte: 1 + lte: 100 + }]; + // The package identifier used to configure the resources of the cluster. + // Use `qdrant.cloud.booking.v1.BookingService.ListPackages` to select one. + // This is a required field. + string package_id = 5 [(buf.validate.field).string = {uuid: true}]; + // The additional disk storage in GiB on top of the selected package. + // This is an optional field, if not specified additional disk is 0. + uint32 additional_disk_gib = 6 [(buf.validate.field).uint32.gte = 0]; +} + +// GetQuoteResponse is the response from the GetQuote function +message GetQuoteResponse { + // The currency of the prices. + // Specifies the currency in which the prices are denominated. + // Must be a 3-letter ISO 4217 currency code (e.g., "USD"). + string currency = 1 [(buf.validate.field).string = {pattern: "^[A-Z]{3}$"}]; + // The original price per hour in millicents, before any discounts. + int64 original_price_per_hour = 2 [(buf.validate.field).int64.gte = 0]; + // The discounted price per hour in millicents, after applying discounts. + // If no discounts are applied, this will be the same as original_price_per_hour. + int64 discounted_price_per_hour = 3 [(buf.validate.field).int64.gte = 0]; + // The percentage of discount applied (e.g., 10.0 for 10% discount). + // If no discounts are applied, this will be 0.0. + double discount_percentage = 4 [(buf.validate.field).double = { + gte: 0.0 + lte: 100.0 + }]; +}