oci: fix two incompatible issues with OCI spec

The first incompatible issue is caused by a typo, "swapiness" should
be "swappiness". The second incompatible issue is caused by a serde
format. The struct LinuxBlockIODevice is introduced for convenience,
but it also changes serialized data, so "#[serde(flatten)]" should
be used for compatibility with OCI spec.

Fixes: #1211

Signed-off-by: Liu Jiang <gerry@linux.alibaba.com>
This commit is contained in:
Liu Jiang 2020-12-22 11:16:15 +08:00
parent 406a91ffdd
commit 9321e1b21b
3 changed files with 18 additions and 44 deletions

View File

@ -302,6 +302,7 @@ pub struct LinuxBlockIODevice {
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
pub struct LinuxWeightDevice { pub struct LinuxWeightDevice {
#[serde(flatten)]
pub blk: LinuxBlockIODevice, pub blk: LinuxBlockIODevice,
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub weight: Option<u16>, pub weight: Option<u16>,
@ -315,6 +316,7 @@ pub struct LinuxWeightDevice {
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)] #[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq)]
pub struct LinuxThrottleDevice { pub struct LinuxThrottleDevice {
#[serde(flatten)]
pub blk: LinuxBlockIODevice, pub blk: LinuxBlockIODevice,
#[serde(default)] #[serde(default)]
pub rate: u64, pub rate: u64,
@ -375,7 +377,7 @@ pub struct LinuxMemory {
#[serde(default, skip_serializing_if = "Option::is_none", rename = "kernelTCP")] #[serde(default, skip_serializing_if = "Option::is_none", rename = "kernelTCP")]
pub kernel_tcp: Option<i64>, pub kernel_tcp: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub swapiness: Option<i64>, pub swappiness: Option<i64>,
#[serde( #[serde(
default, default,
skip_serializing_if = "Option::is_none", skip_serializing_if = "Option::is_none",
@ -833,7 +835,7 @@ mod tests {
} }
#[test] #[test]
fn test_deserialize_sepc() { fn test_deserialize_spec() {
let data = r#"{ let data = r#"{
"ociVersion": "1.0.1", "ociVersion": "1.0.1",
"process": { "process": {
@ -1118,36 +1120,28 @@ mod tests {
"leafWeight": 10, "leafWeight": 10,
"weightDevice": [ "weightDevice": [
{ {
"blk": { "major": 8,
"major": 8, "minor": 0,
"minor": 0
},
"weight": 500, "weight": 500,
"leafWeight": 300 "leafWeight": 300
}, },
{ {
"blk":{ "major": 8,
"major": 8, "minor": 16,
"minor": 16
},
"weight": 500 "weight": 500
} }
], ],
"throttleReadBpsDevice": [ "throttleReadBpsDevice": [
{ {
"blk":{ "major": 8,
"major": 8, "minor": 0,
"minor": 0
},
"rate": 600 "rate": 600
} }
], ],
"throttleWriteIOPSDevice": [ "throttleWriteIOPSDevice": [
{ {
"blk":{ "major": 8,
"major": 8, "minor": 16,
"minor": 16
},
"rate": 300 "rate": 300
} }
] ]
@ -1436,8 +1430,7 @@ mod tests {
swap: Some(536870912), swap: Some(536870912),
kernel: Some(-1), kernel: Some(-1),
kernel_tcp: Some(-1), kernel_tcp: Some(-1),
// incompatible with oci swappiness: Some(0),
swapiness: None,
disable_oom_killer: Some(false), disable_oom_killer: Some(false),
}), }),
cpu: Some(crate::LinuxCPU { cpu: Some(crate::LinuxCPU {
@ -1590,25 +1583,6 @@ mod tests {
vm: None, vm: None,
}; };
// warning : incompatible with oci : https://github.com/opencontainers/runtime-spec/blob/master/config.md
// 1. User use addtionalGids while oci use additionalGids
// 2. LinuxMemory use swapiness while oci use swappiness
// 3. LinuxWeightDevice with blk
// {
// "blk": {
// "major": 8,
// "minor": 0
// },
// "weight": 500,
// "leafWeight": 300
// }
// oci without blk
// {
// "major": 8,
// "minor": 0,
// "weight": 500,
// "leafWeight": 300
// }
let current: crate::Spec = serde_json::from_str(data).unwrap(); let current: crate::Spec = serde_json::from_str(data).unwrap();
assert_eq!(expected, current); assert_eq!(expected, current);
} }

View File

@ -423,13 +423,13 @@ fn set_memory_resources(cg: &cgroups::Cgroup, memory: &LinuxMemory, update: bool
} }
} }
if let Some(swapiness) = memory.swapiness { if let Some(swappiness) = memory.swappiness {
if swapiness >= 0 && swapiness <= 100 { if swappiness >= 0 && swappiness <= 100 {
mem_controller.set_swappiness(swapiness as u64)?; mem_controller.set_swappiness(swappiness as u64)?;
} else { } else {
return Err(anyhow!( return Err(anyhow!(
"invalid value:{}. valid memory swappiness range is 0-100", "invalid value:{}. valid memory swappiness range is 0-100",
swapiness swappiness
)); ));
} }
} }

View File

@ -310,7 +310,7 @@ pub fn resources_grpc_to_oci(res: &grpcLinuxResources) -> ociLinuxResources {
swap: Some(mem.Swap), swap: Some(mem.Swap),
kernel: Some(mem.Kernel), kernel: Some(mem.Kernel),
kernel_tcp: Some(mem.KernelTCP), kernel_tcp: Some(mem.KernelTCP),
swapiness: Some(mem.Swappiness as i64), swappiness: Some(mem.Swappiness as i64),
disable_oom_killer: Some(mem.DisableOOMKiller), disable_oom_killer: Some(mem.DisableOOMKiller),
}) })
} else { } else {