From 248a9f1c153333002df39567e33fd5fa6092a62b Mon Sep 17 00:00:00 2001 From: efiacor Date: Tue, 25 Oct 2022 11:46:34 +0100 Subject: [PATCH] [SDC-DIST-CLIENT] Add new RTD entry Update README etc Signed-off-by: efiacor Change-Id: I4f92684e82d3fc2df978af12100be0871b94178d Issue-ID: DMAAP-1792 --- .gitignore | 1 + .readthedocs.yaml | 13 ++-- README.md | 104 ++------------------------------ docs/conf.py | 55 +++++++++++++++-- docs/images/sdc_client_init.png | Bin 0 -> 48791 bytes docs/images/sdc_distrib_flow.png | Bin 0 -> 52844 bytes docs/index.rst | 18 +++++- docs/requirements-docs.txt | 6 +- docs/sections/architecture.rst | 97 ++++++++++++++++++++++++++++++ docs/sections/build.rst | 43 +++++++++++++ docs/sections/configuration.rst | 126 +++++++++++++++++++++++++++++++++++++++ docs/sections/delivery.rst | 23 +++++++ docs/sections/offeredapis.rst | 18 ++++++ docs/sections/release-notes.rst | 105 ++++++++++++++++++++++++++++++++ docs/tox.ini | 38 +++++++----- 15 files changed, 520 insertions(+), 127 deletions(-) create mode 100644 docs/images/sdc_client_init.png create mode 100644 docs/images/sdc_distrib_flow.png create mode 100644 docs/sections/architecture.rst create mode 100644 docs/sections/build.rst create mode 100644 docs/sections/configuration.rst create mode 100644 docs/sections/delivery.rst create mode 100644 docs/sections/offeredapis.rst create mode 100644 docs/sections/release-notes.rst diff --git a/.gitignore b/.gitignore index 70a26f7..39595c8 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ target/ /bin/ sdc-tosca-parser/test-output/**/* *.iml +/onap_docs/ diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 3797dc8..dc0c78b 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,13 +1,11 @@ --- # .readthedocs.yml -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details -# Required +# # Read the Docs configuration file +# # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details +# # Required +# version: 2 -formats: - - htmlzip - build: image: latest @@ -16,5 +14,8 @@ python: install: - requirements: docs/requirements-docs.txt +submodules: + include: all + sphinx: configuration: docs/conf.py diff --git a/README.md b/README.md index f975823..aa79ff4 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,14 @@ # Introduction ONAP SDC Distribution client is delivered as helper JAR that can be used by clients that work with SDC. -It register to SDC for getting notifications, listen for notification from SDC, download artifacts from SDC, and send response back to SDC. +It listens for notifications from SDC, download artifacts from SDC, and send response back to SDC. # Compiling ONAP SDC Distribution client -As mentioned in the onap wiki https://wiki.onap.org/display/DW/Setting+Up+Your+Development+Environment, the settings.xml (https://git.onap.org/oparent/plain/settings.xml) from the oparent project must be installed in your ~/.m2 folder and referenced by your IDE. +As mentioned in the onap wiki https://wiki.onap.org/display/DW/Setting+Up+Your+Development+Environment, +the settings.xml (https://git.onap.org/oparent/plain/settings.xml) from the oparent project must be +installed in your ~/.m2 folder and referenced by your IDE. Once maven is set up properly, ONAP SDC Distribution client can be compiled easily using maven command: `mvn clean install` The result is JAR file under "target" folder @@ -21,102 +23,8 @@ The result is JAR file under "target" folder ### How to use ONAP SDC Distribution client Every client that wants to use the JAR, need to implement IConfiguration interface. -Configuration parameters: --------------------------- -- sdcAddress : SDC Distribution Engine address. Value can be either hostname (with or without port), IP:port or FQDN (Fully Qualified Domain Name). -- User : User Name for SDC distribution consumer authentication. -- Password : User Password for SDC distribution consumer authentication. -- PollingInterval : Distribution Client Polling Interval towards MessageBus in seconds. Can Be reconfigured in runtime. -- PollingTimeout : Distribution Client Timeout in seconds waiting to MessageBus server response in each fetch interval. Can Be reconfigured in runtime. -- RelevantArtifactTypes : List of artifact types. If the service contains any of the artifacts in the list, the callback will be activated. Can Be reconfigured in runtime. -- ConsumerGroup : Returns the consumer group defined for this ONAP component, if no consumer group is defined return null. -- EnvironmentName : Returns the environment name (testing, production etc... Can Be reconfigured in runtime. -- ConsumerID : Unique ID of ONAP component instance (e.x INSTAR name). -- KeyStorePath : Return full path to Client's Key Store that contains either CA certificate or the SDC's public key (e.g /etc/keystore/sdc-client.jks). file will be deployed with sdc-distribution jar -- KeyStorePassword : Return client's Key Store password. -- activateServerTLSAuth : Sets whether SDC server TLS authentication is activated. If set to false, Key Store path and password are not needed to be set. -- UseSystemProxy : If set to true, SDC Distribution Client will use system wide proxy configuration passed through JVM arguments. -- HttpProxyHost : Optional config. If configured, SDC Distribution client will use this http proxy host with HTTP client. -- HttpProxyPort : Mandatory if HttpProxyHost is configured. If configured, SDC Distribution client will use this https proxy port with HTTP client. -- HttpsProxyHost : Optional config. If configured, SDC Distribution client will use this https proxy host with HTTPS client. -- HttpsProxyPort : Mandatory if HttpsProxyHost is configured. If configured, SDC Distribution client will use this https proxy port with HTTPS client. - -Example of configuration file implementing IConfiguration interface: --------------------------------------------------------------------- -package org.onap.conf; - -import java.util.ArrayList; -import java.util.List; - -import org.onap.sdc.api.consumer.IConfiguration; -import org.onap.sdc.utils.ArtifactTypeEnum; - -public class SimpleConfiguration implements IConfiguration{ - int randomSeed; - String sdcAddress; - - public SimpleConfiguration(){ - randomSeed = ((int)(Math.random()*1000)); - sdcAddress = "127.0.0.1:8443"; - } - public String getUser() { - return "ci"; - } - - public List getRelevantArtifactTypes() { - List res = new ArrayList<>(); - for(ArtifactTypeEnum artifactTypeEnum : ArtifactTypeEnum.values()){ - res.add(artifactTypeEnum.name()); - } - return res; - } - - public int getPollingTimeout() { - return 20; - } - - public int getPollingInterval() { - return 20; - } - - public String getPassword() { - return "123456"; - } - - public String getEnvironmentName() { - return "PROD"; - } - - public String getConsumerID() { - return "unique-Consumer-ID"+randomSeed; - } - - public String getConsumerGroup() { - return "unique-Consumer-Group"+randomSeed; - } - - public String getSdcAddress() { - return sdcAddress; - } - - public void setSdcAddress(String sdcAddress) { - this.sdcAddress = sdcAddress; - } - @Override - public String getKeyStorePath() { - return null; - } - @Override - public String getKeyStorePassword() { - return null; - } - @Override - public boolean activateServerTLSAuth() { - return false; - } - -} - +See the SDC ONAP read the docs for more detail in relation to the sdc-distribution-client usage. +https://docs.onap.org/projects/onap-sdc/en/kohn/sdcsdks.html#sdc-tosca-and-sdc-distribution-client # Logging Loggin can be done using log4j diff --git a/docs/conf.py b/docs/conf.py index 5371015..80888b3 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,15 +1,58 @@ -from docs_conf.conf import * +project = "onap" +release = "master" +version = "master" -branch = 'latest' -master_doc = 'index' +author = "Open Network Automation Platform" +# yamllint disable-line rule:line-length +copyright = "ONAP. Licensed under Creative Commons Attribution 4.0 International License" -linkcheck_ignore = [ - 'http://localhost', +pygments_style = "sphinx" +html_theme = "sphinx_rtd_theme" +html_theme_options = { + "style_nav_header_background": "white", + "sticky_navigation": "False" } +html_logo = "_static/logo_onap_2017.png" +html_favicon = "_static/favicon.ico" +html_static_path = ["_static"] +html_show_sphinx = False + +extensions = [ + 'sphinx.ext.intersphinx', + 'sphinx.ext.graphviz', + 'sphinxcontrib.blockdiag', + 'sphinxcontrib.seqdiag', + 'sphinxcontrib.swaggerdoc', + 'sphinxcontrib.plantuml' ] +exclude_patterns = ['archived/*.rst', '.tox'] +# +# Map to 'latest' if this file is used in 'latest' (master) 'doc' branch. +# Change to {releasename} after you have created the new 'doc' branch. +# + +branch = 'latest' + intersphinx_mapping = {} +doc_url = 'https://docs.onap.org/projects' +master_doc = 'index' + +spelling_word_list_filename='spelling_wordlist.txt' +spelling_lang = "en_GB" + +# +# Example: +# intersphinx_mapping['onap-aai-aai-common'] = ('{}/onap-aai-aai-common/en/%s'.format(doc_url) % branch, None) +# html_last_updated_fmt = '%d-%b-%y %H:%M' + def setup(app): - app.add_stylesheet("css/ribbon.css") + app.add_css_file("css/ribbon.css") + + +linkcheck_ignore = [ + r'http://localhost:\d+/', + r'https:\/\/mvnrepository.com\/.*' +] \ No newline at end of file diff --git a/docs/images/sdc_client_init.png b/docs/images/sdc_client_init.png new file mode 100644 index 0000000000000000000000000000000000000000..de73f57956f98345a982a2e61329413effb31609 GIT binary patch literal 48791 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 literal 0 HcmV?d00001 diff --git a/docs/images/sdc_distrib_flow.png b/docs/images/sdc_distrib_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..f8a5165ad7c77921ffdc7ff1af3fe3571bf90234 GIT binary patch literal 52844 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

6zNDsMx1q*Addgs;1k7(44LpMr-PFg}@ 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 EANMCz`v3p{ literal 0 HcmV?d00001 diff --git a/docs/index.rst b/docs/index.rst index d567787..01cf3cf 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,9 +1,23 @@ .. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2022 Nordix Foundation + .. _master_index: -TODO Add files to toctree and delete this header ------------------------------------------------- +SDC Distribution Client +======================= + +.. Add or remove sections below as appropriate for the SDK + .. toctree:: :maxdepth: 1 + ../sections/architecture.rst + ../sections/offeredapis.rst + ../sections/configuration.rst + ../sections/delivery.rst + ../sections/build.rst + ../sections/release-notes.rst + + diff --git a/docs/requirements-docs.txt b/docs/requirements-docs.txt index 3b3441a..71df2ab 100644 --- a/docs/requirements-docs.txt +++ b/docs/requirements-docs.txt @@ -1,3 +1,7 @@ -lfdocs-conf sphinx>=4.2.0 # BSD sphinx-rtd-theme>=1.0.0 # MIT +sphinxcontrib-blockdiag # BSD +sphinxcontrib-seqdiag # BSD +sphinxcontrib-swaggerdoc +sphinxcontrib-spelling +sphinxcontrib-plantuml diff --git a/docs/sections/architecture.rst b/docs/sections/architecture.rst new file mode 100644 index 0000000..a04626d --- /dev/null +++ b/docs/sections/architecture.rst @@ -0,0 +1,97 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2022 Nordix Foundation + +Architecture +============ + +.. + * This section is used to describe a software component from a high level + view of capability, common usage scenarios, and interactions with other + components required in the usage scenarios. + + * The architecture section is typically: provided in a platform-component + and sdk collections; and referenced from developer and user guides. + + * This note must be removed after content has been added. + + +Capabilities +------------ + +The SDC Distribution client is a library that applications can use to simplify the handling of +distribution related notifications from/to SDC and to download artifacts from SDC based on those notification. + +.. note:: + + As of version 2.0.0, the client uses kafka as it's message bus to publish/subscribe to/from the + relevant SDC distribution topics. + + All previous releases of the client use DMaaP Message Router as it's message bus. + +Usage Scenarios +--------------- +- **Get Distribution Notification event** + + The client polls the relevant NOTIFICATION topic for distribution events sent from SDC. + +- **Get Deployment Artifact from SDC** + + Once a new notification event is received, the client will download the relevant artifacts that it + has defined as part of it configuration. + +- **Send Distribution Status event** + + As part of the processing of the downloaded artifacts, the client will publish it's progress to SDC + via the relevant STATUS topic. + Once the download has ben successfully completed, the client must publish it's final response + COMPONENT_DONE_OK to the STATUS topic. + + +Interactions +------------ + +Kafka +^^^^^ +The client uses kafka as it's messaging bus to publish and subscribe to the relevant SDC topics. + +.. _SDCE-6 Swagger api: https://docs.onap.org/projects/onap-sdc/en/latest/_downloads/4eca2a3848d70e58566570a5ef889efb/swagger-sdce-6.json +.. _SDCE-7 Swagger api: https://docs.onap.org/projects/onap-sdc/en/latest/_downloads/542e76906472dae2e00adfad5fc7d879/swagger-sdce-7.json + +SDC +^^^ +**The client interacts with the following SDC apis on initialization:** + +- ``/sdc/v1/artifactTypes`` + + Get the current artifact types from SDC to validate against the clients configured list. + + See `SDCE-6 Swagger api`_ for more details + +- ``/sdc/v1/distributionKafkaData`` + + Get the kafka distribution config from SDC to be used during publish and subscribe + + See `SDCE-6 Swagger api`_ for more details + +.. image:: ../images/sdc_client_init.png + + + + +**The client interacts with the following SDC apis during distribution:** + +- ``/sdc/v1/catalog/services/{serviceName}/{serviceVersion}/resourceInstances/{resourceInstanceName}/artifacts/{artifactName}`` + + Get the artifact for a particular resource instance defined in the artifactUrl of the notification event + + See `SDCE-7 Swagger api`_ for more details + +- ``/sdc/v1/catalog/services/{serviceName}/{serviceVersion}/artifacts/{artifactName}`` + + Get the artifact defined in the artifactUrl of the notification event + + See `SDCE-7 Swagger api`_ for more details + + +.. image:: ../images/sdc_distrib_flow.png diff --git a/docs/sections/build.rst b/docs/sections/build.rst new file mode 100644 index 0000000..4ef3e71 --- /dev/null +++ b/docs/sections/build.rst @@ -0,0 +1,43 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2022 Nordix Foundation + +.. _build: + +Build +===== + +.. + * This section is used to describe how a software component is built from + source into something ready for use either in a run-time environment or to + build other components. + + * This section is typically provided for a platform-component, application, + and sdk; and referenced in developer guides. + + +Environment +----------- + +- JDK 11 + +- Maven 3.6.* + + - local .m2 settings.xml set to https://git.onap.org/oparent/plain/settings.xml + +For more information regarding Env set up see `Setting Up Your Development Environment`_. + +.. _Setting Up Your Development Environment: https://wiki.onap.org/display/DW/Setting+Up+Your+Development+Environment + + +.. _Build steps: + +Steps +----- + +Run the following from project root: + +``mvn clean install`` + +The result is JAR file under the ``sdc-distribution-client/target`` folder + diff --git a/docs/sections/configuration.rst b/docs/sections/configuration.rst new file mode 100644 index 0000000..964d771 --- /dev/null +++ b/docs/sections/configuration.rst @@ -0,0 +1,126 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2022 Nordix Foundation + +.. _config: + +Configuration +============= + +The sdc-distribution-client configuration in ONAP is generally done via a config file +loaded to the container. + +Pre-requisites +-------------- +The parent project must provide a mechanism to load the configuration at runtime. + +This configuration is then passed as input to the parent projects implementation of the +sdc-distribution-client's IConfiguration interface. + +For more detailed information regarding the abstract methods of the interface that must be +overridden byt the parent project, please refer to the javadocs. + +Client configuration +-------------------- +The table below shows a brief outline of the client config. + +.. note:: + Attention should be given to any methods which provide default values. + ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| Name | Description | Type | Required | Default | ++===========================+===============================================================+=========+==========+=========+ +| sdcAddress | SDC Distribution Engine address | String | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| user | User Name for SDC distribution consumer authentication | String | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| password | User Password for SDC distribution consumer authentication | String | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| environmentName | The environment name. Must match what is set in SDC | String | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| useHttpsWithSdc | Whether to use https towards SDC | boolean | N | true | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| keyStorePath | Y If useHttpsWithSdc is true | String | See desc | NA | +| | N if activateServerTLSAuth set to false | | | | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| keyStorePassword | Y If useHttpsWithSdc is true | String | See desc | NA | +| | N if activateServerTLSAuth set to false | | | | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| activateServerTLSAuth | mTLS setting. | boolean | Y | NA | +| | If false, KeyStore path and password must be set | | | | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| consumeProduceStatusTopic | Whether to consume from both SDC distribution topics | boolean | N | false | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| consumerGroup | Group Id to use when consuming from the NOTIFICATION topic | String | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| consumerId | Consumer Id to use when consuming from the NOTIFICATION topic | String | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| pollingInterval | Interval between polls on the NOTIFICATION topic in sec | int | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| pollingTimeout | NOTIFICATION topic polling timeout in sec | int | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| relevantArtifactTypes | List of artifact types the client should consume | String | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| filterEmptyResource | See IConfiguration interface javadoc for more detail | boolean | Y | NA | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| useSystemProxy | Whether to use system or config proxies towards SDC | boolean | N | false | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| httpsProxyHost | The https proxy host to use towards SDC | String | N | null | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| httpsProxyPort | The https proxy port to use towards SDC | int | N | 0 | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| httpProxyHost | The http proxy host to use towards SDC | String | N | null | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ +| httpProxyPort | The http proxy port to use towards SDC | int | N | 0 | ++---------------------------+---------------------------------------------------------------+---------+----------+---------+ + + +Client Kafka config +^^^^^^^^^^^^^^^^^^^ + +The client will use kafka as a messaging bus to publish and subscribe to the relevant SDC topics. + +The client's kafka configuration in ONAP should be handled via Strimzi kafka's +KafkaUser custom resource definition which provides access control to the relevant kafka topics. + +This is done at helm chart level for each component that requires access to kafka topics. + ++-----------------------+---------------------------------------------------------------+--------+----------+----------------------------------------------+ +| Name | Description | Type | Required | Default | ++=======================+===============================================================+========+==========+==============================================+ +| kafkaSecurityProtocol | The kafka security.protocol to use towards the kafka endpoint | String | N | SASL_PLAINTEXT | ++-----------------------+---------------------------------------------------------------+--------+----------+----------------------------------------------+ +| kafkaSaslMechanism | The kafka sasl.mechanism to use towards the kafka endpoint | String | N | SCRAM-SHA-512 | ++-----------------------+---------------------------------------------------------------+--------+----------+----------------------------------------------+ +| KafkaSaslJaasConfig | The kafka sasl.jaas.config to use towards the kafka endpoint | String | Y | Environment variable set to SASL_JAAS_CONFIG | ++-----------------------+---------------------------------------------------------------+--------+----------+----------------------------------------------+ + +.. note:: + The sasl.jaas.config for the client to use will default to an environment variable set as SASL_JAAS_CONFIG. + + This is expected to be in the form of org.apache.kafka.common.security.scram.ScramLoginModule required username="user" password="password"; + + +Initializing the client +^^^^^^^^^^^^^^^^^^^^^^^ + +Once the client config is loaded, it can then be passed to the IDistributionClient to initialize. + +.. code-block:: java + + // CustomClientConfig implementing IConfiguration + CustomClientConfig config = loadClientConfig(); + + IDistributionClient client = DistributionClientFactory.createDistributionClient(); + + // MyNotificationCallback implementing INotificationCallback + MyNotificationCallback callback; + + IDistributionClientResult result = client.init(config, callback); + //Verify the result is SUCCESS, otherwise there’s a problem setting up vs either SDC or Kafka clients + System.out.println(result.getDistributionMessageResult()); + + System.out.println("Starting client..."); + IDistributionClientResult startResult = client.start(); + // Verify the result is SUCCESS, otherwise there’s a problem in receiving/sending notifications to/from kafka topics + System.out.println(startResult.getDistributionMessageResult()); diff --git a/docs/sections/delivery.rst b/docs/sections/delivery.rst new file mode 100644 index 0000000..135dcd3 --- /dev/null +++ b/docs/sections/delivery.rst @@ -0,0 +1,23 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2022 Nordix Foundation + +Delivery +======== + +.. + * This section is used to describe the delivery of a software component. + For a run-time component, this might be executable images, containers, etc. + For an SDK, this might be libraries. + + * This section is typically provided for a platform-component and sdk; + and referenced in developer and user guides. + +Deliverables +------------ + +SDC distribution client is delivered as a jar library and hosted on https://nexus.onap.org/ + +To include it as a dependency in your project, see `SDC Distribution Client mvn`_. + +.. _SDC Distribution Client mvn: https://mvnrepository.com/artifact/org.onap.sdc.sdc-distribution-client/sdc-distribution-client diff --git a/docs/sections/offeredapis.rst b/docs/sections/offeredapis.rst new file mode 100644 index 0000000..7e59f76 --- /dev/null +++ b/docs/sections/offeredapis.rst @@ -0,0 +1,18 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2022 Nordix Foundation + +.. _api_docs: + +Offered APIs +============ + +The api javadocs for interfaces provided by the sdc distribution client can be compiled by building the project. + +See :ref:`build steps` for more information. + +The javadocs can be then found under the ``sdc-distribution-client/target/apidocs`` folder. + +The main interface that must be implemented by clients is the IConfiguration interface. + +See the :ref:`configuration section` configuration section for more details. diff --git a/docs/sections/release-notes.rst b/docs/sections/release-notes.rst new file mode 100644 index 0000000..cf7b0cf --- /dev/null +++ b/docs/sections/release-notes.rst @@ -0,0 +1,105 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 + International License. +.. http://creativecommons.org/licenses/by/4.0 +.. Copyright (C) 2022 Nordix Foundation + +.. _release_notes: + + +.. =========================== +.. * * * LONDON * * * +.. =========================== + + +************* +Release Notes +************* + +.. + * The release note needs to be updated for each ONAP release + * Except the section "Release data" all other sections are optional and should be + applied where applicable + * Only the current release is to be documented in this document + * This note needs to be removed before publishing the final result + + +London +======== + + +Abstract +======== + +This document provides the release notes for the London release. + +Summary +======= +Client migration to use kafka as it's main messaging bus to publish and subscribe to the +SDC distribution topics. +Removal of all interaction with DMaaP Message Router apis. + +Release Data +============ + ++--------------------------------------+--------------------------------------+ +| **Project** | sdc/sdc-distribution-client | +| | | ++--------------------------------------+--------------------------------------+ +| **Jars** | sdc-distribution-client 2.0.0 | +| | | ++--------------------------------------+--------------------------------------+ + +New features +------------ +Modify client to use kafka native to publish and subscribe to SDC topics +https://jira.onap.org/browse/DMAAP-1745 + +Deliverables +------------ + +Software Deliverables +~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: xml + + org.onap.sdc.sdc-distribution-client + sdc-distribution-client + 2.0.0 + +Known Limitations, Issues and Workarounds +========================================= + +System Limitations +------------------ +NA + +Known Vulnerabilities +--------------------- +NA + +Workarounds +----------- +NA + +Security Notes +-------------- +NA + +References +========== + +For more information on the ONAP London release, please see: + +#. `ONAP Home Page`_ +#. `ONAP Documentation`_ +#. `ONAP Release Downloads`_ +#. `ONAP Wiki Page`_ +#. `SDC ReadTheDocs`_ +#. `SDC Portal`_ + +.. _`ONAP Home Page`: https://www.onap.org +.. _`ONAP Wiki Page`: https://wiki.onap.org +.. _`ONAP Documentation`: https://docs.onap.org +.. _`ONAP Release Downloads`: https://git.onap.org +.. _`SDC ReadTheDocs`: https://docs.onap.org/projects/onap-sdc/en/latest/ +.. _`SDC Portal`: https://wiki.onap.org/display/DW/Service+Design+and+Creation+%28SDC%29+Portal diff --git a/docs/tox.ini b/docs/tox.ini index edac8c3..6e1245c 100644 --- a/docs/tox.ini +++ b/docs/tox.ini @@ -1,22 +1,32 @@ [tox] minversion = 1.6 -envlist = docs, +envlist = docs,docs-linkcheck,docs-spellcheck skipsdist = true [testenv:docs] -basepython = python3 -deps = -r{toxinidir}/requirements-docs.txt +basepython = python3.8 +deps = + -r{toxinidir}/requirements-docs.txt + -chttps://raw.githubusercontent.com/openstack/requirements/stable/yoga/upper-constraints.txt + -chttps://git.onap.org/doc/plain/etc/upper-constraints.onap.txt?h=master commands = - sphinx-build -b html -n -d {envtmpdir}/doctrees ./ {toxinidir}/_build/html - echo "Generated docs available in {toxinidir}/_build/html" -whitelist_externals = - echo - git - sh + sphinx-build -W -q -b html -n -d {envtmpdir}/doctrees {toxinidir} {toxinidir}/_build/html [testenv:docs-linkcheck] -basepython = python3 -#deps = -r{toxinidir}/requirements-docs.txt -commands = echo "Link Checking not enforced" -#commands = sphinx-build -b linkcheck -d {envtmpdir}/doctrees ./ {toxinidir}/_build/linkcheck -whitelist_externals = echo +basepython = python3.8 +deps = + -r{toxinidir}/requirements-docs.txt + -chttps://raw.githubusercontent.com/openstack/requirements/stable/yoga/upper-constraints.txt + -chttps://git.onap.org/doc/plain/etc/upper-constraints.onap.txt?h=master +commands = + sphinx-build -W -q -b linkcheck -d {envtmpdir}/doctrees {toxinidir} {toxinidir}/_build/linkcheck + +[testenv:docs-spellcheck] +basepython = python3.8 +deps = + -r{toxinidir}/requirements-docs.txt + -chttps://raw.githubusercontent.com/openstack/requirements/stable/yoga/upper-constraints.txt + -chttps://git.onap.org/doc/plain/etc/upper-constraints.onap.txt?h=master +commands = + sphinx-build -W -q -b spelling -d {envtmpdir}/doctrees {toxinidir} {toxinidir}/_build/spellcheck + -- 2.16.6