[rust PATCH 1/3] Implement virStoragePoolListAllVolumes and virStoragePoolListVolumes for StoragePool
Sahid Orentino Ferdjaoui
sahid.ferdjaoui at canonical.com
Thu Feb 13 10:33:29 UTC 2020
On Mon, Feb 10, 2020 at 01:38:04PM +0000, mathias at pius.io wrote:
> From: Mathias Pius <mathias at pius.io>
>
> ---
> src/storage_pool.rs | 54 ++++++++++++++++++++++++++++++++++++++++++-
> tests/storage_pool.rs | 34 +++++++++++++++++++++++++++
> 2 files changed, 87 insertions(+), 1 deletion(-)
Sounds good thank you Mathias.
Two requests - Can you add the "Signed-off-by" tag I can't accept your
patch without it [0]. - Can you merge patch 2/3 and 3/3 with 1/3,
each individual patch should pass CI.
Thanks,
s.
[0] https://libvirt.org/hacking.html#patches
> diff --git a/src/storage_pool.rs b/src/storage_pool.rs
> index 96258f0..02395bf 100644
> --- a/src/storage_pool.rs
> +++ b/src/storage_pool.rs
> @@ -18,7 +18,7 @@
>
> extern crate libc;
>
> -use std::str;
> +use std::{mem, ptr, str};
>
> use connect::sys::virConnectPtr;
> use storage_vol::sys::virStorageVolPtr;
> @@ -78,6 +78,16 @@ extern "C" {
> fn virStoragePoolFree(ptr: sys::virStoragePoolPtr) -> libc::c_int;
> fn virStoragePoolIsActive(ptr: sys::virStoragePoolPtr) -> libc::c_int;
> fn virStoragePoolIsPersistent(ptr: sys::virStoragePoolPtr) -> libc::c_int;
> + fn virStoragePoolListAllVolumes(
> + ptr: sys::virStoragePoolPtr,
> + vols: *mut *mut virStorageVolPtr,
> + flags: libc::c_uint,
> + ) -> libc::c_int;
> + fn virStoragePoolListVolumes(
> + ptr: sys::virStoragePoolPtr,
> + names: *mut *mut libc::c_char,
> + maxnames: libc::c_int,
> + ) -> libc::c_int;
> fn virStoragePoolGetName(ptr: sys::virStoragePoolPtr) -> *const libc::c_char;
> fn virStoragePoolGetXMLDesc(
> ptr: sys::virStoragePoolPtr,
> @@ -119,6 +129,8 @@ pub const VIR_STORAGE_POOL_RUNNING: StoragePoolState = 2;
> pub const VIR_STORAGE_POOL_DEGRADED: StoragePoolState = 3;
> pub const VIR_STORAGE_POOL_INACCESSIBLE: StoragePoolState = 4;
>
> +pub type StoragePoolListAllVolumesFlags = self::libc::c_uint;
> +
> #[derive(Clone, Debug)]
> pub struct StoragePoolInfo {
> /// A `StoragePoolState` flags
> @@ -373,6 +385,46 @@ impl StoragePool {
> }
> }
>
> + pub fn list_all_volumes(
> + &self,
> + flags: StoragePoolListAllVolumesFlags
> + ) -> Result<Vec<StorageVol>, Error> {
> + unsafe {
> + let mut volumes: *mut virStorageVolPtr = ptr::null_mut();
> +
> + let size = virStoragePoolListAllVolumes(self.as_ptr(), &mut volumes, flags as libc::c_uint);
> + if size == -1 {
> + return Err(Error::new());
> + }
> +
> + mem::forget(volumes);
> +
> + let mut array: Vec<StorageVol> = Vec::with_capacity(size as usize);
> + for x in 0..size as isize {
> + array.push(StorageVol::new(*volumes.offset(x)));
> + }
> + libc::free(volumes as *mut libc::c_void);
> +
> + return Ok(array)
> + }
> + }
> +
> + pub fn list_volumes(&self) -> Result<Vec<String>, Error> {
> + unsafe {
> + let mut names: [*mut libc::c_char; 1024] = [ptr::null_mut(); 1024];
> + let size = virStoragePoolListVolumes(self.as_ptr(), names.as_mut_ptr(), 1024);
> + if size == -1 {
> + return Err(Error::new());
> + }
> +
> + let mut array: Vec<String> = Vec::with_capacity(size as usize);
> + for x in 0..size as usize {
> + array.push(c_chars_to_string!(names[x]));
> + }
> + return Ok(array);
> + }
> + }
> +
> pub fn refresh(&self, flags: u32) -> Result<u32, Error> {
> unsafe {
> let ret = virStoragePoolRefresh(self.as_ptr(), flags as libc::c_uint);
> diff --git a/tests/storage_pool.rs b/tests/storage_pool.rs
> index 4bfa71d..303867b 100644
> --- a/tests/storage_pool.rs
> +++ b/tests/storage_pool.rs
> @@ -58,3 +58,37 @@ fn test_lookup_storage_pool_by_name() {
> }
> common::close(c);
> }
> +
> +#[test]
> +fn test_list_volumes() {
> + match Connect::open("test:///default") {
> + Ok(mut conn) => {
> + let sp = conn.list_storage_pools().unwrap_or(vec![]);
> + match StoragePool::lookup_by_name(&conn, &sp[0]) {
> + Ok(storage_pool) => {
> + storage_pool.list_volumes().unwrap();
> + }
> + Err(e) => panic!("failed with code {}, message: {}", e.code, e.message),
> + }
> + assert_eq!(0, conn.close().unwrap_or(-1));
> + }
> + Err(e) => panic!("failed with code {}, message: {}", e.code, e.message),
> + }
> +}
> +
> +#[test]
> +fn test_list_all_volumes() {
> + match Connect::open("test:///default") {
> + Ok(mut conn) => {
> + let sp = conn.list_storage_pools().unwrap_or(vec![]);
> + match StoragePool::lookup_by_name(&conn, &sp[0]) {
> + Ok(storage_pool) => {
> + storage_pool.list_all_volumes(0).unwrap();
> + }
> + Err(e) => panic!("failed with code {}, message: {}", e.code, e.message),
> + }
> + assert_eq!(0, conn.close().unwrap_or(-1));
> + }
> + Err(e) => panic!("failed with code {}, message: {}", e.code, e.message),
> + }
> +}
> \ No newline at end of file
> --
> 2.25.0
>
More information about the libvir-list
mailing list