aai-schema/**
+testsuite/robot/library/**
+.project
+*/.pydevproject
+
 
--- /dev/null
+{
+      "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": ""
+}
 
--- /dev/null
+{
+  "global-customer-id": "${global_customer_id}",
+  "subscriber-name": "${subscriber_name}",
+  "subscriber-type": "${subscriber_type}",
+  "resource-version": ""
+}
+
 
--- /dev/null
+{
+  "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": ""
+}
+
 
--- /dev/null
+{
+  "metaname": "${metaname}",
+  "metaval": "${metaval}",
+  "resource-version": ""
+}
+
 
--- /dev/null
+{
+  "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": ""
+}
+
 
--- /dev/null
+{
+    "related-to": "${related_class_name}",
+    "related-link": "${related_object_url}"
+}
 
--- /dev/null
+{
+  "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": ""
+}
+
 
--- /dev/null
+{
+  "service-type": "${service_type}",
+  "temp-ub-sub-account-id": "",
+  "resource-version": ""
+}
+
 
--- /dev/null
+{
+  "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
 
--- /dev/null
+*** 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
+
 
--- /dev/null
+*** 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
+
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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}
+
+
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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()}
+
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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
+
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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
 
--- /dev/null
+*** 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
 
--- /dev/null
+*** 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}
+
 
--- /dev/null
+*** 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}
+