<div dir="ltr"><div><div><div>Hi Nicolas,<br><br></div>You can find an example here:<br><br><a href="https://github.com/oVirt/ovirt-engine-sdk/blob/21f637345597729240f217cfe84fe2a2cf39a655/sdk/examples/add_independet_vm.py#L56">https://github.com/oVirt/ovirt-engine-sdk/blob/21f637345597729240f217cfe84fe2a2cf39a655/sdk/examples/add_independet_vm.py#L56</a><br><br></div>Regards,<br></div>Fred<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 22, 2018 at 9:09 AM, Nicolas Vaye <span dir="ltr">&lt;<a href="mailto:nicolas.vaye@province-sud.nc" target="_blank">nicolas.vaye@province-sud.nc</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I want to create a cloned virtual machine based on a template with SDK API python and i don&#39;t find the parameter to indicate the clone action for the disk<br>
<br>
here is my code :<br>
<br>
#!/usr/bin/env python<br>
# -*- coding: utf-8 -*-<br>
<br>
#<br>
# Copyright (c) 2016 Red Hat, Inc.<br>
#<br>
# Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
# you may not use this file except in compliance with the License.<br>
# You may obtain a copy of the License at<br>
#<br>
#   <a href="http://www.apache.org/licenses/LICENSE-2.0" rel="noreferrer" target="_blank">http://www.apache.org/<wbr>licenses/LICENSE-2.0</a><br>
#<br>
# Unless required by applicable law or agreed to in writing, software<br>
# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
# See the License for the specific language governing permissions and<br>
# limitations under the License.<br>
#<br>
from pprint import pprint<br>
import logging<br>
import time<br>
<br>
import ovirtsdk4 as sdk<br>
import ovirtsdk4.types as types<br>
<br>
<br>
<br>
template_name=&#39;test_debian_9.<wbr>4&#39;<br>
template_version=1<br>
cluster_name=&#39;nico-cluster&#39;<br>
data_domain_name=&#39;OVIRT-TEST2&#39;<br>
<br>
<br>
<br>
logging.basicConfig(level=<wbr>logging.DEBUG, filename=&#39;example.log&#39;)<br>
<br>
# This example will connect to the server and start a virtual machine<br>
# with cloud-init, in order to automatically configure the network and<br>
# the password of the `root` user.<br>
<br>
# Create the connection to the server:<br>
connection = sdk.Connection(<br>
    url=&#39;<a href="https://ocenter.province-sud.prod/ovirt-engine/api" rel="noreferrer" target="_blank">https://ocenter.province-<wbr>sud.prod/ovirt-engine/api</a>&#39;,<br>
    username=&#39;admin@internal&lt;<wbr>mailto:<a href="mailto:username">username</a>=&#39;admin@<wbr>internal&gt;&#39;,<br>
    password=&#39;admin&#39;,<br>
    ca_file=&#39;CA_ocenter.pem&#39;,<br>
    debug=True,<br>
    log=logging.getLogger(),<br>
)<br>
<br>
<br>
<br>
##############################<wbr>####<br>
############ TEMPLATE ############<br>
##############################<wbr>####<br>
<br>
# Get the reference to the root of the tree of services:<br>
system_service = connection.system_service()<br>
<br>
# Get the reference to the service that manages the storage domains:<br>
storage_domains_service = system_service.storage_<wbr>domains_service()<br>
<br>
# Find the storage domain we want to be used for virtual machine disks:<br>
storage_domain = storage_domains_service.list(<wbr>search=&#39;name=&#39;+data_domain_<wbr>name)[0]<br>
<br>
<br>
# Get the reference to the service that manages the templates:<br>
templates_service = system_service.templates_<wbr>service()<br>
<br>
# When a template has multiple versions they all have the same name, so<br>
# we need to explicitly find the one that has the version name or<br>
# version number that we want to use. In this case we want to use<br>
# version 1 of the template.<br>
templates = templates_service.list(search=<wbr>&#39;name=&#39;+template_name)<br>
template_id = None<br>
for template in templates:<br>
    if template.version.version_<wbr>number == template_version:<br>
        template_id = <a href="http://template.id" rel="noreferrer" target="_blank">template.id</a><br>
        break<br>
<br>
if template_id == None:<br>
    print &quot;ERREUR le template &quot;+template_name+&quot;en version &quot;+str(template_version)+&quot; n&#39;a pas été trouvé!!&quot;<br>
<br>
# Find the template disk we want be created on specific storage domain<br>
# for our virtual machine:<br>
template_service = templates_service.template_<wbr>service(template_id)<br>
disk_attachments = connection.follow_link(<wbr>template_service.get().disk_<wbr>attachments)<br>
<br>
print &quot;disk_attachments=&quot; + str(len(disk_attachments))<br>
<br>
template_disk_attachments = []<br>
for disk in disk_attachments:<br>
    template_disk_attachments.<wbr>append(types.DiskAttachment(<br>
                disk=types.Disk(<br>
                    id=<a href="http://disk.id" rel="noreferrer" target="_blank">disk.id</a>,<br>
                    format=types.DiskFormat.COW,<br>
                    storage_domains=[<br>
                        types.StorageDomain(<br>
                            id=<a href="http://storage_domain.id" rel="noreferrer" target="_blank">storage_domain.id</a>,<br>
                        ),<br>
                    ],<br>
                ),<br>
            )<br>
    )<br>
<br>
<br>
<br>
# Get the reference to the service that manages the virtual machines:<br>
vms_service = system_service.vms_service()<br>
<br>
# Add a new virtual machine explicitly indicating the identifier of the<br>
# template version that we want to use and indicating that template disk<br>
# should be created on specific storage domain for the virtual machine:<br>
vm = vms_service.add(<br>
    types.Vm(<br>
        name=&#39;myvm&#39;,<br>
        cluster=types.Cluster(<br>
            name=cluster_name<br>
        ),<br>
        stateless=False,<br>
        type=types.VmType(&#39;server&#39;),<br>
        comment=&#39;based on template &#39;+template_name+&#39;en version &#39;+str(template_version),<br>
        template=types.Template(<br>
            id=template_id<br>
        ),<br>
        disk_attachments=template_<wbr>disk_attachments,<br>
    )<br>
)<br>
<br>
<br>
<br>
# Get a reference to the service that manages the virtual machine that<br>
# was created in the previous step:<br>
vm_service = vms_service.vm_service(<a href="http://vm.id" rel="noreferrer" target="_blank">vm.id</a>)<br>
<br>
# Wait till the virtual machine is down, which indicats that all the<br>
# disks have been created:<br>
while True:<br>
    time.sleep(1)<br>
    vm = vm_service.get()<br>
    if vm.status == types.VmStatus.DOWN:<br>
        break<br>
<br>
<br>
# Close the connection to the server:<br>
connection.close()<br>
<br>
<br>
<br>
<br>
If the data_domain_name is the same as the template data domain, then this script seem to create a vm but not with cloned disk.<br>
<br>
If the data_domain_name is NOT the same as the template data domain, then this script produce an error<br>
ovirtsdk4.Error: Fault reason is &quot;Operation Failed&quot;. Fault detail is &quot;[Cannot add VM. The selected Storage Domain does not contain the VM Template.]&quot;. HTTP response code is 400.<br>
<br>
So how to create a cloned virtual machine based on a template ?<br>
<br>
I think i&#39;m looking for the same parameter on the web ui, &quot;Storage Allocation&quot; =&gt; Thin/Clone<br>
<br>
[<a href="mailto:cid%3A1521702568.14216.1.camel@province-sud.nc">cid:1521702568.14216.1.camel@<wbr>province-sud.nc</a>]<br>
<br>
<br>
Thanks.<br>
<span class="HOEnZb"><font color="#888888"><br>
Nicolas VAYE<br>
<br>
</font></span><br>______________________________<wbr>_________________<br>
Users mailing list<br>
<a href="mailto:Users@ovirt.org">Users@ovirt.org</a><br>
<a href="http://lists.ovirt.org/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.ovirt.org/<wbr>mailman/listinfo/users</a><br>
<br></blockquote></div><br></div>