.. 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:

***********************
<project> Release Notes
***********************

.. note::
   * 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

Abstract
========

This document provides the release notes for the ``<releasename>`` release.

Summary
=======

<Give a high level description of your project with regards to this
specific release>


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

+--------------------------------------+--------------------------------------+
| **Project**                          | <project name>                       |
|                                      |                                      |
+--------------------------------------+--------------------------------------+
| **Docker images**                    |  make sure you include all docker    |
|                                      |  images including the                |
|                                      |  release version                     |
|                                      |                                      |
+--------------------------------------+--------------------------------------+
| **Release designation**              | <release name followed by version>   |
|                                      |                                      |
+--------------------------------------+--------------------------------------+
| **Release date**                     | <DD/MM/YYYY>                         |
|                                      |                                      |
+--------------------------------------+--------------------------------------+

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

<Describe new features or other new additions>

**Bug fixes**

- `CIMAN-65 <https://jira.onap.org/browse/CIMAN-65>`_ and a sentence explaining
  what this defect is addressing.

**Known Issues**

- `CIMAN-65 <https://jira.onap.org/browse/CIMAN-65>`_ and two to three sentences
  explaining what this issue is.

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

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


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


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

System Limitations
------------------

Any known system limitations.


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

Results of know vulnerabilities analysis in used modules.


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

Any known workarounds.


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

**Fixed Security Issues**

List of security issues fixed in this release including CVEs and OJSI
tickets.

**Known Security Issues**

List of new security issues that are left unfixed in this release including
CVEs and OJSI tickets.


Test Results
============
List or refer to any project specific results


References
==========

For more information on the ONAP ``<release name>`` 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
