use crate::cluster::Cluster;
use crate::errors::{Error, Result};
use crate::task::{Status, Task};
use crate::AdminPolicy;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct RegisterTask {
cluster: Arc<Cluster>,
package_name: String,
}
static COMMAND: &str = "udf-list";
static RESPONSE_PATTERN: &str = "filename=";
impl RegisterTask {
pub const fn new(cluster: Arc<Cluster>, package_name: String) -> Self {
RegisterTask {
cluster,
package_name,
}
}
}
#[async_trait::async_trait]
impl Task for RegisterTask {
async fn query_status(&self) -> Result<Status> {
let nodes = self.cluster.nodes();
if nodes.is_empty() {
return Err(Error::Connection("No connected node".to_string()));
}
let admin_policy = AdminPolicy { timeout: 3_000 };
for node in &nodes {
let response = node.info(&admin_policy, &[COMMAND]).await?;
if !response.contains_key(COMMAND) {
return Ok(Status::NotFound);
}
let response_find = format!("{}{}", RESPONSE_PATTERN, self.package_name);
if !response[COMMAND].contains(&response_find) {
return Ok(Status::InProgress);
}
}
Ok(Status::Complete)
}
}