diff --git a/src/api2/node/tasks.rs b/src/api2/node/tasks.rs index 79e0a5fc..e7cc6a25 100644 --- a/src/api2/node/tasks.rs +++ b/src/api2/node/tasks.rs @@ -156,14 +156,7 @@ fn stop_task( returns: { description: "A list of tasks.", type: Array, - items: { - description: "Task properties.", - type: Object, - properties: { - upid: { schema: UPID_SCHEMA }, - // fixme: add other properties - }, - }, + items: { type: TaskListItem }, }, )] /// List tasks. @@ -171,7 +164,7 @@ fn list_tasks( param: Value, _info: &ApiMethod, rpcenv: &mut dyn RpcEnvironment, -) -> Result { +) -> Result, Error> { let start = param["start"].as_u64().unwrap_or(0); let limit = param["limit"].as_u64().unwrap_or(50); @@ -189,16 +182,18 @@ fn list_tasks( let mut count = 0; for info in list.iter() { - let mut entry = json!({ - "upid": info.upid_str, - "node": "localhost", - "pid": info.upid.pid, - "pstart": info.upid.pstart, - "starttime": info.upid.starttime, - "type": info.upid.worker_type, - "id": info.upid.worker_id, - "user": info.upid.username, - }); + let mut entry = TaskListItem { + upid: info.upid_str.clone(), + node: "localhost".to_string(), + pid: info.upid.pid as i64, + pstart: info.upid.pstart, + starttime: info.upid.starttime, + worker_type: info.upid.worker_type.clone(), + worker_id: info.upid.worker_id.clone(), + user: info.upid.username.clone(), + endtime: None, + status: None, + }; if let Some(username) = userfilter { if !info.upid.username.contains(username) { continue; } @@ -229,8 +224,8 @@ fn list_tasks( continue; } - entry["endtime"] = Value::from(state.0); - entry["status"] = Value::from(state.1.clone()); + entry.endtime = Some(state.0); + entry.status = Some(state.1.clone()); } if (count as u64) < start { @@ -245,7 +240,7 @@ fn list_tasks( rpcenv.set_result_attrib("total", Value::from(count)); - Ok(json!(result)) + Ok(result) } #[sortable] diff --git a/src/api2/types.rs b/src/api2/types.rs index 2999d867..d06a5cc9 100644 --- a/src/api2/types.rs +++ b/src/api2/types.rs @@ -342,6 +342,37 @@ pub struct StorageStatus { pub avail: u64, } +#[api( + properties: { + "upid": { schema: UPID_SCHEMA }, + }, +)] +#[derive(Serialize, Deserialize)] +/// Task properties. +pub struct TaskListItem { + pub upid: String, + /// The node name where the task is running on. + pub node: String, + /// The Unix PID + pub pid: i64, + /// The task start time (Epoch) + pub pstart: u64, + /// The task start time (Epoch) + pub starttime: i64, + /// Worker type (arbitrary ASCII string) + pub worker_type: String, + /// Worker ID (arbitrary ASCII string) + pub worker_id: Option, + /// The user who started the task + pub user: String, + /// The task end time (Epoch) + #[serde(skip_serializing_if="Option::is_none")] + pub endtime: Option, + /// Task end status + #[serde(skip_serializing_if="Option::is_none")] + pub status: Option, +} + // Regression tests #[test]