[ovirt-users] create a cloned virtual machine based on a template with SDK API python

Nicolas Vaye nicolas.vaye at province-sud.nc
Thu Mar 22 07:09:33 UTC 2018


Hi,

I want to create a cloned virtual machine based on a template with SDK API python and i don't find the parameter to indicate the clone action for the disk

here is my code :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Copyright (c) 2016 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
from pprint import pprint
import logging
import time

import ovirtsdk4 as sdk
import ovirtsdk4.types as types



template_name='test_debian_9.4'
template_version=1
cluster_name='nico-cluster'
data_domain_name='OVIRT-TEST2'



logging.basicConfig(level=logging.DEBUG, filename='example.log')

# This example will connect to the server and start a virtual machine
# with cloud-init, in order to automatically configure the network and
# the password of the `root` user.

# Create the connection to the server:
connection = sdk.Connection(
    url='https://ocenter.province-sud.prod/ovirt-engine/api',
    username='admin at internal<mailto:username='admin at internal>',
    password='admin',
    ca_file='CA_ocenter.pem',
    debug=True,
    log=logging.getLogger(),
)



##################################
############ TEMPLATE ############
##################################

# Get the reference to the root of the tree of services:
system_service = connection.system_service()

# Get the reference to the service that manages the storage domains:
storage_domains_service = system_service.storage_domains_service()

# Find the storage domain we want to be used for virtual machine disks:
storage_domain = storage_domains_service.list(search='name='+data_domain_name)[0]


# Get the reference to the service that manages the templates:
templates_service = system_service.templates_service()

# When a template has multiple versions they all have the same name, so
# we need to explicitly find the one that has the version name or
# version number that we want to use. In this case we want to use
# version 1 of the template.
templates = templates_service.list(search='name='+template_name)
template_id = None
for template in templates:
    if template.version.version_number == template_version:
        template_id = template.id
        break

if template_id == None:
    print "ERREUR le template "+template_name+"en version "+str(template_version)+" n'a pas été trouvé!!"

# Find the template disk we want be created on specific storage domain
# for our virtual machine:
template_service = templates_service.template_service(template_id)
disk_attachments = connection.follow_link(template_service.get().disk_attachments)

print "disk_attachments=" + str(len(disk_attachments))

template_disk_attachments = []
for disk in disk_attachments:
    template_disk_attachments.append(types.DiskAttachment(
                disk=types.Disk(
                    id=disk.id,
                    format=types.DiskFormat.COW,
                    storage_domains=[
                        types.StorageDomain(
                            id=storage_domain.id,
                        ),
                    ],
                ),
            )
    )



# Get the reference to the service that manages the virtual machines:
vms_service = system_service.vms_service()

# Add a new virtual machine explicitly indicating the identifier of the
# template version that we want to use and indicating that template disk
# should be created on specific storage domain for the virtual machine:
vm = vms_service.add(
    types.Vm(
        name='myvm',
        cluster=types.Cluster(
            name=cluster_name
        ),
        stateless=False,
        type=types.VmType('server'),
        comment='based on template '+template_name+'en version '+str(template_version),
        template=types.Template(
            id=template_id
        ),
        disk_attachments=template_disk_attachments,
    )
)



# Get a reference to the service that manages the virtual machine that
# was created in the previous step:
vm_service = vms_service.vm_service(vm.id)

# Wait till the virtual machine is down, which indicats that all the
# disks have been created:
while True:
    time.sleep(1)
    vm = vm_service.get()
    if vm.status == types.VmStatus.DOWN:
        break


# Close the connection to the server:
connection.close()




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.

If the data_domain_name is NOT the same as the template data domain, then this script produce an error
ovirtsdk4.Error: Fault reason is "Operation Failed". Fault detail is "[Cannot add VM. The selected Storage Domain does not contain the VM Template.]". HTTP response code is 400.

So how to create a cloned virtual machine based on a template ?

I think i'm looking for the same parameter on the web ui, "Storage Allocation" => Thin/Clone

[cid:1521702568.14216.1.camel at province-sud.nc]


Thanks.

Nicolas VAYE

-------------- next part --------------
A non-text attachment was scrubbed...
Name: unknown-L44QGZ
Type: image/png
Size: 75487 bytes
Desc: unknown-L44QGZ
URL: <http://lists.ovirt.org/pipermail/users/attachments/20180322/71b082e1/attachment.png>


More information about the Users mailing list