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