mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
Handle missing docker-py better (#27540)
* Update docker inventory to use APIClient docker-py has been updated, and the `Client` class no longer exists. We use the new `APIClient` class. To provide graceful failure when docker-py is not installed, we need to create a dummy `Client` class so that the inventory script will get as far as displaying a useful error message Before ``` $ contrib/inventory/docker.py --pretty Traceback (most recent call last): File "contrib/inventory/docker.py", line 418, in <module> class AnsibleDockerClient(Client): NameError: name 'Client' is not defined ``` After ``` $ contrib/inventory/docker.py --pretty Failed to import docker-py. Try `pip install docker-py` - cannot import name Client ``` * docker inventory configuration file location Allow docker.yml to live next to docker.py, as well as in the current directory
This commit is contained in:
parent
0c291ece1a
commit
f9a179f770
1 changed files with 18 additions and 2 deletions
|
@ -371,7 +371,6 @@ HAS_DOCKER_PY = True
|
||||||
HAS_DOCKER_ERROR = False
|
HAS_DOCKER_ERROR = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from docker import Client
|
|
||||||
from docker.errors import APIError, TLSParameterError
|
from docker.errors import APIError, TLSParameterError
|
||||||
from docker.tls import TLSConfig
|
from docker.tls import TLSConfig
|
||||||
from docker.constants import DEFAULT_TIMEOUT_SECONDS, DEFAULT_DOCKER_API_VERSION
|
from docker.constants import DEFAULT_TIMEOUT_SECONDS, DEFAULT_DOCKER_API_VERSION
|
||||||
|
@ -379,6 +378,19 @@ except ImportError as exc:
|
||||||
HAS_DOCKER_ERROR = str(exc)
|
HAS_DOCKER_ERROR = str(exc)
|
||||||
HAS_DOCKER_PY = False
|
HAS_DOCKER_PY = False
|
||||||
|
|
||||||
|
# Client has recently been split into DockerClient and APIClient
|
||||||
|
try:
|
||||||
|
from docker import Client
|
||||||
|
except ImportError as exc:
|
||||||
|
try:
|
||||||
|
from docker import APIClient as Client
|
||||||
|
except ImportError as exc:
|
||||||
|
HAS_DOCKER_ERROR = str(exc)
|
||||||
|
HAS_DOCKER_PY = False
|
||||||
|
|
||||||
|
class Client:
|
||||||
|
pass
|
||||||
|
|
||||||
DEFAULT_DOCKER_HOST = 'unix://var/run/docker.sock'
|
DEFAULT_DOCKER_HOST = 'unix://var/run/docker.sock'
|
||||||
DEFAULT_TLS = False
|
DEFAULT_TLS = False
|
||||||
DEFAULT_TLS_VERIFY = False
|
DEFAULT_TLS_VERIFY = False
|
||||||
|
@ -779,6 +791,10 @@ class DockerInventory(object):
|
||||||
if config_path:
|
if config_path:
|
||||||
try:
|
try:
|
||||||
config_file = os.path.abspath(config_path)
|
config_file = os.path.abspath(config_path)
|
||||||
|
# default config path is docker.yml in same directory as this script
|
||||||
|
# old behaviour is docker.yml in current directory. Handle both.
|
||||||
|
if not os.path.exists(config_file):
|
||||||
|
config_file = os.path.abspath(os.path.basename(config_path))
|
||||||
except:
|
except:
|
||||||
config_file = None
|
config_file = None
|
||||||
|
|
||||||
|
@ -813,7 +829,7 @@ class DockerInventory(object):
|
||||||
# Parse command line arguments
|
# Parse command line arguments
|
||||||
|
|
||||||
basename = os.path.splitext(os.path.basename(__file__))[0]
|
basename = os.path.splitext(os.path.basename(__file__))[0]
|
||||||
default_config = basename + '.yml'
|
default_config = os.path.join(os.path.dirname(__file__), basename + '.yml')
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description='Return Ansible inventory for one or more Docker hosts.')
|
description='Return Ansible inventory for one or more Docker hosts.')
|
||||||
|
|
Loading…
Reference in a new issue