]> git.proxmox.com Git - proxmox-backup.git/blobdiff - src/api2/node/network.rs
update to first proxmox crate split
[proxmox-backup.git] / src / api2 / node / network.rs
index ebe83ef36e570854387b71c4b48d60e21be1d682..1becf1070f02c0c77f1a19ea8b7ef2d35da330f6 100644 (file)
@@ -2,14 +2,18 @@ use anyhow::{Error, bail};
 use serde_json::{Value, to_value};
 use ::serde::{Deserialize, Serialize};
 
-use proxmox::api::{api, ApiMethod, Router, RpcEnvironment, Permission};
-use proxmox::api::schema::parse_property_string;
+use proxmox_router::{ApiMethod, Router, RpcEnvironment, Permission};
+use proxmox_schema::{api, parse_property_string};
 
-use crate::config::network::{self, NetworkConfig};
-use crate::config::acl::{PRIV_SYS_AUDIT, PRIV_SYS_MODIFY};
-use crate::api2::types::*;
-use crate::server::{WorkerTask};
-use crate::backup::open_backup_lockfile;
+use pbs_api_types::{
+    Authid, Interface, NetworkInterfaceType, LinuxBondMode, NetworkConfigMethod, BondXmitHashPolicy,
+    NETWORK_INTERFACE_ARRAY_SCHEMA, NETWORK_INTERFACE_LIST_SCHEMA, NETWORK_INTERFACE_NAME_SCHEMA,
+    CIDR_V4_SCHEMA, CIDR_V6_SCHEMA, IP_V4_SCHEMA, IP_V6_SCHEMA, PROXMOX_CONFIG_DIGEST_SCHEMA,
+    NODE_SCHEMA, PRIV_SYS_AUDIT, PRIV_SYS_MODIFY,
+};
+use pbs_config::network::{self, NetworkConfig};
+
+use proxmox_rest_server::WorkerTask;
 
 fn split_interface_list(list: &str) -> Result<Vec<String>, Error> {
     let value = parse_property_string(&list, &NETWORK_INTERFACE_ARRAY_SCHEMA)?;
@@ -44,6 +48,23 @@ fn check_duplicate_gateway_v6(config: &NetworkConfig, iface: &str) -> Result<(),
     Ok(())
 }
 
+
+fn set_bridge_ports(iface: &mut Interface, ports: Vec<String>) -> Result<(), Error> {
+    if iface.interface_type != NetworkInterfaceType::Bridge {
+        bail!("interface '{}' is no bridge (type is {:?})", iface.name, iface.interface_type);
+    }
+    iface.bridge_ports = Some(ports);
+    Ok(())
+}
+
+fn set_bond_slaves(iface: &mut Interface, slaves: Vec<String>) -> Result<(), Error> {
+    if iface.interface_type != NetworkInterfaceType::Bond {
+        bail!("interface '{}' is no bond (type is {:?})", iface.name, iface.interface_type);
+    }
+    iface.slaves = Some(slaves);
+    Ok(())
+}
+
 #[api(
     input: {
         properties: {
@@ -238,7 +259,7 @@ pub fn create_interface(
     let interface_type = pbs_tools::json::required_string_param(&param, "type")?;
     let interface_type: NetworkInterfaceType = serde_json::from_value(interface_type.into())?;
 
-    let _lock = open_backup_lockfile(network::NETWORK_LOCKFILE, None, true)?;
+    let _lock = network::lock_config()?;
 
     let (mut config, _digest) = network::config()?;
 
@@ -286,7 +307,7 @@ pub fn create_interface(
         NetworkInterfaceType::Bridge => {
             if let Some(ports) = bridge_ports {
                 let ports = split_interface_list(&ports)?;
-                interface.set_bridge_ports(ports)?;
+                set_bridge_ports(&mut interface, ports)?;
             }
             if bridge_vlan_aware.is_some() { interface.bridge_vlan_aware = bridge_vlan_aware; }
         }
@@ -310,7 +331,7 @@ pub fn create_interface(
             }
             if let Some(slaves) = slaves {
                 let slaves = split_interface_list(&slaves)?;
-                interface.set_bond_slaves(slaves)?;
+                set_bond_slaves(&mut interface, slaves)?;
             }
         }
         _ => bail!("creating network interface type '{:?}' is not supported", interface_type),
@@ -502,7 +523,7 @@ pub fn update_interface(
     param: Value,
 ) -> Result<(), Error> {
 
-    let _lock = open_backup_lockfile(network::NETWORK_LOCKFILE, None, true)?;
+    let _lock = network::lock_config()?;
 
     let (mut config, expected_digest) = network::config()?;
 
@@ -536,9 +557,9 @@ pub fn update_interface(
                 DeletableProperty::comments6 => { interface.comments6 = None; },
                 DeletableProperty::mtu => { interface.mtu = None; },
                 DeletableProperty::autostart => { interface.autostart = false; },
-                DeletableProperty::bridge_ports => { interface.set_bridge_ports(Vec::new())?; }
+                DeletableProperty::bridge_ports => { set_bridge_ports(interface, Vec::new())?; }
                 DeletableProperty::bridge_vlan_aware => { interface.bridge_vlan_aware = None; }
-                DeletableProperty::slaves => { interface.set_bond_slaves(Vec::new())?; }
+                DeletableProperty::slaves => { set_bond_slaves(interface, Vec::new())?; }
                 DeletableProperty::bond_primary => { interface.bond_primary = None; }
                 DeletableProperty::bond_xmit_hash_policy => { interface.bond_xmit_hash_policy = None }
             }
@@ -551,12 +572,12 @@ pub fn update_interface(
     if mtu.is_some() { interface.mtu = mtu; }
     if let Some(ports) = bridge_ports {
         let ports = split_interface_list(&ports)?;
-        interface.set_bridge_ports(ports)?;
+        set_bridge_ports(interface, ports)?;
     }
     if bridge_vlan_aware.is_some() { interface.bridge_vlan_aware = bridge_vlan_aware; }
     if let Some(slaves) = slaves {
         let slaves = split_interface_list(&slaves)?;
-        interface.set_bond_slaves(slaves)?;
+        set_bond_slaves(interface, slaves)?;
     }
     if let Some(mode) = bond_mode {
         interface.bond_mode = bond_mode;
@@ -642,7 +663,7 @@ pub fn update_interface(
 )]
 /// Remove network interface configuration.
 pub fn delete_interface(iface: String, digest: Option<String>) -> Result<(), Error> {
-    let _lock = open_backup_lockfile(network::NETWORK_LOCKFILE, None, true)?;
+    let _lock = network::lock_config()?;
 
     let (mut config, expected_digest) = network::config()?;
 
@@ -682,7 +703,7 @@ pub async fn reload_network_config(
 
     let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
 
-    let upid_str = WorkerTask::spawn("srvreload", Some(String::from("networking")), auth_id, true, |_worker| async {
+    let upid_str = WorkerTask::spawn("srvreload", Some(String::from("networking")), auth_id.to_string(), true, |_worker| async {
 
         let _ = std::fs::rename(network::NETWORK_INTERFACES_NEW_FILENAME, network::NETWORK_INTERFACES_FILENAME);