From: Zack Cerza Date: Tue, 9 Sep 2025 23:01:50 +0000 (-0600) Subject: openstack: Do not immediately throw ImportError X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=90a4fea78973e8560ed0a245c14621888d93d569;p=teuthology.git openstack: Do not immediately throw ImportError 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 --- diff --git a/teuthology/openstack/__init__.py b/teuthology/openstack/__init__.py index 73f250dfd..54973cfd1 100644 --- a/teuthology/openstack/__init__.py +++ b/teuthology/openstack/__init__.py @@ -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