summaryrefslogtreecommitdiffstats
path: root/testsuite/robot
diff options
context:
space:
mode:
authorKeong Lim <keong.lim@huawei.com>2019-04-11 14:38:02 +1000
committerKeong Lim <keong.lim@huawei.com>2019-04-11 14:44:14 +1000
commit48a68d781f78cb14356b0cd6379b828580a79b99 (patch)
treee96558a40c1cf41e573b2393fd11fb6744e8f3be /testsuite/robot
parent3d25e76b64aca32e8165d28d1908e055459e0688 (diff)
AAI-2184 Robot testcases for BBS use case Dublin
Update .gitignore for pydevproject file Update Robot testcases for CCVPN use case Casablanca Add assets and resources for BBS use case Dublin Add regression testsuite for Dublin Add subobject handling Add service-subscription sub-object Add service-instance sub-object Add metadatum sub-object Re-factor top-level classes as subobjects of network and business namespaces Updated filenames with csit prefix Needs the robot/library/ sub-directory of testsuite repo Change-Id: I9956da0b3a6c0bdf782ad486ea4680bc5460c406 Issue-ID: AAI-2184 Signed-off-by: Keong Lim <keong.lim@huawei.com>
Diffstat (limited to 'testsuite/robot')
-rw-r--r--testsuite/robot/assets/templates/aai/csit-connectivity.template21
-rw-r--r--testsuite/robot/assets/templates/aai/csit-customer.template7
-rw-r--r--testsuite/robot/assets/templates/aai/csit-generic-vnf.template56
-rw-r--r--testsuite/robot/assets/templates/aai/csit-metadatum.template6
-rw-r--r--testsuite/robot/assets/templates/aai/csit-pnf.template30
-rw-r--r--testsuite/robot/assets/templates/aai/csit-relationship.template4
-rw-r--r--testsuite/robot/assets/templates/aai/csit-service-instance.template21
-rw-r--r--testsuite/robot/assets/templates/aai/csit-service-subscription.template6
-rw-r--r--testsuite/robot/assets/templates/aai/csit-vpn-binding.template18
-rw-r--r--testsuite/robot/resources/aai/aai_interface.robot79
-rw-r--r--testsuite/robot/resources/aai/csit-api-version-properties.robot23
-rw-r--r--testsuite/robot/resources/aai/csit-connectivities.robot100
-rw-r--r--testsuite/robot/resources/aai/csit-customer.robot101
-rw-r--r--testsuite/robot/resources/aai/csit-generic-vnf.robot101
-rw-r--r--testsuite/robot/resources/aai/csit-metadatum.robot86
-rw-r--r--testsuite/robot/resources/aai/csit-pnf.robot101
-rw-r--r--testsuite/robot/resources/aai/csit-relationship-list.robot44
-rw-r--r--testsuite/robot/resources/aai/csit-service-instance.robot102
-rw-r--r--testsuite/robot/resources/aai/csit-service-subscription.robot102
-rw-r--r--testsuite/robot/resources/aai/csit-subobject.robot76
-rw-r--r--testsuite/robot/resources/aai/csit-vpn-bindings.robot100
-rw-r--r--testsuite/robot/resources/global_properties.robot43
-rw-r--r--testsuite/robot/resources/json_templater.robot21
-rw-r--r--testsuite/robot/testsuites/aai/csit-regression-test-v14.robot74
-rw-r--r--testsuite/robot/testsuites/aai/csit-regression-test-v16.robot122
25 files changed, 1444 insertions, 0 deletions
diff --git a/testsuite/robot/assets/templates/aai/csit-connectivity.template b/testsuite/robot/assets/templates/aai/csit-connectivity.template
new file mode 100644
index 0000000..a693b20
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-connectivity.template
@@ -0,0 +1,21 @@
+{
+ "connectivity-id": "${connectivity_id}",
+ "bandwidth-profile-name": "",
+ "vpn-type": "",
+ "cir": "",
+ "eir": "",
+ "cbs": "",
+ "ebs": "",
+ "color-aware": "",
+ "coupling-flag": "",
+ "etht-svc-name": "",
+ "access-provider-id": "",
+ "access-client-id": "",
+ "access-topology-id": "",
+ "access-node-id": "",
+ "access-ltp-id": "",
+ "connectivity-selflink": "",
+ "cvlan": "",
+ "operational-status": "",
+ "resource-version": ""
+}
diff --git a/testsuite/robot/assets/templates/aai/csit-customer.template b/testsuite/robot/assets/templates/aai/csit-customer.template
new file mode 100644
index 0000000..9b09906
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-customer.template
@@ -0,0 +1,7 @@
+{
+ "global-customer-id": "${global_customer_id}",
+ "subscriber-name": "${subscriber_name}",
+ "subscriber-type": "${subscriber_type}",
+ "resource-version": ""
+}
+
diff --git a/testsuite/robot/assets/templates/aai/csit-generic-vnf.template b/testsuite/robot/assets/templates/aai/csit-generic-vnf.template
new file mode 100644
index 0000000..805a094
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-generic-vnf.template
@@ -0,0 +1,56 @@
+{
+ "vnf-id": "${vnf_id}",
+ "vnf-instance-id": "",
+ "vnf-name": "",
+ "vnf-name2": "",
+ "vnf-type": "${vnf_type}",
+ "service-id": "",
+ "regional-resource-zone": "",
+ "prov-status": "",
+ "operational-status": "",
+ "license-key": "",
+ "equipment-role": "",
+ "orchestration-status": "",
+ "vnf-package-name": "",
+ "vnf-discriptor-name": "",
+ "job-id": "",
+ "heat-stack-id": "",
+ "mso-catalog-key": "",
+ "management-option": "",
+ "ipv4-oam-address": "",
+ "ipv4-loopback0-address": "",
+ "nm-lan-v6-address": "",
+ "management-v6-address": "",
+ "vcpu": 0,
+ "vcpu-units": "",
+ "vmemory": 0,
+ "vmemory-units": "",
+ "vdisk": 0,
+ "vdisk-units": "",
+ "nshd": 0,
+ "nvm": 0,
+ "nnet": 0,
+ "in-maint": false,
+ "is-closed-loop-disabled": false,
+ "summary-status": "",
+ "encrypted-access-flag": true,
+ "entitlement-assignment-group-uuid": "",
+ "entitlement-resource-uuid": "",
+ "license-assignment-group-uuid": "",
+ "license-key-uuid": "",
+ "widget-model-id": "",
+ "widget-model-version": "",
+ "as-number": "",
+ "regional-resource-subzone": "",
+ "nf-type": "",
+ "nf-function": "",
+ "nf-role": "",
+ "nf-naming-code": "",
+ "selflink": "",
+ "ipv4-oam-gateway-address": "",
+ "ipv4-oam-gateway-address-prefix-length": 0,
+ "vlan-id-outer": 0,
+ "nm-profile-name": "",
+ "resource-version": ""
+}
+
diff --git a/testsuite/robot/assets/templates/aai/csit-metadatum.template b/testsuite/robot/assets/templates/aai/csit-metadatum.template
new file mode 100644
index 0000000..0ac87fe
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-metadatum.template
@@ -0,0 +1,6 @@
+{
+ "metaname": "${metaname}",
+ "metaval": "${metaval}",
+ "resource-version": ""
+}
+
diff --git a/testsuite/robot/assets/templates/aai/csit-pnf.template b/testsuite/robot/assets/templates/aai/csit-pnf.template
new file mode 100644
index 0000000..0f008f1
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-pnf.template
@@ -0,0 +1,30 @@
+{
+ "pnf-name": "${pnf_name}",
+ "pnf-name2": "",
+ "selflink": "",
+ "pnf-name2-source": "",
+ "pnf-id": "${pnf_id}",
+ "equip-type": "",
+ "equip-vendor": "",
+ "equip-model": "",
+ "management-option": "",
+ "ipaddress-v4-oam": "",
+ "sw-version": "",
+ "in-maint": false,
+ "frame-id": "",
+ "serial-number": "",
+ "ipaddress-v4-loopback-0": "",
+ "ipaddress-v6-loopback-0": "",
+ "ipaddress-v4-aim": "",
+ "ipaddress-v6-aim": "",
+ "ipaddress-v6-oam": "",
+ "inv-status": "",
+ "prov-status": "",
+ "nf-role": "",
+ "admin-status": "",
+ "operational-status": "",
+ "pnf-ipv4-address": "",
+ "pnf-ipv6-address": "",
+ "resource-version": ""
+}
+
diff --git a/testsuite/robot/assets/templates/aai/csit-relationship.template b/testsuite/robot/assets/templates/aai/csit-relationship.template
new file mode 100644
index 0000000..e8550aa
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-relationship.template
@@ -0,0 +1,4 @@
+{
+ "related-to": "${related_class_name}",
+ "related-link": "${related_object_url}"
+}
diff --git a/testsuite/robot/assets/templates/aai/csit-service-instance.template b/testsuite/robot/assets/templates/aai/csit-service-instance.template
new file mode 100644
index 0000000..0512c4f
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-service-instance.template
@@ -0,0 +1,21 @@
+{
+ "service-instance-id": "${service_instance_id}",
+ "service-instance-name": "",
+ "service-type": "",
+ "service-role": "",
+ "environment-context": "",
+ "workload-context": "",
+ "created-at": "",
+ "updated-at": "",
+ "description": "",
+ "widget-model-id": "",
+ "widget-model-version": "",
+ "bandwidth-total": "",
+ "vhn-portal-url": "",
+ "service-instance-location-id": "",
+ "selflink": "",
+ "orchestration-status": "",
+ "input-parameters": "",
+ "resource-version": ""
+}
+
diff --git a/testsuite/robot/assets/templates/aai/csit-service-subscription.template b/testsuite/robot/assets/templates/aai/csit-service-subscription.template
new file mode 100644
index 0000000..5a9d161
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-service-subscription.template
@@ -0,0 +1,6 @@
+{
+ "service-type": "${service_type}",
+ "temp-ub-sub-account-id": "",
+ "resource-version": ""
+}
+
diff --git a/testsuite/robot/assets/templates/aai/csit-vpn-binding.template b/testsuite/robot/assets/templates/aai/csit-vpn-binding.template
new file mode 100644
index 0000000..8c6743f
--- /dev/null
+++ b/testsuite/robot/assets/templates/aai/csit-vpn-binding.template
@@ -0,0 +1,18 @@
+{
+ "vpn-id": "${vpn_id}",
+ "vpn-name": "",
+ "vpn-platform": "",
+ "vpn-type": "",
+ "vpn-region": "",
+ "customer-vpn-id": "",
+ "route-distinguisher": "",
+ "access-provider-id": "",
+ "access-client-id": "",
+ "access-topology-id": "",
+ "src-access-node-id": "",
+ "src-access-ltp-id": "",
+ "dst-access-node-id": "",
+ "dst-access-ltp-id": "",
+ "operational-status": "",
+ "resource-version": ""
+} \ No newline at end of file
diff --git a/testsuite/robot/resources/aai/aai_interface.robot b/testsuite/robot/resources/aai/aai_interface.robot
new file mode 100644
index 0000000..c060006
--- /dev/null
+++ b/testsuite/robot/resources/aai/aai_interface.robot
@@ -0,0 +1,79 @@
+*** Settings ***
+Documentation The main interface for interacting with A&AI. It handles low level stuff like managing the http request library and A&AI required fields
+Library RequestsLibrary
+Library UUID
+Library HTTPUtils
+Resource ../global_properties.robot
+
+*** Variables ***
+${AAI_HEALTH_PATH} /aai/util/echo?action=long
+${VERSIONED_INDEX_PATH} /aai/v11
+${AAI_FRONTEND_ENDPOINT} ${GLOBAL_AAI_SERVER_PROTOCOL}://${GLOBAL_INJECTED_AAI1_IP_ADDR}:${GLOBAL_AAI_SERVER_PORT}
+
+
+*** Keywords ***
+Run A&AI Health Check
+ [Documentation] Runs an A&AI health check
+ ${resp}= Run A&AI Get Request ${AAI_HEALTH_PATH}
+ Should Be Equal As Strings ${resp.status_code} 200
+
+Run A&AI Get Request
+ [Documentation] Runs an A&AI get request
+ [Arguments] ${data_path}
+ Disable Warnings
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${AAI_FRONTEND_ENDPOINT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Get Request aai ${data_path} headers=${headers}
+ Log Received response from aai ${resp.text}
+ [Return] ${resp}
+
+Run A&AI Put Request
+ [Documentation] Runs an A&AI put request
+ [Arguments] ${data_path} ${data}
+ Disable Warnings
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${AAI_FRONTEND_ENDPOINT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Put Request aai ${data_path} data=${data} headers=${headers}
+ Log Received response from aai ${resp.text}
+ [Return] ${resp}
+
+Run A&AI Post Request
+ [Documentation] Runs an A&AI Post request
+ [Arguments] ${data_path} ${data}
+ Disable Warnings
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${AAI_FRONTEND_ENDPOINT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Post Request aai ${data_path} data=${data} headers=${headers}
+ Log Received response from aai ${resp.text}
+ [Return] ${resp}
+
+Run A&AI Delete Request
+ [Documentation] Runs an A&AI delete request
+ [Arguments] ${data_path} ${resource_version}
+ Disable Warnings
+ ${auth}= Create List ${GLOBAL_AAI_USERNAME} ${GLOBAL_AAI_PASSWORD}
+ ${session}= Create Session aai ${AAI_FRONTEND_ENDPOINT} auth=${auth}
+ ${uuid}= Generate UUID
+ ${headers}= Create Dictionary Accept=application/json Content-Type=application/json X-TransactionId=${GLOBAL_APPLICATION_ID}-${uuid} X-FromAppId=${GLOBAL_APPLICATION_ID}
+ ${resp}= Delete Request aai ${data_path}?resource-version=${resource_version} headers=${headers}
+ Log Received response from aai ${resp.text}
+ [Return] ${resp}
+
+Delete A&AI Entity
+ [Documentation] Deletes an entity in A&AI
+ [Arguments] ${uri}
+ ${get_resp}= Run A&AI Get Request ${VERSIONED_INDEX_PATH}${uri}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete A&AI Entity Exists ${uri} ${get_resp.json()['resource-version']}
+
+Delete A&AI Entity Exists
+ [Documentation] Deletes an A&AI entity
+ [Arguments] ${uri} ${resource_version_id}
+ ${put_resp}= Run A&AI Delete Request ${VERSIONED_INDEX_PATH}${uri} ${resource_version_id}
+ Should Be Equal As Strings ${put_resp.status_code} 204
+
diff --git a/testsuite/robot/resources/aai/csit-api-version-properties.robot b/testsuite/robot/resources/aai/csit-api-version-properties.robot
new file mode 100644
index 0000000..4accac9
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-api-version-properties.robot
@@ -0,0 +1,23 @@
+*** Settings ***
+Documentation store all properties that can change or are used in multiple places here
+... format is all caps with underscores between words and prepended with AAI
+... make sure you prepend them with AAI so that other files can easily see it is from this file.
+
+
+*** Variables ***
+${AAI_UNSUPPORTED_INDEX_PATH}= /aai/v1
+${AAI_AMSTERDAM_INDEX_PATH}= /aai/v11
+${AAI_BEIJING_INDEX_PATH}= /aai/v13
+${AAI_CASABLANCA_INDEX_PATH}= /aai/v14
+${AAI_DUBLIN_INDEX_PATH}= /aai/v16
+
+${AAI_CLOUDINFRA_PATH}= /cloud-infrastructure
+${AAI_EXTERNALSYS_PATH}= /external-system
+${AAI_BUSINESS_PATH}= /business
+${AAI_SDAC_PATH}= /service-design-and-creation
+${AAI_NETWORK_PATH}= /network
+${AAI_COMMON_PATH}= /common
+
+${AAI_NODES_PATH}= /nodes
+${AAI_EXAMPLES_PATH}= /examples
+
diff --git a/testsuite/robot/resources/aai/csit-connectivities.robot b/testsuite/robot/resources/aai/csit-connectivities.robot
new file mode 100644
index 0000000..23d43e6
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-connectivities.robot
@@ -0,0 +1,100 @@
+*** Settings ***
+Documentation Operations on connectivities in AAI for CCVPN use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_CONN_CONTAINER_PATH}= /connectivities
+${AAI_CONN_SUBOBJECT_PATH}= /connectivity
+${AAI_CONN_UNIQUE_KEY}= connectivity-id
+${AAI_CONN_CSIT_BODY}= robot/assets/templates/aai/csit-connectivity.template
+${AAI_CONN_ROOT_PATH}= ${AAI_NETWORK_PATH}${AAI_CONN_CONTAINER_PATH}${AAI_CONN_SUBOBJECT_PATH}
+${AAI_CONN_API_NA_INDEX_PATH}= ${AAI_BEIJING_INDEX_PATH}
+${AAI_CONN_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create Connectivity If Not Exists
+ [Documentation] Creates Connectivity in AAI if it doesn't exist
+ [Arguments] ${connectivity_id}
+ ${get_resp}= Get SubObject ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${AAI_CONN_UNIQUE_KEY} ${connectivity_id}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create Connectivity ${connectivity_id}
+
+Create Connectivity
+ [Documentation] Creates Connectivity in AAI
+ [Arguments] ${connectivity_id}
+ ${arguments}= Create Dictionary connectivity_id=${connectivity_id}
+ ${put_resp}= Create SubObject ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${connectivity_id} ${AAI_CONN_CSIT_BODY} ${arguments}
+
+Delete Connectivity If Exists
+ [Documentation] Removes Connectivity from AAI if it exists
+ [Arguments] ${connectivity_id}
+ ${get_resp}= Get SubObject ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${AAI_CONN_UNIQUE_KEY} ${connectivity_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Connectivity ${connectivity_id} ${get_resp.json()}
+
+Delete Connectivity
+ [Documentation] Removes Connectivity from AAI
+ [Arguments] ${connectivity_id} ${json}
+ ${del_resp}= Delete SubObject ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${connectivity_id} ${json}
+
+Get Connectivity
+ [Documentation] Return Connectivity
+ [Arguments] ${connectivity_id}
+ ${get_resp}= Get SubObject ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${AAI_CONN_UNIQUE_KEY} ${connectivity_id}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid Connectivity URL
+ [Documentation] Return Valid Connectivity URL
+ [Arguments] ${connectivity_id}
+ ${resp}= Get Valid SubObject URL ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${connectivity_id}
+ [Return] ${resp}
+
+Get Nodes Query Connectivity
+ [Documentation] Return Nodes query Connectivity
+ [Arguments] ${connectivity_id}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_CONN_API_IMPL_INDEX_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_UNIQUE_KEY} ${connectivity_id}
+ [Return] ${get_resp.json()}
+
+Get Example Connectivity
+ [Documentation] Return Example Connectivity
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_CONN_API_IMPL_INDEX_PATH} ${AAI_CONN_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No Connectivity
+ [Documentation] Confirm No Connectivity
+ [Arguments] ${connectivity_id}
+ ${get_resp}= Get SubObject ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${AAI_CONN_UNIQUE_KEY} ${connectivity_id}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented Connectivity
+ [Documentation] Confirm latest API version where Connectivity is not implemented
+ [Arguments] ${connectivity_id}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_CONN_API_NA_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_CONN_CONTAINER_PATH} ${AAI_CONN_SUBOBJECT_PATH} ${connectivity_id}
+
+Add Connectivity Relationship
+ [Documentation] Adds Relationship to existing Connectivity in AAI
+ [Arguments] ${connectivity_id} ${related_class_name} ${related_object_url}
+ ${put_resp}= Add Relationship ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_CONN_ROOT_PATH}/${connectivity_id} ${related_class_name} ${related_object_url}
+
+Get Connectivity RelationshipList
+ [Documentation] Return relationship-list from Connectivity
+ [Arguments] ${connectivity_id}
+ ${resp}= Get RelationshipList ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_CONN_ROOT_PATH}/${connectivity_id}
+ [Return] ${resp}
+
+Get Connectivity With RelationshipList
+ [Documentation] Return Connectivity with relationship-list
+ [Arguments] ${connectivity_id}
+ ${resp}= Get Object With Depth ${AAI_CONN_API_IMPL_INDEX_PATH}${AAI_CONN_ROOT_PATH}/${connectivity_id}
+ [Return] ${resp}
+
diff --git a/testsuite/robot/resources/aai/csit-customer.robot b/testsuite/robot/resources/aai/csit-customer.robot
new file mode 100644
index 0000000..52be29e
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-customer.robot
@@ -0,0 +1,101 @@
+*** Settings ***
+Documentation Operations on customers in AAI for BBS use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_CUST_CONTAINER_PATH}= /customers
+${AAI_CUST_SUBOBJECT_PATH}= /customer
+${AAI_CUST_UNIQUE_KEY}= global-customer-id
+${AAI_CUST_CSIT_BODY}= robot/assets/templates/aai/csit-customer.template
+${AAI_CUST_ROOT_PATH}= ${AAI_BUSINESS_PATH}${AAI_CUST_CONTAINER_PATH}${AAI_CUST_SUBOBJECT_PATH}
+${AAI_CUST_API_NA_INDEX_PATH}= ${AAI_UNSUPPORTED_INDEX_PATH}
+${AAI_CUST_API_IMPL_INDEX_PATH}= ${AAI_DUBLIN_INDEX_PATH}
+# ${AAI_CUST_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create Customer If Not Exists
+ [Documentation] Creates Customer in AAI if it doesn't exist
+ [Arguments] ${global_customer_id} ${subscriber_name} ${subscriber_type}
+ ${get_resp}= Get SubObject ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${AAI_CUST_UNIQUE_KEY} ${global_customer_id}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create Customer ${global_customer_id} ${subscriber_name} ${subscriber_type}
+
+Create Customer
+ [Documentation] Creates Customer in AAI
+ [Arguments] ${global_customer_id} ${subscriber_name} ${subscriber_type}
+ ${arguments}= Create Dictionary global_customer_id=${global_customer_id} subscriber_name=${subscriber_name} subscriber_type=${subscriber_type}
+ ${put_resp}= Create SubObject ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${global_customer_id} ${AAI_CUST_CSIT_BODY} ${arguments}
+
+Delete Customer If Exists
+ [Documentation] Removes Customer from AAI if it exists
+ [Arguments] ${global_customer_id}
+ ${get_resp}= Get SubObject ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${AAI_CUST_UNIQUE_KEY} ${global_customer_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Customer ${global_customer_id} ${get_resp.json()}
+
+Delete Customer
+ [Documentation] Removes Customer from AAI
+ [Arguments] ${global_customer_id} ${json}
+ ${del_resp}= Delete SubObject ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${global_customer_id} ${json}
+
+Get Customer
+ [Documentation] Return Customer
+ [Arguments] ${global_customer_id}
+ ${get_resp}= Get SubObject ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${AAI_CUST_UNIQUE_KEY} ${global_customer_id}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid Customer URL
+ [Documentation] Return Valid Customer URL
+ [Arguments] ${global_customer_id}
+ ${resp}= Get Valid SubObject URL ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${global_customer_id}
+ [Return] ${resp}
+
+Get Nodes Query Customer
+ [Documentation] Return Nodes query Customer
+ [Arguments] ${global_customer_id}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_CUST_API_IMPL_INDEX_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_UNIQUE_KEY} ${global_customer_id}
+ [Return] ${get_resp.json()}
+
+Get Example Customer
+ [Documentation] Return Example Customer
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_CUST_API_IMPL_INDEX_PATH} ${AAI_CUST_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No Customer
+ [Documentation] Confirm No Customer
+ [Arguments] ${global_customer_id}
+ ${get_resp}= Get SubObject ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${AAI_CUST_UNIQUE_KEY} ${global_customer_id}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented Customer
+ [Documentation] Confirm latest API version where Customer is not implemented
+ [Arguments] ${global_customer_id}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_CUST_API_NA_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_CUST_CONTAINER_PATH} ${AAI_CUST_SUBOBJECT_PATH} ${global_customer_id}
+
+Add Customer Relationship
+ [Documentation] Adds Relationship to existing Customer in AAI
+ [Arguments] ${global_customer_id} ${related_class_name} ${related_object_url}
+ ${put_resp}= Add Relationship ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_CUST_ROOT_PATH}/${global_customer_id} ${related_class_name} ${related_object_url}
+
+Get Customer RelationshipList
+ [Documentation] Return relationship-list from Customer
+ [Arguments] ${global_customer_id}
+ ${resp}= Get RelationshipList ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_CUST_ROOT_PATH}/${global_customer_id}
+ [Return] ${resp}
+
+Get Customer With RelationshipList
+ [Documentation] Return Customer with relationship-list
+ [Arguments] ${global_customer_id}
+ ${resp}= Get Object With Depth ${AAI_CUST_API_IMPL_INDEX_PATH}${AAI_CUST_ROOT_PATH}/${global_customer_id}
+ [Return] ${resp}
+
diff --git a/testsuite/robot/resources/aai/csit-generic-vnf.robot b/testsuite/robot/resources/aai/csit-generic-vnf.robot
new file mode 100644
index 0000000..db9a97b
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-generic-vnf.robot
@@ -0,0 +1,101 @@
+*** Settings ***
+Documentation Operations on generic-vnfs in AAI for BBS use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_GVNF_CONTAINER_PATH}= /generic-vnfs
+${AAI_GVNF_SUBOBJECT_PATH}= /generic-vnf
+${AAI_GVNF_UNIQUE_KEY}= vnf-id
+${AAI_GVNF_CSIT_BODY}= robot/assets/templates/aai/csit-generic-vnf.template
+${AAI_GVNF_ROOT_PATH}= ${AAI_NETWORK_PATH}${AAI_GVNF_CONTAINER_PATH}${AAI_GVNF_SUBOBJECT_PATH}
+${AAI_GVNF_API_NA_INDEX_PATH}= ${AAI_UNSUPPORTED_INDEX_PATH}
+${AAI_GVNF_API_IMPL_INDEX_PATH}= ${AAI_DUBLIN_INDEX_PATH}
+# ${AAI_GVNF_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create GenericVnf If Not Exists
+ [Documentation] Creates GenericVnf in AAI if it doesn't exist
+ [Arguments] ${vnf_id} ${vnf_type}
+ ${get_resp}= Get SubObject ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${AAI_GVNF_UNIQUE_KEY} ${vnf_id}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create GenericVnf ${vnf_id} ${vnf_type}
+
+Create GenericVnf
+ [Documentation] Creates GenericVnf in AAI
+ [Arguments] ${vnf_id} ${vnf_type}
+ ${arguments}= Create Dictionary vnf_id=${vnf_id} vnf_type=${vnf_type}
+ ${put_resp}= Create SubObject ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${vnf_id} ${AAI_GVNF_CSIT_BODY} ${arguments}
+
+Delete GenericVnf If Exists
+ [Documentation] Removes GenericVnf from AAI if it exists
+ [Arguments] ${vnf_id}
+ ${get_resp}= Get SubObject ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${AAI_GVNF_UNIQUE_KEY} ${vnf_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete GenericVnf ${vnf_id} ${get_resp.json()}
+
+Delete GenericVnf
+ [Documentation] Removes GenericVnf from AAI
+ [Arguments] ${vnf_id} ${json}
+ ${del_resp}= Delete SubObject ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${vnf_id} ${json}
+
+Get GenericVnf
+ [Documentation] Return GenericVnf
+ [Arguments] ${vnf_id}
+ ${get_resp}= Get SubObject ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${AAI_GVNF_UNIQUE_KEY} ${vnf_id}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid GenericVnf URL
+ [Documentation] Return Valid GenericVnf URL
+ [Arguments] ${vnf_id}
+ ${resp}= Get Valid SubObject URL ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${vnf_id}
+ [Return] ${resp}
+
+Get Nodes Query GenericVnf
+ [Documentation] Return Nodes query GenericVnf
+ [Arguments] ${vnf_id}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_GVNF_API_IMPL_INDEX_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_UNIQUE_KEY} ${vnf_id}
+ [Return] ${get_resp.json()}
+
+Get Example GenericVnf
+ [Documentation] Return Example GenericVnf
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_GVNF_API_IMPL_INDEX_PATH} ${AAI_GVNF_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No GenericVnf
+ [Documentation] Confirm No GenericVnf
+ [Arguments] ${vnf_id}
+ ${get_resp}= Get SubObject ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${AAI_GVNF_UNIQUE_KEY} ${vnf_id}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented GenericVnf
+ [Documentation] Confirm latest API version where GenericVnf is not implemented
+ [Arguments] ${vnf_id}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_GVNF_API_NA_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_GVNF_CONTAINER_PATH} ${AAI_GVNF_SUBOBJECT_PATH} ${vnf_id}
+
+Add GenericVnf Relationship
+ [Documentation] Adds Relationship to existing GenericVnf in AAI
+ [Arguments] ${vnf_id} ${related_class_name} ${related_object_url}
+ ${put_resp}= Add Relationship ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_GVNF_ROOT_PATH}/${vnf_id} ${related_class_name} ${related_object_url}
+
+Get GenericVnf RelationshipList
+ [Documentation] Return relationship-list from GenericVnf
+ [Arguments] ${vnf_id}
+ ${resp}= Get RelationshipList ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_GVNF_ROOT_PATH}/${vnf_id}
+ [Return] ${resp}
+
+Get GenericVnf With RelationshipList
+ [Documentation] Return GenericVnf with relationship-list
+ [Arguments] ${vnf_id}
+ ${resp}= Get Object With Depth ${AAI_GVNF_API_IMPL_INDEX_PATH}${AAI_GVNF_ROOT_PATH}/${vnf_id}
+ [Return] ${resp}
+
diff --git a/testsuite/robot/resources/aai/csit-metadatum.robot b/testsuite/robot/resources/aai/csit-metadatum.robot
new file mode 100644
index 0000000..f5f1688
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-metadatum.robot
@@ -0,0 +1,86 @@
+*** Settings ***
+Documentation Operations on metadata in AAI for BBS use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented.
+... Note that metadatum is always a sub-object!
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_META_CONTAINER_PATH}= /metadata
+${AAI_META_SUBOBJECT_PATH}= /metadatum
+${AAI_META_UNIQUE_KEY}= metaname
+${AAI_META_CSIT_BODY}= robot/assets/templates/aai/csit-metadatum.template
+${AAI_META_ROOT_PATH}= ${AAI_BUSINESS_PATH}${AAI_META_CONTAINER_PATH}${AAI_META_SUBOBJECT_PATH}
+${AAI_META_API_NA_INDEX_PATH}= ${AAI_UNSUPPORTED_INDEX_PATH}
+${AAI_META_API_IMPL_INDEX_PATH}= ${AAI_DUBLIN_INDEX_PATH}
+# ${AAI_META_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create Metadatum If Not Exists
+ [Documentation] Creates Metadatum in AAI if it doesn't exist
+ [Arguments] ${api_version_base_object_url} ${metaname} ${metaval}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${AAI_META_UNIQUE_KEY} ${metaname}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create Metadatum ${api_version_base_object_url} ${metaname} ${metaval}
+
+Create Metadatum
+ [Documentation] Creates Metadatum in AAI
+ [Arguments] ${api_version_base_object_url} ${metaname} ${metaval}
+ ${arguments}= Create Dictionary metaname=${metaname} metaval=${metaval}
+ ${put_resp}= Create SubObject ${api_version_base_object_url} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${metaname} ${AAI_META_CSIT_BODY} ${arguments}
+
+Delete Metadatum If Exists
+ [Documentation] Removes Metadatum from AAI if it exists
+ [Arguments] ${api_version_base_object_url} ${metaname}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${AAI_META_UNIQUE_KEY} ${metaname}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Metadatum ${api_version_base_object_url} ${metaname} ${get_resp.json()}
+
+Delete Metadatum
+ [Documentation] Removes Metadatum from AAI
+ [Arguments] ${api_version_base_object_url} ${metaname} ${json}
+ ${del_resp}= Delete SubObject ${api_version_base_object_url} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${metaname} ${json}
+
+Get Metadatum
+ [Documentation] Return Metadatum
+ [Arguments] ${api_version_base_object_url} ${metaname}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${AAI_META_UNIQUE_KEY} ${metaname}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid Metadatum URL
+ [Documentation] Return Valid Metadatum URL
+ [Arguments] ${api_version_base_object_url} ${metaname}
+ ${resp}= Get Valid SubObject URL ${api_version_base_object_url} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${metaname}
+ [Return] ${resp}
+
+Get Nodes Query Metadatum
+ [Documentation] Return Nodes query Metadatum
+ [Arguments] ${metaname}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_META_API_IMPL_INDEX_PATH} ${AAI_META_CONTAINER_PATH} ${AAI_META_UNIQUE_KEY} ${metaname}
+ [Return] ${get_resp.json()}
+
+Get Example Metadatum
+ [Documentation] Return Example Metadatum
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_META_API_IMPL_INDEX_PATH} ${AAI_META_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No Metadatum
+ [Documentation] Confirm No Metadatum
+ [Arguments] ${api_version_base_object_url} ${metaname}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${AAI_META_UNIQUE_KEY} ${metaname}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented Metadatum
+ [Documentation] Confirm latest API version where Metadatum is not implemented
+ [Arguments] ${metaname}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_META_API_NA_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_META_CONTAINER_PATH} ${AAI_META_SUBOBJECT_PATH} ${metaname}
+
+
diff --git a/testsuite/robot/resources/aai/csit-pnf.robot b/testsuite/robot/resources/aai/csit-pnf.robot
new file mode 100644
index 0000000..91a078c
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-pnf.robot
@@ -0,0 +1,101 @@
+*** Settings ***
+Documentation Operations on pnfs in AAI for BBS use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_PNF_CONTAINER_PATH}= /pnfs
+${AAI_PNF_SUBOBJECT_PATH}= /pnf
+${AAI_PNF_UNIQUE_KEY}= pnf-name
+${AAI_PNF_CSIT_BODY}= robot/assets/templates/aai/csit-pnf.template
+${AAI_PNF_ROOT_PATH}= ${AAI_NETWORK_PATH}${AAI_PNF_CONTAINER_PATH}${AAI_PNF_SUBOBJECT_PATH}
+${AAI_PNF_API_NA_INDEX_PATH}= ${AAI_UNSUPPORTED_INDEX_PATH}
+${AAI_PNF_API_IMPL_INDEX_PATH}= ${AAI_DUBLIN_INDEX_PATH}
+# ${AAI_PNF_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create Pnf If Not Exists
+ [Documentation] Creates Pnf in AAI if it doesn't exist
+ [Arguments] ${pnf_name} ${pnf_id}
+ ${get_resp}= Get SubObject ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${AAI_PNF_UNIQUE_KEY} ${pnf_name}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create Pnf ${pnf_name} ${pnf_id}
+
+Create Pnf
+ [Documentation] Creates Pnf in AAI
+ [Arguments] ${pnf_name} ${pnf_id}
+ ${arguments}= Create Dictionary pnf_name=${pnf_name} pnf_id=${pnf_id}
+ ${put_resp}= Create SubObject ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${pnf_name} ${AAI_PNF_CSIT_BODY} ${arguments}
+
+Delete Pnf If Exists
+ [Documentation] Removes Pnf from AAI if it exists
+ [Arguments] ${pnf_name}
+ ${get_resp}= Get SubObject ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${AAI_PNF_UNIQUE_KEY} ${pnf_name}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Pnf ${pnf_name} ${get_resp.json()}
+
+Delete Pnf
+ [Documentation] Removes Pnf from AAI
+ [Arguments] ${pnf_name} ${json}
+ ${del_resp}= Delete SubObject ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${pnf_name} ${json}
+
+Get Pnf
+ [Documentation] Return Pnf
+ [Arguments] ${pnf_name}
+ ${get_resp}= Get SubObject ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${AAI_PNF_UNIQUE_KEY} ${pnf_name}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid Pnf URL
+ [Documentation] Return Valid Pnf URL
+ [Arguments] ${pnf_name}
+ ${resp}= Get Valid SubObject URL ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${pnf_name}
+ [Return] ${resp}
+
+Get Nodes Query Pnf
+ [Documentation] Return Nodes query Pnf
+ [Arguments] ${pnf_name}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_PNF_API_IMPL_INDEX_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_UNIQUE_KEY} ${pnf_name}
+ [Return] ${get_resp.json()}
+
+Get Example Pnf
+ [Documentation] Return Example Pnf
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_PNF_API_IMPL_INDEX_PATH} ${AAI_PNF_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No Pnf
+ [Documentation] Confirm No Pnf
+ [Arguments] ${pnf_name}
+ ${get_resp}= Get SubObject ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${AAI_PNF_UNIQUE_KEY} ${pnf_name}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented Pnf
+ [Documentation] Confirm latest API version where Pnf is not implemented
+ [Arguments] ${pnf_name}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_PNF_API_NA_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_PNF_CONTAINER_PATH} ${AAI_PNF_SUBOBJECT_PATH} ${pnf_name}
+
+Add Pnf Relationship
+ [Documentation] Adds Relationship to existing Pnf in AAI
+ [Arguments] ${pnf_name} ${related_class_name} ${related_object_url}
+ ${put_resp}= Add Relationship ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_PNF_ROOT_PATH}/${pnf_name} ${related_class_name} ${related_object_url}
+
+Get Pnf RelationshipList
+ [Documentation] Return relationship-list from Pnf
+ [Arguments] ${pnf_name}
+ ${resp}= Get RelationshipList ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_PNF_ROOT_PATH}/${pnf_name}
+ [Return] ${resp}
+
+Get Pnf With RelationshipList
+ [Documentation] Return Pnf with relationship-list
+ [Arguments] ${pnf_name}
+ ${resp}= Get Object With Depth ${AAI_PNF_API_IMPL_INDEX_PATH}${AAI_PNF_ROOT_PATH}/${pnf_name}
+ [Return] ${resp}
+
diff --git a/testsuite/robot/resources/aai/csit-relationship-list.robot b/testsuite/robot/resources/aai/csit-relationship-list.robot
new file mode 100644
index 0000000..9bc508b
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-relationship-list.robot
@@ -0,0 +1,44 @@
+*** Settings ***
+Documentation Operations on relationship-list sub-object in AAI,
+... using specified base URL path including API version where it is implemented,
+... relies on system to choose default EdgeRule for the pair of object classes
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_RELATIONSHIPLIST_PATH}= relationship-list
+${AAI_RELATIONSHIP_PATH}= ${AAI_RELATIONSHIPLIST_PATH}/relationship
+${AAI_CSIT_RELATIONSHIP_BODY}= robot/assets/templates/aai/csit-relationship.template
+${AAI_RELATIONSHIP_DEPTH}= ?depth=1
+
+*** Keywords ***
+Add Relationship
+ [Documentation] Adds Relationship sub-object to existing object in AAI
+ [Arguments] ${api_version_base_object_url} ${related_class_name} ${related_object_url}
+ ${arguments}= Create Dictionary related_class_name=${related_class_name} related_object_url=${related_object_url}
+ ${data}= Fill JSON Template File ${AAI_CSIT_RELATIONSHIP_BODY} ${arguments}
+ ${put_resp}= Run A&AI Put Request ${api_version_base_object_url}/${AAI_RELATIONSHIP_PATH} ${data}
+ Log Put response ${put_resp.text}
+ ${status_string}= Convert To String ${put_resp.status_code}
+ Should Match Regexp ${status_string} ^(201|200)$
+
+Get RelationshipList
+ [Documentation] Return RelationshipList of the object in AAI
+ [Arguments] ${api_version_base_object_url}
+ ${resp}= Get Object With Depth ${api_version_base_object_url}
+ Log Returning response ${resp['${AAI_RELATIONSHIPLIST_PATH}']}
+ [Return] ${resp['${AAI_RELATIONSHIPLIST_PATH}']}
+
+Get Object With Depth
+ [Documentation] Return Object with Depth parameter to show RelationshipList
+ [Arguments] ${api_version_base_object_url}
+ ${resp}= Run A&AI Get Request ${api_version_base_object_url}${AAI_RELATIONSHIP_DEPTH}
+ Should Be Equal As Strings ${resp.status_code} 200
+ Log Returning response ${resp.json()}
+ [Return] ${resp.json()}
+
diff --git a/testsuite/robot/resources/aai/csit-service-instance.robot b/testsuite/robot/resources/aai/csit-service-instance.robot
new file mode 100644
index 0000000..0b9d441
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-service-instance.robot
@@ -0,0 +1,102 @@
+*** Settings ***
+Documentation Operations on service-instances in AAI for BBS use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented.
+... Note that service-instance is always a sub-object!
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_SINST_CONTAINER_PATH}= /service-instances
+${AAI_SINST_SUBOBJECT_PATH}= /service-instance
+${AAI_SINST_UNIQUE_KEY}= service-instance-id
+${AAI_SINST_CSIT_BODY}= robot/assets/templates/aai/csit-service-instance.template
+${AAI_SINST_ROOT_PATH}= ${AAI_BUSINESS_PATH}${AAI_SINST_CONTAINER_PATH}${AAI_SINST_SUBOBJECT_PATH}
+${AAI_SINST_API_NA_INDEX_PATH}= ${AAI_UNSUPPORTED_INDEX_PATH}
+${AAI_SINST_API_IMPL_INDEX_PATH}= ${AAI_DUBLIN_INDEX_PATH}
+# ${AAI_SINST_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create Service Instance If Not Exists
+ [Documentation] Creates Service Instance in AAI if it doesn't exist
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${AAI_SINST_UNIQUE_KEY} ${service_instance_id}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create Service Instance ${api_version_base_object_url} ${service_instance_id}
+
+Create Service Instance
+ [Documentation] Creates Service Instance in AAI
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${arguments}= Create Dictionary service_instance_id=${service_instance_id}
+ ${put_resp}= Create SubObject ${api_version_base_object_url} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${service_instance_id} ${AAI_SINST_CSIT_BODY} ${arguments}
+
+Delete Service Instance If Exists
+ [Documentation] Removes Service Instance from AAI if it exists
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${AAI_SINST_UNIQUE_KEY} ${service_instance_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Service Instance ${api_version_base_object_url} ${service_instance_id} ${get_resp.json()}
+
+Delete Service Instance
+ [Documentation] Removes Service Instance from AAI
+ [Arguments] ${api_version_base_object_url} ${service_instance_id} ${json}
+ ${del_resp}= Delete SubObject ${api_version_base_object_url} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${service_instance_id} ${json}
+
+Get Service Instance
+ [Documentation] Return Service Instance
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${AAI_SINST_UNIQUE_KEY} ${service_instance_id}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid Service Instance URL
+ [Documentation] Return Valid Service Instance URL
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${resp}= Get Valid SubObject URL ${api_version_base_object_url} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${service_instance_id}
+ [Return] ${resp}
+
+Get Nodes Query Service Instance
+ [Documentation] Return Nodes query Service Instance
+ [Arguments] ${service_instance_id}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_SINST_API_IMPL_INDEX_PATH} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_UNIQUE_KEY} ${service_instance_id}
+ [Return] ${get_resp.json()}
+
+Get Example Service Instance
+ [Documentation] Return Example Service Instance
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_SINST_API_IMPL_INDEX_PATH} ${AAI_SINST_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No Service Instance
+ [Documentation] Confirm No Service Instance
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${AAI_SINST_UNIQUE_KEY} ${service_instance_id}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented Service Instance
+ [Documentation] Confirm latest API version where Service Instance is not implemented
+ [Arguments] ${service_instance_id}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_SINST_API_NA_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_SINST_CONTAINER_PATH} ${AAI_SINST_SUBOBJECT_PATH} ${service_instance_id}
+
+Add Service Instance Relationship
+ [Documentation] Adds Relationship to existing Service Instance in AAI
+ [Arguments] ${api_version_base_object_url} ${service_instance_id} ${related_class_name} ${related_object_url}
+ ${put_resp}= Add Relationship ${api_version_base_object_url}${AAI_SINST_ROOT_PATH}/${service_instance_id} ${related_class_name} ${related_object_url}
+
+Get Service Instance RelationshipList
+ [Documentation] Return relationship-list from Service Instance
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${resp}= Get RelationshipList ${api_version_base_object_url}${AAI_SINST_ROOT_PATH}/${service_instance_id}
+ [Return] ${resp}
+
+Get Service Instance With RelationshipList
+ [Documentation] Return Service Instance with relationship-list
+ [Arguments] ${api_version_base_object_url} ${service_instance_id}
+ ${resp}= Get Object With Depth ${api_version_base_object_url}${AAI_SINST_ROOT_PATH}/${service_instance_id}
+ [Return] ${resp}
+
diff --git a/testsuite/robot/resources/aai/csit-service-subscription.robot b/testsuite/robot/resources/aai/csit-service-subscription.robot
new file mode 100644
index 0000000..646a347
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-service-subscription.robot
@@ -0,0 +1,102 @@
+*** Settings ***
+Documentation Operations on service-subscriptions in AAI for BBS use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented.
+... Note that service-subscription is always a sub-object!
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_SSUBS_CONTAINER_PATH}= /service-subscriptions
+${AAI_SSUBS_SUBOBJECT_PATH}= /service-subscription
+${AAI_SSUBS_UNIQUE_KEY}= service-type
+${AAI_SSUBS_CSIT_BODY}= robot/assets/templates/aai/csit-service-subscription.template
+${AAI_SSUBS_ROOT_PATH}= ${AAI_BUSINESS_PATH}${AAI_SSUBS_CONTAINER_PATH}${AAI_SSUBS_SUBOBJECT_PATH}
+${AAI_SSUBS_API_NA_INDEX_PATH}= ${AAI_UNSUPPORTED_INDEX_PATH}
+${AAI_SSUBS_API_IMPL_INDEX_PATH}= ${AAI_DUBLIN_INDEX_PATH}
+# ${AAI_SSUBS_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create Service Subscription If Not Exists
+ [Documentation] Creates Service Subscription in AAI if it doesn't exist
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${AAI_SSUBS_UNIQUE_KEY} ${service_type}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create Service Subscription ${api_version_base_object_url} ${service_type}
+
+Create Service Subscription
+ [Documentation] Creates Service Subscription in AAI
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${arguments}= Create Dictionary service_type=${service_type}
+ ${put_resp}= Create SubObject ${api_version_base_object_url} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${service_type} ${AAI_SSUBS_CSIT_BODY} ${arguments}
+
+Delete Service Subscription If Exists
+ [Documentation] Removes Service Subscription from AAI if it exists
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${AAI_SSUBS_UNIQUE_KEY} ${service_type}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete Service Subscription ${api_version_base_object_url} ${service_type} ${get_resp.json()}
+
+Delete Service Subscription
+ [Documentation] Removes Service Subscription from AAI
+ [Arguments] ${api_version_base_object_url} ${service_type} ${json}
+ ${del_resp}= Delete SubObject ${api_version_base_object_url} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${service_type} ${json}
+
+Get Service Subscription
+ [Documentation] Return Service Subscription
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${AAI_SSUBS_UNIQUE_KEY} ${service_type}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid Service Subscription URL
+ [Documentation] Return Valid Service Subscription URL
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${resp}= Get Valid SubObject URL ${api_version_base_object_url} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${service_type}
+ [Return] ${resp}
+
+Get Nodes Query Service Subscription
+ [Documentation] Return Nodes query Service Subscription
+ [Arguments] ${service_type}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_SSUBS_API_IMPL_INDEX_PATH} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_UNIQUE_KEY} ${service_type}
+ [Return] ${get_resp.json()}
+
+Get Example Service Subscription
+ [Documentation] Return Example Service Subscription
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_SSUBS_API_IMPL_INDEX_PATH} ${AAI_SSUBS_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No Service Subscription
+ [Documentation] Confirm No Service Subscription
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${get_resp}= Get SubObject ${api_version_base_object_url} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${AAI_SSUBS_UNIQUE_KEY} ${service_type}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented Service Subscription
+ [Documentation] Confirm latest API version where Service Subscription is not implemented
+ [Arguments] ${service_type}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_SSUBS_API_NA_INDEX_PATH}${AAI_BUSINESS_PATH} ${AAI_SSUBS_CONTAINER_PATH} ${AAI_SSUBS_SUBOBJECT_PATH} ${service_type}
+
+Add Service Subscription Relationship
+ [Documentation] Adds Relationship to existing Service Subscription in AAI
+ [Arguments] ${api_version_base_object_url} ${service_type} ${related_class_name} ${related_object_url}
+ ${put_resp}= Add Relationship ${api_version_base_object_url}${AAI_SSUBS_ROOT_PATH}/${service_type} ${related_class_name} ${related_object_url}
+
+Get Service Subscription RelationshipList
+ [Documentation] Return relationship-list from Service Subscription
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${resp}= Get RelationshipList ${api_version_base_object_url}${AAI_SSUBS_ROOT_PATH}/${service_type}
+ [Return] ${resp}
+
+Get Service Subscription With RelationshipList
+ [Documentation] Return Service Subscription with relationship-list
+ [Arguments] ${api_version_base_object_url} ${service_type}
+ ${resp}= Get Object With Depth ${api_version_base_object_url}${AAI_SSUBS_ROOT_PATH}/${service_type}
+ [Return] ${resp}
+
diff --git a/testsuite/robot/resources/aai/csit-subobject.robot b/testsuite/robot/resources/aai/csit-subobject.robot
new file mode 100644
index 0000000..3f080cb
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-subobject.robot
@@ -0,0 +1,76 @@
+*** Settings ***
+Documentation Framework for operations on sub-object in AAI,
+... using specified base URL path including API version where it is implemented
+... and specified sub-object URL path, object templates and parameters
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+
+
+*** Keywords ***
+Create SubObject
+ [Documentation] Creates sub-object in existing object in AAI
+ [Arguments] ${api_version_base_object_url} ${container_path} ${subobject_path} ${uniquekey_value} ${subobject_template} ${subobject_params}
+ ${data}= Fill JSON Template File ${subobject_template} ${subobject_params}
+ ${put_resp}= Run A&AI Put Request ${api_version_base_object_url}${container_path}${subobject_path}/${uniquekey_value} ${data}
+ Log Put response ${put_resp.text}
+ ${status_string}= Convert To String ${put_resp.status_code}
+ Should Match Regexp ${status_string} ^(201|200)$
+
+Delete SubObject
+ [Documentation] Removes SubObject from existing object in AAI
+ [Arguments] ${api_version_base_object_url} ${container_path} ${subobject_path} ${uniquekey_value} ${json}
+ ${resource_version}= Catenate ${json['resource-version']}
+ ${del_resp}= Run A&AI Delete Request ${api_version_base_object_url}${container_path}${subobject_path}/${uniquekey_value} ${resource_version}
+ Log Put response ${del_resp.text}
+ Should Be Equal As Strings ${del_resp.status_code} 204
+
+Get SubObjects
+ [Documentation] Return list of sub-objects of the object in AAI
+ [Arguments] ${api_version_base_object_url} ${container_path}
+ ${get_resp}= Run A&AI Get Request ${api_version_base_object_url}/${container_path}
+ Log Returning response ${get_resp.json()}
+ [Return] ${get_resp.json()}
+
+Get SubObject
+ [Documentation] Return individual sub-object of the object in AAI
+ [Arguments] ${api_version_base_object_url} ${container_path} ${subobject_path} ${search_key} ${search_value}
+ ${get_resp}= Run A&AI Get Request ${api_version_base_object_url}${container_path}${subobject_path}?${search_key}=${search_value}
+ Log Returning response ${get_resp.text}
+ [Return] ${get_resp}
+
+Confirm Nodes Query SubObjects
+ [Documentation] Return Nodes query sub-objects
+ [Arguments] ${api_version_base_url} ${container_path} ${search_key} ${search_value}
+ ${nodes_resp}= Run A&AI Get Request ${api_version_base_url}${AAI_NODES_PATH}${container_path}?${search_key}=${search_value}
+ Should Be Equal As Strings ${nodes_resp.status_code} 200
+ Log Returning response ${nodes_resp.text}
+ [Return] ${nodes_resp}
+
+Confirm Examples Query SubObjects
+ [Documentation] Return Examples query sub-objects
+ [Arguments] ${api_version_base_url} ${container_path}
+ ${eg_resp}= Run A&AI Get Request ${api_version_base_url}${AAI_EXAMPLES_PATH}${container_path}
+ Should Be Equal As Strings ${eg_resp.status_code} 200
+ Log Returning response ${eg_resp.text}
+ [Return] ${eg_resp}
+
+Get Valid SubObject URL
+ [Documentation] Return Valid SubObject URL
+ [Arguments] ${api_version_base_object_url} ${container_path} ${subobject_path} ${uniquekey_value}
+ ${resp}= Run A&AI Get Request ${api_version_base_object_url}${container_path}${subobject_path}/${uniquekey_value}
+ Should Be Equal As Strings ${resp.status_code} 200
+ [Return] ${api_version_base_object_url}${container_path}${subobject_path}/${uniquekey_value}
+
+Confirm API Not Implemented SubObject
+ [Documentation] Confirm latest API version where SubObject is not implemented
+ [Arguments] ${api_version_base_object_url} ${container_path} ${subobject_path} ${uniquekey_value}
+ ${resp}= Run A&AI Get Request ${api_version_base_object_url}${container_path}${subobject_path}/${uniquekey_value}
+ Should Be Equal As Strings ${resp.status_code} 400
+
diff --git a/testsuite/robot/resources/aai/csit-vpn-bindings.robot b/testsuite/robot/resources/aai/csit-vpn-bindings.robot
new file mode 100644
index 0000000..67cb433
--- /dev/null
+++ b/testsuite/robot/resources/aai/csit-vpn-bindings.robot
@@ -0,0 +1,100 @@
+*** Settings ***
+Documentation Operations on vpn-bindings in AAI for CCVPN use case,
+... using earliest API version where it is implemented
+... and latest API version where it is not implemented
+
+Resource ../json_templater.robot
+Resource aai_interface.robot
+Resource csit-api-version-properties.robot
+Resource csit-relationship-list.robot
+Resource csit-subobject.robot
+Library OperatingSystem
+Library Collections
+
+
+*** Variables ***
+${AAI_VPNB_CONTAINER_PATH}= /vpn-bindings
+${AAI_VPNB_SUBOBJECT_PATH}= /vpn-binding
+${AAI_VPNB_UNIQUE_KEY}= vpn-id
+${AAI_VPNB_CSIT_BODY}= robot/assets/templates/aai/csit-vpn-binding.template
+${AAI_VPNB_ROOT_PATH}= ${AAI_NETWORK_PATH}${AAI_VPNB_CONTAINER_PATH}${AAI_VPNB_SUBOBJECT_PATH}
+${AAI_VPNB_API_NA_INDEX_PATH}= ${AAI_UNSUPPORTED_INDEX_PATH}
+${AAI_VPNB_API_IMPL_INDEX_PATH}= ${AAI_CASABLANCA_INDEX_PATH}
+
+*** Keywords ***
+Create VPN Binding If Not Exists
+ [Documentation] Creates VPN Binding in AAI if it doesn't exist
+ [Arguments] ${vpn_id}
+ ${get_resp}= Get SubObject ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${AAI_VPNB_UNIQUE_KEY} ${vpn_id}
+ Return From Keyword If '${get_resp.status_code}' == '200'
+ Create VPN Binding ${vpn_id}
+
+Create VPN Binding
+ [Documentation] Creates VPN Binding in AAI
+ [Arguments] ${vpn_id}
+ ${arguments}= Create Dictionary vpn_id=${vpn_id}
+ ${put_resp}= Create SubObject ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${vpn_id} ${AAI_VPNB_CSIT_BODY} ${arguments}
+
+Delete VPN Binding If Exists
+ [Documentation] Removes VPN Binding from AAI if it exists
+ [Arguments] ${vpn_id}
+ ${get_resp}= Get SubObject ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${AAI_VPNB_UNIQUE_KEY} ${vpn_id}
+ Run Keyword If '${get_resp.status_code}' == '200' Delete VPN Binding ${vpn_id} ${get_resp.json()}
+
+Delete VPN Binding
+ [Documentation] Removes VPN Binding from AAI
+ [Arguments] ${vpn_id} ${json}
+ ${del_resp}= Delete SubObject ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${vpn_id} ${json}
+
+Get VPN Binding
+ [Documentation] Return VPN Binding
+ [Arguments] ${vpn_id}
+ ${get_resp}= Get SubObject ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${AAI_VPNB_UNIQUE_KEY} ${vpn_id}
+ Should Be Equal As Strings ${get_resp.status_code} 200
+ [Return] ${get_resp.json()}
+
+Get Valid VPN Binding URL
+ [Documentation] Return Valid VPN Binding URL
+ [Arguments] ${vpn_id}
+ ${resp}= Get Valid SubObject URL ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${vpn_id}
+ [Return] ${resp}
+
+Get Nodes Query VPN Binding
+ [Documentation] Return Nodes query VPN Binding
+ [Arguments] ${vpn_id}
+ ${get_resp}= Confirm Nodes Query SubObjects ${AAI_VPNB_API_IMPL_INDEX_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_UNIQUE_KEY} ${vpn_id}
+ [Return] ${get_resp.json()}
+
+Get Example VPN Binding
+ [Documentation] Return Example VPN Binding
+ ${get_resp}= Confirm Examples Query SubObjects ${AAI_VPNB_API_IMPL_INDEX_PATH} ${AAI_VPNB_CONTAINER_PATH}
+ [Return] ${get_resp.json()}
+
+Confirm No VPN Binding
+ [Documentation] Confirm No VPN Binding
+ [Arguments] ${vpn_id}
+ ${get_resp}= Get SubObject ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${AAI_VPNB_UNIQUE_KEY} ${vpn_id}
+ Should Be Equal As Strings ${get_resp.status_code} 404
+
+Confirm API Not Implemented VPN Binding
+ [Documentation] Confirm latest API version where VPN Binding is not implemented
+ [Arguments] ${vpn_id}
+ ${resp}= Confirm API Not Implemented SubObject ${AAI_VPNB_API_NA_INDEX_PATH}${AAI_NETWORK_PATH} ${AAI_VPNB_CONTAINER_PATH} ${AAI_VPNB_SUBOBJECT_PATH} ${vpn_id}
+
+Add VPN Binding Relationship
+ [Documentation] Adds Relationship to existing VPN Binding in AAI
+ [Arguments] ${vpn_id} ${related_class_name} ${related_object_url}
+ ${put_resp}= Add Relationship ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_VPNB_ROOT_PATH}/${vpn_id} ${related_class_name} ${related_object_url}
+
+Get VPN Binding RelationshipList
+ [Documentation] Return relationship-list from VPN Binding
+ [Arguments] ${vpn_id}
+ ${resp}= Get RelationshipList ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_VPNB_ROOT_PATH}/${vpn_id}
+ [Return] ${resp}
+
+Get VPN Binding With RelationshipList
+ [Documentation] Return VPN Binding with relationship-list
+ [Arguments] ${vpn_id}
+ ${resp}= Get Object With Depth ${AAI_VPNB_API_IMPL_INDEX_PATH}${AAI_VPNB_ROOT_PATH}/${vpn_id}
+ [Return] ${resp}
+
diff --git a/testsuite/robot/resources/global_properties.robot b/testsuite/robot/resources/global_properties.robot
new file mode 100644
index 0000000..609e9b2
--- /dev/null
+++ b/testsuite/robot/resources/global_properties.robot
@@ -0,0 +1,43 @@
+*** Settings ***
+Documentation store all properties that can change or are used in multiple places here
+... format is all caps with underscores between words and prepended with GLOBAL
+... make sure you prepend them with GLOBAL so that other files can easily see it is from this file.
+
+
+*** Variables ***
+${GLOBAL_APPLICATION_ID} robot-ete
+${GLOBAL_MSO_STATUS_PATH} /onap/so/infra/orchestrationRequests/v6/
+${GLOBAL_SELENIUM_BROWSER} chrome
+${GLOBAL_SELENIUM_BROWSER_CAPABILITIES} Create Dictionary
+${GLOBAL_SELENIUM_DELAY} 0
+${GLOBAL_SELENIUM_BROWSER_IMPLICIT_WAIT} 5
+${GLOBAL_SELENIUM_BROWSER_WAIT_TIMEOUT} 15
+${GLOBAL_OPENSTACK_HEAT_SERVICE_TYPE} orchestration
+${GLOBAL_OPENSTACK_CINDER_SERVICE_TYPE} volume
+${GLOBAL_OPENSTACK_NOVA_SERVICE_TYPE} compute
+${GLOBAL_OPENSTACK_NEUTRON_SERVICE_TYPE} network
+${GLOBAL_OPENSTACK_GLANCE_SERVICE_TYPE} image
+${GLOBAL_OPENSTACK_KEYSTONE_SERVICE_TYPE} identity
+${GLOBAL_OPENSTACK_STACK_DEPLOYMENT_TIMEOUT} 600s
+${GLOBAL_AAI_CLOUD_OWNER} CloudOwner
+${GLOBAL_AAI_CLOUD_OWNER_DEFINED_TYPE} OwnerType
+${GLOBAL_AAI_COMPLEX_NAME} clli1
+${GLOBAL_AAI_PHYSICAL_LOCATION_ID} clli1
+${GLOBAL_AAI_AVAILABILITY_ZONE_NAME} nova
+${GLOBAL_BUILD_NUMBER} 0
+${GLOBAL_VID_UI_TIMEOUT_SHORT} 20s
+${GLOBAL_VID_UI_TIMEOUT_MEDIUM} 60s
+${GLOBAL_VID_UI_TIMEOUT_LONG} 120s
+${GLOBAL_VM_PRIVATE_KEY} ${EXECDIR}/robot/assets/keys/robot_ssh_private_key.pvt
+${GLOBAL_ONAP_PRIVATE_KEY} ${EXECDIR}/robot/assets/keys/onap_dev.pvt
+${GLOBAL_AAI_INDEX_PATH} /aai/v14
+${GLOBAL_AAI_ZONE_ID} nova1
+${GLOBAL_AAI_ZONE_NAME} nova
+${GLOBAL_AAI_DESIGN_TYPE} integration
+${GLOBAL_AAI_ZONE_CONTEXT} labs
+${GLOBAL_DNS_HV_VES_NAME} dcae-hv-ves-collector
+${GLOBAL_HV_VES_SERVER_PORT} 6061
+${GLOBAL_DNS_VES_NAME} dcae-ves-collector
+${GLOBAL_VES_SERVER_PORT} 8080
+${GLOBAL_DNS_MESSAGE_ROUTER_KAFKA_NAME} message-router-kafka
+${GLOBAL_MESSAGE_ROUTER_KAFKA_PORT} 9092
diff --git a/testsuite/robot/resources/json_templater.robot b/testsuite/robot/resources/json_templater.robot
new file mode 100644
index 0000000..6a5ca17
--- /dev/null
+++ b/testsuite/robot/resources/json_templater.robot
@@ -0,0 +1,21 @@
+*** Settings ***
+Documentation This resource is filling out json string templates and returning the json back
+Library RequestsLibrary
+Library StringTemplater
+Library OperatingSystem
+Resource global_properties.robot
+
+*** Keywords ***
+Fill JSON Template
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json} ${arguments}
+ ${returned_string}= Template String ${json} ${arguments}
+ ${returned_json}= To Json ${returned_string}
+ [Return] ${returned_json}
+
+Fill JSON Template File
+ [Documentation] Runs substitution on template to return a filled in json
+ [Arguments] ${json_file} ${arguments}
+ ${json}= OperatingSystem.Get File ${json_file}
+ ${returned_json}= Fill JSON Template ${json} ${arguments}
+ [Return] ${returned_json} \ No newline at end of file
diff --git a/testsuite/robot/testsuites/aai/csit-regression-test-v14.robot b/testsuite/robot/testsuites/aai/csit-regression-test-v14.robot
new file mode 100644
index 0000000..508d30a
--- /dev/null
+++ b/testsuite/robot/testsuites/aai/csit-regression-test-v14.robot
@@ -0,0 +1,74 @@
+*** Settings ***
+Documentation AAI CSIT-style regression tests for CCVPN - new schema elements introduced in Casablanca release for CCVPN use case
+Test Timeout 20s
+Resource ${EXECDIR}/robot/resources/aai/csit-connectivities.robot
+Resource ${EXECDIR}/robot/resources/aai/csit-vpn-bindings.robot
+
+*** Variables ***
+${connectivity_id}= robot-connectivity-test-1
+${vpn_id}= robot-vpn-test-1
+${connectivity_class}= connectivity
+${vpn_class}= vpn-binding
+
+*** Test Cases ***
+Connectivity test case
+ [Tags] aai csit ccvpn connectivity csit_aai_ccvpn_connectivity
+ Confirm API Not Implemented Connectivity ${connectivity_id}
+ Get Example Connectivity
+ Confirm No Connectivity ${connectivity_id}
+ Create Connectivity If Not Exists ${connectivity_id}
+ ${get_resp}= Get Connectivity ${connectivity_id}
+ ${nodes_resp}= Get Nodes Query Connectivity ${connectivity_id}
+ [Teardown] Run Keywords Delete Connectivity If Exists ${connectivity_id} AND Confirm No Connectivity ${connectivity_id}
+
+VPN Binding test case
+ [Tags] aai csit ccvpn vpn-binding csit_aai_ccvpn_vpn-binding
+ Confirm API Not Implemented VPN Binding ${vpn_id}
+ Get Example VPN Binding
+ Confirm No VPN Binding ${vpn_id}
+ Create VPN Binding If Not Exists ${vpn_id}
+ ${get_resp}= Get VPN Binding ${vpn_id}
+ ${nodes_resp}= Get Nodes Query VPN Binding ${vpn_id}
+ [Teardown] Run Keywords Delete VPN Binding If Exists ${vpn_id} AND Confirm No VPN Binding ${vpn_id}
+
+Connectivity to VPN Binding Relationship test case
+ [Tags] aai csit ccvpn connectivity vpn-binding relationship csit_aai_ccvpn_connectivity_vpn-binding_relationship
+ Confirm No Connectivity ${connectivity_id}
+ Confirm No VPN Binding ${vpn_id}
+ Create Connectivity If Not Exists ${connectivity_id}
+ Create VPN Binding If Not Exists ${vpn_id}
+ Get Connectivity ${connectivity_id}
+ Get VPN Binding ${vpn_id}
+ ${vpnbinding_url}= Get Valid VPN Binding URL ${vpn_id}
+ Add Connectivity Relationship ${connectivity_id} ${vpn_class} ${vpnbinding_url}
+ ${connectivity_rel}= Get Connectivity RelationshipList ${connectivity_id}
+ ${connectivity_rel_txt}= Catenate ${connectivity_rel}
+ Should Match Regexp ${connectivity_rel_txt} ${vpnbinding_url}
+ Should Match Regexp ${connectivity_rel_txt} ${vpn_class}
+ Get Connectivity With RelationshipList ${connectivity_id}
+ [Teardown] Run Keywords Delete Connectivity If Exists ${connectivity_id} AND Delete VPN Binding If Exists ${vpn_id}
+
+VPN Binding Relationship to Connectivity test case
+ [Tags] aai csit ccvpn connectivity vpn-binding relationship csit_aai_ccvpn_vpn-binding_connectivity_relationship
+ Confirm No Connectivity ${connectivity_id}
+ Confirm No VPN Binding ${vpn_id}
+ Create Connectivity If Not Exists ${connectivity_id}
+ Create VPN Binding If Not Exists ${vpn_id}
+ Get Connectivity ${connectivity_id}
+ Get VPN Binding ${vpn_id}
+ ${connectivity_url}= Get Valid Connectivity URL ${connectivity_id}
+ Add VPN Binding Relationship ${vpn_id} ${connectivity_class} ${connectivity_url}
+ ${vpn_rel}= Get VPN Binding RelationshipList ${vpn_id}
+ ${vpn_rel_txt}= Catenate ${vpn_rel}
+ Should Match Regexp ${vpn_rel_txt} ${connectivity_url}
+ Should Match Regexp ${vpn_rel_txt} ${connectivity_class}
+ Get VPN Binding With RelationshipList ${vpn_id}
+ [Teardown] Run Keywords Delete Connectivity If Exists ${connectivity_id} AND Delete VPN Binding If Exists ${vpn_id}
+
+All Teardowns test case
+ [Tags] teardowns csit_aai_ccvpn_teardowns
+ Delete Connectivity If Exists ${connectivity_id}
+ Delete VPN Binding If Exists ${vpn_id}
+ Confirm No Connectivity ${connectivity_id}
+ Confirm No VPN Binding ${vpn_id}
+
diff --git a/testsuite/robot/testsuites/aai/csit-regression-test-v16.robot b/testsuite/robot/testsuites/aai/csit-regression-test-v16.robot
new file mode 100644
index 0000000..8b479b1
--- /dev/null
+++ b/testsuite/robot/testsuites/aai/csit-regression-test-v16.robot
@@ -0,0 +1,122 @@
+*** Settings ***
+Documentation AAI CSIT-style regression tests for BBS - new schema elements introduced in Dublin release for BBS use case
+Test Timeout 20s
+Resource ${EXECDIR}/robot/resources/aai/csit-customer.robot
+Resource ${EXECDIR}/robot/resources/aai/csit-service-subscription.robot
+Resource ${EXECDIR}/robot/resources/aai/csit-service-instance.robot
+Resource ${EXECDIR}/robot/resources/aai/csit-metadatum.robot
+Resource ${EXECDIR}/robot/resources/aai/csit-generic-vnf.robot
+Resource ${EXECDIR}/robot/resources/aai/csit-pnf.robot
+
+*** Variables ***
+${global_customer_id}= robot-customer-test-1
+${subscriber_name}= robot-subscriber-name-1
+${subscriber_type}= robot-subscriber-type-1
+${service_type}= robot-service-type-1
+${service_instance_id}= robot-service-instance-1
+${metaname1}= robot-metaname-1
+${metaval1}= robot-metaval-1
+${metaname2}= robot-metaname-2
+${metaval2}= robot-metaval-2
+${vnf_id}= robot-gvnf-test-1
+${vnf_type}= robot-gvnf-type-1
+${pnf_name}= robot-pnf-name-1
+${pnf_id}= robot-pnf-id-1
+
+*** Test Cases ***
+Customer test case
+ [Tags] aai csit bbs customer csit_aai_bbs_customer
+ Confirm API Not Implemented Customer ${global_customer_id}
+ Get Example Customer
+ Confirm No Customer ${global_customer_id}
+ Create Customer If Not Exists ${global_customer_id} ${subscriber_name} ${subscriber_type}
+ ${get_resp}= Get Customer ${global_customer_id}
+ ${nodes_resp}= Get Nodes Query Customer ${global_customer_id}
+ [Teardown] Run Keywords Delete Customer If Exists ${global_customer_id} AND Confirm No Customer ${global_customer_id}
+
+Service Subscription test case
+ [Tags] aai csit bbs service-subscription csit_aai_bbs_service-subscription
+ [Setup] Create Customer If Not Exists ${global_customer_id} ${subscriber_name} ${subscriber_type}
+ ${customer_url}= Get Valid Customer URL ${global_customer_id}
+ Confirm API Not Implemented Service Subscription ${service_type}
+ Get Example Service Subscription
+ Confirm No Service Subscription ${customer_url} ${service_type}
+ Create Service Subscription If Not Exists ${customer_url} ${service_type}
+ ${get_resp}= Get Service Subscription ${customer_url} ${service_type}
+ ${nodes_resp}= Get Nodes Query Service Subscription ${service_type}
+ ${depth_resp}= Get Object With Depth ${customer_url}
+ ${depth_resp_txt}= Catenate ${depth_resp}
+ Should Match Regexp ${depth_resp_txt} ${service_type}
+ [Teardown] Run Keywords Delete Service Subscription If Exists ${customer_url} ${service_type} AND Confirm No Service Subscription ${customer_url} ${service_type} AND Delete Customer If Exists ${global_customer_id} AND Confirm No Customer ${global_customer_id}
+
+Service Instance test case
+ [Tags] aai csit bbs service-instance csit_aai_bbs_service-instance
+ [Setup] Create Customer If Not Exists ${global_customer_id} ${subscriber_name} ${subscriber_type}
+ ${customer_url}= Get Valid Customer URL ${global_customer_id}
+ Create Service Subscription If Not Exists ${customer_url} ${service_type}
+ ${subscription_url}= Get Valid Service Subscription URL ${customer_url} ${service_type}
+ Confirm API Not Implemented Service Instance ${service_instance_id}
+ Get Example Service Instance
+ Confirm No Service Instance ${subscription_url} ${service_instance_id}
+ Create Service Instance If Not Exists ${subscription_url} ${service_instance_id}
+ ${get_resp}= Get Service Instance ${subscription_url} ${service_instance_id}
+ ${nodes_resp}= Get Nodes Query Service Instance ${service_instance_id}
+ ${depth_resp}= Get Object With Depth ${subscription_url}
+ ${depth_resp_txt}= Catenate ${depth_resp}
+ Should Match Regexp ${depth_resp_txt} ${service_instance_id}
+ [Teardown] Run Keywords Delete Service Instance If Exists ${subscription_url} ${service_instance_id} AND Confirm No Service Instance ${subscription_url} ${service_instance_id} AND Delete Customer If Exists ${global_customer_id} AND Confirm No Customer ${global_customer_id}
+
+Metadatum test case
+ [Tags] aai csit bbs metadatum csit_aai_bbs_metadatum
+ [Setup] Create Customer If Not Exists ${global_customer_id} ${subscriber_name} ${subscriber_type}
+ ${customer_url}= Get Valid Customer URL ${global_customer_id}
+ Create Service Subscription If Not Exists ${customer_url} ${service_type}
+ ${subscription_url}= Get Valid Service Subscription URL ${customer_url} ${service_type}
+ Create Service Instance If Not Exists ${subscription_url} ${service_instance_id}
+ ${sintance_url}= Get Valid Service Instance URL ${subscription_url} ${service_instance_id}
+ Confirm API Not Implemented Metadatum ${metaname1}
+ Get Example Metadatum
+ Confirm No Metadatum ${sintance_url} ${metaname1}
+ Create Metadatum If Not Exists ${sintance_url} ${metaname1} ${metaval1}
+ ${get_resp1}= Get Metadatum ${sintance_url} ${metaname1}
+ ${nodes_resp1}= Get Nodes Query Metadatum ${metaname1}
+ Create Metadatum If Not Exists ${sintance_url} ${metaname2} ${metaval2}
+ ${get_resp2}= Get Metadatum ${sintance_url} ${metaname2}
+ ${nodes_resp2}= Get Nodes Query Metadatum ${metaname2}
+ ${depth_resp}= Get Object With Depth ${sintance_url}
+ ${depth_resp_txt}= Catenate ${depth_resp}
+ Should Match Regexp ${depth_resp_txt} ${metaname1}
+ Should Match Regexp ${depth_resp_txt} ${metaval1}
+ Should Match Regexp ${depth_resp_txt} ${metaname2}
+ Should Match Regexp ${depth_resp_txt} ${metaval2}
+ [Teardown] Run Keywords Delete Metadatum If Exists ${sintance_url} ${metaname1} AND Confirm No Metadatum ${sintance_url} ${metaname1} AND Delete Customer If Exists ${global_customer_id} AND Confirm No Customer ${global_customer_id}
+
+GenericVnf test case
+ [Tags] aai csit bbs generic-vnf csit_aai_bbs_generic-vnf
+ Confirm API Not Implemented GenericVnf ${vnf_id}
+ Get Example GenericVnf
+ Confirm No GenericVnf ${vnf_id}
+ Create GenericVnf If Not Exists ${vnf_id} ${vnf_type}
+ ${get_resp}= Get GenericVnf ${vnf_id}
+ ${nodes_resp}= Get Nodes Query GenericVnf ${vnf_id}
+ [Teardown] Run Keywords Delete GenericVnf If Exists ${vnf_id} AND Confirm No GenericVnf ${vnf_id}
+
+Pnf test case
+ [Tags] aai csit bbs pnf csit_aai_bbs_pnf
+ Confirm API Not Implemented Pnf ${pnf_name}
+ Get Example Pnf
+ Confirm No Pnf ${pnf_name}
+ Create Pnf If Not Exists ${pnf_name} ${pnf_id}
+ ${get_resp}= Get Pnf ${pnf_name}
+ ${nodes_resp}= Get Nodes Query Pnf ${pnf_name}
+ [Teardown] Run Keywords Delete Pnf If Exists ${pnf_name} AND Confirm No Pnf ${pnf_name}
+
+All Teardowns test case
+ [Tags] teardowns csit_aai_bbs_teardowns
+ Delete Customer If Exists ${global_customer_id}
+ Delete GenericVnf If Exists ${vnf_id}
+ Delete Pnf If Exists ${pnf_name}
+ Confirm No Customer ${global_customer_id}
+ Confirm No GenericVnf ${vnf_id}
+ Confirm No Pnf ${pnf_name}
+