OpenXPKI

ワークフロー

ワークフローの要素

state

action

condition

validator

UI画面からのワークフローの開始

UIからワークフローを開始するには、以下のURLを指定する。

openxpki_workflow.png

ワークフローの情報や実行結果は、Clientが加工して最終的にEmber.jsへと渡されrenderされる。

Workflowのデータ

Workflowのstateは、アクションを実行するごとにアップデートされる。
PersisterはDBIのため、worflowテーブルのstateが都度更新される。

以下は、証明書発行ワークフローのポイントポイントで抽出したworkflowのデータ。
詳細は、「ワークフローの履歴」を見ると良い。

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30463
           pki_realm: democa
       workflow_type: certificate_signing_request_v2
      workflow_state: SETUP_REQUEST_TYPE
workflow_last_update: 2020-07-12 16:22:59
 workflow_proc_state: manual
  workflow_wakeup_at: 0
  workflow_count_try: 0
    workflow_reap_at: 1594571279
 workflow_archive_at: NULL
    workflow_session: JSON:{"user":"raop","role":"RA Operator"}
        watchdog_key: __CATCHME
1 row in set (0.000 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30463
           pki_realm: democa
       workflow_type: certificate_signing_request_v2
      workflow_state: ENTER_SUBJECT
workflow_last_update: 2020-07-12 16:23:11
 workflow_proc_state: manual
  workflow_wakeup_at: 0
  workflow_count_try: 0
    workflow_reap_at: 1594571291
 workflow_archive_at: NULL
    workflow_session: JSON:{"role":"RA Operator","user":"raop"}
        watchdog_key: __CATCHME
1 row in set (0.000 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30463
           pki_realm: democa
       workflow_type: certificate_signing_request_v2
      workflow_state: ENTER_CERT_INFO
workflow_last_update: 2020-07-12 16:23:15
 workflow_proc_state: manual
  workflow_wakeup_at: 0
  workflow_count_try: 0
    workflow_reap_at: 1594571295
 workflow_archive_at: NULL
    workflow_session: JSON:{"user":"raop","role":"RA Operator"}
        watchdog_key: __CATCHME
1 row in set (0.000 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30463
           pki_realm: democa
       workflow_type: certificate_signing_request_v2
      workflow_state: SUBJECT_COMPLETE
workflow_last_update: 2020-07-12 16:23:31
 workflow_proc_state: manual
  workflow_wakeup_at: 0
  workflow_count_try: 0
    workflow_reap_at: 1594571310
 workflow_archive_at: NULL
    workflow_session: JSON:{"user":"raop","role":"RA Operator"}
        watchdog_key: __CATCHME
1 row in set (0.000 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30463
           pki_realm: democa
       workflow_type: certificate_signing_request_v2
      workflow_state: ENTER_KEY_PASSWORD
workflow_last_update: 2020-07-12 16:23:37
 workflow_proc_state: manual
  workflow_wakeup_at: 0
  workflow_count_try: 0
    workflow_reap_at: 1594571317
 workflow_archive_at: NULL
    workflow_session: JSON:{"role":"RA Operator","user":"raop"}
        watchdog_key: __CATCHME
1 row in set (0.001 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30463
           pki_realm: democa
       workflow_type: certificate_signing_request_v2
      workflow_state: PENDING
workflow_last_update: 2020-07-12 16:23:55
 workflow_proc_state: manual
  workflow_wakeup_at: 0
  workflow_count_try: 0
    workflow_reap_at: 1594571335
 workflow_archive_at: NULL
    workflow_session: JSON:{"user":"raop","role":"RA Operator"}
        watchdog_key: __CATCHME
1 row in set (0.000 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30463
           pki_realm: democa
       workflow_type: certificate_signing_request_v2
      workflow_state: NICE_CERTIFICATE_ISSUED_CSR_PERSIST_METADATA_0
workflow_last_update: 2020-07-12 16:24:47
 workflow_proc_state: running
  workflow_wakeup_at: 0
  workflow_count_try: 0
    workflow_reap_at: 1594571387
 workflow_archive_at: NULL
    workflow_session: JSON:{"user":"raop","role":"RA Operator"}
        watchdog_key: __CATCHME
1 row in set (0.000 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30719
           pki_realm: democa
       workflow_type: certificate_publishing
      workflow_state: WAITING_FOR_START
workflow_last_update: 2020-07-12 16:24:51
 workflow_proc_state: pause
  workflow_wakeup_at: 1594571092
  workflow_count_try: 1
    workflow_reap_at: 1594571391
 workflow_archive_at: NULL
    workflow_session: JSON:{"user":"raop","role":"RA Operator"}
        watchdog_key: __CATCHME
1 row in set (0.001 sec)

ERROR: No query specified

MariaDB [openxpki]> select * from workflow where workflow_id in (select max(workflow_id) from workflow) \G;
*************************** 1. row ***************************
         workflow_id: 30719
           pki_realm: democa
       workflow_type: certificate_publishing
      workflow_state: SUCCESS
workflow_last_update: 2020-07-12 16:24:54
 workflow_proc_state: finished
  workflow_wakeup_at: 1594571092
  workflow_count_try: 0
    workflow_reap_at: 1594571394
 workflow_archive_at: NULL
    workflow_session: JSON:{"user":"raop","role":"RA Operator"}
        watchdog_key: __CATCHME
1 row in set (0.000 sec)

ERROR: No query specified

ワークフロー履歴は以下のとおり。

MariaDB [openxpki]> select workflow_hist_id, workflow_id, workflow_action, workflow_state from workflow_history where workflow_id = 30463 order by workflow_history_date;
+------------------+-------------+------------------------------------+------------------------------------------------+
| workflow_hist_id | workflow_id | workflow_action                    | workflow_state                                 |
+------------------+-------------+------------------------------------+------------------------------------------------+
|           249343 |       30463 | csr_select_profile                 | INITIAL                                        |
|           249599 |       30463 | csr_provide_server_key_params      | SETUP_REQUEST_TYPE                             |
|           249855 |       30463 | csr_edit_subject                   | ENTER_SUBJECT                                  |
|           250111 |       30463 | global_skip                        | ENTER_SAN                                      |
|           250367 |       30463 | csr_edit_cert_info                 | ENTER_CERT_INFO                                |
|           250623 |       30463 | global_render_subject              | BUILD_SUBJECT                                  |
|           250879 |       30463 | csr_set_workflow_attributes        | BUILD_SUBJECT_GLOBAL_RENDER_SUBJECT_0          |
|           251135 |       30463 | csr_check_policy_dns               | BUILD_SUBJECT_GLOBAL_RENDER_SUBJECT_1          |
|           251391 |       30463 | csr_check_policy_subject_duplicate | BUILD_SUBJECT_GLOBAL_RENDER_SUBJECT_2          |
|           251647 |       30463 | csr_check_policy_key_duplicate     | BUILD_SUBJECT_GLOBAL_RENDER_SUBJECT_3          |
|           251903 |       30463 | csr_submit                         | SUBJECT_COMPLETE                               |
|           252159 |       30463 | csr_eval_eligibility               | SUBJECT_COMPLETE_CSR_SUBMIT_0                  |
|           252415 |       30463 | global_noop                        | CHECK_FOR_SERVER_KEYGEN                        |
|           252671 |       30463 | csr_retype_server_password         | ENTER_KEY_PASSWORD                             |
|           252927 |       30463 | csr_generate_key                   | HAS_KEY_PASSWORD                               |
|           253183 |       30463 | csr_generate_pkcs10                | KEY_GENERATED                                  |
|           253439 |       30463 | global_store_pkey_in_datapool      | KEY_GENERATED_CSR_GENERATE_PKCS10_0            |
|           253695 |       30463 | csr_notify_pending                 | NOTIFY_CSR_PENDING                             |
|           253951 |       30463 | csr_flag_pending_notification_send | NOTIFY_CSR_PENDING_CSR_NOTIFY_PENDING_0        |
|           254207 |       30463 | global_noop                        | CHECK_POLICY_VIOLATION                         |
|           254463 |       30463 | csr_approve_csr                    | PENDING                                        |
|           254719 |       30463 | csr_notify_approval                | CHECK_APPROVALS                                |
|           254975 |       30463 | global_persist_csr                 | APPROVED                                       |
|           255231 |       30463 | global_nice_issue_certificate      | APPROVED_GLOBAL_PERSIST_CSR_0                  |
|           255487 |       30463 | global_noop                        | NICE_PICKUP_CERTIFICATE                        |
|           255743 |       30463 | csr_persist_metadata               | NICE_CERTIFICATE_ISSUED                        |
|           255999 |       30463 | csr_notify_issued                  | NICE_CERTIFICATE_ISSUED_CSR_PERSIST_METADATA_0 |
|           256767 |       30463 | csr_publish_certificate            | NICE_CERTIFICATE_ISSUED_CSR_PERSIST_METADATA_1 |
+------------------+-------------+------------------------------------+------------------------------------------------+
28 rows in set (0.001 sec)

MariaDB [openxpki]> select workflow_hist_id, workflow_id, workflow_action, workflow_state from workflow_history where workflow_id = 30719 order by workflow_history_date;
+------------------+-------------+-----------------------------+-------------------+
| workflow_hist_id | workflow_id | workflow_action             | workflow_state    |
+------------------+-------------+-----------------------------+-------------------+
|           256255 |       30719 | certpublish_initialize      | INITIAL           |
|           256511 |       30719 | global_disconnect           | WAITING_FOR_START |
|           257023 |       30719 | global_disconnect           | WAITING_FOR_START |
|           257279 |       30719 | global_disconnect           | WAITING_FOR_START |
|           257535 |       30719 | certpublish_publish_profile | PUBLISH           |
+------------------+-------------+-----------------------------+-------------------+
5 rows in set (0.000 sec)

INITIAL > SETUP_REQUEST_TYPE > ENTER_SUBJECT ... とstateを遷移している。

Workflow実行時の属性(attribute)

Worflowでは、Workflow実行時のメタ情報をKey-Valueのペアで保存することができる。これは、workflow_attributeのテーブルに格納される。一方、workflow_contextというテーブルもあり、同様にKey-Valueのペアで値を保存するテーブルがある。明確な使い分けは定かではないが、contextはWorkflowプロセスの実行時で共有されるプロパティ情報のようなものだろう(おそらく)。$context->paramで更新した内容は内部で更新有無を情報として記憶している。action間でデータの更新を確認することができるだろう。

ベースのライブラリであるPerlのWorkflowにもContextクラスがあり、read-writeのプロパティとして使用されている。
URL https://metacpan.org/source/JONASBN/Workflow-1.48/lib/Workflow.pm#L26

参考 workflow関連のテーブル(履歴historyテーブルは割愛)

MariaDB [openxpki]> desc workflow;
+----------------------+-----------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+-------------------------------+
| Field                | Type                                                                                                                  | Null | Key | Default             | Extra                         |
+----------------------+-----------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+-------------------------------+
| workflow_id          | bigint(20) unsigned                                                                                                   | NO   | PRI | NULL                |                               |
| pki_realm            | varchar(255)                                                                                                          | YES  | MUL | NULL                |                               |
| workflow_type        | varchar(255)                                                                                                          | YES  |     | NULL                |                               |
| workflow_state       | varchar(255)                                                                                                          | YES  |     | NULL                |                               |
| workflow_last_update | timestamp                                                                                                             | NO   |     | current_timestamp() | on update current_timestamp() |
| workflow_proc_state  | enum('init','running','manual','pause','finished','archived','failed','wakeup','resume','exception','retry_exceeded') | YES  |     | init                |                               |
| workflow_wakeup_at   | int(10) unsigned                                                                                                      | YES  | MUL | NULL                |                               |
| workflow_count_try   | int(10) unsigned                                                                                                      | YES  |     | NULL                |                               |
| workflow_reap_at     | int(10) unsigned                                                                                                      | YES  | MUL | NULL                |                               |
| workflow_archive_at  | int(10) unsigned                                                                                                      | YES  | MUL | NULL                |                               |
| workflow_session     | longtext                                                                                                              | YES  |     | NULL                |                               |
| watchdog_key         | varchar(64)                                                                                                           | YES  |     | NULL                |                               |
+----------------------+-----------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+-------------------------------+
12 rows in set (0.010 sec)

MariaDB [openxpki]> desc workflow_context;
+------------------------+---------------------+------+-----+---------+-------+
| Field                  | Type                | Null | Key | Default | Extra |
+------------------------+---------------------+------+-----+---------+-------+
| workflow_id            | bigint(20) unsigned | NO   | PRI | NULL    |       |
| workflow_context_key   | varchar(255)        | NO   | PRI | NULL    |       |
| workflow_context_value | longtext            | YES  |     | NULL    |       |
+------------------------+---------------------+------+-----+---------+-------+
3 rows in set (0.001 sec)

MariaDB [openxpki]> desc workflow_attributes;
+----------------------+---------------------+------+-----+---------+-------+
| Field                | Type                | Null | Key | Default | Extra |
+----------------------+---------------------+------+-----+---------+-------+
| workflow_id          | bigint(20) unsigned | NO   | PRI | NULL    |       |
| attribute_contentkey | varchar(255)        | NO   | PRI | NULL    |       |
| attribute_value      | varchar(4000)       | YES  | MUL | NULL    |       |
+----------------------+---------------------+------+-----+---------+-------+
3 rows in set (0.001 sec)

Workflow定義でのContextへ値を設定する

contextは、workflow_contextテーブルに格納される。

Key-Valueのペアをcontext配下に追加

    set_context:                                                                                                                                                                                                        
        class: OpenXPKI::Server::Workflow::Activity::Tools::SetContext                                                                                                                                                  
        param:                                                                                                                                                                                                          
            my_context_value: 1                                                                                                                                                                                         

workflow_contextの中身

|       35583 | my_context_value     | 1                                       |

Hashをcontext配下に追加

serializeされデータベースに保存される。

    set_context:                                                                                                                                                                                                        
        class: OpenXPKI::Server::Workflow::Activity::Tools::WFHash                                                                                                                                                  
        param:
            hash_name: my_hash
            hash_key: hoge
            hash_value: $crl_list.ca-signer-1                    

workflow_contextの中身
hash_valueは、文字列そのまま。

|       35327 | my_hash              | OXJSF1:{"hoge":"$crl_list.ca-signer-1"} |

Arrayのペアをcontext配下に追加

serializeされデータベースに保存される。

    set_context:                                                                                                                                                                                                        
        class: OpenXPKI::Server::Workflow::Activity::Tools::WFArray                                                                                                                                                  
        param:                                                                                                                                                                                                          
           array_name: my_message
           context_key: my_array
           function: push                                                                                                                                                                                               

workflow_contextの中身
contextにmy_keyで値がある場合

|       43519 | my_array             | my_message                              |
|       43519 | my_message           | OXJSF1:["my_message"]                   |

_map_表記によるテンプレート適用

ワークフロー定義の中に_map_xxxxというパラメータ定義があるが、actionの初期化時に_map_は除去されて、xxxxとなる。Value部分はクエリやテンプレートとしての値を埋め込める。

 例:userの値を読む
 
   set_context:                                                                                                                                                                                                        
        class: OpenXPKI::Server::Workflow::Activity::Tools::WFHash                                                                                                                                                  
        param:                                                                                                                                                                                                          
            hash_name: my_hash
            hash_key:  my_key
            _map_hash_value: "[% session.user %]"

workflow_contextの中身
userは、raopでログイン。

|       43775 | my_hash              | OXJSF1:{"my_key":"raop"}       |

Workflow定義でAttributeへ値を設定する

attributeは、workflow_attributesテーブルに格納される。

    set_attribute:                                                                                                                                                                                                      
        class: OpenXPKI::Server::Workflow::Activity::Tools::SetAttribute                                                                                                                                                
        param:                                                                                                                                                                                                          
            my_attribute_value: 2
            _map_my_attribute_map_value: "[% session.user %]"

workflow_attributesテーブルの中身

|       44799 | my_attribute_map_value | raop                                                       |
|       44799 | my_attribute_value     | 2                                                          |

stateの入出力

入力

workflowのactionでは、actionが必要とする入力を定義することができる。

以下は、証明書申請のリジェクト時のactionの定義である。

certificate_signing_request_v2.yaml の一部の例

    reject_request:
	class: OpenXPKI::Server::Workflow::Activity::Noop
        label: I18N_OPENXPKI_UI_WORKFLOW_ACTION_CSR_REJECT_REQUEST_LABEL
        description: I18N_OPENXPKI_UI_WORKFLOW_ACTION_CSR_REJECT_REQUEST_DESC
        input:
          - reject_comment

inputキーに指定されているreject_commentは、workflowの定義ファイルで指定されている。

フィールドreject_commentの定義

    reject_comment:
        label: I18N_OPENXPKI_UI_WORKFLOW_FIELD_REJECT_COMMENT_LABEL
        name: reject_comment
        description: I18N_OPENXPKI_UI_WORKFLOW_FIELD_REJECT_COMMENT_DESC
        placeholder: I18N_OPENXPKI_UI_WORKFLOW_FIELD_REJECT_COMMENT_PLACEHOLDER
        tooltip: I18N_OPENXPKI_UI_WORKFLOW_FIELD_REJECT_COMMENT_TOOLTIP
        type: text
        required: 0

inputで渡される情報は、workflowのcontextオブジェクトから参照できる。

出力

workflowのstateにはoutputという属性を持たせることができる。ここには、filedに関する定義を行うことができる。filedは、workflowの定義ファイルで行う。workflow定義ファイル内に存在しない場合は、globalの定義から検索される。

certificate_signing_request_v2.yaml の一部の例

    SUCCESS:
        label: I18N_OPENXPKI_UI_WORKFLOW_STATE_CSR_SUCCESS_LABEL
        description: I18N_OPENXPKI_UI_WORKFLOW_STATE_CSR_SUCCESS_DESC
        output:
          - cert_identifier
          - cert_subject
          - cert_subject_alt_name
          - notbefore
          - notafter
          - cert_profile
          - certsign_token_select
          - cert_info

stateがSUCCESSの状態で、フィールドcert_identifierなどの情報が表示される。フィールドcert_identifierはworkflow定義ファイルで定義されていないので、globalから探索される。globalにはcert_identifier.yamlという名前で以下のフィールド定義ファイルがある。

global/field/cert_identifier.yaml

label: I18N_OPENXPKI_UI_WORKFLOW_FIELD_CERT_IDENTIFIER_LABEL
name: cert_identifier
description: I18N_OPENXPKI_UI_WORKFLOW_FIELD_CERT_IDENTIFIER_DESC
placeholder: I18N_OPENXPKI_UI_WORKFLOW_FIELD_CERT_IDENTIFIER_PLACEHOLDER
tooltip: I18N_OPENXPKI_UI_WORKFLOW_FIELD_CERT_IDENTIFIER_TOOLTIP
type: cert_identifier
required: 1
template: "[% USE Certificate %][% value %]<br/>[% Certificate.body(value, 'subject') %]"
api_type: Str

参考 core/server/OpenXPKI/Server/API2/Plugin/Workflow/Util.pm - on https://github.com/openxpki/openxpki/blob/v3.6.0/core/server/OpenXPKI/Server/API2/Plugin/Workflow/Util.pm#L459

WebUIでの表示

workflowについては、OpenXPKI/Client/UI/Workflow.pm#__render_from_workflowが基本である。
しかし、表示が特殊なtypeの場合は、workflowのaction定義にuihandleというrenderのためのクラス指定がされている場合があり、その場合は指定されたhandlerクラスによる出力が行われる。

参考 OpenXPKI/Client/UI/Workflow.pm#__render_workflow_info - on https://github.com/openxpki/openxpki/blob/v3.6.0/core/server/OpenXPKI/Client/UI/Workflow.pm#L3040

参考リンク


添付ファイル: fileopenxpki_workflow.png 33件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP