odoo_api.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. from __future__ import unicode_literals
  2. from django.conf import settings
  3. from random import randint
  4. from jinja2 import Environment, PackageLoader, select_autoescape
  5. from api.utils.docker_api import (
  6. get_all_external_ports,
  7. execute_command,
  8. run_container,
  9. copy_in
  10. )
  11. from api.utils.logger import info
  12. from api.utils.command import execute
  13. import os
  14. import socket
  15. import time
  16. import unicodedata
  17. import stringcase
  18. import tarfile
  19. '''
  20. '''
  21. def normalize_name(name = None):
  22. if not name:
  23. return name
  24. try:
  25. name = unicodedata.normalize('NFKD', name)
  26. name = name.encode('ASCII', 'ignore')
  27. except TypeError:
  28. pass
  29. name = stringcase.trimcase(name)
  30. name = stringcase.lowercase(name)
  31. name = stringcase.snakecase(name)
  32. return name
  33. '''
  34. '''
  35. def randomize_port():
  36. ports = settings.ODOO_PORTS_RANGE
  37. port = 0
  38. while not check_port_from_docker(port):
  39. time.sleep(1)
  40. port = randint(ports[0], ports[1])
  41. return port
  42. '''
  43. '''
  44. def check_port(port=0):
  45. if port == 0:
  46. return False
  47. ok = False
  48. info('cheking port %d at %s' % (settings.EXTERNAL_IP, port))
  49. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  50. try:
  51. s.bind((settings.EXTERNAL_IP, port))
  52. info('%s checked at %s is success' % (settings.EXTERNAL_IP, port))
  53. ok = True
  54. except socket.error:
  55. info('%s checked at %s is failed' % (settings.EXTERNAL_IP, port))
  56. ok = False
  57. s.close()
  58. return ok
  59. '''
  60. '''
  61. def check_port_from_docker(port=0):
  62. if port == 0:
  63. return False
  64. if port in get_all_external_ports():
  65. return False
  66. return True
  67. '''
  68. '''
  69. def check_name(name=None):
  70. if not name:
  71. return False
  72. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  73. return os.path.exists(full_path)
  74. '''
  75. '''
  76. def create_folders(name=None):
  77. if not name:
  78. return False
  79. folders = settings.ODOO_DEFAULT_FOLDERS
  80. for folder in folders:
  81. full_path = os.path.join(settings.ODOO_ROOT_PATH, name, folder.strip())
  82. os.makedirs(full_path)
  83. time.sleep(1)
  84. return True
  85. '''
  86. '''
  87. def apply_permissions(name=None):
  88. if not name:
  89. return False
  90. full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
  91. execute(['chmod', '-Rf', '777', full_path])
  92. return True
  93. '''
  94. '''
  95. def create_configuration(name=None):
  96. if not name:
  97. return False
  98. conf_path = os.path.join(settings.ODOO_ROOT_PATH, name, 'config')
  99. if not os.path.exists(conf_path):
  100. return False
  101. env = Environment(
  102. loader=PackageLoader('api', 'templates'),
  103. autoescape=select_autoescape(['j2'])
  104. )
  105. template = env.get_template(settings.ODOO_CONF_FILENAME + '.j2')
  106. template_rendered = template.stream({
  107. 'admin_password': settings.ODOO_ADMIN_PASSWORD,
  108. 'db_host': settings.ODOO_DB_HOST,
  109. 'db_port': settings.ODOO_DB_PORT,
  110. 'db_name': name,
  111. 'db_user': settings.ODOO_DB_USER,
  112. 'db_password': settings.ODOO_DB_PASSWORD
  113. })
  114. template_rendered.dump(os.path.join(conf_path, settings.ODOO_CONF_FILENAME + '.conf'))
  115. return True
  116. '''
  117. '''
  118. def create_database(name=None):
  119. if not name:
  120. return False
  121. cmd = 'createdb -U %s %s' % (settings.ODOO_DB_USER, name)
  122. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  123. '''
  124. '''
  125. def copy_database_seed():
  126. backup_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'files', 'odoo.tar')
  127. return copy_in(settings.ODOO_DB_CONTAINER, '/tmp', backup_path)
  128. '''
  129. '''
  130. def restore_database(name=None):
  131. if not name:
  132. return False
  133. cmd = 'psql -U %s -d %s -f %s' % (settings.ODOO_DB_USER, name, '/tmp/odoo.sql')
  134. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  135. '''
  136. '''
  137. def remove_database_seed():
  138. cmd = 'rm -f %s' % ('/tmp/odoo.sql')
  139. return execute_command(settings.ODOO_DB_CONTAINER, cmd)
  140. '''
  141. '''
  142. def create_odoo_container(name=None, ports=[]):
  143. if not name:
  144. return False
  145. ports = dict(map(lambda p: ('%d/tcp' % 8069, p), ports))
  146. volumes = dict(map(lambda f: (os.path.join(settings.ODOO_ROOT_PATH, name, f.strip()), {
  147. 'bind': settings.ODOO_DEFAULT_FOLDERS[f].strip(),
  148. 'mode': 'rw'
  149. }) , settings.ODOO_DEFAULT_FOLDERS))
  150. run_container(settings.ODOO_IMAGE, name, ports, volumes, settings.INTERNAL_NETWORK_NAME)
  151. time.sleep(5)
  152. return True