[ovirt-users] API Importing a VM from an export domain fails

Tim Bielawa tbielawa at redhat.com
Wed Jan 13 16:54:38 UTC 2016


On Wed, Jan 13, 2016 at 5:01 AM, Juan Hernández <jhernand at redhat.com> wrote:

> On 01/12/2016 08:44 PM, Tim Bielawa wrote:
> > Hello virt folks,
> >
> > Background:
> >
> > I'm using the REST API to import a VM from an attached export domain.
> > The VM was imported using the virt-v2v tool. I've tried this with cURL
> > and with the python SDK, both yield the same error message.
> >
> > RHEVM Version: 3.5.6.0-1
> > Python SDK Version: 3.5.6.0-1
> >
> > According to the documentation, importing should follow this syntax:
> >
> >> POST
> > /ovirt-engine/api/storagedomains/{storagedomain:id}/vms/{vm:id}/import
> >
> > With a small <action> body attached. In theory (by the documentation and
> > bug tracker [1]) either of these XML documents (both in the same paste)
> > should work:
> >
> > http://fpaste.org/309944/52627148/
> >
> > However, this fails with the following error message (full response in
> [2])
> >
> >> Cannot import VM. Storage Domain type not specified.
> >
> >
> > Steps to reproduce:
> >
> > 1. Import a VM into an export storage domain
> > 2. Create an XML document with an action like this (filling in the
> > correct values for the ID variables)
> >
> >     <action>
> >       <cluster id="<CLUSTER_ID>"/>
> >       <storage_domain id="<STORAGE_DOMAIN_ID>">
> >         <type>export</type>
> >       </storage_domain>
> >       <clone>True</clone>
> >       <vm>
> >         <name>IMPORTED_VM</name>
> >       </vm>
> >     </action>
> >
> >
> > 3. POST to the import location (again, substitute the correct ID
> > variables in the location)
> >
> >
>  /ovirt-engine/api/storagedomains/<STORAGE_DOMAIN_ID>/vms/<VM_ID>/import
> >
> >
> >
> > Where is this storage domain type supposed to be defined, if not inside
> > of the storage_domain element as demonstrated in the documentation?
> >
> > I would appreciate any advice you can offer or pointers to useful
> > resources/documentation.
> >
> > Thanks!
> >
> >
> > [1] https://bugzilla.redhat.com/show_bug.cgi?id=1147011#c13
> > [2] http://fpaste.org/309949/14526274/
> >
> > --
> > Tim Bielawa
> > 1BA0 4FAB 4C13 FBA0 A036  4958 AD05 E75E 0333 AE37
> >
>
> The bug that you are referring to (bug 1147011) isn't fixed in version
> 3.5, and there are no plans to fix it, as far as I know. It will be
> fixed on only in 3.6. This means that you have to apply the workaround
> that Sven Kieske mentions in the description of the bug. So the XML
> document to send should look like this:
>
>   <action>
>     <cluster id="00000001-0001-0001-0001-000000000001"/>
>     <storage_domain id="00000001-0001-0001-0001-000000000002"/>
>     <clone>true</clone>
>     <vm>
>       <name>TBIELAWA_IMPORTED_VM</name>
>
>       <!-- Note that this "snapshot" element is needed to avoid
>            the bug, even if the VM doesn't have any snapshot. -->
>       <snapshots>
>         <collapse_snapshots>true</collapse_snapshots>
>       </snapshots>
>
>     </vm>
>   </action>
>
> With the Python SDK should be something like this:
>
>   # Find the target cluster and storage domain:
>   target_cluster_id = api.clusters.get(name="mycluster").get_id()
>   target_sd_id = api.storagedomains.get(name="mydata").get_id()
>
>   # Find the export storage domain:
>   export_sd = api.storagedomains.get(name="myexport")
>
>   # Find the VM:
>   vm = export_sd.vms.get(name="myvm")
>
>   # Import the VM:
>   vm.import_vm(
>       params.Action(
>           cluster=params.Cluster(id=target_cluster_id),
>           storage_domain=params.StorageDomain(id=target_sd_id),
>           clone=True,
>           vm=params.VM(
>               name="TBIELAWA_IMPORTED_VM",
>               snapshots=params.Snapshots(
>                   collapse_snapshots=True
>               )
>           )
>       )
>   )
>
> --
> 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.
>


Thanks for the tips Juan, I appreciate the response.

I didn't understand how that work-around was supposed to work the first
time I read that in the BZ, thanks for clarifying with those examples.

Unfortunately though, I've integrated what you offered into my script and
am still running into walls. I found the ParseHelper.toXml function and
used that to debug what the params.Action is evaluating to before calling
the import_vm() method on the target import VM:

> <action>
>     <storage_domain id="27b5c6eb-ae68-4e85-930d-01bba13c07fc"/>
>     <cluster id="00000001-0001-0001-0001-000000000159"/>
>     <vm>
>         <name>vm.example.com</name>
>         <snapshots>
>             <collapse_snapshots>true</collapse_snapshots>
>         </snapshots>
>     </vm>
 >    <clone>true</clone>
> </action>

It's basically identical to what you offered in your example. Yet still, I
run into this problem:

Traceback (most recent call last):
>   File "./rhev-test.py", line 300, in <module>
>     result = latest_image.import_vm(import_params)
>   File
> "/usr/lib/python2.7/site-packages/ovirtsdk/infrastructure/brokers.py", line
> 18763, in import_vm
>     headers={"Correlation-Id":correlation_id}
>   File
> "/usr/lib/python2.7/site-packages/ovirtsdk/infrastructure/proxy.py", line
> 118, in request
>     persistent_auth=self._persistent_auth)
>   File
> "/usr/lib/python2.7/site-packages/ovirtsdk/infrastructure/proxy.py", line
> 146, in __doRequest
>     persistent_auth=persistent_auth
>   File "/usr/lib/python2.7/site-packages/ovirtsdk/web/connection.py", line
> 134, in doRequest
>     raise RequestError, response
> ovirtsdk.infrastructure.errors.RequestError:
> status: 400
> reason: Bad Request
> detail: Cannot import VM. Storage Domain type not specified.



Just to be absolutely sure about this, I ran some tests using the API and
cURL. Two tests, first without a <type> element in the storage domain,
second test with a <type> in the storage domain.

First test failed, same error message:

$ cat import-params.xml
> <action>
>     <storage_domain id="27b5c6eb-ae68-4e85-930d-01bba13c07fc"/>
>     <cluster id="00000001-0001-0001-0001-000000000159"/>
>     <vm>
>         <name>vm.example.com</name>
>         <snapshots>
>             <collapse_snapshots>true</collapse_snapshots>
>         </snapshots>
>     </vm>
>     <clone>true</clone>
> </action>
>
> $ curl -X POST -H "Accept: application/xml" -H "Content-type:
> application/xml" -u tbielawa at redhat.com --cacert /home/....crt -d
> @import-params.xml https://
> ...:443/ovirt-engine/api/storagedomains/27b5c6eb-ae68-4e85-930d-01bba13c07fc/vms/69902f78-7dbf-45cb-a264-f29edb8e7f0a/import
> Enter host password for user 'tbielawa at redhat.com':
> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
> <action>
>     <storage_domain id="27b5c6eb-ae68-4e85-930d-01bba13c07fc"/>
>     <cluster id="00000001-0001-0001-0001-000000000159"/>
>     <vm>
>         <name>vm.example.com</name>
>         <snapshots>
>             <collapse_snapshots>true</collapse_snapshots>
>         </snapshots>
>     </vm>
>     <clone>true</clone>
>     <status>
>         <state>failed</state>
>     </status>
>     <fault>
>         <reason>Operation Failed</reason>
>         <detail>[Cannot import VM. Storage Domain type not
> specified.]</detail>
>     </fault>
> </action>



Second test with the <type> set failed as well:

$ cat import-params.xml
> <action>
>     <storage_domain id="27b5c6eb-ae68-4e85-930d-01bba13c07fc">
>         <type>export</type>
>     </storage_domain>
>     <cluster id="00000001-0001-0001-0001-000000000159"/>
>     <vm>
>         <name>vm.example.com</name>
>         <snapshots>
>             <collapse_snapshots>true</collapse_snapshots>
>         </snapshots>
>     </vm>
>     <clone>true</clone>
> </action>
>


$ curl -X POST -H "Accept: application/xml" -H "Content-type:
> application/xml" -u tbielawa at redhat.com --cacert /home/....crt -d
> @import-params.xml https://
> ...:443/ovirt-engine/api/storagedomains/27b5c6eb-ae68-4e85-930d-01bba13c07fc/vms/69902f78-7dbf-45cb-a264-f29edb8e7f0a/import
> Enter host password for user 'tbielawa at redhat.com':
> <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
> <action>
>     <storage_domain id="27b5c6eb-ae68-4e85-930d-01bba13c07fc">
>         <type>export</type>
>     </storage_domain>
>     <cluster id="00000001-0001-0001-0001-000000000159"/>
>     <vm>
>         <name>vm.example.com</name>
>         <snapshots>
>             <collapse_snapshots>true</collapse_snapshots>
>         </snapshots>
>     </vm>
>     <clone>true</clone>
>     <status>
>         <state>failed</state>
>     </status>
>     <fault>
>         <reason>Operation Failed</reason>
>         <detail>[Cannot import VM. Storage Domain type not
> specified.]</detail>
>     </fault>
> </action>



I'm stumped. Any other ideas?

-- 
Tim Bielawa, Sr. ${::title}
Cell: 919.332.6411  | IRC: tbielawa (#platops)
1BA0 4FAB 4C13 FBA0 A036  4958 AD05 E75E 0333 AE37
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ovirt.org/pipermail/users/attachments/20160113/8270f796/attachment-0001.html>


More information about the Users mailing list