前日は 渡部 亮太 さんでした。
RMANの差分増分バックアップ機能とフル・トランスポータブル・エクスポート/インポート機能を活用してダウンタイムを極力短くしたデータベース移行方法の図を書いてみた
今年は、Oracle VM Server の REST API についての話を投稿してみます。
Oracle VM Server(OVMS)を操作する Web API として、
SOAP と REST のインターフェースが用意されています。
Web API を 実行するときは、Oracle VM Manager(OVMM)がエンドポイントとなります。
Oracle VM の操作や情報取得などは、ひととおり Web API 経由でも実行できるようです。
ただし、SOAP は Oracle VM 3.4 から非推奨になっているので、
これからは REST API を使用することになるはずです。
Oracle VM Web Service API のドキュメント。
他の ORACLE 製品と同様、Web サイトでドキュメントが公開されています。
Oracle VM
Web Services API Developer's Guide for Release 3.4
http://docs.oracle.com/cd/E64076_01/E64087/html/index.html
ちなみに、API の詳細なドキュメント (SDK) は、
Oracle VM Manager のインストーラ ISO イメージの中にあります。
[root@ovmm342 ~]# mount /dev/cdrom /media/
mount: /dev/sr0 is write-protected, mounting read-only
[root@ovmm342 ~]# ls /media/
OvmSDK_3.4.2.1384.zip components oracle-validated.params runInstaller.sh
TRANS.TBL createOracle.sh ovmm-installer.bsx sample.yml
ZIP ファイルを展開すると・・・
[root@ovmm342 ~]# unzip /media/OvmSDK_3.4.2.1384.zip -d sdk
[root@ovmm342 ~]# ls -l sdk
合計 0
drwxr-xr-x 3 root root 16 9月 14 11:34 doc
drwxr-xr-x 2 root root 28 9月 14 11:34 lib
drwxr-xr-x 2 root root 64 9月 14 11:34 source
drwxr-xr-x 2 root root 104 9月 14 11:34 wsdl
[root@ovmm342 ~]# ls -l sdk/doc/api/
合計 24
-rw-r--r-- 1 root root 1234 9月 14 11:34 index.html
drwxr-xr-x 4 root root 12288 9月 14 11:34 webservices_r
drwxr-xr-x 4 root root 4096 9月 14 11:34 webservices_s
このような HTML ドキュメントが含まれています。
※私の環境では、適当な Web サーバに配置して見ています。
REST API で OVMM にアクセスしてみる。
今回はクライアントとして、curl コマンドを使用します。
OVMM のアドレスは、ovmm342.go-lab.jp としています。
最初に、変数 $PASS にパスワードを入れておきます。
[gowatana@client01 ~]$ PASS=<OVMM の admin ユーザパスワード>
OVMM の情報を見てみます。
URI に含まれる wsapi は、Oracle VM「Web Services API」を意味するようです。
今回の Oracle VM Manager のバージョンは 3.4.2.1384 です。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Manager | xmllint --format -
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<managers>
<manager>
<description/>
<generation>0</generation>
<id>
<name>OVM Manager</name>
<type>com.oracle.ovm.mgr.ws.model.Manager</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Manager/0004fb0000010000ea420f8fead126fb</uri>
<value>0004fb0000010000ea420f8fead126fb</value>
</id>
<locked>false</locked>
<name>OVM Manager</name>
<readOnly>false</readOnly>
<managerRunState>RUNNING</managerRunState>
<managerTime>1481030557878</managerTime>
<managerUuid>0004fb0000010000ea420f8fead126fb</managerUuid>
<managerVersion>3.4.2.1384</managerVersion>
</manager>
</managers>
例として、ovms342-2 という名前の OVMS 1台だけの情報を見てみます。
API では、オブジェクトを Object ID で指定します。
まず、対象 OVMS の Object ID を探します。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Server | xmllint --xpath "/servers/server[name='ovms342-2']/id" - | xmllint --format -
<?xml version="1.0"?>
<id>
<name>ovms342-2</name>
<type>com.oracle.ovm.mgr.ws.model.Server</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Server/42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</uri>
<value>42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</value>
</id>
調べた Object ID をもとに、OVMS「ovms342-2」の情報を見てみます。
ハイパーバイザ1台だけの情報ですが、情報量が多いです。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Server/42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51 | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<server>
<description/>
<generation>5</generation>
<id>
<name>ovms342-2</name>
<type>com.oracle.ovm.mgr.ws.model.Server</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Server/42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</uri>
<value>42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</value>
</id>
<locked>false</locked>
<name>ovms342-2</name>
<readOnly>false</readOnly>
<agentLogin>oracle</agentLogin>
<biosReleaseDate>09/21/2015</biosReleaseDate>
<biosVendor>Phoenix Technologies LTD</biosVendor>
<biosVersion>6.00</biosVersion>
<clusterId>
<type>com.oracle.ovm.mgr.ws.model.Cluster</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Cluster/feda9970bbb3281a</uri>
<value>feda9970bbb3281a</value>
</clusterId>
<controlDomainIds>
<name>Control Domain</name>
<type>com.oracle.ovm.mgr.ws.model.ControlDomain</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/ControlDomain/0004fb00002100008c0c771361eea036</uri>
<value>0004fb00002100008c0c771361eea036</value>
</controlDomainIds>
<coresPerProcessorSocket>1</coresPerProcessorSocket>
<cpuCompatibilityGroupId>
<name>Default_Intel_Family:6_Model:63</name>
<type>com.oracle.ovm.mgr.ws.model.CpuCompatibilityGroup</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/CpuCompatibilityGroup/Default_Intel_F6_M63</uri>
<value>Default_Intel_F6_M63</value>
</cpuCompatibilityGroupId>
<cpuIds>
<type>com.oracle.ovm.mgr.ws.model.Cpu</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Cpu/Processor%20(1)%20in%2042:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</uri>
<value>Processor (1) in 42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</value>
</cpuIds>
<cpuIds>
<type>com.oracle.ovm.mgr.ws.model.Cpu</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Cpu/Processor%20(2)%20in%2042:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</uri>
<value>Processor (2) in 42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</value>
</cpuIds>
<enabledProcessorCores>0</enabledProcessorCores>
<ethernetPortIds>
<name>bond0 on ovms342-2</name>
<type>com.oracle.ovm.mgr.ws.model.EthernetPort</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/EthernetPort/0004fb000020000028c98c4d50e34b9f</uri>
<value>0004fb000020000028c98c4d50e34b9f</value>
</ethernetPortIds>
<ethernetPortIds>
<name>eth0 on ovms342-2</name>
<type>com.oracle.ovm.mgr.ws.model.EthernetPort</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/EthernetPort/0004fb0000200000701f366679d7307f</uri>
<value>0004fb0000200000701f366679d7307f</value>
</ethernetPortIds>
<fileServerPluginIds>
<name>Oracle Generic Network File System</name>
<type>com.oracle.ovm.mgr.ws.model.FileServerPlugin</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/FileServerPlugin/oracle.generic.NFSPlugin.GenericNFSPlugin%20(1.1.0)</uri>
<value>oracle.generic.NFSPlugin.GenericNFSPlugin (1.1.0)</value>
</fileServerPluginIds>
<fileServerPluginIds>
<name>Oracle OCFS2 File system</name>
<type>com.oracle.ovm.mgr.ws.model.FileServerPlugin</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/FileServerPlugin/oracle.ocfs2.OCFS2.OCFS2Plugin%20(0.1.0-47.2.2)</uri>
<value>oracle.ocfs2.OCFS2.OCFS2Plugin (0.1.0-47.2.2)</value>
</fileServerPluginIds>
<fileSystemMountIds>
<name>ovms342-2_/OVS/Repositories/0004fb000003000004232ab57b1244f3</name>
<type>com.oracle.ovm.mgr.ws.model.FileSystemMount</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/FileSystemMount/42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51_mount_%2FOVS%2FRepositories%2F0004fb000003000004232ab57b1244f3</uri>
<value>42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51_mount_/OVS/Repositories/0004fb000003000004232ab57b1244f3</value>
</fileSystemMountIds>
<hostname>ovms342-2</hostname>
<hypervisor>
<capabilities>XEN_3_0_PVM_x86_64</capabilities>
<capabilities>XEN_3_0_PVM_x86_32</capabilities>
<capabilities>XEN_3_0_HVM_x86_32</capabilities>
<capabilities>XEN_3_0_HVM_x86_32_PAE</capabilities>
<capabilities>XEN_3_0_HVM_x86_64</capabilities>
<type>XEN</type>
<version>4.4.4OVM</version>
</hypervisor>
<ipAddress>192.168.1.163</ipAddress>
<localFileServerId>
<name>Local FS ovms342-2</name>
<type>com.oracle.ovm.mgr.ws.model.FileServer</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/FileServer/0004fb00000900008487381fd2be518c</uri>
<value>0004fb00000900008487381fd2be518c</value>
</localFileServerId>
<localStorageArrayId>
<name>Generic Local Storage Array @ ovms342-2</name>
<type>com.oracle.ovm.mgr.ws.model.StorageArray</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/StorageArray/0004fb00000900006b09919b668a6f60</uri>
<value>0004fb00000900006b09919b668a6f60</value>
</localStorageArrayId>
<maintenanceMode>false</maintenanceMode>
<managerUuid>0004fb0000010000ea420f8fead126fb</managerUuid>
<manufacturer>VMware, Inc.</manufacturer>
<memory>4095</memory>
<noExecuteFlag>true</noExecuteFlag>
<ntpServers>192.168.1.160</ntpServers>
<ovmVersion>3.4.2-1384</ovmVersion>
<populatedProcessorSockets>2</populatedProcessorSockets>
<processorSpeed>2302558.0</processorSpeed>
<processorType>X86_64</processorType>
<productName>VMware Virtual Platform</productName>
<protected>false</protected>
<rebootOnUpgrade>true</rebootOnUpgrade>
<serialNumber>VMware-42 09 6a ec d5 ac ca 1c-ed 7c b9 6e 4a e6 89 51</serialNumber>
<serverAbilities>
<allVmCpuOverSubscribe>true</allVmCpuOverSubscribe>
<bondModeActiveBackup>true</bondModeActiveBackup>
<bondModeAdaptiveLoadBalancing>true</bondModeAdaptiveLoadBalancing>
<bondModeLinkAggregation>true</bondModeLinkAggregation>
<cluster>true</cluster>
<clusterFsOnPhysicalDisk>true</clusterFsOnPhysicalDisk>
<fibreChannel>true</fibreChannel>
<highAvailability>true</highAvailability>
<hvmMaxVnics>8</hvmMaxVnics>
<iScsi>true</iScsi>
<localStorageElement>true</localStorageElement>
<migrationSetup>false</migrationSetup>
<mtuConfiguration>true</mtuConfiguration>
<nfs>true</nfs>
<perVmCpuOverSubscribe>true</perVmCpuOverSubscribe>
<powerOnWOL>true</powerOnWOL>
<repositoryOnLocalDisk>true</repositoryOnLocalDisk>
<repositoryOnSharedDisk>true</repositoryOnSharedDisk>
<serialConsole>true</serialConsole>
<serverPackageUpdate>true</serverPackageUpdate>
<vmEmptyCdrom>true</vmEmptyCdrom>
<vmLiveStorageMigration>true</vmLiveStorageMigration>
<vmMemoryAlignment>1048576</vmMemoryAlignment>
<vmRestartActions>true</vmRestartActions>
<vmSuspend>true</vmSuspend>
<vncConsole>true</vncConsole>
</serverAbilities>
<serverPoolId>
<name>sv-pool-01</name>
<type>com.oracle.ovm.mgr.ws.model.ServerPool</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/ServerPool/0004fb0000020000feda9970bbb3281a</uri>
<value>0004fb0000020000feda9970bbb3281a</value>
</serverPoolId>
<serverRoles>UTILITY</serverRoles>
<serverRoles>VM</serverRoles>
<serverRunState>RUNNING</serverRunState>
<serverUpToDate>true</serverUpToDate>
<statisticInterval>20</statisticInterval>
<storageArrayPluginIds>
<name>Oracle Generic SCSI Plugin</name>
<type>com.oracle.ovm.mgr.ws.model.StorageArrayPlugin</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/StorageArrayPlugin/oracle.generic.SCSIPlugin.GenericPlugin%20(1.1.0)</uri>
<value>oracle.generic.SCSIPlugin.GenericPlugin (1.1.0)</value>
</storageArrayPluginIds>
<storageInitiatorIds>
<name>iqn.1988-12.com.oracle:3a47814e8ace</name>
<type>com.oracle.ovm.mgr.ws.model.StorageInitiator</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/StorageInitiator/iqn.1988-12.com.oracle:3a47814e8ace</uri>
<value>iqn.1988-12.com.oracle:3a47814e8ace</value>
</storageInitiatorIds>
<storageInitiatorIds>
<name>storage.LocalStorageInitiator in 42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</name>
<type>com.oracle.ovm.mgr.ws.model.StorageInitiator</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/StorageInitiator/storage.LocalStorageInitiator%20in%2042:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</uri>
<value>storage.LocalStorageInitiator in 42:09:6a:ec:d5:ac:ca:1c:ed:7c:b9:6e:4a:e6:89:51</value>
</storageInitiatorIds>
<threadsPerCore>1</threadsPerCore>
<totalProcessorCores>0</totalProcessorCores>
<usableMemory>3239</usableMemory>
</server>
REST API で VM をクローンしてみる。
ためしに VM「vm01」をクローンしてみようと思います。
クローン実行時に、ServerPool ID の指定が必須となっているので調べておきます。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X GET https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/ServerPool | xmllint --xpath "//serverPool[name='sv-pool-01']/id/value/text()" - | more
0004fb0000020000feda9970bbb3281a
クローン元 VM「vm01」の ID を調べておきます。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Vm | xmllint --xpath "//vm[name='vm01']/id/value/text()" - | more
0004fb00000600002436128870d172e6
クローン元 VM「vm01」の ID を停止します。
検索ではないメソッドは非同期であり Job オブジェクトを返すことになっています。
また、API で PUT や POST を実行すると、下記のように Job が作成されます。
この Job をもとに処理のステータスや、新規オブジェクトの ID を確認したりします。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X PUT https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Vm/0004fb00000600002436128870d172e6/stop
<?xml version="1.0" encoding="UTF-8"?><job><generation>0</generation><id><name>Stop VM: vm01</name><type>com.oracle.ovm.mgr.ws.model.Job</type><uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481033789539</uri><value>1481033789539</value></id><locked>false</locked><readOnly>false</readOnly><done>false</done><jobGroup>false</jobGroup><jobRunState>NONE</jobRunState><jobSummaryState>NONE</jobSummaryState><summaryDone>false</summaryDone></job>[gowatana@client01 ~]$
VM をクローンします。
今回は最小限のパラメータで、クローン元 VM の ID と、serverPoolId を指定しています。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X PUT https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Vm/0004fb00000600002436128870d172e6/clone?serverPoolId=0004fb0000020000feda9970bbb3281a
<?xml version="1.0" encoding="UTF-8"?><job><generation>0</generation><id><name>Clone VM: vm01 in Server Pool: sv-pool-01</name><type>com.oracle.ovm.mgr.ws.model.Job</type><uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235</uri><value>1481034353235</value></id><locked>false</locked><readOnly>false</readOnly><done>false</done><jobGroup>false</jobGroup><jobRunState>NONE</jobRunState><jobSummaryState>NONE</jobSummaryState><summaryDone>false</summaryDone></job>[gowatana@client01 ~]$
Job 「1481034353235」の様子を見てみます。実行中は、RUNNING となっています。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X GET https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235 | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<job>
<description>Clone VM: vm01 in Server Pool: sv-pool-01</description>
<generation>10</generation>
<id>
<name>Clone VM: vm01 in Server Pool: sv-pool-01</name>
<type>com.oracle.ovm.mgr.ws.model.Job</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235</uri>
<value>1481034353235</value>
</id>
<locked>true</locked>
<name>Clone VM: vm01 in Server Pool: sv-pool-01</name>
<readOnly>false</readOnly>
<done>false</done>
<endTime>-1</endTime>
<jobGroup>false</jobGroup>
<jobRunState>RUNNING</jobRunState>
<jobSummaryState>RUNNING</jobSummaryState>
<latestSummaryProgressMessage>Copying File 1/1, 6,401 MB/17,180 MB</latestSummaryProgressMessage>
<progressMessage>Copying File 1/1, 6,401 MB/17,180 MB</progressMessage>
<startTime>1481034353541</startTime>
<summaryDone>false</summaryDone>
<user>admin</user>
</job>
Job の進捗メッセージを見ることができます。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X GET https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235 | xmllint --xpath "//latestSummaryProgressMessage/text()" - | more
Copying File 1/1, 14,076 MB/17,180 MB
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X GET https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235 | xmllint --xpath "//jobRunState/text()" - | more
RUNNING
Job が完了して、成功しているとジョブの状態が SUCCESS になります。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X GET https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235 | xmllint --xpath "//latestSummaryProgressMessage/text()" - | more
XPath set is empty
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X GET https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235 | xmllint --xpath "//jobRunState/text()" - | more
SUCCESS
JOB には、作成されたオブジェクトの情報が含まれます。
今回は、VM「vm01 (2)」が ID 0004fb000006000062cc49e35484335f で作成されました。
[gowatana@client01 ~]$ curl -ksu "admin:$PASS" -X GET https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235 | xmllint --format -
<?xml version="1.0" encoding="UTF-8"?>
<job>
<description>Clone VM: vm01 in Server Pool: sv-pool-01</description>
<generation>13</generation>
<id>
<name>Clone VM: vm01 in Server Pool: sv-pool-01</name>
<type>com.oracle.ovm.mgr.ws.model.Job</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034353235</uri>
<value>1481034353235</value>
</id>
<locked>false</locked>
<name>Clone VM: vm01 in Server Pool: sv-pool-01</name>
<readOnly>false</readOnly>
<childJobIds>
<name>DeleteCloneDefDbImpl_1481034616413</name>
<type>com.oracle.ovm.mgr.ws.model.Job</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Job/1481034616414</uri>
<value>1481034616414</value>
</childJobIds>
<done>true</done>
<endTime>1481034611867</endTime>
<jobGroup>false</jobGroup>
<jobRunState>SUCCESS</jobRunState>
<jobSummaryState>SUCCESS</jobSummaryState>
<latestSummaryProgressMessage/>
<progressMessage/>
<resultId>
<name>vm01 (2)</name>
<type>com.oracle.ovm.mgr.ws.model.Vm</type>
<uri>https://ovmm342.go-lab.jp:7002/ovm/core/wsapi/rest/Vm/0004fb000006000062cc49e35484335f</uri>
<value>0004fb000006000062cc49e35484335f</value>
</resultId>
<startTime>1481034353541</startTime>
<summaryDone>true</summaryDone>
<user>admin</user>
</job>
OVMM の Web UI でも、VM がクローンされたことが確認できます。
このように、最近よく話題になる Web API で Oracle VM を操作することができます。
JPOUG Advent Calendar 2016 の 8日は、wmo6hash さんです。よろしくお願いします。
0 件のコメント:
コメントを投稿