-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
105 lines (83 loc) · 3.58 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# encoding: utf-8
import os
import docker
from docker.errors import ImageNotFound, NotFound, DockerException
import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.gen
from tornado.log import app_log as log
from tornado.options import define, options
from wsrpc import WebSocketRoute, WebSocketThreaded as WebSocket, wsrpc_static
define("listen", default='localhost')
define("port", default=9090, type=int)
class App(tornado.web.Application):
def __init__(self):
project_root = os.path.dirname(os.path.abspath(__file__))
handlers = (
wsrpc_static(r'/js/(.*)'),
(r"/ws/", WebSocket),
(r'/(.*)', tornado.web.StaticFileHandler, {
'path': os.path.join(project_root, 'static'),
'default_filename': 'index.html',
}),
)
super().__init__(handlers=handlers)
CLIENT = docker.from_env()
class Routes(WebSocketRoute):
def run(self, image_id):
log.info('method: run; image_id: {0}'.format(image_id))
try:
container = CLIENT.containers.run(image_id, detach=True)
except ImageNotFound:
return 'image {0} not found'.format(image_id)
except DockerException:
return 'docker error'
return "Container {0} was successfully runned".format(container.short_id)
def start(self, container_id):
log.info('method: start; container_id: {0}'.format(container_id))
try:
container = CLIENT.containers.get(container_id)
container.start()
except NotFound:
return 'container {0} not found'.format(container_id)
except DockerException:
return 'docker error'
return "Container {0} was successfully started".format(container_id)
def stop(self, container_id):
log.info('method: stop; container_id: {0}'.format(container_id))
try:
container = CLIENT.containers.get(container_id)
container.stop()
except NotFound:
return 'container {0} not found'.format(container_id)
except DockerException:
return 'docker error'
return "Container {0} was successfully stopped".format(container_id)
def remove(self, container_id):
log.info('method: remove; container_id: {0}'.format(container_id))
try:
container = CLIENT.containers.get(container_id)
container.remove()
except NotFound:
return 'container {0} not found'.format(container_id)
except DockerException:
return 'docker error'
return "Container {0} was successfully deleted".format(container_id)
class APIRoutes(WebSocketRoute):
def get_images(self):
all_images = CLIENT.images.list()
return {i.short_id: str(i).replace('<', '').replace('>', '') for i in all_images}
def get_containers(self):
started_containers = CLIENT.containers.list()
all_containers = CLIENT.containers.list(all=True)
return {c.short_id: 'started' if c in started_containers else 'stopped' for c in all_containers}
WebSocket.ROUTES['docker'] = Routes
WebSocket.ROUTES['api'] = APIRoutes
def start_server():
options.parse_command_line()
WebSocket.init_pool()
http_server = tornado.httpserver.HTTPServer(App())
http_server.listen(options.port, address=options.listen)
log.info('Server started {host}:{port}'.format(host=options.listen, port=options.port))
tornado.ioloop.IOLoop.instance().start()