Power Systems Virtual Server on IBM Cloud で FlashCopy (Snapshot, Restore, Clone) を操作する


# はじめに
Power Systems Virtual Server on IBM Cloud で FlashCopy (Snapshot, Restore, Clone) を操作できるようになりました。
今回は、API 経由で操作を実施します。

>[Release notes](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-release-notes#may-2020)
> May 2020
> Added snapshot, clone and restore capabilities to the Power Systems Virtual Server service. You can use these new capabilities by using the Power Systems Virtual Server API.

それぞれのベストプラクティス、ユースケース、制約については、こちらにあります。

>[Snapshotting, cloning, and restoring](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-volume-snapshot-clone#restoring-snapshot)

# 必要情報の取得

## 該当リージョンに `ibmcloud` コマンドでログイン
ダラスなら `us-south` 、ワシントンなら `us-east` といったように指定してログインします。

```shell

export REGION="us-east"
echo $REGION
ibmcloud login -r $REGION
```

## アカウント ID の取得
以下のコマンド、または https://cloud.ibm.com/account/settings から取得できます。

```shell

export TENANT_ID=$(ibmcloud account show --output JSON | jq -r '.account_id')
echo $TENANT_ID
```

## Power Systems Virtual Server サービスインスタンス情報
以下のコマンド、または https://cloud.ibm.com/resources から取得できます。

```shell

export SERVICE_INSTANCE="khayama-power"
echo $SERVICE_INSTANCE
```


```shell

export CRN=$(ibmcloud resource service-instance $SERVICE_INSTANCE --output JSON | jq -r '.[]|.crn')
echo $CRN
```

```shell

export GUID=$(ibmcloud resource service-instance $SERVICE_INSTANCE --output JSON | jq -r '.[]|.guid')
echo $GUID
```

![Kobito.fmxYvg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/97dbfa56-cb05-6a32-ab9e-dc8aa46e1fb8.png "Kobito.fmxYvg.png")


## IAM アクセストークン取得
IBM Cloud API アクセスの認証に必要です。

```shell

export ACCESS_TOKEN=$(ibmcloud iam oauth-tokens --output JSON | jq -r '.iam_token')
echo $ACCESS_TOKEN
```

## cloudInstanceId の取得
Power Systems Virtual Server の情報を API 経由で取得するために必要です。

```shell

export CLOUDINSTANCE_ID=` \
curl -X GET \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/tenants/$TENANT_ID" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
| jq -r '.cloudInstances | .[] | select (.name=="'$GUID'") | .cloudInstanceID' \
`
echo $CLOUDINSTANCE_ID
```

## pvmInstanceID の取得
Power Systems Virtual Server のサーバー名から取得します。

```shell

export SERVER_NAME="khayama-aix"
echo $SERVER_NAME

export PVMINSTANCE_ID=` \
curl -X GET \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUDINSTANCE_ID/pvm-instances" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
| jq -r '.pvmInstances | .[] | select (.serverName=="'$SERVER_NAME'") | .pvmInstanceID' \
`
echo $PVMINSTANCE_ID
```

## volumeIDs の取得
対象の Power Systems Virtual Server に紐づくボリュームの ID を取得します。
複数ボリュームがアタッチされている場合、複数の ID が取得できます。

```shell

export VOLUME_IDS=` \
curl -X GET \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUDINSTANCE_ID/pvm-instances/$PVMINSTANCE_ID" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
| jq -c '.volumeIDs' \
`
echo $VOLUME_IDS
```

# FlashCopy の操作 

## Snapshot 実行
対象となる Power Systems Virtual Server に紐づく全てのボリュームに対して、Snapshot を実行します。

```shell

curl -X POST \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUDINSTANCE_ID/pvm-instances/$PVMINSTANCE_ID/snapshots" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
-d '{ "name": "test", "description": "Snapshot for test", "volumeIDs": '$VOLUME_IDS'}'
```

```json:result.json
{"snapshotID":"***"}
```

## Snapshot 確認

Snapshot の状態を確認します。
`percentComplete` が `100` で `status` が `available` となった場合は、問題なく処理が完了したことが確認できます。
参考までに、ボリュームが数十 GB 程度の場合、30 秒程度で処理が完了します。

```shell

curl -X GET \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUDINSTANCE_ID/pvm-instances/$PVMINSTANCE_ID/snapshots" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
| jq -r
```

```json:result.json
{
  "snapshots": [
    {
      "action": "snapshot",
      "creationDate": "2020-06-26T16:48:59.000Z",
      "description": "Snapshot for test",
      "lastUpdateDate": "2020-06-26T16:49:33.000Z",
      "name": "test",
      "percentComplete": 100,
      "pvmInstanceID": "***",
      "snapshotID": "***",
      "status": "available",
      "volumeSnapshots": {
        "***": "***",
        "***": "***"
      }
    }
  ]
}
```

## Restore 実行
`snapshotID` を指定して、リストアを実行します。
`percentComplete` が `100` となった場合は、問題なく処理が完了したことが確認できます。
参考までに、ボリュームが数十 GB 程度の場合、30 秒程度で処理が完了します。

```shell

export SNAPSHOT_ID="***"
echo $SNAPSHOT_ID

curl -X POST \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUDINSTANCE_ID/pvm-instances/$PVMINSTANCE_ID/snapshots/$SNAPSHOT_ID/restore" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
-d '{ "force": true }'
```

```json:result.json
{
  "action": "restore",
  "creationDate": "2020-06-26T16:48:59.000Z",
  "description": "Snapshot for test",
  "lastUpdateDate": "2020-06-26T16:58:54.000Z",
  "name": "test",
  "percentComplete": 11,
  "pvmInstanceID": "***",
  "snapshotID": "***",
  "status": "available",
  "volumeSnapshots": {
    "***": "***",
    "***": "***"
  }
}
```

## Roll back 実行
以下のようなクエリパラメータを付与してリストア実行することで、エラー時にロールバックすることができます。

>To roll back the clone operation, append '?restore_fail_action=rollback' to the cURL URL. If you'd like to try the clone operation again, append '?restore_fail_action=retry' to the cURL URL.

```shell

curl -X POST \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUDINSTANCE_ID/pvm-instances/$PVMINSTANCE_ID/snapshots/$SNAPSHOT_ID/restore?restore_fail_action=rollback" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
-d '{ "force": true }'
```

`status` が `available` である場合には、この操作は無効です。

```json:result.json
{"description":"bad request: snapshot *** is in state available, restore fail actions only valid if snapshot in restore error state","error":"bad request"}
```

## Clone 実行
任意のボリュームを指定して、 Clone を実行できます。
参考までに、ボリュームが数十 GB 程度の場合、30 秒程度で処理が完了します。

```shell

curl -X POST \
"https://$REGION.power-iaas.cloud.ibm.com/pcloud/v1/cloud-instances/$CLOUDINSTANCE_ID/volumes/clone" \
-H "Authorization: $ACCESS_TOKEN" \
-H "CRN: $CRN" \
-H 'Content-Type: application/json' \
-d '{ "volumeIDs": '$VOLUME_IDS', "displayName": "khayama-clone-test" }'
```

```json:result.json
{
  "clonedVolumes": {
    "***": "***",
    "***": "***"
  }
}
```

## Clone 確認
Clone されたボリュームは特定のサーバーに紐付かない独立したボリュームとなり、 UI からも確認ができます。
![貼り付けた画像_2020_06_27_2_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5b6f9d1f-665a-762c-1b27-cb4de92f635f.png "貼り付けた画像_2020_06_27_2_54.png")

# 参考リンク
- [Power Cloud API - IBM Cloud API Docs](https://cloud.ibm.com/apidocs/power-cloud)

# 参考 : Image Capture
上記の同一インスタンスに対して、 Image Capture (内部で PowerVC が外部ストレージ装置のディスクコピーを取得) をおこなうと、開始してから ICOS に Export されるまで約 30 分かかりました。

Image Capture の対象となるインスタンスのボリューム容量が増えると、OVA イメージ化の処理と ICOS へのアップロード処理の時間が長くなっているものと推測します。