You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by sh...@apache.org on 2025/01/06 10:00:28 UTC
(unomi) 07/24: Merge remote-tracking branch 'origin/master' into opensearch-persistence
This is an automated email from the ASF dual-hosted git repository.
shuber pushed a commit to branch opensearch-persistence
in repository https://gitbox.apache.org/repos/asf/unomi.git
commit d3f3d528a716d541f2bb6e242cea5840a77d4d5f
Merge: 9a2a6c45d 5947ed04e
Author: Serge Huber <sh...@jahia.com>
AuthorDate: Thu Dec 5 10:47:45 2024 +0100
Merge remote-tracking branch 'origin/master' into opensearch-persistence
# Conflicts:
# graphql/graphql-playground/yarn.lock
# itests/src/test/java/org/apache/unomi/itests/BaseIT.java
# manual/src/main/asciidoc/graphql.adoc
# persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/ElasticsearchPersistenceTest.java
# persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/ConditionContextHelper.java
# persistence-spi/src/main/java/org/apache/unomi/persistence/spi/conditions/ConditionEvaluatorDispatcherImpl.java
# tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java
.../graphql-playground/src/main/webapp/index.css | 45 -
graphql/graphql-playground/yarn.lock | 5506 --------------------
.../{graphql-playground => graphql-ui}/.babelrc | 0
.../package.json | 30 +-
graphql/{graphql-playground => graphql-ui}/pom.xml | 8 +-
.../src/main/resources/assets/js}/index.jsx | 34 +-
.../src/main/webapp/index.html | 41 +-
.../webpack.config.js | 41 +-
.../test/java/org/apache/unomi/itests/BaseIT.java | 23 -
.../ElasticsearchPersistenceTest.java | 175 +
.../spi/conditions/ConditionContextHelper.java | 2 +-
.../ConditionEvaluatorDispatcherImpl.java | 2 +-
.../unomi/rest/endpoints/RulesServiceEndPoint.java | 2 +-
.../services/impl/rules/RulesServiceImpl.java | 2 +-
.../internal/UnomiManagementServiceImpl.java | 24 +-
15 files changed, 272 insertions(+), 5663 deletions(-)
diff --cc persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/ElasticsearchPersistenceTest.java
index 000000000,9c65328d8..c80734f94
mode 000000,100644..100644
--- a/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/ElasticsearchPersistenceTest.java
+++ b/persistence-elasticsearch/core/src/test/java/org/apache/unomi/persistence/elasticsearch/ElasticsearchPersistenceTest.java
@@@ -1,0 -1,175 +1,175 @@@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ package org.apache.unomi.persistence.elasticsearch;
+
+ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope;
+ import org.apache.http.HttpHost;
+ import org.elasticsearch.action.ActionRequestValidationException;
+ import org.elasticsearch.action.index.IndexRequest;
+ import org.elasticsearch.action.index.IndexResponse;
+ import org.elasticsearch.client.RequestOptions;
+ import org.elasticsearch.client.RestClient;
+ import org.elasticsearch.client.RestHighLevelClient;
+ import org.elasticsearch.client.core.MainResponse;
+ import org.elasticsearch.client.indices.CreateIndexRequest;
+ import org.elasticsearch.client.indices.CreateIndexResponse;
+ import org.elasticsearch.cluster.ClusterName;
+ import org.elasticsearch.common.network.NetworkModule;
+ import org.elasticsearch.common.settings.Settings;
+ import org.elasticsearch.common.xcontent.XContentType;
+ import org.elasticsearch.core.internal.io.IOUtils;
+ import org.elasticsearch.env.Environment;
+ import org.elasticsearch.node.MockNode;
+ import org.elasticsearch.node.Node;
+ import org.elasticsearch.rest.RestStatus;
+ import org.elasticsearch.transport.Netty4Plugin;
+ import org.junit.AfterClass;
+ import org.junit.Assert;
+ import org.junit.BeforeClass;
+ import org.junit.Test;
+ import org.junit.runner.RunWith;
+
+ import java.util.Arrays;
+ import java.util.Collection;
+ import java.util.Date;
+ import java.util.UUID;
+ import java.util.logging.Logger;
+
+ @RunWith(com.carrotsearch.randomizedtesting.RandomizedRunner.class)
+ @ThreadLeakScope(value = ThreadLeakScope.Scope.NONE)
+ public class ElasticsearchPersistenceTest {
+
- private static final Logger LOGGER = Logger.getLogger(ElasticsearchPersistenceTest.class.getName());
++ private static final Logger logger = Logger.getLogger(ElasticsearchPersistenceTest.class.getName());
+
+ private static final String CLUSTER_NAME = "unomi-cluster-test";
+ private static final String NODE_NAME = "unomi-node-test";
+ private static final String HOST = "127.0.0.1";
+ private static final int HTTP_PORT_NODE_1 = 9200+10;
+ private static final int HTTP_PORT_NODE_2 = 9201+10;
+ private static final int TRANSPORT_PORT_NODE_1 = 9300+10;
+ private static final int TRANSPORT_PORT_NODE_2 = 9301+10;
+
+ private static RestHighLevelClient restHighLevelClient;
+
+ private static Node node1;
+ private static Node node2;
+
+ @BeforeClass
+ public static void setup() throws Exception {
+ Collection plugins = Arrays.asList(Netty4Plugin.class);
+
+ Settings settingsNode1 = Settings.builder()
+ .put(ClusterName.CLUSTER_NAME_SETTING.getKey(), CLUSTER_NAME)
+ .put(Node.NODE_NAME_SETTING.getKey(), NODE_NAME + "-1")
+ .put(NetworkModule.HTTP_TYPE_KEY, Netty4Plugin.NETTY_HTTP_TRANSPORT_NAME)
+ .put(Environment.PATH_HOME_SETTING.getKey(), "target/data-1")
+ .put(Environment.PATH_DATA_SETTING.getKey(), "target/data-1")
+ .put("network.host", HOST)
+ .put("http.port", HTTP_PORT_NODE_1)
+ .put(NetworkModule.TRANSPORT_TYPE_KEY, Netty4Plugin.NETTY_TRANSPORT_NAME)
+ .put("transport.port", TRANSPORT_PORT_NODE_1)
+ .build();
+ node1 = new MockNode(settingsNode1, plugins);
+ node1.start();
+
+ Settings settingsNode2 = Settings.builder()
+ .put(ClusterName.CLUSTER_NAME_SETTING.getKey(), CLUSTER_NAME)
+ .put(Node.NODE_NAME_SETTING.getKey(), NODE_NAME + "-2")
+ .put(NetworkModule.HTTP_TYPE_KEY, Netty4Plugin.NETTY_HTTP_TRANSPORT_NAME)
+ .put(Environment.PATH_HOME_SETTING.getKey(), "target/data-2")
+ .put(Environment.PATH_DATA_SETTING.getKey(), "target/data-2")
+ .put("network.host", HOST)
+ .put("http.port", HTTP_PORT_NODE_2)
+ .put(NetworkModule.TRANSPORT_TYPE_KEY, Netty4Plugin.NETTY_TRANSPORT_NAME)
+ .put("transport.port", TRANSPORT_PORT_NODE_2)
+ .build();
+ node2 = new MockNode(settingsNode2, plugins);
+ node2.start();
+
+ restHighLevelClient = new RestHighLevelClient(RestClient.builder(
+ new HttpHost(HOST, HTTP_PORT_NODE_1, "http"),
+ new HttpHost(HOST, HTTP_PORT_NODE_2, "http")));
+ }
+
+ @AfterClass
+ public static void teardown() throws Exception {
+ IOUtils.close(restHighLevelClient);
+ if (node1 != null) {
+ node1.close();
+ }
+ if (node2 != null) {
+ node2.close();
+ }
+ }
+
+ @Test
+ public void testGetClusterInfo() throws Exception {
+ MainResponse response = restHighLevelClient.info(RequestOptions.DEFAULT);
- LOGGER.info("Cluster getMinimumIndexCompatibilityVersion: " + response.getVersion().getMinimumIndexCompatibilityVersion());
- LOGGER.info("Cluster getMinimumWireCompatibilityVersion: " + response.getVersion().getMinimumWireCompatibilityVersion());
- LOGGER.info("Cluster number: " + response.getVersion().getNumber());
++ logger.info("Cluster getMinimumIndexCompatibilityVersion: " + response.getVersion().getMinimumIndexCompatibilityVersion());
++ logger.info("Cluster getMinimumWireCompatibilityVersion: " + response.getVersion().getMinimumWireCompatibilityVersion());
++ logger.info("Cluster number: " + response.getVersion().getNumber());
+ }
+
+ @Test
+ public void testCreateIndex() throws Exception {
+ restHighLevelClient.info(RequestOptions.DEFAULT.toBuilder().addHeader("name", "value").build());
+ final String indexName = "unomi-index-" + new Date().getTime();
+ CreateIndexRequest request = new CreateIndexRequest(indexName);
+ CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
+ if (response.isAcknowledged()) {
- LOGGER.info(">>> Create index :: ok :: name = " + response.index());
++ logger.info(">>> Create index :: ok :: name = " + response.index());
+ } else {
- LOGGER.info(">>> Create index :: not acknowledged");
++ logger.info(">>> Create index :: not acknowledged");
+ }
+
+ // ClusterHealthResponse actionGet = restHighLevelClient.cluster()
+ // .health(Requests.clusterHealthRequest("unomi-index-1").waitForGreenStatus().waitForEvents(Priority.LANGUID)
+ // .waitForNoRelocatingShards(true), RequestOptions.DEFAULT);
+ // Assert.assertNotNull(actionGet);
+ //
+ // switch (actionGet.getStatus()) {
+ // case GREEN:
+ // logger.info(">>> Cluster State :: GREEN");
+ // break;
+ // case YELLOW:
+ // logger.info(">>> Cluster State :: YELLOW");
+ // break;
+ // case RED:
+ // logger.info(">>> Cluster State :: RED");
+ // break;
+ // }
+ // Assert.assertNotEquals(actionGet.getStatus(), ClusterHealthStatus.RED);
+
+ IndexRequest indexRequest = new IndexRequest(indexName);
+ indexRequest.id(UUID.randomUUID().toString());
+ String type = "{\"type\":\"unomi-type\"}";
+ String source = "{\"name\":\"unomi-name\"}";
+ indexRequest.source(XContentType.JSON, type, source);
+ ActionRequestValidationException exception = indexRequest.validate();
+ Assert.assertNull(exception);
+
+ IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
+ Assert.assertNotNull(indexResponse);
+ if (indexResponse.status() == RestStatus.CREATED) {
- LOGGER.info(">>> Insert data created");
++ logger.info(">>> Insert data created");
+ } else {
- LOGGER.info(">>> Insert data ko :: " + indexResponse.status().name());
++ logger.info(">>> Insert data ko :: " + indexResponse.status().name());
+ }
+ Assert.assertEquals(indexResponse.status(), RestStatus.CREATED);
+ }
+
+ }
diff --cc tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java
index ad6d9d355,fbab16cd3..fa95a8d9d
--- a/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java
+++ b/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java
@@@ -27,12 -27,14 +27,14 @@@ import org.osgi.service.component.annot
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
/**
+ * TODO We really should replace this with Karaf Features that we activate. We could still keep the starting mechanism
+ * to work properly with the migration process but we should remove the hardcoded list of packages in this class.
* @author dgaillard
*/
@Component(service = UnomiManagementService.class, immediate = true)
@@@ -51,16 -52,20 +55,20 @@@ public class UnomiManagementServiceImp
@Activate
public void init(ComponentContext componentContext) throws Exception {
- this.bundleContext = componentContext.getBundleContext();
- initReversedBundleSymbolicNames();
+ try {
+ this.bundleContext = componentContext.getBundleContext();
+ initReversedBundleSymbolicNames();
- if (StringUtils.isNotBlank(bundleContext.getProperty("unomi.autoMigrate"))) {
- migrationService.migrateUnomi(bundleContext.getProperty("unomi.autoMigrate"), true, null);
- }
+ if (StringUtils.isNotBlank(bundleContext.getProperty("unomi.autoMigrate"))) {
+ migrationService.migrateUnomi(bundleContext.getProperty("unomi.autoMigrate"), true, null);
+ }
- if (StringUtils.isNotBlank(bundleContext.getProperty("unomi.autoStart")) &&
- bundleContext.getProperty("unomi.autoStart").equals("true")) {
- startUnomi(selectedPersistenceImplementation);
+ if (StringUtils.isNotBlank(bundleContext.getProperty("unomi.autoStart")) &&
+ bundleContext.getProperty("unomi.autoStart").equals("true")) {
- startUnomi();
++ startUnomi(selectedPersistenceImplementation);
+ }
+ } catch (Exception e) {
+ LOGGER.error("Error during Unomi startup when processing 'unomi.autoMigrate' or 'unomi.autoStart' properties:", e);
}
}