annotate src/virsh.rs @ 39:f667f3a4bbee

backing file cmd
author AnaTofuZ <anatofuz@gmail.com>
date Sun, 22 Nov 2020 15:47:37 +0900
parents ae7ba39dfcbe
children d3055f6c6fb7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
1 use std::io::{self, Write};
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 use std::process::Command;
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
4 use std::fs;
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
5 use std::path::Path;
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
6
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
7 const TEMPLATE_DIR: &str = "/ie-ryukyu/kvm/images/templates/";
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
8 const TEMPLATE_SUFFIX: &str = "template-";
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
9 const TEMPLATE_FILE_EXTENSION: &str = ".qcow2";
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
10 const QCOW2: &str = "qcow2";
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
11
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 pub struct ListDumpMsg {
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 pub info_msg: String,
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 pub border_line: String,
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 }
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
32
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
17 pub fn get_template_list() -> Result<Vec<String>, io::Error> {
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
18 let mut entries = fs::read_dir(TEMPLATE_DIR)?
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
19 .map(|res| {
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
20 res.map(|e| {
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
21 e.path()
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
22 .display()
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
23 .to_string()
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
24 .replace(TEMPLATE_DIR, "")
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
25 .replace(TEMPLATE_SUFFIX, "")
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
26 .replace(TEMPLATE_FILE_EXTENSION, "")
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
27 })
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
28 })
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
29 .collect::<Result<Vec<_>, io::Error>>()?;
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
30
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
31 entries.sort();
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
32 Ok(entries)
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
33 }
ae7ba39dfcbe return the template vec
AnaTofuZ <anatofuz@gmail.com>
parents: 24
diff changeset
34
24
e8ba0f63c227 remove static variable
AnaTofuZ <anatofuz@gmail.com>
parents: 16
diff changeset
35 pub fn get_vm_list(user_name: &str) -> (ListDumpMsg, Vec<String>) {
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 let output = Command::new("virsh")
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 .arg("list")
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 .arg("--all")
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 .output()
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 .expect("failed to virsh");
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 let virsh_list = String::from_utf8_lossy(&output.stdout);
15
e6dc51066703 cargo clippy
AnaTofuZ <anatofuz@gmail.com>
parents: 13
diff changeset
42 let mut virsh_list = virsh_list.split('\n');
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 let info_msg = virsh_list.next().unwrap();
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 let border_line = virsh_list.next().unwrap();
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 let ldump_msg = ListDumpMsg {
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 info_msg: String::from(info_msg),
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 border_line: String::from(border_line),
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 };
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
15
e6dc51066703 cargo clippy
AnaTofuZ <anatofuz@gmail.com>
parents: 13
diff changeset
51 (
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 ldump_msg,
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 virsh_list
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 .filter(|&x| x.contains(user_name))
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 .map(|x| x.to_string())
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 .collect(),
15
e6dc51066703 cargo clippy
AnaTofuZ <anatofuz@gmail.com>
parents: 13
diff changeset
57 )
12
0df4d067badb move each crates
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 }
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
59
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
60 pub fn command_require_vm_name(vm_name: &str, operation: &str) {
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
61 let output = Command::new("virsh")
16
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
62 .arg(operation)
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
63 .arg(vm_name)
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
64 .output()
16
AnaTofuZ <anatofuz@gmail.com>
parents: 15
diff changeset
65 .unwrap_or_else(|_| panic!("failed to {}", operation));
13
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
66
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
67 io::stdout().write_all(&output.stdout).unwrap();
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
68 io::stderr().write_all(&output.stderr).unwrap();
56e9763abeef define start cmd
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
69 }
39
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
70
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
71 pub fn generate_qemu_from_template(vm_name: &str, template_path: &str) {
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
72 let vm_path = format!(
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
73 "{}{}{}{}",
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
74 TEMPLATE_DIR, TEMPLATE_SUFFIX, &vm_name, TEMPLATE_FILE_EXTENSION
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
75 );
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
76 //$qemu-img create -F qcow2 -b ibm-master.qcow2 -f qcow2 ibm-02.qcow2
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
77 let output = Command::new("qemu-img")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
78 .arg("create")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
79 .arg("-F")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
80 .arg(QCOW2)
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
81 .arg("-b")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
82 .arg(template_path)
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
83 .arg("-f")
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
84 .arg(QCOW2)
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
85 .arg(vm_path)
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
86 .output()
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
87 .unwrap_or_else(|_| panic!("failed to generate {}", &vm_name));
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
88 io::stdout().write_all(&output.stdout).unwrap();
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
89 io::stderr().write_all(&output.stderr).unwrap();
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
90 }
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
91
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
92 pub fn get_template_path(template_name: &str) -> Option<String> {
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
93 let template_path = format!(
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
94 "{}{}{}{}",
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
95 TEMPLATE_DIR, TEMPLATE_SUFFIX, &template_name, TEMPLATE_FILE_EXTENSION
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
96 );
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
97 if Path::new(&template_path).exists() {
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
98 return Some(template_path);
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
99 }
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
100 None
f667f3a4bbee backing file cmd
AnaTofuZ <anatofuz@gmail.com>
parents: 32
diff changeset
101 }