Class: OvirtSDK4::VmsService

Inherits:
Service
  • Object
show all
Defined in:
lib/ovirtsdk4/services.rb,
lib/ovirtsdk4/services.rb

Instance Method Summary collapse

Instance Method Details

#add(vm, opts = {}) ⇒ Vm

Creates a new virtual machine.

The virtual machine can be created in different ways:

  • From a template. In this case the identifier or name of the template must be provided. For example, using a plain shell script and XML:

#!/bin/sh -ex

url="https://engine.example.com/ovirt-engine/api"
user="admin@internal"
password="..."
curl \
--verbose \
--cacert /etc/pki/ovirt-engine/ca.pem \
--user "${user}:${password}" \
--request POST \
--header "Version: 4" \
--header "Content-Type: application/xml" \
--header "Accept: application/xml" \
--data '
<vm>
  <name>myvm</name>
  <template>
    <name>Blank</name>
  </template>
  <cluster>
    <name>mycluster</name>
  </cluster>
</vm>
' \
"${url}/vms"
  • From a snapshot. In this case the identifier of the snapshot has to be provided. For example, using a plain shel script and XML:

#!/bin/sh -ex

url="https://engine.example.com/ovirt-engine/api"
user="admin@internal"
password="..."
curl \
--verbose \
--cacert /etc/pki/ovirt-engine/ca.pem \
--user "${user}:${password}" \
--request POST \
--header "Content-Type: application/xml" \
--header "Accept: application/xml" \
--data '
<vm>
  <name>myvm</name>
  <snapshots>
    <snapshot id="266742a5-6a65-483c-816d-d2ce49746680"/>
  </snapshots>
  <cluster>
    <name>mycluster</name>
  </cluster>
</vm>
' \
"${url}/vms"

When creating a virtual machine from a template or from a snapshot it is usually useful to explicitly indicate in what storage domain to create the disks for the virtual machine. If the virtual machine is created from a template then this is achieved passing a set of disk_attachment elements that indicate the mapping:

<vm>
  ...
  <disk_attachments>
    <disk_attachment>
      <disk id="8d4bd566-6c86-4592-a4a7-912dbf93c298">
        <storage_domains>
          <storage_domain id="9cb6cb0a-cf1d-41c2-92ca-5a6d665649c9"/>
        </storage_domains>
      </disk>
    <disk_attachment>
  </disk_attachments>
</vm>

When the virtual machine is created from a snapshot this set of disks is slightly different, it uses the image_id attribute instead of id.

<vm>
  ...
  <disk_attachments>
    <disk_attachment>
      <disk>
        <image_id>8d4bd566-6c86-4592-a4a7-912dbf93c298</image_id>
        <storage_domains>
          <storage_domain id="9cb6cb0a-cf1d-41c2-92ca-5a6d665649c9"/>
        </storage_domains>
      </disk>
    <disk_attachment>
  </disk_attachments>
</vm>

It is possible to specify additional virtual machine parameters in the XML description, e.g. a virtual machine of desktop type, with 2 GiB of RAM and additional description can be added sending a request body like the following:

<vm>
  <name>myvm</name>
  <description>My Desktop Virtual Machine</description>
  <type>desktop</type>
  <memory>2147483648</memory>
  ...
</vm>

A bootable CDROM device can be set like this:

<vm>
  ...
  <os>
    <boot dev="cdrom"/>
  </os>
</vm>

In order to boot from CDROM, you first need to insert a disk, as described in the CDROM service. Then booting from that CDROM can be specified using the os.boot.devices attribute:

<vm>
  ...
  <os>
    <boot>
      <devices>
        <device>cdrom</device>
      </devices>
    </boot>
  </os>
</vm>

In all cases the name or identifier of the cluster where the virtual machine will be created is mandatory.

Parameters:

  • vm (Vm)

    The vm to add.

  • opts (Hash) (defaults to: {})

    Additional options.

Options Hash (opts):

  • :clone (Boolean)

    Specifies if the virtual machine should be independent of the template.

    When a virtual machine is created from a template by default the disks of the virtual machine depend on the disks of the template, they are using the copy on write mechanism so that only the differences from the template take up real storage space. If this parameter is specified and the value is true then the disks of the created virtual machine will be cloned, and independent of the template. For example, to create an independent virtual machine, send a request like this:

    POST /ovirt-engine/vms?clone=true

    With a request body like this:

    <vm>
      <name>myvm<name>
      <template>
        <name>mytemplate<name>
      </template>
      <cluster>
        <name>mycluster<name>
      </cluster>
    </vm>
    Note
    When this parameter is true the permissions of the template will also be copied, as when using clone_permissions=true.
  • :clone_permissions (Boolean)

    Specifies if the permissions of the template should be copied to the virtual machine.

    If this optional parameter is provided, and its values is true then the permissions of the template (only the direct ones, not the inherited ones) will be copied to the created virtual machine. For example, to create a virtual machine from the mytemplate template copying its permissions, send a request like this:

    POST /ovirt-engine/api/vms?clone_permissions=true

    With a request body like this:

    <vm>
      <name>myvm<name>
      <template>
        <name>mytemplate<name>
      </template>
      <cluster>
        <name>mycluster<name>
      </cluster>
    </vm>
  • :headers (Hash)

    Additional HTTP headers.

  • :query (Hash)

    Additional URL query parameters.

Returns:



36291
36292
36293
36294
36295
36296
36297
36298
36299
36300
36301
36302
36303
36304
36305
36306
36307
36308
36309
36310
36311
36312
36313
36314
36315
36316
36317
36318
36319
36320
36321
36322
36323
36324
36325
36326
36327
# File 'lib/ovirtsdk4/services.rb', line 36291

def add(vm, opts = {})
  if vm.is_a?(Hash)
    vm = OvirtSDK4::Vm.new(vm)
  end
  headers = opts[:headers] || {}
  query = opts[:query] || {}
  value = opts[:clone]
  unless value.nil?
    value = Writer.render_boolean(value)
    query['clone'] = value
  end
  value = opts[:clone_permissions]
  unless value.nil?
    value = Writer.render_boolean(value)
    query['clone_permissions'] = value
  end
  request = HttpRequest.new(method: :POST, url: @path, headers: headers, query: query)
  begin
    writer = XmlWriter.new(nil, true)
    VmWriter.write_one(vm, writer)
    request.body = writer.string
  ensure
    writer.close
  end
  response = @connection.send(request)
  case response.code
  when 200, 201, 202
    begin
      reader = XmlReader.new(response.body)
      return VmReader.read_one(reader)
    ensure
      reader.close
    end
  else
    check_fault(response)
  end
end

#list(opts = {}) ⇒ Array<Vm>

Returns the representation of the object managed by this service.

Parameters:

  • opts (Hash) (defaults to: {})

    Additional options.

Options Hash (opts):

  • :all_content (Boolean)

    Indicates if all the attributes of the virtual machines should be included in the response.

    By default the following attributes are excluded:

    • console

    • initialization.configuration.data - The OVF document describing the virtual machine.

    • rng_source

    • soundcard

    • virtio_scsi

    For example, to retrieve the complete representation of the virtual machines send a request like this:

    GET /ovirt-engine/api/vms?all_content=true
    Note
    The reason for not including these attributes is performance: they are seldom used and they require additional queries to the database. So try to use the this parameter only when it is really needed.
  • :case_sensitive (Boolean)

    Indicates if the search performed using the search parameter should be performed taking case into account. The default value is true, which means that case is taken into account. If you want to search ignoring case set it to false.

  • :filter (Boolean)

    Indicates if the results should be filtered according to the permissions of the user.

  • :max (Integer)

    The maximum number of results to return.

  • :search (String)

    A query string used to restrict the returned virtual machines.

  • :headers (Hash)

    Additional HTTP headers.

  • :query (Hash)

    Additional URL query parameters.

Returns:

  • (Array<Vm>)


36369
36370
36371
36372
36373
36374
36375
36376
36377
36378
36379
36380
36381
36382
36383
36384
36385
36386
36387
36388
36389
36390
36391
36392
36393
36394
36395
36396
36397
36398
36399
36400
36401
36402
36403
36404
36405
36406
36407
36408
36409
# File 'lib/ovirtsdk4/services.rb', line 36369

def list(opts = {})
  headers = opts[:headers] || {}
  query = opts[:query] || {}
  value = opts[:all_content]
  unless value.nil?
    value = Writer.render_boolean(value)
    query['all_content'] = value
  end
  value = opts[:case_sensitive]
  unless value.nil?
    value = Writer.render_boolean(value)
    query['case_sensitive'] = value
  end
  value = opts[:filter]
  unless value.nil?
    value = Writer.render_boolean(value)
    query['filter'] = value
  end
  value = opts[:max]
  unless value.nil?
    value = Writer.render_integer(value)
    query['max'] = value
  end
  value = opts[:search]
  unless value.nil?
    query['search'] = value
  end
  request = HttpRequest.new(method: :GET, url: @path, headers: headers, query: query)
  response = @connection.send(request)
  case response.code
  when 200
    begin
      reader = XmlReader.new(response.body)
      return VmReader.read_many(reader)
    ensure
      reader.close
    end
  else
    check_fault(response)
  end
end

#service(path) ⇒ Service

Locates the service corresponding to the given path.

Parameters:

  • path (String)

    The path of the service.

Returns:

  • (Service)

    A reference to the service.



36429
36430
36431
36432
36433
36434
36435
36436
36437
36438
# File 'lib/ovirtsdk4/services.rb', line 36429

def service(path)
  if path.nil? || path == ''
    return self
  end
  index = path.index('/')
  if index.nil?
    return vm_service(path)
  end
  return vm_service(path[0..(index - 1)]).service(path[(index +1)..-1])
end

#to_sString

Returns an string representation of this service.

Returns:

  • (String)


36445
36446
36447
# File 'lib/ovirtsdk4/services.rb', line 36445

def to_s
  "#<#{VmsService}:#{@path}>"
end

#vm_service(id) ⇒ VmService

Locates the vm service.

Parameters:

  • id (String)

    The identifier of the vm.

Returns:

  • (VmService)

    A reference to the vm service.



36418
36419
36420
# File 'lib/ovirtsdk4/services.rb', line 36418

def vm_service(id)
  VmService.new(@connection, "#{@path}/#{id}")
end