浏览代码

[ADD] more docker api features

Gogs 7 年之前
父节点
当前提交
3dc2681f81
共有 2 个文件被更改,包括 75 次插入11 次删除
  1. 54 9
      api/resources/docker_resource.py
  2. 21 2
      api/utils/docker_api.py

+ 54 - 9
api/resources/docker_resource.py

@@ -4,7 +4,13 @@ from django.conf.urls import url
 from django.conf import settings
 from django.conf import settings
 from tastypie.resources import Resource
 from tastypie.resources import Resource
 from tastypie.utils import trailing_slash
 from tastypie.utils import trailing_slash
-from api.utils.docker_api import get_all_images, get_all_containers, start_container, stop_container
+from api.utils.docker_api import (
+    get_all_images, 
+    get_all_containers, 
+    start_container, 
+    restart_container,
+    stop_container
+)
 
 
 '''
 '''
 '''
 '''
@@ -19,6 +25,7 @@ class DockerResource(Resource):
             url(r'^(?P<resource_name>%s)/image/all%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('get_all_images'), name='api_get_all_images'),
             url(r'^(?P<resource_name>%s)/image/all%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('get_all_images'), name='api_get_all_images'),
             url(r'^(?P<resource_name>%s)/container/all%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('get_all_containers'), name='api_get_all_containers'),
             url(r'^(?P<resource_name>%s)/container/all%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('get_all_containers'), name='api_get_all_containers'),
             url(r'^(?P<resource_name>%s)/container/(?P<container_id>)/start%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('start_container'), name='api_start_container'),
             url(r'^(?P<resource_name>%s)/container/(?P<container_id>)/start%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('start_container'), name='api_start_container'),
+            url(r'^(?P<resource_name>%s)/container/(?P<container_id>)/restart%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('restart_container'), name='api_restart_container'),
             url(r'^(?P<resource_name>%s)/container/(?P<container_id>)/stop%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('stop_container'), name='api_stop_container'),
             url(r'^(?P<resource_name>%s)/container/(?P<container_id>)/stop%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('stop_container'), name='api_stop_container'),
         ]
         ]
 
 
@@ -40,11 +47,9 @@ class DockerResource(Resource):
         self.method_check(request, allowed=self._meta.allowed_methods)
         self.method_check(request, allowed=self._meta.allowed_methods)
         self.is_authenticated(request)
         self.is_authenticated(request)
 
 
-        bundle = self.build_bundle(obj={
+        return self.create_response(request, {
             'containers': get_all_containers()
             'containers': get_all_containers()
-        }, request=request)
-        
-        return self.create_response(request, bundle.obj)
+        })
 
 
     '''
     '''
     '''
     '''
@@ -54,13 +59,45 @@ class DockerResource(Resource):
 
 
         container_id = kwargs.get('container_id', None)
         container_id = kwargs.get('container_id', None)
 
 
+        if not container_id:
+            return self.create_response(request, {
+                'error_message': 'container id is required'
+            }, request=request)
+
+        completed = start_container(container_id)
+
+        if not completed:
+            return self.create_response(request, {
+                'error_message': 'cannot start container %s' % container_id
+            })
+
+        return self.create_response(request, {
+            'message': 'container %s started' % container_id
+        })
+
+    '''
+    '''
+    def restart_container(self, request, **kwargs):
+        self.method_check(request, allowed=self._meta.allowed_methods)
+        self.is_authenticated(request)
+
+        container_id = kwargs.get('container_id', None)
+
         if not container_id:
         if not container_id:
             return self.create_response({
             return self.create_response({
                 'error_message': 'container id is required'
                 'error_message': 'container id is required'
             }, request=request)
             }, request=request)
 
 
-        bundle = self.build_bundle(obj={}, request=request)
-        return self.create_response(request, bundle.obj)
+        completed = restart_container(container_id)
+
+        if not completed:
+            return self.create_response({
+                'error_message': 'cannot restart container %s' % container_id
+            })
+
+        return self.create_response(request, {
+            'message': 'container %s is restarted'
+        })
 
 
     '''
     '''
     '''
     '''
@@ -74,6 +111,14 @@ class DockerResource(Resource):
             return self.create_response({
             return self.create_response({
                 'error_message': 'container id is required'
                 'error_message': 'container id is required'
             })
             })
+
+        completed = stop_container(container_id)
+
+        if not completed:
+            return self.create_response({
+                'error_message': 'cannot stop container %s' % container_id
+            })
             
             
-        bundle = self.build_bundle(obj={}, request=request)
-        return self.create_response(request, bundle.obj)
+        return self.create_response(request, {
+            'message': 'container %s is stoped' % container_id
+        })

+ 21 - 2
api/utils/docker_api.py

@@ -70,8 +70,27 @@ def start_container(id=None):
     except NotFound:
     except NotFound:
         return False
         return False
     except APIError:
     except APIError:
-        return 
-        
+        return
+
+'''
+'''
+def restart_container(id=None):
+    if not id:
+        return False
+
+    client = get_docker_client()
+
+    if not client:
+        return False
+
+    try:
+        container = client.containers.get(id)
+        container.restart()
+    except NotFound:
+        return False
+    except APIError:
+        return
+   
 '''
 '''
 '''
 '''
 def stop_container(id=None):
 def stop_container(id=None):