tests for controller
"""
# ==================================================================================
-# Copyright (c) 2019 Nokia
-# Copyright (c) 2018-2019 AT&T Intellectual Property.
+# Copyright (c) 2019-2020 Nokia
+# Copyright (c) 2018-2020 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.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==================================================================================
-
import time
-from rmr.rmr_mocks import rmr_mocks
-from a1 import a1rmr
-
-
-ADM_CTRL = "admission_control_policy"
-ADM_CTRL_POLICIES = "/a1-p/policytypes/20000/policies"
-ADM_CTRL_INSTANCE = ADM_CTRL_POLICIES + "/" + ADM_CTRL
+import json
+from ricxappframe.rmr.rmr_mocks import rmr_mocks
+from ricxappframe.xapp_sdl import SDLWrapper
+from ricsdl.exceptions import RejectedByBackend, NotConnected, BackendError
+from a1 import a1rmr, data
+
+RCV_ID = "test_receiver"
+ADM_CRTL_TID = 6660666
+ADM_CTRL_IID = "admission_control_policy"
+ADM_CTRL_POLICIES = "/a1-p/policytypes/{0}/policies".format(ADM_CRTL_TID)
+ADM_CTRL_INSTANCE = ADM_CTRL_POLICIES + "/" + ADM_CTRL_IID
ADM_CTRL_INSTANCE_STATUS = ADM_CTRL_INSTANCE + "/status"
-ADM_CTRL_TYPE = "/a1-p/policytypes/20000"
-TEST_TYPE = "/a1-p/policytypes/20001"
+ADM_CTRL_TYPE = "/a1-p/policytypes/{0}".format(ADM_CRTL_TID)
+ACK_MT = 20011
def _fake_dequeue():
"""for monkeypatching with a good status"""
- pay = b'{"policy_type_id": 20000, "policy_instance_id": "admission_control_policy", "handler_id": "test_receiver", "status": "OK"}'
- fake_msg = {"payload": pay}
- return [fake_msg]
+ pay = json.dumps(
+ {"policy_type_id": ADM_CRTL_TID, "policy_instance_id": ADM_CTRL_IID, "handler_id": RCV_ID, "status": "OK"}
+ ).encode()
+ fake_msg = {"payload": pay, "message type": ACK_MT}
+ return [(fake_msg, None)]
def _fake_dequeue_none():
def _fake_dequeue_deleted():
"""for monkeypatching with a DELETED status"""
new_msgs = []
-
- # insert some that don't exist to make sure nothing blows up
- pay = b'{"policy_type_id": 20666, "policy_instance_id": "admission_control_policy", "handler_id": "test_receiver", "status": "DELETED"}'
- fake_msg = {"payload": pay}
- new_msgs.append(fake_msg)
-
- pay = b'{"policy_type_id": 20000, "policy_instance_id": "darkness", "handler_id": "test_receiver", "status": "DELETED"}'
- fake_msg = {"payload": pay}
- new_msgs.append(fake_msg)
+ good_pay = json.dumps(
+ {"policy_type_id": ADM_CRTL_TID, "policy_instance_id": ADM_CTRL_IID, "handler_id": RCV_ID, "status": "DELETED"}
+ ).encode()
+
+ # non existent type id
+ pay = json.dumps(
+ {"policy_type_id": 911, "policy_instance_id": ADM_CTRL_IID, "handler_id": RCV_ID, "status": "DELETED"}
+ ).encode()
+ fake_msg = {"payload": pay, "message type": ACK_MT}
+ new_msgs.append((fake_msg, None))
+
+ # bad instance id
+ pay = json.dumps(
+ {"policy_type_id": ADM_CRTL_TID, "policy_instance_id": "darkness", "handler_id": RCV_ID, "status": "DELETED"}
+ ).encode()
+ fake_msg = {"payload": pay, "message type": ACK_MT}
+ new_msgs.append((fake_msg, None))
+
+ # good body but bad message type
+ fake_msg = {"payload": good_pay, "message type": ACK_MT * 3}
+ new_msgs.append((fake_msg, None))
# insert a bad one with a malformed body to make sure we keep going
- fake_msg = {"payload": "asdf"}
- new_msgs.append(fake_msg)
+ new_msgs.append(({"payload": "asdf", "message type": ACK_MT}, None))
+
+ # not even a json
+ new_msgs.append(("asdf", None))
- pay = b'{"policy_type_id": 20000, "policy_instance_id": "admission_control_policy", "handler_id": "test_receiver", "status": "DELETED"}'
- fake_msg = {"payload": pay}
- new_msgs.append(fake_msg)
+ # good
+ fake_msg = {"payload": good_pay, "message type": ACK_MT}
+ new_msgs.append((fake_msg, None))
return new_msgs
def _test_put_patch(monkeypatch):
rmr_mocks.patch_rmr(monkeypatch)
# assert that rmr bad states don't cause problems
- monkeypatch.setattr("rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(10))
-
- # we need this because free expects a real sbuf
- # TODO: move this into rmr_mocks
- def noop(_sbuf):
- pass
-
- monkeypatch.setattr("rmr.rmr.rmr_free_msg", noop)
-
- # we need to repatch alloc (already patched in patch_rmr) to fix the transactionid, alloc is called in send and recieve
- def fake_alloc(_unused1, _unused2, _unused3, _unused4, _unused5):
- sbuf = rmr_mocks.Rmr_mbuf_t()
- sbuf.contents.xaction = b"d49b53e478b711e9a1130242ac110002"
- return sbuf
-
- # we also need to repatch set, since in the send function, we alloc, then set a new transid
- def fake_set_transactionid(sbuf):
- sbuf.contents.xaction = b"d49b53e478b711e9a1130242ac110002"
-
- # Note, we could have just patched summary, but this patches at a "lower level" so is a better test
- monkeypatch.setattr("rmr.rmr.rmr_alloc_msg", fake_alloc)
- monkeypatch.setattr("rmr.rmr.generate_and_set_transaction_id", fake_set_transactionid)
+ monkeypatch.setattr("ricxappframe.rmr.rmr.rmr_send_msg", rmr_mocks.send_mock_generator(10))
def _no_ac(client):
# type in type list
res = client.get("/a1-p/policytypes")
assert res.status_code == 200
- assert res.json == [20000]
+ assert res.json == [ADM_CRTL_TID]
# instance 200 but empty list
res = client.get(ADM_CTRL_POLICIES)
# instance 200 and in list
res = client.get(ADM_CTRL_POLICIES)
assert res.status_code == 200
- assert res.json == [ADM_CTRL]
+ assert res.json == [ADM_CTRL_IID]
def _delete_instance(client):
def setup_module():
"""module level setup"""
+ # swap sdl for the fake backend
+ data.SDL = SDLWrapper(use_fake_sdl=True)
+
def noop():
pass
"""
test a full A1 workflow
"""
+
+ # put type and instance
_put_ac_type(client, adm_type_good)
_put_ac_instance(client, monkeypatch, adm_instance_good)
res = client.delete(ADM_CTRL_TYPE)
assert res.status_code == 204
+ # test 503 handlers
+
+ def monkey_set(ns, key, value):
+ # set a key override function that throws sdl errors on certain keys
+ if key == "a1.policy_type.111":
+ raise RejectedByBackend()
+ if key == "a1.policy_type.112":
+ raise NotConnected()
+ if key == "a1.policy_type.113":
+ raise BackendError()
+
+ monkeypatch.setattr("a1.data.SDL.set", monkey_set)
+
+ def create_alt_id(json, id):
+ """
+ Overwrites the json's policy type ID, attempts create and tests for 503
+ """
+ json['policy_type_id'] = id
+ url = "/a1-p/policytypes/{0}".format(id)
+ res = client.put(url, json=json)
+ assert res.status_code == 503
+
+ create_alt_id(adm_type_good, 111)
+ create_alt_id(adm_type_good, 112)
+ create_alt_id(adm_type_good, 113)
+
def test_illegal_types(client, adm_type_good):
"""
Test illegal types
"""
- res = client.put("/a1-p/policytypes/19999", json=adm_type_good)
+ # below valid range
+ res = client.put("/a1-p/policytypes/0", json=adm_type_good)
assert res.status_code == 400
- res = client.put("/a1-p/policytypes/21024", json=adm_type_good)
+ # ID mismatch
+ res = client.put("/a1-p/policytypes/1", json=adm_type_good)
+ assert res.status_code == 400
+ # above valid range
+ res = client.put("/a1-p/policytypes/2147483648", json=adm_type_good)
assert res.status_code == 400
assert res.status_code == 200
+def test_metrics(client):
+ """
+ test Prometheus metrics
+ """
+ res = client.get("/a1-p/metrics")
+ assert res.status_code == 200
+
+
def teardown_module():
"""module teardown"""
a1rmr.stop_rmr_thread()