Basic check of user data structure for errors
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			This commit is contained in:
		@@ -13,4 +13,6 @@ enum LibVirtStructError {
 | 
			
		||||
    ParseFilteringChain(String),
 | 
			
		||||
    #[error("NetworkFilterExtractionError: {0}")]
 | 
			
		||||
    NetworkFilterExtraction(String),
 | 
			
		||||
    #[error("CloudInitConfigurationError: {0}")]
 | 
			
		||||
    CloudInitConfiguration(String),
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,9 @@ use crate::constants;
 | 
			
		||||
use crate::libvirt_lib_structures::XMLUuid;
 | 
			
		||||
use crate::libvirt_lib_structures::domain::*;
 | 
			
		||||
use crate::libvirt_rest_structures::LibVirtStructError;
 | 
			
		||||
use crate::libvirt_rest_structures::LibVirtStructError::StructureExtraction;
 | 
			
		||||
use crate::libvirt_rest_structures::LibVirtStructError::{
 | 
			
		||||
    CloudInitConfiguration, StructureExtraction,
 | 
			
		||||
};
 | 
			
		||||
use crate::utils::cloud_init_utils::CloudInitConfig;
 | 
			
		||||
use crate::utils::file_size_utils::FileSize;
 | 
			
		||||
use crate::utils::files_utils;
 | 
			
		||||
@@ -142,6 +144,10 @@ impl VMInfo {
 | 
			
		||||
            return Err(StructureExtraction("Invalid number of vCPU specified!").into());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if let Some(e) = self.cloud_init.check_error() {
 | 
			
		||||
            return Err(CloudInitConfiguration(e).into());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let mut iso_absolute_files = vec![];
 | 
			
		||||
 | 
			
		||||
        // Process cloud init image
 | 
			
		||||
 
 | 
			
		||||
@@ -35,6 +35,27 @@ pub struct CloudInitConfig {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl CloudInitConfig {
 | 
			
		||||
    /// Check cloud init configuration
 | 
			
		||||
    pub fn check_error(&self) -> Option<String> {
 | 
			
		||||
        if !self.user_data.is_empty() {
 | 
			
		||||
            // Check YAML content
 | 
			
		||||
            if let Err(e) = serde_yml::from_str::<serde_json::Value>(&self.user_data) {
 | 
			
		||||
                return Some(format!(
 | 
			
		||||
                    "user data is an invalid YAML file! Deserialization error: {e}"
 | 
			
		||||
                ));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Check first line
 | 
			
		||||
            if !self.user_data.starts_with("#cloud-config\n") {
 | 
			
		||||
                return Some(
 | 
			
		||||
                    "user data file MUST start with '#cloud-config' as first line!".to_string(),
 | 
			
		||||
                );
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        None
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Generate disk image for nocloud usage
 | 
			
		||||
    pub fn generate_nocloud_disk(&self) -> anyhow::Result<Vec<u8>> {
 | 
			
		||||
        let temp_path = tempfile::tempdir_in(&AppConfig::get().temp_dir)?;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user