From 436ad665a53b53dc011a801a84a7517c29a427ff Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Wed, 24 Sep 2025 10:00:02 +0300 Subject: [PATCH 1/8] Introduce quote endpoint --- proto/qdrant/cloud/cluster/v1/cluster.proto | 56 +++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/proto/qdrant/cloud/cluster/v1/cluster.proto b/proto/qdrant/cloud/cluster/v1/cluster.proto index f08a17be..f389cf83 100644 --- a/proto/qdrant/cloud/cluster/v1/cluster.proto +++ b/proto/qdrant/cloud/cluster/v1/cluster.proto @@ -208,6 +208,20 @@ service ClusterService { field_expression: "cluster_id" }; } + // Gets a price quote for a cluster configuration. + // This endpoint calculates pricing information including hourly and monthly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - read:clusters + rpc Quote(QuoteRequest) returns (QuoteResponse) { + // permissions + option (common.v1.permissions) = "read:clusters"; + // gRPC Gateway REST call + option (google.api.http) = { + post: "/api/cluster/v1/accounts/{account_id}/quote" + body: "*" + }; + } } // ListClustersRequest is the request for the ListClusters function @@ -947,3 +961,45 @@ message CreateClusterFromBackupResponse { // Cluster created from the backup Cluster cluster = 1 [(buf.validate.field).required = true]; } + +// QuoteRequest is the request for the Quote function +message QuoteRequest { + // The identifier of the account (in GUID format). + // This is a required field. + string account_id = 1 [(buf.validate.field).string = {uuid: true}]; + // The cluster configuration to get a quote for. + // This should contain the same information as you would use for CreateCluster, + // except without readonly fields (id, created_at, deleted_at, state). + Cluster cluster = 2 [(buf.validate.field).required = true]; + option (buf.validate.message).cel = { + id: "quote.no_read_only_fields" + message: "read-only fields (id, created_at, deleted_at, state) must not be set on quote" + expression: "this.cluster.id == '' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)" + }; +} + +// QuoteResponse is the response from the Quote function +message QuoteResponse { + // 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 original price per month in millicents, before any discounts. + // Calculated as original_price_per_hour * 24 * 30 (720 hours). + int64 original_price_per_month = 3 [(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 = 4 [(buf.validate.field).int64.gte = 0]; + // The discounted price per month in millicents, after applying discounts. + // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). + // If no discounts are applied, this will be the same as original_price_per_month. + int64 discounted_price_per_month = 5 [(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 = 6 [(buf.validate.field).double = { + gte: 0.0 + lte: 100.0 + }]; +} From 6b6198dd16eaf6a678d4045b309e2a90aaf28495 Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Wed, 24 Sep 2025 10:01:17 +0300 Subject: [PATCH 2/8] make generate --- gen/go/qdrant/cloud/cluster/v1/cluster.pb.go | 267 +++++++++++++++--- .../cloud/cluster/v1/cluster_grpc.pb.go | 48 ++++ .../cloud/cluster/v1/cluster.swagger.json | 85 ++++++ .../qdrant/cloud/cluster/v1/cluster_pb2.py | 70 +++-- .../qdrant/cloud/cluster/v1/cluster_pb2.pyi | 24 ++ .../cloud/cluster/v1/cluster_pb2_grpc.py | 48 ++++ .../cluster-ClusterService_connectquery.d.ts | 10 + .../v1/cluster-ClusterService_connectquery.js | 11 + .../qdrant/cloud/cluster/v1/cluster_pb.d.ts | 132 +++++++++ .../qdrant/cloud/cluster/v1/cluster_pb.js | 16 +- proto/qdrant/cloud/cluster/v1/cluster.proto | 10 +- 11 files changed, 646 insertions(+), 75 deletions(-) diff --git a/gen/go/qdrant/cloud/cluster/v1/cluster.pb.go b/gen/go/qdrant/cloud/cluster/v1/cluster.pb.go index c0bd3db2..f0a0c59c 100644 --- a/gen/go/qdrant/cloud/cluster/v1/cluster.pb.go +++ b/gen/go/qdrant/cloud/cluster/v1/cluster.pb.go @@ -3231,6 +3231,162 @@ func (x *CreateClusterFromBackupResponse) GetCluster() *Cluster { return nil } +// 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 cluster configuration to get a quote for. + // This should contain the same information as you would use for CreateCluster, + // except without readonly fields (id, created_at, deleted_at, state). + Cluster *Cluster `protobuf:"bytes,2,opt,name=cluster,proto3" json:"cluster,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetQuoteRequest) Reset() { + *x = GetQuoteRequest{} + mi := &file_qdrant_cloud_cluster_v1_cluster_proto_msgTypes[39] + 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_cluster_v1_cluster_proto_msgTypes[39] + 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_cluster_v1_cluster_proto_rawDescGZIP(), []int{39} +} + +func (x *GetQuoteRequest) GetAccountId() string { + if x != nil { + return x.AccountId + } + return "" +} + +func (x *GetQuoteRequest) GetCluster() *Cluster { + if x != nil { + return x.Cluster + } + return nil +} + +// 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 original price per month in millicents, before any discounts. + // Calculated as original_price_per_hour * 24 * 30 (720 hours). + OriginalPricePerMonth int64 `protobuf:"varint,3,opt,name=original_price_per_month,json=originalPricePerMonth,proto3" json:"original_price_per_month,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,4,opt,name=discounted_price_per_hour,json=discountedPricePerHour,proto3" json:"discounted_price_per_hour,omitempty"` + // The discounted price per month in millicents, after applying discounts. + // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). + // If no discounts are applied, this will be the same as original_price_per_month. + DiscountedPricePerMonth int64 `protobuf:"varint,5,opt,name=discounted_price_per_month,json=discountedPricePerMonth,proto3" json:"discounted_price_per_month,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,6,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_cluster_v1_cluster_proto_msgTypes[40] + 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_cluster_v1_cluster_proto_msgTypes[40] + 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_cluster_v1_cluster_proto_rawDescGZIP(), []int{40} +} + +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) GetOriginalPricePerMonth() int64 { + if x != nil { + return x.OriginalPricePerMonth + } + return 0 +} + +func (x *GetQuoteResponse) GetDiscountedPricePerHour() int64 { + if x != nil { + return x.DiscountedPricePerHour + } + return 0 +} + +func (x *GetQuoteResponse) GetDiscountedPricePerMonth() int64 { + if x != nil { + return x.DiscountedPricePerMonth + } + return 0 +} + +func (x *GetQuoteResponse) GetDiscountPercentage() float64 { + if x != nil { + return x.DiscountPercentage + } + return 0 +} + var File_qdrant_cloud_cluster_v1_cluster_proto protoreflect.FileDescriptor const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + @@ -3473,7 +3629,20 @@ const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + "\tbackup_id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\bbackupId\x12>\n" + "\fcluster_name\x18\x03 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\vclusterName\"e\n" + "\x1fCreateClusterFromBackupResponse\x12B\n" + - "\acluster\x18\x01 \x01(\v2 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\acluster*\xab\x01\n" + + "\acluster\x18\x01 \x01(\v2 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\acluster\"\xe7\x02\n" + + "\x0fGetQuoteRequest\x12'\n" + + "\n" + + "account_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12B\n" + + "\acluster\x18\x02 \x01(\v2 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\acluster:\xe6\x01\xbaH\xe2\x01\x1a\xdf\x01\n" + + "\x19quote.no_read_only_fields\x12Mread-only fields (id, created_at, deleted_at, state) must not be set on quote\x1asthis.cluster.id == '' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)\"\x97\x03\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\x12@\n" + + "\x18original_price_per_month\x18\x03 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12B\n" + + "\x19discounted_price_per_hour\x18\x04 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x16discountedPricePerHour\x12D\n" + + "\x1adiscounted_price_per_month\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x17discountedPricePerMonth\x12H\n" + + "\x13discount_percentage\x18\x06 \x01(\x01B\x17\xbaH\x14\x12\x12\x19\x00\x00\x00\x00\x00\x00Y@)\x00\x00\x00\x00\x00\x00\x00\x00R\x12discountPercentage*\xab\x01\n" + "\x12ClusterServiceType\x12$\n" + " CLUSTER_SERVICE_TYPE_UNSPECIFIED\x10\x00\x12#\n" + "\x1fCLUSTER_SERVICE_TYPE_CLUSTER_IP\x10\x01\x12\"\n" + @@ -3540,7 +3709,7 @@ const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + "\x18ClusterScalabilityStatus\x12*\n" + "&CLUSTER_SCALABILITY_STATUS_UNSPECIFIED\x10\x00\x12+\n" + "'CLUSTER_SCALABILITY_STATUS_NOT_SCALABLE\x10\x01\x12'\n" + - "#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x022\x9c\x17\n" + + "#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x022\xc7\x18\n" + "\x0eClusterService\x12\xb4\x01\n" + "\fListClusters\x12,.qdrant.cloud.cluster.v1.ListClustersRequest\x1a-.qdrant.cloud.cluster.v1.ListClustersResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x020\x12./api/cluster/v1/accounts/{account_id}/clusters\x12\xd7\x01\n" + "\n" + @@ -3574,7 +3743,8 @@ const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + "\x12ListQdrantReleases\x122.qdrant.cloud.cluster.v1.ListQdrantReleasesRequest\x1a3.qdrant.cloud.cluster.v1.ListQdrantReleasesResponse\"c\x8a\xb5\x18\rread:clusters\xba\xb5\x18\x18\n" + "\n" + "cluster_id\x12\n" + - "cluster_id\x82\xd3\xe4\x93\x020\x12./api/cluster/v1/accounts/{account_id}/releasesB\xfe\x01\n" + + "cluster_id\x82\xd3\xe4\x93\x020\x12./api/cluster/v1/accounts/{account_id}/releases\x12\xa8\x01\n" + + "\bGetQuote\x12(.qdrant.cloud.cluster.v1.GetQuoteRequest\x1a).qdrant.cloud.cluster.v1.GetQuoteResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x020:\x01*\"+/api/cluster/v1/accounts/{account_id}/quoteB\xfe\x01\n" + "\x1bcom.qdrant.cloud.cluster.v1B\fClusterProtoP\x01ZRgithub.com/qdrant/qdrant-cloud-public-api/gen/go/qdrant/cloud/cluster/v1;clusterv1\xa2\x02\x03QCC\xaa\x02\x17Qdrant.Cloud.Cluster.V1\xca\x02\x17Qdrant\\Cloud\\Cluster\\V1\xe2\x02#Qdrant\\Cloud\\Cluster\\V1\\GPBMetadata\xea\x02\x1aQdrant::Cloud::Cluster::V1b\x06proto3" var ( @@ -3590,7 +3760,7 @@ func file_qdrant_cloud_cluster_v1_cluster_proto_rawDescGZIP() []byte { } var file_qdrant_cloud_cluster_v1_cluster_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_qdrant_cloud_cluster_v1_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 39) +var file_qdrant_cloud_cluster_v1_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 41) var file_qdrant_cloud_cluster_v1_cluster_proto_goTypes = []any{ (ClusterServiceType)(0), // 0: qdrant.cloud.cluster.v1.ClusterServiceType (ClusterConfigurationGpuType)(0), // 1: qdrant.cloud.cluster.v1.ClusterConfigurationGpuType @@ -3641,9 +3811,11 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_goTypes = []any{ (*QdrantRelease)(nil), // 46: qdrant.cloud.cluster.v1.QdrantRelease (*CreateClusterFromBackupRequest)(nil), // 47: qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest (*CreateClusterFromBackupResponse)(nil), // 48: qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse - (*timestamppb.Timestamp)(nil), // 49: google.protobuf.Timestamp - (*v1.KeyValue)(nil), // 50: qdrant.cloud.common.v1.KeyValue - (*v1.SecretKeyRef)(nil), // 51: qdrant.cloud.common.v1.SecretKeyRef + (*GetQuoteRequest)(nil), // 49: qdrant.cloud.cluster.v1.GetQuoteRequest + (*GetQuoteResponse)(nil), // 50: qdrant.cloud.cluster.v1.GetQuoteResponse + (*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp + (*v1.KeyValue)(nil), // 52: qdrant.cloud.common.v1.KeyValue + (*v1.SecretKeyRef)(nil), // 53: qdrant.cloud.common.v1.SecretKeyRef } var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 28, // 0: qdrant.cloud.cluster.v1.ListClustersResponse.items:type_name -> qdrant.cloud.cluster.v1.Cluster @@ -3653,19 +3825,19 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 28, // 4: qdrant.cloud.cluster.v1.UpdateClusterRequest.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster 28, // 5: qdrant.cloud.cluster.v1.UpdateClusterResponse.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster 46, // 6: qdrant.cloud.cluster.v1.ListQdrantReleasesResponse.items:type_name -> qdrant.cloud.cluster.v1.QdrantRelease - 49, // 7: qdrant.cloud.cluster.v1.Cluster.created_at:type_name -> google.protobuf.Timestamp - 49, // 8: qdrant.cloud.cluster.v1.Cluster.deleted_at:type_name -> google.protobuf.Timestamp + 51, // 7: qdrant.cloud.cluster.v1.Cluster.created_at:type_name -> google.protobuf.Timestamp + 51, // 8: qdrant.cloud.cluster.v1.Cluster.deleted_at:type_name -> google.protobuf.Timestamp 29, // 9: qdrant.cloud.cluster.v1.Cluster.configuration:type_name -> qdrant.cloud.cluster.v1.ClusterConfiguration 40, // 10: qdrant.cloud.cluster.v1.Cluster.state:type_name -> qdrant.cloud.cluster.v1.ClusterState - 49, // 11: qdrant.cloud.cluster.v1.ClusterConfiguration.last_modified_at:type_name -> google.protobuf.Timestamp + 51, // 11: qdrant.cloud.cluster.v1.ClusterConfiguration.last_modified_at:type_name -> google.protobuf.Timestamp 38, // 12: qdrant.cloud.cluster.v1.ClusterConfiguration.additional_resources:type_name -> qdrant.cloud.cluster.v1.AdditionalResources 30, // 13: qdrant.cloud.cluster.v1.ClusterConfiguration.database_configuration:type_name -> qdrant.cloud.cluster.v1.DatabaseConfiguration - 50, // 14: qdrant.cloud.cluster.v1.ClusterConfiguration.node_selector:type_name -> qdrant.cloud.common.v1.KeyValue + 52, // 14: qdrant.cloud.cluster.v1.ClusterConfiguration.node_selector:type_name -> qdrant.cloud.common.v1.KeyValue 39, // 15: qdrant.cloud.cluster.v1.ClusterConfiguration.tolerations:type_name -> qdrant.cloud.cluster.v1.Toleration - 50, // 16: qdrant.cloud.cluster.v1.ClusterConfiguration.annotations:type_name -> qdrant.cloud.common.v1.KeyValue + 52, // 16: qdrant.cloud.cluster.v1.ClusterConfiguration.annotations:type_name -> qdrant.cloud.common.v1.KeyValue 0, // 17: qdrant.cloud.cluster.v1.ClusterConfiguration.service_type:type_name -> qdrant.cloud.cluster.v1.ClusterServiceType - 50, // 18: qdrant.cloud.cluster.v1.ClusterConfiguration.service_annotations:type_name -> qdrant.cloud.common.v1.KeyValue - 50, // 19: qdrant.cloud.cluster.v1.ClusterConfiguration.pod_labels:type_name -> qdrant.cloud.common.v1.KeyValue + 52, // 18: qdrant.cloud.cluster.v1.ClusterConfiguration.service_annotations:type_name -> qdrant.cloud.common.v1.KeyValue + 52, // 19: qdrant.cloud.cluster.v1.ClusterConfiguration.pod_labels:type_name -> qdrant.cloud.common.v1.KeyValue 1, // 20: qdrant.cloud.cluster.v1.ClusterConfiguration.gpu_type:type_name -> qdrant.cloud.cluster.v1.ClusterConfigurationGpuType 2, // 21: qdrant.cloud.cluster.v1.ClusterConfiguration.restart_policy:type_name -> qdrant.cloud.cluster.v1.ClusterConfigurationRestartPolicy 3, // 22: qdrant.cloud.cluster.v1.ClusterConfiguration.rebalance_strategy:type_name -> qdrant.cloud.cluster.v1.ClusterConfigurationRebalanceStrategy @@ -3677,19 +3849,19 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 37, // 28: qdrant.cloud.cluster.v1.DatabaseConfiguration.inference:type_name -> qdrant.cloud.cluster.v1.DatabaseConfigurationInference 32, // 29: qdrant.cloud.cluster.v1.DatabaseConfigurationCollection.vectors:type_name -> qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionVectors 34, // 30: qdrant.cloud.cluster.v1.DatabaseConfigurationStorage.performance:type_name -> qdrant.cloud.cluster.v1.DatabaseConfigurationStoragePerformance - 51, // 31: qdrant.cloud.cluster.v1.DatabaseConfigurationService.api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef - 51, // 32: qdrant.cloud.cluster.v1.DatabaseConfigurationService.read_only_api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef - 51, // 33: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.cert:type_name -> qdrant.cloud.common.v1.SecretKeyRef - 51, // 34: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.key:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 53, // 31: qdrant.cloud.cluster.v1.DatabaseConfigurationService.api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 53, // 32: qdrant.cloud.cluster.v1.DatabaseConfigurationService.read_only_api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 53, // 33: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.cert:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 53, // 34: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.key:type_name -> qdrant.cloud.common.v1.SecretKeyRef 5, // 35: qdrant.cloud.cluster.v1.Toleration.operator:type_name -> qdrant.cloud.cluster.v1.TolerationOperator 6, // 36: qdrant.cloud.cluster.v1.Toleration.effect:type_name -> qdrant.cloud.cluster.v1.TolerationEffect - 49, // 37: qdrant.cloud.cluster.v1.ClusterState.restarted_at:type_name -> google.protobuf.Timestamp + 51, // 37: qdrant.cloud.cluster.v1.ClusterState.restarted_at:type_name -> google.protobuf.Timestamp 7, // 38: qdrant.cloud.cluster.v1.ClusterState.phase:type_name -> qdrant.cloud.cluster.v1.ClusterPhase 42, // 39: qdrant.cloud.cluster.v1.ClusterState.endpoint:type_name -> qdrant.cloud.cluster.v1.ClusterEndpoint 43, // 40: qdrant.cloud.cluster.v1.ClusterState.resources:type_name -> qdrant.cloud.cluster.v1.ClusterNodeResourcesSummary 45, // 41: qdrant.cloud.cluster.v1.ClusterState.scalability_info:type_name -> qdrant.cloud.cluster.v1.ClusterScalabilityInfo 41, // 42: qdrant.cloud.cluster.v1.ClusterState.nodes:type_name -> qdrant.cloud.cluster.v1.ClusterNodeInfo - 49, // 43: qdrant.cloud.cluster.v1.ClusterNodeInfo.started_at:type_name -> google.protobuf.Timestamp + 51, // 43: qdrant.cloud.cluster.v1.ClusterNodeInfo.started_at:type_name -> google.protobuf.Timestamp 42, // 44: qdrant.cloud.cluster.v1.ClusterNodeInfo.endpoint:type_name -> qdrant.cloud.cluster.v1.ClusterEndpoint 8, // 45: qdrant.cloud.cluster.v1.ClusterNodeInfo.state:type_name -> qdrant.cloud.cluster.v1.ClusterNodeState 44, // 46: qdrant.cloud.cluster.v1.ClusterNodeResourcesSummary.disk:type_name -> qdrant.cloud.cluster.v1.ClusterNodeResources @@ -3697,31 +3869,34 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 44, // 48: qdrant.cloud.cluster.v1.ClusterNodeResourcesSummary.cpu:type_name -> qdrant.cloud.cluster.v1.ClusterNodeResources 9, // 49: qdrant.cloud.cluster.v1.ClusterScalabilityInfo.status:type_name -> qdrant.cloud.cluster.v1.ClusterScalabilityStatus 28, // 50: qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster - 10, // 51: qdrant.cloud.cluster.v1.ClusterService.ListClusters:input_type -> qdrant.cloud.cluster.v1.ListClustersRequest - 12, // 52: qdrant.cloud.cluster.v1.ClusterService.GetCluster:input_type -> qdrant.cloud.cluster.v1.GetClusterRequest - 14, // 53: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:input_type -> qdrant.cloud.cluster.v1.CreateClusterRequest - 47, // 54: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:input_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest - 16, // 55: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:input_type -> qdrant.cloud.cluster.v1.UpdateClusterRequest - 18, // 56: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:input_type -> qdrant.cloud.cluster.v1.DeleteClusterRequest - 20, // 57: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:input_type -> qdrant.cloud.cluster.v1.RestartClusterRequest - 22, // 58: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:input_type -> qdrant.cloud.cluster.v1.SuspendClusterRequest - 24, // 59: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:input_type -> qdrant.cloud.cluster.v1.SuggestClusterNameRequest - 26, // 60: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:input_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesRequest - 11, // 61: qdrant.cloud.cluster.v1.ClusterService.ListClusters:output_type -> qdrant.cloud.cluster.v1.ListClustersResponse - 13, // 62: qdrant.cloud.cluster.v1.ClusterService.GetCluster:output_type -> qdrant.cloud.cluster.v1.GetClusterResponse - 15, // 63: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:output_type -> qdrant.cloud.cluster.v1.CreateClusterResponse - 48, // 64: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:output_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse - 17, // 65: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:output_type -> qdrant.cloud.cluster.v1.UpdateClusterResponse - 19, // 66: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:output_type -> qdrant.cloud.cluster.v1.DeleteClusterResponse - 21, // 67: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:output_type -> qdrant.cloud.cluster.v1.RestartClusterResponse - 23, // 68: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:output_type -> qdrant.cloud.cluster.v1.SuspendClusterResponse - 25, // 69: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:output_type -> qdrant.cloud.cluster.v1.SuggestClusterNameResponse - 27, // 70: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:output_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesResponse - 61, // [61:71] is the sub-list for method output_type - 51, // [51:61] is the sub-list for method input_type - 51, // [51:51] is the sub-list for extension type_name - 51, // [51:51] is the sub-list for extension extendee - 0, // [0:51] is the sub-list for field type_name + 28, // 51: qdrant.cloud.cluster.v1.GetQuoteRequest.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster + 10, // 52: qdrant.cloud.cluster.v1.ClusterService.ListClusters:input_type -> qdrant.cloud.cluster.v1.ListClustersRequest + 12, // 53: qdrant.cloud.cluster.v1.ClusterService.GetCluster:input_type -> qdrant.cloud.cluster.v1.GetClusterRequest + 14, // 54: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:input_type -> qdrant.cloud.cluster.v1.CreateClusterRequest + 47, // 55: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:input_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest + 16, // 56: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:input_type -> qdrant.cloud.cluster.v1.UpdateClusterRequest + 18, // 57: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:input_type -> qdrant.cloud.cluster.v1.DeleteClusterRequest + 20, // 58: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:input_type -> qdrant.cloud.cluster.v1.RestartClusterRequest + 22, // 59: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:input_type -> qdrant.cloud.cluster.v1.SuspendClusterRequest + 24, // 60: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:input_type -> qdrant.cloud.cluster.v1.SuggestClusterNameRequest + 26, // 61: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:input_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesRequest + 49, // 62: qdrant.cloud.cluster.v1.ClusterService.GetQuote:input_type -> qdrant.cloud.cluster.v1.GetQuoteRequest + 11, // 63: qdrant.cloud.cluster.v1.ClusterService.ListClusters:output_type -> qdrant.cloud.cluster.v1.ListClustersResponse + 13, // 64: qdrant.cloud.cluster.v1.ClusterService.GetCluster:output_type -> qdrant.cloud.cluster.v1.GetClusterResponse + 15, // 65: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:output_type -> qdrant.cloud.cluster.v1.CreateClusterResponse + 48, // 66: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:output_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse + 17, // 67: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:output_type -> qdrant.cloud.cluster.v1.UpdateClusterResponse + 19, // 68: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:output_type -> qdrant.cloud.cluster.v1.DeleteClusterResponse + 21, // 69: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:output_type -> qdrant.cloud.cluster.v1.RestartClusterResponse + 23, // 70: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:output_type -> qdrant.cloud.cluster.v1.SuspendClusterResponse + 25, // 71: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:output_type -> qdrant.cloud.cluster.v1.SuggestClusterNameResponse + 27, // 72: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:output_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesResponse + 50, // 73: qdrant.cloud.cluster.v1.ClusterService.GetQuote:output_type -> qdrant.cloud.cluster.v1.GetQuoteResponse + 63, // [63:74] is the sub-list for method output_type + 52, // [52:63] is the sub-list for method input_type + 52, // [52:52] is the sub-list for extension type_name + 52, // [52:52] is the sub-list for extension extendee + 0, // [0:52] is the sub-list for field type_name } func init() { file_qdrant_cloud_cluster_v1_cluster_proto_init() } @@ -3746,7 +3921,7 @@ func file_qdrant_cloud_cluster_v1_cluster_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc), len(file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc)), NumEnums: 10, - NumMessages: 39, + NumMessages: 41, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go b/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go index 7b393ffb..c8ac0232 100644 --- a/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go +++ b/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go @@ -29,6 +29,7 @@ const ( ClusterService_SuspendCluster_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/SuspendCluster" ClusterService_SuggestClusterName_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/SuggestClusterName" ClusterService_ListQdrantReleases_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/ListQdrantReleases" + ClusterService_GetQuote_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/GetQuote" ) // ClusterServiceClient is the client API for ClusterService service. @@ -80,6 +81,12 @@ type ClusterServiceClient interface { // Required permissions: // - read:clusters ListQdrantReleases(ctx context.Context, in *ListQdrantReleasesRequest, opts ...grpc.CallOption) (*ListQdrantReleasesResponse, error) + // Gets a price quote for a cluster configuration. + // This endpoint calculates pricing information including hourly and monthly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - read:clusters + GetQuote(ctx context.Context, in *GetQuoteRequest, opts ...grpc.CallOption) (*GetQuoteResponse, error) } type clusterServiceClient struct { @@ -190,6 +197,16 @@ func (c *clusterServiceClient) ListQdrantReleases(ctx context.Context, in *ListQ return out, nil } +func (c *clusterServiceClient) 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, ClusterService_GetQuote_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ClusterServiceServer is the server API for ClusterService service. // All implementations must embed UnimplementedClusterServiceServer // for forward compatibility. @@ -239,6 +256,12 @@ type ClusterServiceServer interface { // Required permissions: // - read:clusters ListQdrantReleases(context.Context, *ListQdrantReleasesRequest) (*ListQdrantReleasesResponse, error) + // Gets a price quote for a cluster configuration. + // This endpoint calculates pricing information including hourly and monthly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - read:clusters + GetQuote(context.Context, *GetQuoteRequest) (*GetQuoteResponse, error) mustEmbedUnimplementedClusterServiceServer() } @@ -279,6 +302,9 @@ func (UnimplementedClusterServiceServer) SuggestClusterName(context.Context, *Su func (UnimplementedClusterServiceServer) ListQdrantReleases(context.Context, *ListQdrantReleasesRequest) (*ListQdrantReleasesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListQdrantReleases not implemented") } +func (UnimplementedClusterServiceServer) GetQuote(context.Context, *GetQuoteRequest) (*GetQuoteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetQuote not implemented") +} func (UnimplementedClusterServiceServer) mustEmbedUnimplementedClusterServiceServer() {} func (UnimplementedClusterServiceServer) testEmbeddedByValue() {} @@ -480,6 +506,24 @@ func _ClusterService_ListQdrantReleases_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _ClusterService_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.(ClusterServiceServer).GetQuote(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ClusterService_GetQuote_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ClusterServiceServer).GetQuote(ctx, req.(*GetQuoteRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ClusterService_ServiceDesc is the grpc.ServiceDesc for ClusterService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -527,6 +571,10 @@ var ClusterService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListQdrantReleases", Handler: _ClusterService_ListQdrantReleases_Handler, }, + { + MethodName: "GetQuote", + Handler: _ClusterService_GetQuote_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "qdrant/cloud/cluster/v1/cluster.proto", diff --git a/gen/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json b/gen/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json index 46a2fbb6..6ac9e69a 100644 --- a/gen/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json +++ b/gen/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json @@ -301,6 +301,46 @@ ] } }, + "/api/cluster/v1/accounts/{accountId}/quote": { + "post": { + "summary": "Gets a price quote for a cluster configuration.\nThis endpoint calculates pricing information including hourly and monthly costs,\nand any applicable discounts for the specified cluster configuration.\nRequired permissions:\n- read:clusters", + "operationId": "ClusterService_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/ClusterServiceGetQuoteBody" + } + } + ], + "tags": [ + "ClusterService" + ] + } + }, "/api/cluster/v1/accounts/{accountId}/releases": { "get": { "summary": "Lists all qdrant releases in the account identified by the given ID.\nOptional a cluster ID can be provided, the list will return the options to update to only.\nRequired permissions:\n- read:clusters", @@ -475,6 +515,16 @@ }, "title": "CreateClusterRequest is the request for the CreateCluster function" }, + "ClusterServiceGetQuoteBody": { + "type": "object", + "properties": { + "cluster": { + "$ref": "#/definitions/v1Cluster", + "description": "The cluster configuration to get a quote for.\nThis should contain the same information as you would use for CreateCluster,\nexcept without readonly fields (id, created_at, deleted_at, state)." + } + }, + "title": "GetQuoteRequest is the request for the GetQuote function" + }, "ClusterServiceUpdateClusterBody": { "type": "object", "properties": { @@ -1163,6 +1213,41 @@ }, "title": "GetClusterResponse is the response from the GetCluster 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." + }, + "originalPricePerMonth": { + "type": "string", + "format": "int64", + "description": "The original price per month in millicents, before any discounts.\nCalculated as original_price_per_hour * 24 * 30 (720 hours)." + }, + "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." + }, + "discountedPricePerMonth": { + "type": "string", + "format": "int64", + "description": "The discounted price per month in millicents, after applying discounts.\nCalculated as discounted_price_per_hour * 24 * 30 (720 hours).\nIf no discounts are applied, this will be the same as original_price_per_month." + }, + "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" + }, "v1KeyValue": { "type": "object", "properties": { diff --git a/gen/python/qdrant/cloud/cluster/v1/cluster_pb2.py b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2.py index 3c52aafe..da59eefa 100644 --- a/gen/python/qdrant/cloud/cluster/v1/cluster_pb2.py +++ b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2.py @@ -29,7 +29,7 @@ from qdrant.cloud.event.v1 import events_pb2 as qdrant_dot_cloud_dot_event_dot_v1_dot_events__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%qdrant/cloud/cluster/v1/cluster.proto\x12\x17qdrant.cloud.cluster.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a#qdrant/cloud/common/v1/common.proto\x1a\"qdrant/cloud/event/v1/events.proto\"\xba\x05\n\x13ListClustersRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x38\n\x11\x63loud_provider_id\x18\n \x01(\tB\x07\xbaH\x04r\x02\x10\x03H\x00R\x0f\x63loudProviderId\x88\x01\x01\x12\x45\n\x18\x63loud_provider_region_id\x18\x0b \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x01R\x15\x63loudProviderRegionId\x88\x01\x01:\xc5\x03\xbaH\xc1\x03\x1a\xb1\x01\n\'list_clusters.cloud_provider_id_present\x12\x42\x63loud_provider_id is required when cloud_provider_region_id is set\x1a\x42!has(this.cloud_provider_region_id) || has(this.cloud_provider_id)\x1a\x8a\x02\n cluster.cloud_provider_region_id\x12Hcloud_provider_region_id must be a UUID if cloud_provider_id is \'hybrid\'\x1a\x9b\x01this.cloud_provider_region_id.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\') || this.cloud_provider_id!= \'hybrid\'B\x14\n\x12_cloud_provider_idB\x1b\n\x19_cloud_provider_region_id\"N\n\x14ListClustersResponse\x12\x36\n\x05items\x18\x01 \x03(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterR\x05items\"e\n\x11GetClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\"X\n\x12GetClusterResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster\"\xcd\x02\n\x14\x43reateClusterRequest\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:\xf0\x01\xbaH\xec\x01\x1a\xe9\x01\n\"create_cluster.no_read_only_fields\x12Nread-only fields (id, created_at, deleted_at, state) must not be set on create\x1asthis.cluster.id == \'\' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)\"\xc4\x01\n\x15\x43reateClusterResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:g\xbaHd\x1a\x62\n\x1c\x63reate_cluster.state_present\x12)state is required for an existing cluster\x1a\x17has(this.cluster.state)\"\xb9\x01\n\x14UpdateClusterRequest\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:]\xbaHZ\x1aX\n\x19update_cluster.id_present\x12$cluster.id is required for an update\x1a\x15this.cluster.id != \'\'\"\xc4\x01\n\x15UpdateClusterResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:g\xbaHd\x1a\x62\n\x1cupdate_cluster.state_present\x12)state is required for an existing cluster\x1a\x17has(this.cluster.state)\"\xa7\x01\n\x14\x44\x65leteClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\x12*\n\x0e\x64\x65lete_backups\x18\x03 \x01(\x08H\x00R\rdeleteBackups\x88\x01\x01\x42\x11\n\x0f_delete_backups\"\x17\n\x15\x44\x65leteClusterResponse\"i\n\x15RestartClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\"\x18\n\x16RestartClusterResponse\"i\n\x15SuspendClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\"\x18\n\x16SuspendClusterResponse\"D\n\x19SuggestClusterNameRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"9\n\x1aSuggestClusterNameResponse\x12\x1b\n\x04name\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04name\"\x81\x01\n\x19ListQdrantReleasesRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12,\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\tclusterId\x88\x01\x01\x42\r\n\x0b_cluster_id\"Z\n\x1aListQdrantReleasesResponse\x12<\n\x05items\x18\x01 \x03(\x0b\x32&.qdrant.cloud.cluster.v1.QdrantReleaseR\x05items\"\xb4\x07\n\x07\x43luster\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x39\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12\'\n\naccount_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12/\n\x04name\x18\x04 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\x04name\x12\x39\n\ndeleted_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tdeletedAt\x12\x33\n\x11\x63loud_provider_id\x18\n \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x0f\x63loudProviderId\x12@\n\x18\x63loud_provider_region_id\x18\x0b \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x15\x63loudProviderRegionId\x12[\n\rconfiguration\x18\x14 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterConfigurationB\x06\xbaH\x03\xc8\x01\x01R\rconfiguration\x12;\n\x05state\x18\x64 \x01(\x0b\x32%.qdrant.cloud.cluster.v1.ClusterStateR\x05state:\xb7\x03\xbaH\xb3\x03\x1a\xa3\x01\n\ncluster.id\x12\x1avalue must be a valid UUID\x1aythis.id.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\') || !has(this.created_at)\x1a\x8a\x02\n cluster.cloud_provider_region_id\x12Hcloud_provider_region_id must be a UUID if cloud_provider_id is \'hybrid\'\x1a\x9b\x01this.cloud_provider_region_id.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\') || this.cloud_provider_id!= \'hybrid\'\"\xfa\x0c\n\x14\x43lusterConfiguration\x12\x44\n\x10last_modified_at\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0elastModifiedAt\x12\x31\n\x0fnumber_of_nodes\x18\x02 \x01(\rB\t\xbaH\x06*\x04\x18\x14(\x01R\rnumberOfNodes\x12\x45\n\x07version\x18\x03 \x01(\tB&\xbaH#r!2\x1f^(v(\\d+)\\.(\\d+)\\.(\\d+)|latest)$H\x00R\x07version\x88\x01\x01\x12\'\n\npackage_id\x18\x04 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tpackageId\x12\x64\n\x14\x61\x64\x64itional_resources\x18\x05 \x01(\x0b\x32,.qdrant.cloud.cluster.v1.AdditionalResourcesH\x01R\x13\x61\x64\x64itionalResources\x88\x01\x01\x12j\n\x16\x64\x61tabase_configuration\x18\x07 \x01(\x0b\x32..qdrant.cloud.cluster.v1.DatabaseConfigurationH\x02R\x15\x64\x61tabaseConfiguration\x88\x01\x01\x12O\n\rnode_selector\x18\x08 \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\x0cnodeSelector\x12O\n\x0btolerations\x18\t \x03(\x0b\x32#.qdrant.cloud.cluster.v1.TolerationB\x08\xbaH\x05\x92\x01\x02\x10\nR\x0btolerations\x12L\n\x0b\x61nnotations\x18\n \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\x0b\x61nnotations\x12H\n\x18\x61llowed_ip_source_ranges\x18\x0b \x03(\tB\x0f\xbaH\x0c\x92\x01\t\x10\x14\"\x05r\x03\xf0\x01\x01R\x15\x61llowedIpSourceRanges\x12_\n\x0cservice_type\x18\x0c \x01(\x0e\x32+.qdrant.cloud.cluster.v1.ClusterServiceTypeB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x03R\x0bserviceType\x88\x01\x01\x12[\n\x13service_annotations\x18\r \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\x12serviceAnnotations\x12I\n\npod_labels\x18\x0e \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\tpodLabels\x12?\n\x17reserved_cpu_percentage\x18\x14 \x01(\rB\x07\xbaH\x04*\x02\x18PR\x15reservedCpuPercentage\x12\x45\n\x1areserved_memory_percentage\x18\x15 \x01(\rB\x07\xbaH\x04*\x02\x18PR\x18reservedMemoryPercentage\x12`\n\x08gpu_type\x18\x16 \x01(\x0e\x32\x34.qdrant.cloud.cluster.v1.ClusterConfigurationGpuTypeB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x04R\x07gpuType\x88\x01\x01\x12r\n\x0erestart_policy\x18\x17 \x01(\x0e\x32:.qdrant.cloud.cluster.v1.ClusterConfigurationRestartPolicyB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x05R\rrestartPolicy\x88\x01\x01\x12~\n\x12rebalance_strategy\x18\x18 \x01(\x0e\x32>.qdrant.cloud.cluster.v1.ClusterConfigurationRebalanceStrategyB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x06R\x11rebalanceStrategy\x88\x01\x01\x42\n\n\x08_versionB\x17\n\x15_additional_resourcesB\x19\n\x17_database_configurationB\x0f\n\r_service_typeB\x0b\n\t_gpu_typeB\x11\n\x0f_restart_policyB\x15\n\x13_rebalance_strategy\"\xf9\x04\n\x15\x44\x61tabaseConfiguration\x12]\n\ncollection\x18\x01 \x01(\x0b\x32\x38.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionH\x00R\ncollection\x88\x01\x01\x12T\n\x07storage\x18\x02 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationStorageH\x01R\x07storage\x88\x01\x01\x12T\n\x07service\x18\x03 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationServiceH\x02R\x07service\x88\x01\x01\x12\x64\n\tlog_level\x18\x04 \x01(\x0e\x32\x36.qdrant.cloud.cluster.v1.DatabaseConfigurationLogLevelB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x03R\x08logLevel\x88\x01\x01\x12H\n\x03tls\x18\x05 \x01(\x0b\x32\x31.qdrant.cloud.cluster.v1.DatabaseConfigurationTlsH\x04R\x03tls\x88\x01\x01\x12Z\n\tinference\x18\x06 \x01(\x0b\x32\x37.qdrant.cloud.cluster.v1.DatabaseConfigurationInferenceH\x05R\tinference\x88\x01\x01\x42\r\n\x0b_collectionB\n\n\x08_storageB\n\n\x08_serviceB\x0c\n\n_log_levelB\x06\n\x04_tlsB\x0c\n\n_inference\"\x9b\x02\n\x1f\x44\x61tabaseConfigurationCollection\x12;\n\x12replication_factor\x18\x01 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x11replicationFactor\x88\x01\x01\x12\x41\n\x18write_consistency_factor\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x01R\x16writeConsistencyFactor\x12\x61\n\x07vectors\x18\x03 \x01(\x0b\x32?.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionVectorsB\x06\xbaH\x03\xc8\x01\x01R\x07vectorsB\x15\n\x13_replication_factor\"R\n&DatabaseConfigurationCollectionVectors\x12\x1c\n\x07on_disk\x18\x01 \x01(\x08H\x00R\x06onDisk\x88\x01\x01\x42\n\n\x08_on_disk\"\x82\x01\n\x1c\x44\x61tabaseConfigurationStorage\x12\x62\n\x0bperformance\x18\x01 \x01(\x0b\x32@.qdrant.cloud.cluster.v1.DatabaseConfigurationStoragePerformanceR\x0bperformance\"~\n\'DatabaseConfigurationStoragePerformance\x12\x30\n\x14optimizer_cpu_budget\x18\x01 \x01(\x05R\x12optimizerCpuBudget\x12!\n\x0c\x61sync_scorer\x18\x02 \x01(\x08R\x0b\x61syncScorer\"\x94\x02\n\x1c\x44\x61tabaseConfigurationService\x12\x42\n\x07\x61pi_key\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x00R\x06\x61piKey\x88\x01\x01\x12T\n\x11read_only_api_key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x01R\x0ereadOnlyApiKey\x88\x01\x01\x12\x19\n\x08jwt_rbac\x18\x03 \x01(\x08R\x07jwtRbac\x12\x1d\n\nenable_tls\x18\x04 \x01(\x08R\tenableTlsB\n\n\x08_api_keyB\x14\n\x12_read_only_api_key\"\x9c\x01\n\x18\x44\x61tabaseConfigurationTls\x12@\n\x04\x63\x65rt\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x04\x63\x65rt\x12>\n\x03key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x03key\":\n\x1e\x44\x61tabaseConfigurationInference\x12\x18\n\x07\x65nabled\x18\x01 \x01(\x08R\x07\x65nabled\")\n\x13\x41\x64\x64itionalResources\x12\x12\n\x04\x64isk\x18\x03 \x01(\rR\x04\x64isk\"\x86\x03\n\nToleration\x12H\n\x03key\x18\x01 \x01(\tB6\xbaH3r1\x18?2-^([a-zA-Z0-9]([-a-zA-Z0-9_.]*[a-zA-Z0-9])?)?$R\x03key\x12X\n\x08operator\x18\x02 \x01(\x0e\x32+.qdrant.cloud.cluster.v1.TolerationOperatorB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x00R\x08operator\x88\x01\x01\x12\x14\n\x05value\x18\x03 \x01(\tR\x05value\x12R\n\x06\x65\x66\x66\x65\x63t\x18\x04 \x01(\x0e\x32).qdrant.cloud.cluster.v1.TolerationEffectB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x01R\x06\x65\x66\x66\x65\x63t\x88\x01\x01\x12;\n\x12toleration_seconds\x18\x05 \x01(\x04\x42\x07\xbaH\x04\x32\x02(\x00H\x02R\x11tolerationSeconds\x88\x01\x01\x42\x0b\n\t_operatorB\t\n\x07_effectB\x15\n\x13_toleration_seconds\"\xb8\x04\n\x0c\x43lusterState\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x19\n\x08nodes_up\x18\x02 \x01(\rR\x07nodesUp\x12=\n\x0crestarted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0brestartedAt\x12\x45\n\x05phase\x18\x04 \x01(\x0e\x32%.qdrant.cloud.cluster.v1.ClusterPhaseB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05phase\x12\x16\n\x06reason\x18\x05 \x01(\tR\x06reason\x12L\n\x08\x65ndpoint\x18\x06 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointB\x06\xbaH\x03\xc8\x01\x01R\x08\x65ndpoint\x12Z\n\tresources\x18\x07 \x01(\x0b\x32\x34.qdrant.cloud.cluster.v1.ClusterNodeResourcesSummaryB\x06\xbaH\x03\xc8\x01\x01R\tresources\x12\x62\n\x10scalability_info\x18\x08 \x01(\x0b\x32/.qdrant.cloud.cluster.v1.ClusterScalabilityInfoB\x06\xbaH\x03\xc8\x01\x01R\x0fscalabilityInfo\x12>\n\x05nodes\x18\t \x03(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterNodeInfoR\x05nodes\"\x94\x02\n\x0f\x43lusterNodeInfo\x12\x1b\n\x04name\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04name\x12\x39\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x18\n\x07version\x18\x03 \x01(\tR\x07version\x12\x44\n\x08\x65ndpoint\x18\x04 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointR\x08\x65ndpoint\x12I\n\x05state\x18\n \x01(\x0e\x32).qdrant.cloud.cluster.v1.ClusterNodeStateB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05state\"y\n\x0f\x43lusterEndpoint\x12\x1a\n\x03url\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01R\x03url\x12$\n\trest_port\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08restPort\x12$\n\tgrpc_port\x18\x03 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08grpcPort\"\xfa\x01\n\x1b\x43lusterNodeResourcesSummary\x12I\n\x04\x64isk\x18\x01 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x04\x64isk\x12G\n\x03ram\x18\x02 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03ram\x12G\n\x03\x63pu\x18\x03 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03\x63pu\"\xfa\x01\n\x14\x43lusterNodeResources\x12\"\n\x04\x62\x61se\x18\x01 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x04\x62\x61se\x12\x34\n\rcomplimentary\x18\x02 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\rcomplimentary\x12.\n\nadditional\x18\x03 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\nadditional\x12*\n\x08reserved\x18\x04 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x08reserved\x12,\n\tavailable\x18\x05 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\tavailable\"\xa0\x01\n\x16\x43lusterScalabilityInfo\x12U\n\x06status\x18\x01 \x01(\x0e\x32\x31.qdrant.cloud.cluster.v1.ClusterScalabilityStatusB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x06status\x12$\n\x06reason\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x06reason\x88\x01\x01\x42\t\n\x07_reason\"\x93\x02\n\rQdrantRelease\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x18\n\x07\x64\x65\x66\x61ult\x18\x02 \x01(\x08R\x07\x64\x65\x66\x61ult\x12\x39\n\x11release_notes_url\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01H\x00R\x0freleaseNotesUrl\x88\x01\x01\x12&\n\x07remarks\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x01R\x07remarks\x88\x01\x01\x12\x1e\n\x0b\x65nd_of_life\x18\x05 \x01(\x08R\tendOfLife\x12 \n\x0bunavailable\x18\x06 \x01(\x08R\x0bunavailableB\x14\n\x12_release_notes_urlB\n\n\x08_remarks\"\xb0\x01\n\x1e\x43reateClusterFromBackupRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12%\n\tbackup_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08\x62\x61\x63kupId\x12>\n\x0c\x63luster_name\x18\x03 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\x0b\x63lusterName\"e\n\x1f\x43reateClusterFromBackupResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster*\xab\x01\n\x12\x43lusterServiceType\x12$\n CLUSTER_SERVICE_TYPE_UNSPECIFIED\x10\x00\x12#\n\x1f\x43LUSTER_SERVICE_TYPE_CLUSTER_IP\x10\x01\x12\"\n\x1e\x43LUSTER_SERVICE_TYPE_NODE_PORT\x10\x02\x12&\n\"CLUSTER_SERVICE_TYPE_LOAD_BALANCER\x10\x03*\xa0\x01\n\x1b\x43lusterConfigurationGpuType\x12.\n*CLUSTER_CONFIGURATION_GPU_TYPE_UNSPECIFIED\x10\x00\x12)\n%CLUSTER_CONFIGURATION_GPU_TYPE_NVIDIA\x10\x01\x12&\n\"CLUSTER_CONFIGURATION_GPU_TYPE_AMD\x10\x02*\xf2\x01\n!ClusterConfigurationRestartPolicy\x12\x34\n0CLUSTER_CONFIGURATION_RESTART_POLICY_UNSPECIFIED\x10\x00\x12\x30\n,CLUSTER_CONFIGURATION_RESTART_POLICY_ROLLING\x10\x01\x12\x31\n-CLUSTER_CONFIGURATION_RESTART_POLICY_PARALLEL\x10\x02\x12\x32\n.CLUSTER_CONFIGURATION_RESTART_POLICY_AUTOMATIC\x10\x03*\x8e\x02\n%ClusterConfigurationRebalanceStrategy\x12\x38\n4CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_UNSPECIFIED\x10\x00\x12\x35\n1CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT\x10\x01\x12\x34\n0CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_SIZE\x10\x02\x12>\n:CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT_AND_SIZE\x10\x03*\xd5\x02\n\x1d\x44\x61tabaseConfigurationLogLevel\x12\x30\n,DATABASE_CONFIGURATION_LOG_LEVEL_UNSPECIFIED\x10\x00\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_TRACE\x10\x01\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_DEBUG\x10\x02\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_INFO\x10\x03\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_WARN\x10\x04\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_ERROR\x10\x05\x12(\n$DATABASE_CONFIGURATION_LOG_LEVEL_OFF\x10\x06*x\n\x12TolerationOperator\x12#\n\x1fTOLERATION_OPERATOR_UNSPECIFIED\x10\x00\x12\x1e\n\x1aTOLERATION_OPERATOR_EXISTS\x10\x01\x12\x1d\n\x19TOLERATION_OPERATOR_EQUAL\x10\x02*\xa4\x01\n\x10TolerationEffect\x12!\n\x1dTOLERATION_EFFECT_UNSPECIFIED\x10\x00\x12!\n\x1dTOLERATION_EFFECT_NO_SCHEDULE\x10\x01\x12(\n$TOLERATION_EFFECT_PREFER_NO_SCHEDULE\x10\x02\x12 \n\x1cTOLERATION_EFFECT_NO_EXECUTE\x10\x03*\xdf\x04\n\x0c\x43lusterPhase\x12\x1d\n\x19\x43LUSTER_PHASE_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LUSTER_PHASE_CREATING\x10\x01\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_CREATE\x10\x02\x12\x1a\n\x16\x43LUSTER_PHASE_UPDATING\x10\x03\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_UPDATE\x10\x04\x12\x19\n\x15\x43LUSTER_PHASE_SCALING\x10\x05\x12\x1b\n\x17\x43LUSTER_PHASE_UPGRADING\x10\x06\x12\x1c\n\x18\x43LUSTER_PHASE_SUSPENDING\x10\x07\x12\x1b\n\x17\x43LUSTER_PHASE_SUSPENDED\x10\x08\x12#\n\x1f\x43LUSTER_PHASE_FAILED_TO_SUSPEND\x10\t\x12\x1a\n\x16\x43LUSTER_PHASE_RESUMING\x10\n\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_RESUME\x10\x0b\x12\x19\n\x15\x43LUSTER_PHASE_HEALTHY\x10\x0c\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_READY\x10\r\x12\x1f\n\x1b\x43LUSTER_PHASE_RECOVERY_MODE\x10\x0e\x12$\n CLUSTER_PHASE_MANUAL_MAINTENANCE\x10\x0f\x12 \n\x1c\x43LUSTER_PHASE_FAILED_TO_SYNC\x10\x10\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_FOUND\x10\x11\x12\x1a\n\x16\x43LUSTER_PHASE_DELETING\x10\x12*\xbb\x01\n\x10\x43lusterNodeState\x12\"\n\x1e\x43LUSTER_NODE_STATE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43LUSTER_NODE_STATE_STARTING\x10\x01\x12\x1e\n\x1a\x43LUSTER_NODE_STATE_HEALTHY\x10\x02\x12 \n\x1c\x43LUSTER_NODE_STATE_UNHEALTHY\x10\x03\x12 \n\x1c\x43LUSTER_NODE_STATE_SUSPENDED\x10\x04*\x9c\x01\n\x18\x43lusterScalabilityStatus\x12*\n&CLUSTER_SCALABILITY_STATUS_UNSPECIFIED\x10\x00\x12+\n\'CLUSTER_SCALABILITY_STATUS_NOT_SCALABLE\x10\x01\x12\'\n#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x02\x32\x9c\x17\n\x0e\x43lusterService\x12\xb4\x01\n\x0cListClusters\x12,.qdrant.cloud.cluster.v1.ListClustersRequest\x1a-.qdrant.cloud.cluster.v1.ListClustersResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x02\x30\x12./api/cluster/v1/accounts/{account_id}/clusters\x12\xd7\x01\n\nGetCluster\x12*.qdrant.cloud.cluster.v1.GetClusterRequest\x1a+.qdrant.cloud.cluster.v1.GetClusterResponse\"p\x8a\xb5\x18\rread:clusters\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster_id\x82\xd3\xe4\x93\x02=\x12;/api/cluster/v1/accounts/{account_id}/clusters/{cluster_id}\x12\xd9\x02\n\rCreateCluster\x12-.qdrant.cloud.cluster.v1.CreateClusterRequest\x1a..qdrant.cloud.cluster.v1.CreateClusterResponse\"\xe8\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster.name\xca\xf3\x18[\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*=/accounts/{req.cluster.account_id}/clusters/{resp.cluster.id}\x82\xd3\xe4\x93\x02;\"6/api/cluster/v1/accounts/{cluster.account_id}/clusters:\x01*\x12\xb4\x03\n\x17\x43reateClusterFromBackup\x12\x37.qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest\x1a\x38.qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse\"\xa5\x02\x8a\xb5\x18\x0frestore:backups\x8a\xb5\x18\x0ewrite:clusters\xa8\xb5\x18\x01\xba\xb5\x18\x16\n\tbackup_id\x12\tbackup_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster_name\xca\xf3\x18t\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*5/accounts/{req.account_id}/clusters/{resp.cluster.id}R\x1f\n\x0e\x66rom_backup_id\x12\rreq.backup_id\x82\xd3\xe4\x93\x02\x44\"B/api/cluster/v1/accounts/{account_id}/backups/{backup_id}/clusters\x12\xe0\x02\n\rUpdateCluster\x12-.qdrant.cloud.cluster.v1.UpdateClusterRequest\x1a..qdrant.cloud.cluster.v1.UpdateClusterResponse\"\xef\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster.id\xca\xf3\x18Y\x08\x02\x12\x07\x63luster\"\x0ereq.cluster.id*.qdrant.cloud.cluster.v1.ClusterConfigurationRebalanceStrategyB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x06R\x11rebalanceStrategy\x88\x01\x01\x42\n\n\x08_versionB\x17\n\x15_additional_resourcesB\x19\n\x17_database_configurationB\x0f\n\r_service_typeB\x0b\n\t_gpu_typeB\x11\n\x0f_restart_policyB\x15\n\x13_rebalance_strategy\"\xf9\x04\n\x15\x44\x61tabaseConfiguration\x12]\n\ncollection\x18\x01 \x01(\x0b\x32\x38.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionH\x00R\ncollection\x88\x01\x01\x12T\n\x07storage\x18\x02 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationStorageH\x01R\x07storage\x88\x01\x01\x12T\n\x07service\x18\x03 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationServiceH\x02R\x07service\x88\x01\x01\x12\x64\n\tlog_level\x18\x04 \x01(\x0e\x32\x36.qdrant.cloud.cluster.v1.DatabaseConfigurationLogLevelB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x03R\x08logLevel\x88\x01\x01\x12H\n\x03tls\x18\x05 \x01(\x0b\x32\x31.qdrant.cloud.cluster.v1.DatabaseConfigurationTlsH\x04R\x03tls\x88\x01\x01\x12Z\n\tinference\x18\x06 \x01(\x0b\x32\x37.qdrant.cloud.cluster.v1.DatabaseConfigurationInferenceH\x05R\tinference\x88\x01\x01\x42\r\n\x0b_collectionB\n\n\x08_storageB\n\n\x08_serviceB\x0c\n\n_log_levelB\x06\n\x04_tlsB\x0c\n\n_inference\"\x9b\x02\n\x1f\x44\x61tabaseConfigurationCollection\x12;\n\x12replication_factor\x18\x01 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x11replicationFactor\x88\x01\x01\x12\x41\n\x18write_consistency_factor\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x01R\x16writeConsistencyFactor\x12\x61\n\x07vectors\x18\x03 \x01(\x0b\x32?.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionVectorsB\x06\xbaH\x03\xc8\x01\x01R\x07vectorsB\x15\n\x13_replication_factor\"R\n&DatabaseConfigurationCollectionVectors\x12\x1c\n\x07on_disk\x18\x01 \x01(\x08H\x00R\x06onDisk\x88\x01\x01\x42\n\n\x08_on_disk\"\x82\x01\n\x1c\x44\x61tabaseConfigurationStorage\x12\x62\n\x0bperformance\x18\x01 \x01(\x0b\x32@.qdrant.cloud.cluster.v1.DatabaseConfigurationStoragePerformanceR\x0bperformance\"~\n\'DatabaseConfigurationStoragePerformance\x12\x30\n\x14optimizer_cpu_budget\x18\x01 \x01(\x05R\x12optimizerCpuBudget\x12!\n\x0c\x61sync_scorer\x18\x02 \x01(\x08R\x0b\x61syncScorer\"\x94\x02\n\x1c\x44\x61tabaseConfigurationService\x12\x42\n\x07\x61pi_key\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x00R\x06\x61piKey\x88\x01\x01\x12T\n\x11read_only_api_key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x01R\x0ereadOnlyApiKey\x88\x01\x01\x12\x19\n\x08jwt_rbac\x18\x03 \x01(\x08R\x07jwtRbac\x12\x1d\n\nenable_tls\x18\x04 \x01(\x08R\tenableTlsB\n\n\x08_api_keyB\x14\n\x12_read_only_api_key\"\x9c\x01\n\x18\x44\x61tabaseConfigurationTls\x12@\n\x04\x63\x65rt\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x04\x63\x65rt\x12>\n\x03key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x03key\":\n\x1e\x44\x61tabaseConfigurationInference\x12\x18\n\x07\x65nabled\x18\x01 \x01(\x08R\x07\x65nabled\")\n\x13\x41\x64\x64itionalResources\x12\x12\n\x04\x64isk\x18\x03 \x01(\rR\x04\x64isk\"\x86\x03\n\nToleration\x12H\n\x03key\x18\x01 \x01(\tB6\xbaH3r1\x18?2-^([a-zA-Z0-9]([-a-zA-Z0-9_.]*[a-zA-Z0-9])?)?$R\x03key\x12X\n\x08operator\x18\x02 \x01(\x0e\x32+.qdrant.cloud.cluster.v1.TolerationOperatorB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x00R\x08operator\x88\x01\x01\x12\x14\n\x05value\x18\x03 \x01(\tR\x05value\x12R\n\x06\x65\x66\x66\x65\x63t\x18\x04 \x01(\x0e\x32).qdrant.cloud.cluster.v1.TolerationEffectB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x01R\x06\x65\x66\x66\x65\x63t\x88\x01\x01\x12;\n\x12toleration_seconds\x18\x05 \x01(\x04\x42\x07\xbaH\x04\x32\x02(\x00H\x02R\x11tolerationSeconds\x88\x01\x01\x42\x0b\n\t_operatorB\t\n\x07_effectB\x15\n\x13_toleration_seconds\"\xb8\x04\n\x0c\x43lusterState\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x19\n\x08nodes_up\x18\x02 \x01(\rR\x07nodesUp\x12=\n\x0crestarted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0brestartedAt\x12\x45\n\x05phase\x18\x04 \x01(\x0e\x32%.qdrant.cloud.cluster.v1.ClusterPhaseB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05phase\x12\x16\n\x06reason\x18\x05 \x01(\tR\x06reason\x12L\n\x08\x65ndpoint\x18\x06 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointB\x06\xbaH\x03\xc8\x01\x01R\x08\x65ndpoint\x12Z\n\tresources\x18\x07 \x01(\x0b\x32\x34.qdrant.cloud.cluster.v1.ClusterNodeResourcesSummaryB\x06\xbaH\x03\xc8\x01\x01R\tresources\x12\x62\n\x10scalability_info\x18\x08 \x01(\x0b\x32/.qdrant.cloud.cluster.v1.ClusterScalabilityInfoB\x06\xbaH\x03\xc8\x01\x01R\x0fscalabilityInfo\x12>\n\x05nodes\x18\t \x03(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterNodeInfoR\x05nodes\"\x94\x02\n\x0f\x43lusterNodeInfo\x12\x1b\n\x04name\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04name\x12\x39\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x18\n\x07version\x18\x03 \x01(\tR\x07version\x12\x44\n\x08\x65ndpoint\x18\x04 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointR\x08\x65ndpoint\x12I\n\x05state\x18\n \x01(\x0e\x32).qdrant.cloud.cluster.v1.ClusterNodeStateB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05state\"y\n\x0f\x43lusterEndpoint\x12\x1a\n\x03url\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01R\x03url\x12$\n\trest_port\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08restPort\x12$\n\tgrpc_port\x18\x03 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08grpcPort\"\xfa\x01\n\x1b\x43lusterNodeResourcesSummary\x12I\n\x04\x64isk\x18\x01 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x04\x64isk\x12G\n\x03ram\x18\x02 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03ram\x12G\n\x03\x63pu\x18\x03 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03\x63pu\"\xfa\x01\n\x14\x43lusterNodeResources\x12\"\n\x04\x62\x61se\x18\x01 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x04\x62\x61se\x12\x34\n\rcomplimentary\x18\x02 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\rcomplimentary\x12.\n\nadditional\x18\x03 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\nadditional\x12*\n\x08reserved\x18\x04 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x08reserved\x12,\n\tavailable\x18\x05 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\tavailable\"\xa0\x01\n\x16\x43lusterScalabilityInfo\x12U\n\x06status\x18\x01 \x01(\x0e\x32\x31.qdrant.cloud.cluster.v1.ClusterScalabilityStatusB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x06status\x12$\n\x06reason\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x06reason\x88\x01\x01\x42\t\n\x07_reason\"\x93\x02\n\rQdrantRelease\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x18\n\x07\x64\x65\x66\x61ult\x18\x02 \x01(\x08R\x07\x64\x65\x66\x61ult\x12\x39\n\x11release_notes_url\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01H\x00R\x0freleaseNotesUrl\x88\x01\x01\x12&\n\x07remarks\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x01R\x07remarks\x88\x01\x01\x12\x1e\n\x0b\x65nd_of_life\x18\x05 \x01(\x08R\tendOfLife\x12 \n\x0bunavailable\x18\x06 \x01(\x08R\x0bunavailableB\x14\n\x12_release_notes_urlB\n\n\x08_remarks\"\xb0\x01\n\x1e\x43reateClusterFromBackupRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12%\n\tbackup_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08\x62\x61\x63kupId\x12>\n\x0c\x63luster_name\x18\x03 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\x0b\x63lusterName\"e\n\x1f\x43reateClusterFromBackupResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster\"\xe7\x02\n\x0fGetQuoteRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x42\n\x07\x63luster\x18\x02 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:\xe6\x01\xbaH\xe2\x01\x1a\xdf\x01\n\x19quote.no_read_only_fields\x12Mread-only fields (id, created_at, deleted_at, state) must not be set on quote\x1asthis.cluster.id == \'\' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)\"\x97\x03\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@\n\x18original_price_per_month\x18\x03 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12\x42\n\x19\x64iscounted_price_per_hour\x18\x04 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x16\x64iscountedPricePerHour\x12\x44\n\x1a\x64iscounted_price_per_month\x18\x05 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x17\x64iscountedPricePerMonth\x12H\n\x13\x64iscount_percentage\x18\x06 \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*\xab\x01\n\x12\x43lusterServiceType\x12$\n CLUSTER_SERVICE_TYPE_UNSPECIFIED\x10\x00\x12#\n\x1f\x43LUSTER_SERVICE_TYPE_CLUSTER_IP\x10\x01\x12\"\n\x1e\x43LUSTER_SERVICE_TYPE_NODE_PORT\x10\x02\x12&\n\"CLUSTER_SERVICE_TYPE_LOAD_BALANCER\x10\x03*\xa0\x01\n\x1b\x43lusterConfigurationGpuType\x12.\n*CLUSTER_CONFIGURATION_GPU_TYPE_UNSPECIFIED\x10\x00\x12)\n%CLUSTER_CONFIGURATION_GPU_TYPE_NVIDIA\x10\x01\x12&\n\"CLUSTER_CONFIGURATION_GPU_TYPE_AMD\x10\x02*\xf2\x01\n!ClusterConfigurationRestartPolicy\x12\x34\n0CLUSTER_CONFIGURATION_RESTART_POLICY_UNSPECIFIED\x10\x00\x12\x30\n,CLUSTER_CONFIGURATION_RESTART_POLICY_ROLLING\x10\x01\x12\x31\n-CLUSTER_CONFIGURATION_RESTART_POLICY_PARALLEL\x10\x02\x12\x32\n.CLUSTER_CONFIGURATION_RESTART_POLICY_AUTOMATIC\x10\x03*\x8e\x02\n%ClusterConfigurationRebalanceStrategy\x12\x38\n4CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_UNSPECIFIED\x10\x00\x12\x35\n1CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT\x10\x01\x12\x34\n0CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_SIZE\x10\x02\x12>\n:CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT_AND_SIZE\x10\x03*\xd5\x02\n\x1d\x44\x61tabaseConfigurationLogLevel\x12\x30\n,DATABASE_CONFIGURATION_LOG_LEVEL_UNSPECIFIED\x10\x00\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_TRACE\x10\x01\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_DEBUG\x10\x02\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_INFO\x10\x03\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_WARN\x10\x04\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_ERROR\x10\x05\x12(\n$DATABASE_CONFIGURATION_LOG_LEVEL_OFF\x10\x06*x\n\x12TolerationOperator\x12#\n\x1fTOLERATION_OPERATOR_UNSPECIFIED\x10\x00\x12\x1e\n\x1aTOLERATION_OPERATOR_EXISTS\x10\x01\x12\x1d\n\x19TOLERATION_OPERATOR_EQUAL\x10\x02*\xa4\x01\n\x10TolerationEffect\x12!\n\x1dTOLERATION_EFFECT_UNSPECIFIED\x10\x00\x12!\n\x1dTOLERATION_EFFECT_NO_SCHEDULE\x10\x01\x12(\n$TOLERATION_EFFECT_PREFER_NO_SCHEDULE\x10\x02\x12 \n\x1cTOLERATION_EFFECT_NO_EXECUTE\x10\x03*\xdf\x04\n\x0c\x43lusterPhase\x12\x1d\n\x19\x43LUSTER_PHASE_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LUSTER_PHASE_CREATING\x10\x01\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_CREATE\x10\x02\x12\x1a\n\x16\x43LUSTER_PHASE_UPDATING\x10\x03\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_UPDATE\x10\x04\x12\x19\n\x15\x43LUSTER_PHASE_SCALING\x10\x05\x12\x1b\n\x17\x43LUSTER_PHASE_UPGRADING\x10\x06\x12\x1c\n\x18\x43LUSTER_PHASE_SUSPENDING\x10\x07\x12\x1b\n\x17\x43LUSTER_PHASE_SUSPENDED\x10\x08\x12#\n\x1f\x43LUSTER_PHASE_FAILED_TO_SUSPEND\x10\t\x12\x1a\n\x16\x43LUSTER_PHASE_RESUMING\x10\n\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_RESUME\x10\x0b\x12\x19\n\x15\x43LUSTER_PHASE_HEALTHY\x10\x0c\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_READY\x10\r\x12\x1f\n\x1b\x43LUSTER_PHASE_RECOVERY_MODE\x10\x0e\x12$\n CLUSTER_PHASE_MANUAL_MAINTENANCE\x10\x0f\x12 \n\x1c\x43LUSTER_PHASE_FAILED_TO_SYNC\x10\x10\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_FOUND\x10\x11\x12\x1a\n\x16\x43LUSTER_PHASE_DELETING\x10\x12*\xbb\x01\n\x10\x43lusterNodeState\x12\"\n\x1e\x43LUSTER_NODE_STATE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43LUSTER_NODE_STATE_STARTING\x10\x01\x12\x1e\n\x1a\x43LUSTER_NODE_STATE_HEALTHY\x10\x02\x12 \n\x1c\x43LUSTER_NODE_STATE_UNHEALTHY\x10\x03\x12 \n\x1c\x43LUSTER_NODE_STATE_SUSPENDED\x10\x04*\x9c\x01\n\x18\x43lusterScalabilityStatus\x12*\n&CLUSTER_SCALABILITY_STATUS_UNSPECIFIED\x10\x00\x12+\n\'CLUSTER_SCALABILITY_STATUS_NOT_SCALABLE\x10\x01\x12\'\n#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x02\x32\xc7\x18\n\x0e\x43lusterService\x12\xb4\x01\n\x0cListClusters\x12,.qdrant.cloud.cluster.v1.ListClustersRequest\x1a-.qdrant.cloud.cluster.v1.ListClustersResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x02\x30\x12./api/cluster/v1/accounts/{account_id}/clusters\x12\xd7\x01\n\nGetCluster\x12*.qdrant.cloud.cluster.v1.GetClusterRequest\x1a+.qdrant.cloud.cluster.v1.GetClusterResponse\"p\x8a\xb5\x18\rread:clusters\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster_id\x82\xd3\xe4\x93\x02=\x12;/api/cluster/v1/accounts/{account_id}/clusters/{cluster_id}\x12\xd9\x02\n\rCreateCluster\x12-.qdrant.cloud.cluster.v1.CreateClusterRequest\x1a..qdrant.cloud.cluster.v1.CreateClusterResponse\"\xe8\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster.name\xca\xf3\x18[\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*=/accounts/{req.cluster.account_id}/clusters/{resp.cluster.id}\x82\xd3\xe4\x93\x02;\"6/api/cluster/v1/accounts/{cluster.account_id}/clusters:\x01*\x12\xb4\x03\n\x17\x43reateClusterFromBackup\x12\x37.qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest\x1a\x38.qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse\"\xa5\x02\x8a\xb5\x18\x0frestore:backups\x8a\xb5\x18\x0ewrite:clusters\xa8\xb5\x18\x01\xba\xb5\x18\x16\n\tbackup_id\x12\tbackup_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster_name\xca\xf3\x18t\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*5/accounts/{req.account_id}/clusters/{resp.cluster.id}R\x1f\n\x0e\x66rom_backup_id\x12\rreq.backup_id\x82\xd3\xe4\x93\x02\x44\"B/api/cluster/v1/accounts/{account_id}/backups/{backup_id}/clusters\x12\xe0\x02\n\rUpdateCluster\x12-.qdrant.cloud.cluster.v1.UpdateClusterRequest\x1a..qdrant.cloud.cluster.v1.UpdateClusterResponse\"\xef\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster.id\xca\xf3\x18Y\x08\x02\x12\x07\x63luster\"\x0ereq.cluster.id* None: ... + +class GetQuoteRequest(_message.Message): + __slots__ = ("account_id", "cluster") + ACCOUNT_ID_FIELD_NUMBER: _ClassVar[int] + CLUSTER_FIELD_NUMBER: _ClassVar[int] + account_id: str + cluster: Cluster + def __init__(self, account_id: _Optional[str] = ..., cluster: _Optional[_Union[Cluster, _Mapping]] = ...) -> None: ... + +class GetQuoteResponse(_message.Message): + __slots__ = ("currency", "original_price_per_hour", "original_price_per_month", "discounted_price_per_hour", "discounted_price_per_month", "discount_percentage") + CURRENCY_FIELD_NUMBER: _ClassVar[int] + ORIGINAL_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] + ORIGINAL_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] + DISCOUNTED_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] + DISCOUNTED_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] + DISCOUNT_PERCENTAGE_FIELD_NUMBER: _ClassVar[int] + currency: str + original_price_per_hour: int + original_price_per_month: int + discounted_price_per_hour: int + discounted_price_per_month: int + discount_percentage: float + def __init__(self, currency: _Optional[str] = ..., original_price_per_hour: _Optional[int] = ..., original_price_per_month: _Optional[int] = ..., discounted_price_per_hour: _Optional[int] = ..., discounted_price_per_month: _Optional[int] = ..., discount_percentage: _Optional[float] = ...) -> None: ... diff --git a/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py index 4add8046..a2ca9950 100644 --- a/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py +++ b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py @@ -65,6 +65,11 @@ def __init__(self, channel): request_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesRequest.SerializeToString, response_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesResponse.FromString, _registered_method=True) + self.GetQuote = channel.unary_unary( + '/qdrant.cloud.cluster.v1.ClusterService/GetQuote', + request_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteRequest.SerializeToString, + response_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteResponse.FromString, + _registered_method=True) class ClusterServiceServicer(object): @@ -164,6 +169,17 @@ def ListQdrantReleases(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 and monthly costs, + and any applicable discounts for the specified cluster configuration. + Required permissions: + - read:clusters + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def add_ClusterServiceServicer_to_server(servicer, server): rpc_method_handlers = { @@ -217,6 +233,11 @@ def add_ClusterServiceServicer_to_server(servicer, server): request_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesRequest.FromString, response_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesResponse.SerializeToString, ), + 'GetQuote': grpc.unary_unary_rpc_method_handler( + servicer.GetQuote, + request_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteRequest.FromString, + response_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( 'qdrant.cloud.cluster.v1.ClusterService', rpc_method_handlers) @@ -498,3 +519,30 @@ def ListQdrantReleases(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.cluster.v1.ClusterService/GetQuote', + qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteRequest.SerializeToString, + qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__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/cluster/v1/cluster-ClusterService_connectquery.d.ts b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.d.ts index d58429a8..56998536 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.d.ts +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.d.ts @@ -87,3 +87,13 @@ export const suggestClusterName: typeof ClusterService["method"]["suggestCluster * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases */ export const listQdrantReleases: typeof ClusterService["method"]["listQdrantReleases"]; +/** + * Gets a price quote for a cluster configuration. + * This endpoint calculates pricing information including hourly and monthly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - read:clusters + * + * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.GetQuote + */ +export const getQuote: typeof ClusterService["method"]["getQuote"]; diff --git a/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js index 10ab028d..e2f458cd 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js @@ -96,3 +96,14 @@ export const suggestClusterName = ClusterService.method.suggestClusterName; * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases */ export const listQdrantReleases = ClusterService.method.listQdrantReleases; + +/** + * Gets a price quote for a cluster configuration. + * This endpoint calculates pricing information including hourly and monthly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - read:clusters + * + * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.GetQuote + */ +export const getQuote = ClusterService.method.getQuote; diff --git a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts index 71982139..3169845a 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts @@ -2028,6 +2028,124 @@ export declare type CreateClusterFromBackupResponseValid = Message<"qdrant.cloud */ export declare const CreateClusterFromBackupResponseSchema: GenMessage; +/** + * GetQuoteRequest is the request for the GetQuote function + * + * @generated from message qdrant.cloud.cluster.v1.GetQuoteRequest + */ +export declare type GetQuoteRequest = Message<"qdrant.cloud.cluster.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 cluster configuration to get a quote for. + * This should contain the same information as you would use for CreateCluster, + * except without readonly fields (id, created_at, deleted_at, state). + * + * @generated from field: qdrant.cloud.cluster.v1.Cluster cluster = 2; + */ + cluster?: Cluster; +}; + +/** + * GetQuoteRequest is the request for the GetQuote function + * + * @generated from message qdrant.cloud.cluster.v1.GetQuoteRequest + */ +export declare type GetQuoteRequestValid = Message<"qdrant.cloud.cluster.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 cluster configuration to get a quote for. + * This should contain the same information as you would use for CreateCluster, + * except without readonly fields (id, created_at, deleted_at, state). + * + * @generated from field: qdrant.cloud.cluster.v1.Cluster cluster = 2; + */ + cluster: ClusterValid; +}; + +/** + * Describes the message qdrant.cloud.cluster.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.cluster.v1.GetQuoteResponse + */ +export declare type GetQuoteResponse = Message<"qdrant.cloud.cluster.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 original price per month in millicents, before any discounts. + * Calculated as original_price_per_hour * 24 * 30 (720 hours). + * + * @generated from field: int64 original_price_per_month = 3; + */ + originalPricePerMonth: 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 = 4; + */ + discountedPricePerHour: bigint; + + /** + * The discounted price per month in millicents, after applying discounts. + * Calculated as discounted_price_per_hour * 24 * 30 (720 hours). + * If no discounts are applied, this will be the same as original_price_per_month. + * + * @generated from field: int64 discounted_price_per_month = 5; + */ + discountedPricePerMonth: 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 = 6; + */ + discountPercentage: number; +}; + +export declare type GetQuoteResponseValid = GetQuoteResponse; + +/** + * Describes the message qdrant.cloud.cluster.v1.GetQuoteResponse. + * Use `create(GetQuoteResponseSchema)` to create a new message. + */ +export declare const GetQuoteResponseSchema: GenMessage; + /** * ClusterServiceType defines the type of service to use for the cluster. * See: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/#ServiceSpec @@ -2673,5 +2791,19 @@ export declare const ClusterService: GenService<{ input: typeof ListQdrantReleasesRequestSchema; output: typeof ListQdrantReleasesResponseSchema; }, + /** + * Gets a price quote for a cluster configuration. + * This endpoint calculates pricing information including hourly and monthly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - read:clusters + * + * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.GetQuote + */ + getQuote: { + methodKind: "unary"; + input: typeof GetQuoteRequestSchema; + output: typeof GetQuoteResponseSchema; + }, }>; diff --git a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js index f8db7eba..29ddb708 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js @@ -13,7 +13,7 @@ import { file_qdrant_cloud_event_v1_events } from "../../event/v1/events_pb.js"; * Describes the file qdrant/cloud/cluster/v1/cluster.proto. */ export const file_qdrant_cloud_cluster_v1_cluster = /*@__PURE__*/ - fileDesc("CiVxZHJhbnQvY2xvdWQvY2x1c3Rlci92MS9jbHVzdGVyLnByb3RvEhdxZHJhbnQuY2xvdWQuY2x1c3Rlci52MSKHBQoTTGlzdENsdXN0ZXJzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARInChFjbG91ZF9wcm92aWRlcl9pZBgKIAEoCUIHukgEcgIQA0gAiAEBEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgLIAEoCUIHukgEcgIQAUgBiAEBOsUDukjBAxqxAQonbGlzdF9jbHVzdGVycy5jbG91ZF9wcm92aWRlcl9pZF9wcmVzZW50EkJjbG91ZF9wcm92aWRlcl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyBzZXQaQiFoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpIHx8IGhhcyh0aGlzLmNsb3VkX3Byb3ZpZGVyX2lkKRqKAgogY2x1c3Rlci5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQSSGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBtdXN0IGJlIGEgVVVJRCBpZiBjbG91ZF9wcm92aWRlcl9pZCBpcyAnaHlicmlkJxqbAXRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykgfHwgdGhpcy5jbG91ZF9wcm92aWRlcl9pZCE9ICdoeWJyaWQnQhQKEl9jbG91ZF9wcm92aWRlcl9pZEIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RDbHVzdGVyc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlciJPChFHZXRDbHVzdGVyUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIcCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABASJPChJHZXRDbHVzdGVyUmVzcG9uc2USOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBASLEAgoUQ3JlYXRlQ2x1c3RlclJlcXVlc3QSOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBATrwAbpI7AEa6QEKImNyZWF0ZV9jbHVzdGVyLm5vX3JlYWRfb25seV9maWVsZHMSTnJlYWQtb25seSBmaWVsZHMgKGlkLCBjcmVhdGVkX2F0LCBkZWxldGVkX2F0LCBzdGF0ZSkgbXVzdCBub3QgYmUgc2V0IG9uIGNyZWF0ZRpzdGhpcy5jbHVzdGVyLmlkID09ICcnICYmICFoYXModGhpcy5jbHVzdGVyLmNyZWF0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLmRlbGV0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLnN0YXRlKSK7AQoVQ3JlYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChxjcmVhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkisAEKFFVwZGF0ZUNsdXN0ZXJSZXF1ZXN0EjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6XbpIWhpYChl1cGRhdGVfY2x1c3Rlci5pZF9wcmVzZW50EiRjbHVzdGVyLmlkIGlzIHJlcXVpcmVkIGZvciBhbiB1cGRhdGUaFXRoaXMuY2x1c3Rlci5pZCAhPSAnJyK7AQoVVXBkYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChx1cGRhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkiggEKFERlbGV0ZUNsdXN0ZXJSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhwKCmNsdXN0ZXJfaWQYAiABKAlCCLpIBXIDsAEBEhsKDmRlbGV0ZV9iYWNrdXBzGAMgASgISACIAQFCEQoPX2RlbGV0ZV9iYWNrdXBzIhcKFURlbGV0ZUNsdXN0ZXJSZXNwb25zZSJTChVSZXN0YXJ0Q2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWUmVzdGFydENsdXN0ZXJSZXNwb25zZSJTChVTdXNwZW5kQ2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWU3VzcGVuZENsdXN0ZXJSZXNwb25zZSI5ChlTdWdnZXN0Q2x1c3Rlck5hbWVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBIjMKGlN1Z2dlc3RDbHVzdGVyTmFtZVJlc3BvbnNlEhUKBG5hbWUYASABKAlCB7pIBHICEAEiawoZTGlzdFFkcmFudFJlbGVhc2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIhCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABAUgAiAEBQg0KC19jbHVzdGVyX2lkIlMKGkxpc3RRZHJhbnRSZWxlYXNlc1Jlc3BvbnNlEjUKBWl0ZW1zGAEgAygLMiYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUWRyYW50UmVsZWFzZSLLBgoHQ2x1c3RlchIKCgJpZBgBIAEoCRIuCgpjcmVhdGVkX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIcCgphY2NvdW50X2lkGAMgASgJQgi6SAVyA7ABARIpCgRuYW1lGAQgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQSLgoKZGVsZXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoRY2xvdWRfcHJvdmlkZXJfaWQYCiABKAlCB7pIBHICEAMSKQoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkGAsgASgJQge6SARyAhABEkwKDWNvbmZpZ3VyYXRpb24YFCABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvbkIGukgDyAEBEjQKBXN0YXRlGGQgASgLMiUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlclN0YXRlOrcDukizAxqjAQoKY2x1c3Rlci5pZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeXRoaXMuaWQubWF0Y2hlcygnXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQnKSB8fCAhaGFzKHRoaXMuY3JlYXRlZF9hdCkaigIKIGNsdXN0ZXIuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEkhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgbXVzdCBiZSBhIFVVSUQgaWYgY2xvdWRfcHJvdmlkZXJfaWQgaXMgJ2h5YnJpZCcamwF0aGlzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZC5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpIHx8IHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQhPSAnaHlicmlkJyLUCgoUQ2x1c3RlckNvbmZpZ3VyYXRpb24SNAoQbGFzdF9tb2RpZmllZF9hdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoPbnVtYmVyX29mX25vZGVzGAIgASgNQgm6SAYqBBgUKAESPAoHdmVyc2lvbhgDIAEoCUImukgjciEyH14odihcZCspXC4oXGQrKVwuKFxkKyl8bGF0ZXN0KSRIAIgBARIcCgpwYWNrYWdlX2lkGAQgASgJQgi6SAVyA7ABARJPChRhZGRpdGlvbmFsX3Jlc291cmNlcxgFIAEoCzIsLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkFkZGl0aW9uYWxSZXNvdXJjZXNIAYgBARJTChZkYXRhYmFzZV9jb25maWd1cmF0aW9uGAcgASgLMi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uSAKIAQESQQoNbm9kZV9zZWxlY3RvchgIIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEkIKC3RvbGVyYXRpb25zGAkgAygLMiMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkIIukgFkgECEAoSPwoLYW5ub3RhdGlvbnMYCiADKAsyIC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLktleVZhbHVlQgi6SAWSAQIQChIxChhhbGxvd2VkX2lwX3NvdXJjZV9yYW5nZXMYCyADKAlCD7pIDJIBCRAUIgVyA/ABARJSCgxzZXJ2aWNlX3R5cGUYDCABKA4yKy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2VydmljZVR5cGVCCrpIB4IBBBABIABIA4gBARJHChNzZXJ2aWNlX2Fubm90YXRpb25zGA0gAygLMiAucWRyYW50LmNsb3VkLmNvbW1vbi52MS5LZXlWYWx1ZUIIukgFkgECEAoSPgoKcG9kX2xhYmVscxgOIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEigKF3Jlc2VydmVkX2NwdV9wZXJjZW50YWdlGBQgASgNQge6SAQqAhhQEisKGnJlc2VydmVkX21lbW9yeV9wZXJjZW50YWdlGBUgASgNQge6SAQqAhhQElcKCGdwdV90eXBlGBYgASgOMjQucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckNvbmZpZ3VyYXRpb25HcHVUeXBlQgq6SAeCAQQQASAASASIAQESYwoOcmVzdGFydF9wb2xpY3kYFyABKA4yOi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlc3RhcnRQb2xpY3lCCrpIB4IBBBABIABIBYgBARJrChJyZWJhbGFuY2Vfc3RyYXRlZ3kYGCABKA4yPi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlYmFsYW5jZVN0cmF0ZWd5Qgq6SAeCAQQQASAASAaIAQFCCgoIX3ZlcnNpb25CFwoVX2FkZGl0aW9uYWxfcmVzb3VyY2VzQhkKF19kYXRhYmFzZV9jb25maWd1cmF0aW9uQg8KDV9zZXJ2aWNlX3R5cGVCCwoJX2dwdV90eXBlQhEKD19yZXN0YXJ0X3BvbGljeUIVChNfcmViYWxhbmNlX3N0cmF0ZWd5IsEEChVEYXRhYmFzZUNvbmZpZ3VyYXRpb24SUQoKY29sbGVjdGlvbhgBIAEoCzI4LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25IAIgBARJLCgdzdG9yYWdlGAIgASgLMjUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZUgBiAEBEksKB3NlcnZpY2UYAyABKAsyNS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlSAKIAQESWgoJbG9nX2xldmVsGAQgASgOMjYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uTG9nTGV2ZWxCCrpIB4IBBBABIABIA4gBARJDCgN0bHMYBSABKAsyMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UbHNIBIgBARJPCglpbmZlcmVuY2UYBiABKAsyNy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25JbmZlcmVuY2VIBYgBAUINCgtfY29sbGVjdGlvbkIKCghfc3RvcmFnZUIKCghfc2VydmljZUIMCgpfbG9nX2xldmVsQgYKBF90bHNCDAoKX2luZmVyZW5jZSLnAQofRGF0YWJhc2VDb25maWd1cmF0aW9uQ29sbGVjdGlvbhIoChJyZXBsaWNhdGlvbl9mYWN0b3IYASABKA1CB7pIBCoCKAFIAIgBARIpChh3cml0ZV9jb25zaXN0ZW5jeV9mYWN0b3IYAiABKAVCB7pIBBoCKAESWAoHdmVjdG9ycxgDIAEoCzI/LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25WZWN0b3JzQga6SAPIAQFCFQoTX3JlcGxpY2F0aW9uX2ZhY3RvciJKCiZEYXRhYmFzZUNvbmZpZ3VyYXRpb25Db2xsZWN0aW9uVmVjdG9ycxIUCgdvbl9kaXNrGAEgASgISACIAQFCCgoIX29uX2Rpc2sidQocRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZRJVCgtwZXJmb3JtYW5jZRgBIAEoCzJALnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvblN0b3JhZ2VQZXJmb3JtYW5jZSJdCidEYXRhYmFzZUNvbmZpZ3VyYXRpb25TdG9yYWdlUGVyZm9ybWFuY2USHAoUb3B0aW1pemVyX2NwdV9idWRnZXQYASABKAUSFAoMYXN5bmNfc2NvcmVyGAIgASgIIugBChxEYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlEjoKB2FwaV9rZXkYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkgAiAEBEkQKEXJlYWRfb25seV9hcGlfa2V5GAIgASgLMiQucWRyYW50LmNsb3VkLmNvbW1vbi52MS5TZWNyZXRLZXlSZWZIAYgBARIQCghqd3RfcmJhYxgDIAEoCBISCgplbmFibGVfdGxzGAQgASgIQgoKCF9hcGlfa2V5QhQKEl9yZWFkX29ubHlfYXBpX2tleSKRAQoYRGF0YWJhc2VDb25maWd1cmF0aW9uVGxzEjoKBGNlcnQYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkIGukgDyAEBEjkKA2tleRgCIAEoCzIkLnFkcmFudC5jbG91ZC5jb21tb24udjEuU2VjcmV0S2V5UmVmQga6SAPIAQEiMQoeRGF0YWJhc2VDb25maWd1cmF0aW9uSW5mZXJlbmNlEg8KB2VuYWJsZWQYASABKAgiIwoTQWRkaXRpb25hbFJlc291cmNlcxIMCgRkaXNrGAMgASgNItUCCgpUb2xlcmF0aW9uEkMKA2tleRgBIAEoCUI2ukgzcjEYPzItXihbYS16QS1aMC05XShbLWEtekEtWjAtOV8uXSpbYS16QS1aMC05XSk/KT8kEk4KCG9wZXJhdG9yGAIgASgOMisucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbk9wZXJhdG9yQgq6SAeCAQQQASAASACIAQESDQoFdmFsdWUYAyABKAkSSgoGZWZmZWN0GAQgASgOMikucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkVmZmVjdEIKukgHggEEEAEgAEgBiAEBEigKEnRvbGVyYXRpb25fc2Vjb25kcxgFIAEoBEIHukgEMgIoAEgCiAEBQgsKCV9vcGVyYXRvckIJCgdfZWZmZWN0QhUKE190b2xlcmF0aW9uX3NlY29uZHMi3QMKDENsdXN0ZXJTdGF0ZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEhAKCG5vZGVzX3VwGAIgASgNEjAKDHJlc3RhcnRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASPgoFcGhhc2UYBCABKA4yJS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyUGhhc2VCCLpIBYIBAhABEg4KBnJlYXNvbhgFIAEoCRJCCghlbmRwb2ludBgGIAEoCzIoLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJFbmRwb2ludEIGukgDyAEBEk8KCXJlc291cmNlcxgHIAEoCzI0LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzU3VtbWFyeUIGukgDyAEBElEKEHNjYWxhYmlsaXR5X2luZm8YCCABKAsyLy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlJbmZvQga6SAPIAQESNwoFbm9kZXMYCSADKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZUluZm8i6QEKD0NsdXN0ZXJOb2RlSW5mbxIVCgRuYW1lGAEgASgJQge6SARyAhABEi4KCnN0YXJ0ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg8KB3ZlcnNpb24YAyABKAkSOgoIZW5kcG9pbnQYBCABKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyRW5kcG9pbnQSQgoFc3RhdGUYCiABKA4yKS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVN0YXRlQgi6SAWCAQIQASJgCg9DbHVzdGVyRW5kcG9pbnQSFQoDdXJsGAEgASgJQgi6SAVyA4gBARIaCglyZXN0X3BvcnQYAiABKAVCB7pIBBoCIAASGgoJZ3JwY19wb3J0GAMgASgFQge6SAQaAiAAIuoBChtDbHVzdGVyTm9kZVJlc291cmNlc1N1bW1hcnkSQwoEZGlzaxgBIAEoCzItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzQga6SAPIAQESQgoDcmFtGAIgASgLMi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3Rlck5vZGVSZXNvdXJjZXNCBrpIA8gBARJCCgNjcHUYAyABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVJlc291cmNlc0IGukgDyAEBIsQBChRDbHVzdGVyTm9kZVJlc291cmNlcxIcCgRiYXNlGAEgASgBQg66SAsSCSkAAAAAAAAAABIlCg1jb21wbGltZW50YXJ5GAIgASgBQg66SAsSCSkAAAAAAAAAABIiCgphZGRpdGlvbmFsGAMgASgBQg66SAsSCSkAAAAAAAAAABIgCghyZXNlcnZlZBgEIAEoAUIOukgLEgkpAAAAAAAAAAASIQoJYXZhaWxhYmxlGAUgASgBQg66SAsSCSkAAAAAAAAAACKQAQoWQ2x1c3RlclNjYWxhYmlsaXR5SW5mbxJNCgZzdGF0dXMYASABKA4yMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlTdGF0dXNCCrpIB4IBBBABIAASHAoGcmVhc29uGAIgASgJQge6SARyAhABSACIAQFCCQoHX3JlYXNvbiLPAQoNUWRyYW50UmVsZWFzZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEg8KB2RlZmF1bHQYAiABKAgSKAoRcmVsZWFzZV9ub3Rlc191cmwYAyABKAlCCLpIBXIDiAEBSACIAQESHQoHcmVtYXJrcxgEIAEoCUIHukgEcgIQAUgBiAEBEhMKC2VuZF9vZl9saWZlGAUgASgIEhMKC3VuYXZhaWxhYmxlGAYgASgIQhQKEl9yZWxlYXNlX25vdGVzX3VybEIKCghfcmVtYXJrcyKOAQoeQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhsKCWJhY2t1cF9pZBgCIAEoCUIIukgFcgOwAQESMQoMY2x1c3Rlcl9uYW1lGAMgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQiXAofQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXNwb25zZRI5CgdjbHVzdGVyGAEgASgLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckIGukgDyAEBKqsBChJDbHVzdGVyU2VydmljZVR5cGUSJAogQ0xVU1RFUl9TRVJWSUNFX1RZUEVfVU5TUEVDSUZJRUQQABIjCh9DTFVTVEVSX1NFUlZJQ0VfVFlQRV9DTFVTVEVSX0lQEAESIgoeQ0xVU1RFUl9TRVJWSUNFX1RZUEVfTk9ERV9QT1JUEAISJgoiQ0xVU1RFUl9TRVJWSUNFX1RZUEVfTE9BRF9CQUxBTkNFUhADKqABChtDbHVzdGVyQ29uZmlndXJhdGlvbkdwdVR5cGUSLgoqQ0xVU1RFUl9DT05GSUdVUkFUSU9OX0dQVV9UWVBFX1VOU1BFQ0lGSUVEEAASKQolQ0xVU1RFUl9DT05GSUdVUkFUSU9OX0dQVV9UWVBFX05WSURJQRABEiYKIkNMVVNURVJfQ09ORklHVVJBVElPTl9HUFVfVFlQRV9BTUQQAiryAQohQ2x1c3RlckNvbmZpZ3VyYXRpb25SZXN0YXJ0UG9saWN5EjQKMENMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9VTlNQRUNJRklFRBAAEjAKLENMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9ST0xMSU5HEAESMQotQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFU1RBUlRfUE9MSUNZX1BBUkFMTEVMEAISMgouQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFU1RBUlRfUE9MSUNZX0FVVE9NQVRJQxADKo4CCiVDbHVzdGVyQ29uZmlndXJhdGlvblJlYmFsYW5jZVN0cmF0ZWd5EjgKNENMVVNURVJfQ09ORklHVVJBVElPTl9SRUJBTEFOQ0VfU1RSQVRFR1lfVU5TUEVDSUZJRUQQABI1CjFDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVCQUxBTkNFX1NUUkFURUdZX0JZX0NPVU5UEAESNAowQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFQkFMQU5DRV9TVFJBVEVHWV9CWV9TSVpFEAISPgo6Q0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFQkFMQU5DRV9TVFJBVEVHWV9CWV9DT1VOVF9BTkRfU0laRRADKtUCCh1EYXRhYmFzZUNvbmZpZ3VyYXRpb25Mb2dMZXZlbBIwCixEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9VTlNQRUNJRklFRBAAEioKJkRBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX1RSQUNFEAESKgomREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfREVCVUcQAhIpCiVEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9JTkZPEAMSKQolREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfV0FSThAEEioKJkRBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX0VSUk9SEAUSKAokREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfT0ZGEAYqeAoSVG9sZXJhdGlvbk9wZXJhdG9yEiMKH1RPTEVSQVRJT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIeChpUT0xFUkFUSU9OX09QRVJBVE9SX0VYSVNUUxABEh0KGVRPTEVSQVRJT05fT1BFUkFUT1JfRVFVQUwQAiqkAQoQVG9sZXJhdGlvbkVmZmVjdBIhCh1UT0xFUkFUSU9OX0VGRkVDVF9VTlNQRUNJRklFRBAAEiEKHVRPTEVSQVRJT05fRUZGRUNUX05PX1NDSEVEVUxFEAESKAokVE9MRVJBVElPTl9FRkZFQ1RfUFJFRkVSX05PX1NDSEVEVUxFEAISIAocVE9MRVJBVElPTl9FRkZFQ1RfTk9fRVhFQ1VURRADKt8ECgxDbHVzdGVyUGhhc2USHQoZQ0xVU1RFUl9QSEFTRV9VTlNQRUNJRklFRBAAEhoKFkNMVVNURVJfUEhBU0VfQ1JFQVRJTkcQARIiCh5DTFVTVEVSX1BIQVNFX0ZBSUxFRF9UT19DUkVBVEUQAhIaChZDTFVTVEVSX1BIQVNFX1VQREFUSU5HEAMSIgoeQ0xVU1RFUl9QSEFTRV9GQUlMRURfVE9fVVBEQVRFEAQSGQoVQ0xVU1RFUl9QSEFTRV9TQ0FMSU5HEAUSGwoXQ0xVU1RFUl9QSEFTRV9VUEdSQURJTkcQBhIcChhDTFVTVEVSX1BIQVNFX1NVU1BFTkRJTkcQBxIbChdDTFVTVEVSX1BIQVNFX1NVU1BFTkRFRBAIEiMKH0NMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1NVU1BFTkQQCRIaChZDTFVTVEVSX1BIQVNFX1JFU1VNSU5HEAoSIgoeQ0xVU1RFUl9QSEFTRV9GQUlMRURfVE9fUkVTVU1FEAsSGQoVQ0xVU1RFUl9QSEFTRV9IRUFMVEhZEAwSGwoXQ0xVU1RFUl9QSEFTRV9OT1RfUkVBRFkQDRIfChtDTFVTVEVSX1BIQVNFX1JFQ09WRVJZX01PREUQDhIkCiBDTFVTVEVSX1BIQVNFX01BTlVBTF9NQUlOVEVOQU5DRRAPEiAKHENMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1NZTkMQEBIbChdDTFVTVEVSX1BIQVNFX05PVF9GT1VORBAREhoKFkNMVVNURVJfUEhBU0VfREVMRVRJTkcQEiq7AQoQQ2x1c3Rlck5vZGVTdGF0ZRIiCh5DTFVTVEVSX05PREVfU1RBVEVfVU5TUEVDSUZJRUQQABIfChtDTFVTVEVSX05PREVfU1RBVEVfU1RBUlRJTkcQARIeChpDTFVTVEVSX05PREVfU1RBVEVfSEVBTFRIWRACEiAKHENMVVNURVJfTk9ERV9TVEFURV9VTkhFQUxUSFkQAxIgChxDTFVTVEVSX05PREVfU1RBVEVfU1VTUEVOREVEEAQqnAEKGENsdXN0ZXJTY2FsYWJpbGl0eVN0YXR1cxIqCiZDTFVTVEVSX1NDQUxBQklMSVRZX1NUQVRVU19VTlNQRUNJRklFRBAAEisKJ0NMVVNURVJfU0NBTEFCSUxJVFlfU1RBVFVTX05PVF9TQ0FMQUJMRRABEicKI0NMVVNURVJfU0NBTEFCSUxJVFlfU1RBVFVTX1NDQUxBQkxFEAIynBcKDkNsdXN0ZXJTZXJ2aWNlErQBCgxMaXN0Q2x1c3RlcnMSLC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5MaXN0Q2x1c3RlcnNSZXF1ZXN0Gi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdENsdXN0ZXJzUmVzcG9uc2UiR4q1GA1yZWFkOmNsdXN0ZXJzgtPkkwIwEi4vYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzEtcBCgpHZXRDbHVzdGVyEioucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0Q2x1c3RlclJlcXVlc3QaKy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5HZXRDbHVzdGVyUmVzcG9uc2UicIq1GA1yZWFkOmNsdXN0ZXJzurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlcl9pZILT5JMCPRI7L2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlcl9pZH0S2QIKDUNyZWF0ZUNsdXN0ZXISLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DcmVhdGVDbHVzdGVyUmVxdWVzdBouLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNyZWF0ZUNsdXN0ZXJSZXNwb25zZSLoAYq1GA53cml0ZTpjbHVzdGVyc5K1GBJjbHVzdGVyLmFjY291bnRfaWS6tRgcCgxjbHVzdGVyX25hbWUSDGNsdXN0ZXIubmFtZcrzGFsIARIHY2x1c3RlciIPcmVzcC5jbHVzdGVyLmlkKj0vYWNjb3VudHMve3JlcS5jbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tyZXNwLmNsdXN0ZXIuaWR9gtPkkwI7OgEqIjYvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2NsdXN0ZXIuYWNjb3VudF9pZH0vY2x1c3RlcnMStAMKF0NyZWF0ZUNsdXN0ZXJGcm9tQmFja3VwEjcucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXF1ZXN0GjgucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXNwb25zZSKlAoq1GA9yZXN0b3JlOmJhY2t1cHOKtRgOd3JpdGU6Y2x1c3RlcnOotRgBurUYFgoJYmFja3VwX2lkEgliYWNrdXBfaWS6tRgcCgxjbHVzdGVyX25hbWUSDGNsdXN0ZXJfbmFtZcrzGHQIARIHY2x1c3RlciIPcmVzcC5jbHVzdGVyLmlkKjUvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVzcC5jbHVzdGVyLmlkfVIfCg5mcm9tX2JhY2t1cF9pZBINcmVxLmJhY2t1cF9pZILT5JMCRCJCL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9iYWNrdXBzL3tiYWNrdXBfaWR9L2NsdXN0ZXJzEuACCg1VcGRhdGVDbHVzdGVyEi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVXBkYXRlQ2x1c3RlclJlcXVlc3QaLi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5VcGRhdGVDbHVzdGVyUmVzcG9uc2Ui7wGKtRgOd3JpdGU6Y2x1c3RlcnOStRgSY2x1c3Rlci5hY2NvdW50X2lkurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlci5pZMrzGFkIAhIHY2x1c3RlciIOcmVxLmNsdXN0ZXIuaWQqPC9hY2NvdW50cy97cmVxLmNsdXN0ZXIuYWNjb3VudF9pZH0vY2x1c3RlcnMve3JlcS5jbHVzdGVyLmlkfYLT5JMCSDoBKhpDL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3tjbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyLmlkfRK4AgoNRGVsZXRlQ2x1c3RlchItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRlbGV0ZUNsdXN0ZXJSZXF1ZXN0Gi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGVsZXRlQ2x1c3RlclJlc3BvbnNlIscBirUYD2RlbGV0ZTpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWTK8xhRCAMSB2NsdXN0ZXIiDnJlcS5jbHVzdGVyX2lkKjQvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVxLmNsdXN0ZXJfaWR9gtPkkwI9KjsvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyX2lkfRLLAgoOUmVzdGFydENsdXN0ZXISLi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5SZXN0YXJ0Q2x1c3RlclJlcXVlc3QaLy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5SZXN0YXJ0Q2x1c3RlclJlc3BvbnNlItcBirUYDndyaXRlOmNsdXN0ZXJzurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlcl9pZMrzGFoIBBIHY2x1c3RlciIOcmVxLmNsdXN0ZXJfaWQqNC9hY2NvdW50cy97cmVxLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tyZXEuY2x1c3Rlcl9pZH0yB3Jlc3RhcnSC0+STAkUiQy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vY2x1c3RlcnMve2NsdXN0ZXJfaWR9L3Jlc3RhcnQSywIKDlN1c3BlbmRDbHVzdGVyEi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VzcGVuZENsdXN0ZXJSZXF1ZXN0Gi8ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VzcGVuZENsdXN0ZXJSZXNwb25zZSLXAYq1GA53cml0ZTpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWTK8xhaCAQSB2NsdXN0ZXIiDnJlcS5jbHVzdGVyX2lkKjQvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVxLmNsdXN0ZXJfaWR9MgdzdXNwZW5kgtPkkwJFIkMvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyX2lkfS9zdXNwZW5kEsYBChJTdWdnZXN0Q2x1c3Rlck5hbWUSMi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5TdWdnZXN0Q2x1c3Rlck5hbWVSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VnZ2VzdENsdXN0ZXJOYW1lUmVzcG9uc2UiR4q1GACC0+STAj0SOy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vY2x1c3RlcnMvc3VnZ2VzdC1uYW1lEuIBChJMaXN0UWRyYW50UmVsZWFzZXMSMi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5MaXN0UWRyYW50UmVsZWFzZXNSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdFFkcmFudFJlbGVhc2VzUmVzcG9uc2UiY4q1GA1yZWFkOmNsdXN0ZXJzurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlcl9pZILT5JMCMBIuL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9yZWxlYXNlc0L+AQobY29tLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxQgxDbHVzdGVyUHJvdG9QAVpSZ2l0aHViLmNvbS9xZHJhbnQvcWRyYW50LWNsb3VkLXB1YmxpYy1hcGkvZ2VuL2dvL3FkcmFudC9jbG91ZC9jbHVzdGVyL3YxO2NsdXN0ZXJ2MaICA1FDQ6oCF1FkcmFudC5DbG91ZC5DbHVzdGVyLlYxygIXUWRyYW50XENsb3VkXENsdXN0ZXJcVjHiAiNRZHJhbnRcQ2xvdWRcQ2x1c3RlclxWMVxHUEJNZXRhZGF0YeoCGlFkcmFudDo6Q2xvdWQ6OkNsdXN0ZXI6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_annotations, file_google_protobuf_timestamp, file_qdrant_cloud_common_v1_common, file_qdrant_cloud_event_v1_events]); + fileDesc("CiVxZHJhbnQvY2xvdWQvY2x1c3Rlci92MS9jbHVzdGVyLnByb3RvEhdxZHJhbnQuY2xvdWQuY2x1c3Rlci52MSKHBQoTTGlzdENsdXN0ZXJzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARInChFjbG91ZF9wcm92aWRlcl9pZBgKIAEoCUIHukgEcgIQA0gAiAEBEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgLIAEoCUIHukgEcgIQAUgBiAEBOsUDukjBAxqxAQonbGlzdF9jbHVzdGVycy5jbG91ZF9wcm92aWRlcl9pZF9wcmVzZW50EkJjbG91ZF9wcm92aWRlcl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyBzZXQaQiFoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpIHx8IGhhcyh0aGlzLmNsb3VkX3Byb3ZpZGVyX2lkKRqKAgogY2x1c3Rlci5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQSSGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBtdXN0IGJlIGEgVVVJRCBpZiBjbG91ZF9wcm92aWRlcl9pZCBpcyAnaHlicmlkJxqbAXRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykgfHwgdGhpcy5jbG91ZF9wcm92aWRlcl9pZCE9ICdoeWJyaWQnQhQKEl9jbG91ZF9wcm92aWRlcl9pZEIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RDbHVzdGVyc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlciJPChFHZXRDbHVzdGVyUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIcCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABASJPChJHZXRDbHVzdGVyUmVzcG9uc2USOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBASLEAgoUQ3JlYXRlQ2x1c3RlclJlcXVlc3QSOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBATrwAbpI7AEa6QEKImNyZWF0ZV9jbHVzdGVyLm5vX3JlYWRfb25seV9maWVsZHMSTnJlYWQtb25seSBmaWVsZHMgKGlkLCBjcmVhdGVkX2F0LCBkZWxldGVkX2F0LCBzdGF0ZSkgbXVzdCBub3QgYmUgc2V0IG9uIGNyZWF0ZRpzdGhpcy5jbHVzdGVyLmlkID09ICcnICYmICFoYXModGhpcy5jbHVzdGVyLmNyZWF0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLmRlbGV0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLnN0YXRlKSK7AQoVQ3JlYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChxjcmVhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkisAEKFFVwZGF0ZUNsdXN0ZXJSZXF1ZXN0EjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6XbpIWhpYChl1cGRhdGVfY2x1c3Rlci5pZF9wcmVzZW50EiRjbHVzdGVyLmlkIGlzIHJlcXVpcmVkIGZvciBhbiB1cGRhdGUaFXRoaXMuY2x1c3Rlci5pZCAhPSAnJyK7AQoVVXBkYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChx1cGRhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkiggEKFERlbGV0ZUNsdXN0ZXJSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhwKCmNsdXN0ZXJfaWQYAiABKAlCCLpIBXIDsAEBEhsKDmRlbGV0ZV9iYWNrdXBzGAMgASgISACIAQFCEQoPX2RlbGV0ZV9iYWNrdXBzIhcKFURlbGV0ZUNsdXN0ZXJSZXNwb25zZSJTChVSZXN0YXJ0Q2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWUmVzdGFydENsdXN0ZXJSZXNwb25zZSJTChVTdXNwZW5kQ2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWU3VzcGVuZENsdXN0ZXJSZXNwb25zZSI5ChlTdWdnZXN0Q2x1c3Rlck5hbWVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBIjMKGlN1Z2dlc3RDbHVzdGVyTmFtZVJlc3BvbnNlEhUKBG5hbWUYASABKAlCB7pIBHICEAEiawoZTGlzdFFkcmFudFJlbGVhc2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIhCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABAUgAiAEBQg0KC19jbHVzdGVyX2lkIlMKGkxpc3RRZHJhbnRSZWxlYXNlc1Jlc3BvbnNlEjUKBWl0ZW1zGAEgAygLMiYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUWRyYW50UmVsZWFzZSLLBgoHQ2x1c3RlchIKCgJpZBgBIAEoCRIuCgpjcmVhdGVkX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIcCgphY2NvdW50X2lkGAMgASgJQgi6SAVyA7ABARIpCgRuYW1lGAQgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQSLgoKZGVsZXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoRY2xvdWRfcHJvdmlkZXJfaWQYCiABKAlCB7pIBHICEAMSKQoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkGAsgASgJQge6SARyAhABEkwKDWNvbmZpZ3VyYXRpb24YFCABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvbkIGukgDyAEBEjQKBXN0YXRlGGQgASgLMiUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlclN0YXRlOrcDukizAxqjAQoKY2x1c3Rlci5pZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeXRoaXMuaWQubWF0Y2hlcygnXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQnKSB8fCAhaGFzKHRoaXMuY3JlYXRlZF9hdCkaigIKIGNsdXN0ZXIuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEkhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgbXVzdCBiZSBhIFVVSUQgaWYgY2xvdWRfcHJvdmlkZXJfaWQgaXMgJ2h5YnJpZCcamwF0aGlzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZC5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpIHx8IHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQhPSAnaHlicmlkJyLUCgoUQ2x1c3RlckNvbmZpZ3VyYXRpb24SNAoQbGFzdF9tb2RpZmllZF9hdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoPbnVtYmVyX29mX25vZGVzGAIgASgNQgm6SAYqBBgUKAESPAoHdmVyc2lvbhgDIAEoCUImukgjciEyH14odihcZCspXC4oXGQrKVwuKFxkKyl8bGF0ZXN0KSRIAIgBARIcCgpwYWNrYWdlX2lkGAQgASgJQgi6SAVyA7ABARJPChRhZGRpdGlvbmFsX3Jlc291cmNlcxgFIAEoCzIsLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkFkZGl0aW9uYWxSZXNvdXJjZXNIAYgBARJTChZkYXRhYmFzZV9jb25maWd1cmF0aW9uGAcgASgLMi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uSAKIAQESQQoNbm9kZV9zZWxlY3RvchgIIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEkIKC3RvbGVyYXRpb25zGAkgAygLMiMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkIIukgFkgECEAoSPwoLYW5ub3RhdGlvbnMYCiADKAsyIC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLktleVZhbHVlQgi6SAWSAQIQChIxChhhbGxvd2VkX2lwX3NvdXJjZV9yYW5nZXMYCyADKAlCD7pIDJIBCRAUIgVyA/ABARJSCgxzZXJ2aWNlX3R5cGUYDCABKA4yKy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2VydmljZVR5cGVCCrpIB4IBBBABIABIA4gBARJHChNzZXJ2aWNlX2Fubm90YXRpb25zGA0gAygLMiAucWRyYW50LmNsb3VkLmNvbW1vbi52MS5LZXlWYWx1ZUIIukgFkgECEAoSPgoKcG9kX2xhYmVscxgOIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEigKF3Jlc2VydmVkX2NwdV9wZXJjZW50YWdlGBQgASgNQge6SAQqAhhQEisKGnJlc2VydmVkX21lbW9yeV9wZXJjZW50YWdlGBUgASgNQge6SAQqAhhQElcKCGdwdV90eXBlGBYgASgOMjQucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckNvbmZpZ3VyYXRpb25HcHVUeXBlQgq6SAeCAQQQASAASASIAQESYwoOcmVzdGFydF9wb2xpY3kYFyABKA4yOi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlc3RhcnRQb2xpY3lCCrpIB4IBBBABIABIBYgBARJrChJyZWJhbGFuY2Vfc3RyYXRlZ3kYGCABKA4yPi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlYmFsYW5jZVN0cmF0ZWd5Qgq6SAeCAQQQASAASAaIAQFCCgoIX3ZlcnNpb25CFwoVX2FkZGl0aW9uYWxfcmVzb3VyY2VzQhkKF19kYXRhYmFzZV9jb25maWd1cmF0aW9uQg8KDV9zZXJ2aWNlX3R5cGVCCwoJX2dwdV90eXBlQhEKD19yZXN0YXJ0X3BvbGljeUIVChNfcmViYWxhbmNlX3N0cmF0ZWd5IsEEChVEYXRhYmFzZUNvbmZpZ3VyYXRpb24SUQoKY29sbGVjdGlvbhgBIAEoCzI4LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25IAIgBARJLCgdzdG9yYWdlGAIgASgLMjUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZUgBiAEBEksKB3NlcnZpY2UYAyABKAsyNS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlSAKIAQESWgoJbG9nX2xldmVsGAQgASgOMjYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uTG9nTGV2ZWxCCrpIB4IBBBABIABIA4gBARJDCgN0bHMYBSABKAsyMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UbHNIBIgBARJPCglpbmZlcmVuY2UYBiABKAsyNy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25JbmZlcmVuY2VIBYgBAUINCgtfY29sbGVjdGlvbkIKCghfc3RvcmFnZUIKCghfc2VydmljZUIMCgpfbG9nX2xldmVsQgYKBF90bHNCDAoKX2luZmVyZW5jZSLnAQofRGF0YWJhc2VDb25maWd1cmF0aW9uQ29sbGVjdGlvbhIoChJyZXBsaWNhdGlvbl9mYWN0b3IYASABKA1CB7pIBCoCKAFIAIgBARIpChh3cml0ZV9jb25zaXN0ZW5jeV9mYWN0b3IYAiABKAVCB7pIBBoCKAESWAoHdmVjdG9ycxgDIAEoCzI/LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25WZWN0b3JzQga6SAPIAQFCFQoTX3JlcGxpY2F0aW9uX2ZhY3RvciJKCiZEYXRhYmFzZUNvbmZpZ3VyYXRpb25Db2xsZWN0aW9uVmVjdG9ycxIUCgdvbl9kaXNrGAEgASgISACIAQFCCgoIX29uX2Rpc2sidQocRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZRJVCgtwZXJmb3JtYW5jZRgBIAEoCzJALnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvblN0b3JhZ2VQZXJmb3JtYW5jZSJdCidEYXRhYmFzZUNvbmZpZ3VyYXRpb25TdG9yYWdlUGVyZm9ybWFuY2USHAoUb3B0aW1pemVyX2NwdV9idWRnZXQYASABKAUSFAoMYXN5bmNfc2NvcmVyGAIgASgIIugBChxEYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlEjoKB2FwaV9rZXkYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkgAiAEBEkQKEXJlYWRfb25seV9hcGlfa2V5GAIgASgLMiQucWRyYW50LmNsb3VkLmNvbW1vbi52MS5TZWNyZXRLZXlSZWZIAYgBARIQCghqd3RfcmJhYxgDIAEoCBISCgplbmFibGVfdGxzGAQgASgIQgoKCF9hcGlfa2V5QhQKEl9yZWFkX29ubHlfYXBpX2tleSKRAQoYRGF0YWJhc2VDb25maWd1cmF0aW9uVGxzEjoKBGNlcnQYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkIGukgDyAEBEjkKA2tleRgCIAEoCzIkLnFkcmFudC5jbG91ZC5jb21tb24udjEuU2VjcmV0S2V5UmVmQga6SAPIAQEiMQoeRGF0YWJhc2VDb25maWd1cmF0aW9uSW5mZXJlbmNlEg8KB2VuYWJsZWQYASABKAgiIwoTQWRkaXRpb25hbFJlc291cmNlcxIMCgRkaXNrGAMgASgNItUCCgpUb2xlcmF0aW9uEkMKA2tleRgBIAEoCUI2ukgzcjEYPzItXihbYS16QS1aMC05XShbLWEtekEtWjAtOV8uXSpbYS16QS1aMC05XSk/KT8kEk4KCG9wZXJhdG9yGAIgASgOMisucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbk9wZXJhdG9yQgq6SAeCAQQQASAASACIAQESDQoFdmFsdWUYAyABKAkSSgoGZWZmZWN0GAQgASgOMikucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkVmZmVjdEIKukgHggEEEAEgAEgBiAEBEigKEnRvbGVyYXRpb25fc2Vjb25kcxgFIAEoBEIHukgEMgIoAEgCiAEBQgsKCV9vcGVyYXRvckIJCgdfZWZmZWN0QhUKE190b2xlcmF0aW9uX3NlY29uZHMi3QMKDENsdXN0ZXJTdGF0ZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEhAKCG5vZGVzX3VwGAIgASgNEjAKDHJlc3RhcnRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASPgoFcGhhc2UYBCABKA4yJS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyUGhhc2VCCLpIBYIBAhABEg4KBnJlYXNvbhgFIAEoCRJCCghlbmRwb2ludBgGIAEoCzIoLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJFbmRwb2ludEIGukgDyAEBEk8KCXJlc291cmNlcxgHIAEoCzI0LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzU3VtbWFyeUIGukgDyAEBElEKEHNjYWxhYmlsaXR5X2luZm8YCCABKAsyLy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlJbmZvQga6SAPIAQESNwoFbm9kZXMYCSADKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZUluZm8i6QEKD0NsdXN0ZXJOb2RlSW5mbxIVCgRuYW1lGAEgASgJQge6SARyAhABEi4KCnN0YXJ0ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg8KB3ZlcnNpb24YAyABKAkSOgoIZW5kcG9pbnQYBCABKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyRW5kcG9pbnQSQgoFc3RhdGUYCiABKA4yKS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVN0YXRlQgi6SAWCAQIQASJgCg9DbHVzdGVyRW5kcG9pbnQSFQoDdXJsGAEgASgJQgi6SAVyA4gBARIaCglyZXN0X3BvcnQYAiABKAVCB7pIBBoCIAASGgoJZ3JwY19wb3J0GAMgASgFQge6SAQaAiAAIuoBChtDbHVzdGVyTm9kZVJlc291cmNlc1N1bW1hcnkSQwoEZGlzaxgBIAEoCzItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzQga6SAPIAQESQgoDcmFtGAIgASgLMi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3Rlck5vZGVSZXNvdXJjZXNCBrpIA8gBARJCCgNjcHUYAyABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVJlc291cmNlc0IGukgDyAEBIsQBChRDbHVzdGVyTm9kZVJlc291cmNlcxIcCgRiYXNlGAEgASgBQg66SAsSCSkAAAAAAAAAABIlCg1jb21wbGltZW50YXJ5GAIgASgBQg66SAsSCSkAAAAAAAAAABIiCgphZGRpdGlvbmFsGAMgASgBQg66SAsSCSkAAAAAAAAAABIgCghyZXNlcnZlZBgEIAEoAUIOukgLEgkpAAAAAAAAAAASIQoJYXZhaWxhYmxlGAUgASgBQg66SAsSCSkAAAAAAAAAACKQAQoWQ2x1c3RlclNjYWxhYmlsaXR5SW5mbxJNCgZzdGF0dXMYASABKA4yMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlTdGF0dXNCCrpIB4IBBBABIAASHAoGcmVhc29uGAIgASgJQge6SARyAhABSACIAQFCCQoHX3JlYXNvbiLPAQoNUWRyYW50UmVsZWFzZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEg8KB2RlZmF1bHQYAiABKAgSKAoRcmVsZWFzZV9ub3Rlc191cmwYAyABKAlCCLpIBXIDiAEBSACIAQESHQoHcmVtYXJrcxgEIAEoCUIHukgEcgIQAUgBiAEBEhMKC2VuZF9vZl9saWZlGAUgASgIEhMKC3VuYXZhaWxhYmxlGAYgASgIQhQKEl9yZWxlYXNlX25vdGVzX3VybEIKCghfcmVtYXJrcyKOAQoeQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhsKCWJhY2t1cF9pZBgCIAEoCUIIukgFcgOwAQESMQoMY2x1c3Rlcl9uYW1lGAMgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQiXAofQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXNwb25zZRI5CgdjbHVzdGVyGAEgASgLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckIGukgDyAEBItMCCg9HZXRRdW90ZVJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESOQoHY2x1c3RlchgCIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBATrmAbpI4gEa3wEKGXF1b3RlLm5vX3JlYWRfb25seV9maWVsZHMSTXJlYWQtb25seSBmaWVsZHMgKGlkLCBjcmVhdGVkX2F0LCBkZWxldGVkX2F0LCBzdGF0ZSkgbXVzdCBub3QgYmUgc2V0IG9uIHF1b3RlGnN0aGlzLmNsdXN0ZXIuaWQgPT0gJycgJiYgIWhhcyh0aGlzLmNsdXN0ZXIuY3JlYXRlZF9hdCkgJiYgIWhhcyh0aGlzLmNsdXN0ZXIuZGVsZXRlZF9hdCkgJiYgIWhhcyh0aGlzLmNsdXN0ZXIuc3RhdGUpIpsCChBHZXRRdW90ZVJlc3BvbnNlEiMKCGN1cnJlbmN5GAEgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChdvcmlnaW5hbF9wcmljZV9wZXJfaG91chgCIAEoA0IHukgEIgIoABIpChhvcmlnaW5hbF9wcmljZV9wZXJfbW9udGgYAyABKANCB7pIBCICKAASKgoZZGlzY291bnRlZF9wcmljZV9wZXJfaG91chgEIAEoA0IHukgEIgIoABIrChpkaXNjb3VudGVkX3ByaWNlX3Blcl9tb250aBgFIAEoA0IHukgEIgIoABI0ChNkaXNjb3VudF9wZXJjZW50YWdlGAYgASgBQhe6SBQSEhkAAAAAAABZQCkAAAAAAAAAACqrAQoSQ2x1c3RlclNlcnZpY2VUeXBlEiQKIENMVVNURVJfU0VSVklDRV9UWVBFX1VOU1BFQ0lGSUVEEAASIwofQ0xVU1RFUl9TRVJWSUNFX1RZUEVfQ0xVU1RFUl9JUBABEiIKHkNMVVNURVJfU0VSVklDRV9UWVBFX05PREVfUE9SVBACEiYKIkNMVVNURVJfU0VSVklDRV9UWVBFX0xPQURfQkFMQU5DRVIQAyqgAQobQ2x1c3RlckNvbmZpZ3VyYXRpb25HcHVUeXBlEi4KKkNMVVNURVJfQ09ORklHVVJBVElPTl9HUFVfVFlQRV9VTlNQRUNJRklFRBAAEikKJUNMVVNURVJfQ09ORklHVVJBVElPTl9HUFVfVFlQRV9OVklESUEQARImCiJDTFVTVEVSX0NPTkZJR1VSQVRJT05fR1BVX1RZUEVfQU1EEAIq8gEKIUNsdXN0ZXJDb25maWd1cmF0aW9uUmVzdGFydFBvbGljeRI0CjBDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVTVEFSVF9QT0xJQ1lfVU5TUEVDSUZJRUQQABIwCixDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVTVEFSVF9QT0xJQ1lfUk9MTElORxABEjEKLUNMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9QQVJBTExFTBACEjIKLkNMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9BVVRPTUFUSUMQAyqOAgolQ2x1c3RlckNvbmZpZ3VyYXRpb25SZWJhbGFuY2VTdHJhdGVneRI4CjRDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVCQUxBTkNFX1NUUkFURUdZX1VOU1BFQ0lGSUVEEAASNQoxQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFQkFMQU5DRV9TVFJBVEVHWV9CWV9DT1VOVBABEjQKMENMVVNURVJfQ09ORklHVVJBVElPTl9SRUJBTEFOQ0VfU1RSQVRFR1lfQllfU0laRRACEj4KOkNMVVNURVJfQ09ORklHVVJBVElPTl9SRUJBTEFOQ0VfU1RSQVRFR1lfQllfQ09VTlRfQU5EX1NJWkUQAyrVAgodRGF0YWJhc2VDb25maWd1cmF0aW9uTG9nTGV2ZWwSMAosREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfVU5TUEVDSUZJRUQQABIqCiZEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9UUkFDRRABEioKJkRBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX0RFQlVHEAISKQolREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfSU5GTxADEikKJURBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX1dBUk4QBBIqCiZEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9FUlJPUhAFEigKJERBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX09GRhAGKngKElRvbGVyYXRpb25PcGVyYXRvchIjCh9UT0xFUkFUSU9OX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASHgoaVE9MRVJBVElPTl9PUEVSQVRPUl9FWElTVFMQARIdChlUT0xFUkFUSU9OX09QRVJBVE9SX0VRVUFMEAIqpAEKEFRvbGVyYXRpb25FZmZlY3QSIQodVE9MRVJBVElPTl9FRkZFQ1RfVU5TUEVDSUZJRUQQABIhCh1UT0xFUkFUSU9OX0VGRkVDVF9OT19TQ0hFRFVMRRABEigKJFRPTEVSQVRJT05fRUZGRUNUX1BSRUZFUl9OT19TQ0hFRFVMRRACEiAKHFRPTEVSQVRJT05fRUZGRUNUX05PX0VYRUNVVEUQAyrfBAoMQ2x1c3RlclBoYXNlEh0KGUNMVVNURVJfUEhBU0VfVU5TUEVDSUZJRUQQABIaChZDTFVTVEVSX1BIQVNFX0NSRUFUSU5HEAESIgoeQ0xVU1RFUl9QSEFTRV9GQUlMRURfVE9fQ1JFQVRFEAISGgoWQ0xVU1RFUl9QSEFTRV9VUERBVElORxADEiIKHkNMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1VQREFURRAEEhkKFUNMVVNURVJfUEhBU0VfU0NBTElORxAFEhsKF0NMVVNURVJfUEhBU0VfVVBHUkFESU5HEAYSHAoYQ0xVU1RFUl9QSEFTRV9TVVNQRU5ESU5HEAcSGwoXQ0xVU1RFUl9QSEFTRV9TVVNQRU5ERUQQCBIjCh9DTFVTVEVSX1BIQVNFX0ZBSUxFRF9UT19TVVNQRU5EEAkSGgoWQ0xVU1RFUl9QSEFTRV9SRVNVTUlORxAKEiIKHkNMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1JFU1VNRRALEhkKFUNMVVNURVJfUEhBU0VfSEVBTFRIWRAMEhsKF0NMVVNURVJfUEhBU0VfTk9UX1JFQURZEA0SHwobQ0xVU1RFUl9QSEFTRV9SRUNPVkVSWV9NT0RFEA4SJAogQ0xVU1RFUl9QSEFTRV9NQU5VQUxfTUFJTlRFTkFOQ0UQDxIgChxDTFVTVEVSX1BIQVNFX0ZBSUxFRF9UT19TWU5DEBASGwoXQ0xVU1RFUl9QSEFTRV9OT1RfRk9VTkQQERIaChZDTFVTVEVSX1BIQVNFX0RFTEVUSU5HEBIquwEKEENsdXN0ZXJOb2RlU3RhdGUSIgoeQ0xVU1RFUl9OT0RFX1NUQVRFX1VOU1BFQ0lGSUVEEAASHwobQ0xVU1RFUl9OT0RFX1NUQVRFX1NUQVJUSU5HEAESHgoaQ0xVU1RFUl9OT0RFX1NUQVRFX0hFQUxUSFkQAhIgChxDTFVTVEVSX05PREVfU1RBVEVfVU5IRUFMVEhZEAMSIAocQ0xVU1RFUl9OT0RFX1NUQVRFX1NVU1BFTkRFRBAEKpwBChhDbHVzdGVyU2NhbGFiaWxpdHlTdGF0dXMSKgomQ0xVU1RFUl9TQ0FMQUJJTElUWV9TVEFUVVNfVU5TUEVDSUZJRUQQABIrCidDTFVTVEVSX1NDQUxBQklMSVRZX1NUQVRVU19OT1RfU0NBTEFCTEUQARInCiNDTFVTVEVSX1NDQUxBQklMSVRZX1NUQVRVU19TQ0FMQUJMRRACMscYCg5DbHVzdGVyU2VydmljZRK0AQoMTGlzdENsdXN0ZXJzEiwucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdENsdXN0ZXJzUmVxdWVzdBotLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkxpc3RDbHVzdGVyc1Jlc3BvbnNlIkeKtRgNcmVhZDpjbHVzdGVyc4LT5JMCMBIuL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycxLXAQoKR2V0Q2x1c3RlchIqLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkdldENsdXN0ZXJSZXF1ZXN0GisucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0Q2x1c3RlclJlc3BvbnNlInCKtRgNcmVhZDpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWSC0+STAj0SOy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vY2x1c3RlcnMve2NsdXN0ZXJfaWR9EtkCCg1DcmVhdGVDbHVzdGVyEi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ3JlYXRlQ2x1c3RlclJlcXVlc3QaLi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DcmVhdGVDbHVzdGVyUmVzcG9uc2Ui6AGKtRgOd3JpdGU6Y2x1c3RlcnOStRgSY2x1c3Rlci5hY2NvdW50X2lkurUYHAoMY2x1c3Rlcl9uYW1lEgxjbHVzdGVyLm5hbWXK8xhbCAESB2NsdXN0ZXIiD3Jlc3AuY2x1c3Rlci5pZCo9L2FjY291bnRzL3tyZXEuY2x1c3Rlci5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVzcC5jbHVzdGVyLmlkfYLT5JMCOzoBKiI2L2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3tjbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzErQDChdDcmVhdGVDbHVzdGVyRnJvbUJhY2t1cBI3LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNyZWF0ZUNsdXN0ZXJGcm9tQmFja3VwUmVxdWVzdBo4LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNyZWF0ZUNsdXN0ZXJGcm9tQmFja3VwUmVzcG9uc2UipQKKtRgPcmVzdG9yZTpiYWNrdXBzirUYDndyaXRlOmNsdXN0ZXJzqLUYAbq1GBYKCWJhY2t1cF9pZBIJYmFja3VwX2lkurUYHAoMY2x1c3Rlcl9uYW1lEgxjbHVzdGVyX25hbWXK8xh0CAESB2NsdXN0ZXIiD3Jlc3AuY2x1c3Rlci5pZCo1L2FjY291bnRzL3tyZXEuYWNjb3VudF9pZH0vY2x1c3RlcnMve3Jlc3AuY2x1c3Rlci5pZH1SHwoOZnJvbV9iYWNrdXBfaWQSDXJlcS5iYWNrdXBfaWSC0+STAkQiQi9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vYmFja3Vwcy97YmFja3VwX2lkfS9jbHVzdGVycxLgAgoNVXBkYXRlQ2x1c3RlchItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlVwZGF0ZUNsdXN0ZXJSZXF1ZXN0Gi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVXBkYXRlQ2x1c3RlclJlc3BvbnNlIu8BirUYDndyaXRlOmNsdXN0ZXJzkrUYEmNsdXN0ZXIuYWNjb3VudF9pZLq1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXIuaWTK8xhZCAISB2NsdXN0ZXIiDnJlcS5jbHVzdGVyLmlkKjwvYWNjb3VudHMve3JlcS5jbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tyZXEuY2x1c3Rlci5pZH2C0+STAkg6ASoaQy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97Y2x1c3Rlci5hY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlci5pZH0SuAIKDURlbGV0ZUNsdXN0ZXISLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EZWxldGVDbHVzdGVyUmVxdWVzdBouLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRlbGV0ZUNsdXN0ZXJSZXNwb25zZSLHAYq1GA9kZWxldGU6Y2x1c3RlcnO6tRgYCgpjbHVzdGVyX2lkEgpjbHVzdGVyX2lkyvMYUQgDEgdjbHVzdGVyIg5yZXEuY2x1c3Rlcl9pZCo0L2FjY291bnRzL3tyZXEuYWNjb3VudF9pZH0vY2x1c3RlcnMve3JlcS5jbHVzdGVyX2lkfYLT5JMCPSo7L2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlcl9pZH0SywIKDlJlc3RhcnRDbHVzdGVyEi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUmVzdGFydENsdXN0ZXJSZXF1ZXN0Gi8ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUmVzdGFydENsdXN0ZXJSZXNwb25zZSLXAYq1GA53cml0ZTpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWTK8xhaCAQSB2NsdXN0ZXIiDnJlcS5jbHVzdGVyX2lkKjQvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVxLmNsdXN0ZXJfaWR9MgdyZXN0YXJ0gtPkkwJFIkMvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyX2lkfS9yZXN0YXJ0EssCCg5TdXNwZW5kQ2x1c3RlchIuLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlN1c3BlbmRDbHVzdGVyUmVxdWVzdBovLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlN1c3BlbmRDbHVzdGVyUmVzcG9uc2Ui1wGKtRgOd3JpdGU6Y2x1c3RlcnO6tRgYCgpjbHVzdGVyX2lkEgpjbHVzdGVyX2lkyvMYWggEEgdjbHVzdGVyIg5yZXEuY2x1c3Rlcl9pZCo0L2FjY291bnRzL3tyZXEuYWNjb3VudF9pZH0vY2x1c3RlcnMve3JlcS5jbHVzdGVyX2lkfTIHc3VzcGVuZILT5JMCRSJDL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlcl9pZH0vc3VzcGVuZBLGAQoSU3VnZ2VzdENsdXN0ZXJOYW1lEjIucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VnZ2VzdENsdXN0ZXJOYW1lUmVxdWVzdBozLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlN1Z2dlc3RDbHVzdGVyTmFtZVJlc3BvbnNlIkeKtRgAgtPkkwI9EjsvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3N1Z2dlc3QtbmFtZRLiAQoSTGlzdFFkcmFudFJlbGVhc2VzEjIucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdFFkcmFudFJlbGVhc2VzUmVxdWVzdBozLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkxpc3RRZHJhbnRSZWxlYXNlc1Jlc3BvbnNlImOKtRgNcmVhZDpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWSC0+STAjASLi9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vcmVsZWFzZXMSqAEKCEdldFF1b3RlEigucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0UXVvdGVSZXF1ZXN0GikucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0UXVvdGVSZXNwb25zZSJHirUYDXJlYWQ6Y2x1c3RlcnOC0+STAjA6ASoiKy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vcXVvdGVC/gEKG2NvbS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MUIMQ2x1c3RlclByb3RvUAFaUmdpdGh1Yi5jb20vcWRyYW50L3FkcmFudC1jbG91ZC1wdWJsaWMtYXBpL2dlbi9nby9xZHJhbnQvY2xvdWQvY2x1c3Rlci92MTtjbHVzdGVydjGiAgNRQ0OqAhdRZHJhbnQuQ2xvdWQuQ2x1c3Rlci5WMcoCF1FkcmFudFxDbG91ZFxDbHVzdGVyXFYx4gIjUWRyYW50XENsb3VkXENsdXN0ZXJcVjFcR1BCTWV0YWRhdGHqAhpRZHJhbnQ6OkNsb3VkOjpDbHVzdGVyOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_google_protobuf_timestamp, file_qdrant_cloud_common_v1_common, file_qdrant_cloud_event_v1_events]); /** * Describes the message qdrant.cloud.cluster.v1.ListClustersRequest. @@ -288,6 +288,20 @@ export const CreateClusterFromBackupRequestSchema = /*@__PURE__*/ export const CreateClusterFromBackupResponseSchema = /*@__PURE__*/ messageDesc(file_qdrant_cloud_cluster_v1_cluster, 38); +/** + * Describes the message qdrant.cloud.cluster.v1.GetQuoteRequest. + * Use `create(GetQuoteRequestSchema)` to create a new message. + */ +export const GetQuoteRequestSchema = /*@__PURE__*/ + messageDesc(file_qdrant_cloud_cluster_v1_cluster, 39); + +/** + * Describes the message qdrant.cloud.cluster.v1.GetQuoteResponse. + * Use `create(GetQuoteResponseSchema)` to create a new message. + */ +export const GetQuoteResponseSchema = /*@__PURE__*/ + messageDesc(file_qdrant_cloud_cluster_v1_cluster, 40); + /** * Describes the enum qdrant.cloud.cluster.v1.ClusterServiceType. */ diff --git a/proto/qdrant/cloud/cluster/v1/cluster.proto b/proto/qdrant/cloud/cluster/v1/cluster.proto index f389cf83..7333a72c 100644 --- a/proto/qdrant/cloud/cluster/v1/cluster.proto +++ b/proto/qdrant/cloud/cluster/v1/cluster.proto @@ -213,7 +213,7 @@ service ClusterService { // and any applicable discounts for the specified cluster configuration. // Required permissions: // - read:clusters - rpc Quote(QuoteRequest) returns (QuoteResponse) { + rpc GetQuote(GetQuoteRequest) returns (GetQuoteResponse) { // permissions option (common.v1.permissions) = "read:clusters"; // gRPC Gateway REST call @@ -962,8 +962,8 @@ message CreateClusterFromBackupResponse { Cluster cluster = 1 [(buf.validate.field).required = true]; } -// QuoteRequest is the request for the Quote function -message QuoteRequest { +// 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}]; @@ -978,8 +978,8 @@ message QuoteRequest { }; } -// QuoteResponse is the response from the Quote function -message QuoteResponse { +// 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"). From f068d4f36541ba3cb6b89735811c54831951b0c7 Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Wed, 24 Sep 2025 22:02:54 +0300 Subject: [PATCH 3/8] Move quote endpoint to booking service --- proto/qdrant/cloud/booking/v1/booking.proto | 73 +++++++++++++++++++++ proto/qdrant/cloud/cluster/v1/cluster.proto | 55 ---------------- 2 files changed, 73 insertions(+), 55 deletions(-) diff --git a/proto/qdrant/cloud/booking/v1/booking.proto b/proto/qdrant/cloud/booking/v1/booking.proto index b20bf434..3b7cd9b6 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 and monthly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - None (authenticated only) + rpc GetQuote(GetQuoteRequest) returns (GetQuoteResponse) { + // permissions + option (common.v1.permissions) = ""; + // 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,62 @@ 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...20 [both included]. + // This is a required field. + uint32 number_of_nodes = 4 [(buf.validate.field).uint32 = { + gte: 1 + lte: 20 + }]; + // 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 original price per month in millicents, before any discounts. + // Calculated as original_price_per_hour * 24 * 30 (720 hours). + int64 original_price_per_month = 3 [(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 = 4 [(buf.validate.field).int64.gte = 0]; + // The discounted price per month in millicents, after applying discounts. + // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). + // If no discounts are applied, this will be the same as original_price_per_month. + int64 discounted_price_per_month = 5 [(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 = 6 [(buf.validate.field).double = { + gte: 0.0 + lte: 100.0 + }]; +} diff --git a/proto/qdrant/cloud/cluster/v1/cluster.proto b/proto/qdrant/cloud/cluster/v1/cluster.proto index 7333a72c..6f6f46ab 100644 --- a/proto/qdrant/cloud/cluster/v1/cluster.proto +++ b/proto/qdrant/cloud/cluster/v1/cluster.proto @@ -208,20 +208,6 @@ service ClusterService { field_expression: "cluster_id" }; } - // Gets a price quote for a cluster configuration. - // This endpoint calculates pricing information including hourly and monthly costs, - // and any applicable discounts for the specified cluster configuration. - // Required permissions: - // - read:clusters - rpc GetQuote(GetQuoteRequest) returns (GetQuoteResponse) { - // permissions - option (common.v1.permissions) = "read:clusters"; - // gRPC Gateway REST call - option (google.api.http) = { - post: "/api/cluster/v1/accounts/{account_id}/quote" - body: "*" - }; - } } // ListClustersRequest is the request for the ListClusters function @@ -962,44 +948,3 @@ message CreateClusterFromBackupResponse { Cluster cluster = 1 [(buf.validate.field).required = true]; } -// 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 cluster configuration to get a quote for. - // This should contain the same information as you would use for CreateCluster, - // except without readonly fields (id, created_at, deleted_at, state). - Cluster cluster = 2 [(buf.validate.field).required = true]; - option (buf.validate.message).cel = { - id: "quote.no_read_only_fields" - message: "read-only fields (id, created_at, deleted_at, state) must not be set on quote" - expression: "this.cluster.id == '' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)" - }; -} - -// 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 original price per month in millicents, before any discounts. - // Calculated as original_price_per_hour * 24 * 30 (720 hours). - int64 original_price_per_month = 3 [(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 = 4 [(buf.validate.field).int64.gte = 0]; - // The discounted price per month in millicents, after applying discounts. - // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). - // If no discounts are applied, this will be the same as original_price_per_month. - int64 discounted_price_per_month = 5 [(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 = 6 [(buf.validate.field).double = { - gte: 0.0 - lte: 100.0 - }]; -} From b518bbb830ff0c50a481a14f68eec485c0cdcb51 Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Wed, 24 Sep 2025 22:03:52 +0300 Subject: [PATCH 4/8] make generate --- gen/go/qdrant/cloud/booking/v1/booking.pb.go | 243 +++++++++++++++- .../cloud/booking/v1/booking_grpc.pb.go | 48 ++++ gen/go/qdrant/cloud/cluster/v1/cluster.pb.go | 267 +++--------------- .../cloud/cluster/v1/cluster_grpc.pb.go | 48 ---- .../cloud/booking/v1/booking.swagger.json | 103 +++++++ .../cloud/cluster/v1/cluster.swagger.json | 85 ------ .../qdrant/cloud/booking/v1/booking_pb2.py | 46 ++- .../qdrant/cloud/booking/v1/booking_pb2.pyi | 32 +++ .../cloud/booking/v1/booking_pb2_grpc.py | 48 ++++ .../qdrant/cloud/cluster/v1/cluster_pb2.py | 70 ++--- .../qdrant/cloud/cluster/v1/cluster_pb2.pyi | 24 -- .../cloud/cluster/v1/cluster_pb2_grpc.py | 48 ---- .../booking-BookingService_connectquery.d.ts | 10 + .../v1/booking-BookingService_connectquery.js | 11 + .../qdrant/cloud/booking/v1/booking_pb.d.ts | 144 ++++++++++ .../qdrant/cloud/booking/v1/booking_pb.js | 16 +- .../cluster-ClusterService_connectquery.d.ts | 10 - .../v1/cluster-ClusterService_connectquery.js | 11 - .../qdrant/cloud/cluster/v1/cluster_pb.d.ts | 132 --------- .../qdrant/cloud/cluster/v1/cluster_pb.js | 16 +- proto/qdrant/cloud/cluster/v1/cluster.proto | 1 - 21 files changed, 753 insertions(+), 660 deletions(-) diff --git a/gen/go/qdrant/cloud/booking/v1/booking.pb.go b/gen/go/qdrant/cloud/booking/v1/booking.pb.go index c776394b..17623965 100644 --- a/gen/go/qdrant/cloud/booking/v1/booking.pb.go +++ b/gen/go/qdrant/cloud/booking/v1/booking.pb.go @@ -702,6 +702,204 @@ 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...20 [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 original price per month in millicents, before any discounts. + // Calculated as original_price_per_hour * 24 * 30 (720 hours). + OriginalPricePerMonth int64 `protobuf:"varint,3,opt,name=original_price_per_month,json=originalPricePerMonth,proto3" json:"original_price_per_month,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,4,opt,name=discounted_price_per_hour,json=discountedPricePerHour,proto3" json:"discounted_price_per_hour,omitempty"` + // The discounted price per month in millicents, after applying discounts. + // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). + // If no discounts are applied, this will be the same as original_price_per_month. + DiscountedPricePerMonth int64 `protobuf:"varint,5,opt,name=discounted_price_per_month,json=discountedPricePerMonth,proto3" json:"discounted_price_per_month,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,6,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) GetOriginalPricePerMonth() int64 { + if x != nil { + return x.OriginalPricePerMonth + } + return 0 +} + +func (x *GetQuoteResponse) GetDiscountedPricePerHour() int64 { + if x != nil { + return x.DiscountedPricePerHour + } + return 0 +} + +func (x *GetQuoteResponse) GetDiscountedPricePerMonth() int64 { + if x != nil { + return x.DiscountedPricePerMonth + } + 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 +947,26 @@ 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\x18\x14(\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\"\x97\x03\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\x12@\n" + + "\x18original_price_per_month\x18\x03 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12B\n" + + "\x19discounted_price_per_hour\x18\x04 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x16discountedPricePerHour\x12D\n" + + "\x1adiscounted_price_per_month\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x17discountedPricePerMonth\x12H\n" + + "\x13discount_percentage\x18\x06 \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 +974,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\x81\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 +985,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\x9b\x01\n" + + "\bGetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\":\x8a\xb5\x18\x00\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 +1002,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 +1015,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 +1030,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 +1050,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..f307c98e 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 and monthly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - None (authenticated only) + 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 and monthly costs, + // and any applicable discounts for the specified cluster configuration. + // Required permissions: + // - None (authenticated only) + 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/go/qdrant/cloud/cluster/v1/cluster.pb.go b/gen/go/qdrant/cloud/cluster/v1/cluster.pb.go index f0a0c59c..c0bd3db2 100644 --- a/gen/go/qdrant/cloud/cluster/v1/cluster.pb.go +++ b/gen/go/qdrant/cloud/cluster/v1/cluster.pb.go @@ -3231,162 +3231,6 @@ func (x *CreateClusterFromBackupResponse) GetCluster() *Cluster { return nil } -// 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 cluster configuration to get a quote for. - // This should contain the same information as you would use for CreateCluster, - // except without readonly fields (id, created_at, deleted_at, state). - Cluster *Cluster `protobuf:"bytes,2,opt,name=cluster,proto3" json:"cluster,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *GetQuoteRequest) Reset() { - *x = GetQuoteRequest{} - mi := &file_qdrant_cloud_cluster_v1_cluster_proto_msgTypes[39] - 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_cluster_v1_cluster_proto_msgTypes[39] - 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_cluster_v1_cluster_proto_rawDescGZIP(), []int{39} -} - -func (x *GetQuoteRequest) GetAccountId() string { - if x != nil { - return x.AccountId - } - return "" -} - -func (x *GetQuoteRequest) GetCluster() *Cluster { - if x != nil { - return x.Cluster - } - return nil -} - -// 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 original price per month in millicents, before any discounts. - // Calculated as original_price_per_hour * 24 * 30 (720 hours). - OriginalPricePerMonth int64 `protobuf:"varint,3,opt,name=original_price_per_month,json=originalPricePerMonth,proto3" json:"original_price_per_month,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,4,opt,name=discounted_price_per_hour,json=discountedPricePerHour,proto3" json:"discounted_price_per_hour,omitempty"` - // The discounted price per month in millicents, after applying discounts. - // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). - // If no discounts are applied, this will be the same as original_price_per_month. - DiscountedPricePerMonth int64 `protobuf:"varint,5,opt,name=discounted_price_per_month,json=discountedPricePerMonth,proto3" json:"discounted_price_per_month,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,6,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_cluster_v1_cluster_proto_msgTypes[40] - 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_cluster_v1_cluster_proto_msgTypes[40] - 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_cluster_v1_cluster_proto_rawDescGZIP(), []int{40} -} - -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) GetOriginalPricePerMonth() int64 { - if x != nil { - return x.OriginalPricePerMonth - } - return 0 -} - -func (x *GetQuoteResponse) GetDiscountedPricePerHour() int64 { - if x != nil { - return x.DiscountedPricePerHour - } - return 0 -} - -func (x *GetQuoteResponse) GetDiscountedPricePerMonth() int64 { - if x != nil { - return x.DiscountedPricePerMonth - } - return 0 -} - -func (x *GetQuoteResponse) GetDiscountPercentage() float64 { - if x != nil { - return x.DiscountPercentage - } - return 0 -} - var File_qdrant_cloud_cluster_v1_cluster_proto protoreflect.FileDescriptor const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + @@ -3629,20 +3473,7 @@ const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + "\tbackup_id\x18\x02 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\bbackupId\x12>\n" + "\fcluster_name\x18\x03 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\vclusterName\"e\n" + "\x1fCreateClusterFromBackupResponse\x12B\n" + - "\acluster\x18\x01 \x01(\v2 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\acluster\"\xe7\x02\n" + - "\x0fGetQuoteRequest\x12'\n" + - "\n" + - "account_id\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12B\n" + - "\acluster\x18\x02 \x01(\v2 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\acluster:\xe6\x01\xbaH\xe2\x01\x1a\xdf\x01\n" + - "\x19quote.no_read_only_fields\x12Mread-only fields (id, created_at, deleted_at, state) must not be set on quote\x1asthis.cluster.id == '' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)\"\x97\x03\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\x12@\n" + - "\x18original_price_per_month\x18\x03 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12B\n" + - "\x19discounted_price_per_hour\x18\x04 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x16discountedPricePerHour\x12D\n" + - "\x1adiscounted_price_per_month\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x17discountedPricePerMonth\x12H\n" + - "\x13discount_percentage\x18\x06 \x01(\x01B\x17\xbaH\x14\x12\x12\x19\x00\x00\x00\x00\x00\x00Y@)\x00\x00\x00\x00\x00\x00\x00\x00R\x12discountPercentage*\xab\x01\n" + + "\acluster\x18\x01 \x01(\v2 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\acluster*\xab\x01\n" + "\x12ClusterServiceType\x12$\n" + " CLUSTER_SERVICE_TYPE_UNSPECIFIED\x10\x00\x12#\n" + "\x1fCLUSTER_SERVICE_TYPE_CLUSTER_IP\x10\x01\x12\"\n" + @@ -3709,7 +3540,7 @@ const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + "\x18ClusterScalabilityStatus\x12*\n" + "&CLUSTER_SCALABILITY_STATUS_UNSPECIFIED\x10\x00\x12+\n" + "'CLUSTER_SCALABILITY_STATUS_NOT_SCALABLE\x10\x01\x12'\n" + - "#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x022\xc7\x18\n" + + "#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x022\x9c\x17\n" + "\x0eClusterService\x12\xb4\x01\n" + "\fListClusters\x12,.qdrant.cloud.cluster.v1.ListClustersRequest\x1a-.qdrant.cloud.cluster.v1.ListClustersResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x020\x12./api/cluster/v1/accounts/{account_id}/clusters\x12\xd7\x01\n" + "\n" + @@ -3743,8 +3574,7 @@ const file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc = "" + "\x12ListQdrantReleases\x122.qdrant.cloud.cluster.v1.ListQdrantReleasesRequest\x1a3.qdrant.cloud.cluster.v1.ListQdrantReleasesResponse\"c\x8a\xb5\x18\rread:clusters\xba\xb5\x18\x18\n" + "\n" + "cluster_id\x12\n" + - "cluster_id\x82\xd3\xe4\x93\x020\x12./api/cluster/v1/accounts/{account_id}/releases\x12\xa8\x01\n" + - "\bGetQuote\x12(.qdrant.cloud.cluster.v1.GetQuoteRequest\x1a).qdrant.cloud.cluster.v1.GetQuoteResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x020:\x01*\"+/api/cluster/v1/accounts/{account_id}/quoteB\xfe\x01\n" + + "cluster_id\x82\xd3\xe4\x93\x020\x12./api/cluster/v1/accounts/{account_id}/releasesB\xfe\x01\n" + "\x1bcom.qdrant.cloud.cluster.v1B\fClusterProtoP\x01ZRgithub.com/qdrant/qdrant-cloud-public-api/gen/go/qdrant/cloud/cluster/v1;clusterv1\xa2\x02\x03QCC\xaa\x02\x17Qdrant.Cloud.Cluster.V1\xca\x02\x17Qdrant\\Cloud\\Cluster\\V1\xe2\x02#Qdrant\\Cloud\\Cluster\\V1\\GPBMetadata\xea\x02\x1aQdrant::Cloud::Cluster::V1b\x06proto3" var ( @@ -3760,7 +3590,7 @@ func file_qdrant_cloud_cluster_v1_cluster_proto_rawDescGZIP() []byte { } var file_qdrant_cloud_cluster_v1_cluster_proto_enumTypes = make([]protoimpl.EnumInfo, 10) -var file_qdrant_cloud_cluster_v1_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 41) +var file_qdrant_cloud_cluster_v1_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 39) var file_qdrant_cloud_cluster_v1_cluster_proto_goTypes = []any{ (ClusterServiceType)(0), // 0: qdrant.cloud.cluster.v1.ClusterServiceType (ClusterConfigurationGpuType)(0), // 1: qdrant.cloud.cluster.v1.ClusterConfigurationGpuType @@ -3811,11 +3641,9 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_goTypes = []any{ (*QdrantRelease)(nil), // 46: qdrant.cloud.cluster.v1.QdrantRelease (*CreateClusterFromBackupRequest)(nil), // 47: qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest (*CreateClusterFromBackupResponse)(nil), // 48: qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse - (*GetQuoteRequest)(nil), // 49: qdrant.cloud.cluster.v1.GetQuoteRequest - (*GetQuoteResponse)(nil), // 50: qdrant.cloud.cluster.v1.GetQuoteResponse - (*timestamppb.Timestamp)(nil), // 51: google.protobuf.Timestamp - (*v1.KeyValue)(nil), // 52: qdrant.cloud.common.v1.KeyValue - (*v1.SecretKeyRef)(nil), // 53: qdrant.cloud.common.v1.SecretKeyRef + (*timestamppb.Timestamp)(nil), // 49: google.protobuf.Timestamp + (*v1.KeyValue)(nil), // 50: qdrant.cloud.common.v1.KeyValue + (*v1.SecretKeyRef)(nil), // 51: qdrant.cloud.common.v1.SecretKeyRef } var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 28, // 0: qdrant.cloud.cluster.v1.ListClustersResponse.items:type_name -> qdrant.cloud.cluster.v1.Cluster @@ -3825,19 +3653,19 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 28, // 4: qdrant.cloud.cluster.v1.UpdateClusterRequest.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster 28, // 5: qdrant.cloud.cluster.v1.UpdateClusterResponse.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster 46, // 6: qdrant.cloud.cluster.v1.ListQdrantReleasesResponse.items:type_name -> qdrant.cloud.cluster.v1.QdrantRelease - 51, // 7: qdrant.cloud.cluster.v1.Cluster.created_at:type_name -> google.protobuf.Timestamp - 51, // 8: qdrant.cloud.cluster.v1.Cluster.deleted_at:type_name -> google.protobuf.Timestamp + 49, // 7: qdrant.cloud.cluster.v1.Cluster.created_at:type_name -> google.protobuf.Timestamp + 49, // 8: qdrant.cloud.cluster.v1.Cluster.deleted_at:type_name -> google.protobuf.Timestamp 29, // 9: qdrant.cloud.cluster.v1.Cluster.configuration:type_name -> qdrant.cloud.cluster.v1.ClusterConfiguration 40, // 10: qdrant.cloud.cluster.v1.Cluster.state:type_name -> qdrant.cloud.cluster.v1.ClusterState - 51, // 11: qdrant.cloud.cluster.v1.ClusterConfiguration.last_modified_at:type_name -> google.protobuf.Timestamp + 49, // 11: qdrant.cloud.cluster.v1.ClusterConfiguration.last_modified_at:type_name -> google.protobuf.Timestamp 38, // 12: qdrant.cloud.cluster.v1.ClusterConfiguration.additional_resources:type_name -> qdrant.cloud.cluster.v1.AdditionalResources 30, // 13: qdrant.cloud.cluster.v1.ClusterConfiguration.database_configuration:type_name -> qdrant.cloud.cluster.v1.DatabaseConfiguration - 52, // 14: qdrant.cloud.cluster.v1.ClusterConfiguration.node_selector:type_name -> qdrant.cloud.common.v1.KeyValue + 50, // 14: qdrant.cloud.cluster.v1.ClusterConfiguration.node_selector:type_name -> qdrant.cloud.common.v1.KeyValue 39, // 15: qdrant.cloud.cluster.v1.ClusterConfiguration.tolerations:type_name -> qdrant.cloud.cluster.v1.Toleration - 52, // 16: qdrant.cloud.cluster.v1.ClusterConfiguration.annotations:type_name -> qdrant.cloud.common.v1.KeyValue + 50, // 16: qdrant.cloud.cluster.v1.ClusterConfiguration.annotations:type_name -> qdrant.cloud.common.v1.KeyValue 0, // 17: qdrant.cloud.cluster.v1.ClusterConfiguration.service_type:type_name -> qdrant.cloud.cluster.v1.ClusterServiceType - 52, // 18: qdrant.cloud.cluster.v1.ClusterConfiguration.service_annotations:type_name -> qdrant.cloud.common.v1.KeyValue - 52, // 19: qdrant.cloud.cluster.v1.ClusterConfiguration.pod_labels:type_name -> qdrant.cloud.common.v1.KeyValue + 50, // 18: qdrant.cloud.cluster.v1.ClusterConfiguration.service_annotations:type_name -> qdrant.cloud.common.v1.KeyValue + 50, // 19: qdrant.cloud.cluster.v1.ClusterConfiguration.pod_labels:type_name -> qdrant.cloud.common.v1.KeyValue 1, // 20: qdrant.cloud.cluster.v1.ClusterConfiguration.gpu_type:type_name -> qdrant.cloud.cluster.v1.ClusterConfigurationGpuType 2, // 21: qdrant.cloud.cluster.v1.ClusterConfiguration.restart_policy:type_name -> qdrant.cloud.cluster.v1.ClusterConfigurationRestartPolicy 3, // 22: qdrant.cloud.cluster.v1.ClusterConfiguration.rebalance_strategy:type_name -> qdrant.cloud.cluster.v1.ClusterConfigurationRebalanceStrategy @@ -3849,19 +3677,19 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 37, // 28: qdrant.cloud.cluster.v1.DatabaseConfiguration.inference:type_name -> qdrant.cloud.cluster.v1.DatabaseConfigurationInference 32, // 29: qdrant.cloud.cluster.v1.DatabaseConfigurationCollection.vectors:type_name -> qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionVectors 34, // 30: qdrant.cloud.cluster.v1.DatabaseConfigurationStorage.performance:type_name -> qdrant.cloud.cluster.v1.DatabaseConfigurationStoragePerformance - 53, // 31: qdrant.cloud.cluster.v1.DatabaseConfigurationService.api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef - 53, // 32: qdrant.cloud.cluster.v1.DatabaseConfigurationService.read_only_api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef - 53, // 33: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.cert:type_name -> qdrant.cloud.common.v1.SecretKeyRef - 53, // 34: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.key:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 51, // 31: qdrant.cloud.cluster.v1.DatabaseConfigurationService.api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 51, // 32: qdrant.cloud.cluster.v1.DatabaseConfigurationService.read_only_api_key:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 51, // 33: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.cert:type_name -> qdrant.cloud.common.v1.SecretKeyRef + 51, // 34: qdrant.cloud.cluster.v1.DatabaseConfigurationTls.key:type_name -> qdrant.cloud.common.v1.SecretKeyRef 5, // 35: qdrant.cloud.cluster.v1.Toleration.operator:type_name -> qdrant.cloud.cluster.v1.TolerationOperator 6, // 36: qdrant.cloud.cluster.v1.Toleration.effect:type_name -> qdrant.cloud.cluster.v1.TolerationEffect - 51, // 37: qdrant.cloud.cluster.v1.ClusterState.restarted_at:type_name -> google.protobuf.Timestamp + 49, // 37: qdrant.cloud.cluster.v1.ClusterState.restarted_at:type_name -> google.protobuf.Timestamp 7, // 38: qdrant.cloud.cluster.v1.ClusterState.phase:type_name -> qdrant.cloud.cluster.v1.ClusterPhase 42, // 39: qdrant.cloud.cluster.v1.ClusterState.endpoint:type_name -> qdrant.cloud.cluster.v1.ClusterEndpoint 43, // 40: qdrant.cloud.cluster.v1.ClusterState.resources:type_name -> qdrant.cloud.cluster.v1.ClusterNodeResourcesSummary 45, // 41: qdrant.cloud.cluster.v1.ClusterState.scalability_info:type_name -> qdrant.cloud.cluster.v1.ClusterScalabilityInfo 41, // 42: qdrant.cloud.cluster.v1.ClusterState.nodes:type_name -> qdrant.cloud.cluster.v1.ClusterNodeInfo - 51, // 43: qdrant.cloud.cluster.v1.ClusterNodeInfo.started_at:type_name -> google.protobuf.Timestamp + 49, // 43: qdrant.cloud.cluster.v1.ClusterNodeInfo.started_at:type_name -> google.protobuf.Timestamp 42, // 44: qdrant.cloud.cluster.v1.ClusterNodeInfo.endpoint:type_name -> qdrant.cloud.cluster.v1.ClusterEndpoint 8, // 45: qdrant.cloud.cluster.v1.ClusterNodeInfo.state:type_name -> qdrant.cloud.cluster.v1.ClusterNodeState 44, // 46: qdrant.cloud.cluster.v1.ClusterNodeResourcesSummary.disk:type_name -> qdrant.cloud.cluster.v1.ClusterNodeResources @@ -3869,34 +3697,31 @@ var file_qdrant_cloud_cluster_v1_cluster_proto_depIdxs = []int32{ 44, // 48: qdrant.cloud.cluster.v1.ClusterNodeResourcesSummary.cpu:type_name -> qdrant.cloud.cluster.v1.ClusterNodeResources 9, // 49: qdrant.cloud.cluster.v1.ClusterScalabilityInfo.status:type_name -> qdrant.cloud.cluster.v1.ClusterScalabilityStatus 28, // 50: qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster - 28, // 51: qdrant.cloud.cluster.v1.GetQuoteRequest.cluster:type_name -> qdrant.cloud.cluster.v1.Cluster - 10, // 52: qdrant.cloud.cluster.v1.ClusterService.ListClusters:input_type -> qdrant.cloud.cluster.v1.ListClustersRequest - 12, // 53: qdrant.cloud.cluster.v1.ClusterService.GetCluster:input_type -> qdrant.cloud.cluster.v1.GetClusterRequest - 14, // 54: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:input_type -> qdrant.cloud.cluster.v1.CreateClusterRequest - 47, // 55: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:input_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest - 16, // 56: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:input_type -> qdrant.cloud.cluster.v1.UpdateClusterRequest - 18, // 57: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:input_type -> qdrant.cloud.cluster.v1.DeleteClusterRequest - 20, // 58: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:input_type -> qdrant.cloud.cluster.v1.RestartClusterRequest - 22, // 59: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:input_type -> qdrant.cloud.cluster.v1.SuspendClusterRequest - 24, // 60: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:input_type -> qdrant.cloud.cluster.v1.SuggestClusterNameRequest - 26, // 61: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:input_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesRequest - 49, // 62: qdrant.cloud.cluster.v1.ClusterService.GetQuote:input_type -> qdrant.cloud.cluster.v1.GetQuoteRequest - 11, // 63: qdrant.cloud.cluster.v1.ClusterService.ListClusters:output_type -> qdrant.cloud.cluster.v1.ListClustersResponse - 13, // 64: qdrant.cloud.cluster.v1.ClusterService.GetCluster:output_type -> qdrant.cloud.cluster.v1.GetClusterResponse - 15, // 65: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:output_type -> qdrant.cloud.cluster.v1.CreateClusterResponse - 48, // 66: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:output_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse - 17, // 67: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:output_type -> qdrant.cloud.cluster.v1.UpdateClusterResponse - 19, // 68: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:output_type -> qdrant.cloud.cluster.v1.DeleteClusterResponse - 21, // 69: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:output_type -> qdrant.cloud.cluster.v1.RestartClusterResponse - 23, // 70: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:output_type -> qdrant.cloud.cluster.v1.SuspendClusterResponse - 25, // 71: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:output_type -> qdrant.cloud.cluster.v1.SuggestClusterNameResponse - 27, // 72: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:output_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesResponse - 50, // 73: qdrant.cloud.cluster.v1.ClusterService.GetQuote:output_type -> qdrant.cloud.cluster.v1.GetQuoteResponse - 63, // [63:74] is the sub-list for method output_type - 52, // [52:63] is the sub-list for method input_type - 52, // [52:52] is the sub-list for extension type_name - 52, // [52:52] is the sub-list for extension extendee - 0, // [0:52] is the sub-list for field type_name + 10, // 51: qdrant.cloud.cluster.v1.ClusterService.ListClusters:input_type -> qdrant.cloud.cluster.v1.ListClustersRequest + 12, // 52: qdrant.cloud.cluster.v1.ClusterService.GetCluster:input_type -> qdrant.cloud.cluster.v1.GetClusterRequest + 14, // 53: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:input_type -> qdrant.cloud.cluster.v1.CreateClusterRequest + 47, // 54: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:input_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest + 16, // 55: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:input_type -> qdrant.cloud.cluster.v1.UpdateClusterRequest + 18, // 56: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:input_type -> qdrant.cloud.cluster.v1.DeleteClusterRequest + 20, // 57: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:input_type -> qdrant.cloud.cluster.v1.RestartClusterRequest + 22, // 58: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:input_type -> qdrant.cloud.cluster.v1.SuspendClusterRequest + 24, // 59: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:input_type -> qdrant.cloud.cluster.v1.SuggestClusterNameRequest + 26, // 60: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:input_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesRequest + 11, // 61: qdrant.cloud.cluster.v1.ClusterService.ListClusters:output_type -> qdrant.cloud.cluster.v1.ListClustersResponse + 13, // 62: qdrant.cloud.cluster.v1.ClusterService.GetCluster:output_type -> qdrant.cloud.cluster.v1.GetClusterResponse + 15, // 63: qdrant.cloud.cluster.v1.ClusterService.CreateCluster:output_type -> qdrant.cloud.cluster.v1.CreateClusterResponse + 48, // 64: qdrant.cloud.cluster.v1.ClusterService.CreateClusterFromBackup:output_type -> qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse + 17, // 65: qdrant.cloud.cluster.v1.ClusterService.UpdateCluster:output_type -> qdrant.cloud.cluster.v1.UpdateClusterResponse + 19, // 66: qdrant.cloud.cluster.v1.ClusterService.DeleteCluster:output_type -> qdrant.cloud.cluster.v1.DeleteClusterResponse + 21, // 67: qdrant.cloud.cluster.v1.ClusterService.RestartCluster:output_type -> qdrant.cloud.cluster.v1.RestartClusterResponse + 23, // 68: qdrant.cloud.cluster.v1.ClusterService.SuspendCluster:output_type -> qdrant.cloud.cluster.v1.SuspendClusterResponse + 25, // 69: qdrant.cloud.cluster.v1.ClusterService.SuggestClusterName:output_type -> qdrant.cloud.cluster.v1.SuggestClusterNameResponse + 27, // 70: qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases:output_type -> qdrant.cloud.cluster.v1.ListQdrantReleasesResponse + 61, // [61:71] is the sub-list for method output_type + 51, // [51:61] is the sub-list for method input_type + 51, // [51:51] is the sub-list for extension type_name + 51, // [51:51] is the sub-list for extension extendee + 0, // [0:51] is the sub-list for field type_name } func init() { file_qdrant_cloud_cluster_v1_cluster_proto_init() } @@ -3921,7 +3746,7 @@ func file_qdrant_cloud_cluster_v1_cluster_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc), len(file_qdrant_cloud_cluster_v1_cluster_proto_rawDesc)), NumEnums: 10, - NumMessages: 41, + NumMessages: 39, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go b/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go index c8ac0232..7b393ffb 100644 --- a/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go +++ b/gen/go/qdrant/cloud/cluster/v1/cluster_grpc.pb.go @@ -29,7 +29,6 @@ const ( ClusterService_SuspendCluster_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/SuspendCluster" ClusterService_SuggestClusterName_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/SuggestClusterName" ClusterService_ListQdrantReleases_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/ListQdrantReleases" - ClusterService_GetQuote_FullMethodName = "/qdrant.cloud.cluster.v1.ClusterService/GetQuote" ) // ClusterServiceClient is the client API for ClusterService service. @@ -81,12 +80,6 @@ type ClusterServiceClient interface { // Required permissions: // - read:clusters ListQdrantReleases(ctx context.Context, in *ListQdrantReleasesRequest, opts ...grpc.CallOption) (*ListQdrantReleasesResponse, error) - // Gets a price quote for a cluster configuration. - // This endpoint calculates pricing information including hourly and monthly costs, - // and any applicable discounts for the specified cluster configuration. - // Required permissions: - // - read:clusters - GetQuote(ctx context.Context, in *GetQuoteRequest, opts ...grpc.CallOption) (*GetQuoteResponse, error) } type clusterServiceClient struct { @@ -197,16 +190,6 @@ func (c *clusterServiceClient) ListQdrantReleases(ctx context.Context, in *ListQ return out, nil } -func (c *clusterServiceClient) 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, ClusterService_GetQuote_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - // ClusterServiceServer is the server API for ClusterService service. // All implementations must embed UnimplementedClusterServiceServer // for forward compatibility. @@ -256,12 +239,6 @@ type ClusterServiceServer interface { // Required permissions: // - read:clusters ListQdrantReleases(context.Context, *ListQdrantReleasesRequest) (*ListQdrantReleasesResponse, error) - // Gets a price quote for a cluster configuration. - // This endpoint calculates pricing information including hourly and monthly costs, - // and any applicable discounts for the specified cluster configuration. - // Required permissions: - // - read:clusters - GetQuote(context.Context, *GetQuoteRequest) (*GetQuoteResponse, error) mustEmbedUnimplementedClusterServiceServer() } @@ -302,9 +279,6 @@ func (UnimplementedClusterServiceServer) SuggestClusterName(context.Context, *Su func (UnimplementedClusterServiceServer) ListQdrantReleases(context.Context, *ListQdrantReleasesRequest) (*ListQdrantReleasesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListQdrantReleases not implemented") } -func (UnimplementedClusterServiceServer) GetQuote(context.Context, *GetQuoteRequest) (*GetQuoteResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetQuote not implemented") -} func (UnimplementedClusterServiceServer) mustEmbedUnimplementedClusterServiceServer() {} func (UnimplementedClusterServiceServer) testEmbeddedByValue() {} @@ -506,24 +480,6 @@ func _ClusterService_ListQdrantReleases_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } -func _ClusterService_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.(ClusterServiceServer).GetQuote(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: ClusterService_GetQuote_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ClusterServiceServer).GetQuote(ctx, req.(*GetQuoteRequest)) - } - return interceptor(ctx, in, info, handler) -} - // ClusterService_ServiceDesc is the grpc.ServiceDesc for ClusterService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -571,10 +527,6 @@ var ClusterService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListQdrantReleases", Handler: _ClusterService_ListQdrantReleases_Handler, }, - { - MethodName: "GetQuote", - Handler: _ClusterService_GetQuote_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "qdrant/cloud/cluster/v1/cluster.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..cac57a0b 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 and monthly costs,\nand any applicable discounts for the specified cluster configuration.\nRequired permissions:\n- None (authenticated only)", + "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...20 [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,41 @@ }, "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." + }, + "originalPricePerMonth": { + "type": "string", + "format": "int64", + "description": "The original price per month in millicents, before any discounts.\nCalculated as original_price_per_hour * 24 * 30 (720 hours)." + }, + "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." + }, + "discountedPricePerMonth": { + "type": "string", + "format": "int64", + "description": "The discounted price per month in millicents, after applying discounts.\nCalculated as discounted_price_per_hour * 24 * 30 (720 hours).\nIf no discounts are applied, this will be the same as original_price_per_month." + }, + "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/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json b/gen/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json index 6ac9e69a..46a2fbb6 100644 --- a/gen/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json +++ b/gen/openapiv2/qdrant/cloud/cluster/v1/cluster.swagger.json @@ -301,46 +301,6 @@ ] } }, - "/api/cluster/v1/accounts/{accountId}/quote": { - "post": { - "summary": "Gets a price quote for a cluster configuration.\nThis endpoint calculates pricing information including hourly and monthly costs,\nand any applicable discounts for the specified cluster configuration.\nRequired permissions:\n- read:clusters", - "operationId": "ClusterService_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/ClusterServiceGetQuoteBody" - } - } - ], - "tags": [ - "ClusterService" - ] - } - }, "/api/cluster/v1/accounts/{accountId}/releases": { "get": { "summary": "Lists all qdrant releases in the account identified by the given ID.\nOptional a cluster ID can be provided, the list will return the options to update to only.\nRequired permissions:\n- read:clusters", @@ -515,16 +475,6 @@ }, "title": "CreateClusterRequest is the request for the CreateCluster function" }, - "ClusterServiceGetQuoteBody": { - "type": "object", - "properties": { - "cluster": { - "$ref": "#/definitions/v1Cluster", - "description": "The cluster configuration to get a quote for.\nThis should contain the same information as you would use for CreateCluster,\nexcept without readonly fields (id, created_at, deleted_at, state)." - } - }, - "title": "GetQuoteRequest is the request for the GetQuote function" - }, "ClusterServiceUpdateClusterBody": { "type": "object", "properties": { @@ -1213,41 +1163,6 @@ }, "title": "GetClusterResponse is the response from the GetCluster 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." - }, - "originalPricePerMonth": { - "type": "string", - "format": "int64", - "description": "The original price per month in millicents, before any discounts.\nCalculated as original_price_per_hour * 24 * 30 (720 hours)." - }, - "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." - }, - "discountedPricePerMonth": { - "type": "string", - "format": "int64", - "description": "The discounted price per month in millicents, after applying discounts.\nCalculated as discounted_price_per_hour * 24 * 30 (720 hours).\nIf no discounts are applied, this will be the same as original_price_per_month." - }, - "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" - }, "v1KeyValue": { "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..b176992a 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\x14(\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\"\x97\x03\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@\n\x18original_price_per_month\x18\x03 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12\x42\n\x19\x64iscounted_price_per_hour\x18\x04 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x16\x64iscountedPricePerHour\x12\x44\n\x1a\x64iscounted_price_per_month\x18\x05 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x17\x64iscountedPricePerMonth\x12H\n\x13\x64iscount_percentage\x18\x06 \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\x81\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\x9b\x01\n\x08GetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\":\x8a\xb5\x18\x00\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,44 @@ _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\030\024(\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['original_price_per_month']._loaded_options = None + _globals['_GETQUOTERESPONSE'].fields_by_name['original_price_per_month']._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['discounted_price_per_month']._loaded_options = None + _globals['_GETQUOTERESPONSE'].fields_by_name['discounted_price_per_month']._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\000\202\323\344\223\0020\"+/api/booking/v1/accounts/{account_id}/quote:\001*' + _globals['_PACKAGESTATUS']._serialized_start=3216 + _globals['_PACKAGESTATUS']._serialized_end=3322 + _globals['_PACKAGETIER']._serialized_start=3324 + _globals['_PACKAGETIER']._serialized_end=3427 _globals['_LISTPACKAGESREQUEST']._serialized_start=163 _globals['_LISTPACKAGESREQUEST']._serialized_end=655 _globals['_LISTPACKAGESRESPONSE']._serialized_start=657 @@ -103,6 +131,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=3214 + _globals['_BOOKINGSERVICE']._serialized_start=3430 + _globals['_BOOKINGSERVICE']._serialized_end=4327 # @@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..25bf6f25 100644 --- a/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi +++ b/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi @@ -111,3 +111,35 @@ 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", "original_price_per_month", "discounted_price_per_hour", "discounted_price_per_month", "discount_percentage") + CURRENCY_FIELD_NUMBER: _ClassVar[int] + ORIGINAL_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] + ORIGINAL_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] + DISCOUNTED_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] + DISCOUNTED_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] + DISCOUNT_PERCENTAGE_FIELD_NUMBER: _ClassVar[int] + currency: str + original_price_per_hour: int + original_price_per_month: int + discounted_price_per_hour: int + discounted_price_per_month: int + discount_percentage: float + def __init__(self, currency: _Optional[str] = ..., original_price_per_hour: _Optional[int] = ..., original_price_per_month: _Optional[int] = ..., discounted_price_per_hour: _Optional[int] = ..., discounted_price_per_month: _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..f91f2a22 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 and monthly costs, + and any applicable discounts for the specified cluster configuration. + Required permissions: + - None (authenticated only) + """ + 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/python/qdrant/cloud/cluster/v1/cluster_pb2.py b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2.py index da59eefa..3c52aafe 100644 --- a/gen/python/qdrant/cloud/cluster/v1/cluster_pb2.py +++ b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2.py @@ -29,7 +29,7 @@ from qdrant.cloud.event.v1 import events_pb2 as qdrant_dot_cloud_dot_event_dot_v1_dot_events__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%qdrant/cloud/cluster/v1/cluster.proto\x12\x17qdrant.cloud.cluster.v1\x1a\x1b\x62uf/validate/validate.proto\x1a\x1cgoogle/api/annotations.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a#qdrant/cloud/common/v1/common.proto\x1a\"qdrant/cloud/event/v1/events.proto\"\xba\x05\n\x13ListClustersRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x38\n\x11\x63loud_provider_id\x18\n \x01(\tB\x07\xbaH\x04r\x02\x10\x03H\x00R\x0f\x63loudProviderId\x88\x01\x01\x12\x45\n\x18\x63loud_provider_region_id\x18\x0b \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x01R\x15\x63loudProviderRegionId\x88\x01\x01:\xc5\x03\xbaH\xc1\x03\x1a\xb1\x01\n\'list_clusters.cloud_provider_id_present\x12\x42\x63loud_provider_id is required when cloud_provider_region_id is set\x1a\x42!has(this.cloud_provider_region_id) || has(this.cloud_provider_id)\x1a\x8a\x02\n cluster.cloud_provider_region_id\x12Hcloud_provider_region_id must be a UUID if cloud_provider_id is \'hybrid\'\x1a\x9b\x01this.cloud_provider_region_id.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\') || this.cloud_provider_id!= \'hybrid\'B\x14\n\x12_cloud_provider_idB\x1b\n\x19_cloud_provider_region_id\"N\n\x14ListClustersResponse\x12\x36\n\x05items\x18\x01 \x03(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterR\x05items\"e\n\x11GetClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\"X\n\x12GetClusterResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster\"\xcd\x02\n\x14\x43reateClusterRequest\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:\xf0\x01\xbaH\xec\x01\x1a\xe9\x01\n\"create_cluster.no_read_only_fields\x12Nread-only fields (id, created_at, deleted_at, state) must not be set on create\x1asthis.cluster.id == \'\' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)\"\xc4\x01\n\x15\x43reateClusterResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:g\xbaHd\x1a\x62\n\x1c\x63reate_cluster.state_present\x12)state is required for an existing cluster\x1a\x17has(this.cluster.state)\"\xb9\x01\n\x14UpdateClusterRequest\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:]\xbaHZ\x1aX\n\x19update_cluster.id_present\x12$cluster.id is required for an update\x1a\x15this.cluster.id != \'\'\"\xc4\x01\n\x15UpdateClusterResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:g\xbaHd\x1a\x62\n\x1cupdate_cluster.state_present\x12)state is required for an existing cluster\x1a\x17has(this.cluster.state)\"\xa7\x01\n\x14\x44\x65leteClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\x12*\n\x0e\x64\x65lete_backups\x18\x03 \x01(\x08H\x00R\rdeleteBackups\x88\x01\x01\x42\x11\n\x0f_delete_backups\"\x17\n\x15\x44\x65leteClusterResponse\"i\n\x15RestartClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\"\x18\n\x16RestartClusterResponse\"i\n\x15SuspendClusterRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\'\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tclusterId\"\x18\n\x16SuspendClusterResponse\"D\n\x19SuggestClusterNameRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\"9\n\x1aSuggestClusterNameResponse\x12\x1b\n\x04name\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04name\"\x81\x01\n\x19ListQdrantReleasesRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12,\n\ncluster_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\tclusterId\x88\x01\x01\x42\r\n\x0b_cluster_id\"Z\n\x1aListQdrantReleasesResponse\x12<\n\x05items\x18\x01 \x03(\x0b\x32&.qdrant.cloud.cluster.v1.QdrantReleaseR\x05items\"\xb4\x07\n\x07\x43luster\x12\x0e\n\x02id\x18\x01 \x01(\tR\x02id\x12\x39\n\ncreated_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tcreatedAt\x12\'\n\naccount_id\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12/\n\x04name\x18\x04 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\x04name\x12\x39\n\ndeleted_at\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tdeletedAt\x12\x33\n\x11\x63loud_provider_id\x18\n \x01(\tB\x07\xbaH\x04r\x02\x10\x03R\x0f\x63loudProviderId\x12@\n\x18\x63loud_provider_region_id\x18\x0b \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x15\x63loudProviderRegionId\x12[\n\rconfiguration\x18\x14 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterConfigurationB\x06\xbaH\x03\xc8\x01\x01R\rconfiguration\x12;\n\x05state\x18\x64 \x01(\x0b\x32%.qdrant.cloud.cluster.v1.ClusterStateR\x05state:\xb7\x03\xbaH\xb3\x03\x1a\xa3\x01\n\ncluster.id\x12\x1avalue must be a valid UUID\x1aythis.id.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\') || !has(this.created_at)\x1a\x8a\x02\n cluster.cloud_provider_region_id\x12Hcloud_provider_region_id must be a UUID if cloud_provider_id is \'hybrid\'\x1a\x9b\x01this.cloud_provider_region_id.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\') || this.cloud_provider_id!= \'hybrid\'\"\xfa\x0c\n\x14\x43lusterConfiguration\x12\x44\n\x10last_modified_at\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0elastModifiedAt\x12\x31\n\x0fnumber_of_nodes\x18\x02 \x01(\rB\t\xbaH\x06*\x04\x18\x14(\x01R\rnumberOfNodes\x12\x45\n\x07version\x18\x03 \x01(\tB&\xbaH#r!2\x1f^(v(\\d+)\\.(\\d+)\\.(\\d+)|latest)$H\x00R\x07version\x88\x01\x01\x12\'\n\npackage_id\x18\x04 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\tpackageId\x12\x64\n\x14\x61\x64\x64itional_resources\x18\x05 \x01(\x0b\x32,.qdrant.cloud.cluster.v1.AdditionalResourcesH\x01R\x13\x61\x64\x64itionalResources\x88\x01\x01\x12j\n\x16\x64\x61tabase_configuration\x18\x07 \x01(\x0b\x32..qdrant.cloud.cluster.v1.DatabaseConfigurationH\x02R\x15\x64\x61tabaseConfiguration\x88\x01\x01\x12O\n\rnode_selector\x18\x08 \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\x0cnodeSelector\x12O\n\x0btolerations\x18\t \x03(\x0b\x32#.qdrant.cloud.cluster.v1.TolerationB\x08\xbaH\x05\x92\x01\x02\x10\nR\x0btolerations\x12L\n\x0b\x61nnotations\x18\n \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\x0b\x61nnotations\x12H\n\x18\x61llowed_ip_source_ranges\x18\x0b \x03(\tB\x0f\xbaH\x0c\x92\x01\t\x10\x14\"\x05r\x03\xf0\x01\x01R\x15\x61llowedIpSourceRanges\x12_\n\x0cservice_type\x18\x0c \x01(\x0e\x32+.qdrant.cloud.cluster.v1.ClusterServiceTypeB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x03R\x0bserviceType\x88\x01\x01\x12[\n\x13service_annotations\x18\r \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\x12serviceAnnotations\x12I\n\npod_labels\x18\x0e \x03(\x0b\x32 .qdrant.cloud.common.v1.KeyValueB\x08\xbaH\x05\x92\x01\x02\x10\nR\tpodLabels\x12?\n\x17reserved_cpu_percentage\x18\x14 \x01(\rB\x07\xbaH\x04*\x02\x18PR\x15reservedCpuPercentage\x12\x45\n\x1areserved_memory_percentage\x18\x15 \x01(\rB\x07\xbaH\x04*\x02\x18PR\x18reservedMemoryPercentage\x12`\n\x08gpu_type\x18\x16 \x01(\x0e\x32\x34.qdrant.cloud.cluster.v1.ClusterConfigurationGpuTypeB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x04R\x07gpuType\x88\x01\x01\x12r\n\x0erestart_policy\x18\x17 \x01(\x0e\x32:.qdrant.cloud.cluster.v1.ClusterConfigurationRestartPolicyB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x05R\rrestartPolicy\x88\x01\x01\x12~\n\x12rebalance_strategy\x18\x18 \x01(\x0e\x32>.qdrant.cloud.cluster.v1.ClusterConfigurationRebalanceStrategyB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x06R\x11rebalanceStrategy\x88\x01\x01\x42\n\n\x08_versionB\x17\n\x15_additional_resourcesB\x19\n\x17_database_configurationB\x0f\n\r_service_typeB\x0b\n\t_gpu_typeB\x11\n\x0f_restart_policyB\x15\n\x13_rebalance_strategy\"\xf9\x04\n\x15\x44\x61tabaseConfiguration\x12]\n\ncollection\x18\x01 \x01(\x0b\x32\x38.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionH\x00R\ncollection\x88\x01\x01\x12T\n\x07storage\x18\x02 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationStorageH\x01R\x07storage\x88\x01\x01\x12T\n\x07service\x18\x03 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationServiceH\x02R\x07service\x88\x01\x01\x12\x64\n\tlog_level\x18\x04 \x01(\x0e\x32\x36.qdrant.cloud.cluster.v1.DatabaseConfigurationLogLevelB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x03R\x08logLevel\x88\x01\x01\x12H\n\x03tls\x18\x05 \x01(\x0b\x32\x31.qdrant.cloud.cluster.v1.DatabaseConfigurationTlsH\x04R\x03tls\x88\x01\x01\x12Z\n\tinference\x18\x06 \x01(\x0b\x32\x37.qdrant.cloud.cluster.v1.DatabaseConfigurationInferenceH\x05R\tinference\x88\x01\x01\x42\r\n\x0b_collectionB\n\n\x08_storageB\n\n\x08_serviceB\x0c\n\n_log_levelB\x06\n\x04_tlsB\x0c\n\n_inference\"\x9b\x02\n\x1f\x44\x61tabaseConfigurationCollection\x12;\n\x12replication_factor\x18\x01 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x11replicationFactor\x88\x01\x01\x12\x41\n\x18write_consistency_factor\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x01R\x16writeConsistencyFactor\x12\x61\n\x07vectors\x18\x03 \x01(\x0b\x32?.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionVectorsB\x06\xbaH\x03\xc8\x01\x01R\x07vectorsB\x15\n\x13_replication_factor\"R\n&DatabaseConfigurationCollectionVectors\x12\x1c\n\x07on_disk\x18\x01 \x01(\x08H\x00R\x06onDisk\x88\x01\x01\x42\n\n\x08_on_disk\"\x82\x01\n\x1c\x44\x61tabaseConfigurationStorage\x12\x62\n\x0bperformance\x18\x01 \x01(\x0b\x32@.qdrant.cloud.cluster.v1.DatabaseConfigurationStoragePerformanceR\x0bperformance\"~\n\'DatabaseConfigurationStoragePerformance\x12\x30\n\x14optimizer_cpu_budget\x18\x01 \x01(\x05R\x12optimizerCpuBudget\x12!\n\x0c\x61sync_scorer\x18\x02 \x01(\x08R\x0b\x61syncScorer\"\x94\x02\n\x1c\x44\x61tabaseConfigurationService\x12\x42\n\x07\x61pi_key\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x00R\x06\x61piKey\x88\x01\x01\x12T\n\x11read_only_api_key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x01R\x0ereadOnlyApiKey\x88\x01\x01\x12\x19\n\x08jwt_rbac\x18\x03 \x01(\x08R\x07jwtRbac\x12\x1d\n\nenable_tls\x18\x04 \x01(\x08R\tenableTlsB\n\n\x08_api_keyB\x14\n\x12_read_only_api_key\"\x9c\x01\n\x18\x44\x61tabaseConfigurationTls\x12@\n\x04\x63\x65rt\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x04\x63\x65rt\x12>\n\x03key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x03key\":\n\x1e\x44\x61tabaseConfigurationInference\x12\x18\n\x07\x65nabled\x18\x01 \x01(\x08R\x07\x65nabled\")\n\x13\x41\x64\x64itionalResources\x12\x12\n\x04\x64isk\x18\x03 \x01(\rR\x04\x64isk\"\x86\x03\n\nToleration\x12H\n\x03key\x18\x01 \x01(\tB6\xbaH3r1\x18?2-^([a-zA-Z0-9]([-a-zA-Z0-9_.]*[a-zA-Z0-9])?)?$R\x03key\x12X\n\x08operator\x18\x02 \x01(\x0e\x32+.qdrant.cloud.cluster.v1.TolerationOperatorB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x00R\x08operator\x88\x01\x01\x12\x14\n\x05value\x18\x03 \x01(\tR\x05value\x12R\n\x06\x65\x66\x66\x65\x63t\x18\x04 \x01(\x0e\x32).qdrant.cloud.cluster.v1.TolerationEffectB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x01R\x06\x65\x66\x66\x65\x63t\x88\x01\x01\x12;\n\x12toleration_seconds\x18\x05 \x01(\x04\x42\x07\xbaH\x04\x32\x02(\x00H\x02R\x11tolerationSeconds\x88\x01\x01\x42\x0b\n\t_operatorB\t\n\x07_effectB\x15\n\x13_toleration_seconds\"\xb8\x04\n\x0c\x43lusterState\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x19\n\x08nodes_up\x18\x02 \x01(\rR\x07nodesUp\x12=\n\x0crestarted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0brestartedAt\x12\x45\n\x05phase\x18\x04 \x01(\x0e\x32%.qdrant.cloud.cluster.v1.ClusterPhaseB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05phase\x12\x16\n\x06reason\x18\x05 \x01(\tR\x06reason\x12L\n\x08\x65ndpoint\x18\x06 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointB\x06\xbaH\x03\xc8\x01\x01R\x08\x65ndpoint\x12Z\n\tresources\x18\x07 \x01(\x0b\x32\x34.qdrant.cloud.cluster.v1.ClusterNodeResourcesSummaryB\x06\xbaH\x03\xc8\x01\x01R\tresources\x12\x62\n\x10scalability_info\x18\x08 \x01(\x0b\x32/.qdrant.cloud.cluster.v1.ClusterScalabilityInfoB\x06\xbaH\x03\xc8\x01\x01R\x0fscalabilityInfo\x12>\n\x05nodes\x18\t \x03(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterNodeInfoR\x05nodes\"\x94\x02\n\x0f\x43lusterNodeInfo\x12\x1b\n\x04name\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04name\x12\x39\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x18\n\x07version\x18\x03 \x01(\tR\x07version\x12\x44\n\x08\x65ndpoint\x18\x04 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointR\x08\x65ndpoint\x12I\n\x05state\x18\n \x01(\x0e\x32).qdrant.cloud.cluster.v1.ClusterNodeStateB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05state\"y\n\x0f\x43lusterEndpoint\x12\x1a\n\x03url\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01R\x03url\x12$\n\trest_port\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08restPort\x12$\n\tgrpc_port\x18\x03 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08grpcPort\"\xfa\x01\n\x1b\x43lusterNodeResourcesSummary\x12I\n\x04\x64isk\x18\x01 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x04\x64isk\x12G\n\x03ram\x18\x02 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03ram\x12G\n\x03\x63pu\x18\x03 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03\x63pu\"\xfa\x01\n\x14\x43lusterNodeResources\x12\"\n\x04\x62\x61se\x18\x01 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x04\x62\x61se\x12\x34\n\rcomplimentary\x18\x02 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\rcomplimentary\x12.\n\nadditional\x18\x03 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\nadditional\x12*\n\x08reserved\x18\x04 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x08reserved\x12,\n\tavailable\x18\x05 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\tavailable\"\xa0\x01\n\x16\x43lusterScalabilityInfo\x12U\n\x06status\x18\x01 \x01(\x0e\x32\x31.qdrant.cloud.cluster.v1.ClusterScalabilityStatusB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x06status\x12$\n\x06reason\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x06reason\x88\x01\x01\x42\t\n\x07_reason\"\x93\x02\n\rQdrantRelease\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x18\n\x07\x64\x65\x66\x61ult\x18\x02 \x01(\x08R\x07\x64\x65\x66\x61ult\x12\x39\n\x11release_notes_url\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01H\x00R\x0freleaseNotesUrl\x88\x01\x01\x12&\n\x07remarks\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x01R\x07remarks\x88\x01\x01\x12\x1e\n\x0b\x65nd_of_life\x18\x05 \x01(\x08R\tendOfLife\x12 \n\x0bunavailable\x18\x06 \x01(\x08R\x0bunavailableB\x14\n\x12_release_notes_urlB\n\n\x08_remarks\"\xb0\x01\n\x1e\x43reateClusterFromBackupRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12%\n\tbackup_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08\x62\x61\x63kupId\x12>\n\x0c\x63luster_name\x18\x03 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\x0b\x63lusterName\"e\n\x1f\x43reateClusterFromBackupResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster\"\xe7\x02\n\x0fGetQuoteRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12\x42\n\x07\x63luster\x18\x02 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster:\xe6\x01\xbaH\xe2\x01\x1a\xdf\x01\n\x19quote.no_read_only_fields\x12Mread-only fields (id, created_at, deleted_at, state) must not be set on quote\x1asthis.cluster.id == \'\' && !has(this.cluster.created_at) && !has(this.cluster.deleted_at) && !has(this.cluster.state)\"\x97\x03\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@\n\x18original_price_per_month\x18\x03 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12\x42\n\x19\x64iscounted_price_per_hour\x18\x04 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x16\x64iscountedPricePerHour\x12\x44\n\x1a\x64iscounted_price_per_month\x18\x05 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x17\x64iscountedPricePerMonth\x12H\n\x13\x64iscount_percentage\x18\x06 \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*\xab\x01\n\x12\x43lusterServiceType\x12$\n CLUSTER_SERVICE_TYPE_UNSPECIFIED\x10\x00\x12#\n\x1f\x43LUSTER_SERVICE_TYPE_CLUSTER_IP\x10\x01\x12\"\n\x1e\x43LUSTER_SERVICE_TYPE_NODE_PORT\x10\x02\x12&\n\"CLUSTER_SERVICE_TYPE_LOAD_BALANCER\x10\x03*\xa0\x01\n\x1b\x43lusterConfigurationGpuType\x12.\n*CLUSTER_CONFIGURATION_GPU_TYPE_UNSPECIFIED\x10\x00\x12)\n%CLUSTER_CONFIGURATION_GPU_TYPE_NVIDIA\x10\x01\x12&\n\"CLUSTER_CONFIGURATION_GPU_TYPE_AMD\x10\x02*\xf2\x01\n!ClusterConfigurationRestartPolicy\x12\x34\n0CLUSTER_CONFIGURATION_RESTART_POLICY_UNSPECIFIED\x10\x00\x12\x30\n,CLUSTER_CONFIGURATION_RESTART_POLICY_ROLLING\x10\x01\x12\x31\n-CLUSTER_CONFIGURATION_RESTART_POLICY_PARALLEL\x10\x02\x12\x32\n.CLUSTER_CONFIGURATION_RESTART_POLICY_AUTOMATIC\x10\x03*\x8e\x02\n%ClusterConfigurationRebalanceStrategy\x12\x38\n4CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_UNSPECIFIED\x10\x00\x12\x35\n1CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT\x10\x01\x12\x34\n0CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_SIZE\x10\x02\x12>\n:CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT_AND_SIZE\x10\x03*\xd5\x02\n\x1d\x44\x61tabaseConfigurationLogLevel\x12\x30\n,DATABASE_CONFIGURATION_LOG_LEVEL_UNSPECIFIED\x10\x00\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_TRACE\x10\x01\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_DEBUG\x10\x02\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_INFO\x10\x03\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_WARN\x10\x04\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_ERROR\x10\x05\x12(\n$DATABASE_CONFIGURATION_LOG_LEVEL_OFF\x10\x06*x\n\x12TolerationOperator\x12#\n\x1fTOLERATION_OPERATOR_UNSPECIFIED\x10\x00\x12\x1e\n\x1aTOLERATION_OPERATOR_EXISTS\x10\x01\x12\x1d\n\x19TOLERATION_OPERATOR_EQUAL\x10\x02*\xa4\x01\n\x10TolerationEffect\x12!\n\x1dTOLERATION_EFFECT_UNSPECIFIED\x10\x00\x12!\n\x1dTOLERATION_EFFECT_NO_SCHEDULE\x10\x01\x12(\n$TOLERATION_EFFECT_PREFER_NO_SCHEDULE\x10\x02\x12 \n\x1cTOLERATION_EFFECT_NO_EXECUTE\x10\x03*\xdf\x04\n\x0c\x43lusterPhase\x12\x1d\n\x19\x43LUSTER_PHASE_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LUSTER_PHASE_CREATING\x10\x01\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_CREATE\x10\x02\x12\x1a\n\x16\x43LUSTER_PHASE_UPDATING\x10\x03\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_UPDATE\x10\x04\x12\x19\n\x15\x43LUSTER_PHASE_SCALING\x10\x05\x12\x1b\n\x17\x43LUSTER_PHASE_UPGRADING\x10\x06\x12\x1c\n\x18\x43LUSTER_PHASE_SUSPENDING\x10\x07\x12\x1b\n\x17\x43LUSTER_PHASE_SUSPENDED\x10\x08\x12#\n\x1f\x43LUSTER_PHASE_FAILED_TO_SUSPEND\x10\t\x12\x1a\n\x16\x43LUSTER_PHASE_RESUMING\x10\n\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_RESUME\x10\x0b\x12\x19\n\x15\x43LUSTER_PHASE_HEALTHY\x10\x0c\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_READY\x10\r\x12\x1f\n\x1b\x43LUSTER_PHASE_RECOVERY_MODE\x10\x0e\x12$\n CLUSTER_PHASE_MANUAL_MAINTENANCE\x10\x0f\x12 \n\x1c\x43LUSTER_PHASE_FAILED_TO_SYNC\x10\x10\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_FOUND\x10\x11\x12\x1a\n\x16\x43LUSTER_PHASE_DELETING\x10\x12*\xbb\x01\n\x10\x43lusterNodeState\x12\"\n\x1e\x43LUSTER_NODE_STATE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43LUSTER_NODE_STATE_STARTING\x10\x01\x12\x1e\n\x1a\x43LUSTER_NODE_STATE_HEALTHY\x10\x02\x12 \n\x1c\x43LUSTER_NODE_STATE_UNHEALTHY\x10\x03\x12 \n\x1c\x43LUSTER_NODE_STATE_SUSPENDED\x10\x04*\x9c\x01\n\x18\x43lusterScalabilityStatus\x12*\n&CLUSTER_SCALABILITY_STATUS_UNSPECIFIED\x10\x00\x12+\n\'CLUSTER_SCALABILITY_STATUS_NOT_SCALABLE\x10\x01\x12\'\n#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x02\x32\xc7\x18\n\x0e\x43lusterService\x12\xb4\x01\n\x0cListClusters\x12,.qdrant.cloud.cluster.v1.ListClustersRequest\x1a-.qdrant.cloud.cluster.v1.ListClustersResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x02\x30\x12./api/cluster/v1/accounts/{account_id}/clusters\x12\xd7\x01\n\nGetCluster\x12*.qdrant.cloud.cluster.v1.GetClusterRequest\x1a+.qdrant.cloud.cluster.v1.GetClusterResponse\"p\x8a\xb5\x18\rread:clusters\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster_id\x82\xd3\xe4\x93\x02=\x12;/api/cluster/v1/accounts/{account_id}/clusters/{cluster_id}\x12\xd9\x02\n\rCreateCluster\x12-.qdrant.cloud.cluster.v1.CreateClusterRequest\x1a..qdrant.cloud.cluster.v1.CreateClusterResponse\"\xe8\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster.name\xca\xf3\x18[\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*=/accounts/{req.cluster.account_id}/clusters/{resp.cluster.id}\x82\xd3\xe4\x93\x02;\"6/api/cluster/v1/accounts/{cluster.account_id}/clusters:\x01*\x12\xb4\x03\n\x17\x43reateClusterFromBackup\x12\x37.qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest\x1a\x38.qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse\"\xa5\x02\x8a\xb5\x18\x0frestore:backups\x8a\xb5\x18\x0ewrite:clusters\xa8\xb5\x18\x01\xba\xb5\x18\x16\n\tbackup_id\x12\tbackup_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster_name\xca\xf3\x18t\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*5/accounts/{req.account_id}/clusters/{resp.cluster.id}R\x1f\n\x0e\x66rom_backup_id\x12\rreq.backup_id\x82\xd3\xe4\x93\x02\x44\"B/api/cluster/v1/accounts/{account_id}/backups/{backup_id}/clusters\x12\xe0\x02\n\rUpdateCluster\x12-.qdrant.cloud.cluster.v1.UpdateClusterRequest\x1a..qdrant.cloud.cluster.v1.UpdateClusterResponse\"\xef\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster.id\xca\xf3\x18Y\x08\x02\x12\x07\x63luster\"\x0ereq.cluster.id*.qdrant.cloud.cluster.v1.ClusterConfigurationRebalanceStrategyB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x06R\x11rebalanceStrategy\x88\x01\x01\x42\n\n\x08_versionB\x17\n\x15_additional_resourcesB\x19\n\x17_database_configurationB\x0f\n\r_service_typeB\x0b\n\t_gpu_typeB\x11\n\x0f_restart_policyB\x15\n\x13_rebalance_strategy\"\xf9\x04\n\x15\x44\x61tabaseConfiguration\x12]\n\ncollection\x18\x01 \x01(\x0b\x32\x38.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionH\x00R\ncollection\x88\x01\x01\x12T\n\x07storage\x18\x02 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationStorageH\x01R\x07storage\x88\x01\x01\x12T\n\x07service\x18\x03 \x01(\x0b\x32\x35.qdrant.cloud.cluster.v1.DatabaseConfigurationServiceH\x02R\x07service\x88\x01\x01\x12\x64\n\tlog_level\x18\x04 \x01(\x0e\x32\x36.qdrant.cloud.cluster.v1.DatabaseConfigurationLogLevelB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x03R\x08logLevel\x88\x01\x01\x12H\n\x03tls\x18\x05 \x01(\x0b\x32\x31.qdrant.cloud.cluster.v1.DatabaseConfigurationTlsH\x04R\x03tls\x88\x01\x01\x12Z\n\tinference\x18\x06 \x01(\x0b\x32\x37.qdrant.cloud.cluster.v1.DatabaseConfigurationInferenceH\x05R\tinference\x88\x01\x01\x42\r\n\x0b_collectionB\n\n\x08_storageB\n\n\x08_serviceB\x0c\n\n_log_levelB\x06\n\x04_tlsB\x0c\n\n_inference\"\x9b\x02\n\x1f\x44\x61tabaseConfigurationCollection\x12;\n\x12replication_factor\x18\x01 \x01(\rB\x07\xbaH\x04*\x02(\x01H\x00R\x11replicationFactor\x88\x01\x01\x12\x41\n\x18write_consistency_factor\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02(\x01R\x16writeConsistencyFactor\x12\x61\n\x07vectors\x18\x03 \x01(\x0b\x32?.qdrant.cloud.cluster.v1.DatabaseConfigurationCollectionVectorsB\x06\xbaH\x03\xc8\x01\x01R\x07vectorsB\x15\n\x13_replication_factor\"R\n&DatabaseConfigurationCollectionVectors\x12\x1c\n\x07on_disk\x18\x01 \x01(\x08H\x00R\x06onDisk\x88\x01\x01\x42\n\n\x08_on_disk\"\x82\x01\n\x1c\x44\x61tabaseConfigurationStorage\x12\x62\n\x0bperformance\x18\x01 \x01(\x0b\x32@.qdrant.cloud.cluster.v1.DatabaseConfigurationStoragePerformanceR\x0bperformance\"~\n\'DatabaseConfigurationStoragePerformance\x12\x30\n\x14optimizer_cpu_budget\x18\x01 \x01(\x05R\x12optimizerCpuBudget\x12!\n\x0c\x61sync_scorer\x18\x02 \x01(\x08R\x0b\x61syncScorer\"\x94\x02\n\x1c\x44\x61tabaseConfigurationService\x12\x42\n\x07\x61pi_key\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x00R\x06\x61piKey\x88\x01\x01\x12T\n\x11read_only_api_key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefH\x01R\x0ereadOnlyApiKey\x88\x01\x01\x12\x19\n\x08jwt_rbac\x18\x03 \x01(\x08R\x07jwtRbac\x12\x1d\n\nenable_tls\x18\x04 \x01(\x08R\tenableTlsB\n\n\x08_api_keyB\x14\n\x12_read_only_api_key\"\x9c\x01\n\x18\x44\x61tabaseConfigurationTls\x12@\n\x04\x63\x65rt\x18\x01 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x04\x63\x65rt\x12>\n\x03key\x18\x02 \x01(\x0b\x32$.qdrant.cloud.common.v1.SecretKeyRefB\x06\xbaH\x03\xc8\x01\x01R\x03key\":\n\x1e\x44\x61tabaseConfigurationInference\x12\x18\n\x07\x65nabled\x18\x01 \x01(\x08R\x07\x65nabled\")\n\x13\x41\x64\x64itionalResources\x12\x12\n\x04\x64isk\x18\x03 \x01(\rR\x04\x64isk\"\x86\x03\n\nToleration\x12H\n\x03key\x18\x01 \x01(\tB6\xbaH3r1\x18?2-^([a-zA-Z0-9]([-a-zA-Z0-9_.]*[a-zA-Z0-9])?)?$R\x03key\x12X\n\x08operator\x18\x02 \x01(\x0e\x32+.qdrant.cloud.cluster.v1.TolerationOperatorB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x00R\x08operator\x88\x01\x01\x12\x14\n\x05value\x18\x03 \x01(\tR\x05value\x12R\n\x06\x65\x66\x66\x65\x63t\x18\x04 \x01(\x0e\x32).qdrant.cloud.cluster.v1.TolerationEffectB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00H\x01R\x06\x65\x66\x66\x65\x63t\x88\x01\x01\x12;\n\x12toleration_seconds\x18\x05 \x01(\x04\x42\x07\xbaH\x04\x32\x02(\x00H\x02R\x11tolerationSeconds\x88\x01\x01\x42\x0b\n\t_operatorB\t\n\x07_effectB\x15\n\x13_toleration_seconds\"\xb8\x04\n\x0c\x43lusterState\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x19\n\x08nodes_up\x18\x02 \x01(\rR\x07nodesUp\x12=\n\x0crestarted_at\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x0brestartedAt\x12\x45\n\x05phase\x18\x04 \x01(\x0e\x32%.qdrant.cloud.cluster.v1.ClusterPhaseB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05phase\x12\x16\n\x06reason\x18\x05 \x01(\tR\x06reason\x12L\n\x08\x65ndpoint\x18\x06 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointB\x06\xbaH\x03\xc8\x01\x01R\x08\x65ndpoint\x12Z\n\tresources\x18\x07 \x01(\x0b\x32\x34.qdrant.cloud.cluster.v1.ClusterNodeResourcesSummaryB\x06\xbaH\x03\xc8\x01\x01R\tresources\x12\x62\n\x10scalability_info\x18\x08 \x01(\x0b\x32/.qdrant.cloud.cluster.v1.ClusterScalabilityInfoB\x06\xbaH\x03\xc8\x01\x01R\x0fscalabilityInfo\x12>\n\x05nodes\x18\t \x03(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterNodeInfoR\x05nodes\"\x94\x02\n\x0f\x43lusterNodeInfo\x12\x1b\n\x04name\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x04name\x12\x39\n\nstarted_at\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\tstartedAt\x12\x18\n\x07version\x18\x03 \x01(\tR\x07version\x12\x44\n\x08\x65ndpoint\x18\x04 \x01(\x0b\x32(.qdrant.cloud.cluster.v1.ClusterEndpointR\x08\x65ndpoint\x12I\n\x05state\x18\n \x01(\x0e\x32).qdrant.cloud.cluster.v1.ClusterNodeStateB\x08\xbaH\x05\x82\x01\x02\x10\x01R\x05state\"y\n\x0f\x43lusterEndpoint\x12\x1a\n\x03url\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01R\x03url\x12$\n\trest_port\x18\x02 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08restPort\x12$\n\tgrpc_port\x18\x03 \x01(\x05\x42\x07\xbaH\x04\x1a\x02 \x00R\x08grpcPort\"\xfa\x01\n\x1b\x43lusterNodeResourcesSummary\x12I\n\x04\x64isk\x18\x01 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x04\x64isk\x12G\n\x03ram\x18\x02 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03ram\x12G\n\x03\x63pu\x18\x03 \x01(\x0b\x32-.qdrant.cloud.cluster.v1.ClusterNodeResourcesB\x06\xbaH\x03\xc8\x01\x01R\x03\x63pu\"\xfa\x01\n\x14\x43lusterNodeResources\x12\"\n\x04\x62\x61se\x18\x01 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x04\x62\x61se\x12\x34\n\rcomplimentary\x18\x02 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\rcomplimentary\x12.\n\nadditional\x18\x03 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\nadditional\x12*\n\x08reserved\x18\x04 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\x08reserved\x12,\n\tavailable\x18\x05 \x01(\x01\x42\x0e\xbaH\x0b\x12\t)\x00\x00\x00\x00\x00\x00\x00\x00R\tavailable\"\xa0\x01\n\x16\x43lusterScalabilityInfo\x12U\n\x06status\x18\x01 \x01(\x0e\x32\x31.qdrant.cloud.cluster.v1.ClusterScalabilityStatusB\n\xbaH\x07\x82\x01\x04\x10\x01 \x00R\x06status\x12$\n\x06reason\x18\x02 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x00R\x06reason\x88\x01\x01\x42\t\n\x07_reason\"\x93\x02\n\rQdrantRelease\x12!\n\x07version\x18\x01 \x01(\tB\x07\xbaH\x04r\x02\x10\x01R\x07version\x12\x18\n\x07\x64\x65\x66\x61ult\x18\x02 \x01(\x08R\x07\x64\x65\x66\x61ult\x12\x39\n\x11release_notes_url\x18\x03 \x01(\tB\x08\xbaH\x05r\x03\x88\x01\x01H\x00R\x0freleaseNotesUrl\x88\x01\x01\x12&\n\x07remarks\x18\x04 \x01(\tB\x07\xbaH\x04r\x02\x10\x01H\x01R\x07remarks\x88\x01\x01\x12\x1e\n\x0b\x65nd_of_life\x18\x05 \x01(\x08R\tendOfLife\x12 \n\x0bunavailable\x18\x06 \x01(\x08R\x0bunavailableB\x14\n\x12_release_notes_urlB\n\n\x08_remarks\"\xb0\x01\n\x1e\x43reateClusterFromBackupRequest\x12\'\n\naccount_id\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\taccountId\x12%\n\tbackup_id\x18\x02 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x08\x62\x61\x63kupId\x12>\n\x0c\x63luster_name\x18\x03 \x01(\tB\x1b\xbaH\x18r\x16\x10\x04\x18@2\x10^[a-zA-Z0-9-_]+$R\x0b\x63lusterName\"e\n\x1f\x43reateClusterFromBackupResponse\x12\x42\n\x07\x63luster\x18\x01 \x01(\x0b\x32 .qdrant.cloud.cluster.v1.ClusterB\x06\xbaH\x03\xc8\x01\x01R\x07\x63luster*\xab\x01\n\x12\x43lusterServiceType\x12$\n CLUSTER_SERVICE_TYPE_UNSPECIFIED\x10\x00\x12#\n\x1f\x43LUSTER_SERVICE_TYPE_CLUSTER_IP\x10\x01\x12\"\n\x1e\x43LUSTER_SERVICE_TYPE_NODE_PORT\x10\x02\x12&\n\"CLUSTER_SERVICE_TYPE_LOAD_BALANCER\x10\x03*\xa0\x01\n\x1b\x43lusterConfigurationGpuType\x12.\n*CLUSTER_CONFIGURATION_GPU_TYPE_UNSPECIFIED\x10\x00\x12)\n%CLUSTER_CONFIGURATION_GPU_TYPE_NVIDIA\x10\x01\x12&\n\"CLUSTER_CONFIGURATION_GPU_TYPE_AMD\x10\x02*\xf2\x01\n!ClusterConfigurationRestartPolicy\x12\x34\n0CLUSTER_CONFIGURATION_RESTART_POLICY_UNSPECIFIED\x10\x00\x12\x30\n,CLUSTER_CONFIGURATION_RESTART_POLICY_ROLLING\x10\x01\x12\x31\n-CLUSTER_CONFIGURATION_RESTART_POLICY_PARALLEL\x10\x02\x12\x32\n.CLUSTER_CONFIGURATION_RESTART_POLICY_AUTOMATIC\x10\x03*\x8e\x02\n%ClusterConfigurationRebalanceStrategy\x12\x38\n4CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_UNSPECIFIED\x10\x00\x12\x35\n1CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT\x10\x01\x12\x34\n0CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_SIZE\x10\x02\x12>\n:CLUSTER_CONFIGURATION_REBALANCE_STRATEGY_BY_COUNT_AND_SIZE\x10\x03*\xd5\x02\n\x1d\x44\x61tabaseConfigurationLogLevel\x12\x30\n,DATABASE_CONFIGURATION_LOG_LEVEL_UNSPECIFIED\x10\x00\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_TRACE\x10\x01\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_DEBUG\x10\x02\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_INFO\x10\x03\x12)\n%DATABASE_CONFIGURATION_LOG_LEVEL_WARN\x10\x04\x12*\n&DATABASE_CONFIGURATION_LOG_LEVEL_ERROR\x10\x05\x12(\n$DATABASE_CONFIGURATION_LOG_LEVEL_OFF\x10\x06*x\n\x12TolerationOperator\x12#\n\x1fTOLERATION_OPERATOR_UNSPECIFIED\x10\x00\x12\x1e\n\x1aTOLERATION_OPERATOR_EXISTS\x10\x01\x12\x1d\n\x19TOLERATION_OPERATOR_EQUAL\x10\x02*\xa4\x01\n\x10TolerationEffect\x12!\n\x1dTOLERATION_EFFECT_UNSPECIFIED\x10\x00\x12!\n\x1dTOLERATION_EFFECT_NO_SCHEDULE\x10\x01\x12(\n$TOLERATION_EFFECT_PREFER_NO_SCHEDULE\x10\x02\x12 \n\x1cTOLERATION_EFFECT_NO_EXECUTE\x10\x03*\xdf\x04\n\x0c\x43lusterPhase\x12\x1d\n\x19\x43LUSTER_PHASE_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LUSTER_PHASE_CREATING\x10\x01\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_CREATE\x10\x02\x12\x1a\n\x16\x43LUSTER_PHASE_UPDATING\x10\x03\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_UPDATE\x10\x04\x12\x19\n\x15\x43LUSTER_PHASE_SCALING\x10\x05\x12\x1b\n\x17\x43LUSTER_PHASE_UPGRADING\x10\x06\x12\x1c\n\x18\x43LUSTER_PHASE_SUSPENDING\x10\x07\x12\x1b\n\x17\x43LUSTER_PHASE_SUSPENDED\x10\x08\x12#\n\x1f\x43LUSTER_PHASE_FAILED_TO_SUSPEND\x10\t\x12\x1a\n\x16\x43LUSTER_PHASE_RESUMING\x10\n\x12\"\n\x1e\x43LUSTER_PHASE_FAILED_TO_RESUME\x10\x0b\x12\x19\n\x15\x43LUSTER_PHASE_HEALTHY\x10\x0c\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_READY\x10\r\x12\x1f\n\x1b\x43LUSTER_PHASE_RECOVERY_MODE\x10\x0e\x12$\n CLUSTER_PHASE_MANUAL_MAINTENANCE\x10\x0f\x12 \n\x1c\x43LUSTER_PHASE_FAILED_TO_SYNC\x10\x10\x12\x1b\n\x17\x43LUSTER_PHASE_NOT_FOUND\x10\x11\x12\x1a\n\x16\x43LUSTER_PHASE_DELETING\x10\x12*\xbb\x01\n\x10\x43lusterNodeState\x12\"\n\x1e\x43LUSTER_NODE_STATE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x43LUSTER_NODE_STATE_STARTING\x10\x01\x12\x1e\n\x1a\x43LUSTER_NODE_STATE_HEALTHY\x10\x02\x12 \n\x1c\x43LUSTER_NODE_STATE_UNHEALTHY\x10\x03\x12 \n\x1c\x43LUSTER_NODE_STATE_SUSPENDED\x10\x04*\x9c\x01\n\x18\x43lusterScalabilityStatus\x12*\n&CLUSTER_SCALABILITY_STATUS_UNSPECIFIED\x10\x00\x12+\n\'CLUSTER_SCALABILITY_STATUS_NOT_SCALABLE\x10\x01\x12\'\n#CLUSTER_SCALABILITY_STATUS_SCALABLE\x10\x02\x32\x9c\x17\n\x0e\x43lusterService\x12\xb4\x01\n\x0cListClusters\x12,.qdrant.cloud.cluster.v1.ListClustersRequest\x1a-.qdrant.cloud.cluster.v1.ListClustersResponse\"G\x8a\xb5\x18\rread:clusters\x82\xd3\xe4\x93\x02\x30\x12./api/cluster/v1/accounts/{account_id}/clusters\x12\xd7\x01\n\nGetCluster\x12*.qdrant.cloud.cluster.v1.GetClusterRequest\x1a+.qdrant.cloud.cluster.v1.GetClusterResponse\"p\x8a\xb5\x18\rread:clusters\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster_id\x82\xd3\xe4\x93\x02=\x12;/api/cluster/v1/accounts/{account_id}/clusters/{cluster_id}\x12\xd9\x02\n\rCreateCluster\x12-.qdrant.cloud.cluster.v1.CreateClusterRequest\x1a..qdrant.cloud.cluster.v1.CreateClusterResponse\"\xe8\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster.name\xca\xf3\x18[\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*=/accounts/{req.cluster.account_id}/clusters/{resp.cluster.id}\x82\xd3\xe4\x93\x02;\"6/api/cluster/v1/accounts/{cluster.account_id}/clusters:\x01*\x12\xb4\x03\n\x17\x43reateClusterFromBackup\x12\x37.qdrant.cloud.cluster.v1.CreateClusterFromBackupRequest\x1a\x38.qdrant.cloud.cluster.v1.CreateClusterFromBackupResponse\"\xa5\x02\x8a\xb5\x18\x0frestore:backups\x8a\xb5\x18\x0ewrite:clusters\xa8\xb5\x18\x01\xba\xb5\x18\x16\n\tbackup_id\x12\tbackup_id\xba\xb5\x18\x1c\n\x0c\x63luster_name\x12\x0c\x63luster_name\xca\xf3\x18t\x08\x01\x12\x07\x63luster\"\x0fresp.cluster.id*5/accounts/{req.account_id}/clusters/{resp.cluster.id}R\x1f\n\x0e\x66rom_backup_id\x12\rreq.backup_id\x82\xd3\xe4\x93\x02\x44\"B/api/cluster/v1/accounts/{account_id}/backups/{backup_id}/clusters\x12\xe0\x02\n\rUpdateCluster\x12-.qdrant.cloud.cluster.v1.UpdateClusterRequest\x1a..qdrant.cloud.cluster.v1.UpdateClusterResponse\"\xef\x01\x8a\xb5\x18\x0ewrite:clusters\x92\xb5\x18\x12\x63luster.account_id\xba\xb5\x18\x18\n\ncluster_id\x12\ncluster.id\xca\xf3\x18Y\x08\x02\x12\x07\x63luster\"\x0ereq.cluster.id* None: ... - -class GetQuoteRequest(_message.Message): - __slots__ = ("account_id", "cluster") - ACCOUNT_ID_FIELD_NUMBER: _ClassVar[int] - CLUSTER_FIELD_NUMBER: _ClassVar[int] - account_id: str - cluster: Cluster - def __init__(self, account_id: _Optional[str] = ..., cluster: _Optional[_Union[Cluster, _Mapping]] = ...) -> None: ... - -class GetQuoteResponse(_message.Message): - __slots__ = ("currency", "original_price_per_hour", "original_price_per_month", "discounted_price_per_hour", "discounted_price_per_month", "discount_percentage") - CURRENCY_FIELD_NUMBER: _ClassVar[int] - ORIGINAL_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] - ORIGINAL_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] - DISCOUNTED_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] - DISCOUNTED_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] - DISCOUNT_PERCENTAGE_FIELD_NUMBER: _ClassVar[int] - currency: str - original_price_per_hour: int - original_price_per_month: int - discounted_price_per_hour: int - discounted_price_per_month: int - discount_percentage: float - def __init__(self, currency: _Optional[str] = ..., original_price_per_hour: _Optional[int] = ..., original_price_per_month: _Optional[int] = ..., discounted_price_per_hour: _Optional[int] = ..., discounted_price_per_month: _Optional[int] = ..., discount_percentage: _Optional[float] = ...) -> None: ... diff --git a/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py index a2ca9950..4add8046 100644 --- a/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py +++ b/gen/python/qdrant/cloud/cluster/v1/cluster_pb2_grpc.py @@ -65,11 +65,6 @@ def __init__(self, channel): request_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesRequest.SerializeToString, response_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesResponse.FromString, _registered_method=True) - self.GetQuote = channel.unary_unary( - '/qdrant.cloud.cluster.v1.ClusterService/GetQuote', - request_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteRequest.SerializeToString, - response_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteResponse.FromString, - _registered_method=True) class ClusterServiceServicer(object): @@ -169,17 +164,6 @@ def ListQdrantReleases(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 and monthly costs, - and any applicable discounts for the specified cluster configuration. - Required permissions: - - read:clusters - """ - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - def add_ClusterServiceServicer_to_server(servicer, server): rpc_method_handlers = { @@ -233,11 +217,6 @@ def add_ClusterServiceServicer_to_server(servicer, server): request_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesRequest.FromString, response_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.ListQdrantReleasesResponse.SerializeToString, ), - 'GetQuote': grpc.unary_unary_rpc_method_handler( - servicer.GetQuote, - request_deserializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteRequest.FromString, - response_serializer=qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteResponse.SerializeToString, - ), } generic_handler = grpc.method_handlers_generic_handler( 'qdrant.cloud.cluster.v1.ClusterService', rpc_method_handlers) @@ -519,30 +498,3 @@ def ListQdrantReleases(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.cluster.v1.ClusterService/GetQuote', - qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__pb2.GetQuoteRequest.SerializeToString, - qdrant_dot_cloud_dot_cluster_dot_v1_dot_cluster__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..f2436884 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 and monthly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - None (authenticated only) + * + * @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..6f7554e3 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 and monthly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - None (authenticated only) + * + * @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..05462f2a 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,136 @@ 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...20 [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 original price per month in millicents, before any discounts. + * Calculated as original_price_per_hour * 24 * 30 (720 hours). + * + * @generated from field: int64 original_price_per_month = 3; + */ + originalPricePerMonth: 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 = 4; + */ + discountedPricePerHour: bigint; + + /** + * The discounted price per month in millicents, after applying discounts. + * Calculated as discounted_price_per_hour * 24 * 30 (720 hours). + * If no discounts are applied, this will be the same as original_price_per_month. + * + * @generated from field: int64 discounted_price_per_month = 5; + */ + discountedPricePerMonth: 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 = 6; + */ + 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 +585,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 and monthly costs, + * and any applicable discounts for the specified cluster configuration. + * Required permissions: + * - None (authenticated only) + * + * @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..8095b2d6 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("CiVxZHJhbnQvY2xvdWQvYm9va2luZy92MS9ib29raW5nLnByb3RvEhdxZHJhbnQuY2xvdWQuYm9va2luZy52MSKvAwoTTGlzdFBhY2thZ2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIiChFjbG91ZF9wcm92aWRlcl9pZBgCIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAyABKAlCB7pIBHICEAFIAIgBARI4CghzdGF0dXNlcxgEIAMoDjImLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLlBhY2thZ2VTdGF0dXM6zgG6SMoBGscBCi5saXN0X3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSLkAgoZTGlzdEdsb2JhbFBhY2thZ2VzUmVxdWVzdBIiChFjbG91ZF9wcm92aWRlcl9pZBgBIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAiABKAlCB7pIBHICEAFIAIgBATrVAbpI0QEazgEKNWxpc3RfZ2xvYmFsX3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIk0KGkxpc3RHbG9iYWxQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSJHChFHZXRQYWNrYWdlUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIUCgJpZBgCIAEoCUIIukgFcgOwAQEiTwoSR2V0UGFja2FnZVJlc3BvbnNlEjkKB3BhY2thZ2UYASABKAsyIC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlQga6SAPIAQEilQQKB1BhY2thZ2USFAoCaWQYASABKAlCCLpIBXIDsAEBEikKBG5hbWUYAiABKAlCG7pIGHIWEAMYQDIQXlthLXpBLVowLTktX10rJBIfCgR0eXBlGAMgASgJQhG6SA5yDFIEZnJlZVIEcGFpZBJOChZyZXNvdXJjZV9jb25maWd1cmF0aW9uGAQgASgLMi4ucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUmVzb3VyY2VDb25maWd1cmF0aW9uEiMKCGN1cnJlbmN5GAUgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChd1bml0X2ludF9wcmljZV9wZXJfaG91chgGIAEoBUIHukgEGgIoABJCCgZzdGF0dXMYByABKA4yJi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlU3RhdHVzQgq6SAeCAQQQASAAEj4KBHRpZXIYCSABKA4yJC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlVGllckIKukgHggEEEAEgABJiCh5hdmFpbGFibGVfYWRkaXRpb25hbF9yZXNvdXJjZXMYCCABKAsyNS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5BdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzSACIAQFCIQofX2F2YWlsYWJsZV9hZGRpdGlvbmFsX3Jlc291cmNlcyI7ChxBdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzEhsKE2Rpc2tfcHJpY2VfcGVyX2hvdXIYASABKA0iWgoVUmVzb3VyY2VDb25maWd1cmF0aW9uEhQKA3JhbRgBIAEoCUIHukgEcgIQARIUCgNjcHUYAiABKAlCB7pIBHICEAESFQoEZGlzaxgDIAEoCUIHukgEcgIQASLVAwoPR2V0UXVvdGVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEiIKEWNsb3VkX3Byb3ZpZGVyX2lkGAIgASgJQge6SARyAhADEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgDIAEoCUIHukgEcgIQAUgAiAEBEiIKD251bWJlcl9vZl9ub2RlcxgEIAEoDUIJukgGKgQYFCgBEhwKCnBhY2thZ2VfaWQYBSABKAlCCLpIBXIDsAEBEiQKE2FkZGl0aW9uYWxfZGlza19naWIYBiABKA1CB7pIBCoCKAA6ygG6SMYBGsMBCipnZXRfcXVvdGUuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkX3ByZXNlbnQSS2Nsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX2lkIGlzIG5vdCAnaHlicmlkJxpIdGhpcy5jbG91ZF9wcm92aWRlcl9pZCA9PSAnaHlicmlkJyB8fCBoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpQhsKGV9jbG91ZF9wcm92aWRlcl9yZWdpb25faWQimwIKEEdldFF1b3RlUmVzcG9uc2USIwoIY3VycmVuY3kYASABKAlCEbpIDnIMMgpeW0EtWl17M30kEigKF29yaWdpbmFsX3ByaWNlX3Blcl9ob3VyGAIgASgDQge6SAQiAigAEikKGG9yaWdpbmFsX3ByaWNlX3Blcl9tb250aBgDIAEoA0IHukgEIgIoABIqChlkaXNjb3VudGVkX3ByaWNlX3Blcl9ob3VyGAQgASgDQge6SAQiAigAEisKGmRpc2NvdW50ZWRfcHJpY2VfcGVyX21vbnRoGAUgASgDQge6SAQiAigAEjQKE2Rpc2NvdW50X3BlcmNlbnRhZ2UYBiABKAFCF7pIFBISGQAAAAAAAFlAKQAAAAAAAAAAKmoKDVBhY2thZ2VTdGF0dXMSHgoaUEFDS0FHRV9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1NUQVRVU19BQ1RJVkUQARIeChpQQUNLQUdFX1NUQVRVU19ERUFDVElWQVRFRBACKmcKC1BhY2thZ2VUaWVyEiMKH1BBQ0tBR0VfVElFUl9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1RJRVJfU1RBTkRBUkQQARIYChRQQUNLQUdFX1RJRVJfUFJFTUlVTRACMoEHCg5Cb29raW5nU2VydmljZRKKAgoMTGlzdFBhY2thZ2VzEiwucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdFBhY2thZ2VzUmVxdWVzdBotLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkxpc3RQYWNrYWdlc1Jlc3BvbnNlIpwBirUYALq1GCYKEWNsb3VkX3Byb3ZpZGVyX2lkEhFjbG91ZF9wcm92aWRlcl9pZLq1GDQKGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBIYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkgtPkkwIwEi4vYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3BhY2thZ2VzEroBCgpHZXRQYWNrYWdlEioucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuR2V0UGFja2FnZVJlcXVlc3QaKy5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRQYWNrYWdlUmVzcG9uc2UiU4q1GAC6tRgQCgpwYWNrYWdlX2lkEgJpZILT5JMCNRIzL2FwaS9ib29raW5nL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9wYWNrYWdlcy97aWR9EoYCChJMaXN0R2xvYmFsUGFja2FnZXMSMi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5MaXN0R2xvYmFsUGFja2FnZXNSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdEdsb2JhbFBhY2thZ2VzUmVzcG9uc2UihgGYtRgAurUYJgoRY2xvdWRfcHJvdmlkZXJfaWQSEWNsb3VkX3Byb3ZpZGVyX2lkurUYNAoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEhhjbG91ZF9wcm92aWRlcl9yZWdpb25faWSC0+STAhoSGC9hcGkvYm9va2luZy92MS9wYWNrYWdlcxKbAQoIR2V0UXVvdGUSKC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlcXVlc3QaKS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlc3BvbnNlIjqKtRgAgtPkkwIwOgEqIisvYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3F1b3RlQv4BChtjb20ucWRyYW50LmNsb3VkLmJvb2tpbmcudjFCDEJvb2tpbmdQcm90b1ABWlJnaXRodWIuY29tL3FkcmFudC9xZHJhbnQtY2xvdWQtcHVibGljLWFwaS9nZW4vZ28vcWRyYW50L2Nsb3VkL2Jvb2tpbmcvdjE7Ym9va2luZ3YxogIDUUNCqgIXUWRyYW50LkNsb3VkLkJvb2tpbmcuVjHKAhdRZHJhbnRcQ2xvdWRcQm9va2luZ1xWMeICI1FkcmFudFxDbG91ZFxCb29raW5nXFYxXEdQQk1ldGFkYXRh6gIaUWRyYW50OjpDbG91ZDo6Qm9va2luZzo6VjFiBnByb3RvMw", [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/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.d.ts b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.d.ts index 56998536..d58429a8 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.d.ts +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.d.ts @@ -87,13 +87,3 @@ export const suggestClusterName: typeof ClusterService["method"]["suggestCluster * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases */ export const listQdrantReleases: typeof ClusterService["method"]["listQdrantReleases"]; -/** - * Gets a price quote for a cluster configuration. - * This endpoint calculates pricing information including hourly and monthly costs, - * and any applicable discounts for the specified cluster configuration. - * Required permissions: - * - read:clusters - * - * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.GetQuote - */ -export const getQuote: typeof ClusterService["method"]["getQuote"]; diff --git a/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js index e2f458cd..10ab028d 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster-ClusterService_connectquery.js @@ -96,14 +96,3 @@ export const suggestClusterName = ClusterService.method.suggestClusterName; * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.ListQdrantReleases */ export const listQdrantReleases = ClusterService.method.listQdrantReleases; - -/** - * Gets a price quote for a cluster configuration. - * This endpoint calculates pricing information including hourly and monthly costs, - * and any applicable discounts for the specified cluster configuration. - * Required permissions: - * - read:clusters - * - * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.GetQuote - */ -export const getQuote = ClusterService.method.getQuote; diff --git a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts index 3169845a..71982139 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.d.ts @@ -2028,124 +2028,6 @@ export declare type CreateClusterFromBackupResponseValid = Message<"qdrant.cloud */ export declare const CreateClusterFromBackupResponseSchema: GenMessage; -/** - * GetQuoteRequest is the request for the GetQuote function - * - * @generated from message qdrant.cloud.cluster.v1.GetQuoteRequest - */ -export declare type GetQuoteRequest = Message<"qdrant.cloud.cluster.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 cluster configuration to get a quote for. - * This should contain the same information as you would use for CreateCluster, - * except without readonly fields (id, created_at, deleted_at, state). - * - * @generated from field: qdrant.cloud.cluster.v1.Cluster cluster = 2; - */ - cluster?: Cluster; -}; - -/** - * GetQuoteRequest is the request for the GetQuote function - * - * @generated from message qdrant.cloud.cluster.v1.GetQuoteRequest - */ -export declare type GetQuoteRequestValid = Message<"qdrant.cloud.cluster.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 cluster configuration to get a quote for. - * This should contain the same information as you would use for CreateCluster, - * except without readonly fields (id, created_at, deleted_at, state). - * - * @generated from field: qdrant.cloud.cluster.v1.Cluster cluster = 2; - */ - cluster: ClusterValid; -}; - -/** - * Describes the message qdrant.cloud.cluster.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.cluster.v1.GetQuoteResponse - */ -export declare type GetQuoteResponse = Message<"qdrant.cloud.cluster.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 original price per month in millicents, before any discounts. - * Calculated as original_price_per_hour * 24 * 30 (720 hours). - * - * @generated from field: int64 original_price_per_month = 3; - */ - originalPricePerMonth: 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 = 4; - */ - discountedPricePerHour: bigint; - - /** - * The discounted price per month in millicents, after applying discounts. - * Calculated as discounted_price_per_hour * 24 * 30 (720 hours). - * If no discounts are applied, this will be the same as original_price_per_month. - * - * @generated from field: int64 discounted_price_per_month = 5; - */ - discountedPricePerMonth: 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 = 6; - */ - discountPercentage: number; -}; - -export declare type GetQuoteResponseValid = GetQuoteResponse; - -/** - * Describes the message qdrant.cloud.cluster.v1.GetQuoteResponse. - * Use `create(GetQuoteResponseSchema)` to create a new message. - */ -export declare const GetQuoteResponseSchema: GenMessage; - /** * ClusterServiceType defines the type of service to use for the cluster. * See: https://kubernetes.io/docs/reference/kubernetes-api/service-resources/service-v1/#ServiceSpec @@ -2791,19 +2673,5 @@ export declare const ClusterService: GenService<{ input: typeof ListQdrantReleasesRequestSchema; output: typeof ListQdrantReleasesResponseSchema; }, - /** - * Gets a price quote for a cluster configuration. - * This endpoint calculates pricing information including hourly and monthly costs, - * and any applicable discounts for the specified cluster configuration. - * Required permissions: - * - read:clusters - * - * @generated from rpc qdrant.cloud.cluster.v1.ClusterService.GetQuote - */ - getQuote: { - methodKind: "unary"; - input: typeof GetQuoteRequestSchema; - output: typeof GetQuoteResponseSchema; - }, }>; diff --git a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js index 29ddb708..f8db7eba 100644 --- a/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js +++ b/gen/typescript/qdrant/cloud/cluster/v1/cluster_pb.js @@ -13,7 +13,7 @@ import { file_qdrant_cloud_event_v1_events } from "../../event/v1/events_pb.js"; * Describes the file qdrant/cloud/cluster/v1/cluster.proto. */ export const file_qdrant_cloud_cluster_v1_cluster = /*@__PURE__*/ - fileDesc("CiVxZHJhbnQvY2xvdWQvY2x1c3Rlci92MS9jbHVzdGVyLnByb3RvEhdxZHJhbnQuY2xvdWQuY2x1c3Rlci52MSKHBQoTTGlzdENsdXN0ZXJzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARInChFjbG91ZF9wcm92aWRlcl9pZBgKIAEoCUIHukgEcgIQA0gAiAEBEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgLIAEoCUIHukgEcgIQAUgBiAEBOsUDukjBAxqxAQonbGlzdF9jbHVzdGVycy5jbG91ZF9wcm92aWRlcl9pZF9wcmVzZW50EkJjbG91ZF9wcm92aWRlcl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyBzZXQaQiFoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpIHx8IGhhcyh0aGlzLmNsb3VkX3Byb3ZpZGVyX2lkKRqKAgogY2x1c3Rlci5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQSSGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBtdXN0IGJlIGEgVVVJRCBpZiBjbG91ZF9wcm92aWRlcl9pZCBpcyAnaHlicmlkJxqbAXRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykgfHwgdGhpcy5jbG91ZF9wcm92aWRlcl9pZCE9ICdoeWJyaWQnQhQKEl9jbG91ZF9wcm92aWRlcl9pZEIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RDbHVzdGVyc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlciJPChFHZXRDbHVzdGVyUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIcCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABASJPChJHZXRDbHVzdGVyUmVzcG9uc2USOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBASLEAgoUQ3JlYXRlQ2x1c3RlclJlcXVlc3QSOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBATrwAbpI7AEa6QEKImNyZWF0ZV9jbHVzdGVyLm5vX3JlYWRfb25seV9maWVsZHMSTnJlYWQtb25seSBmaWVsZHMgKGlkLCBjcmVhdGVkX2F0LCBkZWxldGVkX2F0LCBzdGF0ZSkgbXVzdCBub3QgYmUgc2V0IG9uIGNyZWF0ZRpzdGhpcy5jbHVzdGVyLmlkID09ICcnICYmICFoYXModGhpcy5jbHVzdGVyLmNyZWF0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLmRlbGV0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLnN0YXRlKSK7AQoVQ3JlYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChxjcmVhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkisAEKFFVwZGF0ZUNsdXN0ZXJSZXF1ZXN0EjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6XbpIWhpYChl1cGRhdGVfY2x1c3Rlci5pZF9wcmVzZW50EiRjbHVzdGVyLmlkIGlzIHJlcXVpcmVkIGZvciBhbiB1cGRhdGUaFXRoaXMuY2x1c3Rlci5pZCAhPSAnJyK7AQoVVXBkYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChx1cGRhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkiggEKFERlbGV0ZUNsdXN0ZXJSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhwKCmNsdXN0ZXJfaWQYAiABKAlCCLpIBXIDsAEBEhsKDmRlbGV0ZV9iYWNrdXBzGAMgASgISACIAQFCEQoPX2RlbGV0ZV9iYWNrdXBzIhcKFURlbGV0ZUNsdXN0ZXJSZXNwb25zZSJTChVSZXN0YXJ0Q2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWUmVzdGFydENsdXN0ZXJSZXNwb25zZSJTChVTdXNwZW5kQ2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWU3VzcGVuZENsdXN0ZXJSZXNwb25zZSI5ChlTdWdnZXN0Q2x1c3Rlck5hbWVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBIjMKGlN1Z2dlc3RDbHVzdGVyTmFtZVJlc3BvbnNlEhUKBG5hbWUYASABKAlCB7pIBHICEAEiawoZTGlzdFFkcmFudFJlbGVhc2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIhCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABAUgAiAEBQg0KC19jbHVzdGVyX2lkIlMKGkxpc3RRZHJhbnRSZWxlYXNlc1Jlc3BvbnNlEjUKBWl0ZW1zGAEgAygLMiYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUWRyYW50UmVsZWFzZSLLBgoHQ2x1c3RlchIKCgJpZBgBIAEoCRIuCgpjcmVhdGVkX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIcCgphY2NvdW50X2lkGAMgASgJQgi6SAVyA7ABARIpCgRuYW1lGAQgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQSLgoKZGVsZXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoRY2xvdWRfcHJvdmlkZXJfaWQYCiABKAlCB7pIBHICEAMSKQoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkGAsgASgJQge6SARyAhABEkwKDWNvbmZpZ3VyYXRpb24YFCABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvbkIGukgDyAEBEjQKBXN0YXRlGGQgASgLMiUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlclN0YXRlOrcDukizAxqjAQoKY2x1c3Rlci5pZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeXRoaXMuaWQubWF0Y2hlcygnXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQnKSB8fCAhaGFzKHRoaXMuY3JlYXRlZF9hdCkaigIKIGNsdXN0ZXIuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEkhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgbXVzdCBiZSBhIFVVSUQgaWYgY2xvdWRfcHJvdmlkZXJfaWQgaXMgJ2h5YnJpZCcamwF0aGlzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZC5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpIHx8IHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQhPSAnaHlicmlkJyLUCgoUQ2x1c3RlckNvbmZpZ3VyYXRpb24SNAoQbGFzdF9tb2RpZmllZF9hdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoPbnVtYmVyX29mX25vZGVzGAIgASgNQgm6SAYqBBgUKAESPAoHdmVyc2lvbhgDIAEoCUImukgjciEyH14odihcZCspXC4oXGQrKVwuKFxkKyl8bGF0ZXN0KSRIAIgBARIcCgpwYWNrYWdlX2lkGAQgASgJQgi6SAVyA7ABARJPChRhZGRpdGlvbmFsX3Jlc291cmNlcxgFIAEoCzIsLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkFkZGl0aW9uYWxSZXNvdXJjZXNIAYgBARJTChZkYXRhYmFzZV9jb25maWd1cmF0aW9uGAcgASgLMi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uSAKIAQESQQoNbm9kZV9zZWxlY3RvchgIIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEkIKC3RvbGVyYXRpb25zGAkgAygLMiMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkIIukgFkgECEAoSPwoLYW5ub3RhdGlvbnMYCiADKAsyIC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLktleVZhbHVlQgi6SAWSAQIQChIxChhhbGxvd2VkX2lwX3NvdXJjZV9yYW5nZXMYCyADKAlCD7pIDJIBCRAUIgVyA/ABARJSCgxzZXJ2aWNlX3R5cGUYDCABKA4yKy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2VydmljZVR5cGVCCrpIB4IBBBABIABIA4gBARJHChNzZXJ2aWNlX2Fubm90YXRpb25zGA0gAygLMiAucWRyYW50LmNsb3VkLmNvbW1vbi52MS5LZXlWYWx1ZUIIukgFkgECEAoSPgoKcG9kX2xhYmVscxgOIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEigKF3Jlc2VydmVkX2NwdV9wZXJjZW50YWdlGBQgASgNQge6SAQqAhhQEisKGnJlc2VydmVkX21lbW9yeV9wZXJjZW50YWdlGBUgASgNQge6SAQqAhhQElcKCGdwdV90eXBlGBYgASgOMjQucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckNvbmZpZ3VyYXRpb25HcHVUeXBlQgq6SAeCAQQQASAASASIAQESYwoOcmVzdGFydF9wb2xpY3kYFyABKA4yOi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlc3RhcnRQb2xpY3lCCrpIB4IBBBABIABIBYgBARJrChJyZWJhbGFuY2Vfc3RyYXRlZ3kYGCABKA4yPi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlYmFsYW5jZVN0cmF0ZWd5Qgq6SAeCAQQQASAASAaIAQFCCgoIX3ZlcnNpb25CFwoVX2FkZGl0aW9uYWxfcmVzb3VyY2VzQhkKF19kYXRhYmFzZV9jb25maWd1cmF0aW9uQg8KDV9zZXJ2aWNlX3R5cGVCCwoJX2dwdV90eXBlQhEKD19yZXN0YXJ0X3BvbGljeUIVChNfcmViYWxhbmNlX3N0cmF0ZWd5IsEEChVEYXRhYmFzZUNvbmZpZ3VyYXRpb24SUQoKY29sbGVjdGlvbhgBIAEoCzI4LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25IAIgBARJLCgdzdG9yYWdlGAIgASgLMjUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZUgBiAEBEksKB3NlcnZpY2UYAyABKAsyNS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlSAKIAQESWgoJbG9nX2xldmVsGAQgASgOMjYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uTG9nTGV2ZWxCCrpIB4IBBBABIABIA4gBARJDCgN0bHMYBSABKAsyMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UbHNIBIgBARJPCglpbmZlcmVuY2UYBiABKAsyNy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25JbmZlcmVuY2VIBYgBAUINCgtfY29sbGVjdGlvbkIKCghfc3RvcmFnZUIKCghfc2VydmljZUIMCgpfbG9nX2xldmVsQgYKBF90bHNCDAoKX2luZmVyZW5jZSLnAQofRGF0YWJhc2VDb25maWd1cmF0aW9uQ29sbGVjdGlvbhIoChJyZXBsaWNhdGlvbl9mYWN0b3IYASABKA1CB7pIBCoCKAFIAIgBARIpChh3cml0ZV9jb25zaXN0ZW5jeV9mYWN0b3IYAiABKAVCB7pIBBoCKAESWAoHdmVjdG9ycxgDIAEoCzI/LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25WZWN0b3JzQga6SAPIAQFCFQoTX3JlcGxpY2F0aW9uX2ZhY3RvciJKCiZEYXRhYmFzZUNvbmZpZ3VyYXRpb25Db2xsZWN0aW9uVmVjdG9ycxIUCgdvbl9kaXNrGAEgASgISACIAQFCCgoIX29uX2Rpc2sidQocRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZRJVCgtwZXJmb3JtYW5jZRgBIAEoCzJALnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvblN0b3JhZ2VQZXJmb3JtYW5jZSJdCidEYXRhYmFzZUNvbmZpZ3VyYXRpb25TdG9yYWdlUGVyZm9ybWFuY2USHAoUb3B0aW1pemVyX2NwdV9idWRnZXQYASABKAUSFAoMYXN5bmNfc2NvcmVyGAIgASgIIugBChxEYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlEjoKB2FwaV9rZXkYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkgAiAEBEkQKEXJlYWRfb25seV9hcGlfa2V5GAIgASgLMiQucWRyYW50LmNsb3VkLmNvbW1vbi52MS5TZWNyZXRLZXlSZWZIAYgBARIQCghqd3RfcmJhYxgDIAEoCBISCgplbmFibGVfdGxzGAQgASgIQgoKCF9hcGlfa2V5QhQKEl9yZWFkX29ubHlfYXBpX2tleSKRAQoYRGF0YWJhc2VDb25maWd1cmF0aW9uVGxzEjoKBGNlcnQYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkIGukgDyAEBEjkKA2tleRgCIAEoCzIkLnFkcmFudC5jbG91ZC5jb21tb24udjEuU2VjcmV0S2V5UmVmQga6SAPIAQEiMQoeRGF0YWJhc2VDb25maWd1cmF0aW9uSW5mZXJlbmNlEg8KB2VuYWJsZWQYASABKAgiIwoTQWRkaXRpb25hbFJlc291cmNlcxIMCgRkaXNrGAMgASgNItUCCgpUb2xlcmF0aW9uEkMKA2tleRgBIAEoCUI2ukgzcjEYPzItXihbYS16QS1aMC05XShbLWEtekEtWjAtOV8uXSpbYS16QS1aMC05XSk/KT8kEk4KCG9wZXJhdG9yGAIgASgOMisucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbk9wZXJhdG9yQgq6SAeCAQQQASAASACIAQESDQoFdmFsdWUYAyABKAkSSgoGZWZmZWN0GAQgASgOMikucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkVmZmVjdEIKukgHggEEEAEgAEgBiAEBEigKEnRvbGVyYXRpb25fc2Vjb25kcxgFIAEoBEIHukgEMgIoAEgCiAEBQgsKCV9vcGVyYXRvckIJCgdfZWZmZWN0QhUKE190b2xlcmF0aW9uX3NlY29uZHMi3QMKDENsdXN0ZXJTdGF0ZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEhAKCG5vZGVzX3VwGAIgASgNEjAKDHJlc3RhcnRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASPgoFcGhhc2UYBCABKA4yJS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyUGhhc2VCCLpIBYIBAhABEg4KBnJlYXNvbhgFIAEoCRJCCghlbmRwb2ludBgGIAEoCzIoLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJFbmRwb2ludEIGukgDyAEBEk8KCXJlc291cmNlcxgHIAEoCzI0LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzU3VtbWFyeUIGukgDyAEBElEKEHNjYWxhYmlsaXR5X2luZm8YCCABKAsyLy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlJbmZvQga6SAPIAQESNwoFbm9kZXMYCSADKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZUluZm8i6QEKD0NsdXN0ZXJOb2RlSW5mbxIVCgRuYW1lGAEgASgJQge6SARyAhABEi4KCnN0YXJ0ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg8KB3ZlcnNpb24YAyABKAkSOgoIZW5kcG9pbnQYBCABKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyRW5kcG9pbnQSQgoFc3RhdGUYCiABKA4yKS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVN0YXRlQgi6SAWCAQIQASJgCg9DbHVzdGVyRW5kcG9pbnQSFQoDdXJsGAEgASgJQgi6SAVyA4gBARIaCglyZXN0X3BvcnQYAiABKAVCB7pIBBoCIAASGgoJZ3JwY19wb3J0GAMgASgFQge6SAQaAiAAIuoBChtDbHVzdGVyTm9kZVJlc291cmNlc1N1bW1hcnkSQwoEZGlzaxgBIAEoCzItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzQga6SAPIAQESQgoDcmFtGAIgASgLMi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3Rlck5vZGVSZXNvdXJjZXNCBrpIA8gBARJCCgNjcHUYAyABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVJlc291cmNlc0IGukgDyAEBIsQBChRDbHVzdGVyTm9kZVJlc291cmNlcxIcCgRiYXNlGAEgASgBQg66SAsSCSkAAAAAAAAAABIlCg1jb21wbGltZW50YXJ5GAIgASgBQg66SAsSCSkAAAAAAAAAABIiCgphZGRpdGlvbmFsGAMgASgBQg66SAsSCSkAAAAAAAAAABIgCghyZXNlcnZlZBgEIAEoAUIOukgLEgkpAAAAAAAAAAASIQoJYXZhaWxhYmxlGAUgASgBQg66SAsSCSkAAAAAAAAAACKQAQoWQ2x1c3RlclNjYWxhYmlsaXR5SW5mbxJNCgZzdGF0dXMYASABKA4yMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlTdGF0dXNCCrpIB4IBBBABIAASHAoGcmVhc29uGAIgASgJQge6SARyAhABSACIAQFCCQoHX3JlYXNvbiLPAQoNUWRyYW50UmVsZWFzZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEg8KB2RlZmF1bHQYAiABKAgSKAoRcmVsZWFzZV9ub3Rlc191cmwYAyABKAlCCLpIBXIDiAEBSACIAQESHQoHcmVtYXJrcxgEIAEoCUIHukgEcgIQAUgBiAEBEhMKC2VuZF9vZl9saWZlGAUgASgIEhMKC3VuYXZhaWxhYmxlGAYgASgIQhQKEl9yZWxlYXNlX25vdGVzX3VybEIKCghfcmVtYXJrcyKOAQoeQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhsKCWJhY2t1cF9pZBgCIAEoCUIIukgFcgOwAQESMQoMY2x1c3Rlcl9uYW1lGAMgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQiXAofQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXNwb25zZRI5CgdjbHVzdGVyGAEgASgLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckIGukgDyAEBItMCCg9HZXRRdW90ZVJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESOQoHY2x1c3RlchgCIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBATrmAbpI4gEa3wEKGXF1b3RlLm5vX3JlYWRfb25seV9maWVsZHMSTXJlYWQtb25seSBmaWVsZHMgKGlkLCBjcmVhdGVkX2F0LCBkZWxldGVkX2F0LCBzdGF0ZSkgbXVzdCBub3QgYmUgc2V0IG9uIHF1b3RlGnN0aGlzLmNsdXN0ZXIuaWQgPT0gJycgJiYgIWhhcyh0aGlzLmNsdXN0ZXIuY3JlYXRlZF9hdCkgJiYgIWhhcyh0aGlzLmNsdXN0ZXIuZGVsZXRlZF9hdCkgJiYgIWhhcyh0aGlzLmNsdXN0ZXIuc3RhdGUpIpsCChBHZXRRdW90ZVJlc3BvbnNlEiMKCGN1cnJlbmN5GAEgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChdvcmlnaW5hbF9wcmljZV9wZXJfaG91chgCIAEoA0IHukgEIgIoABIpChhvcmlnaW5hbF9wcmljZV9wZXJfbW9udGgYAyABKANCB7pIBCICKAASKgoZZGlzY291bnRlZF9wcmljZV9wZXJfaG91chgEIAEoA0IHukgEIgIoABIrChpkaXNjb3VudGVkX3ByaWNlX3Blcl9tb250aBgFIAEoA0IHukgEIgIoABI0ChNkaXNjb3VudF9wZXJjZW50YWdlGAYgASgBQhe6SBQSEhkAAAAAAABZQCkAAAAAAAAAACqrAQoSQ2x1c3RlclNlcnZpY2VUeXBlEiQKIENMVVNURVJfU0VSVklDRV9UWVBFX1VOU1BFQ0lGSUVEEAASIwofQ0xVU1RFUl9TRVJWSUNFX1RZUEVfQ0xVU1RFUl9JUBABEiIKHkNMVVNURVJfU0VSVklDRV9UWVBFX05PREVfUE9SVBACEiYKIkNMVVNURVJfU0VSVklDRV9UWVBFX0xPQURfQkFMQU5DRVIQAyqgAQobQ2x1c3RlckNvbmZpZ3VyYXRpb25HcHVUeXBlEi4KKkNMVVNURVJfQ09ORklHVVJBVElPTl9HUFVfVFlQRV9VTlNQRUNJRklFRBAAEikKJUNMVVNURVJfQ09ORklHVVJBVElPTl9HUFVfVFlQRV9OVklESUEQARImCiJDTFVTVEVSX0NPTkZJR1VSQVRJT05fR1BVX1RZUEVfQU1EEAIq8gEKIUNsdXN0ZXJDb25maWd1cmF0aW9uUmVzdGFydFBvbGljeRI0CjBDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVTVEFSVF9QT0xJQ1lfVU5TUEVDSUZJRUQQABIwCixDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVTVEFSVF9QT0xJQ1lfUk9MTElORxABEjEKLUNMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9QQVJBTExFTBACEjIKLkNMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9BVVRPTUFUSUMQAyqOAgolQ2x1c3RlckNvbmZpZ3VyYXRpb25SZWJhbGFuY2VTdHJhdGVneRI4CjRDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVCQUxBTkNFX1NUUkFURUdZX1VOU1BFQ0lGSUVEEAASNQoxQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFQkFMQU5DRV9TVFJBVEVHWV9CWV9DT1VOVBABEjQKMENMVVNURVJfQ09ORklHVVJBVElPTl9SRUJBTEFOQ0VfU1RSQVRFR1lfQllfU0laRRACEj4KOkNMVVNURVJfQ09ORklHVVJBVElPTl9SRUJBTEFOQ0VfU1RSQVRFR1lfQllfQ09VTlRfQU5EX1NJWkUQAyrVAgodRGF0YWJhc2VDb25maWd1cmF0aW9uTG9nTGV2ZWwSMAosREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfVU5TUEVDSUZJRUQQABIqCiZEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9UUkFDRRABEioKJkRBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX0RFQlVHEAISKQolREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfSU5GTxADEikKJURBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX1dBUk4QBBIqCiZEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9FUlJPUhAFEigKJERBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX09GRhAGKngKElRvbGVyYXRpb25PcGVyYXRvchIjCh9UT0xFUkFUSU9OX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASHgoaVE9MRVJBVElPTl9PUEVSQVRPUl9FWElTVFMQARIdChlUT0xFUkFUSU9OX09QRVJBVE9SX0VRVUFMEAIqpAEKEFRvbGVyYXRpb25FZmZlY3QSIQodVE9MRVJBVElPTl9FRkZFQ1RfVU5TUEVDSUZJRUQQABIhCh1UT0xFUkFUSU9OX0VGRkVDVF9OT19TQ0hFRFVMRRABEigKJFRPTEVSQVRJT05fRUZGRUNUX1BSRUZFUl9OT19TQ0hFRFVMRRACEiAKHFRPTEVSQVRJT05fRUZGRUNUX05PX0VYRUNVVEUQAyrfBAoMQ2x1c3RlclBoYXNlEh0KGUNMVVNURVJfUEhBU0VfVU5TUEVDSUZJRUQQABIaChZDTFVTVEVSX1BIQVNFX0NSRUFUSU5HEAESIgoeQ0xVU1RFUl9QSEFTRV9GQUlMRURfVE9fQ1JFQVRFEAISGgoWQ0xVU1RFUl9QSEFTRV9VUERBVElORxADEiIKHkNMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1VQREFURRAEEhkKFUNMVVNURVJfUEhBU0VfU0NBTElORxAFEhsKF0NMVVNURVJfUEhBU0VfVVBHUkFESU5HEAYSHAoYQ0xVU1RFUl9QSEFTRV9TVVNQRU5ESU5HEAcSGwoXQ0xVU1RFUl9QSEFTRV9TVVNQRU5ERUQQCBIjCh9DTFVTVEVSX1BIQVNFX0ZBSUxFRF9UT19TVVNQRU5EEAkSGgoWQ0xVU1RFUl9QSEFTRV9SRVNVTUlORxAKEiIKHkNMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1JFU1VNRRALEhkKFUNMVVNURVJfUEhBU0VfSEVBTFRIWRAMEhsKF0NMVVNURVJfUEhBU0VfTk9UX1JFQURZEA0SHwobQ0xVU1RFUl9QSEFTRV9SRUNPVkVSWV9NT0RFEA4SJAogQ0xVU1RFUl9QSEFTRV9NQU5VQUxfTUFJTlRFTkFOQ0UQDxIgChxDTFVTVEVSX1BIQVNFX0ZBSUxFRF9UT19TWU5DEBASGwoXQ0xVU1RFUl9QSEFTRV9OT1RfRk9VTkQQERIaChZDTFVTVEVSX1BIQVNFX0RFTEVUSU5HEBIquwEKEENsdXN0ZXJOb2RlU3RhdGUSIgoeQ0xVU1RFUl9OT0RFX1NUQVRFX1VOU1BFQ0lGSUVEEAASHwobQ0xVU1RFUl9OT0RFX1NUQVRFX1NUQVJUSU5HEAESHgoaQ0xVU1RFUl9OT0RFX1NUQVRFX0hFQUxUSFkQAhIgChxDTFVTVEVSX05PREVfU1RBVEVfVU5IRUFMVEhZEAMSIAocQ0xVU1RFUl9OT0RFX1NUQVRFX1NVU1BFTkRFRBAEKpwBChhDbHVzdGVyU2NhbGFiaWxpdHlTdGF0dXMSKgomQ0xVU1RFUl9TQ0FMQUJJTElUWV9TVEFUVVNfVU5TUEVDSUZJRUQQABIrCidDTFVTVEVSX1NDQUxBQklMSVRZX1NUQVRVU19OT1RfU0NBTEFCTEUQARInCiNDTFVTVEVSX1NDQUxBQklMSVRZX1NUQVRVU19TQ0FMQUJMRRACMscYCg5DbHVzdGVyU2VydmljZRK0AQoMTGlzdENsdXN0ZXJzEiwucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdENsdXN0ZXJzUmVxdWVzdBotLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkxpc3RDbHVzdGVyc1Jlc3BvbnNlIkeKtRgNcmVhZDpjbHVzdGVyc4LT5JMCMBIuL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycxLXAQoKR2V0Q2x1c3RlchIqLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkdldENsdXN0ZXJSZXF1ZXN0GisucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0Q2x1c3RlclJlc3BvbnNlInCKtRgNcmVhZDpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWSC0+STAj0SOy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vY2x1c3RlcnMve2NsdXN0ZXJfaWR9EtkCCg1DcmVhdGVDbHVzdGVyEi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ3JlYXRlQ2x1c3RlclJlcXVlc3QaLi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DcmVhdGVDbHVzdGVyUmVzcG9uc2Ui6AGKtRgOd3JpdGU6Y2x1c3RlcnOStRgSY2x1c3Rlci5hY2NvdW50X2lkurUYHAoMY2x1c3Rlcl9uYW1lEgxjbHVzdGVyLm5hbWXK8xhbCAESB2NsdXN0ZXIiD3Jlc3AuY2x1c3Rlci5pZCo9L2FjY291bnRzL3tyZXEuY2x1c3Rlci5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVzcC5jbHVzdGVyLmlkfYLT5JMCOzoBKiI2L2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3tjbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzErQDChdDcmVhdGVDbHVzdGVyRnJvbUJhY2t1cBI3LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNyZWF0ZUNsdXN0ZXJGcm9tQmFja3VwUmVxdWVzdBo4LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNyZWF0ZUNsdXN0ZXJGcm9tQmFja3VwUmVzcG9uc2UipQKKtRgPcmVzdG9yZTpiYWNrdXBzirUYDndyaXRlOmNsdXN0ZXJzqLUYAbq1GBYKCWJhY2t1cF9pZBIJYmFja3VwX2lkurUYHAoMY2x1c3Rlcl9uYW1lEgxjbHVzdGVyX25hbWXK8xh0CAESB2NsdXN0ZXIiD3Jlc3AuY2x1c3Rlci5pZCo1L2FjY291bnRzL3tyZXEuYWNjb3VudF9pZH0vY2x1c3RlcnMve3Jlc3AuY2x1c3Rlci5pZH1SHwoOZnJvbV9iYWNrdXBfaWQSDXJlcS5iYWNrdXBfaWSC0+STAkQiQi9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vYmFja3Vwcy97YmFja3VwX2lkfS9jbHVzdGVycxLgAgoNVXBkYXRlQ2x1c3RlchItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlVwZGF0ZUNsdXN0ZXJSZXF1ZXN0Gi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVXBkYXRlQ2x1c3RlclJlc3BvbnNlIu8BirUYDndyaXRlOmNsdXN0ZXJzkrUYEmNsdXN0ZXIuYWNjb3VudF9pZLq1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXIuaWTK8xhZCAISB2NsdXN0ZXIiDnJlcS5jbHVzdGVyLmlkKjwvYWNjb3VudHMve3JlcS5jbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tyZXEuY2x1c3Rlci5pZH2C0+STAkg6ASoaQy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97Y2x1c3Rlci5hY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlci5pZH0SuAIKDURlbGV0ZUNsdXN0ZXISLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EZWxldGVDbHVzdGVyUmVxdWVzdBouLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRlbGV0ZUNsdXN0ZXJSZXNwb25zZSLHAYq1GA9kZWxldGU6Y2x1c3RlcnO6tRgYCgpjbHVzdGVyX2lkEgpjbHVzdGVyX2lkyvMYUQgDEgdjbHVzdGVyIg5yZXEuY2x1c3Rlcl9pZCo0L2FjY291bnRzL3tyZXEuYWNjb3VudF9pZH0vY2x1c3RlcnMve3JlcS5jbHVzdGVyX2lkfYLT5JMCPSo7L2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlcl9pZH0SywIKDlJlc3RhcnRDbHVzdGVyEi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUmVzdGFydENsdXN0ZXJSZXF1ZXN0Gi8ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUmVzdGFydENsdXN0ZXJSZXNwb25zZSLXAYq1GA53cml0ZTpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWTK8xhaCAQSB2NsdXN0ZXIiDnJlcS5jbHVzdGVyX2lkKjQvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVxLmNsdXN0ZXJfaWR9MgdyZXN0YXJ0gtPkkwJFIkMvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyX2lkfS9yZXN0YXJ0EssCCg5TdXNwZW5kQ2x1c3RlchIuLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlN1c3BlbmRDbHVzdGVyUmVxdWVzdBovLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlN1c3BlbmRDbHVzdGVyUmVzcG9uc2Ui1wGKtRgOd3JpdGU6Y2x1c3RlcnO6tRgYCgpjbHVzdGVyX2lkEgpjbHVzdGVyX2lkyvMYWggEEgdjbHVzdGVyIg5yZXEuY2x1c3Rlcl9pZCo0L2FjY291bnRzL3tyZXEuYWNjb3VudF9pZH0vY2x1c3RlcnMve3JlcS5jbHVzdGVyX2lkfTIHc3VzcGVuZILT5JMCRSJDL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlcl9pZH0vc3VzcGVuZBLGAQoSU3VnZ2VzdENsdXN0ZXJOYW1lEjIucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VnZ2VzdENsdXN0ZXJOYW1lUmVxdWVzdBozLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLlN1Z2dlc3RDbHVzdGVyTmFtZVJlc3BvbnNlIkeKtRgAgtPkkwI9EjsvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3N1Z2dlc3QtbmFtZRLiAQoSTGlzdFFkcmFudFJlbGVhc2VzEjIucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdFFkcmFudFJlbGVhc2VzUmVxdWVzdBozLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkxpc3RRZHJhbnRSZWxlYXNlc1Jlc3BvbnNlImOKtRgNcmVhZDpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWSC0+STAjASLi9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vcmVsZWFzZXMSqAEKCEdldFF1b3RlEigucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0UXVvdGVSZXF1ZXN0GikucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0UXVvdGVSZXNwb25zZSJHirUYDXJlYWQ6Y2x1c3RlcnOC0+STAjA6ASoiKy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vcXVvdGVC/gEKG2NvbS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MUIMQ2x1c3RlclByb3RvUAFaUmdpdGh1Yi5jb20vcWRyYW50L3FkcmFudC1jbG91ZC1wdWJsaWMtYXBpL2dlbi9nby9xZHJhbnQvY2xvdWQvY2x1c3Rlci92MTtjbHVzdGVydjGiAgNRQ0OqAhdRZHJhbnQuQ2xvdWQuQ2x1c3Rlci5WMcoCF1FkcmFudFxDbG91ZFxDbHVzdGVyXFYx4gIjUWRyYW50XENsb3VkXENsdXN0ZXJcVjFcR1BCTWV0YWRhdGHqAhpRZHJhbnQ6OkNsb3VkOjpDbHVzdGVyOjpWMWIGcHJvdG8z", [file_buf_validate_validate, file_google_api_annotations, file_google_protobuf_timestamp, file_qdrant_cloud_common_v1_common, file_qdrant_cloud_event_v1_events]); + fileDesc("CiVxZHJhbnQvY2xvdWQvY2x1c3Rlci92MS9jbHVzdGVyLnByb3RvEhdxZHJhbnQuY2xvdWQuY2x1c3Rlci52MSKHBQoTTGlzdENsdXN0ZXJzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARInChFjbG91ZF9wcm92aWRlcl9pZBgKIAEoCUIHukgEcgIQA0gAiAEBEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgLIAEoCUIHukgEcgIQAUgBiAEBOsUDukjBAxqxAQonbGlzdF9jbHVzdGVycy5jbG91ZF9wcm92aWRlcl9pZF9wcmVzZW50EkJjbG91ZF9wcm92aWRlcl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyBzZXQaQiFoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpIHx8IGhhcyh0aGlzLmNsb3VkX3Byb3ZpZGVyX2lkKRqKAgogY2x1c3Rlci5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQSSGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBtdXN0IGJlIGEgVVVJRCBpZiBjbG91ZF9wcm92aWRlcl9pZCBpcyAnaHlicmlkJxqbAXRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykgfHwgdGhpcy5jbG91ZF9wcm92aWRlcl9pZCE9ICdoeWJyaWQnQhQKEl9jbG91ZF9wcm92aWRlcl9pZEIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RDbHVzdGVyc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlciJPChFHZXRDbHVzdGVyUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIcCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABASJPChJHZXRDbHVzdGVyUmVzcG9uc2USOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBASLEAgoUQ3JlYXRlQ2x1c3RlclJlcXVlc3QSOQoHY2x1c3RlchgBIAEoCzIgLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJCBrpIA8gBATrwAbpI7AEa6QEKImNyZWF0ZV9jbHVzdGVyLm5vX3JlYWRfb25seV9maWVsZHMSTnJlYWQtb25seSBmaWVsZHMgKGlkLCBjcmVhdGVkX2F0LCBkZWxldGVkX2F0LCBzdGF0ZSkgbXVzdCBub3QgYmUgc2V0IG9uIGNyZWF0ZRpzdGhpcy5jbHVzdGVyLmlkID09ICcnICYmICFoYXModGhpcy5jbHVzdGVyLmNyZWF0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLmRlbGV0ZWRfYXQpICYmICFoYXModGhpcy5jbHVzdGVyLnN0YXRlKSK7AQoVQ3JlYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChxjcmVhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkisAEKFFVwZGF0ZUNsdXN0ZXJSZXF1ZXN0EjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6XbpIWhpYChl1cGRhdGVfY2x1c3Rlci5pZF9wcmVzZW50EiRjbHVzdGVyLmlkIGlzIHJlcXVpcmVkIGZvciBhbiB1cGRhdGUaFXRoaXMuY2x1c3Rlci5pZCAhPSAnJyK7AQoVVXBkYXRlQ2x1c3RlclJlc3BvbnNlEjkKB2NsdXN0ZXIYASABKAsyIC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQga6SAPIAQE6Z7pIZBpiChx1cGRhdGVfY2x1c3Rlci5zdGF0ZV9wcmVzZW50EilzdGF0ZSBpcyByZXF1aXJlZCBmb3IgYW4gZXhpc3RpbmcgY2x1c3RlchoXaGFzKHRoaXMuY2x1c3Rlci5zdGF0ZSkiggEKFERlbGV0ZUNsdXN0ZXJSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhwKCmNsdXN0ZXJfaWQYAiABKAlCCLpIBXIDsAEBEhsKDmRlbGV0ZV9iYWNrdXBzGAMgASgISACIAQFCEQoPX2RlbGV0ZV9iYWNrdXBzIhcKFURlbGV0ZUNsdXN0ZXJSZXNwb25zZSJTChVSZXN0YXJ0Q2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWUmVzdGFydENsdXN0ZXJSZXNwb25zZSJTChVTdXNwZW5kQ2x1c3RlclJlcXVlc3QSHAoKYWNjb3VudF9pZBgBIAEoCUIIukgFcgOwAQESHAoKY2x1c3Rlcl9pZBgCIAEoCUIIukgFcgOwAQEiGAoWU3VzcGVuZENsdXN0ZXJSZXNwb25zZSI5ChlTdWdnZXN0Q2x1c3Rlck5hbWVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBIjMKGlN1Z2dlc3RDbHVzdGVyTmFtZVJlc3BvbnNlEhUKBG5hbWUYASABKAlCB7pIBHICEAEiawoZTGlzdFFkcmFudFJlbGVhc2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIhCgpjbHVzdGVyX2lkGAIgASgJQgi6SAVyA7ABAUgAiAEBQg0KC19jbHVzdGVyX2lkIlMKGkxpc3RRZHJhbnRSZWxlYXNlc1Jlc3BvbnNlEjUKBWl0ZW1zGAEgAygLMiYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuUWRyYW50UmVsZWFzZSLLBgoHQ2x1c3RlchIKCgJpZBgBIAEoCRIuCgpjcmVhdGVkX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIcCgphY2NvdW50X2lkGAMgASgJQgi6SAVyA7ABARIpCgRuYW1lGAQgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQSLgoKZGVsZXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoRY2xvdWRfcHJvdmlkZXJfaWQYCiABKAlCB7pIBHICEAMSKQoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkGAsgASgJQge6SARyAhABEkwKDWNvbmZpZ3VyYXRpb24YFCABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvbkIGukgDyAEBEjQKBXN0YXRlGGQgASgLMiUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlclN0YXRlOrcDukizAxqjAQoKY2x1c3Rlci5pZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeXRoaXMuaWQubWF0Y2hlcygnXlswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSQnKSB8fCAhaGFzKHRoaXMuY3JlYXRlZF9hdCkaigIKIGNsdXN0ZXIuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEkhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgbXVzdCBiZSBhIFVVSUQgaWYgY2xvdWRfcHJvdmlkZXJfaWQgaXMgJ2h5YnJpZCcamwF0aGlzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZC5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpIHx8IHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQhPSAnaHlicmlkJyLUCgoUQ2x1c3RlckNvbmZpZ3VyYXRpb24SNAoQbGFzdF9tb2RpZmllZF9hdBgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASIgoPbnVtYmVyX29mX25vZGVzGAIgASgNQgm6SAYqBBgUKAESPAoHdmVyc2lvbhgDIAEoCUImukgjciEyH14odihcZCspXC4oXGQrKVwuKFxkKyl8bGF0ZXN0KSRIAIgBARIcCgpwYWNrYWdlX2lkGAQgASgJQgi6SAVyA7ABARJPChRhZGRpdGlvbmFsX3Jlc291cmNlcxgFIAEoCzIsLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkFkZGl0aW9uYWxSZXNvdXJjZXNIAYgBARJTChZkYXRhYmFzZV9jb25maWd1cmF0aW9uGAcgASgLMi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uSAKIAQESQQoNbm9kZV9zZWxlY3RvchgIIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEkIKC3RvbGVyYXRpb25zGAkgAygLMiMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkIIukgFkgECEAoSPwoLYW5ub3RhdGlvbnMYCiADKAsyIC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLktleVZhbHVlQgi6SAWSAQIQChIxChhhbGxvd2VkX2lwX3NvdXJjZV9yYW5nZXMYCyADKAlCD7pIDJIBCRAUIgVyA/ABARJSCgxzZXJ2aWNlX3R5cGUYDCABKA4yKy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2VydmljZVR5cGVCCrpIB4IBBBABIABIA4gBARJHChNzZXJ2aWNlX2Fubm90YXRpb25zGA0gAygLMiAucWRyYW50LmNsb3VkLmNvbW1vbi52MS5LZXlWYWx1ZUIIukgFkgECEAoSPgoKcG9kX2xhYmVscxgOIAMoCzIgLnFkcmFudC5jbG91ZC5jb21tb24udjEuS2V5VmFsdWVCCLpIBZIBAhAKEigKF3Jlc2VydmVkX2NwdV9wZXJjZW50YWdlGBQgASgNQge6SAQqAhhQEisKGnJlc2VydmVkX21lbW9yeV9wZXJjZW50YWdlGBUgASgNQge6SAQqAhhQElcKCGdwdV90eXBlGBYgASgOMjQucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckNvbmZpZ3VyYXRpb25HcHVUeXBlQgq6SAeCAQQQASAASASIAQESYwoOcmVzdGFydF9wb2xpY3kYFyABKA4yOi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlc3RhcnRQb2xpY3lCCrpIB4IBBBABIABIBYgBARJrChJyZWJhbGFuY2Vfc3RyYXRlZ3kYGCABKA4yPi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyQ29uZmlndXJhdGlvblJlYmFsYW5jZVN0cmF0ZWd5Qgq6SAeCAQQQASAASAaIAQFCCgoIX3ZlcnNpb25CFwoVX2FkZGl0aW9uYWxfcmVzb3VyY2VzQhkKF19kYXRhYmFzZV9jb25maWd1cmF0aW9uQg8KDV9zZXJ2aWNlX3R5cGVCCwoJX2dwdV90eXBlQhEKD19yZXN0YXJ0X3BvbGljeUIVChNfcmViYWxhbmNlX3N0cmF0ZWd5IsEEChVEYXRhYmFzZUNvbmZpZ3VyYXRpb24SUQoKY29sbGVjdGlvbhgBIAEoCzI4LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25IAIgBARJLCgdzdG9yYWdlGAIgASgLMjUucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZUgBiAEBEksKB3NlcnZpY2UYAyABKAsyNS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlSAKIAQESWgoJbG9nX2xldmVsGAQgASgOMjYucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGF0YWJhc2VDb25maWd1cmF0aW9uTG9nTGV2ZWxCCrpIB4IBBBABIABIA4gBARJDCgN0bHMYBSABKAsyMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UbHNIBIgBARJPCglpbmZlcmVuY2UYBiABKAsyNy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25JbmZlcmVuY2VIBYgBAUINCgtfY29sbGVjdGlvbkIKCghfc3RvcmFnZUIKCghfc2VydmljZUIMCgpfbG9nX2xldmVsQgYKBF90bHNCDAoKX2luZmVyZW5jZSLnAQofRGF0YWJhc2VDb25maWd1cmF0aW9uQ29sbGVjdGlvbhIoChJyZXBsaWNhdGlvbl9mYWN0b3IYASABKA1CB7pIBCoCKAFIAIgBARIpChh3cml0ZV9jb25zaXN0ZW5jeV9mYWN0b3IYAiABKAVCB7pIBBoCKAESWAoHdmVjdG9ycxgDIAEoCzI/LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvbkNvbGxlY3Rpb25WZWN0b3JzQga6SAPIAQFCFQoTX3JlcGxpY2F0aW9uX2ZhY3RvciJKCiZEYXRhYmFzZUNvbmZpZ3VyYXRpb25Db2xsZWN0aW9uVmVjdG9ycxIUCgdvbl9kaXNrGAEgASgISACIAQFCCgoIX29uX2Rpc2sidQocRGF0YWJhc2VDb25maWd1cmF0aW9uU3RvcmFnZRJVCgtwZXJmb3JtYW5jZRgBIAEoCzJALnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRhdGFiYXNlQ29uZmlndXJhdGlvblN0b3JhZ2VQZXJmb3JtYW5jZSJdCidEYXRhYmFzZUNvbmZpZ3VyYXRpb25TdG9yYWdlUGVyZm9ybWFuY2USHAoUb3B0aW1pemVyX2NwdV9idWRnZXQYASABKAUSFAoMYXN5bmNfc2NvcmVyGAIgASgIIugBChxEYXRhYmFzZUNvbmZpZ3VyYXRpb25TZXJ2aWNlEjoKB2FwaV9rZXkYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkgAiAEBEkQKEXJlYWRfb25seV9hcGlfa2V5GAIgASgLMiQucWRyYW50LmNsb3VkLmNvbW1vbi52MS5TZWNyZXRLZXlSZWZIAYgBARIQCghqd3RfcmJhYxgDIAEoCBISCgplbmFibGVfdGxzGAQgASgIQgoKCF9hcGlfa2V5QhQKEl9yZWFkX29ubHlfYXBpX2tleSKRAQoYRGF0YWJhc2VDb25maWd1cmF0aW9uVGxzEjoKBGNlcnQYASABKAsyJC5xZHJhbnQuY2xvdWQuY29tbW9uLnYxLlNlY3JldEtleVJlZkIGukgDyAEBEjkKA2tleRgCIAEoCzIkLnFkcmFudC5jbG91ZC5jb21tb24udjEuU2VjcmV0S2V5UmVmQga6SAPIAQEiMQoeRGF0YWJhc2VDb25maWd1cmF0aW9uSW5mZXJlbmNlEg8KB2VuYWJsZWQYASABKAgiIwoTQWRkaXRpb25hbFJlc291cmNlcxIMCgRkaXNrGAMgASgNItUCCgpUb2xlcmF0aW9uEkMKA2tleRgBIAEoCUI2ukgzcjEYPzItXihbYS16QS1aMC05XShbLWEtekEtWjAtOV8uXSpbYS16QS1aMC05XSk/KT8kEk4KCG9wZXJhdG9yGAIgASgOMisucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbk9wZXJhdG9yQgq6SAeCAQQQASAASACIAQESDQoFdmFsdWUYAyABKAkSSgoGZWZmZWN0GAQgASgOMikucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVG9sZXJhdGlvbkVmZmVjdEIKukgHggEEEAEgAEgBiAEBEigKEnRvbGVyYXRpb25fc2Vjb25kcxgFIAEoBEIHukgEMgIoAEgCiAEBQgsKCV9vcGVyYXRvckIJCgdfZWZmZWN0QhUKE190b2xlcmF0aW9uX3NlY29uZHMi3QMKDENsdXN0ZXJTdGF0ZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEhAKCG5vZGVzX3VwGAIgASgNEjAKDHJlc3RhcnRlZF9hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASPgoFcGhhc2UYBCABKA4yJS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyUGhhc2VCCLpIBYIBAhABEg4KBnJlYXNvbhgFIAEoCRJCCghlbmRwb2ludBgGIAEoCzIoLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJFbmRwb2ludEIGukgDyAEBEk8KCXJlc291cmNlcxgHIAEoCzI0LnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzU3VtbWFyeUIGukgDyAEBElEKEHNjYWxhYmlsaXR5X2luZm8YCCABKAsyLy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlJbmZvQga6SAPIAQESNwoFbm9kZXMYCSADKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZUluZm8i6QEKD0NsdXN0ZXJOb2RlSW5mbxIVCgRuYW1lGAEgASgJQge6SARyAhABEi4KCnN0YXJ0ZWRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg8KB3ZlcnNpb24YAyABKAkSOgoIZW5kcG9pbnQYBCABKAsyKC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyRW5kcG9pbnQSQgoFc3RhdGUYCiABKA4yKS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVN0YXRlQgi6SAWCAQIQASJgCg9DbHVzdGVyRW5kcG9pbnQSFQoDdXJsGAEgASgJQgi6SAVyA4gBARIaCglyZXN0X3BvcnQYAiABKAVCB7pIBBoCIAASGgoJZ3JwY19wb3J0GAMgASgFQge6SAQaAiAAIuoBChtDbHVzdGVyTm9kZVJlc291cmNlc1N1bW1hcnkSQwoEZGlzaxgBIAEoCzItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNsdXN0ZXJOb2RlUmVzb3VyY2VzQga6SAPIAQESQgoDcmFtGAIgASgLMi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3Rlck5vZGVSZXNvdXJjZXNCBrpIA8gBARJCCgNjcHUYAyABKAsyLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyTm9kZVJlc291cmNlc0IGukgDyAEBIsQBChRDbHVzdGVyTm9kZVJlc291cmNlcxIcCgRiYXNlGAEgASgBQg66SAsSCSkAAAAAAAAAABIlCg1jb21wbGltZW50YXJ5GAIgASgBQg66SAsSCSkAAAAAAAAAABIiCgphZGRpdGlvbmFsGAMgASgBQg66SAsSCSkAAAAAAAAAABIgCghyZXNlcnZlZBgEIAEoAUIOukgLEgkpAAAAAAAAAAASIQoJYXZhaWxhYmxlGAUgASgBQg66SAsSCSkAAAAAAAAAACKQAQoWQ2x1c3RlclNjYWxhYmlsaXR5SW5mbxJNCgZzdGF0dXMYASABKA4yMS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DbHVzdGVyU2NhbGFiaWxpdHlTdGF0dXNCCrpIB4IBBBABIAASHAoGcmVhc29uGAIgASgJQge6SARyAhABSACIAQFCCQoHX3JlYXNvbiLPAQoNUWRyYW50UmVsZWFzZRIYCgd2ZXJzaW9uGAEgASgJQge6SARyAhABEg8KB2RlZmF1bHQYAiABKAgSKAoRcmVsZWFzZV9ub3Rlc191cmwYAyABKAlCCLpIBXIDiAEBSACIAQESHQoHcmVtYXJrcxgEIAEoCUIHukgEcgIQAUgBiAEBEhMKC2VuZF9vZl9saWZlGAUgASgIEhMKC3VuYXZhaWxhYmxlGAYgASgIQhQKEl9yZWxlYXNlX25vdGVzX3VybEIKCghfcmVtYXJrcyKOAQoeQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEhsKCWJhY2t1cF9pZBgCIAEoCUIIukgFcgOwAQESMQoMY2x1c3Rlcl9uYW1lGAMgASgJQhu6SBhyFhAEGEAyEF5bYS16QS1aMC05LV9dKyQiXAofQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXNwb25zZRI5CgdjbHVzdGVyGAEgASgLMiAucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ2x1c3RlckIGukgDyAEBKqsBChJDbHVzdGVyU2VydmljZVR5cGUSJAogQ0xVU1RFUl9TRVJWSUNFX1RZUEVfVU5TUEVDSUZJRUQQABIjCh9DTFVTVEVSX1NFUlZJQ0VfVFlQRV9DTFVTVEVSX0lQEAESIgoeQ0xVU1RFUl9TRVJWSUNFX1RZUEVfTk9ERV9QT1JUEAISJgoiQ0xVU1RFUl9TRVJWSUNFX1RZUEVfTE9BRF9CQUxBTkNFUhADKqABChtDbHVzdGVyQ29uZmlndXJhdGlvbkdwdVR5cGUSLgoqQ0xVU1RFUl9DT05GSUdVUkFUSU9OX0dQVV9UWVBFX1VOU1BFQ0lGSUVEEAASKQolQ0xVU1RFUl9DT05GSUdVUkFUSU9OX0dQVV9UWVBFX05WSURJQRABEiYKIkNMVVNURVJfQ09ORklHVVJBVElPTl9HUFVfVFlQRV9BTUQQAiryAQohQ2x1c3RlckNvbmZpZ3VyYXRpb25SZXN0YXJ0UG9saWN5EjQKMENMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9VTlNQRUNJRklFRBAAEjAKLENMVVNURVJfQ09ORklHVVJBVElPTl9SRVNUQVJUX1BPTElDWV9ST0xMSU5HEAESMQotQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFU1RBUlRfUE9MSUNZX1BBUkFMTEVMEAISMgouQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFU1RBUlRfUE9MSUNZX0FVVE9NQVRJQxADKo4CCiVDbHVzdGVyQ29uZmlndXJhdGlvblJlYmFsYW5jZVN0cmF0ZWd5EjgKNENMVVNURVJfQ09ORklHVVJBVElPTl9SRUJBTEFOQ0VfU1RSQVRFR1lfVU5TUEVDSUZJRUQQABI1CjFDTFVTVEVSX0NPTkZJR1VSQVRJT05fUkVCQUxBTkNFX1NUUkFURUdZX0JZX0NPVU5UEAESNAowQ0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFQkFMQU5DRV9TVFJBVEVHWV9CWV9TSVpFEAISPgo6Q0xVU1RFUl9DT05GSUdVUkFUSU9OX1JFQkFMQU5DRV9TVFJBVEVHWV9CWV9DT1VOVF9BTkRfU0laRRADKtUCCh1EYXRhYmFzZUNvbmZpZ3VyYXRpb25Mb2dMZXZlbBIwCixEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9VTlNQRUNJRklFRBAAEioKJkRBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX1RSQUNFEAESKgomREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfREVCVUcQAhIpCiVEQVRBQkFTRV9DT05GSUdVUkFUSU9OX0xPR19MRVZFTF9JTkZPEAMSKQolREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfV0FSThAEEioKJkRBVEFCQVNFX0NPTkZJR1VSQVRJT05fTE9HX0xFVkVMX0VSUk9SEAUSKAokREFUQUJBU0VfQ09ORklHVVJBVElPTl9MT0dfTEVWRUxfT0ZGEAYqeAoSVG9sZXJhdGlvbk9wZXJhdG9yEiMKH1RPTEVSQVRJT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIeChpUT0xFUkFUSU9OX09QRVJBVE9SX0VYSVNUUxABEh0KGVRPTEVSQVRJT05fT1BFUkFUT1JfRVFVQUwQAiqkAQoQVG9sZXJhdGlvbkVmZmVjdBIhCh1UT0xFUkFUSU9OX0VGRkVDVF9VTlNQRUNJRklFRBAAEiEKHVRPTEVSQVRJT05fRUZGRUNUX05PX1NDSEVEVUxFEAESKAokVE9MRVJBVElPTl9FRkZFQ1RfUFJFRkVSX05PX1NDSEVEVUxFEAISIAocVE9MRVJBVElPTl9FRkZFQ1RfTk9fRVhFQ1VURRADKt8ECgxDbHVzdGVyUGhhc2USHQoZQ0xVU1RFUl9QSEFTRV9VTlNQRUNJRklFRBAAEhoKFkNMVVNURVJfUEhBU0VfQ1JFQVRJTkcQARIiCh5DTFVTVEVSX1BIQVNFX0ZBSUxFRF9UT19DUkVBVEUQAhIaChZDTFVTVEVSX1BIQVNFX1VQREFUSU5HEAMSIgoeQ0xVU1RFUl9QSEFTRV9GQUlMRURfVE9fVVBEQVRFEAQSGQoVQ0xVU1RFUl9QSEFTRV9TQ0FMSU5HEAUSGwoXQ0xVU1RFUl9QSEFTRV9VUEdSQURJTkcQBhIcChhDTFVTVEVSX1BIQVNFX1NVU1BFTkRJTkcQBxIbChdDTFVTVEVSX1BIQVNFX1NVU1BFTkRFRBAIEiMKH0NMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1NVU1BFTkQQCRIaChZDTFVTVEVSX1BIQVNFX1JFU1VNSU5HEAoSIgoeQ0xVU1RFUl9QSEFTRV9GQUlMRURfVE9fUkVTVU1FEAsSGQoVQ0xVU1RFUl9QSEFTRV9IRUFMVEhZEAwSGwoXQ0xVU1RFUl9QSEFTRV9OT1RfUkVBRFkQDRIfChtDTFVTVEVSX1BIQVNFX1JFQ09WRVJZX01PREUQDhIkCiBDTFVTVEVSX1BIQVNFX01BTlVBTF9NQUlOVEVOQU5DRRAPEiAKHENMVVNURVJfUEhBU0VfRkFJTEVEX1RPX1NZTkMQEBIbChdDTFVTVEVSX1BIQVNFX05PVF9GT1VORBAREhoKFkNMVVNURVJfUEhBU0VfREVMRVRJTkcQEiq7AQoQQ2x1c3Rlck5vZGVTdGF0ZRIiCh5DTFVTVEVSX05PREVfU1RBVEVfVU5TUEVDSUZJRUQQABIfChtDTFVTVEVSX05PREVfU1RBVEVfU1RBUlRJTkcQARIeChpDTFVTVEVSX05PREVfU1RBVEVfSEVBTFRIWRACEiAKHENMVVNURVJfTk9ERV9TVEFURV9VTkhFQUxUSFkQAxIgChxDTFVTVEVSX05PREVfU1RBVEVfU1VTUEVOREVEEAQqnAEKGENsdXN0ZXJTY2FsYWJpbGl0eVN0YXR1cxIqCiZDTFVTVEVSX1NDQUxBQklMSVRZX1NUQVRVU19VTlNQRUNJRklFRBAAEisKJ0NMVVNURVJfU0NBTEFCSUxJVFlfU1RBVFVTX05PVF9TQ0FMQUJMRRABEicKI0NMVVNURVJfU0NBTEFCSUxJVFlfU1RBVFVTX1NDQUxBQkxFEAIynBcKDkNsdXN0ZXJTZXJ2aWNlErQBCgxMaXN0Q2x1c3RlcnMSLC5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5MaXN0Q2x1c3RlcnNSZXF1ZXN0Gi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdENsdXN0ZXJzUmVzcG9uc2UiR4q1GA1yZWFkOmNsdXN0ZXJzgtPkkwIwEi4vYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzEtcBCgpHZXRDbHVzdGVyEioucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuR2V0Q2x1c3RlclJlcXVlc3QaKy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5HZXRDbHVzdGVyUmVzcG9uc2UicIq1GA1yZWFkOmNsdXN0ZXJzurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlcl9pZILT5JMCPRI7L2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9jbHVzdGVycy97Y2x1c3Rlcl9pZH0S2QIKDUNyZWF0ZUNsdXN0ZXISLS5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5DcmVhdGVDbHVzdGVyUmVxdWVzdBouLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkNyZWF0ZUNsdXN0ZXJSZXNwb25zZSLoAYq1GA53cml0ZTpjbHVzdGVyc5K1GBJjbHVzdGVyLmFjY291bnRfaWS6tRgcCgxjbHVzdGVyX25hbWUSDGNsdXN0ZXIubmFtZcrzGFsIARIHY2x1c3RlciIPcmVzcC5jbHVzdGVyLmlkKj0vYWNjb3VudHMve3JlcS5jbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tyZXNwLmNsdXN0ZXIuaWR9gtPkkwI7OgEqIjYvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2NsdXN0ZXIuYWNjb3VudF9pZH0vY2x1c3RlcnMStAMKF0NyZWF0ZUNsdXN0ZXJGcm9tQmFja3VwEjcucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXF1ZXN0GjgucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuQ3JlYXRlQ2x1c3RlckZyb21CYWNrdXBSZXNwb25zZSKlAoq1GA9yZXN0b3JlOmJhY2t1cHOKtRgOd3JpdGU6Y2x1c3RlcnOotRgBurUYFgoJYmFja3VwX2lkEgliYWNrdXBfaWS6tRgcCgxjbHVzdGVyX25hbWUSDGNsdXN0ZXJfbmFtZcrzGHQIARIHY2x1c3RlciIPcmVzcC5jbHVzdGVyLmlkKjUvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVzcC5jbHVzdGVyLmlkfVIfCg5mcm9tX2JhY2t1cF9pZBINcmVxLmJhY2t1cF9pZILT5JMCRCJCL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9iYWNrdXBzL3tiYWNrdXBfaWR9L2NsdXN0ZXJzEuACCg1VcGRhdGVDbHVzdGVyEi0ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuVXBkYXRlQ2x1c3RlclJlcXVlc3QaLi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5VcGRhdGVDbHVzdGVyUmVzcG9uc2Ui7wGKtRgOd3JpdGU6Y2x1c3RlcnOStRgSY2x1c3Rlci5hY2NvdW50X2lkurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlci5pZMrzGFkIAhIHY2x1c3RlciIOcmVxLmNsdXN0ZXIuaWQqPC9hY2NvdW50cy97cmVxLmNsdXN0ZXIuYWNjb3VudF9pZH0vY2x1c3RlcnMve3JlcS5jbHVzdGVyLmlkfYLT5JMCSDoBKhpDL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3tjbHVzdGVyLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyLmlkfRK4AgoNRGVsZXRlQ2x1c3RlchItLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxLkRlbGV0ZUNsdXN0ZXJSZXF1ZXN0Gi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuRGVsZXRlQ2x1c3RlclJlc3BvbnNlIscBirUYD2RlbGV0ZTpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWTK8xhRCAMSB2NsdXN0ZXIiDnJlcS5jbHVzdGVyX2lkKjQvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVxLmNsdXN0ZXJfaWR9gtPkkwI9KjsvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyX2lkfRLLAgoOUmVzdGFydENsdXN0ZXISLi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5SZXN0YXJ0Q2x1c3RlclJlcXVlc3QaLy5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5SZXN0YXJ0Q2x1c3RlclJlc3BvbnNlItcBirUYDndyaXRlOmNsdXN0ZXJzurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlcl9pZMrzGFoIBBIHY2x1c3RlciIOcmVxLmNsdXN0ZXJfaWQqNC9hY2NvdW50cy97cmVxLmFjY291bnRfaWR9L2NsdXN0ZXJzL3tyZXEuY2x1c3Rlcl9pZH0yB3Jlc3RhcnSC0+STAkUiQy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vY2x1c3RlcnMve2NsdXN0ZXJfaWR9L3Jlc3RhcnQSywIKDlN1c3BlbmRDbHVzdGVyEi4ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VzcGVuZENsdXN0ZXJSZXF1ZXN0Gi8ucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VzcGVuZENsdXN0ZXJSZXNwb25zZSLXAYq1GA53cml0ZTpjbHVzdGVyc7q1GBgKCmNsdXN0ZXJfaWQSCmNsdXN0ZXJfaWTK8xhaCAQSB2NsdXN0ZXIiDnJlcS5jbHVzdGVyX2lkKjQvYWNjb3VudHMve3JlcS5hY2NvdW50X2lkfS9jbHVzdGVycy97cmVxLmNsdXN0ZXJfaWR9MgdzdXNwZW5kgtPkkwJFIkMvYXBpL2NsdXN0ZXIvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L2NsdXN0ZXJzL3tjbHVzdGVyX2lkfS9zdXNwZW5kEsYBChJTdWdnZXN0Q2x1c3Rlck5hbWUSMi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5TdWdnZXN0Q2x1c3Rlck5hbWVSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuU3VnZ2VzdENsdXN0ZXJOYW1lUmVzcG9uc2UiR4q1GACC0+STAj0SOy9hcGkvY2x1c3Rlci92MS9hY2NvdW50cy97YWNjb3VudF9pZH0vY2x1c3RlcnMvc3VnZ2VzdC1uYW1lEuIBChJMaXN0UWRyYW50UmVsZWFzZXMSMi5xZHJhbnQuY2xvdWQuY2x1c3Rlci52MS5MaXN0UWRyYW50UmVsZWFzZXNSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmNsdXN0ZXIudjEuTGlzdFFkcmFudFJlbGVhc2VzUmVzcG9uc2UiY4q1GA1yZWFkOmNsdXN0ZXJzurUYGAoKY2x1c3Rlcl9pZBIKY2x1c3Rlcl9pZILT5JMCMBIuL2FwaS9jbHVzdGVyL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9yZWxlYXNlc0L+AQobY29tLnFkcmFudC5jbG91ZC5jbHVzdGVyLnYxQgxDbHVzdGVyUHJvdG9QAVpSZ2l0aHViLmNvbS9xZHJhbnQvcWRyYW50LWNsb3VkLXB1YmxpYy1hcGkvZ2VuL2dvL3FkcmFudC9jbG91ZC9jbHVzdGVyL3YxO2NsdXN0ZXJ2MaICA1FDQ6oCF1FkcmFudC5DbG91ZC5DbHVzdGVyLlYxygIXUWRyYW50XENsb3VkXENsdXN0ZXJcVjHiAiNRZHJhbnRcQ2xvdWRcQ2x1c3RlclxWMVxHUEJNZXRhZGF0YeoCGlFkcmFudDo6Q2xvdWQ6OkNsdXN0ZXI6OlYxYgZwcm90bzM", [file_buf_validate_validate, file_google_api_annotations, file_google_protobuf_timestamp, file_qdrant_cloud_common_v1_common, file_qdrant_cloud_event_v1_events]); /** * Describes the message qdrant.cloud.cluster.v1.ListClustersRequest. @@ -288,20 +288,6 @@ export const CreateClusterFromBackupRequestSchema = /*@__PURE__*/ export const CreateClusterFromBackupResponseSchema = /*@__PURE__*/ messageDesc(file_qdrant_cloud_cluster_v1_cluster, 38); -/** - * Describes the message qdrant.cloud.cluster.v1.GetQuoteRequest. - * Use `create(GetQuoteRequestSchema)` to create a new message. - */ -export const GetQuoteRequestSchema = /*@__PURE__*/ - messageDesc(file_qdrant_cloud_cluster_v1_cluster, 39); - -/** - * Describes the message qdrant.cloud.cluster.v1.GetQuoteResponse. - * Use `create(GetQuoteResponseSchema)` to create a new message. - */ -export const GetQuoteResponseSchema = /*@__PURE__*/ - messageDesc(file_qdrant_cloud_cluster_v1_cluster, 40); - /** * Describes the enum qdrant.cloud.cluster.v1.ClusterServiceType. */ diff --git a/proto/qdrant/cloud/cluster/v1/cluster.proto b/proto/qdrant/cloud/cluster/v1/cluster.proto index 6f6f46ab..f08a17be 100644 --- a/proto/qdrant/cloud/cluster/v1/cluster.proto +++ b/proto/qdrant/cloud/cluster/v1/cluster.proto @@ -947,4 +947,3 @@ message CreateClusterFromBackupResponse { // Cluster created from the backup Cluster cluster = 1 [(buf.validate.field).required = true]; } - From 3e6cc271c9d7ff286cf2e4b8ca4f462f7335419e Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Tue, 30 Sep 2025 16:19:39 +0300 Subject: [PATCH 5/8] Remove monthly price , increase max nodes --- proto/qdrant/cloud/booking/v1/booking.proto | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/proto/qdrant/cloud/booking/v1/booking.proto b/proto/qdrant/cloud/booking/v1/booking.proto index 3b7cd9b6..fdd5f13a 100644 --- a/proto/qdrant/cloud/booking/v1/booking.proto +++ b/proto/qdrant/cloud/booking/v1/booking.proto @@ -246,11 +246,11 @@ message GetQuoteRequest { 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...20 [both included]. + // 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: 20 + lte: 100 }]; // The package identifier used to configure the resources of the cluster. // Use `qdrant.cloud.booking.v1.BookingService.ListPackages` to select one. @@ -269,19 +269,14 @@ message GetQuoteResponse { 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 original price per month in millicents, before any discounts. - // Calculated as original_price_per_hour * 24 * 30 (720 hours). - int64 original_price_per_month = 3 [(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 = 4 [(buf.validate.field).int64.gte = 0]; - // The discounted price per month in millicents, after applying discounts. - // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). - // If no discounts are applied, this will be the same as original_price_per_month. - int64 discounted_price_per_month = 5 [(buf.validate.field).int64.gte = 0]; + // This field is only populated if the user has 'read:discounts' permission. + optional 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 = 6 [(buf.validate.field).double = { + // This field is only populated if the user has 'read:discounts' permission. + optional double discount_percentage = 4 [(buf.validate.field).double = { gte: 0.0 lte: 100.0 }]; From dcf2f43f46918503daeb9da8ce91738415cc8ee9 Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Wed, 1 Oct 2025 11:06:58 +0300 Subject: [PATCH 6/8] make generate --- gen/go/qdrant/cloud/booking/v1/booking.pb.go | 52 ++++++------------- .../cloud/booking/v1/booking.swagger.json | 16 ++---- .../qdrant/cloud/booking/v1/booking_pb2.py | 22 ++++---- .../qdrant/cloud/booking/v1/booking_pb2.pyi | 8 +-- .../qdrant/cloud/booking/v1/booking_pb.d.ts | 29 +++-------- .../qdrant/cloud/booking/v1/booking_pb.js | 2 +- 6 files changed, 39 insertions(+), 90 deletions(-) diff --git a/gen/go/qdrant/cloud/booking/v1/booking.pb.go b/gen/go/qdrant/cloud/booking/v1/booking.pb.go index 17623965..5da7039a 100644 --- a/gen/go/qdrant/cloud/booking/v1/booking.pb.go +++ b/gen/go/qdrant/cloud/booking/v1/booking.pb.go @@ -716,7 +716,7 @@ type GetQuoteRequest struct { // 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...20 [both included]. + // 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. @@ -811,19 +811,14 @@ type GetQuoteResponse struct { 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 original price per month in millicents, before any discounts. - // Calculated as original_price_per_hour * 24 * 30 (720 hours). - OriginalPricePerMonth int64 `protobuf:"varint,3,opt,name=original_price_per_month,json=originalPricePerMonth,proto3" json:"original_price_per_month,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,4,opt,name=discounted_price_per_hour,json=discountedPricePerHour,proto3" json:"discounted_price_per_hour,omitempty"` - // The discounted price per month in millicents, after applying discounts. - // Calculated as discounted_price_per_hour * 24 * 30 (720 hours). - // If no discounts are applied, this will be the same as original_price_per_month. - DiscountedPricePerMonth int64 `protobuf:"varint,5,opt,name=discounted_price_per_month,json=discountedPricePerMonth,proto3" json:"discounted_price_per_month,omitempty"` + // This field is only populated if the user has 'read:discounts' permission. + DiscountedPricePerHour *int64 `protobuf:"varint,3,opt,name=discounted_price_per_hour,json=discountedPricePerHour,proto3,oneof" 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,6,opt,name=discount_percentage,json=discountPercentage,proto3" json:"discount_percentage,omitempty"` + // This field is only populated if the user has 'read:discounts' permission. + DiscountPercentage *float64 `protobuf:"fixed64,4,opt,name=discount_percentage,json=discountPercentage,proto3,oneof" json:"discount_percentage,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -872,30 +867,16 @@ func (x *GetQuoteResponse) GetOriginalPricePerHour() int64 { return 0 } -func (x *GetQuoteResponse) GetOriginalPricePerMonth() int64 { - if x != nil { - return x.OriginalPricePerMonth - } - return 0 -} - func (x *GetQuoteResponse) GetDiscountedPricePerHour() int64 { - if x != nil { - return x.DiscountedPricePerHour - } - return 0 -} - -func (x *GetQuoteResponse) GetDiscountedPricePerMonth() int64 { - if x != nil { - return x.DiscountedPricePerMonth + if x != nil && x.DiscountedPricePerHour != nil { + return *x.DiscountedPricePerHour } return 0 } func (x *GetQuoteResponse) GetDiscountPercentage() float64 { - if x != nil { - return x.DiscountPercentage + if x != nil && x.DiscountPercentage != nil { + return *x.DiscountPercentage } return 0 } @@ -953,20 +934,20 @@ const file_qdrant_cloud_booking_v1_booking_proto_rawDesc = "" + "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\x18\x14(\x01R\rnumberOfNodes\x12'\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\"\x97\x03\n" + + "\x19_cloud_provider_region_id\"\xcf\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\x12@\n" + - "\x18original_price_per_month\x18\x03 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12B\n" + - "\x19discounted_price_per_hour\x18\x04 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x16discountedPricePerHour\x12D\n" + - "\x1adiscounted_price_per_month\x18\x05 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x17discountedPricePerMonth\x12H\n" + - "\x13discount_percentage\x18\x06 \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" + + "\x17original_price_per_hour\x18\x02 \x01(\x03B\a\xbaH\x04\"\x02(\x00R\x14originalPricePerHour\x12G\n" + + "\x19discounted_price_per_hour\x18\x03 \x01(\x03B\a\xbaH\x04\"\x02(\x00H\x00R\x16discountedPricePerHour\x88\x01\x01\x12M\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\x00H\x01R\x12discountPercentage\x88\x01\x01B\x1c\n" + + "\x1a_discounted_price_per_hourB\x16\n" + + "\x14_discount_percentage*j\n" + "\rPackageStatus\x12\x1e\n" + "\x1aPACKAGE_STATUS_UNSPECIFIED\x10\x00\x12\x19\n" + "\x15PACKAGE_STATUS_ACTIVE\x10\x01\x12\x1e\n" + @@ -1051,6 +1032,7 @@ func file_qdrant_cloud_booking_v1_booking_proto_init() { 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{} + file_qdrant_cloud_booking_v1_booking_proto_msgTypes[10].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json b/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json index cac57a0b..aafc18b3 100644 --- a/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json +++ b/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json @@ -212,7 +212,7 @@ "numberOfNodes": { "type": "integer", "format": "int64", - "description": "The number of nodes in a cluster.\nThis should be a number 1...20 [both included].\nThis is a required field." + "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", @@ -287,25 +287,15 @@ "format": "int64", "description": "The original price per hour in millicents, before any discounts." }, - "originalPricePerMonth": { - "type": "string", - "format": "int64", - "description": "The original price per month in millicents, before any discounts.\nCalculated as original_price_per_hour * 24 * 30 (720 hours)." - }, "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." - }, - "discountedPricePerMonth": { - "type": "string", - "format": "int64", - "description": "The discounted price per month in millicents, after applying discounts.\nCalculated as discounted_price_per_hour * 24 * 30 (720 hours).\nIf no discounts are applied, this will be the same as original_price_per_month." + "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.\nThis field is only populated if the user has 'read:discounts' permission." }, "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." + "description": "The percentage of discount applied (e.g., 10.0 for 10% discount).\nIf no discounts are applied, this will be 0.0.\nThis field is only populated if the user has 'read:discounts' permission." } }, "title": "GetQuoteResponse is the response from the GetQuote function" diff --git a/gen/python/qdrant/cloud/booking/v1/booking_pb2.py b/gen/python/qdrant/cloud/booking/v1/booking_pb2.py index b176992a..9e3e6c81 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\"\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\x14(\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\"\x97\x03\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@\n\x18original_price_per_month\x18\x03 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x15originalPricePerMonth\x12\x42\n\x19\x64iscounted_price_per_hour\x18\x04 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x16\x64iscountedPricePerHour\x12\x44\n\x1a\x64iscounted_price_per_month\x18\x05 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00R\x17\x64iscountedPricePerMonth\x12H\n\x13\x64iscount_percentage\x18\x06 \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\x81\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\x9b\x01\n\x08GetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\":\x8a\xb5\x18\x00\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') +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\"\xcf\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\x12G\n\x19\x64iscounted_price_per_hour\x18\x03 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00H\x00R\x16\x64iscountedPricePerHour\x88\x01\x01\x12M\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\x00H\x01R\x12\x64iscountPercentage\x88\x01\x01\x42\x1c\n\x1a_discounted_price_per_hourB\x16\n\x14_discount_percentage*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\x81\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\x9b\x01\n\x08GetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\":\x8a\xb5\x18\x00\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) @@ -82,7 +82,7 @@ _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\030\024(\001' + _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 @@ -93,12 +93,8 @@ _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['original_price_per_month']._loaded_options = None - _globals['_GETQUOTERESPONSE'].fields_by_name['original_price_per_month']._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['discounted_price_per_month']._loaded_options = None - _globals['_GETQUOTERESPONSE'].fields_by_name['discounted_price_per_month']._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 @@ -109,10 +105,10 @@ _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['_BOOKINGSERVICE'].methods_by_name['GetQuote']._loaded_options = None _globals['_BOOKINGSERVICE'].methods_by_name['GetQuote']._serialized_options = b'\212\265\030\000\202\323\344\223\0020\"+/api/booking/v1/accounts/{account_id}/quote:\001*' - _globals['_PACKAGESTATUS']._serialized_start=3216 - _globals['_PACKAGESTATUS']._serialized_end=3322 - _globals['_PACKAGETIER']._serialized_start=3324 - _globals['_PACKAGETIER']._serialized_end=3427 + _globals['_PACKAGESTATUS']._serialized_start=3144 + _globals['_PACKAGESTATUS']._serialized_end=3250 + _globals['_PACKAGETIER']._serialized_start=3252 + _globals['_PACKAGETIER']._serialized_end=3355 _globals['_LISTPACKAGESREQUEST']._serialized_start=163 _globals['_LISTPACKAGESREQUEST']._serialized_end=655 _globals['_LISTPACKAGESRESPONSE']._serialized_start=657 @@ -134,7 +130,7 @@ _globals['_GETQUOTEREQUEST']._serialized_start=2239 _globals['_GETQUOTEREQUEST']._serialized_end=2804 _globals['_GETQUOTERESPONSE']._serialized_start=2807 - _globals['_GETQUOTERESPONSE']._serialized_end=3214 - _globals['_BOOKINGSERVICE']._serialized_start=3430 - _globals['_BOOKINGSERVICE']._serialized_end=4327 + _globals['_GETQUOTERESPONSE']._serialized_end=3142 + _globals['_BOOKINGSERVICE']._serialized_start=3358 + _globals['_BOOKINGSERVICE']._serialized_end=4255 # @@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 25bf6f25..2793140a 100644 --- a/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi +++ b/gen/python/qdrant/cloud/booking/v1/booking_pb2.pyi @@ -129,17 +129,13 @@ class GetQuoteRequest(_message.Message): 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", "original_price_per_month", "discounted_price_per_hour", "discounted_price_per_month", "discount_percentage") + __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] - ORIGINAL_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] DISCOUNTED_PRICE_PER_HOUR_FIELD_NUMBER: _ClassVar[int] - DISCOUNTED_PRICE_PER_MONTH_FIELD_NUMBER: _ClassVar[int] DISCOUNT_PERCENTAGE_FIELD_NUMBER: _ClassVar[int] currency: str original_price_per_hour: int - original_price_per_month: int discounted_price_per_hour: int - discounted_price_per_month: int discount_percentage: float - def __init__(self, currency: _Optional[str] = ..., original_price_per_hour: _Optional[int] = ..., original_price_per_month: _Optional[int] = ..., discounted_price_per_hour: _Optional[int] = ..., discounted_price_per_month: _Optional[int] = ..., discount_percentage: _Optional[float] = ...) -> None: ... + 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/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts index 05462f2a..abc4c75a 100644 --- a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts +++ b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts @@ -381,7 +381,7 @@ export declare type GetQuoteRequest = Message<"qdrant.cloud.booking.v1.GetQuoteR /** * The number of nodes in a cluster. - * This should be a number 1...20 [both included]. + * This should be a number 1...100 [both included]. * This is a required field. * * @generated from field: uint32 number_of_nodes = 4; @@ -436,38 +436,23 @@ export declare type GetQuoteResponse = Message<"qdrant.cloud.booking.v1.GetQuote */ originalPricePerHour: bigint; - /** - * The original price per month in millicents, before any discounts. - * Calculated as original_price_per_hour * 24 * 30 (720 hours). - * - * @generated from field: int64 original_price_per_month = 3; - */ - originalPricePerMonth: 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. + * This field is only populated if the user has 'read:discounts' permission. * - * @generated from field: int64 discounted_price_per_hour = 4; - */ - discountedPricePerHour: bigint; - - /** - * The discounted price per month in millicents, after applying discounts. - * Calculated as discounted_price_per_hour * 24 * 30 (720 hours). - * If no discounts are applied, this will be the same as original_price_per_month. - * - * @generated from field: int64 discounted_price_per_month = 5; + * @generated from field: optional int64 discounted_price_per_hour = 3; */ - discountedPricePerMonth: bigint; + discountedPricePerHour?: bigint; /** * The percentage of discount applied (e.g., 10.0 for 10% discount). * If no discounts are applied, this will be 0.0. + * This field is only populated if the user has 'read:discounts' permission. * - * @generated from field: double discount_percentage = 6; + * @generated from field: optional double discount_percentage = 4; */ - discountPercentage: number; + discountPercentage?: number; }; export declare type GetQuoteResponseValid = GetQuoteResponse; diff --git a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js index 8095b2d6..714a3d54 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("CiVxZHJhbnQvY2xvdWQvYm9va2luZy92MS9ib29raW5nLnByb3RvEhdxZHJhbnQuY2xvdWQuYm9va2luZy52MSKvAwoTTGlzdFBhY2thZ2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIiChFjbG91ZF9wcm92aWRlcl9pZBgCIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAyABKAlCB7pIBHICEAFIAIgBARI4CghzdGF0dXNlcxgEIAMoDjImLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLlBhY2thZ2VTdGF0dXM6zgG6SMoBGscBCi5saXN0X3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSLkAgoZTGlzdEdsb2JhbFBhY2thZ2VzUmVxdWVzdBIiChFjbG91ZF9wcm92aWRlcl9pZBgBIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAiABKAlCB7pIBHICEAFIAIgBATrVAbpI0QEazgEKNWxpc3RfZ2xvYmFsX3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIk0KGkxpc3RHbG9iYWxQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSJHChFHZXRQYWNrYWdlUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIUCgJpZBgCIAEoCUIIukgFcgOwAQEiTwoSR2V0UGFja2FnZVJlc3BvbnNlEjkKB3BhY2thZ2UYASABKAsyIC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlQga6SAPIAQEilQQKB1BhY2thZ2USFAoCaWQYASABKAlCCLpIBXIDsAEBEikKBG5hbWUYAiABKAlCG7pIGHIWEAMYQDIQXlthLXpBLVowLTktX10rJBIfCgR0eXBlGAMgASgJQhG6SA5yDFIEZnJlZVIEcGFpZBJOChZyZXNvdXJjZV9jb25maWd1cmF0aW9uGAQgASgLMi4ucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUmVzb3VyY2VDb25maWd1cmF0aW9uEiMKCGN1cnJlbmN5GAUgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChd1bml0X2ludF9wcmljZV9wZXJfaG91chgGIAEoBUIHukgEGgIoABJCCgZzdGF0dXMYByABKA4yJi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlU3RhdHVzQgq6SAeCAQQQASAAEj4KBHRpZXIYCSABKA4yJC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlVGllckIKukgHggEEEAEgABJiCh5hdmFpbGFibGVfYWRkaXRpb25hbF9yZXNvdXJjZXMYCCABKAsyNS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5BdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzSACIAQFCIQofX2F2YWlsYWJsZV9hZGRpdGlvbmFsX3Jlc291cmNlcyI7ChxBdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzEhsKE2Rpc2tfcHJpY2VfcGVyX2hvdXIYASABKA0iWgoVUmVzb3VyY2VDb25maWd1cmF0aW9uEhQKA3JhbRgBIAEoCUIHukgEcgIQARIUCgNjcHUYAiABKAlCB7pIBHICEAESFQoEZGlzaxgDIAEoCUIHukgEcgIQASLVAwoPR2V0UXVvdGVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEiIKEWNsb3VkX3Byb3ZpZGVyX2lkGAIgASgJQge6SARyAhADEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgDIAEoCUIHukgEcgIQAUgAiAEBEiIKD251bWJlcl9vZl9ub2RlcxgEIAEoDUIJukgGKgQYFCgBEhwKCnBhY2thZ2VfaWQYBSABKAlCCLpIBXIDsAEBEiQKE2FkZGl0aW9uYWxfZGlza19naWIYBiABKA1CB7pIBCoCKAA6ygG6SMYBGsMBCipnZXRfcXVvdGUuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkX3ByZXNlbnQSS2Nsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX2lkIGlzIG5vdCAnaHlicmlkJxpIdGhpcy5jbG91ZF9wcm92aWRlcl9pZCA9PSAnaHlicmlkJyB8fCBoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpQhsKGV9jbG91ZF9wcm92aWRlcl9yZWdpb25faWQimwIKEEdldFF1b3RlUmVzcG9uc2USIwoIY3VycmVuY3kYASABKAlCEbpIDnIMMgpeW0EtWl17M30kEigKF29yaWdpbmFsX3ByaWNlX3Blcl9ob3VyGAIgASgDQge6SAQiAigAEikKGG9yaWdpbmFsX3ByaWNlX3Blcl9tb250aBgDIAEoA0IHukgEIgIoABIqChlkaXNjb3VudGVkX3ByaWNlX3Blcl9ob3VyGAQgASgDQge6SAQiAigAEisKGmRpc2NvdW50ZWRfcHJpY2VfcGVyX21vbnRoGAUgASgDQge6SAQiAigAEjQKE2Rpc2NvdW50X3BlcmNlbnRhZ2UYBiABKAFCF7pIFBISGQAAAAAAAFlAKQAAAAAAAAAAKmoKDVBhY2thZ2VTdGF0dXMSHgoaUEFDS0FHRV9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1NUQVRVU19BQ1RJVkUQARIeChpQQUNLQUdFX1NUQVRVU19ERUFDVElWQVRFRBACKmcKC1BhY2thZ2VUaWVyEiMKH1BBQ0tBR0VfVElFUl9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1RJRVJfU1RBTkRBUkQQARIYChRQQUNLQUdFX1RJRVJfUFJFTUlVTRACMoEHCg5Cb29raW5nU2VydmljZRKKAgoMTGlzdFBhY2thZ2VzEiwucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdFBhY2thZ2VzUmVxdWVzdBotLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkxpc3RQYWNrYWdlc1Jlc3BvbnNlIpwBirUYALq1GCYKEWNsb3VkX3Byb3ZpZGVyX2lkEhFjbG91ZF9wcm92aWRlcl9pZLq1GDQKGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBIYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkgtPkkwIwEi4vYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3BhY2thZ2VzEroBCgpHZXRQYWNrYWdlEioucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuR2V0UGFja2FnZVJlcXVlc3QaKy5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRQYWNrYWdlUmVzcG9uc2UiU4q1GAC6tRgQCgpwYWNrYWdlX2lkEgJpZILT5JMCNRIzL2FwaS9ib29raW5nL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9wYWNrYWdlcy97aWR9EoYCChJMaXN0R2xvYmFsUGFja2FnZXMSMi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5MaXN0R2xvYmFsUGFja2FnZXNSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdEdsb2JhbFBhY2thZ2VzUmVzcG9uc2UihgGYtRgAurUYJgoRY2xvdWRfcHJvdmlkZXJfaWQSEWNsb3VkX3Byb3ZpZGVyX2lkurUYNAoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEhhjbG91ZF9wcm92aWRlcl9yZWdpb25faWSC0+STAhoSGC9hcGkvYm9va2luZy92MS9wYWNrYWdlcxKbAQoIR2V0UXVvdGUSKC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlcXVlc3QaKS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlc3BvbnNlIjqKtRgAgtPkkwIwOgEqIisvYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3F1b3RlQv4BChtjb20ucWRyYW50LmNsb3VkLmJvb2tpbmcudjFCDEJvb2tpbmdQcm90b1ABWlJnaXRodWIuY29tL3FkcmFudC9xZHJhbnQtY2xvdWQtcHVibGljLWFwaS9nZW4vZ28vcWRyYW50L2Nsb3VkL2Jvb2tpbmcvdjE7Ym9va2luZ3YxogIDUUNCqgIXUWRyYW50LkNsb3VkLkJvb2tpbmcuVjHKAhdRZHJhbnRcQ2xvdWRcQm9va2luZ1xWMeICI1FkcmFudFxDbG91ZFxCb29raW5nXFYxXEdQQk1ldGFkYXRh6gIaUWRyYW50OjpDbG91ZDo6Qm9va2luZzo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_qdrant_cloud_common_v1_common]); + fileDesc("CiVxZHJhbnQvY2xvdWQvYm9va2luZy92MS9ib29raW5nLnByb3RvEhdxZHJhbnQuY2xvdWQuYm9va2luZy52MSKvAwoTTGlzdFBhY2thZ2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIiChFjbG91ZF9wcm92aWRlcl9pZBgCIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAyABKAlCB7pIBHICEAFIAIgBARI4CghzdGF0dXNlcxgEIAMoDjImLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLlBhY2thZ2VTdGF0dXM6zgG6SMoBGscBCi5saXN0X3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSLkAgoZTGlzdEdsb2JhbFBhY2thZ2VzUmVxdWVzdBIiChFjbG91ZF9wcm92aWRlcl9pZBgBIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAiABKAlCB7pIBHICEAFIAIgBATrVAbpI0QEazgEKNWxpc3RfZ2xvYmFsX3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIk0KGkxpc3RHbG9iYWxQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSJHChFHZXRQYWNrYWdlUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIUCgJpZBgCIAEoCUIIukgFcgOwAQEiTwoSR2V0UGFja2FnZVJlc3BvbnNlEjkKB3BhY2thZ2UYASABKAsyIC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlQga6SAPIAQEilQQKB1BhY2thZ2USFAoCaWQYASABKAlCCLpIBXIDsAEBEikKBG5hbWUYAiABKAlCG7pIGHIWEAMYQDIQXlthLXpBLVowLTktX10rJBIfCgR0eXBlGAMgASgJQhG6SA5yDFIEZnJlZVIEcGFpZBJOChZyZXNvdXJjZV9jb25maWd1cmF0aW9uGAQgASgLMi4ucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUmVzb3VyY2VDb25maWd1cmF0aW9uEiMKCGN1cnJlbmN5GAUgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChd1bml0X2ludF9wcmljZV9wZXJfaG91chgGIAEoBUIHukgEGgIoABJCCgZzdGF0dXMYByABKA4yJi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlU3RhdHVzQgq6SAeCAQQQASAAEj4KBHRpZXIYCSABKA4yJC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlVGllckIKukgHggEEEAEgABJiCh5hdmFpbGFibGVfYWRkaXRpb25hbF9yZXNvdXJjZXMYCCABKAsyNS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5BdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzSACIAQFCIQofX2F2YWlsYWJsZV9hZGRpdGlvbmFsX3Jlc291cmNlcyI7ChxBdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzEhsKE2Rpc2tfcHJpY2VfcGVyX2hvdXIYASABKA0iWgoVUmVzb3VyY2VDb25maWd1cmF0aW9uEhQKA3JhbRgBIAEoCUIHukgEcgIQARIUCgNjcHUYAiABKAlCB7pIBHICEAESFQoEZGlzaxgDIAEoCUIHukgEcgIQASLVAwoPR2V0UXVvdGVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEiIKEWNsb3VkX3Byb3ZpZGVyX2lkGAIgASgJQge6SARyAhADEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgDIAEoCUIHukgEcgIQAUgAiAEBEiIKD251bWJlcl9vZl9ub2RlcxgEIAEoDUIJukgGKgQYZCgBEhwKCnBhY2thZ2VfaWQYBSABKAlCCLpIBXIDsAEBEiQKE2FkZGl0aW9uYWxfZGlza19naWIYBiABKA1CB7pIBCoCKAA6ygG6SMYBGsMBCipnZXRfcXVvdGUuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkX3ByZXNlbnQSS2Nsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX2lkIGlzIG5vdCAnaHlicmlkJxpIdGhpcy5jbG91ZF9wcm92aWRlcl9pZCA9PSAnaHlicmlkJyB8fCBoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpQhsKGV9jbG91ZF9wcm92aWRlcl9yZWdpb25faWQigwIKEEdldFF1b3RlUmVzcG9uc2USIwoIY3VycmVuY3kYASABKAlCEbpIDnIMMgpeW0EtWl17M30kEigKF29yaWdpbmFsX3ByaWNlX3Blcl9ob3VyGAIgASgDQge6SAQiAigAEi8KGWRpc2NvdW50ZWRfcHJpY2VfcGVyX2hvdXIYAyABKANCB7pIBCICKABIAIgBARI5ChNkaXNjb3VudF9wZXJjZW50YWdlGAQgASgBQhe6SBQSEhkAAAAAAABZQCkAAAAAAAAAAEgBiAEBQhwKGl9kaXNjb3VudGVkX3ByaWNlX3Blcl9ob3VyQhYKFF9kaXNjb3VudF9wZXJjZW50YWdlKmoKDVBhY2thZ2VTdGF0dXMSHgoaUEFDS0FHRV9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1NUQVRVU19BQ1RJVkUQARIeChpQQUNLQUdFX1NUQVRVU19ERUFDVElWQVRFRBACKmcKC1BhY2thZ2VUaWVyEiMKH1BBQ0tBR0VfVElFUl9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1RJRVJfU1RBTkRBUkQQARIYChRQQUNLQUdFX1RJRVJfUFJFTUlVTRACMoEHCg5Cb29raW5nU2VydmljZRKKAgoMTGlzdFBhY2thZ2VzEiwucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdFBhY2thZ2VzUmVxdWVzdBotLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkxpc3RQYWNrYWdlc1Jlc3BvbnNlIpwBirUYALq1GCYKEWNsb3VkX3Byb3ZpZGVyX2lkEhFjbG91ZF9wcm92aWRlcl9pZLq1GDQKGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBIYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkgtPkkwIwEi4vYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3BhY2thZ2VzEroBCgpHZXRQYWNrYWdlEioucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuR2V0UGFja2FnZVJlcXVlc3QaKy5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRQYWNrYWdlUmVzcG9uc2UiU4q1GAC6tRgQCgpwYWNrYWdlX2lkEgJpZILT5JMCNRIzL2FwaS9ib29raW5nL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9wYWNrYWdlcy97aWR9EoYCChJMaXN0R2xvYmFsUGFja2FnZXMSMi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5MaXN0R2xvYmFsUGFja2FnZXNSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdEdsb2JhbFBhY2thZ2VzUmVzcG9uc2UihgGYtRgAurUYJgoRY2xvdWRfcHJvdmlkZXJfaWQSEWNsb3VkX3Byb3ZpZGVyX2lkurUYNAoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEhhjbG91ZF9wcm92aWRlcl9yZWdpb25faWSC0+STAhoSGC9hcGkvYm9va2luZy92MS9wYWNrYWdlcxKbAQoIR2V0UXVvdGUSKC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlcXVlc3QaKS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlc3BvbnNlIjqKtRgAgtPkkwIwOgEqIisvYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3F1b3RlQv4BChtjb20ucWRyYW50LmNsb3VkLmJvb2tpbmcudjFCDEJvb2tpbmdQcm90b1ABWlJnaXRodWIuY29tL3FkcmFudC9xZHJhbnQtY2xvdWQtcHVibGljLWFwaS9nZW4vZ28vcWRyYW50L2Nsb3VkL2Jvb2tpbmcvdjE7Ym9va2luZ3YxogIDUUNCqgIXUWRyYW50LkNsb3VkLkJvb2tpbmcuVjHKAhdRZHJhbnRcQ2xvdWRcQm9va2luZ1xWMeICI1FkcmFudFxDbG91ZFxCb29raW5nXFYxXEdQQk1ldGFkYXRh6gIaUWRyYW50OjpDbG91ZDo6Qm9va2luZzo6VjFiBnByb3RvMw", [file_buf_validate_validate, file_google_api_annotations, file_qdrant_cloud_common_v1_common]); /** * Describes the message qdrant.cloud.booking.v1.ListPackagesRequest. From 9c23a19c883e12b537c31d0bd1b56550274765fb Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Thu, 2 Oct 2025 16:28:47 +0300 Subject: [PATCH 7/8] add write:cluter permission to getquote --- proto/qdrant/cloud/booking/v1/booking.proto | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/proto/qdrant/cloud/booking/v1/booking.proto b/proto/qdrant/cloud/booking/v1/booking.proto index fdd5f13a..7a952cea 100644 --- a/proto/qdrant/cloud/booking/v1/booking.proto +++ b/proto/qdrant/cloud/booking/v1/booking.proto @@ -59,13 +59,13 @@ service BookingService { }; } // Gets a price quote for a cluster configuration. - // This endpoint calculates pricing information including hourly and monthly costs, + // This endpoint calculates pricing information including hourly costs, // and any applicable discounts for the specified cluster configuration. // Required permissions: - // - None (authenticated only) + // - write:clusters rpc GetQuote(GetQuoteRequest) returns (GetQuoteResponse) { // permissions - option (common.v1.permissions) = ""; + option (common.v1.permissions) = "write:clusters"; // gRPC Gateway REST call option (google.api.http) = { post: "/api/booking/v1/accounts/{account_id}/quote" @@ -271,12 +271,10 @@ message GetQuoteResponse { 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. - // This field is only populated if the user has 'read:discounts' permission. - optional int64 discounted_price_per_hour = 3 [(buf.validate.field).int64.gte = 0]; + 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. - // This field is only populated if the user has 'read:discounts' permission. - optional double discount_percentage = 4 [(buf.validate.field).double = { + double discount_percentage = 4 [(buf.validate.field).double = { gte: 0.0 lte: 100.0 }]; From e67b7c077082c17200bd1436969fdbd100c10808 Mon Sep 17 00:00:00 2001 From: Stefos Giorgos Date: Thu, 2 Oct 2025 16:29:45 +0300 Subject: [PATCH 8/8] make generage --- gen/go/qdrant/cloud/booking/v1/booking.pb.go | 31 ++++++++----------- .../cloud/booking/v1/booking_grpc.pb.go | 8 ++--- .../cloud/booking/v1/booking.swagger.json | 6 ++-- .../qdrant/cloud/booking/v1/booking_pb2.py | 18 +++++------ .../cloud/booking/v1/booking_pb2_grpc.py | 4 +-- .../booking-BookingService_connectquery.d.ts | 4 +-- .../v1/booking-BookingService_connectquery.js | 4 +-- .../qdrant/cloud/booking/v1/booking_pb.d.ts | 14 ++++----- .../qdrant/cloud/booking/v1/booking_pb.js | 2 +- 9 files changed, 42 insertions(+), 49 deletions(-) diff --git a/gen/go/qdrant/cloud/booking/v1/booking.pb.go b/gen/go/qdrant/cloud/booking/v1/booking.pb.go index 5da7039a..036a87d6 100644 --- a/gen/go/qdrant/cloud/booking/v1/booking.pb.go +++ b/gen/go/qdrant/cloud/booking/v1/booking.pb.go @@ -813,12 +813,10 @@ type GetQuoteResponse struct { 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. - // This field is only populated if the user has 'read:discounts' permission. - DiscountedPricePerHour *int64 `protobuf:"varint,3,opt,name=discounted_price_per_hour,json=discountedPricePerHour,proto3,oneof" json:"discounted_price_per_hour,omitempty"` + 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. - // This field is only populated if the user has 'read:discounts' permission. - DiscountPercentage *float64 `protobuf:"fixed64,4,opt,name=discount_percentage,json=discountPercentage,proto3,oneof" json:"discount_percentage,omitempty"` + DiscountPercentage float64 `protobuf:"fixed64,4,opt,name=discount_percentage,json=discountPercentage,proto3" json:"discount_percentage,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -868,15 +866,15 @@ func (x *GetQuoteResponse) GetOriginalPricePerHour() int64 { } func (x *GetQuoteResponse) GetDiscountedPricePerHour() int64 { - if x != nil && x.DiscountedPricePerHour != nil { - return *x.DiscountedPricePerHour + if x != nil { + return x.DiscountedPricePerHour } return 0 } func (x *GetQuoteResponse) GetDiscountPercentage() float64 { - if x != nil && x.DiscountPercentage != nil { - return *x.DiscountPercentage + if x != nil { + return x.DiscountPercentage } return 0 } @@ -939,15 +937,13 @@ const file_qdrant_cloud_booking_v1_booking_proto_rawDesc = "" + "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\"\xcf\x02\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\x12G\n" + - "\x19discounted_price_per_hour\x18\x03 \x01(\x03B\a\xbaH\x04\"\x02(\x00H\x00R\x16discountedPricePerHour\x88\x01\x01\x12M\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\x00H\x01R\x12discountPercentage\x88\x01\x01B\x1c\n" + - "\x1a_discounted_price_per_hourB\x16\n" + - "\x14_discount_percentage*j\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" + @@ -955,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\x81\a\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" + @@ -966,8 +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/packages\x12\x9b\x01\n" + - "\bGetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\":\x8a\xb5\x18\x00\x82\xd3\xe4\x93\x020:\x01*\"+/api/booking/v1/accounts/{account_id}/quoteB\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 ( @@ -1032,7 +1028,6 @@ func file_qdrant_cloud_booking_v1_booking_proto_init() { 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{} - file_qdrant_cloud_booking_v1_booking_proto_msgTypes[10].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ 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 f307c98e..e6297d58 100644 --- a/gen/go/qdrant/cloud/booking/v1/booking_grpc.pb.go +++ b/gen/go/qdrant/cloud/booking/v1/booking_grpc.pb.go @@ -43,10 +43,10 @@ type BookingServiceClient interface { // 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 and monthly costs, + // This endpoint calculates pricing information including hourly costs, // and any applicable discounts for the specified cluster configuration. // Required permissions: - // - None (authenticated only) + // - write:clusters GetQuote(ctx context.Context, in *GetQuoteRequest, opts ...grpc.CallOption) (*GetQuoteResponse, error) } @@ -116,10 +116,10 @@ type BookingServiceServer interface { // Authentication not required ListGlobalPackages(context.Context, *ListGlobalPackagesRequest) (*ListGlobalPackagesResponse, error) // Gets a price quote for a cluster configuration. - // This endpoint calculates pricing information including hourly and monthly costs, + // This endpoint calculates pricing information including hourly costs, // and any applicable discounts for the specified cluster configuration. // Required permissions: - // - None (authenticated only) + // - write:clusters GetQuote(context.Context, *GetQuoteRequest) (*GetQuoteResponse, error) mustEmbedUnimplementedBookingServiceServer() } diff --git a/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json b/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json index aafc18b3..8e2f5729 100644 --- a/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json +++ b/gen/openapiv2/qdrant/cloud/booking/v1/booking.swagger.json @@ -119,7 +119,7 @@ }, "/api/booking/v1/accounts/{accountId}/quote": { "post": { - "summary": "Gets a price quote for a cluster configuration.\nThis endpoint calculates pricing information including hourly and monthly costs,\nand any applicable discounts for the specified cluster configuration.\nRequired permissions:\n- None (authenticated only)", + "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": { @@ -290,12 +290,12 @@ "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.\nThis field is only populated if the user has 'read:discounts' permission." + "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.\nThis field is only populated if the user has 'read:discounts' permission." + "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" diff --git a/gen/python/qdrant/cloud/booking/v1/booking_pb2.py b/gen/python/qdrant/cloud/booking/v1/booking_pb2.py index 9e3e6c81..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\"\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\"\xcf\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\x12G\n\x19\x64iscounted_price_per_hour\x18\x03 \x01(\x03\x42\x07\xbaH\x04\"\x02(\x00H\x00R\x16\x64iscountedPricePerHour\x88\x01\x01\x12M\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\x00H\x01R\x12\x64iscountPercentage\x88\x01\x01\x42\x1c\n\x1a_discounted_price_per_hourB\x16\n\x14_discount_percentage*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\x81\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\x9b\x01\n\x08GetQuote\x12(.qdrant.cloud.booking.v1.GetQuoteRequest\x1a).qdrant.cloud.booking.v1.GetQuoteResponse\":\x8a\xb5\x18\x00\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') +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) @@ -104,11 +104,11 @@ _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['_BOOKINGSERVICE'].methods_by_name['GetQuote']._loaded_options = None - _globals['_BOOKINGSERVICE'].methods_by_name['GetQuote']._serialized_options = b'\212\265\030\000\202\323\344\223\0020\"+/api/booking/v1/accounts/{account_id}/quote:\001*' - _globals['_PACKAGESTATUS']._serialized_start=3144 - _globals['_PACKAGESTATUS']._serialized_end=3250 - _globals['_PACKAGETIER']._serialized_start=3252 - _globals['_PACKAGETIER']._serialized_end=3355 + _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 @@ -130,7 +130,7 @@ _globals['_GETQUOTEREQUEST']._serialized_start=2239 _globals['_GETQUOTEREQUEST']._serialized_end=2804 _globals['_GETQUOTERESPONSE']._serialized_start=2807 - _globals['_GETQUOTERESPONSE']._serialized_end=3142 - _globals['_BOOKINGSERVICE']._serialized_start=3358 - _globals['_BOOKINGSERVICE']._serialized_end=4255 + _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_grpc.py b/gen/python/qdrant/cloud/booking/v1/booking_pb2_grpc.py index f91f2a22..9fe5809d 100644 --- a/gen/python/qdrant/cloud/booking/v1/booking_pb2_grpc.py +++ b/gen/python/qdrant/cloud/booking/v1/booking_pb2_grpc.py @@ -70,10 +70,10 @@ def ListGlobalPackages(self, request, context): def GetQuote(self, request, context): """Gets a price quote for a cluster configuration. - This endpoint calculates pricing information including hourly and monthly costs, + This endpoint calculates pricing information including hourly costs, and any applicable discounts for the specified cluster configuration. Required permissions: - - None (authenticated only) + - write:clusters """ context.set_code(grpc.StatusCode.UNIMPLEMENTED) context.set_details('Method not implemented!') 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 f2436884..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 @@ -29,10 +29,10 @@ export const getPackage: typeof BookingService["method"]["getPackage"]; export const listGlobalPackages: typeof BookingService["method"]["listGlobalPackages"]; /** * Gets a price quote for a cluster configuration. - * This endpoint calculates pricing information including hourly and monthly costs, + * This endpoint calculates pricing information including hourly costs, * and any applicable discounts for the specified cluster configuration. * Required permissions: - * - None (authenticated only) + * - write:clusters * * @generated from rpc qdrant.cloud.booking.v1.BookingService.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 6f7554e3..c82cef5b 100644 --- a/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.js +++ b/gen/typescript/qdrant/cloud/booking/v1/booking-BookingService_connectquery.js @@ -32,10 +32,10 @@ export const listGlobalPackages = BookingService.method.listGlobalPackages; /** * Gets a price quote for a cluster configuration. - * This endpoint calculates pricing information including hourly and monthly costs, + * This endpoint calculates pricing information including hourly costs, * and any applicable discounts for the specified cluster configuration. * Required permissions: - * - None (authenticated only) + * - write:clusters * * @generated from rpc qdrant.cloud.booking.v1.BookingService.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 abc4c75a..e51d6d2b 100644 --- a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts +++ b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.d.ts @@ -439,20 +439,18 @@ export declare type GetQuoteResponse = Message<"qdrant.cloud.booking.v1.GetQuote /** * 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. - * This field is only populated if the user has 'read:discounts' permission. * - * @generated from field: optional int64 discounted_price_per_hour = 3; + * @generated from field: int64 discounted_price_per_hour = 3; */ - discountedPricePerHour?: bigint; + discountedPricePerHour: bigint; /** * The percentage of discount applied (e.g., 10.0 for 10% discount). * If no discounts are applied, this will be 0.0. - * This field is only populated if the user has 'read:discounts' permission. * - * @generated from field: optional double discount_percentage = 4; + * @generated from field: double discount_percentage = 4; */ - discountPercentage?: number; + discountPercentage: number; }; export declare type GetQuoteResponseValid = GetQuoteResponse; @@ -572,10 +570,10 @@ export declare const BookingService: GenService<{ }, /** * Gets a price quote for a cluster configuration. - * This endpoint calculates pricing information including hourly and monthly costs, + * This endpoint calculates pricing information including hourly costs, * and any applicable discounts for the specified cluster configuration. * Required permissions: - * - None (authenticated only) + * - write:clusters * * @generated from rpc qdrant.cloud.booking.v1.BookingService.GetQuote */ diff --git a/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js b/gen/typescript/qdrant/cloud/booking/v1/booking_pb.js index 714a3d54..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("CiVxZHJhbnQvY2xvdWQvYm9va2luZy92MS9ib29raW5nLnByb3RvEhdxZHJhbnQuY2xvdWQuYm9va2luZy52MSKvAwoTTGlzdFBhY2thZ2VzUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIiChFjbG91ZF9wcm92aWRlcl9pZBgCIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAyABKAlCB7pIBHICEAFIAIgBARI4CghzdGF0dXNlcxgEIAMoDjImLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLlBhY2thZ2VTdGF0dXM6zgG6SMoBGscBCi5saXN0X3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIkcKFExpc3RQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSLkAgoZTGlzdEdsb2JhbFBhY2thZ2VzUmVxdWVzdBIiChFjbG91ZF9wcm92aWRlcl9pZBgBIAEoCUIHukgEcgIQAxIuChhjbG91ZF9wcm92aWRlcl9yZWdpb25faWQYAiABKAlCB7pIBHICEAFIAIgBATrVAbpI0QEazgEKNWxpc3RfZ2xvYmFsX3BhY2thZ2VzLmNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZF9wcmVzZW50EktjbG91ZF9wcm92aWRlcl9yZWdpb25faWQgaXMgcmVxdWlyZWQgd2hlbiBjbG91ZF9wcm92aWRlcl9pZCBpcyBub3QgJ2h5YnJpZCcaSHRoaXMuY2xvdWRfcHJvdmlkZXJfaWQgPT0gJ2h5YnJpZCcgfHwgaGFzKHRoaXMuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkKUIbChlfY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkIk0KGkxpc3RHbG9iYWxQYWNrYWdlc1Jlc3BvbnNlEi8KBWl0ZW1zGAEgAygLMiAucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUGFja2FnZSJHChFHZXRQYWNrYWdlUmVxdWVzdBIcCgphY2NvdW50X2lkGAEgASgJQgi6SAVyA7ABARIUCgJpZBgCIAEoCUIIukgFcgOwAQEiTwoSR2V0UGFja2FnZVJlc3BvbnNlEjkKB3BhY2thZ2UYASABKAsyIC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlQga6SAPIAQEilQQKB1BhY2thZ2USFAoCaWQYASABKAlCCLpIBXIDsAEBEikKBG5hbWUYAiABKAlCG7pIGHIWEAMYQDIQXlthLXpBLVowLTktX10rJBIfCgR0eXBlGAMgASgJQhG6SA5yDFIEZnJlZVIEcGFpZBJOChZyZXNvdXJjZV9jb25maWd1cmF0aW9uGAQgASgLMi4ucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuUmVzb3VyY2VDb25maWd1cmF0aW9uEiMKCGN1cnJlbmN5GAUgASgJQhG6SA5yDDIKXltBLVpdezN9JBIoChd1bml0X2ludF9wcmljZV9wZXJfaG91chgGIAEoBUIHukgEGgIoABJCCgZzdGF0dXMYByABKA4yJi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlU3RhdHVzQgq6SAeCAQQQASAAEj4KBHRpZXIYCSABKA4yJC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5QYWNrYWdlVGllckIKukgHggEEEAEgABJiCh5hdmFpbGFibGVfYWRkaXRpb25hbF9yZXNvdXJjZXMYCCABKAsyNS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5BdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzSACIAQFCIQofX2F2YWlsYWJsZV9hZGRpdGlvbmFsX3Jlc291cmNlcyI7ChxBdmFpbGFibGVBZGRpdGlvbmFsUmVzb3VyY2VzEhsKE2Rpc2tfcHJpY2VfcGVyX2hvdXIYASABKA0iWgoVUmVzb3VyY2VDb25maWd1cmF0aW9uEhQKA3JhbRgBIAEoCUIHukgEcgIQARIUCgNjcHUYAiABKAlCB7pIBHICEAESFQoEZGlzaxgDIAEoCUIHukgEcgIQASLVAwoPR2V0UXVvdGVSZXF1ZXN0EhwKCmFjY291bnRfaWQYASABKAlCCLpIBXIDsAEBEiIKEWNsb3VkX3Byb3ZpZGVyX2lkGAIgASgJQge6SARyAhADEi4KGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBgDIAEoCUIHukgEcgIQAUgAiAEBEiIKD251bWJlcl9vZl9ub2RlcxgEIAEoDUIJukgGKgQYZCgBEhwKCnBhY2thZ2VfaWQYBSABKAlCCLpIBXIDsAEBEiQKE2FkZGl0aW9uYWxfZGlza19naWIYBiABKA1CB7pIBCoCKAA6ygG6SMYBGsMBCipnZXRfcXVvdGUuY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkX3ByZXNlbnQSS2Nsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZCBpcyByZXF1aXJlZCB3aGVuIGNsb3VkX3Byb3ZpZGVyX2lkIGlzIG5vdCAnaHlicmlkJxpIdGhpcy5jbG91ZF9wcm92aWRlcl9pZCA9PSAnaHlicmlkJyB8fCBoYXModGhpcy5jbG91ZF9wcm92aWRlcl9yZWdpb25faWQpQhsKGV9jbG91ZF9wcm92aWRlcl9yZWdpb25faWQigwIKEEdldFF1b3RlUmVzcG9uc2USIwoIY3VycmVuY3kYASABKAlCEbpIDnIMMgpeW0EtWl17M30kEigKF29yaWdpbmFsX3ByaWNlX3Blcl9ob3VyGAIgASgDQge6SAQiAigAEi8KGWRpc2NvdW50ZWRfcHJpY2VfcGVyX2hvdXIYAyABKANCB7pIBCICKABIAIgBARI5ChNkaXNjb3VudF9wZXJjZW50YWdlGAQgASgBQhe6SBQSEhkAAAAAAABZQCkAAAAAAAAAAEgBiAEBQhwKGl9kaXNjb3VudGVkX3ByaWNlX3Blcl9ob3VyQhYKFF9kaXNjb3VudF9wZXJjZW50YWdlKmoKDVBhY2thZ2VTdGF0dXMSHgoaUEFDS0FHRV9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1NUQVRVU19BQ1RJVkUQARIeChpQQUNLQUdFX1NUQVRVU19ERUFDVElWQVRFRBACKmcKC1BhY2thZ2VUaWVyEiMKH1BBQ0tBR0VfVElFUl9TVEFUVVNfVU5TUEVDSUZJRUQQABIZChVQQUNLQUdFX1RJRVJfU1RBTkRBUkQQARIYChRQQUNLQUdFX1RJRVJfUFJFTUlVTRACMoEHCg5Cb29raW5nU2VydmljZRKKAgoMTGlzdFBhY2thZ2VzEiwucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdFBhY2thZ2VzUmVxdWVzdBotLnFkcmFudC5jbG91ZC5ib29raW5nLnYxLkxpc3RQYWNrYWdlc1Jlc3BvbnNlIpwBirUYALq1GCYKEWNsb3VkX3Byb3ZpZGVyX2lkEhFjbG91ZF9wcm92aWRlcl9pZLq1GDQKGGNsb3VkX3Byb3ZpZGVyX3JlZ2lvbl9pZBIYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkgtPkkwIwEi4vYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3BhY2thZ2VzEroBCgpHZXRQYWNrYWdlEioucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuR2V0UGFja2FnZVJlcXVlc3QaKy5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRQYWNrYWdlUmVzcG9uc2UiU4q1GAC6tRgQCgpwYWNrYWdlX2lkEgJpZILT5JMCNRIzL2FwaS9ib29raW5nL3YxL2FjY291bnRzL3thY2NvdW50X2lkfS9wYWNrYWdlcy97aWR9EoYCChJMaXN0R2xvYmFsUGFja2FnZXMSMi5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5MaXN0R2xvYmFsUGFja2FnZXNSZXF1ZXN0GjMucWRyYW50LmNsb3VkLmJvb2tpbmcudjEuTGlzdEdsb2JhbFBhY2thZ2VzUmVzcG9uc2UihgGYtRgAurUYJgoRY2xvdWRfcHJvdmlkZXJfaWQSEWNsb3VkX3Byb3ZpZGVyX2lkurUYNAoYY2xvdWRfcHJvdmlkZXJfcmVnaW9uX2lkEhhjbG91ZF9wcm92aWRlcl9yZWdpb25faWSC0+STAhoSGC9hcGkvYm9va2luZy92MS9wYWNrYWdlcxKbAQoIR2V0UXVvdGUSKC5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlcXVlc3QaKS5xZHJhbnQuY2xvdWQuYm9va2luZy52MS5HZXRRdW90ZVJlc3BvbnNlIjqKtRgAgtPkkwIwOgEqIisvYXBpL2Jvb2tpbmcvdjEvYWNjb3VudHMve2FjY291bnRfaWR9L3F1b3RlQv4BChtjb20ucWRyYW50LmNsb3VkLmJvb2tpbmcudjFCDEJvb2tpbmdQcm90b1ABWlJnaXRodWIuY29tL3FkcmFudC9xZHJhbnQtY2xvdWQtcHVibGljLWFwaS9nZW4vZ28vcWRyYW50L2Nsb3VkL2Jvb2tpbmcvdjE7Ym9va2luZ3YxogIDUUNCqgIXUWRyYW50LkNsb3VkLkJvb2tpbmcuVjHKAhdRZHJhbnRcQ2xvdWRcQm9va2luZ1xWMeICI1FkcmFudFxDbG91ZFxCb29raW5nXFYxXEdQQk1ldGFkYXRh6gIaUWRyYW50OjpDbG91ZDo6Qm9va2luZzo6VjFiBnByb3RvMw", [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.