odoo_container.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # -*- coding: utf-8 -*-
  2. from openerp import models, fields, api
  3. from openerp.tools import config
  4. from openerp.exceptions import Warning
  5. from random import randint
  6. from jinja2 import Environment, PackageLoader
  7. from subprocess import check_output
  8. from ..utils import docker_api
  9. import os
  10. import unicodedata
  11. import stringcase
  12. import time
  13. class OdooContainer(models.Model):
  14. _name = 'odoo.management.odoo.container'
  15. CONTAINER_STATUS = [
  16. ('to_activate', 'Por activar'),
  17. ('activated', 'Activado'),
  18. ('disapproved', 'No aprobado'),
  19. ('suspended', 'Suspendido'),
  20. ('destroyed', 'Eliminado')
  21. ]
  22. normalized_name = fields.Char(string='Normalized Name', compute='_normalize_name', size=50)
  23. logo = fields.Binary(string='Logo')
  24. internal_ip = fields.Char(string='Internal IP', size=15)
  25. internal_port = fields.Integer(string='Internal Port')
  26. external_ip = fields.Char(string='External IP', size=15)
  27. external_port = fields.Integer(string='External Port')
  28. expose_service = fields.Boolean(string='Expose Service', default=True)
  29. status = fields.Selection(string='Estado', selection=CONTAINER_STATUS, default='draft')
  30. demo = fields.Boolean(string='Is Demo?', default=False)
  31. active = fields.Boolean(string='Is Active', default=False)
  32. payment_plan_id = fields.Many2one(string='Payment Plan', comodel_name='odoo.management.payment.plan', required=True)
  33. @api.one
  34. # @api.depends('name')
  35. def _normalize_name(self):
  36. try:
  37. name = unicodedata.normalize('NFKD', self.name)
  38. name = name.encode('ASCII', 'ignore')
  39. except TypeError:
  40. pass
  41. name = stringcase.trimcase(name)
  42. name = stringcase.lowercase(name)
  43. self.normalized_name = stringcase.snakecase(name)
  44. def check_existence(self):
  45. root_path = config['odoo_root_path'] or None
  46. if not root_path:
  47. raise Warning('No se puede encontrar la configuración')
  48. system_path = os.path.join(root_path, self.normalized_name)
  49. if system_path:
  50. raise Warning('Ya existe un sistema con este nombre')
  51. return True
  52. def check_docker_port(self, port):
  53. if port == 0:
  54. return False
  55. if port in docker_api.get_all_external_ports():
  56. return False
  57. return True
  58. def take_randomized_port(self):
  59. port_range = config['odoo_ports_range']
  60. port_range = map(lambda x: int(x.strip()), port_range.split(','))
  61. port = 0
  62. while not self.check_docker_port(port):
  63. port = randint(port_range[0], port_range[1])
  64. time.sleep(0.3)
  65. self.external_port = port
  66. def create_odoo_folders(self):
  67. root_path = config('odoo_root_path')
  68. defaults_path = config('odoo_defaults_path')
  69. for p in defaults_path:
  70. full_path = os.path.join(root_path, self.normalized_name, p.strip())
  71. os.makedirs(full_path)
  72. time.sleep(0.3)
  73. return True
  74. def create_odoo_config(self):
  75. config_path = os.path.join(config('odoo_root_path'), self.normalized_name, 'config')
  76. if not os.path.exists(config_path):
  77. return False
  78. env = Environment(loader=PackageLoader('resources'))
  79. template = env.get_template('openerp-server.j2')
  80. rendered = template.stream({
  81. 'admin_password': config('odoo_default_password'),
  82. 'db_host': config('odoo_db_host'),
  83. 'db_name': self.normalized_name,
  84. 'db_user': config('db_user'),
  85. 'db_password': config('db_password')
  86. })
  87. rendered.dump(os.path.join(config_path, 'openerp-server.conf'))
  88. return True
  89. def create_odoo_db(self):
  90. cmd = 'createdb -U %s %s' % (config('db_user'), self.normalized_name)
  91. result = docker_api.run_command(config('odoo_db_container'), cmd)
  92. return result
  93. def copy_odoo_db_seed(self):
  94. backup_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'resources', 'odoo.tar')
  95. return docker_api.copy_in(config('odoo_db_container'), '/tmp', backup_path)
  96. def restore_odoo_db(self):
  97. cmd = 'psql -U %s -d %s -f %s' % (config('db_user'), self.normalized_name, '/tmp/odoo.sql')
  98. return docker_api.run_command(config('odoo_db_container'), cmd)
  99. def remove_odoo_db_seed(self):
  100. cmd = 'rm -f %s' % '/tmp/odoo.sql'
  101. return docker_api.run_command(config('odoo_db_container'), cmd)
  102. def create_odoo_container(self):
  103. result = docker_api.run_container(
  104. image=config('odoo_image'),
  105. name=self.normalized_name,
  106. ports={'8069/tcp': self.external_port},
  107. volumes=None,
  108. network=config('odoo_network'),
  109. memory_limit='150M',
  110. memory_swap_limit='150M'
  111. )
  112. if not result:
  113. raise Warning('No se pudo crear el contenedor')
  114. return True
  115. def apply_odoo_folders_permission(self):
  116. full_path = os.path.join(config('odoo_root_path'), self.normalized_name)
  117. check_output(['chmod', '-Rf', '777'], full_path)
  118. return True
  119. def take_internal_ip(self):
  120. self.internal_ip = docker_api.get_internal_ip(self.normalized_name)