Gogs 7 лет назад
Родитель
Сommit
1d4d62ba36
3 измененных файлов с 95 добавлено и 18 удалено
  1. 73 0
      api/resources/docker_resource.py
  2. 3 1
      api/urls.py
  3. 19 17
      api/utils/docker_api.py

+ 73 - 0
api/resources/docker_resource.py

@@ -0,0 +1,73 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from django.conf.urls import url
+from django.conf import settings
+from tastypie.resources import Resource
+from tastypie.utils import trailing_slash
+from api.utils.docker_api import get_all_images, get_all_containers, start_container, stop_container
+
+'''
+'''
+class DockerResource(Resource):
+    class Meta:
+        allowed_methods = ['get']
+
+    '''
+    '''
+    def prepend_urls(self):
+        return [
+            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/(?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>)/stop%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('stop_container'), name='api_stop_container'),
+        ]
+
+    '''
+    '''
+    def get_all_images(self, request, **kwargs):
+        self.method_check(request, allowed=self._meta.allowed_methods)
+        self.is_authenticated(request)
+
+        bundle = self.build_bundle(obj=get_all_images(), request=request)
+        return self.create_response(request, bundle.obj)
+
+    '''
+    '''
+    def get_all_containers(self, request, **kwargs):
+        self.method_check(request, allowed=self._meta.allowed_methods)
+        self.is_authenticated(request)
+
+        bundle = self.build_bundle(obj=get_all_containers(), request=request)
+        return self.create_response(request, bundle.obj)
+
+    '''
+    '''
+    def start_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:
+            return self.create_response({
+                'error_message': 'container id is required'
+            }, request=request)
+
+        bundle = self.build_bundle(obj={}, request=request)
+        return self.create_response(request, bundle.obj)
+
+    '''
+    '''
+    def stop_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:
+            return self.create_response({
+                'error_message': 'container id is required'
+            })
+            
+        bundle = self.build_bundle(obj={}, request=request)
+        return self.create_response(request, bundle.obj)

+ 3 - 1
api/urls.py

@@ -10,6 +10,7 @@ from api.resources.jwt_resource import JWTResource
 from api.resources.request_resource import RequestResource
 from api.resources.task_resource import TaskResource
 from api.resources.playbook_resource import PlaybookResource
+from api.resources.docker_resource import DockerResource
 
 v1_api = Api(api_name='v1')
 v1_api.register(UserResource())
@@ -18,4 +19,5 @@ v1_api.register(GroupResource())
 v1_api.register(JWTResource())
 v1_api.register(RequestResource())
 v1_api.register(TaskResource())
-v1_api.register(PlaybookResource())
+v1_api.register(PlaybookResource())
+v1_api.register(DockerResource())

+ 19 - 17
api/utils/docker_api.py

@@ -12,6 +12,25 @@ def get_docker_client():
     except DockerException:
         return None
 
+'''
+'''
+def get_all_images():
+    client = get_docker_client()
+
+    images = []
+
+    if not client:
+        return images
+
+    for image in client.images.list():
+        images.append({
+            'id': image.id,
+            'short_id': image.short_id,
+            'tags': image.tags
+        })
+
+    return images
+
 '''
 '''
 def get_all_containers():
@@ -34,23 +53,6 @@ def get_all_containers():
 
     return containers
 
-'''
-'''
-def get_all_images():
-    client = get_docker_client()
-
-    images = []
-
-    if not client:
-        return images
-
-    for image in client.images.list():
-        images.append({
-            'id': image.id,
-            'short_id': image.short_id,
-            'tags': image.tags
-        })
-
 '''
 '''
 def start_container(id=None):