Creates a new implementation of the service.
@param connection [Connection] The connection to be used by this service.
@param path [String] The relative path of this service, for example `vms/123/disks`.
@api private
# File lib/ovirtsdk4/services.rb, line 33269 def initialize(connection, path) @connection = connection @path = path end
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=“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=“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 <<services/vm_cdrom, 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.
@param vm [Vm] The `vm` to add.
@param opts [Hash] Additional options.
@option opts [Boolean] :clone 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 https://en.wikipedia.org/wiki/Copy-on-write[_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: [source] ---- POST /ovirt-engine/vms?clone=true ---- With a request body like this: [source,xml] ---- <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`.
@option opts [Boolean] :clone_permissions 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: [source] ---- POST /ovirt-engine/api/vms?clone_permissions=true ---- With a request body like this: [source,xml] ---- <vm> <name>myvm<name> <template> <name>mytemplate<name> </template> <cluster> <name>mycluster<name> </cluster> </vm> ----
@return [Vm]
# File lib/ovirtsdk4/services.rb, line 33492 def add(vm, opts = {}) if vm.is_a?(Hash) vm = OvirtSDK4::Vm.new(vm) end 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, 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
Returns the representation of the object managed by this service.
@param opts [Hash] Additional options.
@option opts [Boolean] :all_content 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.
@option opts [Boolean] :case_sensitive 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`.
@option opts [Boolean] :filter Indicates if the results should be filtered according to the permissions of the user.
@option opts [Integer] :max The maximum number of results to return.
@option opts [String] :search A query string used to restrict the returned virtual machines.
@return [Array<Vm>]
# File lib/ovirtsdk4/services.rb, line 33565 def list(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, 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
Locates the service corresponding to the given path.
@param path [String] The path of the service.
@return [Service] A reference to the service.
# File lib/ovirtsdk4/services.rb, line 33624 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
Returns an string representation of this service.
@return [String]
# File lib/ovirtsdk4/services.rb, line 33640 def to_s "#<#{VmsService}:#{@path}>" end
Locates the `vm` service.
@param id [String] The identifier of the `vm`.
@return [VmService] A reference to the `vm` service.
# File lib/ovirtsdk4/services.rb, line 33613 def vm_service(id) VmService.new(@connection, "#{@path}/#{id}") end