On 10/07/2016 08:59 PM, Roman Chukov wrote:
Hello,
I am trying to create a virtual machine from a template using oVirt
API. Somehow like this:
---
def createVM(connection, cluster, vmname, vmtemplate):
try:
param = params.VM( name=vmname, \
cluster=connection.clusters.get(name=cluster), \
template=connection.templates.get(name=vmtemplate), \
use_latest_template_version = True )
except:
print "Could not construct a request to oVirtapi,please check parameters which
were being sent to"
return None
try:
connection.vms.add(param)
except:
print "I was not able to commit my request into oVirt api."
return None
return "OK"
---
Everything is fine when I have only ONE version of a template. But I am
used to create several number of versions for one template because it
is quite flexible. In this case, when I run my script, I receive an
"AmbiguousQueryError" error even if an option
"use_latest_template_version = True" is used.
I revised
file /usr/lib/python2.7/site-packages/ovirtsdk/utils/filterhelper.py
and found near line 30 that this error is raised unquestionably:
--
if len(result) > 1:
raise AmbiguousQueryError(query)
return result[0] if result else None
--
It seems quite strange. Either I do not understand the meaning of
option "use_latest_template_version" or using of this option does not
make sense, I mean query constructed in params.VM() function will not
be passed by filterhelper.py in current implementation.
I made a small patch that allows me to use the latest
version of the template during VM creation:
--
if len(result) > 1 :
result = result[len(result) - 1]
return result
#raise AmbiguousQueryError(query)
return result[0] if result else Nonepython-2.7.5-34.el7.x86_64
--
But I am still not sure that original behaviour of filehelper.py is
unexpectable. I would be very pleasant if you explain me this issue.
My OS is CentOS 7. I use Python python-2.7.5-34.el7.x86_64. Version of
ovirt-engine-sdk is ovirt-engine-sdk-python-3.6.8.0-1.el7.centos.noarch
The reason for this is that you are searching all the templates that
have a given name, and when a template has multiple versions each
version appears, in the API, as a separate template. So you actually
have multiple templates with the same name.
To avoid that, instead using "connection.templates.get(name=...)" you
can use "connection.templates.list(query="name=%s" % ...)". That will
give you all the versions of the template. You can just get the firs,
or, if you need a specific version, then you can look for it explicitly:
template = None
for candidate in connection.templates.list(query="name=mytemplate"):
if candidate.get_version().get_template_name() == 'myversion':
template = candidate
break
Then you can explicitly use that template:
connection.vms.add(
params.VM(
name="newvm",
cluster=params.Cluster(
id="mycluster",
),
template=params.Template(
id=template.get_id(),
),
use_latest_template_version=True,
)
)
Note that it is good practice to always create a new instance of
params.Cluster and params.Template when sending a request like this,
that way you make sure that you are only sending to the server the
required data, in this case the cluster name and the template id. The
way you are doing it now is sending the complete representation of the
cluster and template, which is bad for performance.
However, in your case, as you already know the name and the cluster and
the name of the VM, it is easier to send the request like this, without
searching the cluster or template before:
connect.vms.add(
params.VM(
name="myvm",
cluster=params.Cluster(
name="mycluster",
),
template=params.Template(
name="mytemplate",
),
use_latest_template_version=True,
),
)
I take the opportunity to remind you that you are using version 3 of the
API and version 3 of the API. Those will be retired staring with versoin
4.2 of oVirt. If you are already using version 4.0 or newer of oVirt
consider using versoin 4 of the API and version 4 of the SDK. You have
documentation and examples here:
https://github.com/oVirt/ovirt-engine-sdk/tree/master/sdk
https://github.com/oVirt/ovirt-engine-sdk/tree/master/sdk/examples
--
Dirección Comercial: C/Jose Bardasano Baos, 9, Edif. Gorbea 3, planta
3ºD, 28016 Madrid, Spain
Inscrita en el Reg. Mercantil de Madrid – C.I.F. B82657941 - Red Hat S.L.