2
src/lib.rs
Normal file
2
src/lib.rs
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
pub mod models;
|
||||||
|
mod time;
|
15
src/models.rs
Normal file
15
src/models.rs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
mod actor;
|
||||||
|
mod context;
|
||||||
|
mod flow;
|
||||||
|
mod job;
|
||||||
|
mod message;
|
||||||
|
mod runner;
|
||||||
|
mod script_type;
|
||||||
|
|
||||||
|
pub use actor::Actor;
|
||||||
|
pub use context::Context;
|
||||||
|
pub use flow::Flow;
|
||||||
|
pub use job::Job;
|
||||||
|
pub use message::Message;
|
||||||
|
pub use runner::Runner;
|
||||||
|
pub use script_type::ScriptType;
|
15
src/models/actor.rs
Normal file
15
src/models/actor.rs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
use std::net::IpAddr;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::time::Timestamp;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct Actor {
|
||||||
|
id: u32,
|
||||||
|
pubkey: String,
|
||||||
|
/// IP where the actor is reachable, can be mycelium but that is not mandatory
|
||||||
|
address: Vec<IpAddr>,
|
||||||
|
created_at: Timestamp,
|
||||||
|
updated_at: Timestamp,
|
||||||
|
}
|
17
src/models/context.rs
Normal file
17
src/models/context.rs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::time::Timestamp;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct Context {
|
||||||
|
/// Redis DB to use
|
||||||
|
id: u32,
|
||||||
|
/// Actor ids which have admin rights on this context
|
||||||
|
admins: Vec<u32>,
|
||||||
|
/// Actor ids which can read the context info
|
||||||
|
readers: Vec<u32>,
|
||||||
|
/// Actor ids which can execute jobs in this context
|
||||||
|
executors: Vec<u32>,
|
||||||
|
created_at: Timestamp,
|
||||||
|
upddated_at: Timestamp,
|
||||||
|
}
|
33
src/models/flow.rs
Normal file
33
src/models/flow.rs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::time::Timestamp;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct Flow {
|
||||||
|
/// Job Id set tby the actor which created it
|
||||||
|
id: u32,
|
||||||
|
/// Actor Id who created this job
|
||||||
|
caller_id: u32,
|
||||||
|
/// The context in which this job is executed
|
||||||
|
context_id: u32,
|
||||||
|
/// List of jobs which make up the flow
|
||||||
|
jobs: Vec<u32>,
|
||||||
|
/// Environment variables, passed to every job when executed
|
||||||
|
env_vars: HashMap<String, String>,
|
||||||
|
/// The result of the flow
|
||||||
|
result: HashMap<String, String>,
|
||||||
|
created_at: Timestamp,
|
||||||
|
updated_at: Timestamp,
|
||||||
|
status: FlowStatus,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The status of a flow
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub enum FlowStatus {
|
||||||
|
Dispatched,
|
||||||
|
Started,
|
||||||
|
Error,
|
||||||
|
Finished,
|
||||||
|
}
|
38
src/models/job.rs
Normal file
38
src/models/job.rs
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::{models::ScriptType, time::Timestamp};
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct Job {
|
||||||
|
/// Job Id, this is given by the actor who created the job
|
||||||
|
id: u32,
|
||||||
|
/// Actor ID which created this job
|
||||||
|
caller_id: u32,
|
||||||
|
/// Context in which the job is executed
|
||||||
|
context_id: u32,
|
||||||
|
script: String,
|
||||||
|
script_type: ScriptType,
|
||||||
|
/// Timeout in seconds for this job
|
||||||
|
timeout: u32,
|
||||||
|
/// Max amount of times to retry this job
|
||||||
|
retries: u8,
|
||||||
|
env_vars: HashMap<String, String>,
|
||||||
|
result: HashMap<String, String>,
|
||||||
|
prerequisites: Vec<String>,
|
||||||
|
/// Ids of jobs this job depends on, i.e. this job can't start until those have finished
|
||||||
|
depends: Vec<u32>,
|
||||||
|
created_at: Timestamp,
|
||||||
|
updated_at: Timestamp,
|
||||||
|
status: JobStatus,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub enum JobStatus {
|
||||||
|
Dispatched,
|
||||||
|
WaitingForPrerequisites,
|
||||||
|
Started,
|
||||||
|
Error,
|
||||||
|
Finished,
|
||||||
|
}
|
54
src/models/message.rs
Normal file
54
src/models/message.rs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
models::{Job, ScriptType},
|
||||||
|
time::Timestamp,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct Message {
|
||||||
|
/// Unique ID for the message, set by the caller
|
||||||
|
id: u32,
|
||||||
|
/// Id of the actor who sent this message
|
||||||
|
caller_id: u32,
|
||||||
|
/// Id of the context in which this message was sent
|
||||||
|
context_id: u32,
|
||||||
|
message: String,
|
||||||
|
message_type: ScriptType,
|
||||||
|
message_format_type: MessageFormatType,
|
||||||
|
/// Seconds for the message to arrive at the destination
|
||||||
|
timeout: u32,
|
||||||
|
/// Seconds for the receiver to acknowledge receipt of the message
|
||||||
|
timeout_ack: u32,
|
||||||
|
/// Seconds for the receiver to send us a reply
|
||||||
|
timeout_result: u32,
|
||||||
|
job: Vec<Job>,
|
||||||
|
logs: Vec<Log>,
|
||||||
|
created_at: Timestamp,
|
||||||
|
updated_at: Timestamp,
|
||||||
|
status: MessageStatus,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub enum MessageType {
|
||||||
|
Job,
|
||||||
|
Chat,
|
||||||
|
Mail,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub enum MessageStatus {
|
||||||
|
Dispatched,
|
||||||
|
Acknowledged,
|
||||||
|
Error,
|
||||||
|
Processed,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub enum MessageFormatType {
|
||||||
|
Html,
|
||||||
|
Text,
|
||||||
|
Md,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Log = String;
|
28
src/models/runner.rs
Normal file
28
src/models/runner.rs
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
use std::net::IpAddr;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
use crate::time::Timestamp;
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub struct Runner {
|
||||||
|
id: u32,
|
||||||
|
/// Mycelium public key
|
||||||
|
pubkey: String,
|
||||||
|
/// Mycelium address
|
||||||
|
address: IpAddr,
|
||||||
|
/// Needs to be set by the runner, usually `runner<runnerid`
|
||||||
|
topic: String,
|
||||||
|
/// If this is true, the runner also listens on a local redis queue
|
||||||
|
local: bool,
|
||||||
|
crated_at: Timestamp,
|
||||||
|
updated_at: Timestamp,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize)]
|
||||||
|
pub enum RunnerType {
|
||||||
|
V,
|
||||||
|
Python,
|
||||||
|
Osis,
|
||||||
|
Rust,
|
||||||
|
}
|
9
src/models/script_type.rs
Normal file
9
src/models/script_type.rs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize)]
|
||||||
|
pub enum ScriptType {
|
||||||
|
Osis,
|
||||||
|
Sal,
|
||||||
|
V,
|
||||||
|
Python,
|
||||||
|
}
|
14
src/time.rs
Normal file
14
src/time.rs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
use std::time::{SystemTime, UNIX_EPOCH};
|
||||||
|
|
||||||
|
/// A timestamp since the unix epoch
|
||||||
|
pub type Timestamp = i64;
|
||||||
|
|
||||||
|
/// Get the current system timestamp
|
||||||
|
pub fn current_timestamp() -> Timestamp {
|
||||||
|
let now = SystemTime::now();
|
||||||
|
// A duration is always positive so this returns an unsigned integer, while a timestamp can
|
||||||
|
// predate the unix epoch so we must cast to a signed integer.
|
||||||
|
now.duration_since(UNIX_EPOCH)
|
||||||
|
.expect("Time moves forward")
|
||||||
|
.as_secs() as i64
|
||||||
|
}
|
Reference in New Issue
Block a user