2.2. タイプ

2.2.1. タイプのインスタンスの作成と変更

以下で説明するように、サービスメソッドを呼び出して変更がサーバーに明示的に送信されない限り、タイプのインスタンスを作成または変更しても、サーバー側には何の影響もありません。サーバー側での変更は、メモリーにすでに存在するインスタンスに自動的に反映されません。

これらのクラスのコンストラクターには、オプションの引数が複数 (タイプの属性ごとに 1 つずつ) あります。これにより、複数のコンストラクターへのネストされた呼び出しを使用して、オブジェクトの作成が簡素化されます。

次の例では、仮想マシンのインスタンスが作成され、その属性 (クラスター、テンプレート、およびメモリー) が設定されています。

属性を使用した仮想マシンインスタンスの作成

vm = OvirtSDK4::Vm.new(
  name: 'myvm',
  cluster: OvirtSDK4::Cluster.new(
    name: 'mycluster'
  ),
  template: OvirtSDK4::Template.new(
    name: 'mytemplate'
  ),
  memory: 1073741824
)

これらのコンストラクターに渡されたハッシュ (たとえば、cluster: OvirtSDK4::Cluster.new) は再帰的に処理されます。

次の例では、Cluster クラスと Template クラスのコンストラクターを明示的に呼び出す代わりに、プレーンなハッシュが使用されています。SDK は、ハッシュを必要なクラスに内部的に変換します。

プレーンなハッシュとして表現された属性を持つ仮想マシンインスタンスの作成

vm = OvirtSDK4::Vm.new(
  name: 'myvm',
  cluster: {
    name: 'mycluster'
  },
  template: {
    name: 'mytemplate'
  },
  memory: 1073741824
)

この方法でコンストラクターを使用することをお勧めしますが、必須ではありません。

次の例では、コンストラクターの呼び出しにおいて引数なしで仮想マシンインスタンスが作成されます。セッターを使用して、またはセッターとコンストラクターの組み合わせを使用して、仮想マシンインスタンスの属性を 1 つずつ追加できます。

仮想マシンインスタンスの作成と属性の個別の追加

vm = OvirtSDK4::Vm.new
vm.name = 'myvm'
vm.cluster = OvirtSDK4::Cluster.new(name: 'mycluster')
vm.template = OvirtSDK4::Template.new(name: 'mytemplate')
vm.memory = 1073741824

API 仕様でオブジェクトのリストとして定義されている属性は、Ruby 配列として実装されます。たとえば、Vm タイプの custom_properties 属性は、CustomProperty タイプのオブジェクトのリストとして定義されます。

属性のリストを配列として追加する

vm = OvirtSDK4::Vm.new(
  name: 'myvm',
  custom_properties: [
    OvirtSDK4::CustomProperty.new(...),
    OvirtSDK4::CustomProperty.new(...),
    ...
  ]
)

API で列挙値として定義されている属性は、列挙タイプと同じ名前のモジュールに定数として実装されます。

次の例は、VmStatus 列挙値を使用して Vm タイプのステータス属性を定義する方法を示しています。

case vm.status
when OvirtSDK4::VmStatus::DOWN
  ...
when OvirtSDK4::VmStatus::IMAGE_LOCKED
  ...
end
重要

API 仕様では、enum タイプの値は小文字になります。これは、XML と JSON の規則であるためです。ただし、Ruby では、これらの定数には 大文字 を使用することが慣例となっています。

2.2.2. インスタンス属性の取得

対応する属性リーダーを使用して、インスタンス属性を取得できます。

次の例では、仮想マシンインスタンスの名前とメモリーを取得します。

仮想マシンインスタンス属性の取得

puts "vm.name: #{vm.name}"
puts "vm.memory: #{vm.memory}"
vm.custom_properties.each do |custom_property|
  ...
end

リンクとしてのインスタンス属性の取得

一部のインスタンス属性はリンクとして返され、データを取得するには follow_link メソッドが必要です。次の例では、仮想マシンの属性の要求に対する応答は、リンク付きの XML としてフォーマットされています。

リンクとしての仮想マシン属性の取得

<vm id="123" href="/ovirt-engine/api/vms/123">
  <name>myvm</name>
  <link rel="diskattachments" href="/ovirt-engine/api/vms/123/diskattachments/">
  ...
</vm>

リンク vm.disk_attachments には、実際のディスクアタッチメントが含まれていません。データを取得するために、Connection クラスは、href XML 属性の値を使用して実際のデータを取得する follow_link メソッドを提供します。

次の例で、follow_link を使用すると、ディスクの添付ファイル、そして各ディスクに移動して、alias を取得することができます。

仮想マシンサービスの取得

vm = vm_service.get

follow_link を使用したディスクアタッチメントとディスクエイリアスの取得

attachments = connection.follow_link(vm.disk_attachments)
attachments.each do |attachment|
  disk = connection.follow_link(attachment.disk)
  puts "disk.alias: #{disk.alias}"
end