Browse Source

[ADD] utils to bind docker api to odoo

robert 6 years ago
parent
commit
247a6e9e00
4 changed files with 169 additions and 17 deletions
  1. 67 17
      models/odoo_instance.py
  2. 22 0
      utils/command.py
  3. 2 0
      utils/git_api.py
  4. 78 0
      utils/odoo_api.py

+ 67 - 17
models/odoo_instance.py

@@ -1,8 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp import models, fields, api
 from openerp.exceptions import Warning
-import unicodedata
-import stringcase
+from ..utils import odoo_api
 
 
 class OdooInstance(models.Model):
@@ -39,27 +38,78 @@ class OdooInstance(models.Model):
     @api.one
     @api.depends('name')
     def _normalize_name(self):
-        name = None
-
-        try:
-            name = unicodedata.normalize('NFKD', self.name)
-            name = name.encode('ASCII', 'ignore')
-        except TypeError:
-            pass
-
-        if not name:
-            return
-
-        name = stringcase.trimcase(name)
-        name = stringcase.lowercase(name)
-
-        self.normalized_name = stringcase.snakecase(name)
+        self.normalized_name = odoo_api.snakeize_name(self.name)
 
     @api.one
     def action_activate(self):
         if self.state not in ('draft', 'suspended'):
             raise Warning('No se puede activar un sistema ya activo')
 
+        # 1. Check name
+        name_is_available = odoo_api.check_name_availability(self.normalized_name)
+
+        if not name_is_available:
+            raise Warning('El nombre ya está siendo usado por otro sistema')
+
+        # 2. Get a port
+        port_to_use = odoo_api.randomize_port()
+
+        # 3. Create dirs
+        make_ok = odoo_api.make_default_dirs(self.normalized_name)
+
+        if not make_ok:
+            raise Warning('No se pudo crear la estructura de directorios')
+
+        # 4. Create configuration file
+        config_ok = odoo_api.make_config_file(self.normalized_name)
+
+        if not config_ok:
+            raise Warning('No se pudo crear el archivo de configuración')
+
+        # 5. Create database
+        db_ok = odoo_api.create_database(self.normalized_name)
+
+        if not db_ok:
+            raise Warning('No se pudo crear la base de datos')
+
+        # 6. Copy database seed
+        seed_copied = odoo_api.copy_database_seed()
+
+        if not seed_copied:
+            raise Warning('No se pudo copiar la estructura inicial de la base de datos')
+
+        # 7. Restore database schema
+        restored = odoo_api.restore_database(self.normalized_name)
+
+        if not restored:
+            raise Warning('No se pudo reestablecer la copia de base de datos')
+
+        # 8. Remove database seed
+        seed_removed = odoo_api.remove_database_seed()
+
+        if not seed_removed:
+            raise Warning('No se pudo remover la copia de base de datos')
+
+        # 9. Create odoo container
+        odoo_created = odoo_api.create_container(self.normalized_name, [port_to_use])
+
+        if not odoo_created:
+            raise Warning('No se pudo crear el contenedor')
+
+        # 10. Apply permissions
+        permissions_applied = odoo_api.apply_permissions(self.normalized_name)
+
+        if not permissions_applied:
+            raise Warning('No se pudo aplicar los permisos correspondientes')
+
+        # 11. Get internal ip
+        internal_ip = odoo_api.get_internal_ip(self.normalized_name)
+
+        # 12. Send email
+        # TODO
+
+        print(internal_ip)
+
         self.state = 'activated'
 
     @api.one

+ 22 - 0
utils/command.py

@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+from subprocess import check_output, STDOUT
+
+
+def list_files_and_folders(path, hiddens=True):
+    output = check_output(['ls', '-a', path], stderr=STDOUT)
+
+    items = []
+    for item in output.split('\n'):
+        if item == '' or item == '.' or item == '..':
+            continue
+
+        if not hiddens and item.startswith('.'):
+            continue
+
+        items.append(item)
+
+    return items
+
+
+def execute(command=[]):
+    return check_output(command, stderr=STDOUT)

+ 2 - 0
utils/git_api.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+

+ 78 - 0
utils/odoo_api.py

@@ -1 +1,79 @@
 # -*- coding: utf-8 -*-
+from random import randint
+from .docker_api import (
+    get_all_external_ports,
+    get_internal_ip,
+    run_container,
+    start_container,
+    stop_container,
+    copy_in
+)
+
+import unicodedata
+import stringcase
+import os
+
+_ODOO_DEFAULT_PATHS = ('/custom-addons', '')
+
+
+def snakeize_name(name):
+    try:
+        name = unicodedata.normalize('NFKD', name)
+        name = name.encode('ASCII', 'ignore')
+    except TypeError:
+        name = ''
+
+    name = stringcase.trimcase(name)
+    name = stringcase.lowercase(name)
+    name = stringcase.snakecase(name)
+
+    return name
+
+
+def check_name_availability(name):
+    full_path = os.path.join('TODO', name)
+    return os.path.exists(full_path)
+
+
+def randomize_port():
+    pass
+
+
+def check_port_availability(port):
+    return port not in get_all_external_ports()
+
+
+def make_default_dirs(name):
+    pass
+
+
+def make_config_file(name):
+    pass
+
+
+def create_database(name):
+    pass
+
+
+def copy_database_seed():
+    pass
+
+
+def restore_database(name):
+    pass
+
+
+def remove_database_seed():
+    pass
+
+
+def create_container(name, ports):
+    pass
+
+
+def apply_permissions(name):
+    pass
+
+
+def get_internal_ip(name):
+    pass