.. ==================================================================================
..       Copyright (c) 2019 Nokia
..       Copyright (c) 2018-2019 AT&T Intellectual Property.
..
..   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.
.. ==================================================================================

A1 Dev Guide
============

Tech Stack
==========

-  OpenAPI3
-  Connexion
-  Flask with Gevent serving
-  Python3.7

Version bumping
===============

This project follows semver. When changes are made, the versions are in:

1) ``docs/release-notes.rst``

2) ``setup.py``

3) ``container-tag.yaml``

4) ``integration_tests/a1mediator/Chart.yaml``

6) ``a1/openapi.yml`` (this is an API version, not a software version)

7) in the it/dep repo that contains a1 helm chart, ``values.yaml``, ``Chart.yml``

Unit Testing
============
Note,  before this will work, for the first time on the machine running the tests, run ``./install_deps.sh``. This is only needed once on the machine.
Also, this requires the python packages ``tox`` and ``pytest``.

::

   tox
   open htmlcov/index.html

Alternatively, you can run the unit tests in Docker (this is somewhat less nice because you don't get the pretty HTML)

::

   docker build  --no-cache -t a1test:latest -f Dockerfile-Unit-Test

Integration testing
===================
This tests A1’s external API with two test receivers. This depends on helm+k8s, meaning you cannot run this if this is not installed.

Unlike the unit tests, however, this does not require rmr to be installed on the base system, as everything
runs in Docker, and the Dockerfiles provide/install rmr.

First, build the latest A1 you are testing (from the root):
::

    docker build  --no-cache -t a1:latest .

Note that this step also runs the unit tests, since running the unit tests are part of the Dockerfile for A1.

If you've never run the integration tests before, build the test receiver, which is referenced in the helm chart:
::

    cd integration_tests
    docker build  --no-cache -t testreceiver:latest .

You do not need the "bombarder" image as they are not currently used in the integration tests (that is more for load testing).

Finally, run all the tests from the root (this requires the python packages ``tox``, ``pytest``, and ``tavern``).
::

   tox -c tox-integration.ini

This script:
1. Deploys 3 helm charts into a local kubernetes installation
2. Port forwards a pod ClusterIP to localhost
3. Uses “tavern” to run some tests against the server
4. Barrages the server with apache bench
5. Tears everything down

Unless you're a core A1 developer, you should probably stop here. The below instructions
are for running A1 locally, without docker, and is much more involved (however useful when developing a1).

Running locally
===============

1. Before this will work, for the first time on that machine, run ``./install_deps.sh``

2. It also requires rmr-python >= 0.10.1 installed. (The dockerfile also
   does this)

3. Create a ``local.rt`` file and copy it into ``/opt/route/local.rt``.
   Note, the example one in ``integration_tests`` will need to be modified for
   your scenario and machine.

4. Copy a ric manifest into ``/opt/ricmanifest.json`` and an rmr mapping
   table into ``/opt/rmr_string_int_mapping.txt``. You can use the test
   ones packaged if you want:

   ::

     cp tests/fixtures/ricmanifest.json /opt/ricmanifest.json
     cp tests/fixtures/rmr_string_int_mapping.txt /opt/rmr_string_int_mapping.txt

5. Then:

   ::

   sudo pip install -e .
   set -x LD_LIBRARY_PATH /usr/local/lib/; set -x RMR_SEED_RT /opt/route/local.rt ; set -x RMR_RCV_RETRY_INTERVAL 500; set -x RMR_RETRY_TIMES 10;
   /usr/bin/run.py


There are also two test receivers in ``integration_tests`` you can run locally.
The first is meant to be used with the ``control_admission`` policy
(that comes in test fixture ric manifest):

::

   set -x LD_LIBRARY_PATH /usr/local/lib/; set -x RMR_SEED_RT /opt/route/local.rt ; python receiver.py

The second can be used against the ``test_policy`` policy to test the
async nature of A1, and to test race conditions. You can start it with
several env variables as follows:

::

   set -x LD_LIBRARY_PATH /usr/local/lib/; set -x RMR_SEED_RT /opt/route/local.rt ; set -x TEST_RCV_PORT 4563; set -x TEST_RCV_RETURN_MINT 10001; set -x TEST_RCV_SEC_DELAY 5; set -x TEST_RCV_RETURN_PAYLOAD '{"ACK_FROM": "DELAYED_TEST", "status": "SUCCESS"}' ; python receiver.py

To test the async nature of A1, trigger a call to ``test_policy``, which
will target the delayed receicer, then immediately call
``control_admission``. The ``control_admission`` policy return should be
returned immediately, whereas the ``test_policy`` should return after
about ``TEST_RCV_SEC_DELAY 5``. The ``test_policy`` should not block A1
while it is sleeping, and both responses should be correct.

::

   curl -v -X PUT -H "Content-Type: application/json" -d '{}' localhost:10000/ric/policies/test_policy
   curl -v -X PUT -H "Content-Type: application/json" -d '{ "enforce":true, "window_length":10, "blocking_rate":20, "trigger_threshold":10 }' localhost:10000/ric/policies/admission_control_policy
   curl -v localhost:10000/ric/policies/admission_control_policy
   curl -v localhost:10000/a1-p/healthcheck

Finally, there is a test “bombarder” that will flood A1 with messages
with good message types but bad transaction IDs, to test A1’s resilience
against queue-overflow attacks

::

   set -x LD_LIBRARY_PATH /usr/local/lib/; set -x RMR_SEED_RT /opt/route/local.rt ;  python bombard.py
