diff --git a/dagrs/README.md b/dagrs/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2d1c7ec34a211ff382b07dd053d5f81b2d37294f --- /dev/null +++ b/dagrs/README.md @@ -0,0 +1,50 @@ +# dagrs + +本项目是用 Rust 写的 DAG 执行引擎,开发文档请参考:[使用 Rust 编写 DAG 执行引擎](https://openeuler.feishu.cn/docs/doccnVLprAY6vIMv6W1vgfLnfrf)。 + + + +## 用法 + +确保 Rust 编译环境可用(`cargo build`),然后在此文件夹中运行`cargo build --release`,在`target/release/`中获取可执行文件,并将其放入PATH。 + +命令行使用方式为: + +```bash +$ dagrs +``` + +例如: + +```bash +$ dagrs test/test2.yaml +[Start] -> a -> b -> f -> d -> c -> g -> e -> h -> [End] +``` + + + +## YAML 定义 + +YAML 定义 DAG 通过如下一个例子来说明: + +```YAML +dagrs: + a: + name: "任务1" + rely: [b, c] + b: + name: "任务2" + rely: [c] + c: + name: "任务3" + # empty if no rely +``` + +- 这里有三个任务:a,b 和 c。这里的 a,b,c 并不是 `name` ,而是标识任务的标识,可以认为是 ID。 +- 例如 a 指向 b 和 c,表示 a 在 b,c 之前执行,写做 `rely: [b, c]` 。 + +最终形成的图如下,那么一个可行的执行顺序是: `A->B->C->D->E` + +img + +具体的任务定义可以后续随需要进行扩展。 \ No newline at end of file diff --git a/dagrs/doc/doc.md b/dagrs/doc/doc.md deleted file mode 100644 index d417a49626f027679ea0d7e105ba23ae0f5c14d5..0000000000000000000000000000000000000000 --- a/dagrs/doc/doc.md +++ /dev/null @@ -1,24 +0,0 @@ -[TOC] - -# Overview - -DAG Engine 有四个主要文件: - -- dag_engine.rs - Engine 的实现,具体功能包括从 YAML 读取、形成图、判断环和输出。 -- task.rs - 任务结构的实现。 -- graph.rs - 图的实现,用来记录任务之间的依赖关系。 -- error_handler.rs - 错误处理,只有最简单的错误输出。 - - - -四个文件的关系如下: - -``` - dag_engine - / | \ - / | \ - task.rs graph.rs error_handler - | | -error_handler error_handler -``` - diff --git a/dagrs/src/main.rs b/dagrs/src/main.rs index e95e9100239d1670967d8ea87231953083c2e041..fbe888f057f4b60b1649609b28c771e7a99dbf3d 100644 --- a/dagrs/src/main.rs +++ b/dagrs/src/main.rs @@ -2,24 +2,51 @@ * @Author: Yinwhe * @Date: 2022-01-19 14:14:28 * @LastEditors: Yinwhe - * @LastEditTime: 2022-01-26 23:39:46 + * @LastEditTime: 2022-02-06 13:48:41 * @Description: dagrs - * @Copyright: Copyright (c) 2022 */ extern crate bimap; extern crate yaml_rust; +mod dag_engine; mod error_handler; mod graph; mod task; -mod dag_engine; use dag_engine::DagEngine; fn main() { let mut dagrs = DagEngine::new(); - if let Err(e) = dagrs.run("test/test1.yaml") { - println!("[Error] {}", e); + if let Some(filename) = std::env::args().nth(1) { + if let Err(e) = dagrs.run(&filename) { + println!("[Error] {}", e); + } + } else { + println!("Usage: dargs ") } +} + +#[test] +fn test1() { + let res = DagEngine::new().run("test/test1.yaml").unwrap(); + assert_eq!(res, false); +} + +#[test] +fn test2() { + let res = DagEngine::new().run("test/test2.yaml").unwrap(); + assert_eq!(res, true) +} + +#[test] +fn test3() { + let res = DagEngine::new().run("test/test3.yaml").unwrap(); + assert_eq!(res, false) +} + +#[test] +fn test4() { + let res = DagEngine::new().run("test/test4.yaml").unwrap(); + assert_eq!(res, false) } \ No newline at end of file diff --git a/dagrs/src/task.rs b/dagrs/src/task.rs index 958c9f4d47088f87453476ad6e844f167d1193c6..b5900dfef831d11b38d556b8573606ba73b33215 100644 --- a/dagrs/src/task.rs +++ b/dagrs/src/task.rs @@ -2,9 +2,8 @@ * @Author: Yinwhe * @Date: 2022-01-25 17:49:19 * @LastEditors: Yinwhe - * @LastEditTime: 2022-01-26 23:18:04 + * @LastEditTime: 2022-02-06 13:40:58 * @Description: Task implementation - * @Copyright: Copyright (c) 2022 */ use crate::error_handler::DagError; @@ -17,12 +16,15 @@ pub struct Task { } impl Task { + /// Parse Task from Yaml pub fn from_yaml(info: &Yaml) -> Result { + // Get name first let name = info["name"] .as_str() .ok_or(DagError::error("Task name not found"))? .to_owned(); + // relys can be empty let mut relys = Vec::new(); if let Some(rely_tasks) = info["rely"].as_vec() { for rely_task_id in rely_tasks { diff --git a/dagrs/test/test2.yaml b/dagrs/test/test2.yaml new file mode 100644 index 0000000000000000000000000000000000000000..62ebc582962794d8dd04ef297088c68779862b28 --- /dev/null +++ b/dagrs/test/test2.yaml @@ -0,0 +1,24 @@ +dagrs: + a: + name: "任务1" + rely: [b, c] + b: + name: "任务2" + rely: [c, f, g] + c: + name: "任务3" + rely: [e, g] + d: + name: "任务4" + rely: [c, e] + e: + name: "任务5" + rely: [h] + f: + name: "任务6" + rely: [g] + g: + name: "任务7" + rely: [h] + h: + name: "任务8" \ No newline at end of file diff --git a/dagrs/test/test3.yaml b/dagrs/test/test3.yaml new file mode 100644 index 0000000000000000000000000000000000000000..80ad3e747899746db54ff78d8e53f52cd352dc85 --- /dev/null +++ b/dagrs/test/test3.yaml @@ -0,0 +1,25 @@ +dagrs: + a: + name: "任务1" + rely: [b, c] + b: + name: "任务2" + rely: [c, f, g] + c: + name: "任务3" + rely: [e, g] + d: + name: "任务4" + rely: [c, e] + e: + name: "任务5" + rely: [h] + f: + name: "任务6" + rely: [g] + g: + name: "任务7" + rely: [h] + h: + name: "任务8" + rely: [f] \ No newline at end of file diff --git a/dagrs/test/test4.yaml b/dagrs/test/test4.yaml new file mode 100644 index 0000000000000000000000000000000000000000..b0852cfe828bbea4f598b32dc8d6e61bf536afa0 --- /dev/null +++ b/dagrs/test/test4.yaml @@ -0,0 +1,4 @@ +dagrs: + a: + name: "任务1" + rely: [a] \ No newline at end of file