mockmockのAPIを使ってみる

この記事は、[mockmockアドベントカレンダー](https://qiita.com/advent-calendar/2019/mockmock)23日目の記事です。

今回はひっそりと存在するAPIを使ってみます。
APIを利用することで、コンソールを介さずにプログラムからmockを操作をすることができます。 スクリプトの作成やCIとの連携などにどうぞ。

## API鍵の取得
APIを呼び出す際にはAPI鍵で認証を行います。
プロジェクトのサイドバーの [API鍵設定]からAPI鍵を取得しましょう。

<img width="1144" alt="スクリーンショット_2019-11-29_6_02_04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/b11e5932-22f9-4021-2db1-09adcc98a348.png">

AuthorizationヘッダーはAPIリファレンスでAPIを試すときやcurlコマンドなどでHTTPリクエストを送信する際に使用します。

## APIリファレンスでAPIを試す
ドキュメントのAPIリファレンスから試すことができます。
https://console.mock-mock.com/docs/features/api_reference

まず、[Authorize]ボタンをクリックして認証を行いましょう。
<img width="816" alt="スクリーンショット_2019-11-29_6_24_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/7d0f58b8-c0ef-ef44-1175-e1db600f59bc.png">

`Value`には、Authorizationヘッダーを入力します。
<img width="646" alt="スクリーンショット_2019-11-29_6_26_46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/8ea91125-5820-650f-c668-b848c1440c2a.png">

### mockグループ一覧を取得する
`[GET]/mock_groups`(mockグループ一覧)の項目を展開し、[Try it out]ボタンをクリックすると、以下のような画面になります。
このAPIはパラメータが無いので、[Execute]ボタンをクリックするだけでAPIが叩かれます。

<img width="799" alt="スクリーンショット 2019-11-29 6.31.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/bee3ebb1-d08e-4fc3-e0e5-3bd19540ca13.png">

[Execute]ボタンをクリックするとこんな感じ。
Response bodyのjsonの中に、API鍵を発行したプロジェクト内のmockグループの一覧が入ります。
mockグループに設定しているmock定数やmock変数も取得できます。
今回はmock定数`serial_number`が設定されています。

mockグループの`code`は後で使うのでコピーしておいてください。

![screencapture-localhost-4000-docs-features-api-reference-2019-11-30-08_28_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/8235195b-26d1-c84c-de0d-24a871e5c1c7.png)

### mockを作成する
次はAPIを使ってmockを作成してみましょう。
`[POST]/mock_groups/{mock_group_id}/mocks`(mock一括編集)の項目を展開し、先ほどと同じように[Try it out]ボタンをクリックしましょう。

今回はパラメーターが2つあります。
`mock_group_id`は先ほどコピーしたmockグループの`code`の値で、
`operations`は、mockの編集操作を指定するjsonです。

`operations`には以下のようなjsonを指定します。
今回のケースではmock定数フィールド`serial_number`を指定しているため、`consts`に値を入れていきます。

```
{
  "targets": [
    {
      "operation": "create",
      "consts": {
        "serial_number": "ac00001"
      },
      "vars": {}
    }
  ]
}
```

![screencapture-localhost-4000-docs-features-api-reference-2019-11-30-08_32_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/03648cca-e0d6-6f73-6bcf-1f3d716ea351.png)


実行するとこんな感じになります。

![screencapture-localhost-4000-docs-features-api-reference-2019-11-30-08_42_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/ebbb5906-926d-9557-5c41-169bfb6b8e6c.png)

今回は作成だったので`operation`に`create`を指定しましたが、更新する場合は`update`を指定します。
その場合は、mockを指定する`code`のキーも必要です。

```
{
  "targets": [
    {
      "operation": "create",
      "code": "mk-xxxxxxxxxxxx"
      "consts": {
        "serial_number": "ac00001_mod"
      },
      "vars": {}
    }
  ]
}
```

### mockを起動する
作成したmockを起動してみます。

`[POST]/mock_groups/{mock_group_id}/operate`(mock操作)の項目を展開し、[Try it out]ボタンをクリックします。
`mock_group_id`は先ほどと同様、mockグループの`code`の値で、
`operations`は、mockの操作を指定するjsonです。

`ignore_inoperable`は、mockに指定した操作ができない場合に無視するかどうかの設定です。
例えば、起動中のmockに起動操作をするようなケースです。
その場合、`ignore_inoperable`を`true`だと操作がスキップされ、`false`だと失敗が返ります。

`targets`には、操作対象のmockIDを入れましょう。

```
{
  "operation": "launch",
  "options": {
    "ignore_inoperable": true
  },
  "targets": [
    "mk-xxxxxxxxxxxx"
  ]
}
```

![screencapture-localhost-4000-docs-features-api-reference-2019-12-01-05_34_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/966ecb63-58b5-77f7-a57e-c3d487389f44.png)

実行するとこんな感じになります。
`job_id`は、操作ジョブの状態を確認するのに使うのでコピーしておきましょう。

![screencapture-localhost-4000-docs-features-api-reference-2019-12-01-05_39_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/114cf798-f316-bc84-b008-abe8a7e8c0f3.png)

今回のは起動を行なったので、`operation`は`launch`でしたが、
他には`reboot`(再起動) / `terminate`(停止) / `destroy`(削除)があります。

### 操作ジョブの状態を確認する
`[GET] /jobs/{id}`(mock操作ジョブ)の項目を展開し、[Try it out]ボタンをクリック、先ほどコピーした`job_id`を入れて実行します。

このように状態が確認できます。
実行中は`running`, 完了したら`completed`が返ります。

<img width="779" alt="スクリーンショット 2019-12-01 5.41.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/e6e3c3f5-a7c6-55e7-7d91-adf92ae71041.png">

### mockを停止する
起動とほぼ同じです。
`operations`はこんな感じ。

```
{
  "operation": "terminate",
  "options": {
    "ignore_inoperable": true
  },
  "targets": [
    "mk-xxxxxxxxxxxx"
  ]
}
```

## curlコマンドでAPIを叩く
お気づきかと思いますが、APIリファレンスでAPIを叩くと、実行されたcurlコマンドが表示されます。
もちろん、自分でこのcurlコマンドを実行しても同じ結果が返ってきます。これを参考に組み立てて行きましょう。

![screencapture-console-mock-mock-docs-features-api-reference-2019-11-29-06_32_26のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39565/a9130b7a-8df6-9f62-65f3-0ec563602124.png)

## CIに組み込んでみる
こちらをどうぞ。
https://speakerdeck.com/ktam1219/iotwoserverlessfeng-nitesutositai

このスライドでは、CIの中でテスト環境を構築->mockmockからデータ送信->集計としていますが、
CDまでやっているならもう少し簡単になるかもしれません。

## まとめ
まだCLIやSDKはありませんが、APIを使うことでmock操作をプログラムに組み込めます。
夢が広がりますね！

明日は@Y_uuuです。
mockmockを使って簡単なIoTシステムを開発するお話です！