xref: /aosp_15_r20/external/autotest/site_utils/docker/utils.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright 2021 The Chromium Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Liimport os
6*9c5db199SXin Liimport logging
7*9c5db199SXin Litry:
8*9c5db199SXin Li    import docker
9*9c5db199SXin Liexcept ImportError:
10*9c5db199SXin Li    logging.info("Docker API is not installed in this environment")
11*9c5db199SXin Li
12*9c5db199SXin Lienv_vars = os.environ
13*9c5db199SXin Li
14*9c5db199SXin Li# Default docker socker.
15*9c5db199SXin LiDOCKER_SOCKET = env_vars.get('DOCKER_SOCKET', '/var/run/docker.sock')
16*9c5db199SXin Li
17*9c5db199SXin Li# This the default IP where the docker daemon is running on the Satlab.
18*9c5db199SXin LiDEFAULT_DOCKER_SERVER_IP = '192.168.231.1'
19*9c5db199SXin Li# This the default IP where the docker daemon is listening on the Satlab.
20*9c5db199SXin LiDEFAULT_DOCKER_TCP_SERVER_PORT = '2375'
21*9c5db199SXin Li# Optional docker tcp ip address/port dockerd listens to.
22*9c5db199SXin LiDOCKER_TCP_SERVER_IP = env_vars.get('DOCKER_TCP_SERVER_IP',
23*9c5db199SXin Li                                    DEFAULT_DOCKER_SERVER_IP)
24*9c5db199SXin LiDOCKER_TCP_SERVER_PORT = env_vars.get('DOCKER_TCP_SERVER_PORT',
25*9c5db199SXin Li                                      DEFAULT_DOCKER_TCP_SERVER_PORT)
26*9c5db199SXin Li
27*9c5db199SXin Li
28*9c5db199SXin Lidef get_docker_client(timeout=300):
29*9c5db199SXin Li    """
30*9c5db199SXin Li    Get the client of the host Docker server either via default Docker socket or TCP connection.
31*9c5db199SXin Li    """
32*9c5db199SXin Li    # Use default TCP connection IP to create docker client if docker socket(
33*9c5db199SXin Li    # /var/run/docker.sock) doesn't exists on the machine or when TCP connection IP
34*9c5db199SXin Li    # is not default IP, otherwise use docker socket file to create docker client.
35*9c5db199SXin Li    if os.path.exists(DOCKER_SOCKET
36*9c5db199SXin Li                      ) and DEFAULT_DOCKER_SERVER_IP == DOCKER_TCP_SERVER_IP:
37*9c5db199SXin Li        client = docker.from_env(timeout=timeout)
38*9c5db199SXin Li    else:
39*9c5db199SXin Li        tcp_connection = "tcp://{}:{}".format(DOCKER_TCP_SERVER_IP,
40*9c5db199SXin Li                                              DOCKER_TCP_SERVER_PORT)
41*9c5db199SXin Li        client = docker.DockerClient(base_url=tcp_connection, timeout=timeout)
42*9c5db199SXin Li    return client
43*9c5db199SXin Li
44*9c5db199SXin Li
45*9c5db199SXin Lidef get_running_containers(client=None):
46*9c5db199SXin Li    """
47*9c5db199SXin Li    Return the names of running containers
48*9c5db199SXin Li    """
49*9c5db199SXin Li    if client is None:
50*9c5db199SXin Li        client = get_docker_client()
51*9c5db199SXin Li    containers = client.containers.list()
52*9c5db199SXin Li    return [c.name for c in containers]
53*9c5db199SXin Li
54*9c5db199SXin Li
55*9c5db199SXin Lidef get_container_networks(container_name, client=None):
56*9c5db199SXin Li    """
57*9c5db199SXin Li    Return the list of networks of the container. Return [] if container is not found.
58*9c5db199SXin Li    """
59*9c5db199SXin Li    if client is None:
60*9c5db199SXin Li        client = get_docker_client()
61*9c5db199SXin Li    containers = get_running_containers(client)
62*9c5db199SXin Li    if container_name not in containers:
63*9c5db199SXin Li        return []
64*9c5db199SXin Li    else:
65*9c5db199SXin Li        container = client.containers.get(container_name)
66*9c5db199SXin Li        return container.attrs['NetworkSettings']['Networks'].keys()
67*9c5db199SXin Li
68*9c5db199SXin Li
69*9c5db199SXin Lidef get_container_ip(container_name, client=None):
70*9c5db199SXin Li    """
71*9c5db199SXin Li    Return the IP Address of networks of the container. Return None if container is not found.
72*9c5db199SXin Li    """
73*9c5db199SXin Li    if client is None:
74*9c5db199SXin Li        client = get_docker_client()
75*9c5db199SXin Li    try:
76*9c5db199SXin Li        container = client.containers.get(container_name)
77*9c5db199SXin Li        if container and container.status == 'running':
78*9c5db199SXin Li            container_network = os.environ.get("DOCKER_DEFAULT_NETWORK",
79*9c5db199SXin Li                                               "default_satlab")
80*9c5db199SXin Li            return container.attrs['NetworkSettings']['Networks'][
81*9c5db199SXin Li                    container_network]['IPAddress']
82*9c5db199SXin Li        logging.exception("Servod container %s found but not running",
83*9c5db199SXin Li                          container_name)
84*9c5db199SXin Li    except docker.errors.APIError:
85*9c5db199SXin Li        logging.exception("Failed to access servod container.")
86*9c5db199SXin Li    except docker.errors.NotFound:
87*9c5db199SXin Li        logging.exception("Servod container %s Not Found", container_name)
88*9c5db199SXin Li    return None
89