.. This work is licensed under a Creative Commons Attribution 4.0
   International License.
.. http://creativecommons.org/licenses/by/4.0
.. (c) ONAP Project and its contributors
.. _release_notes_london:

:orphan:

*************************************
ONAP Operations Manager Release Notes
*************************************

Previous Release Notes
======================

- :ref:`Kohn <release_notes_kohn>`
- :ref:`Jakarta <release_notes_jakarta>`
- :ref:`Istanbul <release_notes_istanbul>`
- :ref:`Honolulu <release_notes_honolulu>`
- :ref:`Guilin <release_notes_guilin>`
- :ref:`Frankfurt <release_notes_frankfurt>`
- :ref:`El Alto <release_notes_elalto>`
- :ref:`Dublin <release_notes_dublin>`
- :ref:`Casablanca <release_notes_casablanca>`
- :ref:`Beijing <release_notes_beijing>`
- :ref:`Amsterdam <release_notes_amsterdam>`

Abstract
========

This document provides the release notes for the London release.

Summary
=======



Release Data
============

+--------------------------------------+--------------------------------------+
| **Project**                          | OOM                                  |
|                                      |                                      |
+--------------------------------------+--------------------------------------+
| **Docker images**                    | N/A                                  |
|                                      |                                      |
+--------------------------------------+--------------------------------------+
| **Release designation**              | London                               |
|                                      |                                      |
+--------------------------------------+--------------------------------------+
| **Release date**                     | 2023/06/xx                           |
|                                      |                                      |
+--------------------------------------+--------------------------------------+

New features
------------

* Introduction of "Production" ONAP setup, including:

  * Istio Service Mesh based deployment
  * Ingress (Istio-Gateway) deployment and usage as standard external access method
  * Internal Security provided by ServiceMesh and Component2Component AuthorizationPolicies
  * External Security by introducing AuthN/Z using Keycloak and OAuth2Proxy for Ingress Access

* Removal of unsupported components (AAF, Portal, Contrib,...)
* Update of Helmcharts to use common templates and practices
* Optional support for Cassandra 4.x using k8ssandra-operator

* `REQ-1349 <https://jira.onap.org/browse/REQ-1349>`_ Removal of AAF.
  Internal communication encryption and authorization is offered by ServiceMesh

* `REQ-1350 <https://jira.onap.org/browse/REQ-1350>`_ All component must be
  able to run without MSB. Component helm charts modified to use MSB optionally
  and test the components during Daily and Gating with and without MSB

* `REQ-1351 <https://jira.onap.org/browse/REQ-1351>`_ External secure
  communication only via Ingress.
  Ingress resources created by templates and Ingress installation is described
  in the OOM documents

**Bug fixes**

A list of issues resolved in this release can be found here:
https://jira.onap.org/projects/OOM/versions/11500

**Known Issues**

* Components not working under ServiceMesh

  * CDS UI
  * SO Monitor UI
  * CLI

Deliverables
------------

Software Deliverables
~~~~~~~~~~~~~~~~~~~~~

OOM provides `Helm charts <https://nexus3.onap.org/service/rest/repository/browse/onap-helm-release/>`_

Documentation Deliverables
~~~~~~~~~~~~~~~~~~~~~~~~~~

- :ref:`Project Description <oom_project_description>` - a guide for developers of OOM
- :ref:`oom_dev_guide` - a guide for developers of OOM
- :ref:`oom_infra_guide` - a guide for those setting up the environments that OOM will use
- :ref:`oom_deploy_guide` - a guide for those deploying OOM on an existing cloud
- :ref:`oom_user_guide` - a guide for operators of an OOM instance
- :ref:`oom_access_info_guide` - a guide for operators who require access to OOM applications

Known Limitations, Issues and Workarounds
=========================================

Known Vulnerabilities
---------------------

* Cassandra version needs to be updated to support new Python version
  see `OOM-2900 <https://jira.onap.org/browse/OOM-2900>`_
  In London supported as option (using k8ssandra-operator), see :ref:`oom_base_optional_addons`

Workarounds
-----------

Security Notes
--------------

**Fixed Security Issues**

References
==========

For more information on the ONAP Istanbul release, please see:

#. `ONAP Home Page`_
#. `ONAP Documentation`_
#. `ONAP Release Downloads`_
#. `ONAP Wiki Page`_


.. _`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
