odoo_resource.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.conf.urls import url
  4. from django.conf import settings
  5. from tastypie.resources import Resource
  6. from tastypie.utils import trailing_slash
  7. from core.models.request import Request
  8. from api.utils.odoo_api import (
  9. normalize_name,
  10. check_name,
  11. randomize_port,
  12. create_folders,
  13. create_configuration,
  14. create_database,
  15. copy_database_seed,
  16. restore_database,
  17. remove_database_seed,
  18. create_odoo_container,
  19. apply_permissions
  20. )
  21. from api.utils.jwt_token import get_user
  22. from api.utils.jwt_authentication import JWTAuthentication
  23. from api.utils.logger import (
  24. info,
  25. error
  26. )
  27. from simplejson import JSONDecodeError
  28. import simplejson as json
  29. class OdooResource(Resource):
  30. class Meta:
  31. authentication = JWTAuthentication()
  32. '''
  33. '''
  34. def prepend_urls(self):
  35. return [
  36. url(r'^(?P<resource_name>%s)/create%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('odoo_create'), name='api_odoo_create'),
  37. ]
  38. '''
  39. '''
  40. def odoo_create(self, request, **kwargs):
  41. info('odoo creation is requested')
  42. self.method_check(request, allowed='post')
  43. self.is_authenticated(request)
  44. authorization_header = request.META.get(settings.JWT_ACCEPT_HEADER)
  45. prefix_length = len(settings.JWT_PREFIX_HEADER)
  46. user = get_user(authorization_header[prefix_length + 1:])
  47. info('%s is authenticated' % user.username)
  48. name = None
  49. try:
  50. data = json.loads(request.body)
  51. name = data['name']
  52. except JSONDecodeError:
  53. name = None
  54. error('json decode error')
  55. except KeyError:
  56. name = None
  57. error('key error')
  58. r = Request.objects.create(name='Crear contenedor Odoo')
  59. r.user = user
  60. if not name:
  61. r.issue = 'name is required'
  62. r.status = 5
  63. r.save()
  64. error('name is required')
  65. return self.create_response(request, {
  66. 'error_message': 'name is required'
  67. })
  68. info('%s: request is ok' % name)
  69. # 1. Check and get name
  70. name = normalize_name(name)
  71. name_exists = check_name(name)
  72. if name_exists:
  73. r.issue = '%s: name is already exists' % name
  74. r.status = 5
  75. r.save()
  76. error('%s: name is already exists' % name)
  77. return self.create_response(request, {
  78. 'error_message': '%s: name is already exists' % name
  79. })
  80. info('%s: name is ok' % name)
  81. # 2. Get port
  82. port = randomize_port()
  83. info('%s: port is ok' % port)
  84. # 3. Folder structure create
  85. folders_created = create_folders(name)
  86. if not folders_created:
  87. r.issue = '%s: folders structure cannot be created' % name
  88. r.status = 5
  89. r.save()
  90. error('%s: folders structure cannot be created' % name)
  91. return self.create_response(request, {
  92. 'error_message': '%s: folders structure cannot be created' % name
  93. })
  94. info('%s: folders is ok' % name)
  95. # 4. Configuration create
  96. conf_created = create_configuration(name)
  97. if not conf_created:
  98. r.issue = '%s: configuration cannot be created' % name
  99. r.status = 5
  100. r.save()
  101. error('%s: configuration cannot be created' % name)
  102. return self.create_response(request, {
  103. 'error_message': '%s: configuration cannot be created' % name
  104. })
  105. info('%s: configuration is ok' % name)
  106. # 5. Database create
  107. db_created = create_database(name)
  108. if not db_created:
  109. r.issue = '%s: database cannot be created' % name
  110. r.status = 5
  111. r.save()
  112. error('%s: database cannot be created' % name)
  113. return self.create_response(request, {
  114. 'error_message': '%s: database cannot be created' % name
  115. })
  116. info('%s: database is ok' % name)
  117. # 6. Copy a database backup
  118. seed_copied = copy_database_seed()
  119. if not seed_copied:
  120. r.issue = '%s: database seed cannot be copied' % name
  121. r.status = 5
  122. r.save()
  123. error('%s: database seed cannot be copied' % name)
  124. return self.create_response(request, {
  125. 'error_message': '%s: database seed cannot be copied' % name
  126. })
  127. info('%s: database seed is ok' % name)
  128. # 7. Restore database schema
  129. db_restored = restore_database(name)
  130. if not db_restored:
  131. r.issue = '%s: database cannot be restored' % name
  132. r.status = 5
  133. r.save()
  134. error('%s: database cannot be restored' % name)
  135. return self.create_response(request, {
  136. 'error_message': '%s: database cannot be restored' % name
  137. })
  138. info('%s: database restore is ok' % name)
  139. # 8. Remove unused bakup file
  140. seed_removed = remove_database_seed()
  141. if not seed_removed:
  142. r.issue = '%s: seed cannot be removed' % name
  143. r.status = 5
  144. r.save()
  145. error('%s: seed cannot be removed' % name)
  146. return self.create_response(request, {
  147. 'error_message': '%s: seed cannot be removed' % name
  148. })
  149. info('%s: database seed remove is ok' % name)
  150. # 9. Odoo create
  151. odoo_created = create_odoo_container(name, [port])
  152. if not odoo_created:
  153. r.issue = '%s: odoo container cannot be created' % name
  154. r.status = 5
  155. r.save()
  156. error('%s: odoo container cannot be created' % name)
  157. return self.create_response(request, {
  158. 'error_message': '%s: odoo container cannot be created' % name
  159. })
  160. info('%s: container creation is ok' % name)
  161. # 10. Apply permissions
  162. permissions_applied = apply_permissions(name)
  163. if not permissions_applied:
  164. r.issue = '%s: odoo container cannot be started' % name
  165. r.status = 5
  166. r.save()
  167. error('%s: odoo container cannot be started' % name)
  168. return self.create_response(request, {
  169. 'error_message': '%s: odoo container cannot be started' % name
  170. })
  171. info('%s: container started is ok' % name)
  172. r.issue = '%s: odoo container created successfully' % name
  173. r.status = 4
  174. r.save()
  175. info('%s: odoo creation is ok' % name)
  176. return self.create_response(request, {
  177. 'action': {
  178. 'type': 'redirect',
  179. 'ip': settings.SERVER_IP,
  180. 'port': port
  181. }
  182. })