]> git-server-git.apps.pok.os.sepia.ceph.com Git - teuthology.git/commitdiff
openstack: Do not immediately throw ImportError
authorZack Cerza <zack@cerza.org>
Tue, 9 Sep 2025 23:01:50 +0000 (17:01 -0600)
committerZack Cerza <zack@cerza.org>
Mon, 15 Sep 2025 17:58:52 +0000 (11:58 -0600)
We would rather not have openstacksdk be a requirement for all installs, since
most do not use it. This change will not disturb people who install the
openstack extra, which pulls in that and other packages.

Signed-off-by: Zack Cerza <zack@cerza.org>
teuthology/openstack/__init__.py

index 73f250dfdd4a29b45dacd3036153fe2af26d85ab..54973cfd1d5d66d39934d09ec0263ea5b2ff2404 100644 (file)
@@ -31,6 +31,7 @@ import os
 import paramiko
 import re
 import socket
+import sys
 import subprocess
 import tempfile
 import teuthology
@@ -45,10 +46,14 @@ from teuthology.config import config as teuth_config
 from teuthology.config import set_config_attr
 from teuthology.orchestra import connection
 from teuthology import misc
-from openstack import connection as openstack_connection
 
 from yaml.representer import SafeRepresenter
 
+try:
+    from openstack import connection as openstack_connection
+except ImportError:
+    openstack_connection = None
+
 class cmd_str(str): pass
 
 def cmd_repr(dumper, data):
@@ -72,14 +77,22 @@ def enforce_json_dictionary(something):
             ' you are encouraged to add a comment if you want it to be'
             ' fixed.')
 
-class OpenStackInstance(object):
+def create_connection():
+    if openstack_connection is None:
+        raise RuntimeError(
+            "Did not find required openstack dependencies. "
+            f"Try: {sys.executable} -m pip install -e .[openstack]"
+        )
+    return openstack_connection.from_config(cloud=None)
+
 
+class OpenStackInstance(object):
     def __init__(self, name_or_id, info=None):
         self.name_or_id = name_or_id
         self.private_or_floating_ip = None
         self.private_ip = None
         self.info = info
-        self.conn = self._create_connection()
+        self.conn = create_connection()
         if info is None:
             self.set_info()
         else:
@@ -90,9 +103,6 @@ class OpenStackInstance(object):
                 errmsg = '{}: {}'.format(errmsg, self.info['message'])
             raise Exception(errmsg)
 
-    def _create_connection(self):
-        return openstack_connection.from_config(cloud=None)
-
     def set_info(self):
         try:
             server = self.conn.compute.find_server(self.name_or_id)
@@ -229,15 +239,12 @@ class OpenStack(object):
         self.username = 'ubuntu'
         self.up_string = "UNKNOWN"
         self.teuthology_suite = 'teuthology-suite'
-        self.conn = self._create_connection()
+        self.conn = create_connection()
 
     token = None
     token_expires = None
     token_cache_duration = 3600
 
-    def _create_connection(self):
-        return openstack_connection.from_config(cloud=None)
-
     def cache_token(self):
         if self.provider != 'ovh':
             return False