[Users] Unable to get latest resource status
Itamar Heim
iheim at redhat.com
Sat Apr 28 17:29:45 UTC 2012
On 04/28/2012 06:19 AM, Alex Jia wrote:
> 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.
ovirt-engine-sdk under
https://bugzilla.redhat.com/enter_bug.cgi?product=oVirt
>>> ----- Original Message -----
>>> From: "Juan Hernandez"<juan.hernandez at redhat.com>
>>> To: "Alex Jia"<ajia at redhat.com>
>>> Cc: users at ovirt.org, "Rita Wu"<rwu at 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 at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/users
More information about the Users
mailing list