Browse Source

[ADD] odoo management

Gogs 7 years ago
parent
commit
b8fea00a63

+ 10 - 1
.env

@@ -4,5 +4,14 @@ DEBUG = True
 JWT_ACCEPT_HEADER = 'HTTP_AUTHORIZATION'
 JWT_PREFIX_HEADER = 'JWT'
 JWT_SECRET_KEY = '123456789'
-PLAYBOOKS_PATH = '/home/robert/workspace/playbooks/'
 DOCKER_SOCK_DIR = '/var/run/docker.sock'
+DOCKER_NETWORK = '127.0.0.1'
+ODOO_IMAGE = 'odoo:11'
+ODOO_ROOT_PATH = '/opt/odoo/'
+ODOO_DEFAULT_FOLDERS = 'config, custom-addons, files'
+ODOO_PORTS_RANGE = '10000, 30000'
+ODOO_CONF_FILENAME = 'openerp-server'
+ODOO_ADMIN_PASSWORD = '12345'
+ODOO_DB_HOST = '127.0.0.1'
+ODOO_DB_USER = 'postgres'
+ODOO_DB_PASSWORD = '54321'

+ 0 - 1
api/resources/docker_resource.py

@@ -1,7 +1,6 @@
 # -*- coding: utf-8 -*-
 from __future__ import unicode_literals
 from django.conf.urls import url
-from django.conf import settings
 from tastypie.resources import Resource
 from tastypie.utils import trailing_slash
 from api.utils.docker_api import (

+ 58 - 0
api/resources/odoo_resource.py

@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+from django.conf.urls import url
+from tastypie.resources import Resource
+from tastypie.utils import trailing_slash
+from simplejson import JSONDecodeError
+from api.utils.odoo_api import (
+    randomize_port,
+    check_name,
+    create_folders,
+    create_configuration
+)
+import simplejson as json
+
+class OdooResource(Resource):
+    class Meta:
+        pass
+
+    '''
+    '''
+    def prepend_urls(self):
+        return [
+            url(r'^(?P<resource_name>%s)/create%s$' % (self._meta.resource_name, trailing_slash), self.wrap_view('odoo_create'), name='api_odoo_create'),
+        ]
+    
+    '''
+    '''
+    def odoo_create(self, request, **kwargs):
+        self.method_check(request, allowed='post')
+        self.is_authenticated(request)
+
+        name = None
+        try:
+            data = json.loads(request.body)
+            name = data['name']
+        except JSONDecodeError:
+            name = None
+        except KeyError:
+            name = None
+
+        if not name:
+            return self.create_response(request, {
+                'error_message': 'name is required'
+            })
+
+        name_exists = check_name(name)
+
+        if name_exists:
+            return self.create_response(request, {
+                'error_message': 'name is already exists'
+            })
+
+        create_folders(name)
+        create_configuration(name)
+
+        return self.create_response(request, {
+            'message': 'ok'
+        })

+ 40 - 0
api/templates/openerp-server.j2

@@ -0,0 +1,40 @@
+[options]
+addons_path = /mnt/extra-addons,/usr/lib/python2.7/dist-packages/openerp/addons
+data_dir = /var/lib/odoo
+; auto_reload = True
+admin_passwd = {{ admin_password }}
+; csv_internal_sep = ,
+; db_maxconn = 64
+db_name = {{ db_name }}
+db_user = {{ db_user }}
+db_password = {{ db_password }}
+; db_template = template1
+dbfilter = ^{{ db_name }}$
+; debug_mode = False
+; email_from = False
+; limit_memory_hard = 2684354560
+; limit_memory_soft = 2147483648
+; limit_request = 8192
+; limit_time_cpu = 240
+; limit_time_real = 840
+list_db = False
+; log_db = False
+; log_handler = [':INFO']
+; log_level = debug_sql
+; logfile = None
+; longpolling_port = 8072
+; max_cron_threads = 2
+; osv_memory_age_limit = 1.0
+; osv_memory_count_limit = False
+; smtp_password = False
+; smtp_port = 25
+; smtp_server = localhost
+; smtp_ssl = False
+; smtp_user = False
+; workers = 7
+; xmlrpc = True
+; xmlrpc_interface =
+; xmlrpc_port = 8069
+; xmlrpcs = True
+; xmlrpcs_interface =
+; xmlrpcs_port = 8071

+ 2 - 0
api/urls.py

@@ -11,6 +11,7 @@ from api.resources.request_resource import RequestResource
 from api.resources.task_resource import TaskResource
 from api.resources.playbook_resource import PlaybookResource
 from api.resources.docker_resource import DockerResource
+from api.resources.odoo_resource import OdooResource
 
 v1_api = Api(api_name='v1')
 v1_api.register(UserResource())
@@ -21,3 +22,4 @@ v1_api.register(RequestResource())
 v1_api.register(TaskResource())
 v1_api.register(PlaybookResource())
 v1_api.register(DockerResource())
+v1_api.register(OdooResource())

+ 1 - 1
api/utils/docker_api.py

@@ -117,7 +117,7 @@ def restart_container(id=None):
         return None
     except APIError:
         return None
-   
+
 '''
 '''
 def stop_container(id=None):

+ 88 - 0
api/utils/odoo_api.py

@@ -0,0 +1,88 @@
+from __future__ import unicode_literals
+from django.conf import settings
+from random import randint
+from jinja2 import Environment, PackageLoader, select_autoescape
+import os
+import socket
+import time
+
+'''
+'''
+def randomize_port():
+    ports = settings.ODOO_PORTS_RANGE
+    port = 0
+
+    while not check_port(port):
+        time.sleep(1)
+        port = randint(ports[0], ports[1])
+
+    return port
+    
+    
+'''
+'''
+def check_port(port=0):
+    if port == 0:
+        return False
+
+    ok = False
+    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+    try:
+        s.bind((settings.DOCKER_NETWORK, port))
+        ok = True
+    except socket.error:
+        ok = False
+    
+    s.close()
+    return ok
+
+'''
+'''
+def check_name(name=None):
+    if not name:
+        return False
+
+    full_path = os.path.join(settings.ODOO_ROOT_PATH, name)
+    return os.path.exists(full_path)
+
+'''
+'''
+def create_folders(name=None):
+    if not name:
+        return False
+
+    folders = settings.ODOO_DEFAULT_FOLDERS
+    for folder in folders:
+        full_path = os.path.join(settings.ODOO_ROOT_PATH, name, folder)
+        os.makedirs(full_path)
+        time.sleep(1)
+
+'''
+'''
+def create_configuration(name=None):
+    if not name:
+        return False
+
+    conf_path = os.path.join(settings.ODOO_ROOT_PATH, name, 'config')
+
+    if not os.path.exists(conf_path):
+        return False
+
+    env = Environment(
+        loader=PackageLoader('api', 'templates'),
+        autoescape=select_autoescape(['j2'])
+    )
+
+    template = env.get_template(settings.ODOO_CONF_FILENAME + '.j2')
+
+    template_rendered = template.stream({
+        'admin_password': settings.ODOO_ADMIN_PASSWORD, 
+        'db_name': name, 
+        'db_user': settings.ODOO_DB_USER, 
+        'db_password': settings.ODOO_DB_PASSWORD
+    })
+
+    template_rendered.dump(os.path.join(conf_path, settings.ODOO_CONF_FILENAME + '.conf'))
+
+    return True

+ 10 - 26
odoo_control/settings.py

@@ -4,7 +4,6 @@ from decouple import config, Csv
 import os
 
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
 INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
@@ -18,7 +17,6 @@ INSTALLED_APPS = [
     'api.apps.ApiConfig',
     'corsheaders',
 ]
-
 MIDDLEWARE = [
     'corsheaders.middleware.CorsMiddleware',
     'django.middleware.security.SecurityMiddleware',
@@ -29,9 +27,7 @@ MIDDLEWARE = [
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
 ]
-
 ROOT_URLCONF = 'odoo_control.urls'
-
 TEMPLATES = [
     {
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
@@ -47,16 +43,13 @@ TEMPLATES = [
         },
     },
 ]
-
 WSGI_APPLICATION = 'odoo_control.wsgi.application'
-
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': os.path.join(BASE_DIR, 'app.db'),
     }
 }
-
 AUTH_PASSWORD_VALIDATORS = [
     {
         'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
@@ -71,38 +64,29 @@ AUTH_PASSWORD_VALIDATORS = [
         'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
     },
 ]
-
 AUTH_USER_MODEL = 'core.User'
-
 LANGUAGE_CODE = 'es-PY'
-
 TIME_ZONE = 'UTC'
-
 USE_I18N = True
-
 USE_L10N = True
-
 USE_TZ = True
-
 STATIC_URL = '/static/'
-
 TASTYPIE_DEFAULT_FORMATS = ['json', 'xml']
-
 SECRET_KEY = config('SECRET_KEY')
-
 ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
-
 CORS_ORIGIN_ALLOW_ALL = True
-
 DEBUG = config('DEBUG', default=False, cast=bool)
-
 JWT_ACCEPT_HEADER = config('JWT_ACCEPT_HEADER')
-
 JWT_PREFIX_HEADER = config('JWT_PREFIX_HEADER')
-
 JWT_SECRET_KEY = config('JWT_SECRET_KEY')
-
-PLAYBOOKS_PATH = config('PLAYBOOKS_PATH')
-
 DOCKER_SOCK_DIR = config('DOCKER_SOCK_DIR')
-
+DOCKER_NETWORK = config('DOCKER_NETWORK')
+ODOO_IMAGE = config('ODOO_IMAGE')
+ODOO_ROOT_PATH = config('ODOO_ROOT_PATH')
+ODOO_DEFAULT_FOLDERS = config('ODOO_DEFAULT_FOLDERS', cast=Csv())
+ODOO_PORTS_RANGE = config('ODOO_PORTS_RANGE', cast=Csv(int))
+ODOO_CONF_FILENAME = config('ODOO_CONF_FILENAME', 'openerp-server')
+ODOO_ADMIN_PASSWORD = config('ODOO_ADMIN_PASSWORD', 'admin')
+ODOO_DB_HOST = config('ODOO_DB_HOST', 'localhost')
+ODOO_DB_USER = config('ODOO_DB_USER', 'postgres')
+ODOO_DB_PASSWORD = config('ODOO_DB_PASSWORD', 'root')

+ 3 - 0
requirements.txt

@@ -5,6 +5,7 @@ certifi==2018.1.18
 chardet==3.0.4
 configparser==3.5.0
 Django==1.11
+django-cors-headers==2.2.0
 django-extensions==2.0.0
 django-tastypie==0.14.0
 docker==3.0.1
@@ -14,7 +15,9 @@ futures==3.2.0
 idna==2.6
 ipaddress==1.0.19
 isort==4.3.4
+Jinja2==2.10
 lazy-object-proxy==1.3.1
+MarkupSafe==1.0
 mccabe==0.6.1
 pkg-resources==0.0.0
 PyJWT==1.5.3