Skip to content

Commit 0994dbc

Browse files
author
Paul Yoong
committed
feat(rest): expose list_block_devices method
Implement a REST call for listing block devices. The REST call uri can optionally include the 'all' query parameter. This determines whether all devices should be listed or just those that are deemed usable. Omitting the query parameter results in all devices being listed. Also added traits for converting messages between rpc and message bus formats as this will be a common occurrence for control plane agents.
1 parent e293037 commit 0994dbc

File tree

10 files changed

+495
-177
lines changed

10 files changed

+495
-177
lines changed

control-plane/agents/common/src/wrapper/v0/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ macro_rules! impl_no_nexus {
143143
};
144144
}
145145

146+
pub mod msg_translation;
146147
mod node_traits;
147148
mod pool;
148149
mod volume;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
//! Converts rpc messages to message bus messages and vice versa.
2+
3+
use mbus_api::{
4+
v0 as mbus,
5+
v0::{ChildState, NexusState, Protocol},
6+
};
7+
use rpc::mayastor as rpc;
8+
9+
/// Trait for converting rpc messages to message bus messages.
10+
pub trait RpcToMessageBus {
11+
/// Message bus message type.
12+
type BusMessage;
13+
/// Conversion of rpc message to message bus message.
14+
fn to_mbus(&self) -> Self::BusMessage;
15+
}
16+
17+
impl RpcToMessageBus for rpc::block_device::Partition {
18+
type BusMessage = mbus::Partition;
19+
fn to_mbus(&self) -> Self::BusMessage {
20+
Self::BusMessage {
21+
parent: self.parent.clone(),
22+
number: self.number,
23+
name: self.name.clone(),
24+
scheme: self.scheme.clone(),
25+
typeid: self.typeid.clone(),
26+
uuid: self.uuid.clone(),
27+
}
28+
}
29+
}
30+
31+
impl RpcToMessageBus for rpc::block_device::Filesystem {
32+
type BusMessage = mbus::Filesystem;
33+
fn to_mbus(&self) -> Self::BusMessage {
34+
Self::BusMessage {
35+
fstype: self.fstype.clone(),
36+
label: self.label.clone(),
37+
uuid: self.uuid.clone(),
38+
mountpoint: self.mountpoint.clone(),
39+
}
40+
}
41+
}
42+
43+
/// Node Agent Conversions
44+
45+
impl RpcToMessageBus for rpc::BlockDevice {
46+
type BusMessage = mbus::BlockDevice;
47+
fn to_mbus(&self) -> Self::BusMessage {
48+
Self::BusMessage {
49+
devname: self.devname.clone(),
50+
devtype: self.devtype.clone(),
51+
devmajor: self.devmajor,
52+
devminor: self.devminor,
53+
model: self.model.clone(),
54+
devpath: self.devpath.clone(),
55+
devlinks: self.devlinks.clone(),
56+
size: self.size,
57+
partition: match &self.partition {
58+
Some(partition) => partition.to_mbus(),
59+
None => mbus::Partition {
60+
..Default::default()
61+
},
62+
},
63+
filesystem: match &self.filesystem {
64+
Some(filesystem) => filesystem.to_mbus(),
65+
None => mbus::Filesystem {
66+
..Default::default()
67+
},
68+
},
69+
available: self.available,
70+
}
71+
}
72+
}
73+
74+
/// Pool Agent conversions
75+
76+
impl RpcToMessageBus for rpc::Pool {
77+
type BusMessage = mbus::Pool;
78+
fn to_mbus(&self) -> Self::BusMessage {
79+
Self::BusMessage {
80+
node: Default::default(),
81+
id: self.name.clone().into(),
82+
disks: self.disks.clone(),
83+
state: self.state.into(),
84+
capacity: self.capacity,
85+
used: self.used,
86+
}
87+
}
88+
}
89+
90+
impl RpcToMessageBus for rpc::Replica {
91+
type BusMessage = mbus::Replica;
92+
fn to_mbus(&self) -> Self::BusMessage {
93+
Self::BusMessage {
94+
node: Default::default(),
95+
uuid: self.uuid.clone().into(),
96+
pool: self.pool.clone().into(),
97+
thin: self.thin,
98+
size: self.size,
99+
share: self.share.into(),
100+
uri: self.uri.clone(),
101+
}
102+
}
103+
}
104+
105+
/// Volume Agent conversions
106+
107+
impl RpcToMessageBus for rpc::Nexus {
108+
type BusMessage = mbus::Nexus;
109+
110+
fn to_mbus(&self) -> Self::BusMessage {
111+
Self::BusMessage {
112+
node: Default::default(),
113+
uuid: self.uuid.clone().into(),
114+
size: self.size,
115+
state: NexusState::from(self.state),
116+
children: self.children.iter().map(|c| c.to_mbus()).collect(),
117+
device_uri: self.device_uri.clone(),
118+
rebuilds: self.rebuilds,
119+
}
120+
}
121+
}
122+
123+
impl RpcToMessageBus for rpc::Child {
124+
type BusMessage = mbus::Child;
125+
126+
fn to_mbus(&self) -> Self::BusMessage {
127+
Self::BusMessage {
128+
uri: self.uri.clone().into(),
129+
state: ChildState::from(self.state),
130+
rebuild_progress: if self.rebuild_progress >= 0 {
131+
Some(self.rebuild_progress)
132+
} else {
133+
None
134+
},
135+
}
136+
}
137+
}
138+
139+
/// Trait for converting message bus messages to rpc messages.
140+
pub trait MessageBusToRpc {
141+
/// RPC message type.
142+
type RpcMessage;
143+
/// Conversion of message bus message to rpc message.
144+
fn to_rpc(&self) -> Self::RpcMessage;
145+
}
146+
147+
/// Pool Agent Conversions
148+
149+
impl MessageBusToRpc for mbus::CreateReplica {
150+
type RpcMessage = rpc::CreateReplicaRequest;
151+
fn to_rpc(&self) -> Self::RpcMessage {
152+
Self::RpcMessage {
153+
uuid: self.uuid.clone().into(),
154+
pool: self.pool.clone().into(),
155+
thin: self.thin,
156+
size: self.size,
157+
share: self.share.clone() as i32,
158+
}
159+
}
160+
}
161+
162+
impl MessageBusToRpc for mbus::ShareReplica {
163+
type RpcMessage = rpc::ShareReplicaRequest;
164+
fn to_rpc(&self) -> Self::RpcMessage {
165+
Self::RpcMessage {
166+
uuid: self.uuid.clone().into(),
167+
share: self.protocol.clone() as i32,
168+
}
169+
}
170+
}
171+
172+
impl MessageBusToRpc for mbus::UnshareReplica {
173+
type RpcMessage = rpc::ShareReplicaRequest;
174+
fn to_rpc(&self) -> Self::RpcMessage {
175+
Self::RpcMessage {
176+
uuid: self.uuid.clone().into(),
177+
share: Protocol::Off as i32,
178+
}
179+
}
180+
}
181+
182+
impl MessageBusToRpc for mbus::CreatePool {
183+
type RpcMessage = rpc::CreatePoolRequest;
184+
fn to_rpc(&self) -> Self::RpcMessage {
185+
Self::RpcMessage {
186+
name: self.id.clone().into(),
187+
disks: self.disks.clone(),
188+
}
189+
}
190+
}
191+
192+
impl MessageBusToRpc for mbus::DestroyReplica {
193+
type RpcMessage = rpc::DestroyReplicaRequest;
194+
fn to_rpc(&self) -> Self::RpcMessage {
195+
Self::RpcMessage {
196+
uuid: self.uuid.clone().into(),
197+
}
198+
}
199+
}
200+
201+
impl MessageBusToRpc for mbus::DestroyPool {
202+
type RpcMessage = rpc::DestroyPoolRequest;
203+
fn to_rpc(&self) -> Self::RpcMessage {
204+
Self::RpcMessage {
205+
name: self.id.clone().into(),
206+
}
207+
}
208+
}
209+
210+
/// Volume Agent Conversions
211+
212+
impl MessageBusToRpc for mbus::CreateNexus {
213+
type RpcMessage = rpc::CreateNexusRequest;
214+
fn to_rpc(&self) -> Self::RpcMessage {
215+
Self::RpcMessage {
216+
uuid: self.uuid.clone().into(),
217+
size: self.size,
218+
children: self.children.iter().map(|c| c.to_string()).collect(),
219+
}
220+
}
221+
}
222+
223+
impl MessageBusToRpc for mbus::ShareNexus {
224+
type RpcMessage = rpc::PublishNexusRequest;
225+
fn to_rpc(&self) -> Self::RpcMessage {
226+
Self::RpcMessage {
227+
uuid: self.uuid.clone().into(),
228+
key: self.key.clone().unwrap_or_default(),
229+
share: self.protocol.clone() as i32,
230+
}
231+
}
232+
}
233+
234+
impl MessageBusToRpc for mbus::UnshareNexus {
235+
type RpcMessage = rpc::UnpublishNexusRequest;
236+
fn to_rpc(&self) -> Self::RpcMessage {
237+
Self::RpcMessage {
238+
uuid: self.uuid.clone().into(),
239+
}
240+
}
241+
}
242+
243+
impl MessageBusToRpc for mbus::DestroyNexus {
244+
type RpcMessage = rpc::DestroyNexusRequest;
245+
fn to_rpc(&self) -> Self::RpcMessage {
246+
Self::RpcMessage {
247+
uuid: self.uuid.clone().into(),
248+
}
249+
}
250+
}
251+
252+
impl MessageBusToRpc for mbus::AddNexusChild {
253+
type RpcMessage = rpc::AddChildNexusRequest;
254+
fn to_rpc(&self) -> Self::RpcMessage {
255+
Self::RpcMessage {
256+
uuid: self.nexus.clone().into(),
257+
uri: self.uri.clone().into(),
258+
norebuild: !self.auto_rebuild,
259+
}
260+
}
261+
}
262+
263+
impl MessageBusToRpc for mbus::RemoveNexusChild {
264+
type RpcMessage = rpc::RemoveChildNexusRequest;
265+
fn to_rpc(&self) -> Self::RpcMessage {
266+
Self::RpcMessage {
267+
uuid: self.nexus.clone().into(),
268+
uri: self.uri.clone().into(),
269+
}
270+
}
271+
}

0 commit comments

Comments
 (0)