stratisd/dbus_api/filesystem/filesystem_3_0/
methods.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use 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}