f12a282f | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/qemu: Add mypy type annotations
These should all be purely annotations with no changes in behavior at all. You need to be in the python folder, but you should be able to confirm that these an
python/qemu: Add mypy type annotations
These should all be purely annotations with no changes in behavior at all. You need to be in the python folder, but you should be able to confirm that these annotations are correct (or at least self-consistent) by running `mypy --strict qemu`.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-12-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
aad3f3bb | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/qemu: make 'args' style arguments immutable
These arguments don't need to be mutable and aren't really used as such. Clarify their types as immutable and adjust code to match where necessary.
python/qemu: make 'args' style arguments immutable
These arguments don't need to be mutable and aren't really used as such. Clarify their types as immutable and adjust code to match where necessary.
In general, It's probably best not to accept a user-defined mutable object and store it as internal object state unless there's a strong justification for doing so. Instead, try to use generic types as input with empty tuples as the default, and coerce to list where necessary.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20201006235817.3280413-10-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
9223fda4 | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: fix _popen access
As always, Optional[T] causes problems with unchecked access. Add a helper that asserts the pipe is present before we attempt to talk with it.
Signed-off-by: Jo
python/machine.py: fix _popen access
As always, Optional[T] causes problems with unchecked access. Add a helper that asserts the pipe is present before we attempt to talk with it.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-9-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
be1183e5 | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Add _qmp access shim
Like many other Optional[] types, it's not always a given that this object will be set. Wrap it in a type-shim that raises a meaningful error and will always
python/machine.py: Add _qmp access shim
Like many other Optional[] types, it's not always a given that this object will be set. Wrap it in a type-shim that raises a meaningful error and will always return a concrete type.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-8-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
aaa81ec6 | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: use qmp.command
machine.py and qmp.py both do the same thing here; refactor machine.py to use qmp.py's functionality more directly.
Signed-off-by: John Snow <jsnow@redhat.com> Re
python/machine.py: use qmp.command
machine.py and qmp.py both do the same thing here; refactor machine.py to use qmp.py's functionality more directly.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20201006235817.3280413-7-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
1847a4a8 | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Handle None events in events_wait
If the timeout is 0, we can get None back. Handle this explicitly.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@re
python/machine.py: Handle None events in events_wait
If the timeout is 0, we can get None back. Handle this explicitly.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-6-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
652809df | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Don't modify state in _base_args()
Don't append to the _remove_files list during _base_args; instead do so during _launch. Rework _base_args as a @property to help facilitate this
python/machine.py: Don't modify state in _base_args()
Don't append to the _remove_files list during _base_args; instead do so during _launch. Rework _base_args as a @property to help facilitate this impression.
This has the additional benefit of making the type of _console_address easier to analyze statically.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-5-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
c5e61a6d | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: reorder __init__
Put the init arg handling all at the top, and mostly in order (deviating when one is dependent on another), and put what is effectively runtime state declaration
python/machine.py: reorder __init__
Put the init arg handling all at the top, and mostly in order (deviating when one is dependent on another), and put what is effectively runtime state declaration at the bottom.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-4-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
c4e6023f | 06-Oct-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Fix monitor address typing
Prior to this, it's difficult for mypy to intuit what the concrete type of the monitor address is; it has difficulty inferring the type across two varia
python/machine.py: Fix monitor address typing
Prior to this, it's difficult for mypy to intuit what the concrete type of the monitor address is; it has difficulty inferring the type across two variables.
Create _monitor_address as a property that always returns a valid address to simplify static type analysis.
To preserve our ability to clean up, use a simple boolean to indicate whether or not we should try to clean up the sock file after execution.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-3-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
show more ...
|
80ded8e9 | 24-Jul-2020 |
Robert Foley <robert.foley@linaro.org> |
python/qemu: Change ConsoleSocket to optionally drain socket.
The primary purpose of this change is to clean up machine.py's console_socket property to return a single type, a ConsoleSocket.
Consol
python/qemu: Change ConsoleSocket to optionally drain socket.
The primary purpose of this change is to clean up machine.py's console_socket property to return a single type, a ConsoleSocket.
ConsoleSocket now derives from a socket, which means that in the default case (of not draining), machine.py will see the same behavior as it did prior to ConsoleSocket.
Signed-off-by: Robert Foley <robert.foley@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20200717203041.9867-3-robert.foley@linaro.org> Message-Id: <20200724064509.331-16-alex.bennee@linaro.org>
show more ...
|
84dcdf08 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/qmp.py: add QMPProtocolError
In the case that we receive a reply but are unable to understand it, use this exception name to indicate that case.
Signed-off-by: John Snow <jsnow@redhat.com> R
python/qmp.py: add QMPProtocolError
In the case that we receive a reply but are unable to understand it, use this exception name to indicate that case.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20200710052220.3306-7-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
2e2d9305 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/qmp.py: add casts to JSON deserialization
mypy and python type hints are not powerful enough to properly describe JSON messages in Python 3.6. The best we can do, generally, is describe them
python/qmp.py: add casts to JSON deserialization
mypy and python type hints are not powerful enough to properly describe JSON messages in Python 3.6. The best we can do, generally, is describe them as Dict[str, Any].
Add casts to coerce this type for static analysis; but do NOT enforce this type at runtime in any way.
Note: Python 3.8 adds a TypedDict construct which allows for the description of more arbitrary Dictionary shapes. There is a third-party module, "Pydantic", which is compatible with 3.6 that can be used instead of the JSON library that parses JSON messages to fully-typed Python objects, and may be preferable in some cases.
(That is well beyond the scope of this commit or series.)
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20200710052220.3306-6-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
ef5d4744 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/qmp.py: Do not return None from cmd_obj
This makes typing the qmp library difficult, as it necessitates wrapping Optional[] around the type for every return type up the stack. At some point,
python/qmp.py: Do not return None from cmd_obj
This makes typing the qmp library difficult, as it necessitates wrapping Optional[] around the type for every return type up the stack. At some point, it becomes difficult to discern or remember why it's None instead of the expected object.
Use the python exception system to tell us exactly why we didn't get an object. Remove this special-cased return.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20200710052220.3306-5-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
e3a23b48 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/qmp.py: re-absorb MonitorResponseError
When I initially split this out, I considered this more of a machine error than a QMP protocol error, but I think that's misguided.
Move this back to q
python/qmp.py: re-absorb MonitorResponseError
When I initially split this out, I considered this more of a machine error than a QMP protocol error, but I think that's misguided.
Move this back to qmp.py and name it QMPResponseError. Convert qmp.command() to use this exception type.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20200710052220.3306-4-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
a5d76376 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/qmp.py: Define common types
Define some common types that we'll need to annotate a lot of other functions going forward.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <
python/qmp.py: Define common types
Define some common types that we'll need to annotate a lot of other functions going forward.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-Id: <20200710052220.3306-2-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
04f0e36e | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: change default wait timeout to 3 seconds
Machine.wait() does not appear to be used except in the acceptance tests, and an infinite timeout by default in a test suite is not the mo
python/machine.py: change default wait timeout to 3 seconds
Machine.wait() does not appear to be used except in the acceptance tests, and an infinite timeout by default in a test suite is not the most helpful.
Change it to 3 seconds, like the default shutdown timeout.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Cleber Rosa <crosa@redhat.com> Tested-by: Cleber Rosa <crosa@redhat.com> Message-Id: <20200710050649.32434-13-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
de6e08b5 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: re-add sigkill warning suppression
If the user kills QEMU on purpose, we don't need to warn them about that having happened: they know already.
Signed-off-by: John Snow <jsnow@re
python/machine.py: re-add sigkill warning suppression
If the user kills QEMU on purpose, we don't need to warn them about that having happened: they know already.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Cleber Rosa <crosa@redhat.com> Message-Id: <20200710050649.32434-12-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
193bf1c0 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: split shutdown into hard and soft flavors
This is done primarily to avoid the 'bare except' pattern, which suppresses all exceptions during shutdown and can obscure errors.
Repla
python/machine.py: split shutdown into hard and soft flavors
This is done primarily to avoid the 'bare except' pattern, which suppresses all exceptions during shutdown and can obscure errors.
Replace this with a pattern that isolates the different kind of shutdown paradigms (_hard_shutdown and _soft_shutdown), and a new fallback shutdown handler (_do_shutdown) that gracefully attempts one before the other.
This split now also ensures that no matter what happens, _post_shutdown() is always invoked.
shutdown() changes in behavior such that if it attempts to do a graceful shutdown and is unable to, it will now always raise an exception to indicate this. This can be avoided by the test writer in three ways:
1. If the VM is expected to have already exited or is in the process of exiting, wait() can be used instead of shutdown() to clean up resources instead. This helps avoid race conditions in shutdown.
2. If a test writer is expecting graceful shutdown to fail, shutdown should be called in a try...except block.
3. If the test writer has no interest in performing a graceful shutdown at all, kill() can be used instead.
Handling shutdown in this way makes it much more explicit which type of shutdown we want and allows the library to report problems with this process.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Cleber Rosa <crosa@redhat.com> Tested-by: Cleber Rosa <crosa@redhat.com> Message-Id: <20200710050649.32434-11-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
89528059 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Make wait() call shutdown()
At this point, shutdown(has_quit=True) and wait() do essentially the same thing; they perform cleanup without actually instructing QEMU to quit.
Defin
python/machine.py: Make wait() call shutdown()
At this point, shutdown(has_quit=True) and wait() do essentially the same thing; they perform cleanup without actually instructing QEMU to quit.
Define one in terms of the other.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Cleber Rosa <crosa@redhat.com> Tested-by: Cleber Rosa <crosa@redhat.com> Message-Id: <20200710050649.32434-8-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
c9b3045b | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Add a configurable timeout to shutdown()
Three seconds is hardcoded. Use it as a default parameter instead, and use that value for both waits that may occur in the function.
Sign
python/machine.py: Add a configurable timeout to shutdown()
Three seconds is hardcoded. Use it as a default parameter instead, and use that value for both waits that may occur in the function.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Cleber Rosa <crosa@redhat.com> Message-Id: <20200710050649.32434-7-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
a3842cb0 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Prohibit multiple shutdown() calls
If the VM is not launched, don't try to shut it down. As a change, _post_shutdown now unconditionally also calls _early_cleanup in order to offe
python/machine.py: Prohibit multiple shutdown() calls
If the VM is not launched, don't try to shut it down. As a change, _post_shutdown now unconditionally also calls _early_cleanup in order to offer comprehensive object cleanup in failure cases.
As a courtesy, treat it as a NOP instead of rejecting it as an error. This is slightly nicer for acceptance tests where vm.shutdown() is issued unconditionally in tearDown callbacks.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-Id: <20200710050649.32434-6-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|
3a7d64b6 | 10-Jul-2020 |
John Snow <jsnow@redhat.com> |
python/machine.py: Perform early cleanup for wait() calls, too
This is primarily for consistency, and is a step towards wait() and shutdown() sharing the same implementation so that the two cleanup
python/machine.py: Perform early cleanup for wait() calls, too
This is primarily for consistency, and is a step towards wait() and shutdown() sharing the same implementation so that the two cleanup paths cannot diverge.
Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Cleber Rosa <crosa@redhat.com> Tested-by: Cleber Rosa <crosa@redhat.com> Message-Id: <20200710050649.32434-5-jsnow@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
show more ...
|