# Copyright (C) 2018 Red Hat, Inc. # # This work is licensed under the GNU GPLv2 or later. # See the COPYING file in the top-level directory. from virtinst import log from .baseclass import vmmGObject from .connection import vmmConnection class vmmConnectionManager(vmmGObject): """ Tracks the list of connections, emits conn-added and conn-removed """ __gsignals__ = { "conn-added": (vmmGObject.RUN_FIRST, None, [object]), "conn-removed": (vmmGObject.RUN_FIRST, None, [str]), } @classmethod def get_instance(cls, *args, **kwargs): if not cls._instance: cls._instance = vmmConnectionManager(*args, **kwargs) return cls._instance def __init__(self): vmmGObject.__init__(self) self._conns = {} # Load URIs from gsettings for uri in self.config.get_conn_uris(): self.add_conn(uri) def _cleanup(self): for conn in self._conns.values(): uri = conn.get_uri() try: conn.close() self.emit("conn-removed", uri) conn.cleanup() except Exception: # pragma: no cover log.exception("Error cleaning up conn=%s", uri) self._conns = {} @property def conns(self): return self._conns.copy() def add_conn(self, uri): if uri in self._conns: return self._conns[uri] # pragma: no cover conn = vmmConnection(uri) self._conns[uri] = conn self.config.add_conn_uri(uri) self.emit("conn-added", conn) return conn def remove_conn(self, uri): if uri not in self._conns: return # pragma: no cover conn = self._conns.pop(uri) self.config.remove_conn_uri(uri) self.emit("conn-removed", uri) conn.cleanup()