stratisd/dbus_api/filesystem/filesystem_3_0/
methods.rs1use dbus::Message;
6use dbus_tree::{MTSync, MethodInfo, MethodResult};
7
8use crate::{
9 dbus_api::{
10 types::{DbusErrorEnum, TData, OK_STRING},
11 util::{engine_to_dbus_err_tuple, get_next_arg},
12 },
13 engine::{FilesystemUuid, RenameAction},
14};
15
16pub fn rename_filesystem(m: &MethodInfo<'_, MTSync<TData>, TData>) -> MethodResult {
17 let message: &Message = m.msg;
18 let mut iter = message.iter_init();
19
20 let new_name: &str = get_next_arg(&mut iter, 0)?;
21
22 let dbus_context = m.tree.get_data();
23 let object_path = m.path.get_name();
24 let return_message = message.method_return();
25 let default_return = (false, uuid_to_string!(FilesystemUuid::nil()));
26
27 let filesystem_path = m
28 .tree
29 .get(object_path)
30 .expect("implicit argument must be in tree");
31 let filesystem_data = get_data!(filesystem_path; default_return; return_message);
32
33 let pool_path = get_parent!(m; filesystem_data; default_return; return_message);
34 let pool_uuid = typed_uuid!(
35 get_data!(pool_path; default_return; return_message).uuid;
36 Pool;
37 default_return;
38 return_message
39 );
40
41 let mut guard = get_mut_pool!(dbus_context.engine; pool_uuid; default_return; return_message);
42 let (pool_name, _, pool) = guard.as_mut_tuple();
43
44 let uuid = typed_uuid!(filesystem_data.uuid; Fs; default_return; return_message);
45 let msg = match handle_action!(
46 pool.rename_filesystem(&pool_name, uuid, new_name),
47 dbus_context,
48 pool_path.get_name()
49 ) {
50 Ok(RenameAction::NoSource) => {
51 let error_message = format!(
52 "pool {} doesn't know about filesystem {}",
53 pool_uuid, filesystem_data.uuid
54 );
55 let (rc, rs) = (DbusErrorEnum::ERROR as u16, error_message);
56 return_message.append3(default_return, rc, rs)
57 }
58 Ok(RenameAction::Identity) => return_message.append3(
59 default_return,
60 DbusErrorEnum::OK as u16,
61 OK_STRING.to_string(),
62 ),
63 Ok(RenameAction::Renamed(uuid)) => {
64 dbus_context.push_filesystem_name_change(object_path, new_name);
65 return_message.append3(
66 (true, uuid_to_string!(uuid)),
67 DbusErrorEnum::OK as u16,
68 OK_STRING.to_string(),
69 )
70 }
71 Err(err) => {
72 let (rc, rs) = engine_to_dbus_err_tuple(&err);
73 return_message.append3(default_return, rc, rs)
74 }
75 };
76
77 Ok(vec![msg])
78}