2023-07-22 23:59:49 +03:00
|
|
|
from pathlib import Path
|
|
|
|
from contextlib import AbstractContextManager
|
|
|
|
|
2023-06-17 20:07:50 +03:00
|
|
|
import libvirt
|
|
|
|
|
2023-07-22 23:59:49 +03:00
|
|
|
from .config import ConfigLoader
|
2023-07-29 15:35:36 +03:00
|
|
|
|
|
|
|
|
|
|
|
class LibvirtSessionError(Exception):
|
|
|
|
"""Something went wrong while connecting to libvirt."""
|
2023-07-22 23:59:49 +03:00
|
|
|
|
|
|
|
|
|
|
|
class LibvirtSession(AbstractContextManager):
|
|
|
|
def __init__(self, config: Path | None = None):
|
|
|
|
self.config = ConfigLoader(config)
|
|
|
|
self.session = self._connect(self.config['libvirt']['uri'])
|
|
|
|
|
|
|
|
def __enter__(self):
|
|
|
|
return self
|
|
|
|
|
|
|
|
def __exit__(self, exception_type, exception_value, exception_traceback):
|
|
|
|
self.close()
|
2023-06-17 20:07:50 +03:00
|
|
|
|
2023-07-22 23:59:49 +03:00
|
|
|
def _connect(self, connection_uri: str):
|
|
|
|
try:
|
|
|
|
return libvirt.open(connection_uri)
|
|
|
|
except libvirt.libvirtError as err:
|
|
|
|
raise LibvirtSessionError(
|
2023-07-28 01:01:32 +03:00
|
|
|
f'Failed to open connection to the hypervisor: {err}'
|
|
|
|
) from err
|
2023-06-17 20:07:50 +03:00
|
|
|
|
2023-07-22 23:59:49 +03:00
|
|
|
def close(self) -> None:
|
|
|
|
self.session.close()
|