blob: 9ce6e51cac3c4c4f3d2ab7c879d6901cbba1c7e7 [file] [log] [blame]
Tommy Carpentercc2250a2019-05-30 15:06:37 -04001.. ==================================================================================
2.. Copyright (c) 2019 Nokia
3.. Copyright (c) 2018-2019 AT&T Intellectual Property.
4..
5.. Licensed under the Apache License, Version 2.0 (the "License");
6.. you may not use this file except in compliance with the License.
7.. You may obtain a copy of the License at
8..
9.. http://www.apache.org/licenses/LICENSE-2.0
10..
11.. Unless required by applicable law or agreed to in writing, software
12.. distributed under the License is distributed on an "AS IS" BASIS,
13.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14.. See the License for the specific language governing permissions and
15.. limitations under the License.
16.. ==================================================================================
17
18A1 Dev Guide
19============
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040020
21Tech Stack
22==========
23
24- OpenAPI3
25- Connexion
26- Flask with Gevent serving
27- Python3.7
28
29Version bumping
30===============
31
32This project follows semver. When changes are made, the versions are in:
33
341) ``docs/release-notes.rst``
35
362) ``setup.py``
37
Tommy Carpenter810fcb72019-06-05 12:42:52 -0400383) ``container-tag.yaml``
39
Lott, Christopher (cl778h)438a0a62019-06-18 06:50:13 -0400404) ``integration_tests/a1mediator/Chart.yaml``
Tommy Carpenter18dcbc32019-06-04 10:20:30 -040041
Lott, Christopher (cl778h)438a0a62019-06-18 06:50:13 -0400426) ``a1/openapi.yml`` (this is an API version, not a software version)
Tommy Carpenter5ad8f032019-05-30 14:33:21 -040043
Tommy Carpenter971c91c2019-06-12 09:25:48 -0400447) in the it/dep repo that contains a1 helm chart, ``values.yaml``, ``Chart.yml``
45
Lott, Christopher (cl778h)d5024702019-08-20 15:22:45 -040046Version bumping rmr-python
47==========================
48rmr-python is a critial dependency of A1. Bumping the rmr version dependency requires changes in:
49
501) ``setup.py``
51
522) ``Dockerfile``
53
543) ``integration_tests/Dockerfile``
55
56Run the integration tests after attempting this.
57
Tommy Carpenter7dbbfbc2019-06-18 09:58:55 -040058Unit Testing
59============
Tommy Carpenter24514462019-07-16 11:25:52 -040060Note, 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.
61Also, this requires the python packages ``tox`` and ``pytest``.
Tommy Carpenter7dbbfbc2019-06-18 09:58:55 -040062
63::
64
65 tox
66 open htmlcov/index.html
67
Tommy Carpenter296f8de2019-08-07 11:38:44 -040068Alternatively, you can run the unit tests in Docker (this is somewhat less nice because you don't get the pretty HTML)
69
70::
71
72 docker build --no-cache -t a1test:latest -f Dockerfile-Unit-Test
73
Tommy Carpenter7dbbfbc2019-06-18 09:58:55 -040074Integration testing
75===================
76This tests A1’s external API with two test receivers. This depends on helm+k8s, meaning you cannot run this if this is not installed.
77
78Unlike the unit tests, however, this does not require rmr to be installed on the base system, as everything
79runs in Docker, and the Dockerfiles provide/install rmr.
80
81First, build the latest A1 you are testing (from the root):
82::
83
84 docker build --no-cache -t a1:latest .
85
86Note that this step also runs the unit tests, since running the unit tests are part of the Dockerfile for A1.
87
88If you've never run the integration tests before, build the test receiver, which is referenced in the helm chart:
89::
90
91 cd integration_tests
92 docker build --no-cache -t testreceiver:latest .
93
Tommy Carpenter7dbbfbc2019-06-18 09:58:55 -040094Finally, run all the tests from the root (this requires the python packages ``tox``, ``pytest``, and ``tavern``).
95::
96
97 tox -c tox-integration.ini
98
99This script:
1001. Deploys 3 helm charts into a local kubernetes installation
1012. Port forwards a pod ClusterIP to localhost
1023. Uses tavern to run some tests against the server
1034. Barrages the server with apache bench
1045. Tears everything down
105
Tommy Carpenterfdf05042019-07-18 20:21:21 +0000106Unless you're a core A1 developer, you should probably stop here. The below instructions
107are for running A1 locally, without docker, and is much more involved (however useful when developing a1).
108
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400109Running locally
110===============
111
Tommy Carpenter24514462019-07-16 11:25:52 -04001121. Before this will work, for the first time on that machine, run ``./install_deps.sh``
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400113
Lott, Christopher (cl778h)d5024702019-08-20 15:22:45 -04001142. It also requires rmr-python installed. (The dockerfile does this)
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400115
1163. Create a ``local.rt`` file and copy it into ``/opt/route/local.rt``.
Tommy Carpenterfdf05042019-07-18 20:21:21 +0000117 Note, the example one in ``integration_tests`` will need to be modified for
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400118 your scenario and machine.
119
1204. Copy a ric manifest into ``/opt/ricmanifest.json`` and an rmr mapping
121 table into ``/opt/rmr_string_int_mapping.txt``. You can use the test
122 ones packaged if you want:
123
124 ::
125
Tommy Carpenterfdf05042019-07-18 20:21:21 +0000126 cp tests/fixtures/ricmanifest.json /opt/ricmanifest.json
127 cp tests/fixtures/rmr_string_int_mapping.txt /opt/rmr_string_int_mapping.txt
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400128
1295. Then:
130
Tommy Carpenterfdf05042019-07-18 20:21:21 +0000131 ::
132
133 sudo pip install -e .
134 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;
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400135 /usr/bin/run.py
136
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400137
Tommy Carpenter09edf282019-06-11 09:10:23 -0400138There are also two test receivers in ``integration_tests`` you can run locally.
Tommy Carpenter5ad8f032019-05-30 14:33:21 -0400139The first is meant to be used with the ``control_admission`` policy
140(that comes in test fixture ric manifest):
141
142::
143
144 set -x LD_LIBRARY_PATH /usr/local/lib/; set -x RMR_SEED_RT /opt/route/local.rt ; python receiver.py
145
146The second can be used against the ``test_policy`` policy to test the
147async nature of A1, and to test race conditions. You can start it with
148several env variables as follows:
149
150::
151
152 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
153
154To test the async nature of A1, trigger a call to ``test_policy``, which
155will target the delayed receicer, then immediately call
156``control_admission``. The ``control_admission`` policy return should be
157returned immediately, whereas the ``test_policy`` should return after
158about ``TEST_RCV_SEC_DELAY 5``. The ``test_policy`` should not block A1
159while it is sleeping, and both responses should be correct.
160
161::
162
163 curl -v -X PUT -H "Content-Type: application/json" -d '{}' localhost:10000/ric/policies/test_policy
Tommy Carpenter24514462019-07-16 11:25:52 -0400164 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
Tommy Carpenterfdf05042019-07-18 20:21:21 +0000165 curl -v localhost:10000/ric/policies/admission_control_policy
166 curl -v localhost:10000/a1-p/healthcheck