Skip to main content

krabka_metadata/
lib.rs

1//! Versioned metadata records and the immutable image they apply to.
2//!
3//! `krabka-metadata` provides [`MetadataRecord`], the versioned union
4//! of topic, partition, broker-registration, and topic-deletion records, and
5//! [`MetadataImage`], an immutable snapshot of the cluster's metadata.
6//!
7//! Only [`MetadataImage::apply`] mutates the image, and the Raft state
8//! machine in `krabka-raft` calls that method. Everywhere else reads it
9//! through shared references and Arc clones.
10//!
11//! ## Applying controller records
12//!
13//! ```rust
14//! use krabka_metadata::{MetadataImage, MetadataRecord, TopicRecord};
15//! use uuid::Uuid;
16//!
17//! let mut image = MetadataImage::new(Uuid::new_v4());
18//! let topic_id = Uuid::new_v4();
19//!
20//! image.apply(&MetadataRecord::V1Topic(TopicRecord {
21//!     name: "orders".into(),
22//!     topic_id,
23//!     partitions: 0,
24//!     replication_factor: 3,
25//! }));
26//!
27//! let topic = image.topic("orders").expect("topic exists");
28//! assert_eq!(topic.topic_id, topic_id);
29//! ```
30//!
31//! ## Canonical quota entity keys
32//!
33//! ```rust
34//! use krabka_metadata::canonicalize_entity;
35//!
36//! let key = canonicalize_entity(vec![
37//!     ("user".to_string(), Some("alice".to_string())),
38//!     ("client-id".to_string(), Some("analytics".to_string())),
39//! ]);
40//!
41//! assert_eq!(key[0].0, "client-id");
42//! assert_eq!(key[1].0, "user");
43//! ```
44
45#![doc(html_root_url = "https://docs.rs/krabka-metadata/0.7.0")]
46
47pub mod acl;
48pub mod break_glass;
49pub mod directory_id;
50mod error;
51mod feature;
52pub mod group_version;
53mod image;
54pub mod kafka_record;
55pub mod krabka_version;
56pub mod kraft_translate;
57pub mod metadata_version;
58mod records;
59pub mod transaction_version;
60#[cfg(test)]
61mod wincode_contract;
62pub mod write_freeze;
63
64pub use acl::{AclEntry, AclEntryFilter, AclOperation, PatternType, PermissionType, ResourceType};
65pub use break_glass::{BreakGlassAction, BreakGlassApproval, BreakGlassProposalRecord};
66pub use error::MetadataError;
67pub use feature::{
68    Feature, bootstrap_feature_records, bootstrap_feature_records_with_overrides, feature,
69    feature_registry, is_supported_level, supported_feature_ranges, validate_feature_dependencies,
70};
71pub use image::{DelegationToken, EntityKey, MetadataImage, ThrottleKind, canonicalize_entity};
72pub use kafka_record::{KafkaRecordError, from_kafka_record, to_kafka_record};
73pub use krabka_version::{KrabkaVersion, PrivateRpc, private_rpc_version};
74/// KIP-853 voter-set value types, re-exported from the [`krabka_voters`] leaf
75/// crate. The path stays `krabka_metadata::voters`, so existing call sites are
76/// unchanged. The types live in their own crypto-free crate, so the consensus
77/// core can compile to WebAssembly.
78pub use krabka_voters as voters;
79pub use kraft_translate::{
80    PRIVATE_RECORD_VERSION, TranslateError, from_kraft, from_kraft_value, to_kraft,
81    to_kraft_records, to_kraft_values,
82};
83pub use records::{
84    BrokerConfigRecord, BrokerEndpoint, BrokerRegistrationChangeRecord, BrokerRegistrationRecord,
85    ClientMetricsConfigRecord, ClientQuotaRecord, ControllerRegistrationRecord,
86    DEFAULT_BROKER_CONFIG_NODE_ID, DelegationTokenRecord, DeleteDelegationTokenRecord,
87    DeleteScramCredentialRecord, DeleteTopicRecord, FeatureLevelRecord, FeaturesEpochRecord,
88    FencingChange, GroupConfigRecord, KRaftVersionRecord, LeaderEpoch, LeaderRecoveryState,
89    MetadataRecord, NodeId, PartitionDirAssignmentRecord, PartitionElrRecord,
90    PartitionOffsetAdvanceRecord, PartitionRecord, PartitionRecoveryRecord, PartitionUpdateRecord,
91    ProducerIdsRecord, QuotaEntity, ScramCredentialRecord, TopicConfigRecord, TopicRecord,
92    UnregisterBrokerRecord, UnregisterControllerRecord, VotersRecord,
93};
94pub use voters::{KRaftVersionRange, Voter, VoterEndpoint, VoterSet};
95pub use write_freeze::TopicFreezeRecord;