89 lines
3.3 KiB
Python
89 lines
3.3 KiB
Python
# Copyright 2021 The Chromium Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import os
|
|
import logging
|
|
try:
|
|
import docker
|
|
except ImportError:
|
|
logging.info("Docker API is not installed in this environment")
|
|
|
|
env_vars = os.environ
|
|
|
|
# Default docker socker.
|
|
DOCKER_SOCKET = env_vars.get('DOCKER_SOCKET', '/var/run/docker.sock')
|
|
|
|
# This the default IP where the docker daemon is running on the Satlab.
|
|
DEFAULT_DOCKER_SERVER_IP = '192.168.231.1'
|
|
# This the default IP where the docker daemon is listening on the Satlab.
|
|
DEFAULT_DOCKER_TCP_SERVER_PORT = '2375'
|
|
# Optional docker tcp ip address/port dockerd listens to.
|
|
DOCKER_TCP_SERVER_IP = env_vars.get('DOCKER_TCP_SERVER_IP',
|
|
DEFAULT_DOCKER_SERVER_IP)
|
|
DOCKER_TCP_SERVER_PORT = env_vars.get('DOCKER_TCP_SERVER_PORT',
|
|
DEFAULT_DOCKER_TCP_SERVER_PORT)
|
|
|
|
|
|
def get_docker_client(timeout=300):
|
|
"""
|
|
Get the client of the host Docker server either via default Docker socket or TCP connection.
|
|
"""
|
|
# Use default TCP connection IP to create docker client if docker socket(
|
|
# /var/run/docker.sock) doesn't exists on the machine or when TCP connection IP
|
|
# is not default IP, otherwise use docker socket file to create docker client.
|
|
if os.path.exists(DOCKER_SOCKET
|
|
) and DEFAULT_DOCKER_SERVER_IP == DOCKER_TCP_SERVER_IP:
|
|
client = docker.from_env(timeout=timeout)
|
|
else:
|
|
tcp_connection = "tcp://{}:{}".format(DOCKER_TCP_SERVER_IP,
|
|
DOCKER_TCP_SERVER_PORT)
|
|
client = docker.DockerClient(base_url=tcp_connection, timeout=timeout)
|
|
return client
|
|
|
|
|
|
def get_running_containers(client=None):
|
|
"""
|
|
Return the names of running containers
|
|
"""
|
|
if client is None:
|
|
client = get_docker_client()
|
|
containers = client.containers.list()
|
|
return [c.name for c in containers]
|
|
|
|
|
|
def get_container_networks(container_name, client=None):
|
|
"""
|
|
Return the list of networks of the container. Return [] if container is not found.
|
|
"""
|
|
if client is None:
|
|
client = get_docker_client()
|
|
containers = get_running_containers(client)
|
|
if container_name not in containers:
|
|
return []
|
|
else:
|
|
container = client.containers.get(container_name)
|
|
return container.attrs['NetworkSettings']['Networks'].keys()
|
|
|
|
|
|
def get_container_ip(container_name, client=None):
|
|
"""
|
|
Return the IP Address of networks of the container. Return None if container is not found.
|
|
"""
|
|
if client is None:
|
|
client = get_docker_client()
|
|
try:
|
|
container = client.containers.get(container_name)
|
|
if container and container.status == 'running':
|
|
container_network = os.environ.get("DOCKER_DEFAULT_NETWORK",
|
|
"default_satlab")
|
|
return container.attrs['NetworkSettings']['Networks'][
|
|
container_network]['IPAddress']
|
|
logging.exception("Servod container %s found but not running",
|
|
container_name)
|
|
except docker.errors.APIError:
|
|
logging.exception("Failed to access servod container.")
|
|
except docker.errors.NotFound:
|
|
logging.exception("Servod container %s Not Found", container_name)
|
|
return None
|