components/openstack/nova/files/solariszones/driver.py
changeset 5610 3fd0658e8699
parent 5609 318813fd0ac2
child 5640 47302747b363
--- 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 "