2016年12月7日水曜日

Oracle VM Server と REST API。

JPOUG Advent Calendar 2016 の 7 日目の投稿です。

前日は 渡部 亮太 さんでした。
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 件のコメント:

コメントを投稿