depend on proxmox 0.1.31 - use Value to store result metadata

This commit is contained in:
Dietmar Maurer 2020-05-18 09:57:35 +02:00
parent 2e686e0a63
commit e8d1da6a15
9 changed files with 42 additions and 51 deletions

View File

@ -37,7 +37,7 @@ pam = "0.7"
pam-sys = "0.5" pam-sys = "0.5"
percent-encoding = "2.1" percent-encoding = "2.1"
pin-utils = "0.1.0" pin-utils = "0.1.0"
proxmox = { version = "0.1.30", features = [ "sortable-macro", "api-macro" ] } proxmox = { version = "0.1.31", features = [ "sortable-macro", "api-macro" ] }
#proxmox = { git = "ssh://gitolite3@proxdev.maurer-it.com/rust/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] } #proxmox = { git = "ssh://gitolite3@proxdev.maurer-it.com/rust/proxmox", version = "0.1.2", features = [ "sortable-macro", "api-macro" ] }
#proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro" ] } #proxmox = { path = "../proxmox/proxmox", features = [ "sortable-macro", "api-macro" ] }
regex = "1.2" regex = "1.2"

View File

@ -2,7 +2,7 @@ use anyhow::{bail, Error};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
use std::collections::HashMap; use std::collections::HashMap;
use serde_json::Value; use serde_json::{json, Value};
use proxmox::tools::digest_to_hex; use proxmox::tools::digest_to_hex;
use proxmox::tools::fs::{replace_file, CreateOptions}; use proxmox::tools::fs::{replace_file, CreateOptions};
@ -80,7 +80,7 @@ impl SharedBackupState {
#[derive(Clone)] #[derive(Clone)]
pub struct BackupEnvironment { pub struct BackupEnvironment {
env_type: RpcEnvironmentType, env_type: RpcEnvironmentType,
result_attributes: HashMap<String, Value>, result_attributes: Value,
user: String, user: String,
pub debug: bool, pub debug: bool,
pub formatter: &'static OutputFormatter, pub formatter: &'static OutputFormatter,
@ -110,7 +110,7 @@ impl BackupEnvironment {
}; };
Self { Self {
result_attributes: HashMap::new(), result_attributes: json!({}),
env_type, env_type,
user, user,
worker, worker,
@ -480,12 +480,12 @@ impl BackupEnvironment {
impl RpcEnvironment for BackupEnvironment { impl RpcEnvironment for BackupEnvironment {
fn set_result_attrib(&mut self, name: &str, value: Value) { fn result_attrib_mut(&mut self) -> &mut Value {
self.result_attributes.insert(name.into(), value); &mut self.result_attributes
} }
fn get_result_attrib(&self, name: &str) -> Option<&Value> { fn result_attrib(&self) -> &Value {
self.result_attributes.get(name) &self.result_attributes
} }
fn env_type(&self) -> RpcEnvironmentType { fn env_type(&self) -> RpcEnvironmentType {

View File

@ -66,7 +66,7 @@ fn check_duplicate_gateway_v6(config: &NetworkConfig, iface: &str) -> Result<(),
pub fn list_network_devices( pub fn list_network_devices(
_param: Value, _param: Value,
_info: &ApiMethod, _info: &ApiMethod,
rpcenv: &mut dyn RpcEnvironment, mut rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let (config, digest) = network::config()?; let (config, digest) = network::config()?;
@ -84,7 +84,7 @@ pub fn list_network_devices(
let diff = network::changes()?; let diff = network::changes()?;
if !diff.is_empty() { if !diff.is_empty() {
rpcenv.set_result_attrib("changes", diff.into()); rpcenv["changes"] = diff.into();
} }
Ok(list.into()) Ok(list.into())

View File

@ -131,7 +131,7 @@ fn dump_journal(
fn get_syslog( fn get_syslog(
param: Value, param: Value,
_info: &ApiMethod, _info: &ApiMethod,
rpcenv: &mut dyn RpcEnvironment, mut rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let (count, lines) = dump_journal( let (count, lines) = dump_journal(
@ -141,7 +141,7 @@ fn get_syslog(
param["until"].as_str(), param["until"].as_str(),
param["service"].as_str())?; param["service"].as_str())?;
rpcenv.set_result_attrib("total", Value::from(count)); rpcenv["total"] = Value::from(count);
Ok(json!(lines)) Ok(json!(lines))
} }

View File

@ -156,7 +156,7 @@ fn extract_upid(param: &Value) -> Result<UPID, Error> {
/// Read task log. /// Read task log.
async fn read_task_log( async fn read_task_log(
param: Value, param: Value,
rpcenv: &mut dyn RpcEnvironment, mut rpcenv: &mut dyn RpcEnvironment,
) -> Result<Value, Error> { ) -> Result<Value, Error> {
let upid = extract_upid(&param)?; let upid = extract_upid(&param)?;
@ -199,11 +199,11 @@ async fn read_task_log(
} }
} }
rpcenv.set_result_attrib("total", Value::from(count)); rpcenv["total"] = Value::from(count);
if test_status { if test_status {
let active = crate::server::worker_is_active(&upid).await?; let active = crate::server::worker_is_active(&upid).await?;
rpcenv.set_result_attrib("active", Value::from(active)); rpcenv["active"] = Value::from(active);
} }
Ok(json!(lines)) Ok(json!(lines))
@ -304,7 +304,7 @@ pub fn list_tasks(
errors: bool, errors: bool,
running: bool, running: bool,
param: Value, param: Value,
rpcenv: &mut dyn RpcEnvironment, mut rpcenv: &mut dyn RpcEnvironment,
) -> Result<Vec<TaskListItem>, Error> { ) -> Result<Vec<TaskListItem>, Error> {
let username = rpcenv.get_user().unwrap(); let username = rpcenv.get_user().unwrap();
@ -382,7 +382,7 @@ pub fn list_tasks(
if (result.len() as u64) < limit { result.push(entry); }; if (result.len() as u64) < limit { result.push(entry); };
} }
rpcenv.set_result_attrib("total", Value::from(count)); rpcenv["total"] = Value::from(count);
Ok(result) Ok(result)
} }

View File

@ -1,8 +1,7 @@
//use anyhow::{bail, format_err, Error}; //use anyhow::{bail, format_err, Error};
use std::sync::Arc; use std::sync::Arc;
use std::collections::HashMap;
use serde_json::Value; use serde_json::{json, Value};
use proxmox::api::{RpcEnvironment, RpcEnvironmentType}; use proxmox::api::{RpcEnvironment, RpcEnvironmentType};
@ -16,7 +15,7 @@ use crate::server::formatter::*;
#[derive(Clone)] #[derive(Clone)]
pub struct ReaderEnvironment { pub struct ReaderEnvironment {
env_type: RpcEnvironmentType, env_type: RpcEnvironmentType,
result_attributes: HashMap<String, Value>, result_attributes: Value,
user: String, user: String,
pub debug: bool, pub debug: bool,
pub formatter: &'static OutputFormatter, pub formatter: &'static OutputFormatter,
@ -37,7 +36,7 @@ impl ReaderEnvironment {
Self { Self {
result_attributes: HashMap::new(), result_attributes: json!({}),
env_type, env_type,
user, user,
worker, worker,
@ -61,12 +60,12 @@ impl ReaderEnvironment {
impl RpcEnvironment for ReaderEnvironment { impl RpcEnvironment for ReaderEnvironment {
fn set_result_attrib(&mut self, name: &str, value: Value) { fn result_attrib_mut(&mut self) -> &mut Value {
self.result_attributes.insert(name.into(), value); &mut self.result_attributes
} }
fn get_result_attrib(&self, name: &str) -> Option<&Value> { fn result_attrib(&self) -> &Value {
self.result_attributes.get(name) &self.result_attributes
} }
fn env_type(&self) -> RpcEnvironmentType { fn env_type(&self) -> RpcEnvironmentType {

View File

@ -262,11 +262,9 @@ fn list_network_devices(mut param: Value, rpcenv: &mut dyn RpcEnvironment) -> Re
_ => unreachable!(), _ => unreachable!(),
}; };
if let Some(changes) = rpcenv.get_result_attrib("changes") { if let Value::String(ref diff) = rpcenv["changes"] {
if let Some(diff) = changes.as_str() { if output_format == "text" {
if output_format == "text" { eprintln!("pending changes:\n{}\n", diff);
eprintln!("pending changes:\n{}\n", diff);
}
} }
} }
@ -339,10 +337,8 @@ fn pending_network_changes(mut param: Value, rpcenv: &mut dyn RpcEnvironment) ->
_ => unreachable!(), _ => unreachable!(),
}; };
if let Some(changes) = rpcenv.get_result_attrib("changes") { if let Value::String(ref diff) = rpcenv["changes"] {
if let Some(diff) = changes.as_str() { println!("{}", diff);
println!("{}", diff);
}
} }
Ok(Value::Null) Ok(Value::Null)

View File

@ -1,19 +1,18 @@
use std::collections::HashMap; use serde_json::{json, Value};
use serde_json::Value;
use proxmox::api::{RpcEnvironment, RpcEnvironmentType}; use proxmox::api::{RpcEnvironment, RpcEnvironmentType};
/// Encapsulates information about the runtime environment /// Encapsulates information about the runtime environment
pub struct RestEnvironment { pub struct RestEnvironment {
env_type: RpcEnvironmentType, env_type: RpcEnvironmentType,
result_attributes: HashMap<String, Value>, result_attributes: Value,
user: Option<String>, user: Option<String>,
} }
impl RestEnvironment { impl RestEnvironment {
pub fn new(env_type: RpcEnvironmentType) -> Self { pub fn new(env_type: RpcEnvironmentType) -> Self {
Self { Self {
result_attributes: HashMap::new(), result_attributes: json!({}),
user: None, user: None,
env_type, env_type,
} }
@ -22,12 +21,12 @@ impl RestEnvironment {
impl RpcEnvironment for RestEnvironment { impl RpcEnvironment for RestEnvironment {
fn set_result_attrib(&mut self, name: &str, value: Value) { fn result_attrib_mut (&mut self) -> &mut Value {
self.result_attributes.insert(name.into(), value); &mut self.result_attributes
} }
fn get_result_attrib(&self, name: &str) -> Option<&Value> { fn result_attrib(&self) -> &Value {
self.result_attributes.get(name) &self.result_attributes
} }
fn env_type(&self) -> RpcEnvironmentType { fn env_type(&self) -> RpcEnvironmentType {

View File

@ -41,16 +41,13 @@ pub fn json_data_response(data: Value) -> Response<Body> {
fn add_result_attributes(result: &mut Value, rpcenv: &dyn RpcEnvironment) fn add_result_attributes(result: &mut Value, rpcenv: &dyn RpcEnvironment)
{ {
if let Some(total) = rpcenv.get_result_attrib("total").and_then(|v| v.as_u64()) { let attributes = match rpcenv.result_attrib().as_object() {
result["total"] = Value::from(total); Some(attr) => attr,
} None => return,
};
if let Some(active) = rpcenv.get_result_attrib("active").and_then(|v| v.as_bool()) { for (key, value) in attributes {
result["active"] = Value::from(active); result[key] = value.clone();
}
if let Some(changes) = rpcenv.get_result_attrib("changes") {
result["changes"] = changes.clone();
} }
} }