On 04/27/2012 11:30 PM, Juan Hernandez wrote:
On 04/27/2012 05:27 PM, Alex Jia wrote:
Although I haven't try it, I think you're right, I should refresh VM
in loop body.
Let me know what is the result in your environment.
I have tried it and indeed works well for me.
In addition, as I said, it will be convenient if we have wait_for_status
function like before.
I will look into it. I would greatly appreciate if you can open a bug to
request and track it.

It's okay for me, I want to know I need to file a fedora bug? which component?
because I'm doing these on RHEL6.2.
----- Original Message -----
From: "Juan Hernandez"<juan.hernan...@redhat.com>
To: "Alex Jia"<a...@redhat.com>
Cc: users@ovirt.org, "Rita Wu"<r...@redhat.com>
Sent: Friday, April 27, 2012 8:17:05 PM
Subject: Re: [Users] Unable to get latest resource status

On 04/27/2012 12:06 PM, Alex Jia wrote:
On 04/27/2012 04:06 PM, Juan Hernandez wrote:
On 04/26/2012 05:49 PM, Alex Jia wrote:
I built ovirt-engine-sdk rpm based on git repo 
'http://gerrit.ovirt.org/p/ovirt-engine-sdk.git',
then the ovirt-engine-sdk works well for me, I can get resource information 
from Ovirt/RHEVM(3.0)
on the rhel6.2.

The only question is I can't get latest resource status when I changed VM from 
'suspended' to 'up'
status, the api.vms.get(vm_name).status.state is always 'suspended' status, I 
can get a correct
VM status unless I reconnect Ovirt/RHEVM, it's not convenient for users, I 
remember there are reload
and wait_for_status method in old python binding API of RHEV(python-rhev), the 
wait_for_status method
will reload resource then get current resource status, however, I haven't found 
similar method in
ovirt-engine-sdk.
Are you sure you are calling api.vms.get(vm_name) each time? Or are you
doing something like this:

vm = api.vms.get(vm_name)
while vm.status.state == "suspended":
      sleep(10)
Yeah, I put 'api.vms.get(vm_name)' in a loop body like above codes.
If you are doing that the vm information is retrieved only once, not
each time. If this is the case try something like this:

while api.vms.get(VM_NAME).status.state == "suspended":
      sleep(1)

Can you share that snippet of code so that I can try to reproduce it?
Okay, I will list my snippet of code in here, you may replace 'logging'
with 'print' then remove
useless '()' if need. thanks.


<snip>
import time, logging
from ovirtsdk.api import API
from ovirtsdk.xml import params

class RHEV(object):
      """
      RHEV class
      """

      def __init__(self, url, username, password):
          try:
              self.api = API(url, username, password)
          except Exception as e:
              logging.error('could not connect: %s\n' % str(e))
          else:
              logging.info('success: RHEV manager could be reached OK\n')

      def vm_start(self, vm_name):
          try:
              vm = self.api.vms.get(vm_name)
              if vm.status.state != 'up':
                  logging.info('Starting VM')
                  vm.start()
                  logging.info('Waiting for VM to reach Up status')
                  while vm.status.state != 'up':
I think that the problem is with the line above. The VM object that you
get with "self.api.vms.get(vm_name)" is not automatically refreshed, you
have to refresh it before each iteration calling the "api.vms.get(...)"
method again:

   while api.vms.get(vm_name).status.state != 'up':

Can you try that?

                      time.sleep(1)
              else:
                  logging.debug('VM already up')
          except Exception as e:
              logging.error('Failed to start VM:\n%s' % str(e))

      def vm_suspend(self, vm_name):
          vm = self.api.vms.get(vm_name)
          while vm.status.state != 'suspended':
              try:
                  logging.info('Suspend VM')
                  vm.suspend()
                  logging.info('Waiting for VM to reach suspended status')
                  while vm.status.state != 'suspended':
Same here ^.

                      time.sleep(1)

              except Exception as e:
                  if e.reason == 'Bad Request' \
                      and 'asynchronous running tasks' in e.detail:
                      logging.warning('VM has asynchronous running tasks,
trying again')
                      time.sleep(1)
                  else:
                      logging.error('Failed to suspend VM:\n%s' % str(e))
                      break

      def vm_resume(self, vm_name):
          try:
              vm = self.api.vms.get(vm_name)
              if vm.status.state != 'up':
                  logging.info('Resume VM')
                  vm.start()
                  logging.info('Waiting for VM to resume')
                  while vm.status.state != 'up':
Same here ^.

                      time.sleep(1)
              else:
                  logging.debug('VM already up')
          except Exception as e:
              logging.error('Failed to resume VM:\n%s' % str(e))

</snip>


_______________________________________________
Users mailing list
Users@ovirt.org
http://lists.ovirt.org/mailman/listinfo/users

Reply via email to