フロー内の状態を条件付きで切り替える
この手順では、複数状態フローを実装する方法を示します。
このサンプル・コードは、リソースをチェックして更新するフローを設計する方法を示しています。 リソースが存在しない場合は、フローによって新しいリソースが作成されます。
- Visual Studio Codeでアダプタ定義ドキュメントを開きます。
- ドキュメントの
flowsコード・セクションで、特定のリソースへのGETコールを含むフローのコードを追加します。次のコード・サンプルでは、
httpInvokeファンクションがGETコールを実装しています。"flows": { "EventRegisterFlow": { "id": "EventRegisterFlow", "description": "EventRegisterFlow", "specVersion": "0.8", "version": "0.1", "start": "startState", "functions": [ { "name": "httpInvoke", "type": "custom", "operation": "connectivity::rest" } ], "states": [ { "name": "startState", "type": "operation", "actions": [ { "name": "httpInvoke", "functionRef": { "refName": "retriveListOfSubscriptionFunc", "arguments": { "uri": "${\"https:/\"+\"/\"+.connectionProperties.hostNameTrigger+\"/repos/{owner}/{repo}/hooks\"}", "method": "GET", "parameters": { "owner": "${ .configuration.orgId }", "repo": "${ .configuration.repositoryId }" } } }, "actionDataFilter": { "results": "${ .body}", "toStateData": "${ .subscriptions }" } } ], "end": true } } - 特定のリソースが存在するかどうかを評価するアクションをフローに追加します。
サンプル・コード:
"functions": [ ... { "name": "SubscriptionExistsFunction", "operation": "[.integrationProperties.INTEGRATION_FLOW_URL==.subscriptions[].config.url]|any", "type": "expression" }, { "name": "getSubscriptionId", "type": "expression", "operation": "[{subscription:.subscriptions[], INTEGRATION_FLOW_URL:.integrationProperties.INTEGRATION_FLOW_URL}] | map(select(.subscription.config.url==.INTEGRATION_FLOW_URL))[0].subscription.id | tostring" } ], "states": [ { "name": "startState", "type": "operation", "actions": [ ... { "functionRef": "SubscriptionExistsFunction", "actionDataFilter": { "toStateData": "${ .subscriptionExists }" } }, { "functionRef": "getSubscriptionId", "actionDataFilter": { "toStateData": "${ .subscriptionId }" } } ], end: true } - リソースを作成または登録できる別の状態に遷移するスイッチ状態を追加します。
サンプル・コード:
"flows": { "EventRegisterFlow": { "id": "EventRegisterFlow", "description": "EventRegisterFlow", "specVersion": "0.8", "version": "0.1", "start": "startState", "functions": [ ... ], "states": [ { "name": "startState", "type": "operation", "actions": [ ... ], "transition": "SwitchBasedOnSubscription" }, { "name": "SwitchBasedOnSubscription", "type": "switch", "dataConditions": [ { "condition": "${ .subscriptionExists == true }", "transition": "UpdateRepositoryEndpoint" }, { "condition": "${ .subscriptionExists == false }", "transition": "RegisterRepositoryEvent" } ], "defaultCondition": { "transition": "RegisterRepositoryEvent" } }, } - スイッチから分岐する終了状態を追加します。
終了状態には、必要なアクションが含まれます。
サンプル・コード:
"flows": { "EventRegisterFlow": { "id": "EventRegisterFlow", "description": "EventRegisterFlow", "specVersion": "0.8", "version": "0.1", "start": "startState", "functions": [ ... ], "states": [ { "name": "startState", "type": "operation", "actions": [ ... ], "transition": "SwitchBasedOnSubscription" }, { "name": "SwitchBasedOnSubscription", "type": "switch", "dataConditions": [ { "condition": "${ .subscriptionExists == true }", "transition": "UpdateRepositoryEndpoint" }, { "condition": "${ .subscriptionExists == false }", "transition": "RegisterRepositoryEvent" } ], "defaultCondition": { "transition": "RegisterRepositoryEvent" } }, { "name": "UpdateRepositoryEndpoint", "type": "operation", "actions": [ { "name": "UpdateRepositoryEnpointAction", "functionRef": { "refName": "httpInvoke", "arguments": { "uri": "${\"https:/\"+\"/\"+.connectionProperties.hostNameTrigger+\"/repos/{owner}/{repo}/hooks/{subscriptionId}\"}", "parameters": { "owner": "${ .configuration.orgId }", "repo": "${ .configuration.repositoryId }" "subscriptionId": "${ .subscriptionId }" }, "method": "POST", "body": "${ { \"name\": \"web\", \"active\": true, \"events\": [.configuration.eventName] } }" } }, "actionDataFilter": { "results": "${.body}", "toStateData": "${ .output }" }, "condition": "${ .subscriptionExists==true }" } ], "end": true }, { "name": "RegisterRepositoryEvent", "type": "operation", "actions": [ { "name": "RepositoryEventRegisterAction", "functionRef": { "refName": "httpInvoke", "arguments": { "uri": "${\"https:/\"+\"/\"+.connectionProperties.hostNameTrigger+\"/repos/{owner}/{repo}/hooks\"}", "parameters": { "owner": "${ .configuration.orgId }", "repo": "${ .configuration.repositoryId }" "subscriptionId": "${ .subscriptionId }" }, "method": "POST", "body": "${ { \"name\": \"web\", \"active\": true, \"events\": [.configuration.eventName], \"config\": { \"content_type\": \"json\", \"secret\": .connectionProperties.\"trigger.secret\", \"url\": .integrationProperties.INTEGRATION_FLOW_URL } } }" } }, "actionDataFilter": { "results": "${.body}", "toStateData": "${ .output }" }, "condition": "${ .subscriptionExists==false }" } ], "end": true } ] }, }完全なサンプル・コード:
"flows": { "EventRegisterFlow": { "id": "EventRegisterFlow", "description": "EventRegisterFlow", "specVersion": "0.8", "version": "0.1", "start": "startState", "functions": [ { "name": "httpInvoke", "type": "custom", "operation": "connectivity::rest" }, { "name": "SubscriptionExistsFunction", "operation": "[.integrationProperties.INTEGRATION_FLOW_URL==.subscriptions[].config.url]|any", "type": "expression" }, { "name": "getSubscriptionId", "type": "expression", "operation": "[{subscription:.subscriptions[], INTEGRATION_FLOW_URL:.integrationProperties.INTEGRATION_FLOW_URL}] | map(select(.subscription.config.url==.INTEGRATION_FLOW_URL))[0].subscription.id | tostring" } ], "states": [ { "name": "startState", "type": "operation", "actions": [ { "name": "httpInvoke", "functionRef": { "refName": "retriveListOfSubscriptionFunc", "arguments": { "uri": "${\"https:/\"+\"/\"+.connectionProperties.hostNameTrigger+\"/repos/{owner}/{repo}/hooks\"}", "method": "GET", "parameters": { "owner": "${ .configuration.orgId }", "repo": "${ .configuration.repositoryId }" } } }, "actionDataFilter": { "results": "${ .body}", "toStateData": "${ .subscriptions }" } }, { "functionRef": "SubscriptionExistsFunction", "actionDataFilter": { "toStateData": "${ .subscriptionExists }" } }, { "functionRef": "getSubscriptionId", "actionDataFilter": { "toStateData": "${ .subscriptionId }" } } ], "transition": "SwitchBasedOnSubscription" }, { "name": "SwitchBasedOnSubscription", "type": "switch", "dataConditions": [ { "condition": "${ .subscriptionExists == true }", "transition": "UpdateRepositoryEndpoint" }, { "condition": "${ .subscriptionExists == false }", "transition": "RegisterRepositoryEvent" } ], "defaultCondition": { "transition": "RegisterRepositoryEvent" } }, { "name": "UpdateRepositoryEndpoint", "type": "operation", "actions": [ { "name": "UpdateRepositoryEnpointAction", "functionRef": { "refName": "httpInvoke", "arguments": { "uri": "${\"https:/\"+\"/\"+.connectionProperties.hostNameTrigger+\"/repos/{owner}/{repo}/hooks/{subscriptionId}\"}", "parameters": { "owner": "${ .configuration.orgId }", "repo": "${ .configuration.repositoryId }" "subscriptionId": "${ .subscriptionId }" }, "method": "POST", "body": "${ { \"name\": \"web\", \"active\": true, \"events\": [.configuration.eventName] } }" } }, "actionDataFilter": { "results": "${.body}", "toStateData": "${ .output }" }, "condition": "${ .subscriptionExists==true }" } ], "end": true }, { "name": "RegisterRepositoryEvent", "type": "operation", "actions": [ { "name": "RepositoryEventRegisterAction", "functionRef": { "refName": "httpInvoke", "arguments": { "uri": "${\"https:/\"+\"/\"+.connectionProperties.hostNameTrigger+\"/repos/{owner}/{repo}/hooks\"}", "parameters": { "owner": "${ .configuration.orgId }", "repo": "${ .configuration.repositoryId }" "subscriptionId": "${ .subscriptionId }" }, "method": "POST", "body": "${ { \"name\": \"web\", \"active\": true, \"events\": [.configuration.eventName], \"config\": { \"content_type\": \"json\", \"secret\": .connectionProperties.\"trigger.secret\", \"url\": .integrationProperties.INTEGRATION_FLOW_URL } } }" } }, "actionDataFilter": { "results": "${.body}", "toStateData": "${ .output }" }, "condition": "${ .subscriptionExists==false }" } ], "end": true } ] }, }