Skip to content

Commit b8d6b66

Browse files
committed
vmm: Deprecate static CPU templates
Deprecates the `cpu_template` field in `/machine-config` API. Signed-off-by: Takahiro Itazuri <itazur@amazon.com>
1 parent 0c3c9fc commit b8d6b66

File tree

2 files changed

+58
-13
lines changed

2 files changed

+58
-13
lines changed

src/api_server/src/request/machine_configuration.rs

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,25 @@ pub(crate) fn parse_put_machine_config(body: &Body) -> Result<ParsedRequest, Err
2020
err
2121
})?;
2222

23+
// Check for the presence of deprecated `cpu_template` field.
24+
let mut deprecation_message = None;
25+
if config.cpu_template.is_some() {
26+
// `cpu_template` field in request is deprecated.
27+
METRICS.deprecated_api.deprecated_http_api_calls.inc();
28+
deprecation_message = Some("PUT /machine-config: cpu_template field is deprecated.");
29+
}
30+
31+
// Convert `MachineConfig` to `MachineConfigUpdate`.
2332
let config_update = MachineConfigUpdate::from(config);
2433

25-
Ok(ParsedRequest::new_sync(VmmAction::UpdateVmConfiguration(
26-
config_update,
27-
)))
34+
// Construct the `ParsedRequest` object.
35+
let mut parsed_req = ParsedRequest::new_sync(VmmAction::UpdateVmConfiguration(config_update));
36+
// If `cpu_template` was present, set the deprecation message in `parsing_info`.
37+
if let Some(msg) = deprecation_message {
38+
parsed_req.parsing_info().append_deprecation_message(msg);
39+
}
40+
41+
Ok(parsed_req)
2842
}
2943

3044
pub(crate) fn parse_patch_machine_config(body: &Body) -> Result<ParsedRequest, Error> {
@@ -39,9 +53,22 @@ pub(crate) fn parse_patch_machine_config(body: &Body) -> Result<ParsedRequest, E
3953
return method_to_error(Method::Patch);
4054
}
4155

42-
Ok(ParsedRequest::new_sync(VmmAction::UpdateVmConfiguration(
43-
config_update,
44-
)))
56+
// Check for the presence of deprecated `cpu_template` field.
57+
let mut deprecation_message = None;
58+
if config_update.cpu_template.is_some() {
59+
// `cpu_template` field in request is deprecated.
60+
METRICS.deprecated_api.deprecated_http_api_calls.inc();
61+
deprecation_message = Some("PATCH /machine-config: cpu_template is deprecated.");
62+
}
63+
64+
// Construct the `ParsedRequest` object.
65+
let mut parsed_req = ParsedRequest::new_sync(VmmAction::UpdateVmConfiguration(config_update));
66+
// If `cpu_template` was present, set the deprecation message in `parsing_info`.
67+
if let Some(msg) = deprecation_message {
68+
parsed_req.parsing_info().append_deprecation_message(msg);
69+
}
70+
71+
Ok(parsed_req)
4572
}
4673

4774
#[cfg(test)]
@@ -78,7 +105,25 @@ mod tests {
78105
let body = r#"{
79106
"vcpu_count": 8,
80107
"mem_size_mib": 1024
81-
}"#;
108+
}"#;
109+
let expected_config = MachineConfigUpdate {
110+
vcpu_count: Some(8),
111+
mem_size_mib: Some(1024),
112+
smt: Some(false),
113+
cpu_template: None,
114+
track_dirty_pages: Some(false),
115+
};
116+
117+
match vmm_action_from_request(parse_put_machine_config(&Body::new(body)).unwrap()) {
118+
VmmAction::UpdateVmConfiguration(config) => assert_eq!(config, expected_config),
119+
_ => panic!("Test failed."),
120+
}
121+
122+
let body = r#"{
123+
"vcpu_count": 8,
124+
"mem_size_mib": 1024,
125+
"cpu_template": "None"
126+
}"#;
82127
let expected_config = MachineConfigUpdate {
83128
vcpu_count: Some(8),
84129
mem_size_mib: Some(1024),
@@ -102,7 +147,7 @@ mod tests {
102147
vcpu_count: Some(8),
103148
mem_size_mib: Some(1024),
104149
smt: Some(false),
105-
cpu_template: Some(StaticCpuTemplate::None),
150+
cpu_template: None,
106151
track_dirty_pages: Some(true),
107152
};
108153

@@ -155,7 +200,7 @@ mod tests {
155200
vcpu_count: Some(8),
156201
mem_size_mib: Some(1024),
157202
smt: Some(true),
158-
cpu_template: Some(StaticCpuTemplate::None),
203+
cpu_template: None,
159204
track_dirty_pages: Some(true),
160205
};
161206

src/vmm/src/vmm_config/machine_config.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ pub struct MachineConfig {
4040
#[serde(default, deserialize_with = "deserialize_smt")]
4141
pub smt: bool,
4242
/// A CPU template that it is used to filter the CPU features exposed to the guest.
43-
#[serde(default, skip_serializing_if = "StaticCpuTemplate::is_none")]
44-
pub cpu_template: StaticCpuTemplate,
43+
#[serde(default, skip_serializing_if = "Option::is_none")]
44+
pub cpu_template: Option<StaticCpuTemplate>,
4545
/// Enables or disables dirty page tracking. Enabling allows incremental snapshots.
4646
#[serde(default)]
4747
pub track_dirty_pages: bool,
@@ -122,7 +122,7 @@ impl From<MachineConfig> for MachineConfigUpdate {
122122
vcpu_count: Some(cfg.vcpu_count),
123123
mem_size_mib: Some(cfg.mem_size_mib),
124124
smt: Some(cfg.smt),
125-
cpu_template: Some(cfg.cpu_template),
125+
cpu_template: cfg.cpu_template,
126126
track_dirty_pages: Some(cfg.track_dirty_pages),
127127
}
128128
}
@@ -212,7 +212,7 @@ impl From<&VmConfig> for MachineConfig {
212212
vcpu_count: value.vcpu_count,
213213
mem_size_mib: value.mem_size_mib,
214214
smt: value.smt,
215-
cpu_template: (&value.cpu_template).into(),
215+
cpu_template: Some((&value.cpu_template).into()),
216216
track_dirty_pages: value.track_dirty_pages,
217217
}
218218
}

0 commit comments

Comments
 (0)