aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGary Wu <gary.i.wu@huawei.com>2019-04-05 14:31:28 +0000
committerGerrit Code Review <gerrit@onap.org>2019-04-05 14:31:28 +0000
commitd9bff4f29a1eec5984b7808b02b3185482d6d95f (patch)
tree00f7966c34e347e034c84975d0eb770bcaa0344b
parent9ddc27a76e286e77843db7c1c7296732be559f8c (diff)
parent40c1ddcef93d169922cdb2b95a817e2ff50a25ce (diff)
Merge "CSIT tests for bbs-event-processor"
-rw-r--r--plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/setup.sh39
-rw-r--r--plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/teardown.sh21
-rw-r--r--plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/testplan.txt3
-rw-r--r--tests/dcaegen2/bbs-testcases/__init__.robot2
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnf_not_found.json17
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnfs.json46
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/aai_records/aai_services.json46
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_all_fields.json30
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_new_old_state.json29
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_rgmac.json30
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_sourceName.json30
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_wrong_sourceName.json30
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_without_swversion.json16
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_not_json_format.json30
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/auth_policy_with_all_fields.json23
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_all_fields.json16
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_attachment.json15
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_correlation.json15
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_wrong_correlation.json15
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/update_not_json_format.json15
-rw-r--r--tests/dcaegen2/bbs-testcases/assets/json_events/update_policy_with_all_fields.json24
-rw-r--r--tests/dcaegen2/bbs-testcases/bbs_tests.robot117
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/BbsLibrary.py173
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/bbs_library.robot108
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/docker-compose.yml64
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/AAI.py108
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/AAI_simulator6
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP.py92
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP_simulator6
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/aai_aai.onap.org.cer55
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/ca_local_0.cer31
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/dmaap_bc_topic_mgr_dmaap_bc.onap.org.cer51
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/keystore.password1
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.aai.key29
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.jksbin0 -> 4512 bytes
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.trust.jksbin0 -> 1413 bytes
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dmaap-bc.key29
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/certs/truststore.password1
-rw-r--r--tests/dcaegen2/bbs-testcases/resources/simulator/httpServerLib.py37
39 files changed, 1400 insertions, 0 deletions
diff --git a/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/setup.sh b/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/setup.sh
new file mode 100644
index 00000000..9551ce43
--- /dev/null
+++ b/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/setup.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+source ${SCRIPTS}/common_functions.sh
+
+export BBS_SERVICE="bbs"
+# export SSL_BBS_SERVICE="ssl_bbs"
+export DMAAP_SIMULATOR="dmaap_simulator"
+export AAI_SIMULATOR="aai_simulator"
+
+cd ${WORKSPACE}/tests/dcaegen2/bbs-testcases/resources/
+
+pip uninstall -y docker-py
+pip uninstall -y docker
+pip install -U docker==2.7.0
+docker-compose up -d --build
+
+BBS_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${BBS_SERVICE})
+# SSL_BBS_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${SSL_BBS_SERVICE})
+DMAAP_SIMULATOR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${DMAAP_SIMULATOR})
+AAI_SIMULATOR_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${AAI_SIMULATOR})
+
+bypass_ip_adress ${BBS_IP}
+# bypass_ip_adress ${SSL_BBS_IP}
+bypass_ip_adress ${DMAAP_SIMULATOR_IP}
+bypass_ip_adress ${AAI_SIMULATOR_IP}
+
+echo BBS_IP=${BBS_IP}
+# echo SSL_BBS_IP=${SSL_BBS_IP}
+echo DMAAP_SIMULATOR_IP=${DMAAP_SIMULATOR_IP}
+echo AAI_SIMULATOR_IP=${AAI_SIMULATOR_IP}
+
+# Wait for initialization of BBS services
+# Same ports in the testcases docker compose
+wait_for_service_init localhost:32100/heartbeat
+#wait_for_service_init localhost:8200/heartbeat
+
+# #Pass any variables required by Robot test suites in ROBOT_VARIABLES
+ROBOT_VARIABLES="-v DMAAP_SIMULATOR_SETUP:${DMAAP_SIMULATOR_IP}:2224 -v AAI_SIMULATOR_SETUP:${AAI_SIMULATOR_IP}:3335"
+
diff --git a/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/teardown.sh b/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/teardown.sh
new file mode 100644
index 00000000..6cc85f54
--- /dev/null
+++ b/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/teardown.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+#
+# Copyright 2017 Nokia, Inc. and others.
+#
+# 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.
+#
+
+kill-instance.sh bbs
+# kill-instance.sh ssl_bbs
+kill-instance.sh dmaap_simulator
+kill-instance.sh aai_simulator
diff --git a/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/testplan.txt b/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/testplan.txt
new file mode 100644
index 00000000..9f1794bd
--- /dev/null
+++ b/plans/dcaegen2-services-bbs-event-processor/bbs-testsuites/testplan.txt
@@ -0,0 +1,3 @@
+# Test suites are relative paths under [integration/csit.git]/tests/.
+# Place the suites in run order.
+dcaegen2/bbs-testcases
diff --git a/tests/dcaegen2/bbs-testcases/__init__.robot b/tests/dcaegen2/bbs-testcases/__init__.robot
new file mode 100644
index 00000000..d9957dd3
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/__init__.robot
@@ -0,0 +1,2 @@
+*** Settings ***
+Documentation Integration - BBS suite \ No newline at end of file
diff --git a/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnf_not_found.json b/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnf_not_found.json
new file mode 100644
index 00000000..23c169fd
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnf_not_found.json
@@ -0,0 +1,17 @@
+[
+{
+ "requestError": {
+ "serviceException": {
+ "messageId": "SVC3001",
+ "text": "Resource not found for %1 using id %2 (msg=%3) (ec=%4)",
+ "variables": [
+ "GET",
+ "nodes/pnfs/pnf/Wrong-PNF-Name",
+ "Node Not Found:No Node of type pnf found at: nodes/pnfs/pnf/Wrong-PNF-Name",
+ "ERR.5.4.6114"
+ ]
+ }
+ }
+}
+
+]
diff --git a/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnfs.json b/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnfs.json
new file mode 100644
index 00000000..4ea7827f
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnfs.json
@@ -0,0 +1,46 @@
+[
+{
+ "pnf-name": "NVendor-Equip_Model-SN1234",
+ "in-maint": true,
+ "resource-version": "1551889263181",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "service-instance",
+ "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+ "related-link": "/aai/v14/business/customers/customer/766162a3-53a9-42b8-8fe2-ebaa2213a6dd/service-subscriptions/service-subscription/BBS-CFS11/service-instances/service-instance/1923eaa8-8ab7-49ef-b4c2-e185efbbe832",
+ "relationship-data": [
+ {
+ "relationship-key": "customer.global-customer-id",
+ "relationship-value": "766162a3-53a9-42b8-8fe2-ebaa2213a6dd"
+ },
+ {
+ "relationship-key": "service-subscription.service-type",
+ "relationship-value": "BBS-CFS11"
+ },
+ {
+ "relationship-key": "service-instance.service-instance-id",
+ "relationship-value": "1923eaa8-8ab7-49ef-b4c2-e185efbbe832"
+ }
+ ],
+ "related-to-property": [
+ {
+ "property-key": "service-instance.service-instance-name"
+ }
+ ]
+ },
+ {
+ "related-to": "logical-link",
+ "relationship-label": "org.onap.relationships.inventory.BridgedTo",
+ "related-link": "/aai/v14/network/logical-links/logical-link/olt11-11-11",
+ "relationship-data": [
+ {
+ "relationship-key": "logical-link.link-name",
+ "relationship-value": "olt11-11-11"
+ }
+ ]
+ }
+ ]
+ }
+}
+]
diff --git a/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_services.json b/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_services.json
new file mode 100644
index 00000000..351cc780
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_services.json
@@ -0,0 +1,46 @@
+[
+{
+ "service-instance-id": "1923eaa8-8ab7-49ef-b4c2-e185efbbe832",
+ "resource-version": "1551889260591",
+ "orchestration-status": "assigned",
+ "relationship-list": {
+ "relationship": [
+ {
+ "related-to": "pnf",
+ "relationship-label": "org.onap.relationships.inventory.ComposedOf",
+ "related-link": "/aai/v14/network/pnfs/pnf/NVendor-Equip_Model-SN1234",
+ "relationship-data": [
+ {
+ "relationship-key": "pnf.pnf-name",
+ "relationship-value": "NVendor-Equip_Model-SN1234"
+ }
+ ]
+ }
+ ]
+ },
+ "metadata": {
+ "metadatum": [
+ {
+ "metaname": "cvlan",
+ "metaval": "1005",
+ "resource-version": "1551889260599"
+ },
+ {
+ "metaname": "svlan",
+ "metaval": "100",
+ "resource-version": "1551889260608"
+ },
+ {
+ "metaname": "oltName",
+ "metaval": "olt1",
+ "resource-version": "1551889260616"
+ },
+ {
+ "metaname": "rgw-mac-address",
+ "metaval": "01:02:03:04:05:06",
+ "resource-version": "1551889260624"
+ }
+ ]
+ }
+}
+]
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_all_fields.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_all_fields.json
new file mode 100644
index 00000000..3ad1fec0
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_all_fields.json
@@ -0,0 +1,30 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4.0.1",
+ "eventName": "StateChange_cpe_authentication",
+ "domain": "stateChange",
+ "eventId": "ab305d54-85b4-a31b-7db2fb6b9e546015",
+ "eventType": "applicationNf",
+ "sourceId": "",
+ "sourceName": "NVendor-Equip_Model-SN1234",
+ "reportingEntityId": "",
+ "reportingEntityName": "thirdparty-sdnc-idfromesrrequest",
+ "priority": "Normal",
+ "startEpochMicrosec": 1.413378172e+15,
+ "lastEpochMicrosec": 1.413378172e+15,
+ "sequence": 0,
+ "vesEventListenerVersion": "7.1"
+ },
+ "stateChangeFields": {
+ "stateChangeFieldsVersion": 1,
+ "oldState": "outOfService",
+ "newState": "inService",
+ "stateInterface": "",
+ "additionalFields": {
+ "macAddress": "01:02:03:04:05:06",
+ "swVersion": "1.2.3"
+ }
+ }
+ }
+}
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_new_old_state.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_new_old_state.json
new file mode 100644
index 00000000..2c14d468
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_new_old_state.json
@@ -0,0 +1,29 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4.0.1",
+ "eventName": "StateChange_cpe_authentication",
+ "domain": "stateChange",
+ "eventId": "ab305d54-85b4-a31b-7db2fb6b9e546015",
+ "eventType": "applicationNf",
+ "sourceId": "",
+ "sourceName": "NVendor-Equip_Model-SN1234",
+ "reportingEntityId": "",
+ "reportingEntityName": "thirdparty-sdnc-idfromesrrequest",
+ "priority": "Normal",
+ "startEpochMicrosec": 1.413378172e+15,
+ "lastEpochMicrosec": 1.413378172e+15,
+ "sequence": 0,
+ "vesEventListenerVersion": "7.1"
+ },
+ "stateChangeFields": {
+ "stateChangeFieldsVersion": 1,
+ "oldState": "",
+ "newState": "",
+ "stateInterface": "",
+ "additionalFields": {
+ "macAddress": "01:02:03:04:05:06"
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_rgmac.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_rgmac.json
new file mode 100644
index 00000000..21d97259
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_rgmac.json
@@ -0,0 +1,30 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4.0.1",
+ "eventName": "StateChange_cpe_authentication",
+ "domain": "stateChange",
+ "eventId": "ab305d54-85b4-a31b-7db2fb6b9e546015",
+ "eventType": "applicationNf",
+ "sourceId": "",
+ "sourceName": "NVendor-Equip_Model-SN1234",
+ "reportingEntityId": "",
+ "reportingEntityName": "thirdparty-sdnc-idfromesrrequest",
+ "priority": "Normal",
+ "startEpochMicrosec": 1.413378172e+15,
+ "lastEpochMicrosec": 1.413378172e+15,
+ "sequence": 0,
+ "vesEventListenerVersion": "7.1"
+ },
+ "stateChangeFields": {
+ "stateChangeFieldsVersion": 1,
+ "oldState": "outOfService",
+ "newState": "inService",
+ "stateInterface": "",
+ "additionalFields": {
+ "macAddress": "",
+ "swVersion": "1.2.3"
+ }
+ }
+ }
+}
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_sourceName.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_sourceName.json
new file mode 100644
index 00000000..538a56c6
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_sourceName.json
@@ -0,0 +1,30 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4.0.1",
+ "eventName": "StateChange_cpe_authentication",
+ "domain": "stateChange",
+ "eventId": "ab305d54-85b4-a31b-7db2fb6b9e546015",
+ "eventType": "applicationNf",
+ "sourceId": "",
+ "sourceName": "",
+ "reportingEntityId": "",
+ "reportingEntityName": "thirdparty-sdnc-idfromesrrequest",
+ "priority": "Normal",
+ "startEpochMicrosec": 1.413378172e+15,
+ "lastEpochMicrosec": 1.413378172e+15,
+ "sequence": 0,
+ "vesEventListenerVersion": "7.1"
+ },
+ "stateChangeFields": {
+ "stateChangeFieldsVersion": 1,
+ "oldState": "outOfService",
+ "newState": "inService",
+ "stateInterface": "",
+ "additionalFields": {
+ "macAddress": "01:02:03:04:05:06",
+ "swVersion": "1.2.3"
+ }
+ }
+ }
+}
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_wrong_sourceName.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_wrong_sourceName.json
new file mode 100644
index 00000000..39a9e4ae
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_wrong_sourceName.json
@@ -0,0 +1,30 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4.0.1",
+ "eventName": "StateChange_cpe_authentication",
+ "domain": "stateChange",
+ "eventId": "ab305d54-85b4-a31b-7db2fb6b9e546015",
+ "eventType": "applicationNf",
+ "sourceId": "",
+ "sourceName": "Wrong-PNF-Name",
+ "reportingEntityId": "",
+ "reportingEntityName": "thirdparty-sdnc-idfromesrrequest",
+ "priority": "Normal",
+ "startEpochMicrosec": 1.413378172e+15,
+ "lastEpochMicrosec": 1.413378172e+15,
+ "sequence": 0,
+ "vesEventListenerVersion": "7.1"
+ },
+ "stateChangeFields": {
+ "stateChangeFieldsVersion": 1,
+ "oldState": "outOfService",
+ "newState": "inService",
+ "stateInterface": "",
+ "additionalFields": {
+ "macAddress": "01:02:03:04:05:06",
+ "swVersion": "1.2.3"
+ }
+ }
+ }
+}
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_without_swversion.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_without_swversion.json
new file mode 100644
index 00000000..fcacf1ce
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_without_swversion.json
@@ -0,0 +1,16 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "sourceName":"NVendor-Equip_Model-SN1234"
+ },
+ "stateChangeFields": {
+ "stateChangeFieldsVersion": 1,
+ "newState": "inService",
+ "oldState": "outOfService",
+ "stateInterface": "",
+ "additionalFields": {
+ "macAddress": "00:11:22:33:44:55"
+ }
+ }
+ }
+}
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_not_json_format.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_not_json_format.json
new file mode 100644
index 00000000..7801ad69
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_not_json_format.json
@@ -0,0 +1,30 @@
+{
+ "event": {
+ "commonEventHeader": {
+ "version": "4.0.1",
+ "eventName": "StateChange_cpe_authentication",
+ "domain": "stateChange",
+ "eventId": "ab305d54-85b4-a31b-7db2fb6b9e546015",
+ "eventType": "applicationNf",
+ "sourceId": "",
+ "sourceName": "NVendor-Equip_Model-SN1234pnf-11",
+ "reportingEntityId": "",
+ "reportingEntityName": "thirdparty-sdnc-idfromesrrequest",
+ "priority": "Normal",
+ "startEpochMicrosec": 1.413378172e+15,
+ "lastEpochMicrosec": 1.413378172e+15,
+ "sequence": 0,
+ "vesEventListenerVersion": "7.1"
+ },
+ "stateChangeFields": {
+ "stateChangeFieldsVersion": 1,
+ "oldState": "outOfService",
+ "newState": "inService",
+ "stateInterface": "",
+ "additionalFields": {
+ "macAddress": "01:02:03:04:05:06",
+ "swVersion": "1.2.3",
+ }
+ }
+ }
+}
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/auth_policy_with_all_fields.json b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_policy_with_all_fields.json
new file mode 100644
index 00000000..05b15fbf
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/auth_policy_with_all_fields.json
@@ -0,0 +1,23 @@
+[
+ {
+ "closedLoopEventClient": "DCAE.BBS_event_processor_mSInstance",
+ "policyVersion": "1.0.0.5",
+ "policyName": "CPE_Authentication",
+ "policyScope": "policyScopeCpeAuth",
+ "target_type": "VM",
+ "AAI":
+ {
+ "cpe.old-authentication-state": "outOfService",
+ "cpe.new-authentication-state": "inService",
+ "cpe.swVersion": "1.2.3",
+ "service-information.hsia-cfs-service-instance-id": "1923eaa8-8ab7-49ef-b4c2-e185efbbe832"
+ },
+ "closedLoopAlarmStart": 1552997462,
+ "closedLoopEventStatus": "ONSET",
+ "closedLoopControlName": "clControlNameCpeAuth",
+ "version": "1.0.2",
+ "target": "vserver.vserver-name",
+ "requestID": "d76541f3-7f55-4c80-b0a0-ec5dee2a56cb",
+ "from": "DCAE"
+ }
+]
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_all_fields.json b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_all_fields.json
new file mode 100644
index 00000000..6fe23199
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_all_fields.json
@@ -0,0 +1,16 @@
+{
+ "nf-role":"role",
+ "equip-type":"Equipment-Type-1",
+ "equip-vendor":"NVendor",
+ "equip-model":"Equip_Model",
+ "serial-number":"SN1234",
+ "sw-version":"SW-version-1",
+ "correlationId":"NVendor-Equip_Model-SN1234",
+ "additionalFields": {
+ "attachment-point": "olt1-1-1",
+ "cvlan": "1005",
+ "svlan": "100",
+ "remote-id": "some-remote-id"
+ }
+ }
+ \ No newline at end of file
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_attachment.json b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_attachment.json
new file mode 100644
index 00000000..43d1b212
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_attachment.json
@@ -0,0 +1,15 @@
+{
+ "nf-role":"role",
+ "equip-type":"Equipment-Type-1",
+ "equip-vendor":"NVendor",
+ "equip-model":"Equip_Model",
+ "serial-number":"SN1234",
+ "sw-version":"SW-version-1",
+ "correlationId":"NVendor-Equip_Model-SN1234",
+ "additionalFields": {
+ "attachment-point": "",
+ "cvlan": "1005",
+ "svlan": "100",
+ "remote-id": "some-remote-id"
+ }
+ }
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_correlation.json b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_correlation.json
new file mode 100644
index 00000000..a1aaee30
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_correlation.json
@@ -0,0 +1,15 @@
+{
+ "nf-role":"role",
+ "equip-type":"Equipment-Type-1",
+ "equip-vendor":"Vendor",
+ "equip-model":"Equip_Model",
+ "serial-number":"SN1234",
+ "sw-version":"SW-version-1",
+ "correlationId":"",
+ "additionalFields": {
+ "attachment-point": "olt1-1-1",
+ "cvlan": "1005",
+ "svlan": "100",
+ "remote-id": "some-remote-id"
+ }
+ }
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_wrong_correlation.json b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_wrong_correlation.json
new file mode 100644
index 00000000..f1dca037
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_wrong_correlation.json
@@ -0,0 +1,15 @@
+{
+ "nf-role":"role",
+ "equip-type":"Equipment-Type-1",
+ "equip-vendor":"NVendor",
+ "equip-model":"Equip_Model",
+ "serial-number":"SN1234",
+ "sw-version":"SW-version-1",
+ "correlationId":"Wrong-Correlation-Id",
+ "additionalFields": {
+ "attachment-point": "olt1-1-1",
+ "cvlan": "1005",
+ "svlan": "100",
+ "remote-id": "some-remote-id"
+ }
+ }
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/update_not_json_format.json b/tests/dcaegen2/bbs-testcases/assets/json_events/update_not_json_format.json
new file mode 100644
index 00000000..ab5b214a
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/update_not_json_format.json
@@ -0,0 +1,15 @@
+{
+ "nf-role":"role",
+ "equip-type":"Equipment-Type-1",
+ "equip-vendor":"NVendor",
+ "equip-model":"Equip_Model",
+ "serial-number":"SN1234",
+ "sw-version":"SW-version-1",
+ "correlationId":"NVendor-Equip_Model-SN1234",
+ "additionalFields": {
+ "attachment-point": "olt1-1-1",
+ "cvlan": "1005",
+ "svlan": "100",
+ "remote-id": "some-remote-id",
+ }
+ }
diff --git a/tests/dcaegen2/bbs-testcases/assets/json_events/update_policy_with_all_fields.json b/tests/dcaegen2/bbs-testcases/assets/json_events/update_policy_with_all_fields.json
new file mode 100644
index 00000000..49402657
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/assets/json_events/update_policy_with_all_fields.json
@@ -0,0 +1,24 @@
+[
+ {
+ "closedLoopEventClient": "DCAE.BBS_event_processor_mSInstance",
+ "policyVersion": "1.0.0.5",
+ "policyName": "Nomadic_ONT",
+ "policyScope": "reRegPolicyScope",
+ "target_type": "VM",
+ "AAI":{
+ "attachmentPoint": "olt11-1-1",
+ "service-information.hsia-cfs-service-instance-id": "1923eaa8-8ab7-49ef-b4c2-e185efbbe832",
+ "cvlan": "1005",
+ "svlan": "100",
+ "remoteId": "some-remote-id"
+ },
+ "closedLoopAlarmStart": 1553067455,
+ "closedLoopEventStatus": "ONSET",
+ "closedLoopControlName": "reRegControlName",
+ "version": "1.0.2",
+ "target": "vserver.vserver-name",
+ "requestID":
+ "407a6515-4b10-46ad-a249-efe529a36c69",
+ "from": "DCAE"
+ }
+]
diff --git a/tests/dcaegen2/bbs-testcases/bbs_tests.robot b/tests/dcaegen2/bbs-testcases/bbs_tests.robot
new file mode 100644
index 00000000..4721e425
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/bbs_tests.robot
@@ -0,0 +1,117 @@
+*** Settings ***
+Documentation Integration tests for BBS.
+... BBS receives CPE_AUTHENTICATION event from DMaaP and triggers a Policy that updates the CFS service with the PNF.
+... BBS receives PNF_UPDATE event from DMaaP and triggers a Policy that updates the CFS service resources associated with the PNF.
+Resource resources/bbs_library.robot
+Resource ../../common.robot
+Suite Setup Run keywords Create header AND Create sessions AND Set AAI Records AND Ensure Container Is Running bbs
+Test Teardown Reset Simulators
+
+
+*** Variables ***
+${DMAAP_SIMULATOR_SETUP_URL} http://${DMAAP_SIMULATOR_SETUP}
+${AAI_SIMULATOR_SETUP_URL} http://${AAI_SIMULATOR_SETUP}
+${AUTH_EVENT_WITH_ALL_VALID_REQUIRED_FIELDS} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_all_fields.json
+${AUTH_EVENT_WITH_WRONG_SOURCENAME} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_wrong_sourceName.json
+${AUTH_EVENT_WITHOUT_SWVERSION} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_without_swversion.json
+${AUTH_EVENT_WITH_MISSING_RGMAC} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_rgmac.json
+${AUTH_EVENT_WITH_MISSING_STATE} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_new_old_state.json
+${AUTH_EVENT_WITH_MISSING_SOURCENAME} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_event_with_missing_sourceName.json
+${AUTH_NOT_JSON_FORMAT} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_not_json_format.json
+${AUTH_POLICY} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/auth_policy_with_all_fields.json
+${UPDATE_EVENT_WITH_ALL_VALID_REQUIRED_FIELDS} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_all_fields.json
+${UPDATE_EVENT_WITH_WRONG_CORRELATION} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_wrong_correlation.json
+${UPDATE_EVENT_WITH_MISSING_ATTACHMENT} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_attachment.json
+${UPDATE_EVENT_WITH_MISSING_CORRELATION} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/update_event_with_missing_correlation.json
+${UPDATE_NOT_JSON_FORMAT} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/update_not_json_format.json
+${UPDATE_POLICY} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/json_events/update_policy_with_all_fields.json
+${AAI_PNFS} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnfs.json
+${AAI_SERVICES} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_services.json
+${AAI_PNF_NOT_FOUND} %{WORKSPACE}/tests/dcaegen2/bbs-testcases/assets/aai_records/aai_pnf_not_found.json
+
+*** Test Cases ***
+Valid DMaaP CPE_AUTHENTICATION event can trigger Policy
+ [Documentation] BBS get valid CPE_AUTHENTICATION event from DMaaP with required fields - BBS triggers Policy
+ [Tags] BBS Valid CPE_AUTHENTICATION event
+ [Template] Valid auth event processing
+ ${AUTH_EVENT_WITH_ALL_VALID_REQUIRED_FIELDS}
+ ${AUTH_EVENT_WITHOUT_SWVERSION}
+
+Invalid DMaaP CPE_AUTHENTICATION event RG MAC cannot trigger Policy
+ [Documentation] BBS get invalid RG MAC CPE_AUTHENTICATION event from DMaaP with missing required fields - BBS does not trigger Policy
+ [Tags] BBS Invalid RG MAC CPE_AUTHENTICATION event
+ [Template] Invalid rgmac auth event processing
+ ${AUTH_EVENT_WITH_MISSING_RGMAC}
+
+Invalid DMaaP CPE_AUTHENTICATION event cannot trigger Policy
+ [Documentation] BBS get invalid CPE_AUTHENTICATION event from DMaaP with missing required fields - BBS does not trigger Policy
+ [Tags] BBS Invalid CPE_AUTHENTICATION event
+ [Template] Invalid auth event processing
+ ${AUTH_EVENT_WITH_MISSING_STATE}
+ ${AUTH_EVENT_WITH_MISSING_SOURCENAME}
+
+Get valid CPE_AUTHENTICATION event from DMaaP and PNF record in AAI does not exist
+ [Documentation] BBS get valid event from DMaaP with all required fields and in AAI record doesn't exist - BBS does not trigger Policy
+ [Tags] BBS Missing AAI record
+ [Timeout] 30s
+ ${data}= Get Data From File ${AUTH_EVENT_WITH_WRONG_SOURCENAME}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log Error while retrieving PNF: A&AI Request for (/aai/v14/network/pnfs/pnf/Wrong-PNF-Name?depth=all)
+
+CPE_AUTHENTICATION Event in DMaaP is not JSON format
+ [Documentation] BBS CPE_AUTHENTICATION not JSON format event from DMaaP - BBS does not Trigger Policy
+ [Tags] BBS
+ ${data}= Get Data From File ${AUTH_NOT_JSON_FORMAT}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log DMaaP Consumption Exception: Not a JSON Array:
+
+# Get valid CPE_AUTHENTICATION event from DMaaP and AAI is not responding
+# [Documentation] BBS get valid CPE_AUTHENTICATION event from DMaaP with all required fields and AAI is not responding - BBS does not trigger Policy
+# [Tags] BBS AAI Uses containers
+# [Timeout] 180s
+# ${data}= Get Data From File ${AUTH_EVENT_WITH_ALL_VALID_REQUIRED_FIELDS}
+# Ensure Container Is Exited aai_simulator
+# Set event in DMaaP ${data}
+# Wait Until Keyword Succeeds 20x 2000ms Check BBS log Error while retrieving PNF: aai_simulator: Try again
+# Ensure Container Is Running aai_simulator
+# Set AAI Records
+
+Valid DMaaP PNF_UPDATE event can trigger Policy
+ [Documentation] BBS get valid PNF_UPDATE event from DMaaP with required fields - BBS triggers Policy
+ [Tags] BBS Valid PNF_UPDATE event
+ [Template] Valid update event processing
+ ${UPDATE_EVENT_WITH_ALL_VALID_REQUIRED_FIELDS}
+
+Invalid DMaaP PNF_UPDATE event cannot trigger Policy
+ [Documentation] BBS get invalid PNF_UPDATE event from DMaaP with missing required fields - BBS does not trigger Policy
+ [Tags] BBS Invalid PNF_UPDATE event
+ [Template] Invalid update event processing
+ ${UPDATE_EVENT_WITH_MISSING_ATTACHMENT}
+ ${UPDATE_EVENT_WITH_MISSING_CORRELATION}
+
+Get valid PNF_UPDATE event from DMaaP and PNF record in AAI does not exist
+ [Documentation] BBS get valid PNF_UPDATE event from DMaaP with all required fields and in AAI record doesn't exist - BBS does not trigger Policy
+ [Tags] BBS Missing AAI record
+ [Timeout] 30s
+ ${data}= Get Data From File ${UPDATE_EVENT_WITH_WRONG_CORRELATION}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log Error while retrieving PNF: A&AI Request for (/aai/v14/network/pnfs/pnf/Wrong-Correlation-Id?depth=all)
+
+
+PNF_UPDATE Event in DMaaP is not JSON format
+ [Documentation] BBS PNF_UPDATE not JSON format event from DMaaP - BBS does not Trigger Policy
+ [Tags] BBS
+ ${data}= Get Data From File ${UPDATE_NOT_JSON_FORMAT}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log DMaaP Consumption Exception: Not a JSON Array:
+
+# Get valid PNF_UPDATE event from DMaaP and AAI is not responding
+# [Documentation] BBS get valid PNF_UPDATE event from DMaaP with all required fields and AAI is not responding - BBS does not trigger Policy
+# [Tags] BBS AAI Uses containers
+# [Timeout] 180s
+# ${data}= Get Data From File ${UPDATE_EVENT_WITH_ALL_VALID_REQUIRED_FIELDS}
+# Ensure Container Is Exited aai_simulator
+# Set event in DMaaP ${data}
+# Wait Until Keyword Succeeds 20x 2000ms Check BBS log Error while retrieving PNF: aai_simulator: Try again
+# Ensure Container Is Running aai_simulator
+# Set AAI Records
diff --git a/tests/dcaegen2/bbs-testcases/resources/BbsLibrary.py b/tests/dcaegen2/bbs-testcases/resources/BbsLibrary.py
new file mode 100644
index 00000000..8dbdc5a3
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/BbsLibrary.py
@@ -0,0 +1,173 @@
+import json
+
+import docker
+import time
+from docker.utils.json_stream import json_stream
+from collections import OrderedDict
+
+
+class BbsLibrary(object):
+
+ def __init__(self):
+ pass
+
+ @staticmethod
+ def check_for_log(search_for):
+ client = docker.from_env()
+ container = client.containers.get('bbs')
+
+ alog = container.logs(stream=False, tail=1000)
+ try:
+ alog = alog.decode()
+ except AttributeError:
+ pass
+
+ found = alog.find(search_for)
+ if found != -1:
+ return True
+ else:
+ return False
+
+ @staticmethod
+ def create_pnf_name_from_auth(json_file):
+ json_to_python = json.loads(json_file)
+ correlation_id = json_to_python.get("event").get("commonEventHeader").get("sourceName")
+ return correlation_id
+
+ @staticmethod
+ def get_invalid_auth_elements(json_file):
+ """
+ Get the correlationId, oldState, newState, stateInterface, macAddress, swVersion elements
+ from the invalid message and place the elements into a JSON object (string) as fields for comparision
+ """
+ json_to_python = json.loads(json_file)
+ correlation_id = json_to_python.get("event").get("commonEventHeader").get("sourceName")
+ oldState = json_to_python.get("event").get("stateChangeFields").get("oldState")
+ newState = json_to_python.get("event").get("stateChangeFields").get("newState")
+ stateInterface = json_to_python.get("event").get("stateChangeFields").get("stateInterface")
+ macAddress = json_to_python.get("event").get("stateChangeFields").get("additionalFields").get("macAddress")
+ swVersion = json_to_python.get("event").get("stateChangeFields").get("additionalFields").get("swVersion")
+ if swVersion is None:
+ swVersion = ""
+
+ inv_fields = OrderedDict()
+
+ #inv_fields = dict()
+ inv_fields['correlationId'] = correlation_id
+ inv_fields['oldState'] = oldState
+ inv_fields['newState'] = newState
+ inv_fields['stateInterface'] = stateInterface
+ inv_fields['macAddress'] = macAddress
+ inv_fields['swVersion'] = swVersion
+
+ # Transform the dictionary to JSON string
+ json_str = json.dumps(inv_fields)
+
+ # Need to remove spaces between elements
+ json_str = json_str.replace(', ', ',')
+ return json_str
+
+ @staticmethod
+ def get_invalid_update_elements(json_file):
+ """
+ Get the correlationId, attachment-point, remote-id, cvlan, svlan, elements
+ from the invalid message and place the elements into a JSON object (string) as fields for comparision
+ """
+ json_to_python = json.loads(json_file)
+ correlation_id = json_to_python.get("correlationId")
+ attachmentPoint = json_to_python.get("additionalFields").get("attachment-point")
+ remoteId = json_to_python.get("additionalFields").get("remote-id")
+ cvlan = json_to_python.get("additionalFields").get("cvlan")
+ svlan = json_to_python.get("additionalFields").get("svlan")
+
+ inv_fields = OrderedDict()
+ #inv_fields = dict()
+ inv_fields['correlationId'] = correlation_id
+ inv_fields['attachment-point'] = attachmentPoint
+ inv_fields['remote-id'] = remoteId
+ inv_fields['cvlan'] = cvlan
+ inv_fields['svlan'] = svlan
+
+ # Transform the dictionary to JSON string
+ json_str = json.dumps(inv_fields)
+
+ # Need to remove spaces between elements
+ json_str = json_str.replace(', ', ',')
+ return json_str
+
+ @staticmethod
+ def compare_policy(dmaap_policy, json_policy):
+ resp = False
+ try:
+ python_policy = json.loads(json_policy).pop()
+ except:
+ python_policy = ""
+
+ try:
+ python_dmaap_policy = json.loads(dmaap_policy)
+ except:
+ python_dmaap_policy = ""
+
+ try:
+ d_policy = python_dmaap_policy.get("policyName")
+ except:
+ d_policy = ""
+
+ try:
+ j_policy = python_policy.get("policyName")
+ except:
+ return "False"
+
+ resp = "False"
+ if (d_policy == j_policy):
+ resp = "True"
+ return resp
+
+ @staticmethod
+ def create_pnf_name_from_update(json_file):
+ json_to_python = json.loads(json_file)
+ correlation_id = json_to_python.get("correlationId")
+ return correlation_id
+
+ @staticmethod
+ def ensure_container_is_running(name):
+
+ client = docker.from_env()
+
+ if not BbsLibrary.is_in_status(client, name, "running"):
+ print ("starting container", name)
+ container = client.containers.get(name)
+ container.start()
+ BbsLibrary.wait_for_status(client, name, "running")
+
+ BbsLibrary.print_status(client)
+
+ @staticmethod
+ def ensure_container_is_exited(name):
+
+ client = docker.from_env()
+
+ if not BbsLibrary.is_in_status(client, name, "exited"):
+ print ("stopping container", name)
+ container = client.containers.get(name)
+ container.stop()
+ BbsLibrary.wait_for_status(client, name, "exited")
+
+ BbsLibrary.print_status(client)
+
+ @staticmethod
+ def print_status(client):
+ print("containers status")
+ for c in client.containers.list(all=True):
+ print(c.name, " ", c.status)
+
+ @staticmethod
+ def wait_for_status(client, name, status):
+ while not BbsLibrary.is_in_status(client, name, status):
+ print ("waiting for container: ", name, "to be in status: ", status)
+ time.sleep(3)
+
+ @staticmethod
+ def is_in_status(client, name, status):
+ return len(client.containers.list(all=True, filters={"name": "^/"+name+"$", "status": status})) == 1
+
diff --git a/tests/dcaegen2/bbs-testcases/resources/bbs_library.robot b/tests/dcaegen2/bbs-testcases/resources/bbs_library.robot
new file mode 100644
index 00000000..34c94caa
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/bbs_library.robot
@@ -0,0 +1,108 @@
+*** Settings ***
+Library RequestsLibrary
+Library Collections
+Library BbsLibrary.py
+Resource ../../../common.robot
+
+*** Keywords ***
+Create header
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json
+ Set Suite Variable ${suite_headers} ${headers}
+
+Create sessions
+ Create Session dmaap_setup_session ${DMAAP_SIMULATOR_SETUP_URL}
+ Set Suite Variable ${dmaap_setup_session} dmaap_setup_session
+ Create Session aai_setup_session ${AAI_SIMULATOR_SETUP_URL}
+ Set Suite Variable ${aai_setup_session} aai_setup_session
+
+Reset Simulators
+ Reset AAI simulator
+ Reset DMaaP simulator
+
+Set AAI Records
+ [Timeout] 30s
+ ${data}= Get Data From File ${AAI_PNFS}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=text/html
+ ${resp} = Put Request ${aai_setup_session} /set_pnfs headers=${headers} data=${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${data}= Get Data From File ${AAI_SERVICES}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=text/html
+ ${resp} = Put Request ${aai_setup_session} /set_services headers=${headers} data=${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+ ${data}= Get Data From File ${AAI_PNF_NOT_FOUND}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=text/html
+ ${resp} = Put Request ${aai_setup_session} /set_pnf_not_found headers=${headers} data=${data}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Invalid rgmac auth event processing
+ [Arguments] ${input_invalid_event_in_dmaap}
+ [Timeout] 30s
+ ${data}= Get Data From File ${input_invalid_event_in_dmaap}
+ Set event in DMaaP ${data}
+ ${err_msg}= Catenate SEPARATOR= \\n RGW MAC address taken from event (Optional[]) does not match with A&AI metadata corresponding value
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log ${err_msg}
+
+Invalid auth event processing
+ [Arguments] ${input_invalid_event_in_dmaap}
+ [Timeout] 30s
+ ${data}= Get Data From File ${input_invalid_event_in_dmaap}
+ Set event in DMaaP ${data}
+ ${json_obj}= Get invalid auth elements ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log Incorrect CPE Authentication JSON event:
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log ${json_obj}
+Valid auth event processing
+ [Arguments] ${input_valid_event_in_dmaap}
+ [Timeout] 30s
+ ${data}= Get Data From File ${input_valid_event_in_dmaap}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check policy ${AUTH_POLICY}
+
+Check policy
+ [Arguments] ${json_policy_file}
+ ${resp}= Get Request ${dmaap_setup_session} /events/dcaeClOutput headers=${suite_headers}
+ ${data}= Get Data From File ${json_policy_file}
+ ${result}= Compare policy ${resp.text} ${data}
+ Should Be Equal As Strings ${result} True
+
+Invalid update event processing
+ [Arguments] ${input_invalid_event_in_dmaap}
+ [Timeout] 30s
+ ${data}= Get Data From File ${input_invalid_event_in_dmaap}
+ Set event in DMaaP ${data}
+ ${json_obj}= Get invalid update elements ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log Incorrect Re-Registration
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log JSON event:
+ Wait Until Keyword Succeeds 20x 2000ms Check BBS log ${json_obj}
+
+
+Valid update event processing
+ [Arguments] ${input_valid_event_in_dmaap}
+ [Timeout] 30s
+ ${data}= Get Data From File ${input_valid_event_in_dmaap}
+ Set event in DMaaP ${data}
+ Wait Until Keyword Succeeds 20x 2000ms Check policy ${UPDATE_POLICY}
+
+
+Check BBS log
+ [Arguments] ${searched_log}
+ ${status}= Check for log ${searched_log}
+ Should Be Equal As Strings ${status} True
+
+Set PNF name in AAI
+ [Arguments] ${pnfs_name}
+ ${headers}= Create Dictionary Accept=application/json Content-Type=text/html
+ ${resp} = Put Request ${aai_setup_session} /set_pnfs headers=${headers} data=${pnfs_name}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Set event in DMaaP
+ [Arguments] ${event_in_dmaap}
+ ${resp} = Put Request ${dmaap_setup_session} /set_get_event headers=${suite_headers} data=${event_in_dmaap}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Reset AAI simulator
+ ${resp} = Post Request ${aai_setup_session} /reset
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Reset DMaaP simulator
+ ${resp}= Post Request ${dmaap_setup_session} /reset
+ Should Be Equal As Strings ${resp.status_code} 200 \ No newline at end of file
diff --git a/tests/dcaegen2/bbs-testcases/resources/docker-compose.yml b/tests/dcaegen2/bbs-testcases/resources/docker-compose.yml
new file mode 100644
index 00000000..e42c0d29
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/docker-compose.yml
@@ -0,0 +1,64 @@
+version: '3'
+services:
+ bbs:
+ image: nexus3.onap.org:10001/onap/org.onap.dcaegen2.services.components.bbs-event-processor:1.0.0-SNAPSHOT
+ command: >
+ --dmaap.dmaapConsumerConfiguration.dmaapHostName=dmaap_simulator
+ --dmaap.dmaapConsumerConfiguration.dmaapPortNumber=2222
+ --dmaap.dmaapProducerConfiguration.dmaapHostName=dmaap_simulator
+ --dmaap.dmaapProducerConfiguration.dmaapPortNumber=2222
+ --aai.aaiClientConfiguration.aaiHostPortNumber=3333
+ --aai.aaiClientConfiguration.aaiHost=aai_simulator
+ --aai.aaiClientConfiguration.aaiProtocol=http
+ ports:
+ - "32100:8100"
+ environment:
+ CONFIGS_DMAAP_CONSUMER_RE-REGISTRATION_DMAAPHOSTNAME: dmaap_simulator
+ CONFIGS_DMAAP_CONSUMER_RE-REGISTRATION_DMAAPPORTNUMBER: 2222
+ CONFIGS_DMAAP_CONSUMER_RE-REGISTRATION_DMAAPTOPICNAME: /events/unauthenticated_PNF_UPDATE
+ CONFIGS_DMAAP_CONSUMER_RE-REGISTRATION_CONSUMERGROUP:
+ CONFIGS_DMAAP_CONSUMER_RE-REGISTRATION_CONSUMERID:
+ CONFIGS_DMAAP_CONSUMER_CPE-AUTHENTICATION_DMAAPHOSTNAME: dmaap_simulator
+ CONFIGS_DMAAP_CONSUMER_CPE-AUTHENTICATION_DMAAPPORTNUMBER: 2222
+ CONFIGS_DMAAP_CONSUMER_CPE-AUTHENTICATION_DMAAPTOPICNAME: /events/unauthenticated_CPE_AUTHENTICATION
+ CONFIGS_DMAAP_CONSUMER_CPE-AUTHENTICATION_CONSUMERGROUP:
+ CONFIGS_DMAAP_CONSUMER_CPE-AUTHENTICATION_CONSUMERID:
+ CONFIGS_DMAAP_PRODUCER_DMAAPHOSTNAME: dmaap-bc
+ CONFIGS_DMAAP_PRODUCER_DMAAPPORTNUMBER: 2222
+ CONFIGS_DMAAP_PRODUCER_DMAAPTOPICNAME: /events/unauthenticated_DCAE_CL_OUTPUT
+ CONFIGS_AAI_CLIENT_AAIHOST: aai_simulator
+ CONFIGS_AAI_CLIENT_AAIPORT: 3333
+ CONFIGS_AAI_CLIENT_AAIPROTOCOL: http
+ CONFIGS_APPLICATION_PIPELINESPOLLINGINTERVALSEC: 15
+ CONFIGS_APPLICATION_PIPELINESTIMEOUTSEC: 10
+ CONFIGS_APPLICATION_RE-REGISTRATION_POLICYSCOPE: "re-reg_policy_scope"
+ CONFIGS_APPLICATION_RE-REGISTRATION_CLCONTROLNAME: "re-reg_cl"
+ CONFIGS_APPLICATION_CPE-AUTHENTICATION_POLICYSCOPE: "cpe-auth_policy_scope"
+ CONFIGS_APPLICATION_CPE-AUTHENTICATION_CLCONTROLNAME: "cpe-auth_cl"
+ LOGGING_LEVEL_ORG_ONAP_BBS: TRACE
+ container_name: bbs
+ depends_on:
+ - dmaap-bc
+ - aai
+
+ dmaap-bc:
+ image: dmaap-bc:latest
+ build:
+ context: simulator
+ dockerfile: DMaaP_simulator
+ ports:
+ - "2222:2222"
+ - "2223:2223"
+ - "2224:2224"
+ container_name: dmaap_simulator
+
+ aai:
+ image: aai:latest
+ build:
+ context: simulator
+ dockerfile: AAI_simulator
+ ports:
+ - "3333:3333"
+ - "3334:3334"
+ - "3335:3335"
+ container_name: aai_simulator
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/AAI.py b/tests/dcaegen2/bbs-testcases/resources/simulator/AAI.py
new file mode 100644
index 00000000..ba32582d
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/AAI.py
@@ -0,0 +1,108 @@
+import re
+import time
+from http.server import BaseHTTPRequestHandler
+import httpServerLib
+
+import json
+
+pnfs = []
+services = []
+pnf_not_found = '[{}]'
+
+class AAISetup(BaseHTTPRequestHandler):
+
+ def do_PUT(self):
+ global pnfs
+ global services
+ global pnf_not_found
+ if re.search('/set_pnfs', self.path):
+ content_length = int(self.headers['Content-Length'])
+ pnfs = self.rfile.read(content_length)
+ pnfs = pnfs.decode()
+ httpServerLib.header_200_and_json(self)
+ elif re.search('/set_services', self.path):
+ content_length = int(self.headers['Content-Length'])
+ services = self.rfile.read(content_length)
+ services = services.decode()
+ httpServerLib.header_200_and_json(self)
+ elif re.search('/set_pnf_not_found', self.path):
+ content_length = int(self.headers['Content-Length'])
+ pnf_not_found = self.rfile.read(content_length)
+ pnf_not_found = pnf_not_found.decode()
+ httpServerLib.header_200_and_json(self)
+
+ return
+
+ def do_POST(self):
+ if re.search('/reset', self.path):
+ httpServerLib.header_200_and_json(self)
+
+ return
+
+
+class AAIHandler(BaseHTTPRequestHandler):
+
+ def do_GET(self):
+ global pnfs
+ global services
+ global pnf_not_found
+ pnf_path = '/aai/v14/network/pnfs/pnf/'
+ service_path = '/aai/v14/nodes/service-instances/service-instance/'
+ found_resource = None
+ if re.search(pnf_path, self.path):
+ try:
+ python_pnfs = json.loads(pnfs)
+ except AttributeError:
+ python_pnfs = []
+ for pnf_instance in python_pnfs:
+ try:
+ pnf_name = pnf_path + pnf_instance.get("pnf-name")
+ except AttributeError:
+ pnf_name = "PNF not found"
+ if re.search(pnf_name, self.path):
+ found_resource = pnf_instance
+ break
+ elif re.search(service_path, self.path):
+ try:
+ python_services = json.loads(services)
+ except AttributeError:
+ python_services = []
+ for service_instance in python_services:
+ try:
+ service_name = service_path + service_instance.get("service-instance-id")
+ except AttributeError:
+ pnf_name = "Service not found"
+ if re.search(service_name, self.path):
+ found_resource = service_instance
+ break
+
+ if found_resource is not None:
+ # Prepare the response for DMaaP (byte encoded JSON Object)
+ found_resource = json.dumps(found_resource)
+ found_resource = found_resource.encode()
+ httpServerLib.header_200_and_json(self)
+ self.wfile.write(found_resource)
+ else:
+ # Send a 404 message for not found
+ pnf_resp = pnf_not_found
+ # We have to replace the request line data
+ err_pnf_template = "nodes/pnfs/pnf/Wrong-PNF-Name"
+ pnf_resp = pnf_resp.replace(err_pnf_template, self.path)
+ pnf_resp = pnf_resp.encode()
+ httpServerLib.header_404_and_json(self)
+ self.wfile.write(pnf_resp)
+
+
+ return
+
+def _main_(handler_class=AAIHandler, protocol="HTTP/1.0"):
+ handler_class.protocol_version = protocol
+ httpServerLib.start_http_endpoint(3333, AAIHandler)
+ httpServerLib.start_https_endpoint(3334, AAIHandler, keyfile="certs/org.onap.aai.key", certfile="certs/aai_aai.onap.org.cer", ca_certs="certs/ca_local_0.cer")
+ httpServerLib.start_http_endpoint(3335, AAISetup)
+ while 1:
+ time.sleep(10)
+
+
+if __name__ == '__main__':
+ _main_()
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/AAI_simulator b/tests/dcaegen2/bbs-testcases/resources/simulator/AAI_simulator
new file mode 100644
index 00000000..a906bc58
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/AAI_simulator
@@ -0,0 +1,6 @@
+FROM python:3-alpine
+
+ADD AAI.py httpServerLib.py /
+COPY certs/* /certs/
+
+CMD [ "python", "./AAI.py" ]
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP.py b/tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP.py
new file mode 100644
index 00000000..edeec8cf
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP.py
@@ -0,0 +1,92 @@
+import re
+import time
+from http.server import BaseHTTPRequestHandler
+import httpServerLib
+
+
+posted_event_from_bbs = b'[]'
+received_event_to_get_method = b'[]'
+
+
+class DmaapSetup(BaseHTTPRequestHandler):
+
+ """
+ This Handler is used by the test harness to prepare the buffers:
+ test harness places VES events using PUT from the harness into the
+ "received_event buffer"
+ test harness will write policy topics from the BBS us to the posted event buffer
+ """
+ def do_PUT(self):
+ # Read the event from the test harness place it in the received event buffer
+ if re.search('/set_get_event', self.path):
+ content_length = int(self.headers['Content-Length'])
+ global received_event_to_get_method
+ received_event_to_get_method = self.rfile.read(content_length)
+ httpServerLib.header_200_and_json(self)
+
+ return
+
+ def do_GET(self):
+ # The test harness receives the policy triggers from the posted event
+ # by issuing a get and receiving the response.
+ if re.search('/events/dcaeClOutput', self.path):
+ global posted_event_from_bbs
+ httpServerLib.header_200_and_json(self)
+ self.wfile.write(posted_event_from_bbs)
+
+ return
+
+ def do_POST(self):
+ if re.search('/reset', self.path):
+ global posted_event_from_bbs
+ global received_event_to_get_method
+ posted_event_from_bbs = b'[]'
+ received_event_to_get_method = b'[]'
+ httpServerLib.header_200_and_json(self)
+
+ return
+
+
+class DMaaPHandler(BaseHTTPRequestHandler):
+ """
+ This Handler is what the BBS uS connects to - The test library has posted the
+ the VES events in the setup Handler which are then received by the BBS uS via
+ this handler's do_GET function.
+ Likewise the policy trigger posted by the BBS uS is received and placed in the
+ in the posted event buffer which the test harness retrieves using the setup handler.
+ """
+
+ def do_POST(self):
+ # Post of the policy triggers from the BBS uS
+ if re.search('/events/unauthenticated.DCAE_CL_OUTPUT', self.path):
+ global posted_event_from_bbs
+ content_length = int(self.headers['Content-Length'])
+ posted_event_from_bbs = self.rfile.read(content_length)
+ httpServerLib.header_200_and_json(self)
+
+ return
+
+ def do_GET(self):
+ # BBS uS issues a Get to receive VES and PNF UPdate event from DMAAP
+ global received_event_to_get_method
+ if re.search('/events/unauthenticated.PNF_UPDATE', self.path):
+ httpServerLib.header_200_and_json(self)
+ self.wfile.write(received_event_to_get_method)
+ elif re.search('/events/unauthenticated_CPE_AUTHENTICATION/OpenDcae-c12/c12', self.path):
+ httpServerLib.header_200_and_json(self)
+ self.wfile.write(received_event_to_get_method)
+
+ return
+
+
+def _main_(handler_class=DMaaPHandler, protocol="HTTP/1.0"):
+ handler_class.protocol_version = protocol
+ httpServerLib.start_http_endpoint(2222, DMaaPHandler)
+ httpServerLib.start_https_endpoint(2223, DMaaPHandler, keyfile="certs/org.onap.dmaap-bc.key", certfile="certs/dmaap_bc_topic_mgr_dmaap_bc.onap.org.cer", ca_certs="certs/ca_local_0.cer")
+ httpServerLib.start_http_endpoint(2224, DmaapSetup)
+ while 1:
+ time.sleep(10)
+
+
+if __name__ == '__main__':
+ _main_()
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP_simulator b/tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP_simulator
new file mode 100644
index 00000000..8139fc33
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/DMaaP_simulator
@@ -0,0 +1,6 @@
+FROM python:3-alpine
+
+ADD DMaaP.py httpServerLib.py /
+COPY certs/* /certs/
+
+CMD [ "python", "./DMaaP.py" ]
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/aai_aai.onap.org.cer b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/aai_aai.onap.org.cer
new file mode 100644
index 00000000..327f57b6
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/aai_aai.onap.org.cer
@@ -0,0 +1,55 @@
+-----BEGIN CERTIFICATE-----
+MIIE5TCCA82gAwIBAgIJAI5fEseaW2LVMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNV
+BAYTAlVTMQ0wCwYDVQQKDARPTkFQMQ4wDAYDVQQLDAVPU0FBRjEZMBcGA1UEAwwQ
+aW50ZXJtZWRpYXRlQ0FfMjAeFw0xODEwMTgxMDM3MzJaFw0xOTA0MTgxMDM3MzJa
+MGYxDDAKBgNVBAMMA2FhaTEPMA0GCSqGSIb3DQEJARYAMRkwFwYDVQQLDBBhYWlA
+YWFpLm9uYXAub3JnMQ4wDAYDVQQLDAVPU0FBRjENMAsGA1UECgwET05BUDELMAkG
+A1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCCnz1BBkcD
+y1M73ANgkbfwYANSJPdnU/meXpgHKYvXa8xbEI3Lsi5EnB7o9nthZFdU5dPZRFV5
+uJEOl0pjt3ogmPo0XZGYO++GfRNLq+c2YVmYjTLgFvEz6GzUtLueYjrl2JItGRug
+x0wNPXQmaAX3/8wD7nOTAZjlmuSWCeeJu5GBaX4aaiwVOONDGhmZZ7jISTE0xvvU
+936ECnUhSZtt/qRvnA1EJB/Hhs5Se4VPx6lTXYf8PXquI0IgDV49hlLhbPMKadQ8
+lo2yitiaSMJHsLZ1Wt6ob9oNFlBcceq3tfXPMVVylssuAI1pc3HsbmV7kMIwg0P1
+fyVoIALHlXgDAgMBAAGjggGzMIIBrzAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIF
+4DAgBgNVHSUBAf8EFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwVAYDVR0jBE0wS4AU
+BASNACQ4xpx414BXQWdJBoDmckehMKQuMCwxDjAMBgNVBAsMBU9TQUFGMQ0wCwYD
+VQQKDARPTkFQMQswCQYDVQQGEwJVU4IBAjAdBgNVHQ4EFgQUMghLmZ4l0T+MY3uk
+AR6YBJP5gwMwgfoGA1UdEQSB8jCB74IDYWFpgoHnYWFpLmFwaS5zaW1wbGVkZW1v
+Lm9uYXAub3JnIGFhaS5lbGFzdGljc2VhcmNoLnNpbXBsZWRlbW8ub25hcC5vcmcg
+YWFpLmdyZW1saW5zZXJ2ZXIuc2ltcGxlZGVtby5vbmFwLm9yZyBhYWkuaGJhc2Uu
+c2ltcGxlZGVtby5vbmFwLm9yZyBhYWkub25hcCBhYWkuc2VhcmNoc2VydmljZS5z
+aW1wbGVkZW1vLm9uYXAub3JnIGFhaS5zaW1wbGVkZW1vLm9uYXAub3JnIGFhaS51
+aS5zaW1wbGVkZW1vLm9uYXAub3JnMA0GCSqGSIb3DQEBCwUAA4IBAQBJyXk6ZTfA
+f9mYi5ey/ZpchB9egJfwEXXOqSKeYYTjqUr3uXXk+usb8YXsFVoD9Id5do3Hnxv+
+J3ISGmyPTgQfV/9KDmtHPTyclR9mLji+j4GviZnIpAIsI/duPKlEfLcym9smAC7Q
++HYanUQ7s8sjJJ4ORdBLOy1HkfTu9pjNKZ1CcEnJZ8Y5juLOeEj+Xa+QzcywSK2E
+iuPXJwFFtcX9fO+ojiQV9g0L9JgABMqm4Q6si03gXofYEgvAUJSxsirydB8kcqPU
+jCgw8/XIsHj4VRNNWlwkvzskeX9ZlcFMmn6DTfyDD1Rrij1efotO2ie3OrKUEzpH
+N1G5vCuZqOla
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEVDCCAjygAwIBAgIBAjANBgkqhkiG9w0BAQsFADAsMQ4wDAYDVQQLDAVPU0FB
+RjENMAsGA1UECgwET05BUDELMAkGA1UEBhMCVVMwHhcNMTgwOTI0MTE0MjE2WhcN
+MjMwOTI0MTE0MjE2WjBHMQswCQYDVQQGEwJVUzENMAsGA1UECgwET05BUDEOMAwG
+A1UECwwFT1NBQUYxGTAXBgNVBAMMEGludGVybWVkaWF0ZUNBXzIwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjPFeAho7BtWjB4Enww/KXD0tTuoda/Fkc
+o/yv2waNNsx+pOYGdJwNHYvNS7/RLBHc8kCN+TbKnYZ6AE97wD1Pzrc7AZ58qpjq
+Ob7aTp4u3IAMWR5YOkDyjiibA5X7z9N/wveG/Ei2SgN2pY7O2lK5ucm6igarfxll
+rZC1MA9zAXrfmd5bLJQQqACT6q15KQaCIwhqwoXp8w+s0rXcZ2/L303lFIUXoHUp
+kzMsIPhJ/ZoEvAEkXIPgT2uFgOwIyWmr8Rg5jYzZhV7vey3bQUBlue9aiMIXih3d
+b4AVD6J6eF/NmJygtUfHFrWeTAYLppA0d69BWUQZ+XQgCwjOMLaNAgMBAAGjZjBk
+MB0GA1UdDgQWBBQEBI0AJDjGnHjXgFdBZ0kGgOZyRzAfBgNVHSMEGDAWgBTtc8Wb
+I4DL8Bm6CVi8//GsTyq8NTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAt4VCLb2UHiZpDfSQbe62vlFzsGlODYKF
+k7BhW9Q5jfIXpPhhtBLFwJFEKAWFLVWubz+YIa7I5wtniS6zEPC/5t3JOiEXMJQY
+PfaPDSsovZ+eShu0QtrjjldFwL2MiqNsd2IWLSIRQUP63RZGBRTTxSsxB0VAfRyT
+cu/8znpmZsHna3DspGZQputm7qsxgUhAcPCdo9RQtG6Ox6L1wTXUJmTPHdKQtZjr
+qqSQ7kn8u3i5KQYYapmc3UO+CBbzoLPD5Rrlq+ROBbiNd9R/j5vVgRO7vsU9SHnm
+AaKFEjDPTSjDtMOxu1BsTNmftaE2jcYa9/ZW67H8URCuo92NE0cZRxBqHkPUjH3/
+/S43/TBAfjfarF5WW7iMAEZfEGhrQu26JWXBMcZshStuHUEPl2b+RC5LZcBMYKgi
+SqSOXzpiJeRNASpXKCQQZG8n03c/jBf1U20HaK/4Z2ikOql5B21suxhUbixG1EQN
+DOrFGOFUqG4Eyw+xjUR5rTfDnpKgQfJo0/aohZs9p5x+UwitkrQkJQ1ZmEzeVDjm
+7xsmOcAJS2T9DLle6fDWvyh76InymAPxzk1/2AWOp8uw8iwNfFxE+p+M7h0psZxp
+SnvlgASASdWlZLcMQtNiiKzMK75FW9SMctQfA/RfohNEwivpp6tNpgJozoKmhoPK
+zs5HS/mx8GI=
+-----END CERTIFICATE-----
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/ca_local_0.cer b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/ca_local_0.cer
new file mode 100644
index 00000000..ff37eaf7
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/ca_local_0.cer
@@ -0,0 +1,31 @@
+-----BEGIN CERTIFICATE-----
+MIIFPjCCAyagAwIBAgIJAMhpcvbx/8/AMA0GCSqGSIb3DQEBCwUAMCwxDjAMBgNV
+BAsMBU9TQUFGMQ0wCwYDVQQKDARPTkFQMQswCQYDVQQGEwJVUzAeFw0xODA4MDMx
+MzI2NTBaFw0zODA3MjkxMzI2NTBaMCwxDjAMBgNVBAsMBU9TQUFGMQ0wCwYDVQQK
+DARPTkFQMQswCQYDVQQGEwJVUzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
+ggIBAO4j7nmAY9KX/ceFCITuWAMCHAmSoeHCTs+lgkYX7DpXPidsF5t0ijPaElUC
+rwwMnXz5h1o8FzXD64FMbqMVEseLUDZGelRZ7Rkz+hy0Y5i8QKsBTfeo7sP7ZEaC
+vpqom9imPLFUn4oDeYspCKjMF93Z69Cv8pxFYCFpZwY3eR9V4xOB613k8guBJtHR
+ccY9/NbdfbkrtUz5kNuQqwLj5ttvesqxPq0L4m3bPjkubQCb+QiJxx10Xcx6fcfu
+wIu7NR63qDlWFYstsDnH/VIT1pSCBHEw+muSEQ44sgPFy+AxB8O8HKd8wRfmkV2d
+YNPyotTLD+aLzDlCWtC0pGnTTJimdu9+hZRIZz5YT4m8BdLQ/jTBd6Gx2tVLvWso
+9IJSjfkhj6EtVxyZ81jM+rLAnKy3qPXDCN6CIKL07hNuSzIIhCrK2L4f82JWS7dP
+mg2acuhCH56qrhEr42Kjeak181KM/QKiRPgNyOSygJ7uRaLbqOQRh46c68NcmW4F
+13OwJQAsrjgaQY1ZWnFsvRYK9NnUqK+2XuCQFS7EYm02M2UwO2GCD88In8PCzzv8
+Q0Zj8Hb4h79fVRjG8/3MnQCJ164+9PfXyu9dj5l6XkkSvdj1IsewaSMy9NccGx7Q
+rE7yRPMB6FlAnGPj0KbJXHXJyiujPHSCF0D+Hbl9rxU7FRAbAgMBAAGjYzBhMB0G
+A1UdDgQWBBTtc8WbI4DL8Bm6CVi8//GsTyq8NTAfBgNVHSMEGDAWgBTtc8WbI4DL
+8Bm6CVi8//GsTyq8NTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAN
+BgkqhkiG9w0BAQsFAAOCAgEAW4IYy1PUrV/wHblIGFTBo5z7EB33rpHfAJzbDkop
+2n5wOlmh78pkeRNb1TOKcSHJPw0MdkwVBPI1wm/SOpHUPmKTW1muO6RUnFjZ68y9
+DiVa6zCW/RBFeG3f8kywxgqPLml1TbikRuMBU0ucOa/bXZ98P2hMLkjWTgeARGSj
+QCb7QyqeFzG0mPmAuX6zMj5xwpdyPB0zCoRGXa/BIWEvYjgkaRM+E+9oRWt/6BHQ
+4uw11R7gAV4/TSu7qYNfTMllBaLJ0o/1q0QF16e4mV1E4erDfWKlrvUlgCaHCx8Q
+3PL7ovM4jjrTNAjnX0q5xtWbF0mlJhJk/NbPDb7hArBv4vp9XoITyRW1vcbe94jv
+GzqLKlvBQUxGue4kLYDmUFdog7gaCkEH3N4mH3ad4HZUsOMeanvVgbVZr10VOlNq
+TEWqDPATayJdo+VhJCGc6hVa+IJsDTAa/z2MLybqcoOfNT/rxYIdvlX4OjSqAqOj
+bSivsCe9c4km56pP2ufA/woPzh+Z46Ukt+krGyFQwKdQQLh5Pp7Yuhvdld/5kd8M
+S2fqcBFpzzBSj+huVayw6jFi5qLlISouhCVsc0rBqvnfuQTQwmfFIlfaHBTSjniv
+5DdibZEtMqYYXl1VB4XUHTt5dOGHLEX2w/d5887DQVLUbaUKm1mfScb/vPjGgk6/
+re4=
+-----END CERTIFICATE-----
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/dmaap_bc_topic_mgr_dmaap_bc.onap.org.cer b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/dmaap_bc_topic_mgr_dmaap_bc.onap.org.cer
new file mode 100644
index 00000000..756dd3a0
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/dmaap_bc_topic_mgr_dmaap_bc.onap.org.cer
@@ -0,0 +1,51 @@
+-----BEGIN CERTIFICATE-----
+MIIELDCCAxSgAwIBAgIJAI5fEseaW2LbMA0GCSqGSIb3DQEBCwUAMEcxCzAJBgNV
+BAYTAlVTMQ0wCwYDVQQKDARPTkFQMQ4wDAYDVQQLDAVPU0FBRjEZMBcGA1UEAwwQ
+aW50ZXJtZWRpYXRlQ0FfMjAeFw0xODEwMjIxMjM4MTZaFw0xOTA0MjIxMjM4MTZa
+MH8xETAPBgNVBAMMCGRtYWFwLWJjMQ8wDQYJKoZIhvcNAQkBFgAxLTArBgNVBAsM
+JGRtYWFwLWJjLXRvcGljLW1nckBkbWFhcC1iYy5vbmFwLm9yZzEOMAwGA1UECwwF
+T1NBQUYxDTALBgNVBAoMBE9OQVAxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAs2mQSeSshK4ZrAwc8/QNHZiUVILlQwYyoviPfL27
+8mV1OXSYoTW+PzFU1Tv6HwKEFL3q9i9/y1m0DjhP4frHpNVVTo5KIeCv6fIsAYnp
+/p50P3EOh3AJehtZm4AtxN6DeMlaBv11GYUUm6E60Q36Y6Wgklq8u1KDngYJy1/Q
+Bl8aAiJbj2vpL64WSI3cyNz/qeI4/PxHsqBHUFI96GcLtLPLDSlIQWoWoZhkiQTH
+rU4Sx5/nVdWihfc0R0+jG5IH+mDb8WUNmyHnaHinrt5Er1sypU/NxD+NlRPFO1K4
+Dx40sxfAlu2LFCllDgSS/Xcfse0ny/TrL2RWELoIOz9NjQIDAQABo4HiMIHfMAkG
+A1UdEwQCMAAwDgYDVR0PAQH/BAQDAgXgMCAGA1UdJQEB/wQWMBQGCCsGAQUFBwMB
+BggrBgEFBQcDAjBUBgNVHSMETTBLgBQEBI0AJDjGnHjXgFdBZ0kGgOZyR6EwpC4w
+LDEOMAwGA1UECwwFT1NBQUYxDTALBgNVBAoMBE9OQVAxCzAJBgNVBAYTAlVTggEC
+MB0GA1UdDgQWBBTvkTjHV87v4IBJ8N/PqkjjWGKICjArBgNVHREEJDAigghkbWFh
+cC1iY4IWZG1hYXAtYmMgZG1hYXAtYmMub25hcDANBgkqhkiG9w0BAQsFAAOCAQEA
+EJFyoeQtkjDf/yUyWReewxiOfDdmmrDOO4gbxt6hd3ilOflmC7QolR1NAzmCML3b
+vmLS7a8zhwBsUU11wjasN8PI3qG7H36U7hP/NVwvql0YNGIcxvukPJJvDqW6V3MI
+fOaCFs4uJexSYeaXRWdk0Rq8GY9gB2j1TUsl+we9zJeErKr2vY2LAJI0iYJ+v6YY
+Ug14aPYu4m4ABUDhqfM+4z580h8GA+5ZkWNr5z9xfeJB520jAc6zx86obx9hep74
+OByfVqleMV0QfZeH9oLGYh2FnSSEG60GyWFIf9k76kh2LREVCbU+nOhFfVy9YD5Q
++2TXjh/wMcv3RxAHqSeW9A==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEVDCCAjygAwIBAgIBAjANBgkqhkiG9w0BAQsFADAsMQ4wDAYDVQQLDAVPU0FB
+RjENMAsGA1UECgwET05BUDELMAkGA1UEBhMCVVMwHhcNMTgwOTI0MTE0MjE2WhcN
+MjMwOTI0MTE0MjE2WjBHMQswCQYDVQQGEwJVUzENMAsGA1UECgwET05BUDEOMAwG
+A1UECwwFT1NBQUYxGTAXBgNVBAMMEGludGVybWVkaWF0ZUNBXzIwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCjPFeAho7BtWjB4Enww/KXD0tTuoda/Fkc
+o/yv2waNNsx+pOYGdJwNHYvNS7/RLBHc8kCN+TbKnYZ6AE97wD1Pzrc7AZ58qpjq
+Ob7aTp4u3IAMWR5YOkDyjiibA5X7z9N/wveG/Ei2SgN2pY7O2lK5ucm6igarfxll
+rZC1MA9zAXrfmd5bLJQQqACT6q15KQaCIwhqwoXp8w+s0rXcZ2/L303lFIUXoHUp
+kzMsIPhJ/ZoEvAEkXIPgT2uFgOwIyWmr8Rg5jYzZhV7vey3bQUBlue9aiMIXih3d
+b4AVD6J6eF/NmJygtUfHFrWeTAYLppA0d69BWUQZ+XQgCwjOMLaNAgMBAAGjZjBk
+MB0GA1UdDgQWBBQEBI0AJDjGnHjXgFdBZ0kGgOZyRzAfBgNVHSMEGDAWgBTtc8Wb
+I4DL8Bm6CVi8//GsTyq8NTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAt4VCLb2UHiZpDfSQbe62vlFzsGlODYKF
+k7BhW9Q5jfIXpPhhtBLFwJFEKAWFLVWubz+YIa7I5wtniS6zEPC/5t3JOiEXMJQY
+PfaPDSsovZ+eShu0QtrjjldFwL2MiqNsd2IWLSIRQUP63RZGBRTTxSsxB0VAfRyT
+cu/8znpmZsHna3DspGZQputm7qsxgUhAcPCdo9RQtG6Ox6L1wTXUJmTPHdKQtZjr
+qqSQ7kn8u3i5KQYYapmc3UO+CBbzoLPD5Rrlq+ROBbiNd9R/j5vVgRO7vsU9SHnm
+AaKFEjDPTSjDtMOxu1BsTNmftaE2jcYa9/ZW67H8URCuo92NE0cZRxBqHkPUjH3/
+/S43/TBAfjfarF5WW7iMAEZfEGhrQu26JWXBMcZshStuHUEPl2b+RC5LZcBMYKgi
+SqSOXzpiJeRNASpXKCQQZG8n03c/jBf1U20HaK/4Z2ikOql5B21suxhUbixG1EQN
+DOrFGOFUqG4Eyw+xjUR5rTfDnpKgQfJo0/aohZs9p5x+UwitkrQkJQ1ZmEzeVDjm
+7xsmOcAJS2T9DLle6fDWvyh76InymAPxzk1/2AWOp8uw8iwNfFxE+p+M7h0psZxp
+SnvlgASASdWlZLcMQtNiiKzMK75FW9SMctQfA/RfohNEwivpp6tNpgJozoKmhoPK
+zs5HS/mx8GI=
+-----END CERTIFICATE-----
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/keystore.password b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/keystore.password
new file mode 100644
index 00000000..39823872
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/keystore.password
@@ -0,0 +1 @@
+mYHC98!qX}7h?W}jRv}MIXTJ \ No newline at end of file
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.aai.key b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.aai.key
new file mode 100644
index 00000000..b9a22cf3
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.aai.key
@@ -0,0 +1,29 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCCnz1BBkcDy1M7
+3ANgkbfwYANSJPdnU/meXpgHKYvXa8xbEI3Lsi5EnB7o9nthZFdU5dPZRFV5uJEO
+l0pjt3ogmPo0XZGYO++GfRNLq+c2YVmYjTLgFvEz6GzUtLueYjrl2JItGRugx0wN
+PXQmaAX3/8wD7nOTAZjlmuSWCeeJu5GBaX4aaiwVOONDGhmZZ7jISTE0xvvU936E
+CnUhSZtt/qRvnA1EJB/Hhs5Se4VPx6lTXYf8PXquI0IgDV49hlLhbPMKadQ8lo2y
+itiaSMJHsLZ1Wt6ob9oNFlBcceq3tfXPMVVylssuAI1pc3HsbmV7kMIwg0P1fyVo
+IALHlXgDAgMBAAECggEATFkLEpC6vWsAsYI9rxo9KxDToBXfTdP1mS2tKrKL/FQT
+1D5uwtrY1F10a7J2F0zxBrx3AQ1B8K2Ci8a+Ql6h0Z/YzvbJ/PM7Y56Dwr0tncl0
+9wfA7t46CZ8WzZT9/OtphaL6fcWpMmaK+0oqM7ClnHk1JC8h+pD6b2oDpfcQEJ5r
+hxFxdOotKgMzANMqTydteecfefy9l0hzgFiymxLZAo7ktW3HFpXO5HOgh1vkm5Pu
+FedGRwiI/RBqad2T59J/XcRH0f5Ky7sgpyCShwqIp23xpdum10N0/MTzY5iu/gvR
+pXGaPeYUrSPoLwuoMGAUm9wFbDqskI/mQzw6/rnfsQKBgQDU2O7ogZ/BjDVtjpfL
+NntXhLOq02U+dB16ZXSalMbsG//FILVLL/Ths2wutKk/9IIiC1qI4NhDc0smDkgJ
+l+oTZTnhVxZhWvOYovz7T3L3mp9VBIA0lW62dTDLK9gT6IRoQGN1fzzXF7ZfgOME
+irDQqBSfMqt5YCeQOKNe29eo5QKBgQCdGrLaGHBeWBdhvG8XcybJDk2Q9XnojO69
+2UtfJ64+hzTc2MFvyBlWymZt3/Qq3llP/K9WUYW/ohL9l8rTXHEfBGpQVPzU2roQ
+iicbx/zc2qfO79YaE10D/paekX2vrpoJlhtp0yMU/HMEYxrucbYQJEdKx9frcTXo
+fQ9l5V+WxwKBgQDKEkYGsQGFk+IpZ+XOhKPmu9KDDH0jJMPTrrxcAYE1KYPSl7Hm
+dtoK6Pd9BAFm+XAOeC70olpO9wdSUt6rVPFihojD2ZUiymFX+O0qfgwM7Fv2L/az
+dWcNjAbN7IsQo4AJJZAHPcv5/MYkt01Pw4gIIHqrhURsUBBfiJX5ecetzQKBgC9I
+NcPFzyvVv1O+7oBUO7wO/fE+r+35XHDu0OxWeO6Aqrw80BrgUh/40lMHL+km+iJE
+nlCQQHyoPqbr5DMwgysenRCIQ3+cRJttuM93pPajKBXzwLAgW8I0AQjAKN+S4PE5
+qA51aP2L7OHJIfXZaz34bSxocOd/LwZFfTjhi59JAoGAVc3HAzQOkrCs1GPXvuOx
+YwJUyuwLtCzcb05q+ys/5b/02RxTl4QPfOPqj47y8SDUUC7Cbr6ktqAkfsBOyPPj
+tSniVhPKa4XdP0Brsil934sd3shvwrpEb9Xs6ialTid+PKaU/rFn1DYWZUP8lNMK
+tq0nYLX/Z6N7LHiz32G9Kjs=
+-----END PRIVATE KEY-----
+
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.jks b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.jks
new file mode 100644
index 00000000..e74ce64f
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.jks
Binary files differ
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.trust.jks b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.trust.jks
new file mode 100644
index 00000000..10103cfb
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dcae.trust.jks
Binary files differ
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dmaap-bc.key b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dmaap-bc.key
new file mode 100644
index 00000000..880a33bf
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/org.onap.dmaap-bc.key
@@ -0,0 +1,29 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCzaZBJ5KyErhms
+DBzz9A0dmJRUguVDBjKi+I98vbvyZXU5dJihNb4/MVTVO/ofAoQUver2L3/LWbQO
+OE/h+sek1VVOjkoh4K/p8iwBien+nnQ/cQ6HcAl6G1mbgC3E3oN4yVoG/XUZhRSb
+oTrRDfpjpaCSWry7UoOeBgnLX9AGXxoCIluPa+kvrhZIjdzI3P+p4jj8/EeyoEdQ
+Uj3oZwu0s8sNKUhBahahmGSJBMetThLHn+dV1aKF9zRHT6Mbkgf6YNvxZQ2bIedo
+eKeu3kSvWzKlT83EP42VE8U7UrgPHjSzF8CW7YsUKWUOBJL9dx+x7SfL9OsvZFYQ
+ugg7P02NAgMBAAECggEAfPetwlqe9DgUt6skS6SVsiTCRO9746iggrXhtECwdlHH
+SkL1wWye3INvFKwXN5xYBd6Xl+1T9X/BFBqTQdOdViompnYkGt7XiXvevR+kNm+G
+h14ngZ0/bKc6Tj8FIljfeLW/mJjZBPKWfSTbxBwZaWlHpEnBpjT+aobIMbnGO3i8
+iuPEIlSTmI/MmIvwyXkJ8r41phIZpdhtyKACx5LSvSArwPTYzVLyaGBJ63T4Qcat
+GY/Oa1nAJkbFT46sP06O+sm1UIVUGbjewzPaDnfdFyJWmae0nGn1xU8VZUPI7rfu
+YCf7le2grgtKy16jQo0o69RGYc4ebP27DKGd8YJHHQKBgQDts/7x6sG3fqPvbv9D
+M5LDraslrj+noHGVcvCfigcgngvnMGcB/R8IT6YPmNRfATHV/UTLuW++PuqXsR21
+/WwJVbxudZ3alX7sz6CTGvcCQvnvPQm2e/iVW/JFrQu/poPxL1k3talDdKFWTRql
+ZvQE05YjdTutlN2hGvqjSTZ1AwKBgQDBOO7GmG4FRQ4jXvUULXKMRUw+UzUy9NAV
+io1b3CiwWynsdW2OPp6Jy6GB6+e7Di2M0i35hkpQd5NoeDnVqkm9ERYLnHr9FAs0
+5cKT7DDRC9ddJesJrqdhqGfhZCHMoqEiDRf3kNMBfFMV1TCefdQ0kIFYUuhHgboJ
+aK+GqmtGLwKBgEEqmpdaA7e5mVn39TVIO1E4GHahGcRr4RfWxg8G+UNA8QR1qZfK
+/Cn8JAucm4RcQHxpDeZINVFT0F676OhOzMKWZa1mw1r8pypnFZ+ewd81221yL2p+
+/Dx+U6I0eccV8JA7qdrzC695lw2g39A+tGFqXHvmFPFWoZgcXGBNnwdfAoGBAJ8y
+9mEAhF2pKN3xxgGq9F8oVYpgakuis7Ob5Z5TBd9QLXmawvpZE6y670YphVN0egk1
+vxWBFMe5zeVccWJfHMQ/SKemdRsBob4itC/Gge4rUHV54W6nzVdENtrY8pQ1RofU
+u/OJCqGFursZXSaoy+fHTBrmrGUGOK655y0QSrSXAoGBANbSu8DfjJwDHcWTstcn
+XJ/bHB6aZmKe4ibOSFBMsOuy0AP1vRxQTgvQhgeRWm5ngv7YhPes2UHqRktadfGz
+VUzx9/ILpL5skhIFEzgEP32cO1tQNE1vxODs3zg+U/Wy9gxJt0dLCB/sPQJcGLri
+mkzev7AyLLr137K+ssxhczqg
+-----END PRIVATE KEY-----
+
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/certs/truststore.password b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/truststore.password
new file mode 100644
index 00000000..168e64bd
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/certs/truststore.password
@@ -0,0 +1 @@
+*TQH?Lnszprs4LmlAj38yds( \ No newline at end of file
diff --git a/tests/dcaegen2/bbs-testcases/resources/simulator/httpServerLib.py b/tests/dcaegen2/bbs-testcases/resources/simulator/httpServerLib.py
new file mode 100644
index 00000000..d963169d
--- /dev/null
+++ b/tests/dcaegen2/bbs-testcases/resources/simulator/httpServerLib.py
@@ -0,0 +1,37 @@
+import _thread
+import ssl
+from http.server import HTTPServer
+
+
+def header_200_and_json(self):
+ self.send_response(200)
+ self.send_header('Content-Type', 'application/json')
+ self.end_headers()
+
+def header_404_and_json(self):
+ self.send_response(404)
+ self.send_header('Content-Type', 'application/json')
+ self.end_headers()
+
+def start_http_endpoint(port, handler_class):
+ _thread.start_new_thread(init_http_endpoints, (port, handler_class))
+
+
+def start_https_endpoint(port, handler_class, keyfile, certfile, ca_certs):
+ _thread.start_new_thread(init_https_endpoints, (port, handler_class, keyfile, certfile, ca_certs))
+
+
+def init_http_endpoints(port, handler_class, server_class=HTTPServer):
+ server = server_class(('', port), handler_class)
+ sa = server.socket.getsockname()
+ print("Serving HTTP on", sa[0], "port", sa[1], "for", handler_class, "...")
+ server.serve_forever()
+
+
+def init_https_endpoints(port, handler_class, keyfile, certfile, ca_certs, server_class=HTTPServer):
+ server = server_class(('', port), handler_class)
+ server.socket = ssl.wrap_socket(server.socket, keyfile=keyfile, certfile=certfile,
+ ca_certs=ca_certs, server_side=True)
+ sa = server.socket.getsockname()
+ print("Serving HTTPS on", sa[0], "port", sa[1], "for", handler_class, "...")
+ server.serve_forever()