Mercurial > hg > Members > anatofuz > ie-virsh
annotate src/command.rs @ 62:aefbef761450
add edit cmd
author | AnaTofuZ <anatofuz@gmail.com> |
---|---|
date | Fri, 27 Nov 2020 20:32:06 +0900 |
parents | b6e9e473678c |
children | f0985ebd068b |
rev | line source |
---|---|
26 | 1 use super::user; |
12 | 2 use super::virsh; |
19 | 3 use super::xml; |
12 | 4 |
32 | 5 use std::io; |
28 | 6 |
48 | 7 const RENTAL_DIR: &str = "/ie-ryukyu/kvm/images/rental"; |
42 | 8 |
24 | 9 pub fn list(user_name: &str) { |
12 | 10 let (ldump_msg, vm_list_strs) = virsh::get_vm_list(user_name); |
11 println!("{}", ldump_msg.info_msg); | |
12 println!("{}", ldump_msg.border_line); | |
13 for vm_info in vm_list_strs { | |
14 println!("{}", vm_info); | |
15 } | |
16 } | |
13 | 17 |
32 | 18 pub fn templates() -> Result<(), io::Error> { |
19 let templates_list = virsh::get_template_list()?; | |
28 | 20 |
32 | 21 for name in templates_list { |
22 println!("{}", name); | |
28 | 23 } |
24 | |
25 Ok(()) | |
26 } | |
27 | |
41 | 28 pub fn define(user_detail: &user::UserDetail, vm_name: &str) { |
29 let vm_name = generate_vm_name(&user_detail.user.name, &vm_name); | |
30 let builder = xml::Builder::new(&user_detail, &vm_name).finalize(); | |
39 | 31 if let Ok(xml_path) = builder.generate() { |
61 | 32 virsh::subshell_virsh_command(&xml_path, "define") |
39 | 33 } |
34 } | |
35 | |
41 | 36 pub fn define_from_template(user_detail: &user::UserDetail, vm_name: &str, template: &str) { |
37 let vm_name = generate_vm_name(&user_detail.user.name, &vm_name); | |
40 | 38 println!("{}", vm_name); |
41 | 39 let backing_path = match virsh::get_backing_path(template) { |
39 | 40 Some(path) => path, |
41 None => { | |
42 println!("not found {}", template); | |
43 return; | |
44 } | |
45 }; | |
41 | 46 let builder = xml::Builder::new(&user_detail, &vm_name) |
47 .backing(&backing_path) | |
42 | 48 .qcow2_dir(RENTAL_DIR) |
39 | 49 .finalize(); |
40 | 50 let xml_path = match builder.generate() { |
41 | 51 Ok(xml_path) => xml_path, |
52 Err(e) => { | |
53 println!("failed generate xml: {}", e); | |
54 return; | |
55 } | |
40 | 56 }; |
48 | 57 virsh::generate_qemu_from_template(RENTAL_DIR, &vm_name, &backing_path); |
61 | 58 virsh::subshell_virsh_command(&xml_path, "define"); |
19 | 59 } |
60 | |
36 | 61 pub fn start(user_name: &str, vm_name: &str) { |
61 | 62 virsh::subshell_virsh_command(&get_vm_name(user_name, vm_name), "start"); |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
63 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
64 |
62 | 65 pub fn subshell(user_name: &str, vm_name: &str, operation: &str) { |
59 | 66 let vm_name = exec_cmd_from_name_or_id(user_name, vm_name); |
62 | 67 virsh::subshell_virsh_command(&vm_name, operation); |
59 | 68 } |
69 | |
62 | 70 pub fn exec(user_name: &str, vm_name: &str, operation: &str) { |
59 | 71 let vm_name = exec_cmd_from_name_or_id(user_name, vm_name); |
62 | 72 virsh::exec_virsh_command(&vm_name, operation); |
16 | 73 } |
74 | |
36 | 75 pub fn dumpvncpasswd(_user_name: &str, _vm_name: &str) {} |
26 | 76 |
59 | 77 fn exec_cmd_from_name_or_id(user_name: &str, name_or_id: &str) -> String { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
78 if name_or_id.parse::<u8>().is_ok() { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
79 let vm_name_or_none = get_vm_name_from_id(user_name, &name_or_id); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
80 if let Some(vm_name) = vm_name_or_none { |
59 | 81 return vm_name; |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
82 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
83 } |
59 | 84 get_vm_name(user_name, name_or_id) |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
85 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
86 |
24 | 87 fn get_vm_name_from_id(user_name: &str, arg_id: &str) -> Option<String> { |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
88 let (_, vm_list_strs) = virsh::get_vm_list(user_name); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
89 for vm in vm_list_strs { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
90 let mut splitted = vm.split_whitespace(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
91 let vm_id = splitted.next().unwrap(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
92 if (vm_id != "-") && (vm_id == arg_id) { |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
93 let vm_name = splitted.next().unwrap(); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
94 return Some(String::from(vm_name)); |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
95 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
96 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
97 None |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
98 } |
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
99 |
24 | 100 fn get_vm_name(user_name: &str, vm_name: &str) -> String { |
13 | 101 let vm_name = match vm_name.parse::<u8>() { |
15 | 102 Ok(_) => format!("{}-{}", user_name, vm_name), |
17
5477c26e6984
impl sub commands that use uid
AnaTofuZ <k198584@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
103 Err(_) => vm_name.to_string(), |
13 | 104 }; |
105 | |
16 | 106 if vm_name.starts_with(user_name) { |
107 return vm_name; | |
108 } | |
109 format!("{}-{}", user_name, vm_name) | |
13 | 110 } |
20 | 111 |
26 | 112 fn generate_vm_name(user_name: &str, vm_name: &str) -> String { |
20 | 113 if vm_name.starts_with(user_name) { |
114 return vm_name.to_string(); | |
115 } | |
116 format!("{}-{}", user_name, vm_name) | |
23 | 117 } |