odoo_container.py 5.3 KB

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