docker_resource.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf.urls import url
  4. from tastypie.resources import Resource
  5. from tastypie.utils import trailing_slash
  6. from api.utils.jwt_authentication import JWTAuthentication
  7. from api.utils.docker_api import (
  8. get_all_images,
  9. get_all_containers,
  10. start_container,
  11. restart_container,
  12. stop_container
  13. )
  14. '''
  15. '''
  16. class DockerResource(Resource):
  17. class Meta:
  18. authentication = JWTAuthentication()
  19. '''
  20. '''
  21. def prepend_urls(self):
  22. return [
  23. 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'),
  24. 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'),
  25. 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'),
  26. 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'),
  27. 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'),
  28. ]
  29. '''
  30. '''
  31. def get_all_images(self, request, **kwargs):
  32. self.method_check(request, allowed='get')
  33. self.is_authenticated(request)
  34. bundle = self.build_bundle(obj={
  35. 'images': get_all_images()
  36. }, request=request)
  37. return self.create_response(request, bundle.obj)
  38. '''
  39. '''
  40. def get_all_containers(self, request, **kwargs):
  41. self.method_check(request, allowed='get')
  42. self.is_authenticated(request)
  43. return self.create_response(request, {
  44. 'containers': get_all_containers()
  45. })
  46. '''
  47. '''
  48. def start_container(self, request, **kwargs):
  49. self.method_check(request, allowed='post')
  50. self.is_authenticated(request)
  51. container_id = kwargs.get('container_id', None)
  52. if not container_id:
  53. return self.create_response(request, {
  54. 'error_message': 'container id is required'
  55. }, request=request)
  56. container_data = start_container(container_id)
  57. if not container_data:
  58. return self.create_response(request, {
  59. 'error_message': 'cannot start container %s' % container_id
  60. }, request=request)
  61. return self.create_response(request, {
  62. 'container': container_data
  63. })
  64. '''
  65. '''
  66. def restart_container(self, request, **kwargs):
  67. self.method_check(request, allowed='post')
  68. self.is_authenticated(request)
  69. container_id = kwargs.get('container_id', None)
  70. if not container_id:
  71. return self.create_response({
  72. 'error_message': 'container id is required'
  73. }, request=request)
  74. container_data = restart_container(container_id)
  75. if not container_data:
  76. return self.create_response({
  77. 'error_message': 'cannot restart container %s' % container_id
  78. })
  79. return self.create_response(request, {
  80. 'container': container_data
  81. })
  82. '''
  83. '''
  84. def stop_container(self, request, **kwargs):
  85. self.method_check(request, allowed='post')
  86. self.is_authenticated(request)
  87. container_id = kwargs.get('container_id', None)
  88. if not container_id:
  89. return self.create_response({
  90. 'error_message': 'container id is required'
  91. })
  92. container_data = stop_container(container_id)
  93. if not container_data:
  94. return self.create_response({
  95. 'error_message': 'cannot stop container %s' % container_id
  96. })
  97. return self.create_response(request, {
  98. 'container': container_data
  99. })