src/config/network.rs: move type definitions to src/api2/types.rs
This commit is contained in:
		@ -6,6 +6,7 @@ use proxmox::api::{api, ApiMethod, Router, RpcEnvironment, Permission};
 | 
				
			|||||||
//use crate::api2::types::*;
 | 
					//use crate::api2::types::*;
 | 
				
			||||||
use crate::config::network;
 | 
					use crate::config::network;
 | 
				
			||||||
use crate::config::acl::{PRIV_SYS_AUDIT};
 | 
					use crate::config::acl::{PRIV_SYS_AUDIT};
 | 
				
			||||||
 | 
					use crate::api2::types::Interface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[api(
 | 
					#[api(
 | 
				
			||||||
    input: {
 | 
					    input: {
 | 
				
			||||||
@ -15,7 +16,7 @@ use crate::config::acl::{PRIV_SYS_AUDIT};
 | 
				
			|||||||
        description: "List network devices (with config digest).",
 | 
					        description: "List network devices (with config digest).",
 | 
				
			||||||
        type: Array,
 | 
					        type: Array,
 | 
				
			||||||
        items: {
 | 
					        items: {
 | 
				
			||||||
            type: network::Interface,
 | 
					            type: Interface,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    access: {
 | 
					    access: {
 | 
				
			||||||
 | 
				
			|||||||
@ -443,6 +443,93 @@ pub struct TaskListItem {
 | 
				
			|||||||
    pub status: Option<String>,
 | 
					    pub status: Option<String>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[api()]
 | 
				
			||||||
 | 
					#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					#[serde(rename_all = "lowercase")]
 | 
				
			||||||
 | 
					/// Interface configuration method
 | 
				
			||||||
 | 
					pub enum NetworkConfigMethod {
 | 
				
			||||||
 | 
					    /// Configuration is done manually using other tools
 | 
				
			||||||
 | 
					    Manual,
 | 
				
			||||||
 | 
					    /// Define interfaces with statically allocated addresses.
 | 
				
			||||||
 | 
					    Static,
 | 
				
			||||||
 | 
					    /// Obtain an address via DHCP
 | 
				
			||||||
 | 
					    DHCP,
 | 
				
			||||||
 | 
					    /// Define the loopback interface.
 | 
				
			||||||
 | 
					    Loopback,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[api(
 | 
				
			||||||
 | 
					    properties: {
 | 
				
			||||||
 | 
					        name: {
 | 
				
			||||||
 | 
					            type: String,
 | 
				
			||||||
 | 
					            min_length: 1,
 | 
				
			||||||
 | 
					            max_length: libc::IFNAMSIZ-1,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        method_v4: {
 | 
				
			||||||
 | 
					            type: NetworkConfigMethod,
 | 
				
			||||||
 | 
					            optional: true,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        method_v6: {
 | 
				
			||||||
 | 
					            type: NetworkConfigMethod,
 | 
				
			||||||
 | 
					            optional: true,
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        options_v4: {
 | 
				
			||||||
 | 
					            description: "Option list (inet)",
 | 
				
			||||||
 | 
					            type: Array,
 | 
				
			||||||
 | 
					            items: {
 | 
				
			||||||
 | 
					                description: "Optional attribute.",
 | 
				
			||||||
 | 
					                type: String,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        options_v6: {
 | 
				
			||||||
 | 
					            description: "Option list (inet6)",
 | 
				
			||||||
 | 
					            type: Array,
 | 
				
			||||||
 | 
					            items: {
 | 
				
			||||||
 | 
					                description: "Optional attribute.",
 | 
				
			||||||
 | 
					                type: String,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					)]
 | 
				
			||||||
 | 
					#[derive(Debug, Serialize, Deserialize)]
 | 
				
			||||||
 | 
					/// Network Interface configuration
 | 
				
			||||||
 | 
					pub struct Interface {
 | 
				
			||||||
 | 
					    /// Autostart interface
 | 
				
			||||||
 | 
					    pub autostart: bool,
 | 
				
			||||||
 | 
					    /// Interface is a physical network device
 | 
				
			||||||
 | 
					    pub exists: bool,
 | 
				
			||||||
 | 
					    /// Interface is active (UP)
 | 
				
			||||||
 | 
					    pub active: bool,
 | 
				
			||||||
 | 
					    /// Interface name
 | 
				
			||||||
 | 
					    pub name: String,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					     pub method_v4: Option<NetworkConfigMethod>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					    pub method_v6: Option<NetworkConfigMethod>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					    /// IPv4 address
 | 
				
			||||||
 | 
					    pub address_v4: Option<String>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					    /// IPv4 gateway
 | 
				
			||||||
 | 
					    pub gateway_v4: Option<String>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					    /// IPv4 netmask
 | 
				
			||||||
 | 
					    pub netmask_v4: Option<u8>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					    /// IPv6 address
 | 
				
			||||||
 | 
					    pub address_v6: Option<String>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					    /// IPv6 gateway
 | 
				
			||||||
 | 
					    pub gateway_v6: Option<String>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Option::is_none")]
 | 
				
			||||||
 | 
					    /// IPv6 netmask
 | 
				
			||||||
 | 
					    pub netmask_v6: Option<u8>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Vec::is_empty")]
 | 
				
			||||||
 | 
					    pub options_v4: Vec<String>,
 | 
				
			||||||
 | 
					    #[serde(skip_serializing_if="Vec::is_empty")]
 | 
				
			||||||
 | 
					    pub options_v6: Vec<String>,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Regression tests
 | 
					// Regression tests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
 | 
				
			|||||||
@ -2,10 +2,8 @@ use std::io::{Write};
 | 
				
			|||||||
use std::collections::{HashSet, HashMap};
 | 
					use std::collections::{HashSet, HashMap};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use anyhow::{Error, bail};
 | 
					use anyhow::{Error, bail};
 | 
				
			||||||
use serde::{Serialize, Deserialize};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
use proxmox::tools::{fs::replace_file, fs::CreateOptions};
 | 
					use proxmox::tools::{fs::replace_file, fs::CreateOptions};
 | 
				
			||||||
use proxmox::api::api;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
mod helper;
 | 
					mod helper;
 | 
				
			||||||
pub use helper::*;
 | 
					pub use helper::*;
 | 
				
			||||||
@ -16,92 +14,7 @@ pub use lexer::*;
 | 
				
			|||||||
mod parser;
 | 
					mod parser;
 | 
				
			||||||
pub use parser::*;
 | 
					pub use parser::*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[api()]
 | 
					use crate::api2::types::{Interface, NetworkConfigMethod};
 | 
				
			||||||
#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
 | 
					 | 
				
			||||||
#[serde(rename_all = "lowercase")]
 | 
					 | 
				
			||||||
/// Interface configuration method
 | 
					 | 
				
			||||||
pub enum NetworkConfigMethod {
 | 
					 | 
				
			||||||
    /// Configuration is done manually using other tools
 | 
					 | 
				
			||||||
    Manual,
 | 
					 | 
				
			||||||
    /// Define interfaces with statically allocated addresses.
 | 
					 | 
				
			||||||
    Static,
 | 
					 | 
				
			||||||
    /// Obtain an address via DHCP
 | 
					 | 
				
			||||||
    DHCP,
 | 
					 | 
				
			||||||
    /// Define the loopback interface.
 | 
					 | 
				
			||||||
    Loopback,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#[api(
 | 
					 | 
				
			||||||
    properties: {
 | 
					 | 
				
			||||||
        name: {
 | 
					 | 
				
			||||||
            type: String,
 | 
					 | 
				
			||||||
            min_length: 1,
 | 
					 | 
				
			||||||
            max_length: libc::IFNAMSIZ-1,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        method_v4: {
 | 
					 | 
				
			||||||
            type: NetworkConfigMethod,
 | 
					 | 
				
			||||||
            optional: true,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        method_v6: {
 | 
					 | 
				
			||||||
            type: NetworkConfigMethod,
 | 
					 | 
				
			||||||
            optional: true,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        options_v4: {
 | 
					 | 
				
			||||||
            description: "Option list (inet)",
 | 
					 | 
				
			||||||
            type: Array,
 | 
					 | 
				
			||||||
            items: {
 | 
					 | 
				
			||||||
                description: "Optional attribute.",
 | 
					 | 
				
			||||||
                type: String,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        options_v6: {
 | 
					 | 
				
			||||||
            description: "Option list (inet6)",
 | 
					 | 
				
			||||||
            type: Array,
 | 
					 | 
				
			||||||
            items: {
 | 
					 | 
				
			||||||
                description: "Optional attribute.",
 | 
					 | 
				
			||||||
                type: String,
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
)]
 | 
					 | 
				
			||||||
#[derive(Debug, Serialize, Deserialize)]
 | 
					 | 
				
			||||||
/// Network Interface configuration
 | 
					 | 
				
			||||||
pub struct Interface {
 | 
					 | 
				
			||||||
    /// Autostart interface
 | 
					 | 
				
			||||||
    pub autostart: bool,
 | 
					 | 
				
			||||||
    /// Interface is a physical network device
 | 
					 | 
				
			||||||
    pub exists: bool,
 | 
					 | 
				
			||||||
    /// Interface is active (UP)
 | 
					 | 
				
			||||||
    pub active: bool,
 | 
					 | 
				
			||||||
    /// Interface name
 | 
					 | 
				
			||||||
    pub name: String,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
     pub method_v4: Option<NetworkConfigMethod>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
    pub method_v6: Option<NetworkConfigMethod>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
    /// IPv4 address
 | 
					 | 
				
			||||||
    pub address_v4: Option<String>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
    /// IPv4 gateway
 | 
					 | 
				
			||||||
    pub gateway_v4: Option<String>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
    /// IPv4 netmask
 | 
					 | 
				
			||||||
    pub netmask_v4: Option<u8>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
    /// IPv6 address
 | 
					 | 
				
			||||||
    pub address_v6: Option<String>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
    /// IPv6 gateway
 | 
					 | 
				
			||||||
    pub gateway_v6: Option<String>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Option::is_none")]
 | 
					 | 
				
			||||||
    /// IPv6 netmask
 | 
					 | 
				
			||||||
    pub netmask_v6: Option<u8>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Vec::is_empty")]
 | 
					 | 
				
			||||||
    pub options_v4: Vec<String>,
 | 
					 | 
				
			||||||
    #[serde(skip_serializing_if="Vec::is_empty")]
 | 
					 | 
				
			||||||
    pub options_v6: Vec<String>,
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl Interface {
 | 
					impl Interface {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user