use crate::cluster::Cluster;
use crate::errors::{ErrorKind, Result};
use crate::task::{Status, Task};
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 fn new(cluster: Arc<Cluster>, package_name: String) -> Self {
RegisterTask {
cluster,
package_name,
}
}
}
impl Task for RegisterTask {
fn query_status(&self) -> Result<Status> {
let nodes = self.cluster.nodes();
if nodes.is_empty() {
bail!(ErrorKind::Connection("No connected node".to_string()))
}
for node in &nodes {
let response = node.info(
Some(self.cluster.client_policy().timeout.unwrap()),
&[&COMMAND[..]],
)?;
if !response.contains_key(COMMAND) {
return Ok(Status::NotFound);
}
let response_find = format!("{}{}", RESPONSE_PATTERN, self.package_name);
if response[COMMAND].find(&response_find).is_none() {
return Ok(Status::InProgress);
}
}
Ok(Status::Complete)
}
}