diff -r 318813fd0ac2 -r 3fd0658e8699 components/openstack/nova/files/solariszones/driver.py --- a/components/openstack/nova/files/solariszones/driver.py Tue Mar 15 16:10:03 2016 -0600 +++ b/components/openstack/nova/files/solariszones/driver.py Tue Mar 15 16:11:52 2016 -0600 @@ -456,6 +456,7 @@ def __init__(self, virtapi): self.virtapi = virtapi + self._archive_manager = None self._compute_event_callback = None self._conductor_api = conductor.API() self._fc_hbas = None @@ -464,12 +465,14 @@ self._host_stats = {} self._initiator = None self._install_engine = None + self._kstat_control = None self._pagesize = os.sysconf('SC_PAGESIZE') self._rad_connection = None + self._rootzpool_suffix = ROOTZPOOL_RESOURCE self._uname = os.uname() self._validated_archives = list() self._volume_api = SolarisVolumeAPI() - self._rootzpool_suffix = ROOTZPOOL_RESOURCE + self._zone_manager = None @property def rad_connection(self): @@ -484,27 +487,51 @@ return self._rad_connection - def _init_rad(self): - """Obtain required RAD objects for Solaris Zones, kernel statistics, - and Unified Archive management. - """ + @property + def zone_manager(self): try: - self._zone_manager = self.rad_connection.get_object( - zonemgr.ZoneManager()) - self._kstat_control = self.rad_connection.get_object( - kstat.Control()) - self._archive_manager = self.rad_connection.get_object( - archivemgr.ArchiveManager()) + if (self._zone_manager is None or + self._zone_manager._conn._closed is not None): + self._zone_manager = self.rad_connection.get_object( + zonemgr.ZoneManager()) except Exception as ex: reason = _("Unable to obtain RAD object: %s") % ex raise exception.NovaException(reason) + return self._zone_manager + + @property + def kstat_control(self): + try: + if (self._kstat_control is None or + self._kstat_control._conn._closed is not None): + self._kstat_control = self.rad_connection.get_object( + kstat.Control()) + except Exception as ex: + reason = _("Unable to obtain RAD object: %s") % ex + raise exception.NovaException(reason) + + return self._kstat_control + + @property + def archive_manager(self): + try: + if (self._archive_manager is None or + self._archive_manager._conn._closed is not None): + self._archive_manager = self.rad_connection.get_object( + archivemgr.ArchiveManager()) + except Exception as ex: + reason = _("Unable to obtain RAD object: %s") % ex + raise exception.NovaException(reason) + + return self._archive_manager + def init_host(self, host): """Initialize anything that is necessary for the driver to function, including catching up with currently running VM's on the given host. """ # TODO(Vek): Need to pass context in for access to auth_token - self._init_rad() + pass def cleanup_host(self, host): """Clean up anything that is necessary for the driver gracefully stop, @@ -677,7 +704,7 @@ 'name': name } try: - self._kstat_control.update() + self.kstat_control.update() kstat_object = self.rad_connection.get_object( kstat.Kstat(), rad.client.ADRGlobPattern(pattern)) except Exception as reason: @@ -979,7 +1006,7 @@ return try: - ua = self._archive_manager.getArchive(image) + ua = self.archive_manager.getArchive(image) except Exception as ex: if isinstance(ex, rad.client.ObjectError): reason = ex.get_payload().info @@ -1473,7 +1500,7 @@ LOG.debug(_("Creating zone configuration for '%s' (%s)") % (name, instance['display_name'])) try: - self._zone_manager.create(name, None, template) + self.zone_manager.create(name, None, template) self._set_global_properties(name, extra_specs, brand) if connection_info is not None: self._set_boot_device(name, connection_info, brand) @@ -1735,7 +1762,7 @@ raise exception.InstanceNotFound(instance_id=name) try: - self._zone_manager.delete(name) + self.zone_manager.delete(name) except Exception as ex: reason = zonemgr_strerror(ex) LOG.error(_("Unable to delete configuration for instance '%s' via "