Mistrial是mirantis公司爲openstack開發的工做流組件,提供WorkFlow as a service。 典型的用戶用例包括雲平臺的任務計劃服務(Cloud Cron),任務調度(Task Scheduling), 複雜的運行時間長的業務流程服務。目前項目還在開始階段。對應的是AWS的SWS(Simple WorkFlow Service)。python
項目wiki:https://wiki.openstack.org/wiki/Mistralgit
項目Code: https://github.com/stackforge/mistralgithub
Workbook: 工做本,用戶的工做流接口,能夠理解成一篇任務文檔用來錄入用戶的工做流程,步驟,須要完成的任務。每一個任務的執行順序,依賴關係,以及每一個任務完成以後產生的事件。站在用戶的角度,這篇文檔完整的記錄了某項任務的流程,讓執行者可以清楚怎麼完成。站在開發人員的角度,爲了方便編程。定義了一種新的語言DSL(下面會有介紹),用來描述整個工做流。shell
Task: 即工做流的具體步驟。能夠是Action的集合。
數據庫
Action: Mistral的最小單位。特指一個具體的工做,好比說發送一個HTTP請求,或者運行某條命令。
編程
Flow:工做流。 指的是Mistral系統中如何執行task,解析task的依賴關係等等,從而讓task順利結束,並返回狀態。
後端
WorkFlow Execution: 工做流執行紀錄。就是指某次具體的Flow,每次執行task產成的WorkFlow Execution會永久保存在數據庫中,方便後續查詢,或者從新執行Flow。api
這是Mistral自定義的工做流定義語言。在業界,工做流程管理 已經存在某些語言,可參考:測試
http://en.wikipedia.org/wiki/Business_Process_Execution_Languageurl
http://en.wikipedia.org/wiki/YAWL
Mistral 使用YAML 來定義工做流 wiki: https://wiki.openstack.org/wiki/Mistral/DSL
從Github下載最新的代碼,安裝好運行環境。同時啓動API和executor服務
tox -evenv -- python mistral/cmd/launch.py --server executor --config-file etc/mistral.conf tox -evenv -- python mistral/cmd/launch.py --server api --config-file etc/mistral.conf
而後運行「scripts/upload_workbook_and_run.py」 腳本,能夠清楚看到整個流程。
[ray@fedora mistral]$ python scripts/upload_workbook_and_run.py Created workbook: Workbook [description='My test workbook', name='my_workbook', tags='[u'test']'] Uploaded workbook: " Services: MyRest: type: REST_API parameters: baseUrl: http://localhost:8989/v1/ actions: my-action: parameters: url: workbooks method: GET Workflow: tasks: my_task: action: MyRest:my-action # events: # my_event: # type: periodic # tasks: my_task # parameters: # cron-pattern: "* * * * *" " execution: Execution [state='RUNNING', task='my_task', id='b5cf7e00-ef5d-46d7-b505-2d23809d29d0', context='None', workbook_name='my_workbook'] execution: Execution [state='RUNNING', task='my_task', id='b5cf7e00-ef5d-46d7-b505-2d23809d29d0', context='None', workbook_name='my_workbook'] execution: Execution [state='SUCCESS', task='my_task', id='b5cf7e00-ef5d-46d7-b505-2d23809d29d0', context='None', workbook_name='my_workbook']
咱們能夠裝上Misttral client (https://github.com/stackforge/python-mistralclient)來看看到底發生了什麼。首先看看系統中存在哪些workbook,已經剛剛運行的my-wokbook
[ray@fedora mistral]$ mistral workbook-list Starting new HTTP connection (1): localhost +---------------+------------------+------+ | Name | Description | Tags | +---------------+------------------+------+ | echo_workbook | My test workbook | test | | my_workbook | My test workbook | test | +---------------+------------------+------+ [ray@fedora mistral]$ mistral workbook-get-definition my_workbook Starting new HTTP connection (1): localhost Services: MyRest: type: REST_API parameters: baseUrl: http://localhost:8989/v1/ actions: my-action: parameters: url: workbooks method: GET Workflow: tasks: my_task: action: MyRest:my-action # events: # my_event: # type: periodic # tasks: my_task # parameters: # cron-pattern: "* * * * *"
這個workbook,首先定義了一個服務(在系統中註冊個新的服務,服務通常都包含定義好的action,這樣用戶就能夠在task flow中指定運行這個action),這個服務類型是REST,而後參數有哪些等等。而後定義了一個工做流,其中的任務列表(tasks)第一個是my_task (taks名字),這個task作了一件事情,就是運行一次MyRest服務中的my_action動做。
在看看另一個workbook, 就簡單定義個一個ECHO type的服務。這個服務僅在內部測試使用,就直接返回ECHO值。
[ray@fedora mistral]$ mistral workbook-get-definition echo_workbook Starting new HTTP connection (1): localhost Services: MyEcho: type: ECHO actions: EchoWords: parameters: word: optional: False Workflow: tasks: logPassTask: action: MyEcho:EchoWords parameters: word: "log pass" MyEchoTask: action: MyEcho:EchoWords parameters: word: "hello, world" on-success: logPassTask
具體的運行log:
[ray@fedora mistral]$ mistral execution-get echo_workbook bcf47b8c-6d44-4732-b32d-ebef92662f38 Starting new HTTP connection (1): localhost +----------+--------------------------------------+ | Field | Value | +----------+--------------------------------------+ | ID | bcf47b8c-6d44-4732-b32d-ebef92662f38 | | Workbook | echo_workbook | | Target | MyEchoTask | | State | SUCCESS | +----------+--------------------------------------+ [ray@fedora mistral]$ mistral task-list echo_workbook bcf47b8c-6d44-4732-b32d-ebef92662f38 Starting new HTTP connection (1): localhost +--------------------------------------+---------------+--------------------------------------+-------------+-------------+---------+--------+ | ID | Workbook | Execution | Name | Description | State | Tags | +--------------------------------------+---------------+--------------------------------------+-------------+-------------+---------+--------+ | e5cb4a7a-b6c6-46ec-b62b-aa385bd3f8c2 | echo_workbook | bcf47b8c-6d44-4732-b32d-ebef92662f38 | MyEchoTask | <none> | SUCCESS | <none> | | 1c99cc02-e1b0-44c2-b961-8589164bb851 | echo_workbook | bcf47b8c-6d44-4732-b32d-ebef92662f38 | logPassTask | <none> | SUCCESS | <none> | +--------------------------------------+---------------+--------------------------------------+-------------+-------------+---------+--------+
上面的實戰例子可能沒讓你們意識到mistral跟openstack的關係,而後相信這個workbook 會讓你們明白。
https://wiki.openstack.org/wiki/Mistral/DSL#Full_YAML_example:
關於VM的工做流,建立NOVA VM。 Mistral開發組正在實現這種類型的workbook,即集成openstack服務。這樣用戶就不須要用openstack CLI or API來操做,能夠直接編寫workbook(簡單編寫文檔,而不是寫code),讓mistral幫你作完整個工做流程。
另外關於Mistral和taskflow的集成:
Mistral在實現的過程當中,須要開發大量的工做流代碼。這跟openstack項目庫中TaskFlow 目的有些相似。爲了不重複勞動,兩邊的開發者已經在討論,在Mistral代碼中,後端的工做流代碼儘可能採用taskflow做爲後端。
這裏有最近的討論記錄: https://github.com/enykeev/mistral/pull/1
全文完。 轉載請保留出處。