@@ -20,8 +20,24 @@ pub enum BlockState {
2020impl BlockState {
2121 pub fn is_activated ( & self ) -> bool {
2222 match self {
23- BlockState :: Virtio ( virtio_block_state) => virtio_block_state. virtio_state . activated ,
24- BlockState :: VhostUser ( vhost_user_block_state) => false ,
23+ BlockState :: Virtio ( state) => state. virtio_state . activated ,
24+ BlockState :: VhostUser ( _) => false ,
25+ }
26+ }
27+
28+ /// Returns the drive ID.
29+ pub fn id ( & self ) -> & str {
30+ match self {
31+ BlockState :: Virtio ( state) => & state. id ,
32+ BlockState :: VhostUser ( state) => & state. id ,
33+ }
34+ }
35+
36+ /// Overrides the host path (disk path or socket path) of the block device.
37+ pub fn set_host_path ( & mut self , path : & str ) {
38+ match self {
39+ BlockState :: Virtio ( state) => state. disk_path = path. to_string ( ) ,
40+ BlockState :: VhostUser ( state) => state. socket_path = path. to_string ( ) ,
2541 }
2642 }
2743}
@@ -31,3 +47,90 @@ impl BlockState {
3147pub struct BlockConstructorArgs {
3248 pub mem : GuestMemoryMmap ,
3349}
50+
51+ #[ cfg( test) ]
52+ mod tests {
53+ use super :: * ;
54+ use crate :: devices:: virtio:: block:: CacheType ;
55+ use crate :: devices:: virtio:: block:: virtio:: persist:: FileEngineTypeState ;
56+ use crate :: devices:: virtio:: device:: VirtioDeviceType ;
57+ use crate :: devices:: virtio:: persist:: VirtioDeviceState ;
58+ use crate :: rate_limiter:: persist:: RateLimiterState ;
59+
60+ fn virtio_block_state ( id : & str , disk_path : & str , activated : bool ) -> VirtioBlockState {
61+ VirtioBlockState {
62+ id : id. to_string ( ) ,
63+ partuuid : None ,
64+ cache_type : CacheType :: Unsafe ,
65+ root_device : false ,
66+ disk_path : disk_path. to_string ( ) ,
67+ virtio_state : VirtioDeviceState {
68+ device_type : VirtioDeviceType :: Block ,
69+ avail_features : 0 ,
70+ acked_features : 0 ,
71+ queues : vec ! [ ] ,
72+ activated,
73+ } ,
74+ rate_limiter_state : Default :: default ( ) ,
75+ file_engine_type : FileEngineTypeState :: Sync ,
76+ }
77+ }
78+
79+ fn vhost_user_block_state ( id : & str , socket_path : & str ) -> VhostUserBlockState {
80+ VhostUserBlockState {
81+ id : id. to_string ( ) ,
82+ partuuid : None ,
83+ cache_type : CacheType :: Unsafe ,
84+ root_device : false ,
85+ socket_path : socket_path. to_string ( ) ,
86+ vu_acked_protocol_features : 0 ,
87+ config_space : vec ! [ ] ,
88+ virtio_state : VirtioDeviceState {
89+ device_type : VirtioDeviceType :: Block ,
90+ avail_features : 0 ,
91+ acked_features : 0 ,
92+ queues : vec ! [ ] ,
93+ activated : false ,
94+ } ,
95+ }
96+ }
97+
98+ #[ test]
99+ fn test_block_state_id ( ) {
100+ let virtio = BlockState :: Virtio ( virtio_block_state ( "rootfs" , "/path" , false ) ) ;
101+ assert_eq ! ( virtio. id( ) , "rootfs" ) ;
102+
103+ let vhost = BlockState :: VhostUser ( vhost_user_block_state ( "scratch" , "/sock" ) ) ;
104+ assert_eq ! ( vhost. id( ) , "scratch" ) ;
105+ }
106+
107+ #[ test]
108+ fn test_block_state_is_activated ( ) {
109+ let active = BlockState :: Virtio ( virtio_block_state ( "rootfs" , "/path" , true ) ) ;
110+ assert ! ( active. is_activated( ) ) ;
111+
112+ let inactive = BlockState :: Virtio ( virtio_block_state ( "rootfs" , "/path" , false ) ) ;
113+ assert ! ( !inactive. is_activated( ) ) ;
114+
115+ // vhost-user always returns false
116+ let vhost = BlockState :: VhostUser ( vhost_user_block_state ( "rootfs" , "/sock" ) ) ;
117+ assert ! ( !vhost. is_activated( ) ) ;
118+ }
119+
120+ #[ test]
121+ fn test_block_state_set_host_path ( ) {
122+ let mut virtio = BlockState :: Virtio ( virtio_block_state ( "rootfs" , "/old/path" , false ) ) ;
123+ virtio. set_host_path ( "/new/path" ) ;
124+ match & virtio {
125+ BlockState :: Virtio ( state) => assert_eq ! ( state. disk_path, "/new/path" ) ,
126+ _ => panic ! ( "expected Virtio variant" ) ,
127+ }
128+
129+ let mut vhost = BlockState :: VhostUser ( vhost_user_block_state ( "rootfs" , "/old/sock" ) ) ;
130+ vhost. set_host_path ( "/new/sock" ) ;
131+ match & vhost {
132+ BlockState :: VhostUser ( state) => assert_eq ! ( state. socket_path, "/new/sock" ) ,
133+ _ => panic ! ( "expected VhostUser variant" ) ,
134+ }
135+ }
136+ }
0 commit comments