From 1b5963e491b665ecb99b8e42a116df4f452be50f Mon Sep 17 00:00:00 2001 From: krishnaa96 Date: Fri, 23 Oct 2020 13:33:29 +0530 Subject: Run AAISIM using mountebank Mountebank is an over the wire test double. (http://www.mbtest.org/) The AAI api for NSI and NSSI are the same. This makes it difficult to create stub using exisiting web server(web.py). So, lets move aaisim to more flexible mock server Issue-ID: OPTFRA-865 Signed-off-by: krishnaa96 Change-Id: I77c48fa3e491b3f73d1d5454625ffa27200f4751 --- .../simulators/aaisim/aai_imposter.jsont | 156 +++++++++++++++++++++ .../aaisim/responses/get_nsi_response.json | 84 +++++++++++ .../aaisim/responses/get_nssi_response.json | 5 +- .../tests/functional/simulators/imposter.py | 24 ++++ .../tests/functional/simulators/run_aaisim.sh | 12 +- 5 files changed, 278 insertions(+), 3 deletions(-) create mode 100644 conductor/conductor/tests/functional/simulators/aaisim/aai_imposter.jsont create mode 100644 conductor/conductor/tests/functional/simulators/aaisim/responses/get_nsi_response.json create mode 100644 conductor/conductor/tests/functional/simulators/imposter.py (limited to 'conductor') diff --git a/conductor/conductor/tests/functional/simulators/aaisim/aai_imposter.jsont b/conductor/conductor/tests/functional/simulators/aaisim/aai_imposter.jsont new file mode 100644 index 0000000..93799cd --- /dev/null +++ b/conductor/conductor/tests/functional/simulators/aaisim/aai_imposter.jsont @@ -0,0 +1,156 @@ +{ + "port": 8081, + "protocol": "http", + "stubs": [{ + "responses": [ + { "is": { + "statusCode": 200, + "body": {{ get_nsi_response }} + } + } + ], + "predicates": [{ + "and": [ + { + "equals": { + "path": "/aai/v14/nodes/service-instances", + "method": "GET", + "query": { + "model-version-id": "bfba363e-e39c-4bd9-a9d5-1371c28f4d22", + "model-invariant-id": "21d57d4b-52ad-4d3c-a798-248b5bb9124a", + "depth": 2 + } + } + } + ] + }] + }, + { + "responses": [ + { "is": { + "statusCode": 200, + "body": {{ get_nssi_response }} + } + } + ], + "predicates": [{ + "and": [ + { + "equals": { + "path": "/aai/v14/nodes/service-instances", + "method": "GET", + "query": { + "model-version-id": "8d770214-d3e7-43ea-b7a6-9b235dcbcd34", + "model-invariant-id": "c343a533-c045-4ec0-bbb6-f30eb8eb5a41", + "depth": 2 + } + } + } + ] + }] + }, + { + "responses": [ + { "is": { + "statusCode": 200, + "body": {{ healthcheck }} + } + } + ], + "predicates": [{ + "and": [ + { + "equals": { + "path": "/healthcheck", + "method": "GET" + } + } + ] + }] + }, + { + "responses": [ + { "is": { + "statusCode": 200, + "body": {{ get_onap_regions }} + } + } + ], + "predicates": [{ + "and": [ + { + "equals": { + "path": "/aai/v14/cloud-infrastructure/cloud-regions/", + "method": "GET" + } + } + ] + }] + }, + { + "responses": [ + { "is": { + "statusCode": 200, + "body": {{ get_onap_complex_DLLSTX233 }} + } + } + ], + "predicates": [{ + "and": [ + { + "equals": { + "path": "/aai/v14/cloud-infrastructure/complexes/complex/DLLSTX233", + "method": "GET" + } + } + ] + }] + }, + { + "responses": [ + { "is": { + "statusCode": 200, + "body": {{ get_flavors_cloud_region_1 }} + } + } + ], + "predicates": [{ + "and": [ + { + "equals": { + "path": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/HPA-cloud/cloud-region-1/flavors/", + "method": "GET" + } + } + ] + }] + }, + { + "responses": [ + { "is": { + "statusCode": 200, + "body": {{ get_flavors_cloud_region_2 }} + } + } + ], + "predicates": [{ + "and": [ + { + "equals": { + "path": "/aai/v14/cloud-infrastructure/cloud-regions/cloud-region/HPA-cloud/cloud-region-2/flavors/", + "method": "GET" + } + } + ] + }] + }, + { + "responses": [ + { "is": { + "statusCode": 404, + "body": "Not found" + } + } + ] + }] +} diff --git a/conductor/conductor/tests/functional/simulators/aaisim/responses/get_nsi_response.json b/conductor/conductor/tests/functional/simulators/aaisim/responses/get_nsi_response.json new file mode 100644 index 0000000..3d3f080 --- /dev/null +++ b/conductor/conductor/tests/functional/simulators/aaisim/responses/get_nsi_response.json @@ -0,0 +1,84 @@ +{"service-instance": [{ + "service-instance-id": "1a636c4d-5e76-427e-bfd6-241a947224b0", + "service-instance-name": "nsi_test_0211", + "service-type": "embb", + "service-role": "nsi", + "service-function": "shared", + "model-invariant-id": "21d57d4b-52ad-4d3c-a798-248b5bb9124a", + "model-version-id": "bfba363e-e39c-4bd9-a9d5-1371c28f4d22", + "resource-version": "1581418601616", + "orchestration-status": "active", + "relationship-list": { + "relationship": [ + { + "related-to": "service-instance", + "relationship-label": "org.onap.relationships.inventory.ComposedOf", + "related-link": "/aai/v16/business/customers/customer/5GCustomer/service-subscriptions/service-subscription/5G/service-instances/service-instance/4115d3c8-dd59-45d6-b09d-e756dee9b518", + "relationship-data": [ + { + "relationship-key": "customer.global-customer-id", + "relationship-value": "5GCustomer" + }, + { + "relationship-key": "service-subscription.service-type", + "relationship-value": "5G" + }, + { + "relationship-key": "service-instance.service-instance-id", + "relationship-value": "4115d3c8-dd59-45d6-b09d-e756dee9b518" + } + ], + "related-to-property": [ + { + "property-key": "service-instance.service-instance-name", + "property-value": "csi_test_0211" + } + ] + } + ] + }, + "service-profiles": { + "service-profile": [ + { + "profile-id": "cdad9f49-4201-4e3a-aac1-b0f27902c299", + "latency": 20, + "max-number-of-UEs": 0, + "coverage-area-TA-list": "Chennai", + "ue-mobility-level": "stationary", + "resource-sharing-level": "0", + "exp-data-rate-UL": 100, + "exp-data-rate-DL": 100, + "activity-factor": 0, + "e2e-latency": 0, + "jitter": 0, + "survival-time": 0, + "exp-data-rate": 0, + "payload-size": 0, + "traffic-density": 0, + "conn-density": 0, + "reliability": 99.999, + "resource-version": "1581418602494" + }, + { + "profile-id": "fe579f49-4201-4e3a-aac1-b0f27902c276", + "latency": 17, + "max-number-of-UEs": 0, + "coverage-area-TA-list": "Chennai", + "ue-mobility-level": "stationary", + "resource-sharing-level": "0", + "exp-data-rate-UL": 100, + "exp-data-rate-DL": 100, + "activity-factor": 0, + "e2e-latency": 0, + "jitter": 0, + "survival-time": 0, + "exp-data-rate": 0, + "payload-size": 0, + "traffic-density": 0, + "conn-density": 0, + "reliability": 99.999, + "resource-version": "1581418602494" + } + ] + } +}]} diff --git a/conductor/conductor/tests/functional/simulators/aaisim/responses/get_nssi_response.json b/conductor/conductor/tests/functional/simulators/aaisim/responses/get_nssi_response.json index b7ef43b..0e00ca3 100644 --- a/conductor/conductor/tests/functional/simulators/aaisim/responses/get_nssi_response.json +++ b/conductor/conductor/tests/functional/simulators/aaisim/responses/get_nssi_response.json @@ -3,7 +3,8 @@ "service-instance-name": "nssi_test_0211", "service-type": "embb", "service-role": "nssi", - "environment-context": "cn", + "service-function": "shared", + "workload-context": "cn", "model-invariant-id": "21d57d4b-52ad-4d3c-a798-248b5bb9124a", "model-version-id": "bfba363e-e39c-4bd9-a9d5-1371c28f4d22", "resource-version": "1581418601616", @@ -43,7 +44,7 @@ "profile-id": "cdad9f49-4201-4e3a-aac1-b0f27902c299", "latency": 20, "max-number-of-UEs": 0, - "coverage-area-TA-list": "[{\"province\":\"??\",\"city\":\"???\",\"county\":\"???\",\"street\":\"?????\"}]", + "coverage-area-TA-list": "Chennai", "ue-mobility-level": "stationary", "resource-sharing-level": "0", "exp-data-rate-UL": 100, diff --git a/conductor/conductor/tests/functional/simulators/imposter.py b/conductor/conductor/tests/functional/simulators/imposter.py new file mode 100644 index 0000000..50da73f --- /dev/null +++ b/conductor/conductor/tests/functional/simulators/imposter.py @@ -0,0 +1,24 @@ +from jinja2 import Template +import json +import os +import re +import sys + +imposter_template = sys.argv[1] +responses_dir = sys.argv[2] +imposter_json = sys.argv[3] + +with open(imposter_template, 'r') as imposter_file: + tm = Template(imposter_file.read()) + +responses = {} + +for filename in os.listdir(responses_dir): + if filename.endswith('.json'): + with open(os.path.join(responses_dir, filename), 'r') as response_file: + responses[re.sub('\.json$', '', filename)] = response_file.read() + +imposter = tm.render(responses) + +with open(imposter_json, 'w') as imposter_file: + imposter_file.write(imposter) diff --git a/conductor/conductor/tests/functional/simulators/run_aaisim.sh b/conductor/conductor/tests/functional/simulators/run_aaisim.sh index 203de16..288049d 100755 --- a/conductor/conductor/tests/functional/simulators/run_aaisim.sh +++ b/conductor/conductor/tests/functional/simulators/run_aaisim.sh @@ -17,5 +17,15 @@ # # ------------------------------------------------------------------------- # -docker run -d --name aaisim -p 8081:8081 aaisim +#docker run -d --name aaisim -p 8081:8081 aaisim +docker run --name aaisim -p 2525:2525 -p 8081:8081 -d andyrbell/mountebank:2.3.2 +sleep 10 + +#generate imposter data +python3 imposter.py aaisim/aai_imposter.jsont aaisim/responses aai_imposter.json + +#Add imposter at 8081 +curl -i -X POST -H 'Content-Type: application/json' http://localhost:2525/imposters --data @aai_imposter.json + +rm -rf aai_imposter.json -- cgit 1.2.3-korg