6e9c78a06768dad9475c92ba4dbfebb23bad75e4
[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="yardstick_pmd",
50                                        privileged=True,
51                                        tty=True,
52                                        detach=True,
53                                        ports={'5000': '8888'},
54                                        volumes=volume,
55                                        name=docker_name)
56     yardstick_info["container"] = env_docker
57     yardstick_info["ip"] = get_docker_ip(docker_name)
58     return env_docker
59
60
61 def env_bottlenecks(docker_name):
62     client = get_client()
63     volume = get_self_volume()
64     env_docker = client.containers.run(image="opnfv/bottlenecks:latest",
65                                        privileged=True,
66                                        detach=True,
67                                        ports={'8888': '5000'},
68                                        volumes=volume,
69                                        name=docker_name)
70     return env_docker
71
72
73 def env_elk(docker_name):
74     client = get_client()
75     ELK_info["name"] = docker_name
76     try:
77         env_docker = docker_find(docker_name)
78         ELK_info["container"] = env_docker
79         ELK_info["ip"] = get_docker_ip(docker_name)
80         return env_docker
81     except docker.errors.NotFound:
82         pass
83     env_docker = client.containers.run(image="sebp/elk:es241_l240_k461",
84                                        privileged=True,
85                                        detach=True,
86                                        ports={'5044': '5044',
87                                               '5601': '5601',
88                                               '9200': '9200'},
89                                        name=docker_name)
90     ELK_info["container"] = env_docker
91     ELK_info["ip"] = get_docker_ip(docker_name)
92     return env_docker
93
94
95 def get_docker_ip(docker_name):
96     env_docker = docker_find(docker_name)
97     client = docker.APIClient(base_url='unix://var/run/docker.sock')
98     docker_inspect = client.inspect_container(env_docker.id)
99     ip_address = docker_inspect["NetworkSettings"]["IPAddress"]
100     return ip_address
101
102
103 def docker_exec_cmd(docker, cmd):
104     return docker.exec_run(cmd)
105
106
107 def get_self_volume():
108     self_volume = {}
109     hostname = socket.gethostname()
110     client = docker.APIClient(base_url='unix://var/run/docker.sock')
111     volume = client.inspect_container(hostname)["Mounts"]
112     for i in volume:
113         self_volume[i['Source']] = i['Destination']
114     return self_volume
115
116
117 def remove_docker(docker_name):
118     docker = docker_find(docker_name)
119     docker.kill()
120     docker.remove()