IBM Cloud: suspend billingが有効になるシナリオをコマンドラインで検証

# はじめに
IBM Cloudにおいては、https://cloud.ibm.com から購入した仮想サーバーはデフォルトで[suspend billing](https://cloud.ibm.com/docs/vsi?topic=virtual-servers-requirements)が有効になっています。利用する際には、OSにログインしてコマンドから停止するのでは有効にならず、Customer PortalやAPIからPower OFFする必要があります。
しかし、疑問が残ります。もしOSを正常に停止した後に、Customer PortalやAPIでPower OFFをするとどうなるのでしょうか？この記事では、

- 1) 稼働中のOSをCustomer PortalからPower OFFするケース（これはドキュメント通りなので当然動く）
- 2) 稼働中のOSに一旦SSHでログインし、安全にshutdownした後に、Customer PortalからPower OFFするケース

の２つの挙動を調査し、2)のケースでもSuspend Billingが有効になるかどうかの検証を行いました。

# 結論(2019/10/07更新）
２）のケースでは以前はSuspend Billingは有効になりませんでした。しかし、2019/10/07現在修正されて、1),2)のどちらのケースでもSuspend Billingは有効になったようです。


# 実験1: 稼働中のOSをCustomer PortalからPower OFFするケース


##1.1 正常起動時

Power Statusは`Running`であり、SUSPENDED_BILLINGが`0`。

```
# slcli call-api Virtual_Guest getObject --id=88032042 --mask=id,hostname,status,powerState,attributes
:............:.............................................:
:       name : value                                       :
:............:.............................................:
:     status : :.........:........:                        :
:            : :    name : value  :                        :
:            : :.........:........:                        :
:            : : keyName : ACTIVE :                        :
:            : :    name : Active :                        :
:            : :.........:........:                        :
: attributes : :.................................:.......: :
:            : :               type              : value : :
:            : :.................................:.......: :
:            : : :.........:...................: :   0   : :
:            : : :    name : value             : :       : :
:            : : :.........:...................: :       : :
:            : : : keyname : SUSPENDED_BILLING : :       : :
:            : : :    name : Suspended Billing : :       : :
:            : : :.........:...................: :       : :
:            : :.................................:.......: :
:   hostname : virtualserver01                             :
: powerState : :.........:.........:                       :
:            : :    name : value   :                       :
:            : :.........:.........:                       :
:            : : keyName : RUNNING :                       :
:            : :    name : Running :                       :
:            : :.........:.........:                       :
:         id : 88032042                                    :
:............:.............................................:

```

##1.2 Customer Portalから停止
<img width="1086" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/acd512a9-e93a-92f6-bfc8-6f3ab1b9fc98.png">

Power Statusが`Halt`になり、SUSPENDED_BILLINGが`1`になった。

```
# slcli call-api Virtual_Guest getObject --id=88032042 --mask=id,hostname,status,powerState,attributes
:............:.............................................:
:       name : value                                       :
:............:.............................................:
:     status : :.........:........:                        :
:            : :    name : value  :                        :
:            : :.........:........:                        :
:            : : keyName : ACTIVE :                        :
:            : :    name : Active :                        :
:            : :.........:........:                        :
: attributes : :.................................:.......: :
:            : :               type              : value : :
:            : :.................................:.......: :
:            : : :.........:...................: :   1   : :
:            : : :    name : value             : :       : :
:            : : :.........:...................: :       : :
:            : : : keyname : SUSPENDED_BILLING : :       : :
:            : : :    name : Suspended Billing : :       : :
:            : : :.........:...................: :       : :
:            : :.................................:.......: :
:   hostname : virtualserver01                             :
: powerState : :.........:........:                        :
:            : :    name : value  :                        :
:            : :.........:........:                        :
:            : : keyName : HALTED :                        :
:            : :    name : Halted :                        :
:            : :.........:........:                        :
:         id : 88032042                                    :
:............:.............................................:
[root@syasuda2 ~]#
```

##1.3 確認

# 実験2: 稼働中のOSに一旦SSHでログインし、安全にshutdownした後に、Customer PortalからPower OFFするケース

##2.1 正常起動時

Power Statusは`Running`であり、SUSPENDED_BILLINGが`0`。

```
# slcli call-api Virtual_Guest getObject --id=88032042 --mask=id,hostname,status,powerState,attributes
:............:.............................................:
:       name : value                                       :
:............:.............................................:
:     status : :.........:........:                        :
:            : :    name : value  :                        :
:            : :.........:........:                        :
:            : : keyName : ACTIVE :                        :
:            : :    name : Active :                        :
:            : :.........:........:                        :
: attributes : :.................................:.......: :
:            : :               type              : value : :
:            : :.................................:.......: :
:            : : :.........:...................: :   0   : :
:            : : :    name : value             : :       : :
:            : : :.........:...................: :       : :
:            : : : keyname : SUSPENDED_BILLING : :       : :
:            : : :    name : Suspended Billing : :       : :
:            : : :.........:...................: :       : :
:            : :.................................:.......: :
:   hostname : virtualserver01                             :
: powerState : :.........:.........:                       :
:            : :    name : value   :                       :
:            : :.........:.........:                       :
:            : : keyName : RUNNING :                       :
:            : :    name : Running :                       :
:            : :.........:.........:                       :
:         id : 88032042                                    :
:............:.............................................:
```
##2.2 OSをsshでログインして、OSコマンドで停止

OSを停止してもIBM Cloudからは認識していないので、Power Statusは`Running`であり、SUSPENDED_BILLINGが`0`のまま。

```txt:対象のVSIにSSHでログインして、OSコマンドで停止
# shutdown -h now
```

```
# slcli call-api Virtual_Guest getObject --id=88032042 --mask=id,hostname,status,powerState,attributes
:............:.............................................:
:       name : value                                       :
:............:.............................................:
:     status : :.........:........:                        :
:            : :    name : value  :                        :
:            : :.........:........:                        :
:            : : keyName : ACTIVE :                        :
:            : :    name : Active :                        :
:            : :.........:........:                        :
: attributes : :.................................:.......: :
:            : :               type              : value : :
:            : :.................................:.......: :
:            : : :.........:...................: :   0   : :
:            : : :    name : value             : :       : :
:            : : :.........:...................: :       : :
:            : : : keyname : SUSPENDED_BILLING : :       : :
:            : : :    name : Suspended Billing : :       : :
:            : : :.........:...................: :       : :
:            : :.................................:.......: :
:   hostname : virtualserver01                             :
: powerState : :.........:.........:                       :
:            : :    name : value   :                       :
:            : :.........:.........:                       :
:            : : keyName : RUNNING :                       :
:            : :    name : Running :                       :
:            : :.........:.........:                       :
:         id : 88032042                                    :
:............:.............................................:
```


##2.3 Customer Portalから停止

<img width="1099" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/e198e230-b366-8d64-c4cf-61cb05830c3c.png">

`Failed to halt guest as it has already been halted`というエラーが出る。
<img width="1113" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4573dce2-b9c2-bb45-087c-083c251d6b6f.png">

Customer PortalをreloadしてみるとPower StatusはOFFに変わっている。
<img width="1093" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/ba0f8b7a-7a71-6a38-f570-5c919ffe190e.png">

~~しかし、APIで見てみるとPower Statusは`Halt`になったが、SUSPENDED_BILLINGは`0`のまま。つまり、この場合はSuspend Billingは有効になっていない。~~
(2019/10/07更新)しかし、APIで見てみるとPower Statusは`Halt`になったが、SUSPENDED_BILLINGは`1`に変更された。つまり、この場合でもSuspend Billingは有効になっている。

```
# slcli call-api Virtual_Guest getObject --id=88032042 --mask=id,hostname,status,powerState,attributes
:............:.............................................:
:       name : value                                       :
:............:.............................................:
:     status : :.........:........:                        :
:            : :    name : value  :                        :
:            : :.........:........:                        :
:            : : keyName : ACTIVE :                        :
:            : :    name : Active :                        :
:            : :.........:........:                        :
: attributes : :.................................:.......: :
:            : :               type              : value : :
:            : :.................................:.......: :
:            : : :.........:...................: :   1   : :
:            : : :    name : value             : :       : :
:            : : :.........:...................: :       : :
:            : : : keyname : SUSPENDED_BILLING : :       : :
:            : : :    name : Suspended Billing : :       : :
:            : : :.........:...................: :       : :
:            : :.................................:.......: :
:   hostname : virtualserver01                             :
: powerState : :.........:........:                        :
:            : :    name : value  :                        :
:            : :.........:........:                        :
:            : : keyName : HALTED :                        :
:            : :    name : Halted :                        :
:            : :.........:........:                        :
:         id : 88032042                                    :
:............:.............................................:
```