use std::collections::HashMap;
use crate::Pyo3Docker;
use docker_api::secret::{SecretCreateOpts, SecretListOpts};
use docker_api::{Secret, Secrets};
use pyo3::exceptions;
use pyo3::prelude::*;
use pyo3::types::PyDict;
use pythonize::pythonize;
#[pymodule]
pub fn secret(_py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<Pyo3Secrets>()?;
m.add_class::<Pyo3Secret>()?;
Ok(())
}
#[derive(Debug)]
#[pyclass(name = "Secrets")]
pub struct Pyo3Secrets {
secrets: Secrets,
}
#[derive(Debug)]
#[pyclass(name = "Secret")]
pub struct Pyo3Secret {
secret: Secret,
}
#[pymethods]
impl Pyo3Secrets {
#[new]
pub fn new(docker: Pyo3Docker) -> Self {
Pyo3Secrets {
secrets: Secrets::new(docker.0),
}
}
pub fn get(&self, id: &str) -> Pyo3Secret {
Pyo3Secret {
secret: self.secrets.get(id),
}
}
pub fn list(&self) -> PyResult<Py<PyAny>> {
let rv = __secrets_list(&self.secrets, &Default::default());
match rv {
Ok(rv) => Ok(pythonize_this!(rv)),
Err(rv) => Err(py_sys_exception!(rv)),
}
}
#[pyo3(signature = (name, data, labels=None))]
pub fn create(
&self,
name: &str,
data: &str,
labels: Option<&Bound<'_, PyDict>>,
) -> PyResult<Pyo3Secret> {
let mut opts = SecretCreateOpts::new(name, data);
if let Some(labels_dict) = labels {
let labels_map: HashMap<String, String> = labels_dict.extract().unwrap();
for (k, v) in labels_map {
opts = opts.add_label(k, v);
}
}
let rv = __secrets_create(&self.secrets, &opts);
match rv {
Ok(secret) => Ok(Pyo3Secret { secret }),
Err(rv) => Err(py_sys_exception!(rv)),
}
}
}
#[tokio::main]
async fn __secrets_list(
secrets: &Secrets,
opts: &SecretListOpts,
) -> Result<Vec<docker_api::models::Secret>, docker_api::Error> {
secrets.list(opts).await
}
#[tokio::main]
async fn __secrets_create(
secrets: &Secrets,
opts: &SecretCreateOpts,
) -> Result<Secret, docker_api::Error> {
secrets.create(opts).await
}
#[pymethods]
impl Pyo3Secret {
#[new]
pub fn new(docker: Pyo3Docker, id: &str) -> Self {
Pyo3Secret {
secret: Secret::new(docker.0, id),
}
}
pub fn id(&self) -> String {
self.secret.name().to_string()
}
pub fn inspect(&self) -> PyResult<Py<PyAny>> {
let rv = __secret_inspect(&self.secret);
match rv {
Ok(rv) => Ok(pythonize_this!(rv)),
Err(rv) => Err(py_sys_exception!(rv)),
}
}
pub fn delete(&self) -> PyResult<()> {
let rv = __secret_delete(&self.secret);
match rv {
Ok(rv) => Ok(rv),
Err(rv) => Err(py_sys_exception!(rv)),
}
}
}
#[tokio::main]
async fn __secret_inspect(
secret: &Secret,
) -> Result<docker_api::models::Secret, docker_api::Error> {
secret.inspect().await
}
#[tokio::main]
async fn __secret_delete(secret: &Secret) -> Result<(), docker_api::Error> {
secret.delete().await
}