use boxferry_model::Identifier;
use podman_lens::{CapabilityCatalogueEntry, ResourceGraph, ResourceInventory};
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct PodmanPromotionPolicy {
enabled: u8,
}
const EFFECTIVE_BIND_MOUNTS: u8 = 1 << 0;
const EFFECTIVE_NAMED_VOLUME_MOUNTS: u8 = 1 << 1;
const EFFECTIVE_NAMED_NETWORKS: u8 = 1 << 2;
const PORTABLE_EFFECTIVE_SETTINGS: u8 = 1 << 3;
impl PodmanPromotionPolicy {
#[must_use]
pub const fn conservative() -> Self {
Self { enabled: 0 }
}
#[must_use]
pub const fn portable_application() -> Self {
Self {
enabled: EFFECTIVE_NAMED_VOLUME_MOUNTS | EFFECTIVE_NAMED_NETWORKS | PORTABLE_EFFECTIVE_SETTINGS,
}
}
#[must_use]
pub const fn with_effective_bind_mounts(mut self, enabled: bool) -> Self {
self.set(EFFECTIVE_BIND_MOUNTS, enabled);
self
}
#[must_use]
pub const fn with_effective_named_volume_mounts(mut self, enabled: bool) -> Self {
self.set(EFFECTIVE_NAMED_VOLUME_MOUNTS, enabled);
self
}
#[must_use]
pub const fn with_effective_named_networks(mut self, enabled: bool) -> Self {
self.set(EFFECTIVE_NAMED_NETWORKS, enabled);
self
}
#[must_use]
pub const fn with_portable_effective_settings(mut self, enabled: bool) -> Self {
self.set(PORTABLE_EFFECTIVE_SETTINGS, enabled);
self
}
#[must_use]
pub const fn promotes_effective_named_volume_mounts(self) -> bool {
self.contains(EFFECTIVE_NAMED_VOLUME_MOUNTS)
}
#[must_use]
pub const fn promotes_effective_bind_mounts(self) -> bool {
self.contains(EFFECTIVE_BIND_MOUNTS)
}
#[must_use]
pub const fn promotes_effective_named_networks(self) -> bool {
self.contains(EFFECTIVE_NAMED_NETWORKS)
}
#[must_use]
pub const fn promotes_portable_effective_settings(self) -> bool {
self.contains(PORTABLE_EFFECTIVE_SETTINGS)
}
const fn set(&mut self, flag: u8, value: bool) {
if value {
self.enabled |= flag;
} else {
self.enabled &= !flag;
}
}
const fn contains(self, flag: u8) -> bool {
self.enabled & flag != 0
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct PodmanSource {
application_name: Identifier,
inventory: ResourceInventory,
graph: ResourceGraph,
promotion_policy: PodmanPromotionPolicy,
}
impl PodmanSource {
#[must_use]
pub const fn new(application_name: Identifier, inventory: ResourceInventory, graph: ResourceGraph) -> Self {
Self {
application_name,
inventory,
graph,
promotion_policy: PodmanPromotionPolicy::conservative(),
}
}
#[must_use]
pub const fn application_name(&self) -> &Identifier {
&self.application_name
}
#[must_use]
pub const fn inventory(&self) -> &ResourceInventory {
&self.inventory
}
#[must_use]
pub const fn graph(&self) -> &ResourceGraph {
&self.graph
}
#[must_use]
pub fn observed_engine_version(&self) -> &str {
self.inventory.service().engine_version().original()
}
#[must_use]
pub fn observed_api_version(&self) -> &str {
self.inventory.service().api_version().original()
}
#[must_use]
pub fn input_capability(&self) -> &CapabilityCatalogueEntry {
self.inventory.service().input_capability()
}
#[must_use]
pub fn redacted_inventory_snapshot(&self) -> podman_lens::snapshot::v1::InventorySnapshot {
podman_lens::snapshot::v1::inventory(&self.inventory)
}
#[must_use]
pub fn redacted_graph_snapshot(&self) -> podman_lens::snapshot::v1::GraphSnapshot {
podman_lens::snapshot::v1::graph(&self.graph)
}
#[must_use]
pub const fn with_promotion_policy(mut self, policy: PodmanPromotionPolicy) -> Self {
self.promotion_policy = policy;
self
}
#[must_use]
pub const fn promotion_policy(&self) -> PodmanPromotionPolicy {
self.promotion_policy
}
}