Bluemix IaaS (旧SoftLayer) 仮想サーバーの Basic Monitoring を API から操作する


#前提
- CLIコマンド slcli を使える状態であること（インストールなどはリンク先をご覧くさだい）
	- <a href="https://media.readthedocs.org/pdf/softlayer-api-python-client/latest/softlayer-api-python-client.pdf" >softlayer-api-python-client.pdf</a>
- 仮想サーバーを例にしてやってみます
	- 物理サーバーの場合は、「guestId」を「hardwareId」に置き換えるなど、適宜修正してください

#仮想サーバー ID の確認
仮想サーバーのIDを覚えておきます。

```sh:
$ slcli vs list | grep khayama
38048717  khayama-test01                                    161.202.86.27    10.132.75.115   tok02  NULL  
```

#Monitoring設定の確認
Public Uplink 付きのサーバーを Host Ping で注文すると、デフォルトで Public Primary IP に対する Monitoring が設定されていますよね。


```sh:
$  slcli call-api SoftLayer_Virtual_Guest getNetworkMonitors --mask=guestId,id,ipAddress,status,waitCycles,queryType,responseAction --id=38048717
:..........:.........:...............:.........................................:......................................:........:............:
: guestId  :    id   :   ipAddress   :                queryType                :            responseAction            : status : waitCycles :
:..........:.........:...............:.........................................:......................................:........:............:
: 38048717 : 6250550 : 161.202.86.27 : :..............:......................: : :...................:..............: :   ON   :     0      :
:          :         :               : :         name : value                : : :              name : value        : :        :            :
:          :         :               : :..............:......................: : :...................:..............: :        :            :
:          :         :               : : monitorLevel : 0                    : : :             level : 0            : :        :            :
:          :         :               : :  description : Test ping to address : : : actionDescription : Notify Users : :        :            :
:          :         :               : :         name : SERVICE PING         : : :                id : 2            : :        :            :
:          :         :               : :           id : 1                    : : :...................:..............: :        :            :
:          :         :               : :..............:......................: :                                      :        :            :
:..........:.........:...............:.........................................:......................................:........:............:

```

#Monitoring設定の追加
こちらのpythonスクリプトをつくってみました。

```py:createPrivateNetworkMonitor.py 
import SoftLayer
import sys
import json
from prettytable import PrettyTable
import operator
parm=sys.argv
guestId=parm[1]

# account info
client = SoftLayer.create_client_from_env()

# Define VSI identifier
guestId=parm[1]

# Define Ip Address
ipAddress = client['Virtual_Guest'].getPrimaryBackendIpAddress(id=guestId)
print(ipAddress)

# Define Query Type (1 = SERVICE PING, 17 = SLOW PING)
queryTypeId = 1
#queryTypeId = 17

# Define Response action id (1 = Do Nothing, 2 = Notify Users)
#responseActionId = 1
responseActionId = 2

# Define waitCycles 0 = Immediately, 1 = 5 Minutes, 2 = 10 Minutes, etc
#waitCycles = 0
waitCycles = 1
#waitCycles = 2

# define templateObject
templateObject = {
	'guestId': guestId,
	'ipAddress': ipAddress,
	'queryTypeId': queryTypeId,
	'responseActionId': responseActionId,
	'waitCycles': waitCycles
}

# create Monitor
result = client['Network_Monitor_Version1_Query_Host'].createObject(templateObject)
print('Completed!')
```

実行（仮想サーバーのIDを引数入力します）

```sh:
$ python createPrivateNetworkMonitor.py 38048717
10.132.75.115
Completed!

```

確認（Private側のMonitorを追加しました）

```sh:
$ slcli call-api SoftLayer_Virtual_Guest getNetworkMonitors --id=38048717 --mask=guestId,id,ipAddress,status,waitCycles,queryType,responseAction
:..........:.........:...............:.........................................:......................................:........:............:
: guestId  :    id   :   ipAddress   :                queryType                :            responseAction            : status : waitCycles :
:..........:.........:...............:.........................................:......................................:........:............:
: 38048717 : 6250550 : 161.202.86.27 : :..............:......................: : :...................:..............: :   ON   :     0      :
:          :         :               : :         name : value                : : :              name : value        : :        :            :
:          :         :               : :..............:......................: : :...................:..............: :        :            :
:          :         :               : : monitorLevel : 0                    : : :             level : 0            : :        :            :
:          :         :               : :  description : Test ping to address : : : actionDescription : Notify Users : :        :            :
:          :         :               : :         name : SERVICE PING         : : :                id : 2            : :        :            :
:          :         :               : :           id : 1                    : : :...................:..............: :        :            :
:          :         :               : :..............:......................: :                                      :        :            :
: 38048717 : 6259394 : 10.132.75.115 : :..............:......................: : :...................:..............: :   ON   :     1      :
:          :         :               : :         name : value                : : :              name : value        : :        :            :
:          :         :               : :..............:......................: : :...................:..............: :        :            :
:          :         :               : : monitorLevel : 0                    : : :             level : 0            : :        :            :
:          :         :               : :  description : Test ping to address : : : actionDescription : Notify Users : :        :            :
:          :         :               : :         name : SERVICE PING         : : :                id : 2            : :        :            :
:          :         :               : :           id : 1                    : : :...................:..............: :        :            :
:          :         :               : :..............:......................: :                                      :        :            :
:..........:.........:...............:.........................................:......................................:........:............:

```

#Monitoring設定の変更
こちらのpythonスクリプトをつくってみました。

```py:editNetworkMonitor.py 
import SoftLayer
import sys
import json
from prettytable import PrettyTable
import operator
parm=sys.argv
id=parm[1]

# account info
client = SoftLayer.create_client_from_env()

# Define Query Type (1 = SERVICE PING, 17 = SLOW PING)
queryTypeId = 1
#queryTypeId = 17

# Define Response action id (1 = Do Nothing, 2 = Notify Users)
#responseActionId = 1
responseActionId = 2

# Define waitCycles 0 = Immediately, 1 = 5 Minutes, 2 = 10 Minutes, etc
waitCycles = 0
#waitCycles = 1
#waitCycles = 2

# define templateObject
templateObject = {
	'queryTypeId': queryTypeId,
	'responseActionId': responseActionId,
	'waitCycles': waitCycles
}

# edit Monitor
result = client['Network_Monitor_Version1_Query_Host'].editObject(templateObject,id=id)
print('Completed!')
```

実行（Monitor のIDを引数入力します）

```sh:
$ python editNetworkMonitor.py 6259394
Completed!

```

確認（id 6259394 の Monitor を waitCycles を 1 から 0 にしました）

```
$ slcli call-api SoftLayer_Virtual_Guest getNetworkMonitors --id=38048717 --mask=guestId,id,ipAddress,status,waitCycles,queryType,responseAction
:..........:.........:...............:.........................................:......................................:........:............:
: guestId  :    id   :   ipAddress   :                queryType                :            responseAction            : status : waitCycles :
:..........:.........:...............:.........................................:......................................:........:............:
: 38048717 : 6250550 : 161.202.86.27 : :..............:......................: : :...................:..............: :   ON   :     0      :
:          :         :               : :         name : value                : : :              name : value        : :        :            :
:          :         :               : :..............:......................: : :...................:..............: :        :            :
:          :         :               : : monitorLevel : 0                    : : :             level : 0            : :        :            :
:          :         :               : :  description : Test ping to address : : : actionDescription : Notify Users : :        :            :
:          :         :               : :         name : SERVICE PING         : : :                id : 2            : :        :            :
:          :         :               : :           id : 1                    : : :...................:..............: :        :            :
:          :         :               : :..............:......................: :                                      :        :            :
: 38048717 : 6259394 : 10.132.75.115 : :..............:......................: : :...................:..............: :   ON   :     0      :
:          :         :               : :         name : value                : : :              name : value        : :        :            :
:          :         :               : :..............:......................: : :...................:..............: :        :            :
:          :         :               : : monitorLevel : 0                    : : :             level : 0            : :        :            :
:          :         :               : :  description : Test ping to address : : : actionDescription : Notify Users : :        :            :
:          :         :               : :         name : SERVICE PING         : : :                id : 2            : :        :            :
:          :         :               : :           id : 1                    : : :...................:..............: :        :            :
:          :         :               : :..............:......................: :                                      :        :            :
:..........:.........:...............:.........................................:......................................:........:............:

```

#Monitoring設定の削除
こちらのpythonスクリプトをつくってみました。

```py:deleteNetworkMonitor.py 
import SoftLayer
import sys
import json
from prettytable import PrettyTable
import operator
parm=sys.argv
id=parm[1]

# account info
client = SoftLayer.create_client_from_env()

# delete Monitor
result = client['Network_Monitor_Version1_Query_Host'].deleteObject(id=id)
print('Completed!')
```

実行（Monitor のIDを引数入力します）

```sh:
$ python deleteNetworkMonitor.py 6259394
Completed!
```

確認（Private 側の Monitor を削除しました）

```sh:
$ slcli call-api SoftLayer_Virtual_Guest getNetworkMonitors --id=38048717 --mask=guestId,id,ipAddress,status,waitCycles,queryType,responseAction
:..........:.........:...............:.........................................:......................................:........:............:
: guestId  :    id   :   ipAddress   :                queryType                :            responseAction            : status : waitCycles :
:..........:.........:...............:.........................................:......................................:........:............:
: 38048717 : 6250550 : 161.202.86.27 : :..............:......................: : :...................:..............: :   ON   :     0      :
:          :         :               : :         name : value                : : :              name : value        : :        :            :
:          :         :               : :..............:......................: : :...................:..............: :        :            :
:          :         :               : : monitorLevel : 0                    : : :             level : 0            : :        :            :
:          :         :               : :  description : Test ping to address : : : actionDescription : Notify Users : :        :            :
:          :         :               : :         name : SERVICE PING         : : :                id : 2            : :        :            :
:          :         :               : :           id : 1                    : : :...................:..............: :        :            :
:          :         :               : :..............:......................: :                                      :        :            :
:..........:.........:...............:.........................................:......................................:........:............:

```

#User ID の確認

```
$ slcli call-api Account getUsers --mask=id,username | grep khayama
480625   khayama-xxxxxxxxxx
```

#Notify User 設定の確認
```sh:
$ slcli call-api Virtual_Guest getObject --mask=fullyQualifiedDomainName,monitoringUserNotification[user.username] --id=38048717
:............................:............................:
:                       name : value                      :
:............................:............................:
: monitoringUserNotification :                            :
:   fullyQualifiedDomainName : khayama-test01.bluemix.com :
:............................:............................:

```

#Notify User の追加
こちらのpythonスクリプトをつくってみました。

```py:addUserNotification_VSI.py 
import SoftLayer
import sys
import json
from prettytable import PrettyTable
import operator
parm=sys.argv

# account info
client = SoftLayer.create_client_from_env()

# Define VSI identifier
guestId=parm[1]

# Define userid
userId=parm[2] 

# define templateObject
templateObject = {
	'guestId': guestId,
	'userId': userId
}

# Add user
result = client['SoftLayer_User_Customer_Notification_Virtual_Guest'].createObject(templateObject)
print(result)
print('Completed!')
```

実行（仮想サーバーの ID、User IDを引数入力します）

```sh:
$ python addUserNotification_VSI.py 38048717 480625
{'guestId': 38048717, 'userId': 480625, 'id': 10732161, 'guest': {'status': {'keyName': 'ACTIVE', 'name': 'Active'}, 'typeId': 1, 'domain': 'bluemix.com', 'maxMemory': 1024, 'maxCpuUnits': 'CORE', 'maxCpu': 1, 'metricPollDate': '', 'createDate': '2017-08-22T23:57:32+09:00', 'hostname': 'khayama-test01', 'startCpus': 1, 'uuid': 'faf130ab-41eb-e1f2-ab1b-d92a4852d583', 'lastPowerStateId': '', 'lastVerifiedDate': '', 'statusId': 1001, 'notes': u'khayama-xxxxxxxxxx, windows', 'dedicatedAccountHostOnlyFlag': False, 'provisionDate': '2017-08-23T00:21:57+09:00', 'modifyDate': '2017-08-23T00:31:16+09:00', 'accountId': 319556, 'id': 38048717, 'fullyQualifiedDomainName': 'khayama-test01.bluemix.com'}}
Completed!
```

確認（UserNotification を追加しました）

```sh:
$ slcli call-api Virtual_Guest getObject --mask=fullyQualifiedDomainName,monitoringUserNotification[user.username] --id=38048717
:............................:......................................................................:
:                       name : value                                                                :
:............................:......................................................................:
: monitoringUserNotification : :..........:..........:...................................:........: :
:                            : : guestId  :    id    :                user               : userId : :
:                            : :..........:..........:...................................:........: :
:                            : : 38048717 : 10732161 : :..........:....................: : 480625 : :
:                            : :          :          : :     name : value              : :        : :
:                            : :          :          : :..........:....................: :        : :
:                            : :          :          : : username : khayama-xxxxxxxxxx : :        : :
:                            : :          :          : :..........:....................: :        : :
:                            : :..........:..........:...................................:........: :
:   fullyQualifiedDomainName : khayama-test01.bluemix.com                                           :
:............................:......................................................................:

```

#Notify User の削除
こちらのpythonスクリプトをつくってみました。

```py:deleteUserNotification_VSI.py

import SoftLayer
import sys
import json
from prettytable import PrettyTable
import operator
parm=sys.argv

# account info
client = SoftLayer.create_client_from_env()

# Define id
id=parm[1] 

# define templateObject
templateObjects = [{
	'id': id,
	'guestId': '',
	'userId': ''
}]

# Delete user
result = client['SoftLayer_User_Customer_Notification_Virtual_Guest'].deleteObjects(templateObjects)
print(result)
print('Completed!')
```

実行（Notification の IDを引数入力します）

```sh:
$ python deleteUserNotification_VSI.py 10732161
True
Completed!
```

確認（UserNotification を削除しました）

```sh:
$ slcli call-api Virtual_Guest getObject --mask=fullyQualifiedDomainName,monitoringUserNotification[user.username] --id=38048717
:............................:............................:
:                       name : value                      :
:............................:............................:
: monitoringUserNotification :                            :
:   fullyQualifiedDomainName : khayama-test01.bluemix.com :
:............................:............................:

```

#参考
- <a href="http://sldn.softlayer.com/reference/services/SoftLayer_virtual_guest" >SoftLayer_Virtual_Guest | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/services/SoftLayer_Virtual_Guest/getNetworkMonitors" >getNetworkMonitors | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/services/SoftLayer_Network_Monitor_Version1_Query_Host/createObject" >createObject | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/datatypes/softlayer_network_monitor_version1_query_host" >SoftLayer_Network_Monitor_Version1_Query_Host | SoftLayer Development Network</a>
- <a href="https://stackoverflow.com/questions/37567560/authentication-method-exception-for-adding-a-monitor-in-softlayer" >Authentication method exception for adding a monitor in Softlayer - Stack Overflow</a>
- <a href="https://stackoverflow.com/questions/37517484/monitoring-in-sl" >softlayer - Monitoring in SL - Stack Overflow</a>
- <a href="http://sldn.softlayer.com/reference/services/SoftLayer_Network_Monitor_Version1_Query_Host" >SoftLayer_Network_Monitor_Version1_Query_Host | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/services/softlayer_network_monitor_version1_query_host/editobject" >editObject | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/services/SoftLayer_Network_Monitor_Version1_Query_Host/deleteObject" >deleteObject | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/datatypes/SoftLayer_virtual_guest" >SoftLayer_Virtual_Guest | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/services/SoftLayer_User_Customer_Notification_Virtual_Guest/deleteObjects" >deleteObjects | SoftLayer Development Network</a>
- <a href="http://sldn.softlayer.com/reference/services/SoftLayer_User_Customer_Notification_Virtual_Guest/createObject" >createObject | SoftLayer Development Network</a>