mirror of
https://github.com/kata-containers/cgroups-rs.git
synced 2026-08-05 02:13:23 +00:00
Merge pull request #154 from justxuewei/systemd-version
systemd: Do not check systemd version
This commit is contained in:
15
src/lib.rs
15
src/lib.rs
@@ -72,22 +72,11 @@ pub mod tests {
|
|||||||
child
|
child
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn systemd_version() -> Option<usize> {
|
pub fn systemd_version() -> Option<String> {
|
||||||
let output = Command::new("systemd").arg("--version").output().ok()?; // Return None if command execution fails
|
let output = Command::new("systemd").arg("--version").output().ok()?; // Return None if command execution fails
|
||||||
|
|
||||||
if !output.status.success() {
|
if !output.status.success() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
Some(String::from_utf8_lossy(&output.stdout).to_string())
|
||||||
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
||||||
|
|
||||||
// The first line is typically like "systemd 254 (254.5-1-arch)"
|
|
||||||
let first_line = stdout.lines().next()?;
|
|
||||||
let mut words = first_line.split_whitespace();
|
|
||||||
|
|
||||||
words.next()?; // Skip the "systemd" word
|
|
||||||
let version_str = words.next()?; // The version number as string
|
|
||||||
|
|
||||||
version_str.parse::<usize>().ok()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,31 +91,21 @@ impl SystemdManager<'_> {
|
|||||||
&self.unit
|
&self.unit
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_cpuset(
|
fn set_cpuset(&self, props: &mut Vec<Property>, linux_cpu: &LinuxCpu) -> Result<()> {
|
||||||
&self,
|
|
||||||
props: &mut Vec<Property>,
|
|
||||||
linux_cpu: &LinuxCpu,
|
|
||||||
systemd_version: usize,
|
|
||||||
) -> Result<()> {
|
|
||||||
if let Some(cpus) = linux_cpu.cpus().as_ref() {
|
if let Some(cpus) = linux_cpu.cpus().as_ref() {
|
||||||
let (id, value) = cpuset::cpus(cpus, systemd_version)?;
|
let (id, value) = cpuset::cpus(cpus)?;
|
||||||
props.push((id, value.into()));
|
props.push((id, value.into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(mems) = linux_cpu.mems().as_ref() {
|
if let Some(mems) = linux_cpu.mems().as_ref() {
|
||||||
let (id, value) = cpuset::mems(mems, systemd_version)?;
|
let (id, value) = cpuset::mems(mems)?;
|
||||||
props.push((id, value.into()));
|
props.push((id, value.into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_cpu(
|
fn set_cpu(&self, props: &mut Vec<Property>, linux_cpu: &LinuxCpu) -> Result<()> {
|
||||||
&self,
|
|
||||||
props: &mut Vec<Property>,
|
|
||||||
linux_cpu: &LinuxCpu,
|
|
||||||
systemd_version: usize,
|
|
||||||
) -> Result<()> {
|
|
||||||
if let Some(shares) = linux_cpu.shares() {
|
if let Some(shares) = linux_cpu.shares() {
|
||||||
let shares = if self.v2() {
|
let shares = if self.v2() {
|
||||||
conv::cpu_shares_to_cgroup_v2(shares)
|
conv::cpu_shares_to_cgroup_v2(shares)
|
||||||
@@ -130,7 +120,7 @@ impl SystemdManager<'_> {
|
|||||||
let quota = linux_cpu.quota().unwrap_or(0);
|
let quota = linux_cpu.quota().unwrap_or(0);
|
||||||
|
|
||||||
if period != 0 {
|
if period != 0 {
|
||||||
let (id, value) = cpu::period(period, systemd_version)?;
|
let (id, value) = cpu::period(period)?;
|
||||||
props.push((id, value.into()));
|
props.push((id, value.into()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,11 +262,9 @@ impl Manager for SystemdManager<'_> {
|
|||||||
fn set(&mut self, resources: &LinuxResources) -> Result<()> {
|
fn set(&mut self, resources: &LinuxResources) -> Result<()> {
|
||||||
let mut props = vec![];
|
let mut props = vec![];
|
||||||
|
|
||||||
let systemd_version = self.systemd_client.systemd_version()?;
|
|
||||||
|
|
||||||
if let Some(linux_cpu) = resources.cpu() {
|
if let Some(linux_cpu) = resources.cpu() {
|
||||||
self.set_cpuset(&mut props, linux_cpu, systemd_version)?;
|
self.set_cpuset(&mut props, linux_cpu)?;
|
||||||
self.set_cpu(&mut props, linux_cpu, systemd_version)?;
|
self.set_cpu(&mut props, linux_cpu)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(linux_memory) = resources.memory() {
|
if let Some(linux_memory) = resources.memory() {
|
||||||
|
|||||||
@@ -3,10 +3,8 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0 or MIT
|
// SPDX-License-Identifier: Apache-2.0 or MIT
|
||||||
//
|
//
|
||||||
|
|
||||||
use crate::systemd::error::{Error, Result};
|
use crate::systemd::error::Result;
|
||||||
use crate::systemd::{
|
use crate::systemd::{CPU_QUOTA_PERIOD_US, CPU_QUOTA_PER_SEC_US, CPU_SHARES, CPU_WEIGHT};
|
||||||
CPU_QUOTA_PERIOD_US, CPU_QUOTA_PER_SEC_US, CPU_SHARES, CPU_SYSTEMD_VERSION, CPU_WEIGHT,
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Returns the property for CPU shares.
|
/// Returns the property for CPU shares.
|
||||||
///
|
///
|
||||||
@@ -21,11 +19,7 @@ pub fn shares(shares: u64, v2: bool) -> Result<(&'static str, u64)> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the property for CPU period.
|
/// Returns the property for CPU period.
|
||||||
pub fn period(period: u64, systemd_version: usize) -> Result<(&'static str, u64)> {
|
pub fn period(period: u64) -> Result<(&'static str, u64)> {
|
||||||
if systemd_version < CPU_SYSTEMD_VERSION {
|
|
||||||
return Err(Error::ObsoleteSystemd);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok((CPU_QUOTA_PERIOD_US, period))
|
Ok((CPU_QUOTA_PERIOD_US, period))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,29 +6,19 @@
|
|||||||
use bit_vec::BitVec;
|
use bit_vec::BitVec;
|
||||||
|
|
||||||
use crate::systemd::error::{Error, Result};
|
use crate::systemd::error::{Error, Result};
|
||||||
use crate::systemd::{ALLOWED_CPUS, ALLOWED_MEMORY_NODES, CPUSET_SYSTEMD_VERSION};
|
use crate::systemd::{ALLOWED_CPUS, ALLOWED_MEMORY_NODES};
|
||||||
|
|
||||||
const BYTE_IN_BITS: usize = 8;
|
const BYTE_IN_BITS: usize = 8;
|
||||||
|
|
||||||
/// Returns the property for cpuset CPUs.
|
/// Returns the property for cpuset CPUs.
|
||||||
pub fn cpus(cpus: &str, systemd_version: usize) -> Result<(&'static str, Vec<u8>)> {
|
pub fn cpus(cpus: &str) -> Result<(&'static str, Vec<u8>)> {
|
||||||
if systemd_version < CPUSET_SYSTEMD_VERSION {
|
|
||||||
return Err(Error::ObsoleteSystemd);
|
|
||||||
}
|
|
||||||
|
|
||||||
let mask = convert_list_to_mask(cpus)?;
|
let mask = convert_list_to_mask(cpus)?;
|
||||||
|
|
||||||
Ok((ALLOWED_CPUS, mask))
|
Ok((ALLOWED_CPUS, mask))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the property for cpuset memory nodes.
|
/// Returns the property for cpuset memory nodes.
|
||||||
pub fn mems(mems: &str, systemd_version: usize) -> Result<(&'static str, Vec<u8>)> {
|
pub fn mems(mems: &str) -> Result<(&'static str, Vec<u8>)> {
|
||||||
if systemd_version < CPUSET_SYSTEMD_VERSION {
|
|
||||||
return Err(Error::ObsoleteSystemd);
|
|
||||||
}
|
|
||||||
|
|
||||||
let mask = convert_list_to_mask(mems)?;
|
let mask = convert_list_to_mask(mems)?;
|
||||||
|
|
||||||
Ok((ALLOWED_MEMORY_NODES, mask))
|
Ok((ALLOWED_MEMORY_NODES, mask))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -143,21 +143,6 @@ impl SystemdClient<'_> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the systemd version.
|
|
||||||
pub fn systemd_version(&self) -> Result<usize> {
|
|
||||||
let sys_proxy = systemd_manager_proxy()?;
|
|
||||||
|
|
||||||
// Parse 249 from "249.11-0ubuntu3.16"
|
|
||||||
let version = sys_proxy.version()?;
|
|
||||||
let version = version
|
|
||||||
.split('.')
|
|
||||||
.next()
|
|
||||||
.and_then(|v| v.parse::<usize>().ok())
|
|
||||||
.ok_or(Error::CorruptedSystemdVersion(version))?;
|
|
||||||
|
|
||||||
Ok(version)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Check if the unit exists.
|
/// Check if the unit exists.
|
||||||
pub fn exists(&self) -> bool {
|
pub fn exists(&self) -> bool {
|
||||||
let sys_proxy = match systemd_manager_proxy() {
|
let sys_proxy = match systemd_manager_proxy() {
|
||||||
@@ -216,7 +201,7 @@ pub mod tests {
|
|||||||
use crate::systemd::props::PropertiesBuilder;
|
use crate::systemd::props::PropertiesBuilder;
|
||||||
use crate::systemd::utils::expand_slice;
|
use crate::systemd::utils::expand_slice;
|
||||||
use crate::systemd::{DEFAULT_DESCRIPTION, DESCRIPTION, PIDS};
|
use crate::systemd::{DEFAULT_DESCRIPTION, DESCRIPTION, PIDS};
|
||||||
use crate::tests::{spawn_sleep_inf, spawn_yes, systemd_version};
|
use crate::tests::{spawn_sleep_inf, spawn_yes};
|
||||||
|
|
||||||
const TEST_SLICE: &str = "cgroupsrs-test.slice";
|
const TEST_SLICE: &str = "cgroupsrs-test.slice";
|
||||||
|
|
||||||
@@ -504,19 +489,6 @@ pub mod tests {
|
|||||||
child.wait().unwrap();
|
child.wait().unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_systemd_version() {
|
|
||||||
skip_if_no_systemd!();
|
|
||||||
|
|
||||||
let unit = test_unit();
|
|
||||||
let props = PropertiesBuilder::default_cgroup(TEST_SLICE, &unit).build();
|
|
||||||
let cgroup = SystemdClient::new(&unit, props).unwrap();
|
|
||||||
let version = cgroup.systemd_version().unwrap();
|
|
||||||
|
|
||||||
let expected_version = systemd_version().unwrap();
|
|
||||||
assert_eq!(version, expected_version, "Systemd version mismatch");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_exists() {
|
fn test_exists() {
|
||||||
skip_if_no_systemd!();
|
skip_if_no_systemd!();
|
||||||
|
|||||||
@@ -12,7 +12,4 @@ pub enum Error {
|
|||||||
|
|
||||||
#[error("dbus error: {0}")]
|
#[error("dbus error: {0}")]
|
||||||
Dbus(#[from] zbus::Error),
|
Dbus(#[from] zbus::Error),
|
||||||
|
|
||||||
#[error("corrupted systemd version: {0}")]
|
|
||||||
CorruptedSystemdVersion(String),
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,9 +10,6 @@ pub enum Error {
|
|||||||
#[error("invalid argument")]
|
#[error("invalid argument")]
|
||||||
InvalidArgument,
|
InvalidArgument,
|
||||||
|
|
||||||
#[error("obsolete systemd, please upgrade your systemd")]
|
|
||||||
ObsoleteSystemd,
|
|
||||||
|
|
||||||
#[error("resource not supported by cgroups v1")]
|
#[error("resource not supported by cgroups v1")]
|
||||||
CgroupsV1NotSupported,
|
CgroupsV1NotSupported,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,3 @@ pub const DEFAULT_SLICE: &str = "system.slice";
|
|||||||
|
|
||||||
pub const SLICE_SUFFIX: &str = ".slice";
|
pub const SLICE_SUFFIX: &str = ".slice";
|
||||||
pub const SCOPE_SUFFIX: &str = ".scope";
|
pub const SCOPE_SUFFIX: &str = ".scope";
|
||||||
|
|
||||||
pub const CPU_SYSTEMD_VERSION: usize = 242;
|
|
||||||
pub const CPUSET_SYSTEMD_VERSION: usize = 244;
|
|
||||||
|
|||||||
Reference in New Issue
Block a user