SAP Build Process Automation: 自作のAPIからActionを作る

## はじめに
この記事は、[SAP Build Process AutomationでBTPのユーザ登録を自動化する](https://qiita.com/tami/items/5d1fa776d7370727424c)シリーズの続きです。[前回](https://qiita.com/tami/items/01905dd060798de2d5ea)の記事では、Cloud Foundryにユーザ登録するためのAPIを作成しました。今回はこのAPIをSAP Build Process AutomationのActionとして使えるように設定を行います。

## Actionとは
Process AutomationのフローからAPIを呼び出すときに使うものです。"Action"というオブジェクトを事前に作成し、使用するAPIのエンドポイントや、APIに渡す項目の事前設定をしておきます。使用しない項目は削除するなど、フローから使いやすいようにAPIをカスタマイズしておくことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/25c0c74e-88c0-df3a-2823-6c8df135f282.png)

## Actionの登録準備
Actionの登録に必要なものは2つです。

- Destination
Actionとして使えるようにするために、以下のプロパティを設定したDestinationを作成しておきます。
`sap.applicationdevelopment.actions.enabled: true`
`sap.processautomation.enabled: true`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/86d034a6-3346-809c-9807-0fbb4a719686.png)
作成したDestinationをProcess AutomationのSettings>Destinationsにも追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/d7fbeb08-449e-56f0-fbac-cc3c8a922089.png)

- Open API仕様で記述したAPIの仕様
[Swagger](https://swagger.io/)を使用してAPIの仕様を作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5bd9c82e-23b2-dac4-d3c3-ad4a55a2637e.png)

```yaml
openapi: 3.0.0
info:
  description: Execute Cloud Foundry command
  version: "1.0.0"
  title: Cloud foundry command
paths:
  /spaceuser:
    post:
      operationId: addSpaceUser
      description: Adds a user to Cloud foundry space
      responses:
        '200':
          description: space user was added
          content:
            application/json:
              schema: 
                  type: object
                  items:
                    $ref: '#/components/schemas/Response'
                  example:
                    result: 'Space user was addedded successfully.'
        '400':
          description: 'invalid input, object invalid'
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserRole'
        description: User and role to add
components:
  schemas:
    UserRole:
      type: object
      properties:
        user:
          type: string
        role:
          type: string
      description: User and space role
    Response:
      type: object
      properties:
        result:
          type: string
servers:
  # Added by API Auto Mocking Plugin
  - description: SwaggerHub API Auto Mocking
    url: https://virtserver.swaggerhub.com/MIOFUJITA01/cfcommand/1.0.0
```
作成した仕様を Export> Download API> JSON Resolvedを選択してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6bda504c-e04c-3080-8d44-2b3e3c7acf62.png)

## Actionの登録
### 1. Actionの登録
Process Automationのロビーからアクションを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/2b553ca9-3ed5-8d64-5c82-a16485a05cf2.png)
ダウンロードしておいたAPI仕様を選択して登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/d58de5e4-1917-38a2-00fc-0c1e090490b4.png)
使用するエンドポイントを選択して（ここでは一つしかありませんが）追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e1eb750d-63e8-95a5-5957-060c644ae3c4.png)
### 2. パラメータの設定
今回Cloud Foundryのロールは"SpaceDeveloper"のみを使用するので、固定値で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/92dcadf2-d35a-57c8-6ef6-49b08d6924d5.png)
### 3. テスト
TestタブからAPIをテストします。Destinationを選択し、必要な項目を設定してテストを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/5ae7c537-4ea7-5882-d634-461fa1e87890.png)
ステータス200でレスポンスが返ってくればOKです。（APIはレスポンスのメッセージも返しているのですがなぜか表示されていません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/d3ed02a4-832f-2ba0-be22-a0a79e666051.png)

返しているはずのレスポンス
```json
{
  "result": "Space user was addedded successfully."
}
```

### 4. アクションを公開
作成したアクションはリリース、公開することによってフローから使えるようになります（画像は別のアクションを使用しています）。

- リリース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/69786778-56a8-9fb0-271d-abad5ec5fb13.png)
- 公開
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/25de5ecb-b028-2f31-603d-5570434e9f6a.png)

## フローへのActionの組み込み
アクションを追加したい位置で+をクリックし、Actions>Brouse libraryを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9ab6fee0-ffda-9fce-89a9-4cf318c41633.png)
公開したアクションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3bfc9b2f-dc63-2b45-1846-5643f9601ee9.png)
フローにアクションが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9a22d001-183b-9b56-3f21-24be0f0e8d54.png)
Destinaionとインプットを設定すれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6142c82a-2c17-06fb-5a3a-39f42191b894.png)
※Destinationはプロジェクトの環境変数として事前に作成しておいたものです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/db8d2379-60a2-24ab-0654-d3a1eee42d16.png)

最終的なフローは以下のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/68eb19d4-eae3-b468-b4e0-fe57d3b75d0c.png)

## 動作確認
フローを実行した結果、Cloud Foundryのスペースにユーザが登録されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/687bac07-c9ac-d907-af3d-11e61e51f8a2.png)

今回追加したステップは正常に動いていましたが、後続のロールコレクション割当でエラーが起きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/1b997f52-9165-bb58-c8d9-6612ff5db19f.png)
Destinationがらみのエラーのようです。以前は正常に動いており、Destinationの設定は変えていないので理由はわかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/d01f7da9-7722-01c1-12e7-ca0c20044b83.png)
エラーについてはSAP Communityに問い合わせ中です。
https://answers.sap.com/questions/13843304/build-process-automation-invalid-argument-type-of.html