AAI-2184 Robot testcases for BBS use case Dublin 01/85001/2
authorKeong Lim <keong.lim@huawei.com>
Thu, 11 Apr 2019 04:38:02 +0000 (14:38 +1000)
committerKeong Lim <keong.lim@huawei.com>
Thu, 11 Apr 2019 04:44:14 +0000 (14:44 +1000)
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>
26 files changed:
.gitignore
testsuite/robot/assets/templates/aai/csit-connectivity.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-customer.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-generic-vnf.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-metadatum.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-pnf.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-relationship.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-service-instance.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-service-subscription.template [new file with mode: 0644]
testsuite/robot/assets/templates/aai/csit-vpn-binding.template [new file with mode: 0644]
testsuite/robot/resources/aai/aai_interface.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-api-version-properties.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-connectivities.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-customer.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-generic-vnf.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-metadatum.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-pnf.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-relationship-list.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-service-instance.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-service-subscription.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-subobject.robot [new file with mode: 0644]
testsuite/robot/resources/aai/csit-vpn-bindings.robot [new file with mode: 0644]
testsuite/robot/resources/global_properties.robot [new file with mode: 0644]
testsuite/robot/resources/json_templater.robot [new file with mode: 0644]
testsuite/robot/testsuites/aai/csit-regression-test-v14.robot [new file with mode: 0644]
testsuite/robot/testsuites/aai/csit-regression-test-v16.robot [new file with mode: 0644]

index 9019bee..a217b3e 100644 (file)
@@ -1 +1,5 @@
 aai-schema/**
+testsuite/robot/library/**
+.project
+*/.pydevproject
+
diff --git a/testsuite/robot/assets/templates/aai/csit-connectivity.template b/testsuite/robot/assets/templates/aai/csit-connectivity.template
new file mode 100644 (file)
index 0000000..a693b20
--- /dev/null
@@ -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 (file)
index 0000000..9b09906
--- /dev/null
@@ -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 (file)
index 0000000..805a094
--- /dev/null
@@ -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 (file)
index 0000000..0ac87fe
--- /dev/null
@@ -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 (file)
index 0000000..0f008f1
--- /dev/null
@@ -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 (file)
index 0000000..e8550aa
--- /dev/null
@@ -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 (file)
index 0000000..0512c4f
--- /dev/null
@@ -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 (file)
index 0000000..5a9d161
--- /dev/null
@@ -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 (file)
index 0000000..8c6743f
--- /dev/null
@@ -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 (file)
index 0000000..c060006
--- /dev/null
@@ -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 (file)
index 0000000..4accac9
--- /dev/null
@@ -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 (file)
index 0000000..23d43e6
--- /dev/null
@@ -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 (file)
index 0000000..52be29e
--- /dev/null
@@ -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 (file)
index 0000000..db9a97b
--- /dev/null
@@ -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 (file)
index 0000000..f5f1688
--- /dev/null
@@ -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 (file)
index 0000000..91a078c
--- /dev/null
@@ -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 (file)
index 0000000..9bc508b
--- /dev/null
@@ -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 (file)
index 0000000..0b9d441
--- /dev/null
@@ -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 (file)
index 0000000..646a347
--- /dev/null
@@ -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 (file)
index 0000000..3f080cb
--- /dev/null
@@ -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 (file)
index 0000000..67cb433
--- /dev/null
@@ -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 (file)
index 0000000..609e9b2
--- /dev/null
@@ -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 (file)
index 0000000..6a5ca17
--- /dev/null
@@ -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 (file)
index 0000000..508d30a
--- /dev/null
@@ -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 (file)
index 0000000..8b479b1
--- /dev/null
@@ -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}
+