Skip to content

Commit 2b7aa27

Browse files
committed
doc: update documentation for distribution
diff --git c/manual/src/main/asciidoc/configuration.adoc i/manual/src/main/asciidoc/configuration.adoc index b3d97a9..4d923ad 100644 --- c/manual/src/main/asciidoc/configuration.adoc +++ i/manual/src/main/asciidoc/configuration.adoc @@ -876,60 +876,143 @@ The following permissions are required by Unomi: - required cluster privileges: `manage` OR `all` - required index privileges on unomi indices: `write, manage, read` OR `all` -=== Customizing Start Features Configuration +=== Unomi Distribution (features configuration) -Apache Unomi allows you to customize which features and bundles are installed and started when using the `unomi:start` command. This is controlled through the `org.apache.unomi.start.cfg` configuration file. +You can define a specific distribution for Apache Unomi to configure desired features when the server boots up. Is it a classic Karaf feature that defines desired features for Unomi. +Be aware that, even if a distribution is a classic Karaf feature XML file, it must only be composed feature's dependencies as this file is interpreted by the Unomi ManagementService. +No bundle nor config file will be processed from this file. -==== Default Configuration +To set the desired distribution, set the `unomi.distribution` system property or `UNOMI_DISTRIBUTION` environment variable to the name of your desired distribution. +You can also use the dedicated `unomi:setup` command to set the distribution interactively. -By default, Apache Unomi comes with two predefined start features configurations: +Apache Unomi comes with some predefined distributions that you can use directly. -[source] ----- -startFeatures = [ - "elasticsearch=unomi-base,unomi-startup,unomi-elasticsearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-elasticsearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-plugins-optimization-test,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete", - "opensearch=unomi-base,unomi-startup,unomi-opensearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-opensearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-plugins-optimization-test,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete" -] ----- +==== Default Distributions -**Key Differences Between Configurations:** +By default, Apache Unomi comes with four predefined distributions: + +unomi-distribution-elasticsearch, unomi-distribution-elasticsearch-graphql, unomi-distribution-opensearch, unomi-distribution-opensearch-graphql + +**Key Differences Between Distributions:** The only difference between the Elasticsearch and OpenSearch configurations is the persistence layer: * **Elasticsearch**: Uses `unomi-elasticsearch-core` and `unomi-elasticsearch-conditions` * **OpenSearch**: Uses `unomi-opensearch-core` and `unomi-opensearch-conditions` -All other features remain identical between both configurations. +All other features remain identical between both configurations. Each one is derived with or without GraphQL support. -==== Environment-Specific Configurations +==== Environment-Specific Distributions -You can create different configurations for different deployment environments by including or excluding certain features: +You can create different distributions for different deployment environments by creating a dedicated distribution feature. + +Be aware that in distribution's feature, you should only reference other features, not bundles or configuration directly. **Development Environment** (includes development tools and debugging features): -[source] +[source,xml] ---- -startFeatures = [ - "elasticsearch-dev=unomi-base,unomi-startup,unomi-elasticsearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-elasticsearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-plugins-optimization-test,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete", - "opensearch-dev=unomi-base,unomi-startup,unomi-opensearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-opensearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-plugins-optimization-test,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete" -] +<features name="unomi-distributions" xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.6.0 https://karaf.apache.org/xmlns/features/v1.6.0"> + + <repository>mvn:org.apache.karaf.features/specs/${karaf.version}/xml/features</repository> + <repository>mvn:org.apache.cxf.karaf/apache-cxf/${cxf.version}/xml/features</repository> + <repository>mvn:org.apache.unomi/unomi-kar/${project.version}/xml/features</repository> + + <feature name="unomi-distribution-elasticsearch-dev" description="Apache Unomi :: ElasticSearch Development Distribution" version="${project.version}"> + <feature dependency="true" version="${project.version}">unomi-base</feature> + <feature dependency="true" version="${project.version}">unomi-startup</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-core</feature> + <feature dependency="true" version="${project.version}">unomi-persistence-core</feature> + <feature dependency="true" version="${project.version}">unomi-services</feature> + <feature dependency="true" version="${project.version}">unomi-rest-api</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-base</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-request</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-mail</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-optimization-test</feature> + <feature dependency="true" version="${project.version}">unomi-shell-dev-commands</feature> + <feature dependency="true" version="${project.version}">unomi-wab</feature> + <feature dependency="true" version="${project.version}">unomi-web-tracker</feature> + <feature dependency="true" version="${project.version}">unomi-healthcheck-elasticsearch</feature> + <feature dependency="true" version="${project.version}">unomi-router-karaf-feature</feature> + <feature dependency="true" version="${project.version}">unomi-groovy-actions</feature> + <feature dependency="true" version="${project.version}">unomi-rest-ui</feature> + <feature dependency="true" version="${project.version}">unomi-startup-complete</feature> + </feature> +</features> ---- **Staging Environment** (production-like but with some development features): -[source] +[source,xml] ---- -startFeatures = [ - "elasticsearch-staging=unomi-base,unomi-startup,unomi-elasticsearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-elasticsearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete", - "opensearch-staging=unomi-base,unomi-startup,unomi-opensearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-opensearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete" -] +<features name="unomi-distributions" xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.6.0 https://karaf.apache.org/xmlns/features/v1.6.0"> + + <repository>mvn:org.apache.karaf.features/specs/${karaf.version}/xml/features</repository> + <repository>mvn:org.apache.cxf.karaf/apache-cxf/${cxf.version}/xml/features</repository> + <repository>mvn:org.apache.unomi/unomi-kar/${project.version}/xml/features</repository> + + <feature name="unomi-distribution-elasticsearch-staging" description="Apache Unomi :: ElasticSearch Staging Distribution" version="${project.version}"> + <feature dependency="true" version="${project.version}">unomi-base</feature> + <feature dependency="true" version="${project.version}">unomi-startup</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-core</feature> + <feature dependency="true" version="${project.version}">unomi-persistence-core</feature> + <feature dependency="true" version="${project.version}">unomi-services</feature> + <feature dependency="true" version="${project.version}">unomi-rest-api</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-base</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-request</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-mail</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-optimization-test</feature> + <feature dependency="true" version="${project.version}">unomi-shell-dev-commands</feature> + <feature dependency="true" version="${project.version}">unomi-wab</feature> + <feature dependency="true" version="${project.version}">unomi-web-tracker</feature> + <feature dependency="true" version="${project.version}">unomi-healthcheck-elasticsearch</feature> + <feature dependency="true" version="${project.version}">unomi-router-karaf-feature</feature> + <feature dependency="true" version="${project.version}">unomi-groovy-actions</feature> + <feature dependency="true" version="${project.version}">unomi-rest-ui</feature> + <feature dependency="true" version="${project.version}">unomi-startup-complete</feature> + </feature> +</features> ---- **Production Environment** (minimal, secure configuration): -[source] +[source,xml] ---- -startFeatures = [ - "elasticsearch-prod=unomi-base,unomi-startup,unomi-elasticsearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-elasticsearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete", - "opensearch-prod=unomi-base,unomi-startup,unomi-opensearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-opensearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete" -] +<features name="unomi-distributions" xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.6.0 https://karaf.apache.org/xmlns/features/v1.6.0"> + + <repository>mvn:org.apache.karaf.features/specs/${karaf.version}/xml/features</repository> + <repository>mvn:org.apache.cxf.karaf/apache-cxf/${cxf.version}/xml/features</repository> + <repository>mvn:org.apache.unomi/unomi-kar/${project.version}/xml/features</repository> + + <feature name="unomi-distribution-elasticsearch-prod" description="Apache Unomi :: ElasticSearch Production Distribution" version="${project.version}"> + <feature dependency="true" version="${project.version}">unomi-base</feature> + <feature dependency="true" version="${project.version}">unomi-startup</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-core</feature> + <feature dependency="true" version="${project.version}">unomi-persistence-core</feature> + <feature dependency="true" version="${project.version}">unomi-services</feature> + <feature dependency="true" version="${project.version}">unomi-rest-api</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-base</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-request</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-mail</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-optimization-test</feature> + <feature dependency="true" version="${project.version}">unomi-wab</feature> + <feature dependency="true" version="${project.version}">unomi-web-tracker</feature> + <feature dependency="true" version="${project.version}">unomi-healthcheck-elasticsearch</feature> + <feature dependency="true" version="${project.version}">unomi-router-karaf-feature</feature> + <feature dependency="true" version="${project.version}">unomi-groovy-actions</feature> + <feature dependency="true" version="${project.version}">unomi-rest-ui</feature> + <feature dependency="true" version="${project.version}">unomi-startup-complete</feature> + </feature> +</features> ---- **Environment Differences Summary:** @@ -949,37 +1032,32 @@ startFeatures = [ |✗ (excluded) |=== -==== Configuration Format +==== Distribution Feature Format -Each start features configuration follows this format: +Each start features configuration follows the classic Karaf features XML format, but you must only reference other features in your distribution feature. +If you reference bundles or configuration files directly, they will be ignored by Unomi. + +To use a custom distribution, the corresponding feature must be accessible by Karaf. It can be done by publishing the feature maven artefact and adding it as a feature repository in Karaf os for any other feature. Of course you can also add your distribution feature in the existing source code and repackage Unomi making it available directly. + +==== Using Custom Distributions + +You can use your custom distribution with: [source] ---- -"configuration-name=feature1,feature2,feature3,..." +# Using system property +-Dunomi.distribution=unomi-distribution-elasticsearch + +# Using environment variable +UNOMI_DISTRIBUTION=unomi-distribution-opensearch + +# Using the setup command +unomi:setup unomi-distribution-elasticsearch-staging ---- -Where: -* `configuration-name` is the identifier you'll use with the `unomi:start` command -* The comma-separated list contains the Karaf features to install and start - -==== Using Custom Configurations - -You can use your custom configurations with: - -[source] ----- -# Development environment -unomi:start elasticsearch-dev -unomi:start opensearch-dev - -# Staging environment -unomi:start elasticsearch-staging -unomi:start opensearch-staging - -# Production environment -unomi:start elasticsearch-prod -unomi:start opensearch-prod ----- +Once you have called the `unomi:setup` command with your desired distribution, you can start Apache Unomi using the `unomi:start` command. +The setup command only needs to be called once unless you want to change the distribution ; it creates a marker file to remember the chosen distribution. +In case you want to change it, you can use the `unomi:setup --force` command again with the desired distribution name (using the --force option will override the existing distribution). ==== Auto-Start @@ -989,27 +1067,17 @@ To enable auto-start, set the `unomi.autoStart` system property or `UNOMI_AUTO_S Note: Auto-start only works when Apache Unomi is not already running. If the server is already started, the auto-start setting will be ignored. -==== Unomi Distribution +=== Customizing Apache Unomi Distribution -You can define a specific distribution for Apache Unomi to configure desired features when the server boots up. Is it a classic Karaf feature that defines desired features for Unomi. -Be aware that, even if a distribution is a classic Karaf feature XML file, it must only be composed feature's dependencies as this file is interpreted by the Unomi ManagementService. -No bundle nor config file will be processed from this file. +Apache Unomi allows you to create custom distributions by repackaging the standard distribution with your own configuration files and customizations. This is useful for creating deployment-specific packages that include your custom configurations, plugins, and settings. -To set the desired distribution, set the `unomi.distribution` system property or `UNOMI_DISTRIBUTION` environment variable to the name of your desired distribution: +==== Note on Custom Distributions (Advanced) -[source] ----- -# Using system property --Dunomi.distribution=unomi-distribution-elasticsearch +You can build custom distributions of Unomi using the Karaf Maven Plugin to assemble features and overlay configuration. This is an advanced path and not required for most users. We recommend Docker-based packaging and configuration overrides as documented above. -# Using environment variable (Docker) -UNOMI_DISTRIBUTION=unomi-distribution-opensearch +For details about custom distributions, see the Karaf documentation (Karaf Maven Plugin): -# Using custom distribution -UNOMI_DISTRIBUTION=unomi-distribution-elasticsearch-staging ----- - -To use a custom distribution, the corresponding feature must be accessible by Karaf. It can be done by publishing the feature maven artefact and adding it as a feature repository in Karaf os for any other feature. Of course you can also add your distribution feature in the existing source code and repackage Unomi making it available directly. +`https://karaf.apache.org/manual/latest/#_karaf_maven_plugin` ==== Important Notes @@ -1059,18 +1127,6 @@ services: - Declare the feature repository in Karaf using KARAF_FEATURES_REPOSITORIES environment variable pointing to your mounted file or a online maven artifact (mvn:com.example/custom-unomi-distribs/1.0.0/xml/features) - Use the `UNOMI_DISTRIBUTION` environment variable to specify which distribution (using the feature name) to use from that feature's repository -=== Customizing Apache Unomi Distribution - -Apache Unomi allows you to create custom distributions by repackaging the standard distribution with your own configuration files and customizations. This is useful for creating deployment-specific packages that include your custom configurations, plugins, and settings. - -==== Note on Custom Distributions (Advanced) - -You can build custom distributions of Unomi using the Karaf Maven Plugin to assemble features and overlay configuration. This is an advanced path and not required for most users. We recommend Docker-based packaging and configuration overrides as documented above. - -For details about custom distributions, see the Karaf documentation (Karaf Maven Plugin): - -`https://karaf.apache.org/manual/latest/#_karaf_maven_plugin` - ==== Configuration Override Priority Apache Unomi follows this priority order for configuration files (highest to lowest priority): diff --git c/manual/src/main/asciidoc/shell-commands.adoc i/manual/src/main/asciidoc/shell-commands.adoc index 5bcb32d..515d63c 100644 --- c/manual/src/main/asciidoc/shell-commands.adoc +++ i/manual/src/main/asciidoc/shell-commands.adoc @@ -65,6 +65,11 @@ The commands control the lifecycle of the Apache Unomi server and are used to mi |=== |Command|Arguments|Description +|setup +|distribution-feature-name,--force +|This command must be used only when the Apache Unomi application is NOT STARTED. It will perform initial setup of the application +using the specified distribution feature name (unomi-distribution-elasticsearch for example). + |migrate |fromVersion |This command must be used only when the Apache Unomi application is NOT STARTED. It will perform migration of the data stored in search engine using the argument fromVersion as a starting point. @@ -74,8 +79,8 @@ The commands control the lifecycle of the Apache Unomi server and are used to mi |Shutsdown the Apache Unomi application |start -|startFeatures -|Starts the Apache Unomi application with the specified start features configuration (elasticsearch or opensearch). Note that this state will be remembered between Apache Karaf launches, so in general it is only needed after a first installation or after a `migrate` command +|n/a +|Starts the Apache Unomi application with the specified distribution (or by default unomi-distribution-elasticsearch). Note that this state will be remembered between Apache Karaf launches, so in general it is only needed after a first installation |version |n/a @@ -195,4 +200,4 @@ and interactive mode except that it undeploys definitions instead of deploying t working on a plugin. For example to remove all the definitions deployed by a plugin you can simply use the following command: `undeploy-definition BUNDLE_ID * *` when `BUNDLE_ID` is the identifier of the bundle that contains your plugin. -|=== \ No newline at end of file +|=== diff --git c/manual/src/main/asciidoc/writing-plugins.adoc i/manual/src/main/asciidoc/writing-plugins.adoc index c2b49fe..b485f0c 100644 --- c/manual/src/main/asciidoc/writing-plugins.adoc +++ i/manual/src/main/asciidoc/writing-plugins.adoc @@ -162,14 +162,40 @@ OpenSearch Bundle (my-plugin-opensearch): ==== Configuration and Deployment -Administrators can control which search engine implementation to use through the `org.apache.unomi.start.cfg` configuration file. This file determines which features (including your plugin's bundles) are deployed based on the chosen search engine: +Administrators can control which search engine implementation to use by setting up a distribution. This distribution 'macro' feature determines which features (including your plugin's bundles) are deployed based on the chosen search engine: -[source] +[source,xml] ---- -startFeatures = [ - "elasticsearch=unomi-persistence-elasticsearch,my-plugin-elasticsearch,unomi-services,...", - "opensearch=unomi-persistence-opensearch,my-plugin-opensearch,unomi-services,..." -] +<features> + <feature name="my-plugin-feature" version="${project.version}"> + <bundle>mvn:my.group.id/my-plugin-common/${project.version}</bundle> + <bundle>mvn:my.group.id/my-plugin-${search.engine}/${project.version}</bundle> + </feature> + + <feature name="my-unomi-distribution-with-my-plugin" version="${project.version}"> + <feature dependency="true" version="${project.version}">unomi-base</feature> + <feature dependency="true" version="${project.version}">unomi-startup</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-core</feature> + <feature dependency="true" version="${project.version}">unomi-persistence-core</feature> + <feature dependency="true" version="${project.version}">unomi-services</feature> + <feature dependency="true" version="${project.version}">unomi-rest-api</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-base</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-request</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-mail</feature> + <feature dependency="true" version="${project.version}">unomi-wab</feature> + <feature dependency="true" version="${project.version}">unomi-web-tracker</feature> + <feature dependency="true" version="${project.version}">unomi-healthcheck-elasticsearch</feature> + <feature dependency="true" version="${project.version}">unomi-router-karaf-feature</feature> + <feature dependency="true" version="${project.version}">unomi-groovy-actions</feature> + <feature dependency="true" version="${project.version}">unomi-rest-ui</feature> + <feature dependency="true" version="${project.version}">unomi-startup-complete</feature> + <feature dependency="true" version="${project.version}">my-plugin-feature</feature> + </feature> +</features> ---- ==== Custom Plugins @@ -680,14 +706,14 @@ import org.apache.unomi.persistence.elasticsearch.ConditionESQueryBuilderDispatc import java.util.Map; public class MyCustomQueryBuilder implements ConditionESQueryBuilder { - + @OverRide - public Query buildQuery(Condition condition, Map<String, Object> context, + public Query buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { // Get parameters from the condition String fieldName = (String) condition.getParameter("fieldName"); String fieldValue = (String) condition.getParameter("fieldValue"); - + // Build Elasticsearch-specific query using the new client return Query.of(q -> q .bool(b -> b @@ -700,9 +726,9 @@ public class MyCustomQueryBuilder implements ConditionESQueryBuilder { ) ); } - + @OverRide - public long count(Condition condition, Map<String, Object> context, + public long count(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) { // Implement count logic if needed return 0; @@ -723,14 +749,14 @@ import org.apache.unomi.persistence.opensearch.ConditionOSQueryBuilderDispatcher import java.util.Map; public class MyCustomQueryBuilder implements ConditionOSQueryBuilder { - + @OverRide - public Query buildQuery(Condition condition, Map<String, Object> context, + public Query buildQuery(Condition condition, Map<String, Object> context, ConditionOSQueryBuilderDispatcher dispatcher) { // Get parameters from the condition String fieldName = (String) condition.getParameter("fieldName"); String fieldValue = (String) condition.getParameter("fieldValue"); - + // Build OpenSearch-specific query return Query.of(q -> q .bool(b -> b @@ -743,9 +769,9 @@ public class MyCustomQueryBuilder implements ConditionOSQueryBuilder { ) ); } - + @OverRide - public long count(Condition condition, Map<String, Object> context, + public long count(Condition condition, Map<String, Object> context, ConditionOSQueryBuilderDispatcher dispatcher) { // Implement count logic if needed return 0; @@ -800,7 +826,7 @@ public class MyCustomQueryBuilder implements ConditionOSQueryBuilder { "multivalued": false }, { - "id": "fieldValue", + "id": "fieldValue", "type": "string", "multivalued": false } @@ -854,14 +880,14 @@ my-custom-plugin/ <artifactId>my-custom-plugin</artifactId> <version>1.0.0</version> <packaging>pom</packaging> - + <modules> <module>my-custom-plugin-common</module> <module>my-custom-plugin-elasticsearch</module> <module>my-custom-plugin-opensearch</module> <module>my-custom-plugin-features</module> </modules> - + <properties> <unomi.version>3.0.0</unomi.version> </properties> @@ -877,10 +903,10 @@ my-custom-plugin/ <artifactId>my-custom-plugin</artifactId> <version>1.0.0</version> </parent> - + <artifactId>my-custom-plugin-elasticsearch</artifactId> <packaging>bundle</packaging> - + <dependencies> <dependency> <groupId>org.apache.unomi</groupId> @@ -898,7 +924,7 @@ my-custom-plugin/ <version>1.0.0</version> </dependency> </dependencies> - + <build> <plugins> <plugin> @@ -926,14 +952,14 @@ my-custom-plugin/ ---- <?xml version="1.0" encoding="UTF-8"?> <features name="my-custom-plugin" version="1.0.0"> - + <!-- Elasticsearch feature --> <feature name="my-custom-plugin-elasticsearch" version="1.0.0"> <bundle>mvn:org.apache.unomi.plugins/my-custom-plugin-common/1.0.0</bundle> <bundle>mvn:org.apache.unomi.plugins/my-custom-plugin-elasticsearch/1.0.0</bundle> <feature>unomi-elasticsearch</feature> </feature> - + <!-- OpenSearch feature --> <feature name="my-custom-plugin-opensearch" version="1.0.0"> <bundle>mvn:org.apache.unomi.plugins/my-custom-plugin-common/1.0.0</bundle> @@ -981,24 +1007,43 @@ my-custom-plugin/ - For OpenSearch: `feature:install my-custom-plugin-opensearch` - Document dependencies and requirements clearly -==== Custom Start Configuration +==== Custom Distribution Feature -For production deployments, you can create a custom `org.apache.unomi.start.cfg` file to automatically include your plugin features in the startup configuration. This approach ensures your plugin is automatically deployed when Apache Unomi starts. +For production deployments, you can create a custom distribution's feature file to automatically include your plugin features in the startup configuration. This approach ensures your plugin is automatically deployed when Apache Unomi starts. -**Creating a Custom Start Configuration:** +**Creating a Custom Distribution Feature:** -1. **Create the configuration file** in your deployment directory: - ``` - etc/org.apache.unomi.start.cfg - ``` +1. **Create the feature file** in a dedicated maven module. You can use the unomi-distribution module as a reference. -2. **Define your custom configurations** by extending the default ones: +2. **Define your custom distribution** by extending the default ones: -[source,properties] +[source,xml] ---- -# Custom start configurations that include your plugin features -startFeatures = [ "elasticsearch=unomi-base,unomi-startup,unomi-elasticsearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-elasticsearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-plugins-optimization-test,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete,my-custom-plugin-elasticsearch", \ - "opensearch=unomi-base,unomi-startup,unomi-opensearch-core,unomi-persistence-core,unomi-services,unomi-rest-api,unomi-cxs-lists-extension,unomi-cxs-geonames-extension,unomi-cxs-privacy-extension,unomi-opensearch-conditions,unomi-plugins-base,unomi-plugins-request,unomi-plugins-mail,unomi-plugins-optimization-test,unomi-shell-dev-commands,unomi-wab,unomi-web-tracker,unomi-healthcheck,unomi-router-karaf-feature,unomi-groovy-actions,unomi-rest-ui,unomi-startup-complete,my-custom-plugin-opensearch" ] +<features name="unomi-distributions" xmlns="http://karaf.apache.org/xmlns/features/v1.6.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.6.0 https://karaf.apache.org/xmlns/features/v1.6.0"> + <feature name="unomi-distribution-custom" version="${project.version}"> + <feature dependency="true" version="${project.version}">unomi-base</feature> + <feature dependency="true" version="${project.version}">unomi-startup</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-core</feature> + <feature dependency="true" version="${project.version}">unomi-persistence-core</feature> + <feature dependency="true" version="${project.version}">unomi-services</feature> + <feature dependency="true" version="${project.version}">unomi-rest-api</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-lists-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-geonames-extension</feature> + <feature dependency="true" version="${project.version}">unomi-cxs-privacy-extension</feature> + <feature dependency="true" version="${project.version}">unomi-elasticsearch-conditions</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-base</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-request</feature> + <feature dependency="true" version="${project.version}">unomi-plugins-mail</feature> + <feature dependency="true" version="${project.version}">unomi-wab</feature> + <feature dependency="true" version="${project.version}">unomi-web-tracker</feature> + <feature dependency="true" version="${project.version}">unomi-healthcheck-elasticsearch</feature> + <feature dependency="true" version="${project.version}">unomi-router-karaf-feature</feature> + <feature dependency="true" version="${project.version}">unomi-groovy-actions</feature> + <feature dependency="true" version="${project.version}">unomi-rest-ui</feature> + <feature dependency="true" version="${project.version}">unomi-startup-complete</feature> + <feature dependency="true" version="${project.version}">custom-feature</feature> + </feature> +</features> ---- **Key Points:** @@ -1008,14 +1053,14 @@ startFeatures = [ "elasticsearch=unomi-base,unomi-startup,unomi-elasticsearch-co - **Dependency management**: Ensure your plugin features are listed after their dependencies (e.g., after `unomi-elasticsearch-core` or `unomi-opensearch-core`) -**Benefits of Custom Start Configuration:** +**Benefits of Custom Distribution Feature:** - **Automatic deployment**: Your plugin is automatically installed when Apache Unomi starts - **Consistent environments**: Ensures the same features are deployed across all environments - **Production ready**: No manual feature installation required - **Version control**: Configuration can be versioned and managed with your deployment -**Note**: For more detailed information about customizing start features configurations, including environment-specific examples, see the <<Customizing Start Features Configuration,Configuration>> section of the documentation. +**Note**: For more detailed information about custom distributions, including environment-specific examples, see the <<Custom Distribution Feature,Configuration>> section of the documentation. 6. **Migration from Legacy Implementations** - **DO NOT** use legacy mappings for custom query builders diff --git c/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/UnomiManagementService.java i/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/UnomiManagementService.java index 607f087..de76351 100644 --- c/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/UnomiManagementService.java +++ i/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/UnomiManagementService.java @@ -36,7 +36,7 @@ public interface UnomiManagementService { /** * This method will start Apache Unomi * @param mustStartFeatures true if features should be started, false if they should not - * @throws Exception if there was an error starting Unomi's bundles + * @throws Exception if there was an error starting Unomi's features */ void startUnomi(boolean mustStartFeatures) throws Exception; diff --git c/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java i/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java index 5ae3499..8d4ecae 100644 --- c/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java +++ i/tools/shell-commands/src/main/java/org/apache/unomi/shell/services/internal/UnomiManagementServiceImpl.java @@ -43,28 +43,24 @@ import java.util.concurrent.*; * * <p>This service handles the following responsibilities:</p> * <ul> - * <li>Loading configuration from the OSGi Configuration Admin service, including start features configuration and feature lists.</li> - * <li>Starting Apache Unomi by installing and starting the configured features for a selected start features configuration.</li> + * <li>Loading distribution's feature from an environment variable, a java option or by calling the setupUnomiDistribution method.</li> + * <li>Starting Apache Unomi by installing and starting the configured features for a selected distribution.</li> * <li>Stopping Apache Unomi by uninstalling features in reverse order to ensure proper teardown.</li> * <li>Interfacing with the {@link org.apache.unomi.shell.migration.MigrationService} for migration tasks during startup.</li> * </ul> * - * <p>The class is designed to be used within an OSGi environment and integrates with the Configuration Admin service - * to dynamically adjust its behavior based on external configurations. It leverages the {@link FeaturesService} to + * <p>The class is designed to be used within an OSGi environment. It leverages the {@link FeaturesService} to * manage Karaf features dynamically.</p> * * <p><b>Configuration</b></p> - * <p>The service reads its configuration from the OSGi Configuration Admin under the PID <code>org.apache.unomi.start</code>. - * The configuration includes:</p> - * <ul> - * <li><b>startFeatures</b>: A semicolon-separated list of features mapped to persistence implementations - * in the format <code>persistenceImplementation:feature1,feature2</code>.</li> - * </ul> + * <p>The service stores its distribution's name using the OSGi Configuration Admin under the PID <code>org.apache.unomi.setup</code>. + * This allows the service to persist the selected distribution across restarts. The default distribution is unomi-distribution-elasticsearch</p> * * <p><b>Usage</b></p> * <p>This service can be controlled programmatically through its methods:</p> * <ul> - * <li>{@link #startUnomi(String, boolean)}: Installs and starts features for the specified start features configuration.</li> + * <li>{@link #setupUnomiDistribution(String, boolean)}: Sets up the Unomi distribution's feature name.</li> + * <li>{@link #startUnomi(boolean)}: Installs and starts features for the configured distribution.</li> * <li>{@link #stopUnomi()}: Stops and uninstalls the previously started features.</li> * </ul> *
1 parent 3dc5498 commit 2b7aa27

File tree

5 files changed

+237
-135
lines changed

5 files changed

+237
-135
lines changed

0 commit comments

Comments
 (0)