[pdm-devel] [PATCH datacenter-manager v3 01/18] lib: pdm-config: views: add locking/saving methods
Dominik Csapak
d.csapak at proxmox.com
Mon Nov 17 13:44:23 CET 2025
Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
lib/pdm-config/src/views.rs | 22 +++++++++++++++++++---
server/src/views/mod.rs | 2 +-
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/lib/pdm-config/src/views.rs b/lib/pdm-config/src/views.rs
index 59c02a66..5f523d07 100644
--- a/lib/pdm-config/src/views.rs
+++ b/lib/pdm-config/src/views.rs
@@ -1,17 +1,33 @@
use anyhow::Error;
+use proxmox_product_config::{open_api_lockfile, replace_config, ApiLockGuard};
use proxmox_section_config::typed::{ApiSectionDataEntry, SectionConfigData};
-use pdm_api_types::views::ViewConfigEntry;
+use pdm_api_types::{views::ViewConfigEntry, ConfigDigest};
use pdm_buildcfg::configdir;
const VIEW_CFG_FILENAME: &str = configdir!("/views.cfg");
+const VIEW_FILTER_CFG_LOCKFILE: &str = configdir!("/.views.lock");
/// Get the `views.cfg` config file contents.
-pub fn config() -> Result<SectionConfigData<ViewConfigEntry>, Error> {
+pub fn config() -> Result<(SectionConfigData<ViewConfigEntry>, ConfigDigest), Error> {
let content =
proxmox_sys::fs::file_read_optional_string(VIEW_CFG_FILENAME)?.unwrap_or_default();
- ViewConfigEntry::parse_section_config(VIEW_CFG_FILENAME, &content)
+ let digest = openssl::sha::sha256(content.as_bytes());
+
+ let data = ViewConfigEntry::parse_section_config(VIEW_CFG_FILENAME, &content)?;
+ Ok((data, digest.into()))
+}
+
+/// Get exclusive lock
+pub fn lock_config() -> Result<ApiLockGuard, Error> {
+ open_api_lockfile(VIEW_FILTER_CFG_LOCKFILE, None, true)
+}
+
+pub fn save_config(config: &SectionConfigData<ViewConfigEntry>) -> Result<(), Error> {
+ let raw = ViewConfigEntry::write_section_config(VIEW_CFG_FILENAME, config)?;
+ replace_config(VIEW_CFG_FILENAME, raw.as_bytes())?;
+ Ok(())
}
diff --git a/server/src/views/mod.rs b/server/src/views/mod.rs
index 80f8425c..04d39620 100644
--- a/server/src/views/mod.rs
+++ b/server/src/views/mod.rs
@@ -13,7 +13,7 @@ mod tests;
/// Returns an error if the view configuration file could not be read, or
/// if the view with the provided ID does not exist.
pub fn get_view(view_id: &str) -> Result<View, Error> {
- let config = pdm_config::views::config()?;
+ let (config, _) = pdm_config::views::config()?;
let entry = config
.get(view_id)
--
2.47.3
More information about the pdm-devel
mailing list