First version of documentation for DME Participant 44/12144/9
authoraravind.est <aravindhan.a@est.tech>
Thu, 30 Nov 2023 14:37:34 +0000 (14:37 +0000)
committeraravind.est <aravindhan.a@est.tech>
Mon, 4 Dec 2023 10:53:32 +0000 (10:53 +0000)
DME Participant documentation added.

Issue-ID: NONRTRIC-957
Signed-off-by: aravind.est <aravindhan.a@est.tech>
Change-Id: I73c065f0b20b0d159b5dd7c9b0e7ae406c84e15f

16 files changed:
.readthedocs.yaml
docs/conf.py
participants/docs/_static/logo.png [new file with mode: 0755]
participants/docs/automation-composition-dme.yml [new file with mode: 0755]
participants/docs/conf.py [new file with mode: 0755]
participants/docs/conf.yaml [new file with mode: 0755]
participants/docs/developer-guide.rst [new file with mode: 0755]
participants/docs/favicon.ico [new file with mode: 0755]
participants/docs/images/architecture.png [new file with mode: 0755]
participants/docs/index.rst [new file with mode: 0755]
participants/docs/installation-guide.rst [new file with mode: 0755]
participants/docs/overview.rst [new file with mode: 0755]
participants/docs/requirements-docs.txt [new file with mode: 0755]
participants/docs/tosca-dme-participant.yml [new file with mode: 0755]
participants/pom.xml
tox.ini

index cd2f8dc..69db9d3 100755 (executable)
 #  ============LICENSE_END=================================================
 #
 
----
+
 version: 2
 
 formats:
   - htmlzip
 
 build:
-  image: latest
-
+  os: ubuntu-22.04
+  tools:
+    python: "3.11"
+  jobs:
+    pre_build:
+      - mkdir --parents _readthedocs/html/
+      - mkdir --parents _readthedocs/tmp/doctrees
+      - sphinx-build -W -b html --keep-going -n -d
+        _readthedocs/tmp/doctrees  ./docs/ _readthedocs/html/
+      - sphinx-build -W -b html --keep-going -n -d
+        _readthedocs/tmp/doctrees/participants  ./participants/docs/
+        _readthedocs/html/participants
 python:
-  version: 3.7
   install:
     - requirements: docs/requirements-docs.txt
+    - requirements: participants/docs/requirements-docs.txt
 
 sphinx:
   configuration: docs/conf.py
+
index b7d7c49..f744b25 100755 (executable)
@@ -19,6 +19,8 @@ from docs_conf.conf import *
 #branch configuration
 
 branch = 'latest'
+baseurl = 'https://docs.o-ran-sc.org/projects/'
+selfurl = '%s/o-ran-sc-nonrtric-plt-rappmanager/en/%s' %(baseurl, branch)
 
 linkcheck_ignore = [
     'http://localhost.*',
@@ -43,4 +45,6 @@ redoc_uri = 'https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js
 #intershpinx mapping with other projects
 intersphinx_mapping = {}
 
-intersphinx_mapping['nonrtric'] = ('https://docs.o-ran-sc.org/projects/o-ran-sc-nonrtric/en/%s' % branch, None)
+intersphinx_mapping['nonrtric'] = ('%s/o-ran-sc-nonrtric/en/%s' %(baseurl, branch), None)
+# intersphinx_mapping['participants'] = ('%s/participants' % selfurl, None)
+intersphinx_disabled_reftypes = ["*"]
diff --git a/participants/docs/_static/logo.png b/participants/docs/_static/logo.png
new file mode 100755 (executable)
index 0000000..c3b6ce5
Binary files /dev/null and b/participants/docs/_static/logo.png differ
diff --git a/participants/docs/automation-composition-dme.yml b/participants/docs/automation-composition-dme.yml
new file mode 100755 (executable)
index 0000000..ef9cc4c
--- /dev/null
@@ -0,0 +1,37 @@
+name: DMEInstance0
+version: 1.0.1
+compositionId: {{compositionId}}
+description: Demo automation composition instance 0
+elements:
+  709c62b3-8918-41b9-a747-d21eb79d9c12:
+    id: 709c62b3-8918-41b9-a747-d21eb79d9c12
+    definition:
+      name: onap.policy.clamp.ac.element.DMEAutomationCompositionElement
+      version: 1.2.3
+    description: Starter Automation Composition Element for the Demo
+    properties:
+      infoTypeEntities:
+        - infoTypeEntityId:
+            name: infoType1
+            version: 1.0.1
+          infoTypeId: json-file-data-from-filestore
+          payload: '{"info_job_data_schema": {"schema": "http://json-schema.org/draft-07/schema#","title":
+          "json-file-data-from-filestore","description": "json-file-data-from-filestore","type":
+          "object"}}'
+      dataProducerEntities:
+        - dataProducerEntityId:
+            name: producerType1
+            version: 1.0.1
+          dataProducerId: json-file-data-producer
+          payload: '{"info_job_callback_url": "http://localhost/jsonproducerjobcallback","info_producer_supervision_callback_url":
+          "http://localhost/jsonproducersupervisioncallback","supported_info_types":
+          ["json-file-data-from-filestore"]}'
+      dataConsumerEntities:
+        - dataConsumerEntityId:
+            name: consumerType1
+            version: 1.0.1
+          dataConsumerId: json-file-consumer
+          payload: '{"info_type_id": "json-file-data-from-filestore","job_owner": "console","status_notification_uri":
+          "http://callback.nonrtric:80/post","job_definition": {"db-url": "http://influxdb2.nonrtric:8086","db-org":
+          "est","db-bucket": "pm-bucket","db-token": "token","filterType": "pmdata","filter":
+          {}}}'
diff --git a/participants/docs/conf.py b/participants/docs/conf.py
new file mode 100755 (executable)
index 0000000..fb77eb7
--- /dev/null
@@ -0,0 +1,36 @@
+#  ============LICENSE_START======================================================================
+#  Copyright (C) 2023 OpenInfra Foundation Europe. All rights reserved.
+#  ===============================================================================================
+#  Licensed 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.
+#  ============LICENSE_END========================================================================
+
+from docs_conf.conf import *
+
+#branch configuration
+
+branch = 'latest'
+
+linkcheck_ignore = [
+    'http://localhost.*',
+    'http://127.0.0.1.*',
+    'https://gerrit.o-ran-sc.org.*',
+]
+
+extensions = ['sphinx.ext.intersphinx',]
+
+
+#intershpinx mapping with other projects
+intersphinx_mapping = {}
+
+intersphinx_mapping['nonrtric'] = ('https://docs.o-ran-sc.org/projects/o-ran-sc-nonrtric/en/%s' % branch, None)
+
diff --git a/participants/docs/conf.yaml b/participants/docs/conf.yaml
new file mode 100755 (executable)
index 0000000..ae34560
--- /dev/null
@@ -0,0 +1,3 @@
+---
+project_cfg: oran
+project: nonrtric-plt-dmeparticipant
\ No newline at end of file
diff --git a/participants/docs/developer-guide.rst b/participants/docs/developer-guide.rst
new file mode 100755 (executable)
index 0000000..56eda33
--- /dev/null
@@ -0,0 +1,59 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. Copyright (C) 2023 OpenInfra Foundation Europe. All rights reserved.
+
+Developer Guide
+===============
+
+This document provides a quickstart for developers of the Non-RT RIC DME Participant.
+
+Additional developer guides are available on the `O-RAN SC NONRTRIC Developer wiki <https://wiki.o-ran-sc.org/display/RICNR/Release+I>`_.
+
+The DME Participant is a Java 17 web application built using the Spring Framework. Using Spring Boot
+dependencies, it runs as a standalone application.
+
+Its main functionality is to work with ACM to lifecycle manage DME.
+
+Start standalone
+++++++++++++++++
+
+The project uses Maven. To start the DME Participant as a freestanding application, run the following
+command in the *rappmanager/participants/participant-impl-dme* directory:
+
+    +-----------------------------+
+    | mvn spring-boot:run         |
+    +-----------------------------+
+
+There are a few service endpoints that needs to be available to run. These are referred to from the application.yaml file.
+The following properties have to be modified:
+
+* dme.baseUrl=http://informationservice:9082
+
+
+Start in Docker
++++++++++++++++
+
+To build and deploy the DME Participant, go to the *rappmanager/participants/participant-impl-dme* folder and run the
+following command:
+
+    +-----------------------------+
+    | mvn clean install           |
+    +-----------------------------+
+
+Then start the container by running the following command:
+
+    +----------------------------------------+
+    | docker run nonrtric-plt-dmeparticipant |
+    +----------------------------------------+
+
+Kubernetes deployment
++++++++++++++++++++++
+
+Non-RT RIC can be also deployed in a Kubernetes cluster, `it/dep repository <https://gerrit.o-ran-sc.org/r/admin/repos/it/dep>`_.
+hosts deployment and integration artifacts. Instructions and helm charts to deploy the Non-RT-RIC functions in the
+OSC NONRTRIC integrated test environment can be found in the *./nonrtric* directory.
+
+For more information on installation of NonRT-RIC in Kubernetes, see `Deploy NONRTRIC in Kubernetes <https://wiki.o-ran-sc.org/display/RICNR/Release+I+-+Run+in+Kubernetes>`_.
+
+For more information see `Integration and Testing documentation in the O-RAN-SC <https://docs.o-ran-sc.org/projects/o-ran-sc-it-dep/en/latest/index.html>`_.
+
diff --git a/participants/docs/favicon.ico b/participants/docs/favicon.ico
new file mode 100755 (executable)
index 0000000..00b0fd0
Binary files /dev/null and b/participants/docs/favicon.ico differ
diff --git a/participants/docs/images/architecture.png b/participants/docs/images/architecture.png
new file mode 100755 (executable)
index 0000000..38115b3
Binary files /dev/null and b/participants/docs/images/architecture.png differ
diff --git a/participants/docs/index.rst b/participants/docs/index.rst
new file mode 100755 (executable)
index 0000000..1a958ad
--- /dev/null
@@ -0,0 +1,14 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. Copyright (C) 2023 OpenInfra Foundation Europe. All rights reserved.
+
+Non-RT RIC DME Participant
+==========================
+
+.. toctree::
+   :maxdepth: 2
+   :caption: Contents:
+
+   ./overview.rst
+   ./developer-guide.rst
+   ./installation-guide.rst
diff --git a/participants/docs/installation-guide.rst b/participants/docs/installation-guide.rst
new file mode 100755 (executable)
index 0000000..620c5bc
--- /dev/null
@@ -0,0 +1,26 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+.. Copyright (C) 2023 OpenInfra Foundation Europe. All rights reserved.
+
+Installation Guide
+==================
+
+Abstract
+--------
+
+This document describes how to install the Non-RT RIC components, their dependencies and required system resources.
+
+Software Installation and Deployment
+------------------------------------
+
+Install with Helm
++++++++++++++++++
+
+Helm charts and an example recipe are provided in the `it/dep repo <https://gerrit.o-ran-sc.org/r/admin/repos/it/dep>`_,
+under "nonrtric". By modifying the variables named "installXXX" in the beginning of the example recipe file, which
+components that will be installed can be controlled. Then the components can be installed and started by running the
+following command:
+
+      .. code-block:: bash
+
+        bin/deploy-nonrtric -f nonrtric/RECIPE_EXAMPLE/example_recipe.yaml
diff --git a/participants/docs/overview.rst b/participants/docs/overview.rst
new file mode 100755 (executable)
index 0000000..95bd029
--- /dev/null
@@ -0,0 +1,125 @@
+.. This work is licensed under a Creative Commons Attribution 4.0 International License.
+.. SPDX-License-Identifier: CC-BY-4.0
+.. Copyright (C) 2023 OpenInfra Foundation Europe. All rights reserved.
+
+DME Participant
+~~~~~~~~~~~~~~~
+
+A Participant is a component that acts as a bridge between the Automation Composition Management runtime and components such as the Kserve, A1PMS, DME, or a Kubernetes cluster that are taking part in automation composition management. It listens to DMaaP to receive messages from the ACM runtime and performs operations towards components that are taking part in acms. A participant has an Automation Composition Management Element for each automation composition in which it is taking part.
+
+More information about ACM can be found `here <https://docs.onap.org/projects/onap-policy-parent/en/latest/clamp/acm/acm-architecture.html#introduction>`_.
+
+The DME participant receives Information Type/Data Producer/Data Consumer information from the ACM runtime and creates it in ICS(NONRTRIC). The participant acts as a wrapper around the ICS and creates the entities.
+
+Supported message Broker are DMaap and Strimzi-Kafka.
+
+This participant is a part of :doc:`NONRTRIC <nonrtric:index>`.
+
+************
+Architecture
+************
+
+.. image:: ./images/architecture.png
+   :width: 500pt
+
+When an automation composition is initialized, the DME participant starts a DME Automation Composition element for the automation composition. It reads the configuration information sent from the Automation Composition Runtime and runs a REST client to talk to the ICS(DME) endpoint receiving the REST requests.
+
+***************************************
+Prerequisites for using DME participant
+***************************************
+
+* A running ICS(DME). ICS(DME) base url should be configured in DME participant to make REST calls.
+
+***********************
+Supported Element Types
+***********************
+Supported Element Types for DME participant will be used to define the DME participant Element Definition Types in tosca template. Participant Supported Element Types is defined in DME participant application.yaml.
+
+      .. code-block:: yaml
+
+        participantSupportedElementTypes:
+          -
+            typeName: org.onap.policy.clamp.acm.DMEAutomationCompositionElement
+            typeVersion: 1.0.1
+
+**************************************************
+Defining a TOSCA CL definition for DME participant
+**************************************************
+
+A Info Type Entity/ Data Producer Entity/Data Consumer Entity describes a information type entities that is managed by the DME participant. A Info Type Entity/Data Producer Entity/Data Consumer Entity can be created, Read and Deleted. The user defines the entities that it wants its DME Automation Composition Element to manage and provides the parameters to manage each Information Type/Data Producer/Data Consumer.
+
+Sample tosca template defining a participant and a AC element definition ':download:`link <./tosca-dme-participant.yml>`'
+
+
+**************************************************************************************************
+Configuring a Automation Composition Element on the A1PMS participant for a Automation Composition
+**************************************************************************************************
+
+The user defines the following properties in the TOSCA template for the DME participant
+
+.. list-table:: Information Type Entities
+   :header-rows: 1
+
+   * - Property
+     - Type
+     - Description
+   * - infoTypeEntityId
+     - ToscaConceptIdentifier
+     - The name and version of the information type that needs to be managed by the DME participant
+   * - infoTypeId
+     - String
+     - Id of information type
+   * - payload
+     - String
+     - The payload of the information type entity. This will be used as  payload to call DME API
+
+.. list-table:: Data Producer Entities
+   :header-rows: 1
+
+   * - Property
+     - Type
+     - Description
+   * - dataProducerEntityId
+     - ToscaConceptIdentifier
+     - The name and version of the data producer that needs to be managed by the DME participant
+   * - dataProducerId
+     - String
+     - Id of the data producer
+   * - payload
+     - String
+     - The payload of the data producer entity. This will be used as  payload to call DME API
+
+.. list-table:: Data Consumer Entities
+   :header-rows: 1
+
+   * - Property
+     - Type
+     - Description
+   * - dataConsumerEntityId
+     - ToscaConceptIdentifier
+     - The name and version of the data consumer that needs to be managed by the DME participant
+   * - dataConsumerId
+     - String
+     - Id of the data consumer
+   * - payload
+     - String
+     - The payload of the data consumer entity. This will be used as  payload to call DME API
+
+Sample Automation Composition instances. In that example the user fills the properties defined in the TOSCA for the DME participant ':download:`link <./automation-composition-dme.yml>`'
+
+****************************
+DME participant Interactions
+****************************
+
+The DME participant interacts with Automation Composition Runtime on the northbound interface via Message Broker. It interacts with the ICS(DME) API on the southbound interface for the operations.
+
+The communication for the Automation Composition updates and state change requests are sent from the Automation Composition Runtime to the participant via Message Broker. The participant performs appropriate operations on DME via REST based on the received messages from the Automation Composition Runtime.
+
+************************
+DME participant Workflow
+************************
+Once the participant is started, it sends a “REGISTER” event to the Message Broker topic which is then consumed by the Automation Composition Runtime to register this participant on the runtime database. The user can commission the tosca definitions from the Policy Gui to the Automation Composition Runtime. Once the automation composition definitions are available in the runtime database, the user can prime them and further updates the participant with these definitions via Message Broker. After priming, the Automation Composition can be instantiated with the default state “UNDEPLOYED” from the Policy Gui.
+
+When the state of the Automation Composition is changed from “UNDEPLOYED” to “DEPLOYED” from the Policy Gui, the DME participant receives the automation composition state change event from the runtime and deploys the information type/data producer/data consumer associated with each Automation Composition Elements by calling the ICS(DME) api in the cluster.
+
+When the state of the Automation Composition is changed back from “DEPLOYED” to “UNDEPLOYED”, the participant also undeploys the related information type/data producer/data consumer from DME.
diff --git a/participants/docs/requirements-docs.txt b/participants/docs/requirements-docs.txt
new file mode 100755 (executable)
index 0000000..f90f2a0
--- /dev/null
@@ -0,0 +1,13 @@
+tox
+Sphinx
+doc8
+docutils < 0.17
+setuptools
+six
+sphinx_rtd_theme
+sphinxcontrib-needs
+sphinxcontrib-swaggerdoc
+sphinx_bootstrap_theme
+sphinxcontrib-redoc
+lfdocs-conf
+urllib3~=1.26.15
\ No newline at end of file
diff --git a/participants/docs/tosca-dme-participant.yml b/participants/docs/tosca-dme-participant.yml
new file mode 100755 (executable)
index 0000000..b1d4924
--- /dev/null
@@ -0,0 +1,163 @@
+---
+tosca_definitions_version: tosca_simple_yaml_1_3
+data_types:
+  onap.datatypes.ToscaConceptIdentifier:
+    derived_from: tosca.datatypes.Root
+    properties:
+      name:
+        type: string
+        required: true
+      version:
+        type: string
+        required: true
+  org.onap.datatypes.policy.clamp.acm.DMEAutomationCompositionElement.InfoTypeEntity:
+    version: 1.0.0
+    derived_from: tosca.datatypes.Root
+    properties:
+      infoTypeEntityId:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: true
+        description: The name and version of a Configuration Entity to be handled
+          by the DME Automation Composition Element
+      infoTypeId:
+        type: string
+        required: true
+        description: Id of the info type
+      payload:
+        type: string
+        required: true
+        description: Json payload of info type
+  org.onap.datatypes.policy.clamp.acm.DMEAutomationCompositionElement.DataProducerEntity:
+    version: 1.0.0
+    derived_from: tosca.datatypes.Root
+    properties:
+      dataProducerEntityId:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: true
+        description: The name and version of a Configuration Entity to be handled
+          by the DME Automation Composition Element
+      dataProducerId:
+        type: string
+        required: true
+        description: Id of the info type
+      payload:
+        type: string
+        required: true
+        description: Json payload of info type
+  org.onap.datatypes.policy.clamp.acm.DMEAutomationCompositionElement.DataConsumerEntity:
+    version: 1.0.0
+    derived_from: tosca.datatypes.Root
+    properties:
+      dataConsumerEntityId:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: true
+        description: The name and version of a Configuration Entity to be handled
+          by the DME Automation Composition Element
+      dataConsumerId:
+        type: string
+        required: true
+        description: Id of the info type
+      payload:
+        type: string
+        required: true
+        description: Json payload of info type
+node_types:
+  org.onap.policy.clamp.acm.Participant:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        required: false
+  org.onap.policy.clamp.acm.AutomationCompositionElement:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        required: false
+      participantType:
+        type: onap.datatypes.ToscaConceptIdentifier
+        required: true
+      startPhase:
+        type: integer
+        required: false
+        constraints:
+          - greater-or-equal: 0
+        metadata:
+          common: true
+        description: A value indicating the start phase in which this automation composition
+          element will be started, the first start phase is zero. Automation Composition
+          Elements are started in their start_phase order and stopped in reverse start
+          phase order. Automation Composition Elements with the same start phase are
+          started and stopped simultaneously
+  org.onap.policy.clamp.acm.AutomationComposition:
+    version: 1.0.1
+    derived_from: tosca.nodetypes.Root
+    properties:
+      provider:
+        type: string
+        required: false
+        metadata:
+          common: true
+      elements:
+        type: list
+        required: true
+        metadata:
+          common: true
+        entry_schema:
+          type: onap.datatypes.ToscaConceptIdentifier
+  org.onap.policy.clamp.acm.DMEAutomationCompositionElement:
+    version: 1.0.1
+    derived_from: org.onap.policy.clamp.acm.AutomationCompositionElement
+    properties:
+      infoTypeEntities:
+        type: list
+        required: true
+        entry_schema:
+          type: org.onap.datatypes.policy.clamp.acm.DMEAutomationCompositionElement.InfoTypeEntity
+          type_version: 1.0.0
+        description: The configuration entities of DME
+      dataProducerEntities:
+        type: list
+        required: true
+        entry_schema:
+          type: org.onap.datatypes.policy.clamp.acm.DMEAutomationCompositionElement.DataProducerEntity
+          type_version: 1.0.0
+        description: The configuration entities of DME
+      dataConsumerEntities:
+        type: list
+        required: true
+        entry_schema:
+          type: org.onap.datatypes.policy.clamp.acm.DMEAutomationCompositionElement.DataConsumerEntity
+          type_version: 1.0.0
+        description: The configuration entities of DME
+topology_template:
+  node_templates:
+    org.onap.policy.clamp.acm.DMEAutomationCompositionParticipant:
+      version: 2.3.4
+      type: org.onap.policy.clamp.acm.Participant
+      type_version: 1.0.1
+      description: Participant for DME
+      properties:
+        provider: ONAP
+    onap.policy.clamp.ac.element.DMEAutomationCompositionElement:
+      version: 1.2.3
+      type: org.onap.policy.clamp.acm.DMEAutomationCompositionElement
+      type_version: 1.0.1
+      description: Automation composition element for the DME Requests
+      properties:
+        provider: ONAP
+        participantType:
+          name: org.onap.policy.clamp.acm.DMEParticipant
+          version: 2.3.4
+    onap.policy.clamp.ac.element.AutomationCompositionDefinition:
+      version: 1.2.3
+      type: org.onap.policy.clamp.acm.AutomationComposition
+      type_version: 1.0.1
+      description: Automation composition for DME request
+      properties:
+        provider: ONAP
+        elements:
+          - name: onap.policy.clamp.ac.element.DMEAutomationCompositionElement
+            version: 1.2.3
index e24df6f..483c0f3 100755 (executable)
@@ -54,7 +54,7 @@
         <openapi.maven.version>7.0.1</openapi.maven.version>
         <docker-maven-plugin>0.30.0</docker-maven-plugin>
         <jacoco-maven-plugin.version>0.8.10</jacoco-maven-plugin.version>
-        <onap.acm.models.version>7.0.3-SNAPSHOT</onap.acm.models.version>
+        <onap.acm.models.version>7.0.4-SNAPSHOT</onap.acm.models.version>
         <openapi.jackson.databind.nullable.version>0.2.6</openapi.jackson.databind.nullable.version>
     </properties>
     <build>
diff --git a/tox.ini b/tox.ini
index 60e2f2c..1b63bfc 100755 (executable)
--- a/tox.ini
+++ b/tox.ini
@@ -1,5 +1,6 @@
 #  ============LICENSE_START===============================================
 #  Copyright (C) 2023 Nordix Foundation. All rights reserved.
+#  Copyright (C) 2023 OpenInfra Foundation Europe. All rights reserved.
 #  ========================================================================
 #  Licensed under the Apache License, Version 2.0 (the "License");
 #  you may not use this file except in compliance with the License.
@@ -25,14 +26,21 @@ skipsdist = true
 
 [testenv:docs]
 basepython = python3
-deps = -r{toxinidir}/docs/requirements-docs.txt
+deps =
+    -r{toxinidir}/docs/requirements-docs.txt
+    -r{toxinidir}/participants/docs/requirements-docs.txt
 
 commands =
+    sphinx-build -W -b html --keep-going -n -d {envtmpdir}/participants/doctrees ./participants/docs/ {toxinidir}/docs/_build/html/participants
     sphinx-build -W -b html -n -d {envtmpdir}/docs/doctrees ./docs/ {toxinidir}/docs/_build/html
-    echo "Generated docs available in {toxinidir}/docs/_build/html"
+
 allowlist_externals = echo
 
 [testenv:docs-linkcheck]
 basepython = python3
-deps = -r{toxinidir}/docs/requirements-docs.txt
-commands = sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/linkcheck
+deps =
+    -r{toxinidir}/docs/requirements-docs.txt
+    -r{toxinidir}/participants/docs/requirements-docs.txt
+commands =
+    sphinx-build -W -b linkcheck -d {envtmpdir}/participants/doctrees ./participants/docs/ {toxinidir}/docs/_build/linkcheck/participants
+    sphinx-build -W -b linkcheck -d {envtmpdir}/doctrees ./docs/ {toxinidir}/docs/_build/linkcheck