changeset 33:ba66504b5256

emit backingfile at xml
author AnaTofuZ <anatofuz@gmail.com>
date Sun, 22 Nov 2020 08:48:12 +0900
parents ae7ba39dfcbe
children 5026bf93b48e
files src/command.rs src/xml.rs
diffstat 2 files changed, 34 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/command.rs	Sat Nov 21 17:14:56 2020 +0900
+++ b/src/command.rs	Sun Nov 22 08:48:12 2020 +0900
@@ -25,7 +25,7 @@
 
 pub fn define(user: &user::User, vm_name: String) {
     let vm_name = generate_vm_name(&user.name, &vm_name);
-    let vm_arg = xml::GenerateVMArg::new(&user.name, &vm_name, false);
+    let vm_arg = xml::GenerateVMArg::new(&user.name, &vm_name, None, None);
     if let Ok(xml_path) = vm_arg.generate() {
         virsh::command_require_vm_name(xml_path, "define")
     }
--- a/src/xml.rs	Sat Nov 21 17:14:56 2020 +0900
+++ b/src/xml.rs	Sun Nov 22 08:48:12 2020 +0900
@@ -36,8 +36,8 @@
     qcow2_path: String,
     xml_path: String,
     vnc_password: String,
-    is_debug: bool,
-    tcp_port: u64,
+    debug_tcp_port: Option<u64>,
+    backing_file: Option<String>,
 }
 
 pub fn dump_vnc_passwd(user: user::UserDetail, _vm_name: &str) -> Result<String, Error> {
@@ -60,7 +60,12 @@
 }
 
 impl GenerateVMArg {
-    pub fn new(user_name: &str, vm_name: &str, is_debug: bool) -> GenerateVMArg {
+    pub fn new(
+        user_name: &str,
+        vm_name: &str,
+        debug_tcp_port: Option<u64>,
+        backing_file: Option<String>,
+    ) -> GenerateVMArg {
         let year = user_name.chars().skip(1).take(2).collect::<String>();
         let affilication = if year.parse::<u8>().is_ok() {
             // /etc/libvirt/qemu/e19/e195729
@@ -91,8 +96,8 @@
             qcow2_path,
             xml_path,
             vnc_password: pw,
-            is_debug,
-            tcp_port: 90,
+            debug_tcp_port,
+            backing_file,
         }
     }
 
@@ -117,7 +122,7 @@
                 }
 
                 Ok(Event::Start(ref e))
-                    if (e.name() == ROOT_START_TAG.as_bytes() && self.is_debug) =>
+                    if (e.name() == ROOT_START_TAG.as_bytes() && self.debug_tcp_port.is_some()) =>
                 {
                     let mut elem = e.clone();
                     elem.push_attribute(DOMAIN_XMLNS_QEMU);
@@ -137,7 +142,7 @@
                     }
 
                     let mut qemu_elem = BytesStart::borrowed_name(QEMU_ARG_TAG.as_bytes());
-                    let gdb_port: &str = &format!("tcp::{}", self.tcp_port);
+                    let gdb_port: &str = &format!("tcp::{}", self.debug_tcp_port.unwrap());
                     qemu_elem.push_attribute(("value", gdb_port));
                     writer.write_event(Event::Empty(qemu_elem)).unwrap();
 
@@ -155,6 +160,27 @@
                     writer.write_event(Event::Empty(elem)).ok();
                 }
 
+                Ok(Event::End(ref e)) if ((e.name() == b"disk") && self.backing_file.is_some()) => {
+                    let mut backing_store_start = BytesStart::borrowed_name(b"backingStore");
+                    backing_store_start.push_attribute(("type", "file"));
+                    backing_store_start.push_attribute(("index", "3"));
+                    writer
+                        .write_event(Event::Empty(backing_store_start))
+                        .unwrap();
+
+                    let mut format_elem = BytesStart::borrowed_name(b"format");
+                    format_elem.push_attribute(("type", "qcow2"));
+                    writer.write_event(Event::Empty(format_elem)).unwrap();
+
+                    let mut backing_sorce = BytesStart::borrowed_name(b"sorce");
+                    let backing_file: &str = &self.backing_file.clone().unwrap();
+                    backing_sorce.push_attribute(("file", backing_file));
+                    writer.write_event(Event::Empty(backing_sorce)).unwrap();
+
+                    let backing_store_end = BytesEnd::borrowed(b"backingStore");
+                    writer.write_event(Event::End(backing_store_end)).unwrap();
+                }
+
                 Ok(Event::Empty(ref e)) if (e.name() == b"source") => {
                     let mut elem = e.clone();
                     let is_qcow_file = elem