Message ID | 20190531163202.162543-3-vsementsov@virtuozzo.com |
---|---|
State | New |
Headers | show |
Series | qcow2-bitmaps: rewrite reopening logic | expand |
On 5/31/19 12:31 PM, Vladimir Sementsov-Ogievskiy wrote: > Support several names to wait for, which useful, when we don't sure > which event will we get. For example when mirror fails we get > BLOCK_JOB_COMPLETE otherwise we get BLOCK_JOB_READY (and only then, > after completing block-job we get BLOCK_JOB_COMPLETE). > > Also, add filtered version for convenient use. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> > --- > python/qemu/__init__.py | 9 ++++++--- > tests/qemu-iotests/iotests.py | 5 +++++ > 2 files changed, 11 insertions(+), 3 deletions(-) > > diff --git a/python/qemu/__init__.py b/python/qemu/__init__.py > index 81d9657ec0..5e517025b9 100644 > --- a/python/qemu/__init__.py > +++ b/python/qemu/__init__.py > @@ -402,7 +402,7 @@ class QEMUMachine(object): > self._qmp.clear_events() > return events > > - def event_wait(self, name, timeout=60.0, match=None): > + def event_wait(self, names, timeout=60.0, match=None): > """ > Wait for specified timeout on named event in QMP; optionally filter > results by match. > @@ -412,6 +412,9 @@ class QEMUMachine(object): > {"foo": {"bar": 1}} matches {"foo": None} > {"foo": {"bar": 1}} does not matches {"foo": {"baz": None}} > """ > + if not isinstance(names, list): > + names = [names] > + > def event_match(event, match=None): > if match is None: > return True > @@ -430,14 +433,14 @@ class QEMUMachine(object): > > # Search cached events > for event in self._events: > - if (event['event'] == name) and event_match(event, match): > + if (event['event'] in names) and event_match(event, match): > self._events.remove(event) > return event > > # Poll for new events > while True: > event = self._qmp.pull_event(wait=timeout) > - if (event['event'] == name) and event_match(event, match): > + if (event['event'] in names) and event_match(event, match): > return event > self._events.append(event) > > diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py > index 7bde380d96..4218fc908b 100644 > --- a/tests/qemu-iotests/iotests.py > +++ b/tests/qemu-iotests/iotests.py > @@ -532,6 +532,11 @@ class VM(qtest.QEMUQtestMachine): > log(result, filters, indent=indent) > return result > > + def event_wait_log(self, names, **kwargs): > + event = self.event_wait(names, **kwargs) > + log(event, filters=[filter_qmp_event]) > + return event > + > # Returns None on success, and an error string on failure > def run_job(self, job, auto_finalize=True, auto_dismiss=False): > error = None > There's something like this in the queue; see: [Qemu-devel] [PATCH v3 3/5] QEMUMachine: add events_wait method. Though yours is a lot shorter, actually, because I made separate event_wait and events_wait calls instead of just throwing non-iterables in a list. --js
01.06.2019 2:33, John Snow wrote: > > > On 5/31/19 12:31 PM, Vladimir Sementsov-Ogievskiy wrote: >> Support several names to wait for, which useful, when we don't sure >> which event will we get. For example when mirror fails we get >> BLOCK_JOB_COMPLETE otherwise we get BLOCK_JOB_READY (and only then, >> after completing block-job we get BLOCK_JOB_COMPLETE). >> >> Also, add filtered version for convenient use. >> >> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> >> --- >> python/qemu/__init__.py | 9 ++++++--- >> tests/qemu-iotests/iotests.py | 5 +++++ >> 2 files changed, 11 insertions(+), 3 deletions(-) >> >> diff --git a/python/qemu/__init__.py b/python/qemu/__init__.py >> index 81d9657ec0..5e517025b9 100644 >> --- a/python/qemu/__init__.py >> +++ b/python/qemu/__init__.py >> @@ -402,7 +402,7 @@ class QEMUMachine(object): >> self._qmp.clear_events() >> return events >> >> - def event_wait(self, name, timeout=60.0, match=None): >> + def event_wait(self, names, timeout=60.0, match=None): >> """ >> Wait for specified timeout on named event in QMP; optionally filter >> results by match. >> @@ -412,6 +412,9 @@ class QEMUMachine(object): >> {"foo": {"bar": 1}} matches {"foo": None} >> {"foo": {"bar": 1}} does not matches {"foo": {"baz": None}} >> """ >> + if not isinstance(names, list): >> + names = [names] >> + >> def event_match(event, match=None): >> if match is None: >> return True >> @@ -430,14 +433,14 @@ class QEMUMachine(object): >> >> # Search cached events >> for event in self._events: >> - if (event['event'] == name) and event_match(event, match): >> + if (event['event'] in names) and event_match(event, match): >> self._events.remove(event) >> return event >> >> # Poll for new events >> while True: >> event = self._qmp.pull_event(wait=timeout) >> - if (event['event'] == name) and event_match(event, match): >> + if (event['event'] in names) and event_match(event, match): >> return event >> self._events.append(event) >> >> diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py >> index 7bde380d96..4218fc908b 100644 >> --- a/tests/qemu-iotests/iotests.py >> +++ b/tests/qemu-iotests/iotests.py >> @@ -532,6 +532,11 @@ class VM(qtest.QEMUQtestMachine): >> log(result, filters, indent=indent) >> return result >> >> + def event_wait_log(self, names, **kwargs): >> + event = self.event_wait(names, **kwargs) >> + log(event, filters=[filter_qmp_event]) >> + return event >> + >> # Returns None on success, and an error string on failure >> def run_job(self, job, auto_finalize=True, auto_dismiss=False): >> error = None >> > > There's something like this in the queue; see: > [Qemu-devel] [PATCH v3 3/5] QEMUMachine: add events_wait method. > > Though yours is a lot shorter, actually, because I made separate > event_wait and events_wait calls instead of just throwing non-iterables > in a list. Hmm, it's already staged by Max. Ok, I'll rebase on it.
diff --git a/python/qemu/__init__.py b/python/qemu/__init__.py index 81d9657ec0..5e517025b9 100644 --- a/python/qemu/__init__.py +++ b/python/qemu/__init__.py @@ -402,7 +402,7 @@ class QEMUMachine(object): self._qmp.clear_events() return events - def event_wait(self, name, timeout=60.0, match=None): + def event_wait(self, names, timeout=60.0, match=None): """ Wait for specified timeout on named event in QMP; optionally filter results by match. @@ -412,6 +412,9 @@ class QEMUMachine(object): {"foo": {"bar": 1}} matches {"foo": None} {"foo": {"bar": 1}} does not matches {"foo": {"baz": None}} """ + if not isinstance(names, list): + names = [names] + def event_match(event, match=None): if match is None: return True @@ -430,14 +433,14 @@ class QEMUMachine(object): # Search cached events for event in self._events: - if (event['event'] == name) and event_match(event, match): + if (event['event'] in names) and event_match(event, match): self._events.remove(event) return event # Poll for new events while True: event = self._qmp.pull_event(wait=timeout) - if (event['event'] == name) and event_match(event, match): + if (event['event'] in names) and event_match(event, match): return event self._events.append(event) diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py index 7bde380d96..4218fc908b 100644 --- a/tests/qemu-iotests/iotests.py +++ b/tests/qemu-iotests/iotests.py @@ -532,6 +532,11 @@ class VM(qtest.QEMUQtestMachine): log(result, filters, indent=indent) return result + def event_wait_log(self, names, **kwargs): + event = self.event_wait(names, **kwargs) + log(event, filters=[filter_qmp_event]) + return event + # Returns None on success, and an error string on failure def run_job(self, job, auto_finalize=True, auto_dismiss=False): error = None
Support several names to wait for, which useful, when we don't sure which event will we get. For example when mirror fails we get BLOCK_JOB_COMPLETE otherwise we get BLOCK_JOB_READY (and only then, after completing block-job we get BLOCK_JOB_COMPLETE). Also, add filtered version for convenient use. Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com> --- python/qemu/__init__.py | 9 ++++++--- tests/qemu-iotests/iotests.py | 5 +++++ 2 files changed, 11 insertions(+), 3 deletions(-)