odoo_resource.py 6.9 KB

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