.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0
.. Copyright (C) 2019 AT&T Intellectual Property

Release Notes
===============

All notable changes to this project will be documented in this file.

The format is based on `Keep a Changelog <http://keepachangelog.com/>`__
and this project adheres to `Semantic Versioning <http://semver.org/>`__.

.. contents::
   :depth: 3
   :local:

[2.1.0] - 1/8/2020
------------------

::

    * Represents a resillent version of 2.0.0 that uses Redis for persistence
    * Now relies on SDL and dbaas; SDL is the python interface library to dbaas
    * Adds a 503 http code to nearly all http methods, as A1 now depends on an upstream system
    * Integration tests have a copy of a dbaas helm chart, however the goal is to simplify that deployment per https://jira.o-ran-sc.org/browse/RIC-45
    * Unit tests have a mockup of SDL, however again the goal is to simplify as SDL grows per https://jira.o-ran-sc.org/browse/RIC-44



[2.0.0] - 12/9/2019
-------------------

::

    * Implements new logic around when instances are deleted. See flowcharts in docs/. Basically timeouts now trigger to actually delete instances from a1s database, and these timeouts are configurable.
    * Eliminates the barrier to deleting an instance when no xapp evdr replied (via timeouts)
    * Add two new ENV variables that control timeouts
    * Make unit tests more modular so new workflows can be tested easily
    * Fixes the API for ../status to return a richer structure. This is an (albeit tiny) API change.
    * Clean up unused items in the integration tests helm chart
    * Removed "RMR_RCV_RETRY_INTERVAL" leftovers since this isn't used anymore
    * Uses the standard RIC logging library
    * Switch the backend routing scheme to using subscription id with constant message types, per request.
    * Given the above, policy type ids can be any valid 32bit greater than 0
    * Decouple the API between northbound and A1 from A1 with xapps. This is now two seperate OpenAPI files
    * Update example for AC Xapp
    * Updgrade rmr and rmr-python to utilize new features; lots of cleanups because of that
    * Implements a POLICY QUERY feature where A1 listens for queries for a policy type. A1 then responds via multiple RTS messages every policy instance of that policy type (and expects an ACK back from xapps as usual). This feature can be used for xapp recovery etc.

[1.0.4]
-------

::

    * Only external change here is to healthcheck the rmr thread as part of a1s healthcheck. k8s will now respin a1 if that is failing.
    * Refactors (simplifies) how we wait for rmr initialization; it is now called as part of __init__
    * Refactors (simplifies) how the thread is actually launched; it is now internal to the object and also a part of __init__
    * Cleans up unit testing; a1rmr now exposes a replace_rcv_func; useful for unit testing, harmless if not called otherwise
    * Upgrades to rmr-python 1.0.0 for simpler message allocation

[1.0.3] - 10/22/2019
--------------------

::

    * Move database cleanup (e.g., deleting instances based on statuses) into the polling loop
    * Rework how unit testing works with the polling loop; prior, exceptions were being thrown silently from the thread but not printed. The polling thread has now been paramaterized with override functions for the purposes of testing
    * Make type cleanup more efficient since we know exactly what instances were touched, and it's inefficient to iterate over all instances if they were not
    * Bump rmr-python version, and bump rmr version
    * Still an item left to do in this work; refactor the thread slightly to tie in a healthcheck with a1s healthcheck. We need k8s to restart a1 if that thread dies too.

[1.0.2] - 10/17/2019
--------------------

::

    * a1 now has a seperate, continuous polling thread
      this will enable operations like database cleanup (based on ACKs) and external notifications in real time,
      rather than when the API is invoked
    * all rmr send and receive operations are now in this thread
    * introduces a thread safe job queue between the two threads
    * Not done yet: database cleanups in the thread
    * Bump rmr python version
    * Clean up some logging

[1.0.1] - 10/15/2019
--------------------

::

    * Moves the "database" access calls to mimick the SDL API, in preparation for moving to SDL
    * Does not yet actually use SDL or Redis, but the transition to those will be much shorter after this change.


[1.0.0] - 10/7/2019
-------------------

::

    * Represents v1.0.0 of the A1 API for O-RAN-SC Release A
    * Finished here:
      - Implement type DELETE
      - Clean up where policy instance cleanups happen


[0.14.1] - 10/2/2019
--------------------

::

    * Upgrade rmr to 1.9.0
    * Upgrade rmr-python to 0.13.2
    * Use the new helpers module in rmr-python for the rec all functionality
    * Switch rmr mode to a multithreaded mode that continuously reads from rmr and populates an internal queue of messages with a deterministic queue size (2048) which is better behavior for A1
    * Fix a memory leak (python obj is garbage collected but not the underlying C memory allocation)



[0.14.0] - 10/1/2019
--------------------

::

    * Implement instance delete
    * Moves away from the status vector and now aggregates statuses
    * Pop through a1s mailbox "3x as often"; on all 3 kinds of instance GET since all such calls want the latest information
    * Misc cleanups in controller (closures ftw)
    * Add rmr-version.yaml for CICD jobs

[0.13.0] - 9/25/2019
--------------------

::

    * Implement GET all policy type ids
    * Implement GET all policy instance ids for a policy type
    * fix a tiny bug in integration test receiver


[0.12.1] - 9/20/2019
--------------------

::

    * switch to rmr 1.8.1 to pick up a non blocking variant of rmr that deals with bad routing tables (no hanging connections / blocking calls)
    * improve test receiver to behave with this setup
    * add integration test for this case
    * this also switches past 1.5.x, which included another change that altered the behavior of rts; deal with this with a change to a1s helmchart (env: `RMR_SRC_ID`) that causes the sourceid to be set to a1s service name, which was not needed prior
    * improve integration tests overall


[0.12.0] - 9/19/2019
--------------------

::

    * Implement type PUT
    * Implement type GET
    * Remove RIC manifest
    * Read type GET to get schema for instance PUT
    * Remove Utils (no longer needed)
    * lots more tests (unit and integration)

[0.11.0] - 9/17/2019
--------------------

::

    * This is on the road to release 1.0.0. It is not meant to be tested (E2E) as it's own release
    * Implement the Release A spec in the openapi.yaml
    * Rework A1 to follow that spec
    * Remove rmr_mapping now that we use policyid as the mtype to send and a well known mtype for the ACKs
    * Add the delay receiver test to the tavern integration tests
    * Remove unneeded ENV variables from helm charts
    * Switch away from builder images to avoid quicksand; upgrade rmr at our own pace


[0.10.3] - 8/20/2019
--------------------

::

    * Update to later rmr-python
    * Add docs about upgrading rmr
    * remove bombarder since tavern runs apache bench


[0.10.2] - 8/14/2019
--------------------

::

    * Update to later rmr-python

[0.10.1] - 8/9/2019
-------------------

::

    * Greatly reduce the size of A1 docker from 1.25GB to ~278MB.
    * Add a seperate dockerfile for unit testing


[0.10.0] - 7/30/2019
--------------------

::

   * Rename all /ric/ URLs to be consistent with requirements of /a1-p/


[0.9.0] - 7/22/2019
-------------------

::

   * Implement the GET on policies
   * Add a new endpoint for healthcheck. NOTE, it has been decided by oran architecture documents that this policy interface should be named a1-p in all URLS. In a future release the existing URLs will be renamed (existing URLs were not changed in this release).


[0.8.4] - 7/16/2019
-------------------

::

   * Fix the 400, which was in the API, but wasn't actually implemented
   * Update the test fixture manifests to reflect the latest adm control, paves way for next feature coming which is a policy GET



[0.8.3] - 6/18/2019
-------------------

::

   * Use base Docker with NNG version 1.1.1



[0.8.2] - 6/5/2019
------------------

::

   * Upgrade RMR due to a bug that was preventing rmr from init in kubernetes



[0.8.1] - 5/31/2019
-------------------

::

   * Run unit tests as part of docker build



[0.8.0] - 5/28/2019
-------------------

::

   * Convert docs to appropriate format
   * Move rmr string to int mapping to a file



[0.7.2] - 5/24/2019
-------------------

::

   * Use tavern to test the actual running docker container
   * Restructures the integration tests to run as a single tox command
   * Re-ogranizes the README and splits out the Developers guide, which is not needed by users.


[0.7.1] - 5/23/2019
-------------------

::

   * Adds a defense mechanism against A1 getting queue-overflowed with messages A1 doesnt care about; A1 now ignores all incoming messages it's not waiting for, so it's queue size should now always be "tiny", i.e., never exceeding the number of valid requests it's waiting for ACKs back for
   * Adds a test "bombarding" script that tests this


[0.7.0] - 5/22/19
-----------------

::

   * Main purpose of this change is to fix a potential race condition where A1 sends out M1 expecting ACK1, and while waiting for ACK1, sends out M2 expecting ACK2, but gets back ACK2, ACK1. Prior to this change, A1 may have eaten ACK2 and never fufilled the ACK1 request.
   * Fix a bug in the unit tests (found using a fresh container with no RIC manifest!)
   * Fix a (critical) bug in a1rmr due to a rename in the last iteration (RMR_ERR_RMR_RCV_RETRY_INTERVAL)
   * Make unit tests faster by setting envs in tox
   * Move to the now publically available rmr-python
   * Return a 400 if am xapp does not expect a body, but the PUT provides one
   * Adds a new test policy to the example RIC manifest and a new delayed receiver to test the aformentiond race condition


[0.6.0]
-------

::

   * Upgrade to rmr 0.10.0
   * Fix bad api spec RE GET
   * Fix a (big) bug where transactionid wasn't being checked, which wouldn't have worked on sending two policies to the same downstream policy handler


[0.5.1] - 5/13/2019
-------------------

::

   * Rip some testing structures out of here that should have been in rmr (those are now in rmr 0.9.0, upgrade to that)
   * Run Python BLACK for formatting


[0.5.0] - 5/10/2019
-------------------

::

   * Fix a blocking execution bug by moving from rmr's timeout to a non blocking call + retry loop + asyncronous sleep
   * Changes the ENV RMR_RCV_TIMEOUT to RMR_RCV_RETRY_INTERVAL


[0.4.0] - 5/9.2019
------------------

::

   * Update to rmr 0.8.3
   * Change 503 to 504 for the case where downstream does not reply, per recommendation
   * Add a 502 with different reasons if the xapp replies but with a bad/malformed/missing status
   * Make testing much more modular, in anticipating of moving some unit test functionality into rmr itself


[0.3.4] - 5/8/2019
------------------

::

   * Crash immediately if manifest isn't mounted
   * Add unit tests for utils
   * Add missing lic


[0.3.3]
-------

::

   * Upgrade A1 to rmr 0.8.0
   * Go from deb RMR installation to git
   * Remove obnoxious receiver logging


[0.3.2]
-------

::

   * Upgrade A1 to rmr 0.6.0


[0.3.1]
-------

::

   * Add license headers


[0.3.0]
-------

::

   * Introduce RIC Manifest
   * Move some testing functionality into a helper module
   * Read the policyname to rmr type mapping from manifest
   * Do PUT payload validation based on the manifest


[0.2.0]
-------

::

   * Bump rmr python dep version
   * Include a Dockerized test receiver
   * Stencil out the mising GET
   * Update the OpenAPI
   * Include a test docker compose file


[0.1.0]
-------

::

   * Initial Implementation
