[Libguestfs] [PATCH] -o rhv-upload: wait for VM creation task

Richard W.M. Jones rjones at redhat.com
Wed Apr 13 17:30:12 UTC 2022


On Tue, Apr 12, 2022 at 08:34:27PM +0200, Tomáš Golembiovský wrote:
> oVirt API call for VM creation finishes before the VM is actually
> created. Entities may be still locked after virt-v2v terminates and if
> user tries to perform (scripted) actions after virt-v2v those operations
> may fail. To prevent this it is useful to monitor the task and wait for
> the completion. This will also help to prevent some corner case
> scenarios (that would be difficult to debug) when the VM creation job
> fails after virt-v2v already termintates with success.
> 
> Thanks: Nir Soffer
> Signed-off-by: Tomáš Golembiovský <tgolembi at redhat.com>
> Reviewed-by: Arik Hadas <ahadas at redhat.com>

It breaks this test:

FAIL: output/test-v2v-python-syntax.sh

  ./rhv-upload-createvm.py:63:19: E127 continuation line over-indented for visual indent

Looking at the code this seems like a possible false alarm, but we do
need to have the test passing, so please check this.

It also breaks:

FAIL: tests/test-v2v-o-rhv-upload.sh

I suspect that the internal test harness needs to be extended to add
this new API (jobs_service?)

Don't forget to put "Fixes: https://bugzilla..." in the description.

Rich.

>  output/rhv-upload-createvm.py | 57 ++++++++++++++++++++++++++++++++++-
>  1 file changed, 56 insertions(+), 1 deletion(-)
> 
> diff --git a/output/rhv-upload-createvm.py b/output/rhv-upload-createvm.py
> index 50bb7e34..c6a6fbd6 100644
> --- a/output/rhv-upload-createvm.py
> +++ b/output/rhv-upload-createvm.py
> @@ -19,12 +19,54 @@
>  import json
>  import logging
>  import sys
> +import time
> +import uuid
>  
>  from urllib.parse import urlparse
>  
>  import ovirtsdk4 as sdk
>  import ovirtsdk4.types as types
>  
> +
> +def debug(s):
> +    if params['verbose']:
> +        print(s, file=sys.stderr)
> +        sys.stderr.flush()
> +
> +
> +def jobs_completed(system_service, correlation_id):
> +    jobs_service = system_service.jobs_service()
> +
> +    try:
> +        jobs = jobs_service.list(
> +            search="correlation_id=%s" % correlation_id)
> +    except sdk.Error as e:
> +        debug(
> +            "Error searching for jobs with correlation id %s: %s" %
> +            (correlation_id, e))
> +        # We dont know, assume that jobs did not complete yet.
> +        return False
> +
> +    # STARTED is the only "in progress" status, other mean the job has
> +    # already terminated
> +    if all(job.status != types.JobStatus.STARTED for job in jobs):
> +        failed_jobs = [(job.description, str(job.status))
> +                       for job in jobs
> +                       if job.status != types.JobStatus.FINISHED]
> +        if failed_jobs:
> +            raise RuntimeError(
> +                "Failed to create a VM! Failed jobs: %r" % failed_jobs)
> +        return True
> +    else:
> +        jobs_status = [(job.description, str(job.status)) for job in jobs]
> +        debug("Some jobs with correlation id %s are running: %s" %
> +                  (correlation_id, jobs_status))
> +        return False
> +
> +
> +# Seconds to wait for the VM import job to complete in oVirt.
> +timeout = 5 * 60
> +
>  # Parameters are passed in via a JSON doc from the OCaml code.
>  # Because this Python code ships embedded inside virt-v2v there
>  # is no formal API here.
> @@ -67,6 +109,7 @@ system_service = connection.system_service()
>  cluster = system_service.clusters_service().cluster_service(params['rhv_cluster_uuid'])
>  cluster = cluster.get()
>  
> +correlation_id = str(uuid.uuid4())
>  vms_service = system_service.vms_service()
>  vm = vms_service.add(
>      types.Vm(
> @@ -77,5 +120,17 @@ vm = vms_service.add(
>                  data=ovf,
>              )
>          )
> -    )
> +    ),
> +    query={'correlation_id': correlation_id},
>  )
> +
> +# Wait for the import job to finish
> +endt = time.time() + timeout
> +while True:
> +    time.sleep(1)
> +    if jobs_completed(system_service, correlation_id):
> +        break
> +    if time.time() > endt:
> +        raise RuntimeError(
> +            "Timed out waiting for VM creation!"
> +            " Jobs still running for correlation id %s" % correlation_id)
> -- 
> 2.35.1
> 
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://listman.redhat.com/mailman/listinfo/libguestfs

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://people.redhat.com/~rjones/virt-top


More information about the Libguestfs mailing list