use std::sync::Arc;
use crate::core::client::{VimClient, Result};
#[derive(Clone)]
pub struct HostCertificateManager {
client: Arc<dyn VimClient>,
mo_id: String,
}
impl HostCertificateManager {
pub fn new(client: Arc<dyn VimClient>, mo_id: &str) -> Self {
Self {
client,
mo_id: mo_id.to_string(),
}
}
pub async fn generate_certificate_signing_request(&self, use_ip_address_as_common_name: bool, spec: Option<&crate::types::structs::HostCertificateManagerCertificateSpec>) -> Result<String> {
let input = GenerateCertificateSigningRequestRequestType {use_ip_address_as_common_name, spec, };
let bytes = self.client.invoke("", "HostCertificateManager", &self.mo_id, "GenerateCertificateSigningRequest", Some(&input)).await?;
let result: String = crate::core::client::unmarshal(self.client.transport(), &bytes)?;
Ok(result)
}
pub async fn generate_certificate_signing_request_by_dn(&self, distinguished_name: &str, spec: Option<&crate::types::structs::HostCertificateManagerCertificateSpec>) -> Result<String> {
let input = GenerateCertificateSigningRequestByDnRequestType {distinguished_name, spec, };
let bytes = self.client.invoke("", "HostCertificateManager", &self.mo_id, "GenerateCertificateSigningRequestByDn", Some(&input)).await?;
let result: String = crate::core::client::unmarshal(self.client.transport(), &bytes)?;
Ok(result)
}
pub async fn install_server_certificate(&self, cert: &str) -> Result<()> {
let input = InstallServerCertificateRequestType {cert, };
self.client.invoke_void("", "HostCertificateManager", &self.mo_id, "InstallServerCertificate", Some(&input)).await
}
pub async fn list_ca_certificate_revocation_lists(&self) -> Result<Option<Vec<String>>> {
let bytes_opt = self.client.invoke_optional("", "HostCertificateManager", &self.mo_id, "ListCACertificateRevocationLists", None).await?;
match bytes_opt {
Some(ref b) => Ok(Some(crate::core::client::unmarshal_array(self.client.transport(), b)?)),
None => Ok(None),
}
}
pub async fn list_ca_certificates(&self) -> Result<Option<Vec<String>>> {
let bytes_opt = self.client.invoke_optional("", "HostCertificateManager", &self.mo_id, "ListCACertificates", None).await?;
match bytes_opt {
Some(ref b) => Ok(Some(crate::core::client::unmarshal_array(self.client.transport(), b)?)),
None => Ok(None),
}
}
pub async fn notify_affected_services(&self, services: Option<&[String]>) -> Result<()> {
let input = NotifyAffectedServicesRequestType {services, };
self.client.invoke_void("", "HostCertificateManager", &self.mo_id, "NotifyAffectedServices", Some(&input)).await
}
pub async fn provision_server_private_key(&self, key: &str) -> Result<()> {
let input = ProvisionServerPrivateKeyRequestType {key, };
self.client.invoke_void("", "HostCertificateManager", &self.mo_id, "ProvisionServerPrivateKey", Some(&input)).await
}
pub async fn replace_ca_certificates_and_cr_ls(&self, ca_cert: &[String], ca_crl: Option<&[String]>) -> Result<()> {
let input = ReplaceCaCertificatesAndCrLsRequestType {ca_cert, ca_crl, };
self.client.invoke_void("", "HostCertificateManager", &self.mo_id, "ReplaceCACertificatesAndCRLs", Some(&input)).await
}
pub async fn retrieve_certificate_info_list(&self) -> Result<Option<Vec<crate::types::structs::HostCertificateManagerCertificateInfo>>> {
let bytes_opt = self.client.invoke_optional("", "HostCertificateManager", &self.mo_id, "RetrieveCertificateInfoList", None).await?;
match bytes_opt {
Some(ref b) => Ok(Some(crate::core::client::unmarshal_array(self.client.transport(), b)?)),
None => Ok(None),
}
}
pub async fn certificate_info(&self) -> Result<crate::types::structs::HostCertificateManagerCertificateInfo> {
let pv_opt = self.client.fetch_property_raw("", "HostCertificateManager", &self.mo_id, "certificateInfo").await?;
let pv = pv_opt.ok_or_else(|| crate::core::client::VimError::ParseError("property certificateInfo was empty".to_string()))?;
let result: crate::types::structs::HostCertificateManagerCertificateInfo = crate::core::client::extract_property(pv)?;
Ok(result)
}
}
struct GenerateCertificateSigningRequestRequestType<'a> {
use_ip_address_as_common_name: bool,
spec: Option<&'a crate::types::structs::HostCertificateManagerCertificateSpec>,
}
impl<'a> miniserde::Serialize for GenerateCertificateSigningRequestRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(GenerateCertificateSigningRequestRequestTypeSer { data: self, seq: 0 }))
}
}
struct GenerateCertificateSigningRequestRequestTypeSer<'b, 'a> {
data: &'b GenerateCertificateSigningRequestRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for GenerateCertificateSigningRequestRequestTypeSer<'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"), &"GenerateCertificateSigningRequestRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("useIpAddressAsCommonName"), &self.data.use_ip_address_as_common_name as &dyn miniserde::Serialize)),
2 => {
let Some(ref val) = self.data.spec else { continue; };
return Some((std::borrow::Cow::Borrowed("spec"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}
struct GenerateCertificateSigningRequestByDnRequestType<'a> {
distinguished_name: &'a str,
spec: Option<&'a crate::types::structs::HostCertificateManagerCertificateSpec>,
}
impl<'a> miniserde::Serialize for GenerateCertificateSigningRequestByDnRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(GenerateCertificateSigningRequestByDnRequestTypeSer { data: self, seq: 0 }))
}
}
struct GenerateCertificateSigningRequestByDnRequestTypeSer<'b, 'a> {
data: &'b GenerateCertificateSigningRequestByDnRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for GenerateCertificateSigningRequestByDnRequestTypeSer<'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"), &"GenerateCertificateSigningRequestByDnRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("distinguishedName"), &self.data.distinguished_name as &dyn miniserde::Serialize)),
2 => {
let Some(ref val) = self.data.spec else { continue; };
return Some((std::borrow::Cow::Borrowed("spec"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}
struct InstallServerCertificateRequestType<'a> {
cert: &'a str,
}
impl<'a> miniserde::Serialize for InstallServerCertificateRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(InstallServerCertificateRequestTypeSer { data: self, seq: 0 }))
}
}
struct InstallServerCertificateRequestTypeSer<'b, 'a> {
data: &'b InstallServerCertificateRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for InstallServerCertificateRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"InstallServerCertificateRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("cert"), &self.data.cert as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct NotifyAffectedServicesRequestType<'a> {
services: Option<&'a [String]>,
}
impl<'a> miniserde::Serialize for NotifyAffectedServicesRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(NotifyAffectedServicesRequestTypeSer { data: self, seq: 0 }))
}
}
struct NotifyAffectedServicesRequestTypeSer<'b, 'a> {
data: &'b NotifyAffectedServicesRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for NotifyAffectedServicesRequestTypeSer<'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"), &"NotifyAffectedServicesRequestType")),
1 => {
let Some(ref val) = self.data.services else { continue; };
return Some((std::borrow::Cow::Borrowed("services"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}
struct ProvisionServerPrivateKeyRequestType<'a> {
key: &'a str,
}
impl<'a> miniserde::Serialize for ProvisionServerPrivateKeyRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(ProvisionServerPrivateKeyRequestTypeSer { data: self, seq: 0 }))
}
}
struct ProvisionServerPrivateKeyRequestTypeSer<'b, 'a> {
data: &'b ProvisionServerPrivateKeyRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for ProvisionServerPrivateKeyRequestTypeSer<'b, 'a> {
fn next(&mut self) -> Option<(std::borrow::Cow<'_, str>, &dyn miniserde::Serialize)> {
let seq = self.seq;
self.seq += 1;
match seq {
0 => return Some((std::borrow::Cow::Borrowed("_typeName"), &"ProvisionServerPrivateKeyRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("key"), &self.data.key as &dyn miniserde::Serialize)),
_ => return None,
}
}
}
struct ReplaceCaCertificatesAndCrLsRequestType<'a> {
ca_cert: &'a [String],
ca_crl: Option<&'a [String]>,
}
impl<'a> miniserde::Serialize for ReplaceCaCertificatesAndCrLsRequestType<'a> {
fn begin(&self) -> miniserde::ser::Fragment<'_> {
miniserde::ser::Fragment::Map(Box::new(ReplaceCaCertificatesAndCrLsRequestTypeSer { data: self, seq: 0 }))
}
}
struct ReplaceCaCertificatesAndCrLsRequestTypeSer<'b, 'a> {
data: &'b ReplaceCaCertificatesAndCrLsRequestType<'a>,
seq: usize,
}
impl<'b, 'a> miniserde::ser::Map for ReplaceCaCertificatesAndCrLsRequestTypeSer<'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"), &"ReplaceCACertificatesAndCRLsRequestType")),
1 => return Some((std::borrow::Cow::Borrowed("caCert"), &self.data.ca_cert as &dyn miniserde::Serialize)),
2 => {
let Some(ref val) = self.data.ca_crl else { continue; };
return Some((std::borrow::Cow::Borrowed("caCrl"), val as &dyn miniserde::Serialize));
}
_ => return None,
}
}
}
}