Browse Source

[FIX] docker status reload status and response one

Gogs 7 years ago
parent
commit
dd7e985722
4 changed files with 70 additions and 35 deletions
  1. 20 19
      api/resources/docker_resource.py
  2. 1 1
      api/urls.py
  3. 44 14
      api/utils/docker_api.py
  4. 5 1
      odoo_control/settings.py

+ 20 - 19
api/resources/docker_resource.py

@@ -16,7 +16,7 @@ from api.utils.docker_api import (
 '''
 class DockerResource(Resource):
     class Meta:
-        allowed_methods = ['get']
+       pass
 
     '''
     '''
@@ -24,15 +24,15 @@ class DockerResource(Resource):
         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>)/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/start/(?P<container_id>[\w\d_.-]+)%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('start_container'), name='api_start_container'),
+            url(r'^(?P<resource_name>%s)/container/restart/(?P<container_id>[\w\d_.-]+)%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('restart_container'), name='api_restart_container'),
+            url(r'^(?P<resource_name>%s)/container/stop/(?P<container_id>[\w\d_.-]+)%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.method_check(request, allowed='get')
         self.is_authenticated(request)
 
         bundle = self.build_bundle(obj={
@@ -44,7 +44,7 @@ class DockerResource(Resource):
     '''
     '''
     def get_all_containers(self, request, **kwargs):
-        self.method_check(request, allowed=self._meta.allowed_methods)
+        self.method_check(request, allowed='get')
         self.is_authenticated(request)
 
         return self.create_response(request, {
@@ -54,7 +54,7 @@ class DockerResource(Resource):
     '''
     '''
     def start_container(self, request, **kwargs):
-        self.method_check(request, allowed=self._meta.allowed_methods)
+        self.method_check(request, allowed='post')
         self.is_authenticated(request)
 
         container_id = kwargs.get('container_id', None)
@@ -64,21 +64,22 @@ class DockerResource(Resource):
                 'error_message': 'container id is required'
             }, request=request)
 
-        completed = start_container(container_id)
+        container_data = start_container(container_id)
 
-        if not completed:
+        if not container_data:
             return self.create_response(request, {
                 'error_message': 'cannot start container %s' % container_id
-            })
+            }, request=request)
+
 
         return self.create_response(request, {
-            'message': 'container %s started' % container_id
+            'container': container_data
         })
 
     '''
     '''
     def restart_container(self, request, **kwargs):
-        self.method_check(request, allowed=self._meta.allowed_methods)
+        self.method_check(request, allowed='post')
         self.is_authenticated(request)
 
         container_id = kwargs.get('container_id', None)
@@ -88,21 +89,21 @@ class DockerResource(Resource):
                 'error_message': 'container id is required'
             }, request=request)
 
-        completed = restart_container(container_id)
+        container_data = restart_container(container_id)
 
-        if not completed:
+        if not container_data:
             return self.create_response({
                 'error_message': 'cannot restart container %s' % container_id
             })
 
         return self.create_response(request, {
-            'message': 'container %s is restarted'
+            'container': container_data
         })
 
     '''
     '''
     def stop_container(self, request, **kwargs):
-        self.method_check(request, allowed=self._meta.allowed_methods)
+        self.method_check(request, allowed='post')
         self.is_authenticated(request)
 
         container_id = kwargs.get('container_id', None)
@@ -112,13 +113,13 @@ class DockerResource(Resource):
                 'error_message': 'container id is required'
             })
 
-        completed = stop_container(container_id)
+        container_data = stop_container(container_id)
 
-        if not completed:
+        if not container_data:
             return self.create_response({
                 'error_message': 'cannot stop container %s' % container_id
             })
             
         return self.create_response(request, {
-            'message': 'container %s is stoped' % container_id
+            'container': container_data
         })

+ 1 - 1
api/urls.py

@@ -20,4 +20,4 @@ v1_api.register(JWTResource())
 v1_api.register(RequestResource())
 v1_api.register(TaskResource())
 v1_api.register(PlaybookResource())
-v1_api.register(DockerResource())
+v1_api.register(DockerResource())

+ 44 - 14
api/utils/docker_api.py

@@ -41,7 +41,7 @@ def get_all_containers():
     if not client:
         return containers
 
-    for container in client.containers.list():
+    for container in client.containers.list(all=True):
         containers.append({
             'id': container.id,
             'short_id': container.short_id,
@@ -50,62 +50,92 @@ def get_all_containers():
             'labels': container.labels,
             'status': container.status
         })
-
+        
     return containers
 
 '''
 '''
 def start_container(id=None):
     if not id:
-        return False
+        return None
 
     client = get_docker_client()
 
     if not client:
-        return False
+        return None
 
     try:
         container = client.containers.get(id)
         container.start()
+        container.reload()
+
+        return {
+            'id': container.id,
+            'short_id': container.short_id,
+            'name': container.name,
+            'image': container.image,
+            'labels': container.labels,
+            'status': container.status
+        }
     except NotFound:
-        return False
+        return None
     except APIError:
-        return
+        return None
 
 '''
 '''
 def restart_container(id=None):
     if not id:
-        return False
+        return None
 
     client = get_docker_client()
 
     if not client:
-        return False
+        return None
 
     try:
         container = client.containers.get(id)
         container.restart()
+        container.reload()
+
+        return {
+            'id': container.id,
+            'short_id': container.short_id,
+            'name': container.name,
+            'image': container.image,
+            'labels': container.labels,
+            'status': container.status
+        }
     except NotFound:
-        return False
+        return None
     except APIError:
-        return
+        return None
    
 '''
 '''
 def stop_container(id=None):
     if not id:
-        return False
+        return None
 
     client = get_docker_client()
 
     if not client:
-        return False
+        return None
 
     try:
         container = client.containers.get(id)
         container.stop()
+        container.reload()
+
+        return {
+            'id': container.id,
+            'short_id': container.short_id,
+            'name': container.name,
+            'image': container.image,
+            'labels': container.labels,
+            'status': container.status
+        }
     except NotFound:
-        return False
+        return None
     except APIError:
-        return False
+        return None

+ 5 - 1
odoo_control/settings.py

@@ -15,10 +15,12 @@ INSTALLED_APPS = [
     'django_extensions',
     'tastypie',
     'core.apps.CoreConfig',
-    'api.apps.ApiConfig'
+    'api.apps.ApiConfig',
+    'corsheaders',
 ]
 
 MIDDLEWARE = [
+    'corsheaders.middleware.CorsMiddleware',
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
@@ -90,6 +92,8 @@ SECRET_KEY = config('SECRET_KEY')
 
 ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
 
+CORS_ORIGIN_ALLOW_ALL = True
+
 DEBUG = config('DEBUG', default=False, cast=bool)
 
 JWT_ACCEPT_HEADER = config('JWT_ACCEPT_HEADER')