From 75e605fe872c869f8be7c07d3e38c264841ec53b Mon Sep 17 00:00:00 2001 From: Zhengchao An Date: Fri, 28 Aug 2026 15:01:09 +0800 Subject: [PATCH] refactor(ecstore): migrate audit.rs default KVS tables to shared constructors (#6777) refactor(ecstore): migrate audit KVS defaults to shared constructors The amqp, nats, pulsar, redis, postgres, kafka and mysql default KVS tables in config/audit.rs duplicated the corresponding tables in config/notify.rs, leaving seven cross-file sync points where a default could silently drift between the two subsystems. Build them from the shared constructors added in config/target_defaults.rs instead, passing in the two literals that are genuinely audit-specific: the redis pub/sub channel (AUDIT_REDIS_DEFAULT_CHANNEL) and the mysql destination table ("rustfs_audit_logs"). Key order, every default value and every hidden_if_empty flag are preserved exactly, since the key order drives the order admin config output lists keys in. DEFAULT_AUDIT_WEBHOOK_KVS and DEFAULT_AUDIT_MQTT_KVS are left untouched: those two tables really do differ from their notify counterparts, so unifying them would change runtime behavior. Refs rustfs/backlog#2045 (cherry picked from commit 4de580e6d8901485eef268191924e035322d4d4e) (cherry picked from commit e5e301fa78e7f27ffa85b05cf5e7962301a5ff00) --- crates/ecstore/src/config/audit.rs | 569 +---------------------------- 1 file changed, 15 insertions(+), 554 deletions(-) diff --git a/crates/ecstore/src/config/audit.rs b/crates/ecstore/src/config/audit.rs index 63c63b700..06831c478 100644 --- a/crates/ecstore/src/config/audit.rs +++ b/crates/ecstore/src/config/audit.rs @@ -12,30 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +use super::target_defaults::{amqp_kvs, kafka_kvs, mysql_kvs, nats_kvs, postgres_kvs, pulsar_kvs, redis_kvs}; use rustfs_config::audit::AUDIT_REDIS_DEFAULT_CHANNEL; use rustfs_config::server_config::{KV, KVS}; use rustfs_config::{ - AMQP_EXCHANGE, AMQP_MANDATORY, AMQP_PASSWORD, AMQP_PERSISTENT, AMQP_QUEUE_DIR, AMQP_QUEUE_LIMIT, AMQP_ROUTING_KEY, - AMQP_TLS_CA, AMQP_TLS_CLIENT_CERT, AMQP_TLS_CLIENT_KEY, AMQP_URL, AMQP_USERNAME, COMMENT_KEY, DEFAULT_LIMIT, ENABLE_KEY, - EVENT_DEFAULT_DIR, EnableState, KAFKA_ACKS, KAFKA_BROKERS, KAFKA_QUEUE_DIR, KAFKA_QUEUE_LIMIT, KAFKA_SASL_ENABLE, - KAFKA_SASL_MECHANISM, KAFKA_SASL_PASSWORD, KAFKA_SASL_USERNAME, KAFKA_TLS_CA, KAFKA_TLS_CLIENT_CERT, KAFKA_TLS_CLIENT_KEY, - KAFKA_TLS_ENABLE, KAFKA_TOPIC, MQTT_BROKER, MQTT_KEEP_ALIVE_INTERVAL, MQTT_PASSWORD, MQTT_QOS, MQTT_QUEUE_DIR, - MQTT_QUEUE_LIMIT, MQTT_RECONNECT_INTERVAL, MQTT_TLS_CA, MQTT_TLS_CLIENT_CERT, MQTT_TLS_CLIENT_KEY, MQTT_TLS_POLICY, - MQTT_TLS_TRUST_LEAF_AS_CA, MQTT_TOPIC, MQTT_USERNAME, MQTT_WS_PATH_ALLOWLIST, MYSQL_DSN_STRING, MYSQL_FORMAT, - MYSQL_MAX_OPEN_CONNECTIONS, MYSQL_QUEUE_DIR, MYSQL_QUEUE_LIMIT, MYSQL_TABLE, MYSQL_TLS_CA, MYSQL_TLS_CLIENT_CERT, - MYSQL_TLS_CLIENT_KEY, NATS_ADDRESS, NATS_CREDENTIALS_FILE, NATS_JETSTREAM_ACK_TIMEOUT_DEFAULT_SECS, - NATS_JETSTREAM_ACK_TIMEOUT_SECS, NATS_JETSTREAM_ENABLE, NATS_JETSTREAM_STREAM_NAME, NATS_PASSWORD, NATS_QUEUE_DIR, - NATS_QUEUE_LIMIT, NATS_SUBJECT, NATS_TLS_CA, NATS_TLS_CLIENT_CERT, NATS_TLS_CLIENT_KEY, NATS_TLS_REQUIRED, NATS_TOKEN, - NATS_USERNAME, POSTGRES_DSN_STRING, POSTGRES_FORMAT, POSTGRES_QUEUE_DIR, POSTGRES_QUEUE_LIMIT, POSTGRES_TABLE, - POSTGRES_TLS_CA, POSTGRES_TLS_CLIENT_CERT, POSTGRES_TLS_CLIENT_KEY, POSTGRES_TLS_REQUIRED, PULSAR_AUTH_TOKEN, PULSAR_BROKER, - PULSAR_PASSWORD, PULSAR_QUEUE_DIR, PULSAR_QUEUE_LIMIT, PULSAR_TLS_ALLOW_INSECURE, PULSAR_TLS_CA, - PULSAR_TLS_HOSTNAME_VERIFICATION, PULSAR_TOPIC, PULSAR_USERNAME, REDIS_CHANNEL, REDIS_CONNECTION_TIMEOUT, - REDIS_KEEP_ALIVE_INTERVAL, REDIS_MAX_RETRY_ATTEMPTS, REDIS_MAX_RETRY_DELAY, REDIS_MIN_RETRY_DELAY, REDIS_PASSWORD, - REDIS_PIPELINE_BUFFER_SIZE, REDIS_QUEUE_DIR, REDIS_QUEUE_LIMIT, REDIS_RECONNECT_RETRY_ATTEMPTS, REDIS_RESPONSE_TIMEOUT, - REDIS_TLS_ALLOW_INSECURE, REDIS_TLS_CA, REDIS_TLS_CLIENT_CERT, REDIS_TLS_CLIENT_KEY, REDIS_TLS_POLICY, REDIS_URL, - REDIS_USERNAME, WEBHOOK_AUTH_TOKEN, WEBHOOK_BATCH_SIZE, WEBHOOK_CLIENT_CA, WEBHOOK_CLIENT_CERT, WEBHOOK_CLIENT_KEY, - WEBHOOK_ENDPOINT, WEBHOOK_HTTP_TIMEOUT, WEBHOOK_MAX_RETRY, WEBHOOK_QUEUE_DIR, WEBHOOK_QUEUE_LIMIT, WEBHOOK_RETRY_INTERVAL, - WEBHOOK_SKIP_TLS_VERIFY, + COMMENT_KEY, DEFAULT_LIMIT, ENABLE_KEY, EVENT_DEFAULT_DIR, EnableState, MQTT_BROKER, MQTT_KEEP_ALIVE_INTERVAL, MQTT_PASSWORD, + MQTT_QOS, MQTT_QUEUE_DIR, MQTT_QUEUE_LIMIT, MQTT_RECONNECT_INTERVAL, MQTT_TLS_CA, MQTT_TLS_CLIENT_CERT, MQTT_TLS_CLIENT_KEY, + MQTT_TLS_POLICY, MQTT_TLS_TRUST_LEAF_AS_CA, MQTT_TOPIC, MQTT_USERNAME, MQTT_WS_PATH_ALLOWLIST, WEBHOOK_AUTH_TOKEN, + WEBHOOK_BATCH_SIZE, WEBHOOK_CLIENT_CA, WEBHOOK_CLIENT_CERT, WEBHOOK_CLIENT_KEY, WEBHOOK_ENDPOINT, WEBHOOK_HTTP_TIMEOUT, + WEBHOOK_MAX_RETRY, WEBHOOK_QUEUE_DIR, WEBHOOK_QUEUE_LIMIT, WEBHOOK_RETRY_INTERVAL, WEBHOOK_SKIP_TLS_VERIFY, }; use std::sync::LazyLock; @@ -208,542 +193,18 @@ pub static DEFAULT_AUDIT_MQTT_KVS: LazyLock = LazyLock::new(|| { ]) }); -pub static DEFAULT_AUDIT_AMQP_KVS: LazyLock = LazyLock::new(|| { - KVS(vec![ - KV { - key: ENABLE_KEY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: AMQP_URL.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: AMQP_EXCHANGE.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: AMQP_ROUTING_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: AMQP_MANDATORY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: AMQP_PERSISTENT.to_owned(), - value: EnableState::On.to_string(), - hidden_if_empty: false, - }, - KV { - key: AMQP_USERNAME.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: AMQP_PASSWORD.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: AMQP_TLS_CA.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: AMQP_TLS_CLIENT_CERT.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: AMQP_TLS_CLIENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: AMQP_QUEUE_DIR.to_owned(), - value: EVENT_DEFAULT_DIR.to_owned(), - hidden_if_empty: false, - }, - KV { - key: AMQP_QUEUE_LIMIT.to_owned(), - value: DEFAULT_LIMIT.to_string(), - hidden_if_empty: false, - }, - KV { - key: COMMENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - ]) -}); +// The remaining targets declare the same defaults as notify, so both sides build them from +// `target_defaults`. Redis and mysql pass in the single default that audit and notify disagree on. +pub static DEFAULT_AUDIT_AMQP_KVS: LazyLock = LazyLock::new(amqp_kvs); -pub static DEFAULT_AUDIT_NATS_KVS: LazyLock = LazyLock::new(|| { - KVS(vec![ - KV { - key: ENABLE_KEY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: NATS_ADDRESS.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: NATS_SUBJECT.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: NATS_USERNAME.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: NATS_PASSWORD.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: NATS_TOKEN.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: NATS_CREDENTIALS_FILE.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: NATS_TLS_CA.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: NATS_TLS_CLIENT_CERT.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: NATS_TLS_CLIENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: NATS_TLS_REQUIRED.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: NATS_QUEUE_DIR.to_owned(), - value: EVENT_DEFAULT_DIR.to_owned(), - hidden_if_empty: false, - }, - KV { - key: NATS_QUEUE_LIMIT.to_owned(), - value: DEFAULT_LIMIT.to_string(), - hidden_if_empty: false, - }, - KV { - key: NATS_JETSTREAM_ENABLE.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: NATS_JETSTREAM_STREAM_NAME.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: NATS_JETSTREAM_ACK_TIMEOUT_SECS.to_owned(), - value: NATS_JETSTREAM_ACK_TIMEOUT_DEFAULT_SECS.to_string(), - hidden_if_empty: false, - }, - KV { - key: COMMENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - ]) -}); +pub static DEFAULT_AUDIT_NATS_KVS: LazyLock = LazyLock::new(nats_kvs); -pub static DEFAULT_AUDIT_PULSAR_KVS: LazyLock = LazyLock::new(|| { - KVS(vec![ - KV { - key: ENABLE_KEY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: PULSAR_BROKER.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: PULSAR_TOPIC.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: PULSAR_AUTH_TOKEN.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: PULSAR_USERNAME.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: PULSAR_PASSWORD.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: PULSAR_TLS_CA.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: PULSAR_TLS_ALLOW_INSECURE.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: PULSAR_TLS_HOSTNAME_VERIFICATION.to_owned(), - value: EnableState::On.to_string(), - hidden_if_empty: false, - }, - KV { - key: PULSAR_QUEUE_DIR.to_owned(), - value: EVENT_DEFAULT_DIR.to_owned(), - hidden_if_empty: false, - }, - KV { - key: PULSAR_QUEUE_LIMIT.to_owned(), - value: DEFAULT_LIMIT.to_string(), - hidden_if_empty: false, - }, - KV { - key: COMMENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - ]) -}); +pub static DEFAULT_AUDIT_PULSAR_KVS: LazyLock = LazyLock::new(pulsar_kvs); -pub static DEFAULT_AUDIT_REDIS_KVS: LazyLock = LazyLock::new(|| { - KVS(vec![ - KV { - key: ENABLE_KEY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: REDIS_URL.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_CHANNEL.to_owned(), - value: AUDIT_REDIS_DEFAULT_CHANNEL.to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_USERNAME.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_PASSWORD.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: REDIS_KEEP_ALIVE_INTERVAL.to_owned(), - value: "15".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_QUEUE_DIR.to_owned(), - value: EVENT_DEFAULT_DIR.to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_QUEUE_LIMIT.to_owned(), - value: DEFAULT_LIMIT.to_string(), - hidden_if_empty: false, - }, - KV { - key: REDIS_MAX_RETRY_ATTEMPTS.to_owned(), - value: "3".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_RECONNECT_RETRY_ATTEMPTS.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_MIN_RETRY_DELAY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_MAX_RETRY_DELAY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_CONNECTION_TIMEOUT.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_RESPONSE_TIMEOUT.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_PIPELINE_BUFFER_SIZE.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: REDIS_TLS_POLICY.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: REDIS_TLS_CA.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: REDIS_TLS_CLIENT_CERT.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: REDIS_TLS_CLIENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: REDIS_TLS_ALLOW_INSECURE.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: COMMENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - ]) -}); +pub static DEFAULT_AUDIT_REDIS_KVS: LazyLock = LazyLock::new(|| redis_kvs(AUDIT_REDIS_DEFAULT_CHANNEL)); -pub static DEFAULT_AUDIT_POSTGRES_KVS: LazyLock = LazyLock::new(|| { - KVS(vec![ - KV { - key: ENABLE_KEY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: POSTGRES_DSN_STRING.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: POSTGRES_TABLE.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: POSTGRES_FORMAT.to_owned(), - value: "namespace".to_owned(), - hidden_if_empty: false, - }, - KV { - key: POSTGRES_TLS_REQUIRED.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: POSTGRES_TLS_CA.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: POSTGRES_TLS_CLIENT_CERT.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: POSTGRES_TLS_CLIENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: POSTGRES_QUEUE_DIR.to_owned(), - value: EVENT_DEFAULT_DIR.to_owned(), - hidden_if_empty: false, - }, - KV { - key: POSTGRES_QUEUE_LIMIT.to_owned(), - value: DEFAULT_LIMIT.to_string(), - hidden_if_empty: false, - }, - KV { - key: COMMENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - ]) -}); +pub static DEFAULT_AUDIT_POSTGRES_KVS: LazyLock = LazyLock::new(postgres_kvs); -pub static DEFAULT_AUDIT_KAFKA_KVS: LazyLock = LazyLock::new(|| { - KVS(vec![ - KV { - key: ENABLE_KEY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_BROKERS.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_TOPIC.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_ACKS.to_owned(), - value: "1".to_owned(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_TLS_ENABLE.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_TLS_CA.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: KAFKA_TLS_CLIENT_CERT.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: KAFKA_TLS_CLIENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: KAFKA_SASL_ENABLE.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_SASL_MECHANISM.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_SASL_USERNAME.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_SASL_PASSWORD.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: KAFKA_QUEUE_DIR.to_owned(), - value: EVENT_DEFAULT_DIR.to_owned(), - hidden_if_empty: false, - }, - KV { - key: KAFKA_QUEUE_LIMIT.to_owned(), - value: DEFAULT_LIMIT.to_string(), - hidden_if_empty: false, - }, - KV { - key: COMMENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - ]) -}); +pub static DEFAULT_AUDIT_KAFKA_KVS: LazyLock = LazyLock::new(kafka_kvs); -pub static DEFAULT_AUDIT_MYSQL_KVS: LazyLock = LazyLock::new(|| { - KVS(vec![ - KV { - key: ENABLE_KEY.to_owned(), - value: EnableState::Off.to_string(), - hidden_if_empty: false, - }, - KV { - key: MYSQL_DSN_STRING.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: MYSQL_TABLE.to_owned(), - value: "rustfs_audit_logs".to_owned(), - hidden_if_empty: false, - }, - KV { - key: MYSQL_FORMAT.to_owned(), - value: "access".to_owned(), - hidden_if_empty: false, - }, - KV { - key: MYSQL_TLS_CA.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: MYSQL_TLS_CLIENT_CERT.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: MYSQL_TLS_CLIENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: true, - }, - KV { - key: MYSQL_QUEUE_DIR.to_owned(), - value: EVENT_DEFAULT_DIR.to_owned(), - hidden_if_empty: false, - }, - KV { - key: MYSQL_QUEUE_LIMIT.to_owned(), - value: DEFAULT_LIMIT.to_string(), - hidden_if_empty: false, - }, - KV { - key: MYSQL_MAX_OPEN_CONNECTIONS.to_owned(), - value: "2".to_owned(), - hidden_if_empty: false, - }, - KV { - key: COMMENT_KEY.to_owned(), - value: "".to_owned(), - hidden_if_empty: false, - }, - ]) -}); +pub static DEFAULT_AUDIT_MYSQL_KVS: LazyLock = LazyLock::new(|| mysql_kvs("rustfs_audit_logs"));