From 2e756567c8ca9940c0e4b68ee527e07371b9937e Mon Sep 17 00:00:00 2001 From: Yinwhe Date: Sun, 6 Feb 2022 13:43:30 +0800 Subject: [PATCH] Intern dagrs --- dagrs/README.md | 50 +++++++++++++++++++++++++++++++++++++++++++ dagrs/doc/doc.md | 24 --------------------- dagrs/src/main.rs | 37 +++++++++++++++++++++++++++----- dagrs/src/task.rs | 6 ++++-- dagrs/test/test2.yaml | 24 +++++++++++++++++++++ dagrs/test/test3.yaml | 25 ++++++++++++++++++++++ dagrs/test/test4.yaml | 4 ++++ 7 files changed, 139 insertions(+), 31 deletions(-) create mode 100644 dagrs/README.md delete mode 100644 dagrs/doc/doc.md create mode 100644 dagrs/test/test2.yaml create mode 100644 dagrs/test/test3.yaml create mode 100644 dagrs/test/test4.yaml diff --git a/dagrs/README.md b/dagrs/README.md new file mode 100644 index 00000000..2d1c7ec3 --- /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 d417a496..00000000 --- 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 e95e9100..fbe888f0 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 958c9f4d..b5900dfe 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 00000000..62ebc582 --- /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 00000000..80ad3e74 --- /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 00000000..b0852cfe --- /dev/null +++ b/dagrs/test/test4.yaml @@ -0,0 +1,4 @@ +dagrs: + a: + name: "任务1" + rely: [a] \ No newline at end of file -- Gitee