SnapMirrorの転送状態をREST APIで取得したい

# はじめに
- SnapMirrorの転送状態をREST APIで取得したかったので、取得してみました。
- これで、SnapMirrorの同期完了を確認してから後続の処理を行うようなバッチを組むことができるようになります。
:::note warn
警告
本記事で記載するスクリプトについては、動作の責任は負いませんのでご了承ください。
:::

# 取得スクリプト
- 作ったスクリプトはこちらです。
```sh:snapmirror_state.sh
#! /bin/bash
# 1つめの引数に該当クラスタのIPアドレスを指定
IPADDR=$1

# 2つめの引数にユーザー名を指定
USER=$2

# 3つめの引数にパスワードを指定
PSWD=$3

# 4つめの引数に宛先SVM名を指定
SVM=$4

# 5つめの引数に宛先vol名を指定
VOL=$5

# BASIC認証用のクレデンシャルを作成（Base64でエンコード）
TOKEN=`echo -n "$USER:$PSWD" | openssl enc -e -base64`

# 該当SnapMirrorのUUIDを取得
UUID=`curl -X GET "https://$IPADDR/api/snapmirror/relationships?list_destinations_only=false&return_records=true&return_timeout=15" -H  "accept: application/json" -H  "authorization: Basic $TOKEN" -k -s | jq -r '.records[] | select( .destination.path == "'$SVM':'$VOL'") | .uuid'`

# 該当SnapMirrorの転送状態を取得
STATE=`curl -X GET "https://$IPADDR/api/snapmirror/relationships/$UUID" -H  "accept: application/json" -H  "authorization: Basic $TOKEN" -k -s | jq -r '.transfer.state'`

# 該当SnapMirrorの転送状態を出力
echo $STATE
```

# スクリプトの解説
## 前提条件
- 動作を試したのはRocky Linux 9.4です。
```console
# cat /etc/redhat-release
Rocky Linux release 9.4 (Blue Onyx)
```
- スクリプト内で`curl`と`jq`を使うのでインストールしておく必要があります。
- スクリプトに適切な実行権限を与える必要があります。

## 使用方法
- 以下の通り引数を指定してスクリプトを実行します。

| 引数  | 内容         |
|:------|:------------|
| 引数1 | SnapMirrorの宛先クラスタのクラスタ管理IPアドレス（名前解決できるならFQDN名でも可） |
| 引数2 | SnapMirrorの宛先クラスタの管理ユーザー名 |
| 引数3 | SnapMirrorの宛先クラスタの管理ユーザーのパスワード |
| 引数4 | SnapMirrorの宛先ボリュームが所属するSVM名 |
| 引数5 | SnapMirrorの宛先ボリューム名 |
- 以下の例のように5つの引数を指定して実行すると、SnapMirrorの転送状態が返ってきます。以下は転送中の例です。
```console
# ./snapmirror_state.sh 192.168.0.101 admin P@ssw0rd svm1 vol1_dest
transferring
```
- 以下のように`success`が返ってくると同期が完了していることがわかります。
```console
# ./snapmirror_state.sh 192.168.0.101 admin P@ssw0rd svm1 vol1_dest
success
```

## 処理内容の詳細
- まずは引数5つをそれぞれ変数に代入します。
```sh
#! /bin/bash
# 1つめの引数に該当クラスタのIPアドレスを指定
IPADDR=$1

# 2つめの引数にユーザー名を指定
USER=$2

# 3つめの引数にパスワードを指定
PSWD=$3

# 4つめの引数に宛先SVM名を指定
SVM=$4

# 5つめの引数に宛先vol名を指定
VOL=$5
```
- 次にREST APIでONTAPクラスタにHTTTPのBASIC認証でアクセスするために、ユーザー名とパスワードをBase64でエンコードします。
```sh
# BASIC認証用のクレデンシャルを作成（Base64でエンコード）
TOKEN=`echo -n "$USER:$PSWD" | openssl enc -e -base64`
```
- 次に、REST API `GET "/api/snapmirror/relationships/"`でSnapMirrorの宛先クラスタのSnapMirror関係のリストを取得できるので、リストを`jq`コマンドに渡し、スクリプトの引数に指定した宛先のSVM、ボリューム名のSnapMirror関係の`uuid`を抽出します。
```sh
# 該当SnapMirrorのUUIDを取得
UUID=`curl -X GET "https://$IPADDR/api/snapmirror/relationships?list_destinations_only=false&return_records=true&return_timeout=15" -H  "accept: application/json" -H  "authorization: Basic $TOKEN" -k -s | jq -r '.records[] | select( .destination.path == "'$SVM':'$VOL'") | .uuid'`
```
- 取得したUUIDを使って、REST API `GET /snapmirror/relationships/{uuid}`で該当のSnapMirror関係の詳細を取得できるので、取得結果を`jq`コマンドに渡し、転送状態`.transfer.state`を抽出します。
```sh
# 該当SnapMirrorの転送状態を取得
STATE=`curl -X GET "https://$IPADDR/api/snapmirror/relationships/$UUID" -H  "accept: application/json" -H  "authorization: Basic $TOKEN" -k -s | jq -r '.transfer.state'`
```
- 最後に、SnapMirror関係の転送状態を出力して完了です。
```sh
# 該当SnapMirrorの転送状態を出力
echo $STATE
```

# 最後に
- SnapMirrorの転送状態をREST APIで取得したかったので、取得してみました。

# 参考資料
- [ONTAP REST APIワークフローを使用するための準備](https://docs.netapp.com/ja-jp/ontap-automation/workflows/prepare_workflows.html#http%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF%E8%AA%8D%E8%A8%BC)
- [ONTAP REST API reference | Retrieve information for SnapMirror relationships](https://docs.netapp.com/us-en/ontap-restapi/ontap/get-snapmirror-relationships.html)
- [ONTAP REST API reference | Retrieve a SnapMirror relationship](https://docs.netapp.com/us-en/ontap-restapi/ontap/get-snapmirror-relationships-.html)