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. > 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. > ----- 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