From 66f61640257c656c461882eab3ca893bae896ec9 Mon Sep 17 00:00:00 2001 From: Xavier Bouquiaux Date: Thu, 9 Mar 2023 10:02:03 +0100 Subject: [PATCH] [ADD] opensearch support --- connector_elasticsearch/components/adapter.py | 40 ++++++++++++------- .../models/se_backend_elasticsearch.py | 33 +++++++++------ .../views/se_backend_elasticsearch.xml | 20 +++++++++- 3 files changed, 65 insertions(+), 28 deletions(-) diff --git a/connector_elasticsearch/components/adapter.py b/connector_elasticsearch/components/adapter.py index 4ce8bf83..3f940582 100644 --- a/connector_elasticsearch/components/adapter.py +++ b/connector_elasticsearch/components/adapter.py @@ -4,6 +4,7 @@ import logging from odoo import _, exceptions +from odoo.exceptions import UserError from odoo.addons.component.core import Component @@ -37,20 +38,31 @@ def _es_connection_class(self): def _get_es_client(self): backend = self.backend_record - api_key = ( - (backend.api_key_id, backend.api_key) - if backend.api_key_id and backend.api_key - else None - ) - if not backend.es_server_host: - raise exceptions.UserError(_("No ElasticSearch host defined")) - # UserError to be consistent with - # se_backend_elasticsearch.py - return elasticsearch.Elasticsearch( - [backend.es_server_host], - connection_class=self._es_connection_class, - api_key=api_key, - ) + + if backend.is_http_authentication: + if backend.es_user and backend.es_password: + auth = (backend.es_user, backend.es_password) + es = elasticsearch.Elasticsearch( + [backend.es_server_host], http_auth=auth + ) + else: + es = elasticsearch.Elasticsearch([backend.es_server_host]) + + if not es.ping(): # pragma: no cover + raise UserError(_("Connect Exception with elasticsearch")) + + return es + else: + api_key = ( + (backend.api_key_id, backend.api_key) + if backend.api_key_id and backend.api_key + else None + ) + return elasticsearch.Elasticsearch( + [backend.es_server_host], + connection_class=self._es_connection_class, + api_key=api_key, + ) def index(self, records): es = self._get_es_client() diff --git a/connector_elasticsearch/models/se_backend_elasticsearch.py b/connector_elasticsearch/models/se_backend_elasticsearch.py index 6cc42c1e..00a14ecd 100644 --- a/connector_elasticsearch/models/se_backend_elasticsearch.py +++ b/connector_elasticsearch/models/se_backend_elasticsearch.py @@ -1,6 +1,5 @@ # Copyright 2019 ACSONE SA/NV # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - from elasticsearch import AuthenticationException, NotFoundError from odoo import _, fields, models @@ -28,29 +27,39 @@ class SeBackendElasticsearch(models.Model): tech_name = fields.Char( related="se_backend_id.tech_name", store=True, readonly=False ) + + is_http_authentication = fields.Boolean( + string="use http authentication", default=False + ) + api_key_id = fields.Char(help="Elasticsearch Api Key ID", string="Api Key ID") api_key = fields.Char(help="Elasticsearch Api Key") + es_user = fields.Char(help="Leave blank if not using http authentication.") + es_password = fields.Char(help="Leave blank if not using http authentication.") + @property def _server_env_fields(self): env_fields = super()._server_env_fields - env_fields.update({"es_server_host": {}}) + env_fields.update({"es_server_host": {}, "es_user": {}, "es_password": {}}) return env_fields def action_test_connection(self): with self.specific_backend.work_on(self._name) as work: adapter = work.component(usage="se.backend.adapter") es = adapter._get_es_client() - try: - es.security.authenticate() - except NotFoundError: - raise UserError(_("Unable to reach host.")) - except AuthenticationException: - raise UserError(_("Unable to authenticate. Check credentials.")) - except Exception as e: - raise UserError( - _("Unable to connect to ElasticSearch:") + "\n\n" + repr(e) - ) + + if not self.is_http_authentication: + try: + es.security.authenticate() + except NotFoundError: + raise UserError(_("Unable to reach host.")) + except AuthenticationException: + raise UserError(_("Unable to authenticate. Check credentials.")) + except Exception as e: + raise UserError( + _("Unable to connect to ElasticSearch:") + "\n\n" + repr(e) + ) return { "type": "ir.actions.client", "tag": "display_notification", diff --git a/connector_elasticsearch/views/se_backend_elasticsearch.xml b/connector_elasticsearch/views/se_backend_elasticsearch.xml index c38c22dd..3ca05bbf 100644 --- a/connector_elasticsearch/views/se_backend_elasticsearch.xml +++ b/connector_elasticsearch/views/se_backend_elasticsearch.xml @@ -18,8 +18,24 @@ string="Host" placeholder="http://elastic:9200" /> - - + + + + +