Bug fix in CI
[bottlenecks.git] / utils / infra_setup / runner / docker_env.py
1 #!/usr/bin/env python
2 ##############################################################################
3 # Copyright (c) 2017 Huawei Technologies Co.,Ltd and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
10 '''This file contain some function about docker API.
11 At present, This file contain the following function:
12 1.Ask Docker service to create a docker(yardstick or ELK).
13 2.get a docker ip.
14 3.Remove a docker.'''
15
16 import docker
17 import os
18 import socket
19
20 yardstick_info = {}
21 ELK_info = {}
22
23
24 def get_client():
25     client = docker.from_env()
26     return client
27
28
29 def docker_find(docker_name):
30     client = get_client()
31     docker_client = client.containers.get(docker_name)
32     return docker_client
33
34
35 def env_yardstick(docker_name):
36     client = get_client()
37     yardstick_info["name"] = docker_name
38     try:
39         env_docker = docker_find(docker_name)
40         yardstick_info["container"] = env_docker
41         yardstick_info["ip"] = get_docker_ip(docker_name)
42         return env_docker
43     except docker.errors.NotFound:
44         pass
45     volume = get_self_volume()
46     yardstick_tag = os.getenv("Yardstick_TAG")
47     if yardstick_tag is None:
48         yardstick_tag = "danube.3.1"
49     env_docker = client.containers.run(image="opnfv/yardstick:%s"
50                                              % yardstick_tag,
51                                        privileged=True,
52                                        tty=True,
53                                        detach=True,
54                                        ports={'5000': '8888'},
55                                        volumes=volume,
56                                        name=docker_name)
57     yardstick_info["container"] = env_docker
58     yardstick_info["ip"] = get_docker_ip(docker_name)
59     return env_docker
60
61
62 def env_bottlenecks(docker_name):
63     client = get_client()
64     volume = get_self_volume()
65     env_docker = client.containers.run(image="opnfv/bottlenecks:latest",
66                                        privileged=True,
67                                        detach=True,
68                                        ports={'8888': '5000'},
69                                        volumes=volume,
70                                        name=docker_name)
71     return env_docker
72
73
74 def env_elk(docker_name):
75     client = get_client()
76     ELK_info["name"] = docker_name
77     try:
78         env_docker = docker_find(docker_name)
79         ELK_info["container"] = env_docker
80         ELK_info["ip"] = get_docker_ip(docker_name)
81         return env_docker
82     except docker.errors.NotFound:
83         pass
84     env_docker = client.containers.run(image="sebp/elk:es241_l240_k461",
85                                        privileged=True,
86                                        detach=True,
87                                        ports={'5044': '5044',
88                                               '5601': '5601',
89                                               '9200': '9200'},
90                                        name=docker_name)
91     ELK_info["container"] = env_docker
92     ELK_info["ip"] = get_docker_ip(docker_name)
93     return env_docker
94
95
96 def get_docker_ip(docker_name):
97     env_docker = docker_find(docker_name)
98     client = docker.APIClient(base_url='unix://var/run/docker.sock')
99     docker_inspect = client.inspect_container(env_docker.id)
100     ip_address = docker_inspect["NetworkSettings"]["IPAddress"]
101     return ip_address
102
103
104 def docker_exec_cmd(docker, cmd):
105     return docker.exec_run(cmd)
106
107
108 def get_self_volume():
109     self_volume = {}
110     hostname = socket.gethostname()
111     client = docker.APIClient(base_url='unix://var/run/docker.sock')
112     volume = client.inspect_container(hostname)["Mounts"]
113     for i in volume:
114         self_volume[i['Source']] = i['Destination']
115     return self_volume
116
117
118 def remove_docker(docker_name):
119     docker = docker_find(docker_name)
120     docker.kill()
121     docker.remove()