Skip to main content

couchbase_core/cbconfig/
mod.rs

1/*
2 *
3 *  * Copyright (c) 2025 Couchbase, Inc.
4 *  *
5 *  * Licensed under the Apache License, Version 2.0 (the "License");
6 *  * you may not use this file except in compliance with the License.
7 *  * You may obtain a copy of the License at
8 *  *
9 *  *    http://www.apache.org/licenses/LICENSE-2.0
10 *  *
11 *  * Unless required by applicable law or agreed to in writing, software
12 *  * distributed under the License is distributed on an "AS IS" BASIS,
13 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  * See the License for the specific language governing permissions and
15 *  * limitations under the License.
16 *
17 */
18
19pub mod parse;
20
21use std::collections::HashMap;
22
23use serde::{Deserialize, Serialize};
24
25#[derive(Deserialize, Serialize, Debug, Clone)]
26pub struct VBucketServerMap {
27    #[serde(alias = "hashAlgorithm")]
28    pub hash_algorithm: String,
29    #[serde(alias = "numReplicas")]
30    pub num_replicas: usize,
31    #[serde(alias = "serverList")]
32    pub server_list: Vec<String>,
33    #[serde(alias = "vBucketMap")]
34    pub vbucket_map: Vec<Vec<i16>>,
35}
36
37#[derive(Deserialize, Serialize, Debug, Clone)]
38pub struct ConfigDDocs {
39    #[serde(alias = "uri")]
40    pub uri: String,
41}
42
43#[derive(Deserialize, Serialize, Debug, Default, Clone)]
44pub struct TerseExtNodePorts {
45    #[serde(alias = "kv")]
46    pub kv: Option<u16>,
47    #[serde(alias = "capi")]
48    pub capi: Option<u16>,
49    #[serde(alias = "mgmt")]
50    pub mgmt: Option<u16>,
51    #[serde(alias = "n1ql")]
52    pub n1ql: Option<u16>,
53    #[serde(alias = "fts")]
54    pub fts: Option<u16>,
55    #[serde(alias = "cbas")]
56    pub cbas: Option<u16>,
57    #[serde(alias = "eventingAdminPort")]
58    pub eventing: Option<u16>,
59    #[serde(alias = "indexHttp")]
60    pub gsi: Option<u16>,
61    #[serde(alias = "backupAPI")]
62    pub backup: Option<u16>,
63
64    #[serde(alias = "kvSSL")]
65    pub kv_ssl: Option<u16>,
66    #[serde(alias = "capiSSL")]
67    pub capi_ssl: Option<u16>,
68    #[serde(alias = "mgmtSSL")]
69    pub mgmt_ssl: Option<u16>,
70    #[serde(alias = "n1qlSSL")]
71    pub n1ql_ssl: Option<u16>,
72    #[serde(alias = "ftsSSL")]
73    pub fts_ssl: Option<u16>,
74    #[serde(alias = "cbasSSL")]
75    pub cbas_ssl: Option<u16>,
76    #[serde(alias = "eventingSSL")]
77    pub eventing_ssl: Option<u16>,
78    #[serde(alias = "indexHttps")]
79    pub gsi_ssl: Option<u16>,
80    #[serde(alias = "backupAPIHTTPS")]
81    pub backup_ssl: Option<u16>,
82}
83
84#[derive(Deserialize, Serialize, Debug, Clone)]
85pub struct TerseExtNodeAltAddresses {
86    #[serde(alias = "ports")]
87    pub ports: TerseExtNodePorts,
88    #[serde(alias = "hostname")]
89    pub hostname: Option<String>,
90}
91
92#[derive(Deserialize, Serialize, Debug, Clone)]
93pub struct TerseNodePorts {
94    #[serde(alias = "direct")]
95    pub direct: Option<u16>,
96    #[serde(alias = "proxy")]
97    pub proxy: Option<u16>,
98}
99
100#[derive(Deserialize, Serialize, Debug, Clone)]
101pub struct TerseNodeConfig {
102    #[serde(alias = "couchbaseApiBase")]
103    pub couchbase_api_base: Option<String>,
104    #[serde(alias = "hostname")]
105    pub hostname: Option<String>,
106    #[serde(alias = "ports")]
107    pub ports: Option<TerseNodePorts>,
108}
109
110#[derive(Deserialize, Serialize, Debug, Clone)]
111pub struct TerseNodeExtConfig {
112    #[serde(alias = "services")]
113    pub services: Option<TerseExtNodePorts>,
114    #[serde(alias = "thisNode")]
115    pub this_node: Option<bool>,
116    #[serde(alias = "hostname")]
117    pub hostname: Option<String>,
118    #[serde(alias = "alternateAddresses", default)]
119    pub alternate_addresses: HashMap<String, TerseExtNodeAltAddresses>,
120}
121
122#[derive(Deserialize, Serialize, Debug, Clone)]
123pub struct TerseConfig {
124    #[serde(alias = "rev")]
125    pub rev: i64,
126    #[serde(alias = "revEpoch")]
127    pub rev_epoch: Option<i64>,
128    #[serde(alias = "name")]
129    pub name: Option<String>,
130    #[serde(alias = "nodeLocator")]
131    pub node_locator: Option<String>,
132    #[serde(alias = "uuid")]
133    pub uuid: Option<String>,
134    #[serde(alias = "uri")]
135    pub uri: Option<String>,
136    #[serde(alias = "streamingUri")]
137    pub streaming_uri: Option<String>,
138    #[serde(alias = "bucketCapabilitiesVer")]
139    pub bucket_capabilities_ver: Option<String>,
140    #[serde(alias = "bucketCapabilities")]
141    pub bucket_capabilities: Option<Vec<String>>,
142    #[serde(alias = "collectionsManifestUid")]
143    pub collections_manifest_uuid: Option<String>,
144    #[serde(alias = "ddocs")]
145    pub ddocs: Option<ConfigDDocs>,
146    #[serde(alias = "vBucketServerMap")]
147    pub vbucket_server_map: Option<VBucketServerMap>,
148    #[serde(alias = "nodes")]
149    pub nodes: Option<Vec<TerseNodeConfig>>,
150    #[serde(alias = "nodesExt")]
151    pub nodes_ext: Vec<TerseNodeExtConfig>,
152    #[serde(alias = "clusterCapabilitiesVer")]
153    pub cluster_capabilities_ver: Vec<i64>,
154    #[serde(alias = "clusterCapabilities")]
155    pub cluster_capabilities: HashMap<String, Vec<String>>,
156    #[serde(alias = "clusterUUID")]
157    pub cluster_uuid: Option<String>,
158    #[serde(alias = "clusterName")]
159    pub cluster_name: Option<String>,
160}
161
162#[derive(Deserialize, Serialize, Debug, Clone)]
163#[non_exhaustive]
164pub struct CollectionManifestCollection {
165    #[serde(rename = "uid")]
166    pub uid: String,
167    #[serde(rename = "name")]
168    pub name: String,
169    #[serde(rename = "maxTTL", default)]
170    pub max_ttl: Option<i32>,
171    #[serde(rename = "history", default)]
172    pub history: Option<bool>,
173}
174
175#[derive(Deserialize, Serialize, Debug, Clone)]
176#[non_exhaustive]
177pub struct CollectionManifestScope {
178    #[serde(rename = "uid")]
179    pub uid: String,
180    #[serde(rename = "name")]
181    pub name: String,
182    #[serde(rename = "collections", default)]
183    pub collections: Vec<CollectionManifestCollection>,
184}
185
186#[derive(Deserialize, Serialize, Debug, Clone)]
187#[non_exhaustive]
188pub struct CollectionManifest {
189    #[serde(rename = "uid")]
190    pub uid: String,
191    #[serde(rename = "scopes", default)]
192    pub scopes: Vec<CollectionManifestScope>,
193}
194
195#[derive(Debug, Deserialize, Serialize)]
196pub struct FullNode {
197    #[serde(rename = "clusterMembership", default)]
198    pub cluster_membership: Option<String>,
199    #[serde(rename = "recoveryType", default)]
200    pub recovery_type: Option<String>,
201    #[serde(default)]
202    pub status: Option<String>,
203    #[serde(rename = "otpNode", default)]
204    pub otp_node: Option<String>,
205    #[serde(default)]
206    pub hostname: Option<String>,
207    #[serde(rename = "nodeUUID", default)]
208    pub node_uuid: Option<String>,
209    #[serde(rename = "clusterCompatibility", default)]
210    pub cluster_compatibility: Option<u64>,
211    #[serde(default)]
212    pub version: Option<String>,
213    #[serde(default)]
214    pub os: Option<String>,
215    #[serde(rename = "cpuCount", default)]
216    pub cpu_count: Option<u32>,
217    #[serde(default)]
218    pub ports: Option<HashMap<String, i32>>,
219    #[serde(default)]
220    pub services: Vec<String>,
221    #[serde(rename = "nodeEncryption", default)]
222    pub node_encryption: Option<bool>,
223    #[serde(rename = "nodeEncryptionClientCertVerification", default)]
224    pub node_encryption_client_cert_verification: Option<bool>,
225    #[serde(rename = "addressFamilyOnly", default)]
226    pub address_family_only: Option<bool>,
227    #[serde(rename = "configuredHostname", default)]
228    pub configured_hostname: Option<String>,
229    #[serde(rename = "addressFamily", default)]
230    pub address_family: Option<String>,
231    #[serde(rename = "externalListeners", default)]
232    pub external_listeners: Option<Vec<ExternalListener>>,
233    #[serde(rename = "serverGroup", default)]
234    pub server_group: Option<String>,
235    #[serde(rename = "couchApiBase", default)]
236    pub couch_api_base: Option<String>,
237    #[serde(rename = "couchApiBaseHTTPS", default)]
238    pub couch_api_base_https: Option<String>,
239    #[serde(rename = "nodeHash", default)]
240    pub node_hash: Option<u64>,
241    #[serde(rename = "systemStats", default)]
242    pub system_stats: Option<SystemStats>,
243    #[serde(rename = "interestingStats", default)]
244    pub interesting_stats: Option<InterestingStats>,
245    #[serde(default)]
246    pub uptime: Option<String>,
247    #[serde(rename = "memoryTotal", default)]
248    pub memory_total: Option<u64>,
249    #[serde(rename = "memoryFree", default)]
250    pub memory_free: Option<u64>,
251    #[serde(rename = "mcdMemoryReserved", default)]
252    pub mcd_memory_reserved: Option<u64>,
253    #[serde(rename = "mcdMemoryAllocated", default)]
254    pub mcd_memory_allocated: Option<u64>,
255}
256
257#[derive(Debug, Deserialize, Serialize)]
258pub struct ExternalListener {
259    #[serde(rename = "afamily", default)]
260    pub afamily: Option<String>,
261    #[serde(rename = "nodeEncryption", default)]
262    pub node_encryption: Option<bool>,
263}
264
265#[derive(Debug, Deserialize, Serialize)]
266pub struct SystemStats {
267    #[serde(rename = "cpu_utilization_rate", default)]
268    pub cpu_utilization_rate: Option<f64>,
269    #[serde(rename = "cpu_stolen_rate", default)]
270    pub cpu_stolen_rate: Option<f64>,
271    #[serde(rename = "swap_total", default)]
272    pub swap_total: Option<u64>,
273    #[serde(rename = "swap_used", default)]
274    pub swap_used: Option<u64>,
275    #[serde(rename = "mem_total", default)]
276    pub mem_total: Option<u64>,
277    #[serde(rename = "mem_free", default)]
278    pub mem_free: Option<u64>,
279    #[serde(rename = "mem_limit", default)]
280    pub mem_limit: Option<u64>,
281    #[serde(rename = "cpu_cores_available", default)]
282    pub cpu_cores_available: Option<u32>,
283    #[serde(default)]
284    pub allocstall: Option<u64>,
285}
286
287#[derive(Debug, Deserialize, Serialize)]
288pub struct InterestingStats {
289    #[serde(default)]
290    pub cmd_get: Option<u64>,
291    #[serde(default)]
292    pub couch_docs_actual_disk_size: Option<u64>,
293    #[serde(default)]
294    pub couch_docs_data_size: Option<u64>,
295    #[serde(default)]
296    pub couch_spatial_data_size: Option<u64>,
297    #[serde(default)]
298    pub couch_spatial_disk_size: Option<u64>,
299    #[serde(default)]
300    pub couch_views_actual_disk_size: Option<u64>,
301    #[serde(default)]
302    pub couch_views_data_size: Option<u64>,
303    #[serde(default)]
304    pub curr_items: Option<u64>,
305    #[serde(default)]
306    pub curr_items_tot: Option<u64>,
307    #[serde(default)]
308    pub ep_bg_fetched: Option<u64>,
309    #[serde(default)]
310    pub get_hits: Option<u64>,
311    #[serde(default)]
312    pub index_data_size: Option<u64>,
313    #[serde(default)]
314    pub index_disk_size: Option<u64>,
315    #[serde(default)]
316    pub mem_used: Option<u64>,
317    #[serde(default)]
318    pub ops: Option<u64>,
319    #[serde(default)]
320    pub vb_active_num_non_resident: Option<u64>,
321    #[serde(default)]
322    pub vb_replica_curr_items: Option<u64>,
323}
324
325#[derive(Debug, Deserialize, Serialize, Default)]
326pub struct FullBucketControllers {
327    #[serde(rename = "compactAll", default)]
328    pub compact_all: Option<String>,
329    #[serde(rename = "compactDB", default)]
330    pub compact_db: Option<String>,
331    #[serde(rename = "purgeDeletes", default)]
332    pub purge_deletes: Option<String>,
333    #[serde(rename = "startRecovery", default)]
334    pub start_recovery: Option<String>,
335    #[serde(default)]
336    pub flush: Option<String>,
337}
338
339#[derive(Debug, Deserialize, Serialize, Default)]
340pub struct BucketStatsUris {
341    #[serde(default)]
342    pub uri: Option<String>,
343    #[serde(rename = "directoryURI", default)]
344    pub directory_uri: Option<String>,
345    #[serde(rename = "nodeStatsListURI", default)]
346    pub node_stats_list_uri: Option<String>,
347}
348
349#[derive(Debug, Deserialize, Serialize, Default)]
350pub struct BucketBasicStats {
351    #[serde(rename = "quotaPercentUsed", default)]
352    pub quota_percent_used: Option<f64>,
353    #[serde(rename = "opsPerSec", default)]
354    pub ops_per_sec: Option<u64>,
355    #[serde(rename = "diskFetches", default)]
356    pub disk_fetches: Option<u64>,
357    #[serde(rename = "itemCount", default)]
358    pub item_count: Option<u64>,
359    #[serde(rename = "diskUsed", default)]
360    pub disk_used: Option<u64>,
361    #[serde(rename = "dataUsed", default)]
362    pub data_used: Option<u64>,
363    #[serde(rename = "memUsed", default)]
364    pub mem_used: Option<u64>,
365    #[serde(rename = "vbActiveNumNonResident", default)]
366    pub vb_active_num_non_resident: Option<u64>,
367}
368
369#[derive(Debug, Deserialize, Serialize)]
370pub struct FullBucketConfig {
371    #[serde(default)]
372    pub name: Option<String>,
373    #[serde(rename = "nodeLocator", default)]
374    pub node_locator: Option<String>,
375    #[serde(rename = "bucketType")]
376    pub bucket_type: String,
377    #[serde(rename = "storageBackend")]
378    pub storage_backend: String,
379
380    #[serde(default)]
381    pub uuid: Option<String>,
382    #[serde(default)]
383    pub uri: Option<String>,
384    #[serde(rename = "streamingUri", default)]
385    pub streaming_uri: Option<String>,
386
387    #[serde(rename = "numVBuckets", default)]
388    pub num_vbuckets: Option<u32>,
389
390    #[serde(rename = "bucketCapabilitiesVer", default)]
391    pub bucket_capabilities_ver: Option<String>,
392    #[serde(rename = "bucketCapabilities", default)]
393    pub bucket_capabilities: Vec<String>,
394
395    #[serde(rename = "collectionsManifestUid", default)]
396    pub collections_manifest_uid: Option<String>,
397
398    #[serde(default)]
399    pub ddocs: Option<ConfigDDocs>,
400    #[serde(rename = "vBucketServerMap", default)]
401    pub vbucket_server_map: Option<VBucketServerMap>,
402
403    #[serde(default)]
404    pub nodes: Vec<FullNode>,
405
406    #[serde(rename = "localRandomKeyUri", default)]
407    pub local_random_key_uri: Option<String>,
408
409    #[serde(default)]
410    pub controllers: FullBucketControllers,
411
412    #[serde(rename = "stats", default)]
413    pub stats: Option<BucketStatsUris>,
414
415    #[serde(rename = "authType", default)]
416    pub auth_type: Option<String>,
417    #[serde(rename = "autoCompactionSettings", default)]
418    pub auto_compaction_settings: Option<bool>,
419
420    #[serde(rename = "replicaIndex")]
421    pub replica_index: bool,
422
423    pub quota: FullBucketQuota,
424
425    #[serde(default)]
426    pub rank: Option<i64>,
427    #[serde(rename = "enableCrossClusterVersioning", default)]
428    pub enable_cross_cluster_versioning: Option<bool>,
429    #[serde(rename = "versionPruningWindowHrs", default)]
430    pub version_pruning_window_hrs: Option<u32>,
431
432    #[serde(rename = "replicaNumber")]
433    pub replica_number: u32,
434    #[serde(rename = "threadsNumber", default)]
435    pub threads_number: Option<u32>,
436
437    #[serde(rename = "basicStats", default)]
438    pub basic_stats: Option<BucketBasicStats>,
439
440    #[serde(rename = "evictionPolicy")]
441    pub eviction_policy: String,
442    #[serde(rename = "durabilityMinLevel")]
443    pub minimum_durability_level: String,
444    #[serde(rename = "pitrEnabled", default)]
445    pub pitr_enabled: Option<bool>,
446    #[serde(rename = "pitrGranularity", default)]
447    pub pitr_granularity: Option<u32>,
448    #[serde(rename = "pitrMaxHistoryAge", default)]
449    pub pitr_max_history_age: Option<u32>,
450
451    #[serde(rename = "conflictResolutionType")]
452    pub conflict_resolution_type: String,
453    #[serde(rename = "maxTTL")]
454    pub max_ttl: u32,
455    #[serde(rename = "compressionMode")]
456    pub compression_mode: String,
457
458    #[serde(rename = "historyRetentionCollectionDefault", default)]
459    pub history_retention_collection_default: Option<bool>,
460    #[serde(rename = "historyRetentionBytes", default)]
461    pub history_retention_bytes: Option<u64>,
462    #[serde(rename = "historyRetentionSeconds", default)]
463    pub history_retention_seconds: Option<u32>,
464}
465
466#[derive(Debug, Deserialize, Serialize)]
467pub struct FullBucketQuota {
468    pub ram: u64,
469    #[serde(rename = "rawRAM")]
470    pub raw_ram: u64,
471}
472
473#[derive(Debug, Deserialize, Serialize)]
474pub struct BucketNames {
475    #[serde(rename = "bucketName")]
476    pub bucket_name: String,
477    pub uuid: String,
478}
479
480#[derive(Debug, Deserialize, Serialize)]
481pub struct FullClusterConfig {
482    #[serde(default)]
483    pub name: Option<String>,
484    #[serde(default)]
485    pub nodes: Vec<FullNode>,
486    #[serde(rename = "bucketNames")]
487    pub bucket_names: Vec<BucketNames>,
488}