use std::sync::Arc;
use crate::core::client::{VimClient, Result};
#[derive(Clone)]
pub struct VsanUpdateManager {
client: Arc<dyn VimClient>,
mo_id: String,
}
impl VsanUpdateManager {
pub fn new(client: Arc<dyn VimClient>, mo_id: &str) -> Self {
Self {
client,
mo_id: mo_id.to_string(),
}
}
pub async fn vsan_vib_install_task(&self, cluster: Option<&crate::types::structs::ManagedObjectReference>, vib_specs: Option<&[crate::types::structs::VsanVibSpec]>, scan_results: Option<&[crate::types::structs::VsanVibScanResult]>, firmware_specs: Option<&[crate::types::structs::VsanHclFirmwareUpdateSpec]>, maintenance_spec: Option<&crate::types::structs::HostMaintenanceSpec>, rolling: Option<bool>, no_sig_check: Option<bool>) -> Result<crate::types::structs::ManagedObjectReference> {
let input = VsanVibInstallRequestType {cluster, vib_specs, scan_results, firmware_specs, maintenance_spec, rolling, no_sig_check, };
let bytes = self.client.invoke("vsan", "VsanUpdateManager", &self.mo_id, "VsanVibInstall_Task", Some(&input)).await?;
let result: crate::types::structs::ManagedObjectReference = crate::core::client::unmarshal(self.client.transport(), &bytes)?;
Ok(result)
}
pub async fn vsan_vib_install_preflight_check(&self, cluster: Option<&crate::types::structs::ManagedObjectReference>) -> Result<crate::types::structs::VsanVibInstallPreflightStatus> {
let input = VsanVibInstallPreflightCheckRequestType {cluster, };
let bytes = self.client.invoke("vsan", "VsanUpdateManager", &self.mo_id, "VsanVibInstallPreflightCheck", Some(&input)).await?;
let result: crate::types::structs::VsanVibInstallPreflightStatus = crate::core::client::unmarshal(self.client.transport(), &bytes)?;
Ok(result)
}
pub async fn vsan_vib_scan(&self, cluster: Option<&crate::types::structs::ManagedObjectReference>, vib_specs: &[crate::types::structs::VsanVibSpec]) -> Result<Option<Vec<crate::types::structs::VsanVibScanResult>>> {
let input = VsanVibScanRequestType {cluster, vib_specs, };
let bytes_opt = self.client.invoke_optional("vsan", "VsanUpdateManager", &self.mo_id, "VsanVibScan", Some(&input)).await?;
match bytes_opt {
Some(ref b) => Ok(Some(crate::core::client::unmarshal_array(self.client.transport(), b)?)),
None => Ok(None),
}
}
}
struct VsanVibInstallRequestType<'a> {
cluster: Option<&'a crate::types::structs::ManagedObjectReference>,
vib_specs: Option<&'a [crate::types::structs::VsanVibSpec]>,
scan_results: Option<&'a [crate::types::structs::VsanVibScanResult]>,
firmware_specs: Option<&'a [crate::types::structs::VsanHclFirmwareUpdateSpec]>,
maintenance_spec: Option<&'a crate::types::structs::HostMaintenanceSpec>,
rolling: Option<bool>,
no_sig_check: Option<bool>,
}
impl<'a> miniserde::Serialize for VsanVibInstallRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(VsanVibInstallRequestTypeSer { data: self, seq: 0 }))
}
}
struct VsanVibInstallRequestTypeSer<'b, 'a> {
data: &'b VsanVibInstallRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for VsanVibInstallRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
loop {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"VsanVibInstallRequestType")),
1 => {
let Some(ref val) = self.data.cluster else { continue; };
return Some((std::borrow::Cow::Borrowed("cluster"), val as &dyn miniserde::Serialize));
}
2 => {
let Some(ref val) = self.data.vib_specs else { continue; };
return Some((std::borrow::Cow::Borrowed("vibSpecs"), val as &dyn miniserde::Serialize));
}
3 => {
let Some(ref val) = self.data.scan_results else { continue; };
return Some((std::borrow::Cow::Borrowed("scanResults"), val as &dyn miniserde::Serialize));
}
4 => {
let Some(ref val) = self.data.firmware_specs else { continue; };
return Some((std::borrow::Cow::Borrowed("firmwareSpecs"), val as &dyn miniserde::Serialize));
}
5 => {
let Some(ref val) = self.data.maintenance_spec else { continue; };
return Some((std::borrow::Cow::Borrowed("maintenanceSpec"), val as &dyn miniserde::Serialize));
}
6 => {
let Some(ref val) = self.data.rolling else { continue; };
return Some((std::borrow::Cow::Borrowed("rolling"), val as &dyn miniserde::Serialize));
}
7 => {
let Some(ref val) = self.data.no_sig_check else { continue; };
return Some((std::borrow::Cow::Borrowed("noSigCheck"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}
struct VsanVibInstallPreflightCheckRequestType<'a> {
cluster: Option<&'a crate::types::structs::ManagedObjectReference>,
}
impl<'a> miniserde::Serialize for VsanVibInstallPreflightCheckRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(VsanVibInstallPreflightCheckRequestTypeSer { data: self, seq: 0 }))
}
}
struct VsanVibInstallPreflightCheckRequestTypeSer<'b, 'a> {
data: &'b VsanVibInstallPreflightCheckRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for VsanVibInstallPreflightCheckRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
loop {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"VsanVibInstallPreflightCheckRequestType")),
1 => {
let Some(ref val) = self.data.cluster else { continue; };
return Some((std::borrow::Cow::Borrowed("cluster"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}
struct VsanVibScanRequestType<'a> {
cluster: Option<&'a crate::types::structs::ManagedObjectReference>,
vib_specs: &'a [crate::types::structs::VsanVibSpec],
}
impl<'a> miniserde::Serialize for VsanVibScanRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(VsanVibScanRequestTypeSer { data: self, seq: 0 }))
}
}
struct VsanVibScanRequestTypeSer<'b, 'a> {
data: &'b VsanVibScanRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for VsanVibScanRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
loop {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"VsanVibScanRequestType")),
1 => {
let Some(ref val) = self.data.cluster else { continue; };
return Some((std::borrow::Cow::Borrowed("cluster"), val as &dyn miniserde::Serialize));
}
2 => return Some((std::borrow::Cow::Borrowed("vibSpecs"), &self.data.vib_specs as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
}