Node-REDでOCIの管理を簡単にする（2）Autonomous Data Warehouseを操作する

# Node-REDはJSONを扱うのにとっても便利

いまどき、テキストログではなくてjsonで戻してくれるプログラムが増えてずいぶん楽になりました。Node-REDでは、フローをオブジェクトが流れる形でjsonそのまま構造を扱えるので、配列の中を指さしで数えてうんうんうなって調べなくても済みます。

そしてこのNode-REDは、高速かつ本格的な処理ができるのに、直感的に子供もいじれるほどのデザインの良さを感じます。

人に仕事を任せたりする休みのときにも、めんどくさい手順書をかくことなく「こういうときはここのボタンおして」で済みます。

さらに、Google Homeやアレクサからもコントロールができるようにするのもわけありません。音声認識で「Autonomous Databaseをもっと速くして」みたいなこともできるはずです。
https://qiita.com/tstkkmd/items/10fb586be83de96bfe24




## 手動でためしてみる


コンパートメント内のAutonomous DWの一覧を取るには、execノードにこんなコマンドを入れてあげます -c のあとにはCompartment IDをいれます。

```
/root/.pyenv/shims/oci db autonomous-data-warehouse list -c ocid1.compartment.oc1..***** --all
```

<img width="791" alt="Node-RED.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/17f19492-a130-5789-eb6a-a411e647ac5a.png">


すると、json形式で返事が帰ってきます。


```
{
  "data": [
    {
      "compartment-id": "ocid1.compartment.oc1..*****",
      "connection-strings": {
        "all-connection-strings": {
          "HIGH": "adb.us-phoenix-1.oraclecloud.com:1522/*****_siumaaidb_high.adwc.oraclecloud.com",
          "LOW": "adb.us-phoenix-1.oraclecloud.com:1522/*****_siumaaidb_low.adwc.oraclecloud.com",
          "MEDIUM": "adb.us-phoenix-1.oraclecloud.com:1522/*****_siumaaidb_medium.adwc.oraclecloud.com"
        },
        "high": "adb.us-phoenix-1.oraclecloud.com:1522/*****_siumaaidb_high.adwc.oraclecloud.com",
        "low": "adb.us-phoenix-1.oraclecloud.com:1522/*****_siumaaidb_low.adwc.oraclecloud.com",
        "medium": "adb.us-phoenix-1.oraclecloud.com:1522/*****_siumaaidb_medium.adwc.oraclecloud.com"
      },
      "cpu-core-count": 4,
      "data-storage-size-in-tbs": 1,
      "db-name": "siumaaiDB",
      "db-version": "18.4.0.0",
      "defined-tags": {},
      "display-name": "btamari2siumaai",
      "freeform-tags": {},
      "id": "ocid1.autonomousdwdatabase.oc1.phx.*****",
      "license-model": "BRING_YOUR_OWN_LICENSE",
      "lifecycle-details": null,
      "lifecycle-state": "AVAILABLE",
      "service-console-url": "https://adb.us-phoenix-1.oraclecloud.com/console/index.html?tenant_name=OCID1.TENANCY.OC1..*****&database_name=SIUMAAIDB&service_type=ADW",
      "time-created": "2019-01-11T04:58:25.656000+00:00"
    }
  ]
}
```

あとは、コマンドを実行する＞戻り値の配列から必要な要素を取り出す＞評価＞次のアクションを実行　というだけです。

# 起動・終了を仕込んでみる

oci cliから操作できるコマンドは以下に説明されています。

https://docs.cloud.oracle.com/iaas/tools/oci-cli/latest/oci_cli_docs/cmdref/db/autonomous-data-warehouse.html


情報取得を試しましょう。Execノードに以下のコマンドを入れてください。

```
oci db autonomous-data-warehouse get --autonomous-data-warehouse-id <Autonomous Data Warehouseインスタンスのocid>
```


jsonで帰ってくるのをjqで見るのとくらべてどうでしょうか？戻り値を拾って処理ができそうです。属性にマウスオーバーすると、PATHや値がクリップボードにコピーできます。

<img width="571" alt="Node-RED_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/2af2ffa8-1d89-b1cc-0d1b-4c8b48c661c6.png">

<img width="294" alt="Node-RED_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/f8b36cab-57c2-9f24-76f0-13aef87accc5.png">


Autonomous data warehouseのlifecycle-stateは　payload.data["lifecycle-state"]　に格納されており、いじって調べた限り以下の値をとります（たしか異常状態をしめすようなもう一個があったような気もするけれど）

- AVAILABLE
- STOPPING
- STOPPED
- STARTING
- SCALE_IN_PROGRESS

以下のようなswitchノードを置いてあげて、5つの処理ごとになにか処理を入れてあげましょう。

<img width="854" alt="Node-RED_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/e37fad91-20d3-34a9-b7df-a0bd5aadfc7b.png">

今回、STARTING/STOPPING/SCALE_IN_PROGRESSのときにはなにもしないで、一回押したら起動・終了するだけにしてみましょう。


```
/root/.pyenv/shims/oci db autonomous-data-warehouse stop --autonomous-data-warehouse-id <Autonomous Data Warehouseインスタンスのocid>
```


```
/root/.pyenv/shims/oci db autonomous-data-warehouse start --autonomous-data-warehouse-id <Autonomous Data Warehouseインスタンスのocid>
```

フローはこんな感じになりました。
<img width="791" alt="Node-RED_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/9df8309f-5c5b-95f6-29db-2771cfc7aa11.png">


## まとめ

左上のタイムスタンプの左のボタンを押すと、START/STOPしてくれるようになりました。
今回は試しに作りたかっただけなのでボタンを一個にまとめてしまいましたが、同じ方法でスケールアップ・ダウンもできます。


<img width="273" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/59783202-8a0e-392d-49a4-1fd3da1a0c2b.png">


<img width="596" alt="Oracle_Cloud_Infrastructure.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/6d721e6d-9ecb-886f-59b5-6117ab4a70b5.png">

<img width="593" alt="Oracle_Cloud_Infrastructure_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/3d0c7d4a-9c2b-8c7c-b0a0-1fedeb474a6c.png">


タイムスタンプノードの設定をいじれば、朝8時に起動・繁忙時間帯だけCPU数を増加、みんなが帰る夜9時過ぎや週末は停止みたいな設定も簡単です。

<img width="721" alt="Node-RED.png" src="https://qiita-image-store.s3.amazonaws.com/0/96615/28b5baa5-ac23-cd53-ab1b-61461107e972.png">